Updated taseditor.hnd file to helpndoc 7.0.0.199 format. Rebuilt html

pages and chm files.
This commit is contained in:
Matt Budd 2020-12-16 20:12:15 -05:00
parent fa325bc97a
commit 14cf17b91f
146 changed files with 15273 additions and 6193 deletions

Binary file not shown.

Binary file not shown.

View File

@ -1,232 +1,423 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>6. Advanced Features</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>6. Advanced Features</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="6. Advanced Features">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="6. Advanced Features" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("AdvancedFeatures"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>6. Advanced Features</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; </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> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="Reference.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="AdvancedFeatures"
data-hnd-context="14"
data-hnd-title="6. Advanced Features"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="BeginnersGuide.html" title="Beginner's Guide" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="ProgramCustomization.html" title="5. Program customization" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="Reference.html" title="Reference" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>6. Advanced Features</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Advanced Features</span></p> <p class="rvps2"><span class="rvts18">Advanced Features</span></p>
<p class="rvps2"><span class="rvts36"><br/></span></p> <p class="rvps2"><span class="rvts20"><br/></span></p>
<p class="rvps2"><span class="rvts36"><br/></span></p> <p class="rvps2"><span class="rvts20"><br/></span></p>
<p class="rvps14"><a class="rvts27" href="AdvancedFeatures.html#ProjectsSharing">1. How to share projects.</a></p> <p class="rvps9"><a class="rvts24" href="AdvancedFeatures.html#ProjectsSharing">1. How to share projects.</a></p>
<p class="rvps14"><a class="rvts27" href="AdvancedFeatures.html#UsingPatterns">2. Patterns usage.</a></p> <p class="rvps9"><a class="rvts24" href="AdvancedFeatures.html#UsingPatterns">2. Patterns usage.</a></p>
<p class="rvps14"><a class="rvts27" href="AdvancedFeatures.html#UsingMarkers">3. Effective usage of Markers.</a></p> <p class="rvps9"><a class="rvts24" href="AdvancedFeatures.html#UsingMarkers">3. Effective usage of Markers.</a></p>
<p class="rvps14"><a class="rvts27" href="AdvancedFeatures.html#UsingLua">4. Lua usage.</a></p> <p class="rvps9"><a class="rvts24" href="AdvancedFeatures.html#UsingLua">4. Lua usage.</a></p>
<p class="rvps10"><span class="rvts22"><br/></span></p> <p class="rvps7"><span class="rvts21"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps2"><a name="ProjectsSharing"></a> <p class="rvps2"><a name="ProjectsSharing"></a><span class="rvts22"><br/></span></p>
<span class="rvts48"><br/></span></p> <p class="rvps7"><span class="rvts21">1. How to share projects.</span></p>
<p class="rvps10"><span class="rvts22">1. How to share projects.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">A Taseditor project is saved to disk as an .fm3 file. All essential aspects of the work process are saved into this file, making it possible to restore the postponed work in its exact state. The size of such "instant snapshot" may be pretty huge (depending on the Greenzone size, it may take hundreds of megabytes).</span></p>
<p class="rvps10"><span class="rvts21">A Taseditor project is saved to disk as an .fm3 file. All essential aspects of the work process are saved into this file, making it possible to restore the postponed work in its exact state. The size of such "instant snapshot" may be pretty huge (depending on the Greenzone size, it may take hundreds of megabytes).</span></p> <p class="rvps7"><span class="rvts20">When you want to publish your project in the Internet (for example, as a TASVideos submission), it's better to share only the most important information, but not the whole snapshot of your working process. To do that, choose </span><span class="rvts22">File -&gt; Save Compact</span><span class="rvts20"> in Taseditor's main menu. The "Save Compact" window will appear, prompting you to select which aspects you want to save to the new FM3 file.</span></p>
<p class="rvps10"><span class="rvts21">When you want to publish your project in the Internet (for example, as a TASVideos submission), it's better to share only the most important information, but not the whole snapshot of your working process. To do that, choose </span><span class="rvts25">File -&gt; Save Compact</span><span class="rvts21"> in Taseditor's main menu. The "Save Compact" window will appear, prompting you to select which aspects you want to save to the new FM3 file.</span></p> <p class="rvps7"><img alt="" style="float: left; padding : 6px;" src="lib/save-compact.png"></p>
<p class="rvps10"><img align="left" alt="" style="padding : 6px;" src="lib/save-compact.png"/></p> <p class="rvps7"><span class="rvts22">Binary format of Input</span><span class="rvts20"> save movie Input in binary form. This option is related to fm2 format, which is the base of the fm3 format. If you uncheck it, Input will be saved to the fm3 file in text format, which will increase file size but leave the possibility to edit it in any text editor. However, Taseditor is much better suited for editing movies, so it's recommended to keep that checkbox set, and avoid changing FM3 projects outside Taseditor. Anyway, in non-compact fm3 projects (saved regular way) Input is always stored in binary.</span></p>
<p class="rvps10"><span class="rvts25">Binary format of Input</span><span class="rvts21"> save movie Input in binary form. This option is related to fm2 format, which is the base of the fm3 format. If you uncheck it, Input will be saved to the fm3 file in text format, which will increase file size but leave the possibility to edit it in any text editor. However, Taseditor is much better suited for editing movies, so it's recommended to keep that checkbox set, and avoid changing FM3 projects outside Taseditor. Anyway, in non-compact fm3 projects (saved regular way) Input is always stored in binary.</span></p> <p class="rvps7"><span class="rvts22">Markers</span><span class="rvts20"> save Markers to the file. The movie Input is always saved to fm3 file, because without it emulator won't be able to open fm3 files. But without Markers the movie replay is still possible, so you can uncheck the checkbox if you don't want to share them. Although this way your fm3 won't differ much from an fm2 movie, so it's recommended to leave that checkbox checked, to share all current Markers and their Notes in the compact project. The file size will increase insignificantly.</span></p>
<p class="rvps10"><span class="rvts25">Markers</span><span class="rvts21"> save Markers to the file. The movie Input is always saved to fm3 file, because without it emulator won't be able to open fm3 files. But without Markers the movie replay is still possible, so you can uncheck the checkbox if you don't want to share them. Although this way your fm3 won't differ much from an fm2 movie, so it's recommended to leave that checkbox checked, to share all current Markers and their Notes in the compact project. The file size will increase insignificantly.</span></p> <p class="rvps7"><span class="rvts22">Bookmarks</span><span class="rvts20"> save all Bookmarks and their branches data to the file. It's recommended to leave this option checked. The file size will increase insignificantly.</span></p>
<p class="rvps10"><span class="rvts25">Bookmarks</span><span class="rvts21"> save all Bookmarks and their branches data to the file. It's recommended to leave this option checked. The file size will increase insignificantly.</span></p> <p class="rvps7"><span class="rvts22">History</span><span class="rvts20"> save History Log to the file. The file size will increase by several megabytes. Usually there's no need to publish the data. So it's recommended to uncheck this option. When you open an fm3 project with no History Log, Taseditor creates a new History automatically.</span></p>
<p class="rvps10"><span class="rvts25">History</span><span class="rvts21"> save History Log to the file. The file size will increase by several megabytes. Usually there's no need to publish the data. So it's recommended to uncheck this option. When you open an fm3 project with no History Log, Taseditor creates a new History automatically.</span></p> <p class="rvps7"><span class="rvts22">Piano Roll</span><span class="rvts20"> save current position of vertical scrolling of the Piano Roll, in order to see the exact segment of the movie after loading the compact fm3 file. The file size will increase insignificantly, so you may keep that option checked.</span></p>
<p class="rvps10"><span class="rvts25">Piano Roll</span><span class="rvts21"> save current position of vertical scrolling of the Piano Roll, in order to see the exact segment of the movie after loading the compact fm3 file. The file size will increase insignificantly, so you may keep that option checked.</span></p> <p class="rvps7"><span class="rvts22">Selection</span><span class="rvts20"> save all Selection data to the file. Both current Selection and whole Selection History is saved. The file size will increase insignificantly, but usually there's no need to publish the data. So it's recommended to uncheck this option.</span></p>
<p class="rvps10"><span class="rvts25">Selection</span><span class="rvts21"> save all Selection data to the file. Both current Selection and whole Selection History is saved. The file size will increase insignificantly, but usually there's no need to publish the data. So it's recommended to uncheck this option.</span></p> <p class="rvps7"><span class="rvts22">Greenzone saving options</span><span class="rvts20"> here you can choose how the Greenzone should be saved. Greenzone is the main factor causing huge project file size. So it's recommended to choose partial saving or not save the Greenzone at all.</span></p>
<p class="rvps10"><span class="rvts25">Greenzone saving options</span><span class="rvts21"> here you can choose how the Greenzone should be saved. Greenzone is the main factor causing huge project file size. So it's recommended to choose partial saving or not save the Greenzone at all.</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts22">all frames</span><span class="rvts20"> save entire Greenzone. The file size will increase dramatically!</span></li>
<li class="rvps10"><span class="rvts25">all frames</span><span class="rvts21"> save entire Greenzone. The file size will increase dramatically!</span></li> <li class="rvps7"><span class="rvts22">every 16th frame</span><span class="rvts20"> save only every 16th frame. The file size will increase dramatically.</span></li>
<li class="rvps10"><span class="rvts25">every 16th frame</span><span class="rvts21"> save only every 16th frame. The file size will increase dramatically.</span></li> <li class="rvps7"><span class="rvts22">marked frames</span><span class="rvts20"> save only marked frames. The file size will increase depending on the number of Markers in your project.</span></li>
<li class="rvps10"><span class="rvts25">marked frames</span><span class="rvts21"> save only marked frames. The file size will increase depending on the number of Markers in your project.</span></li> <li class="rvps7"><span class="rvts22">don't save</span><span class="rvts20"> the Greenzone will not be saved. If during the compact saving the Playback cursor is at the very first frame of the movie, there will be no single Greenzone savestate in the fm3 project. But if the cursor was left at some frame in the middle of the movie, the compact fm3 will contain one Greenzone savestate, allowing to restore the emulator state on the Playback cursor frame when you open the project. Since one savestate uses very little disk space, the file is still compact.</span></li>
<li class="rvps10"><span class="rvts25">don't save</span><span class="rvts21"> the Greenzone will not be saved. If during the compact saving the Playback cursor is at the very first frame of the movie, there will be no single Greenzone savestate in the fm3 project. But if the cursor was left at some frame in the middle of the movie, the compact fm3 will contain one Greenzone savestate, allowing to restore the emulator state on the Playback cursor frame when you open the project. Since one savestate uses very little disk space, the file is still compact.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Using compact saving you can get an fm3 project being less than 500KB in size, while still sharing all essential data the recipient may need. For example, if you are working in co-authorship with another TASer(s), you will need to share not only Input, but also Markers and Bookmarks. As for the Greenzone, the recipient can recreate it by replaying the project movie in Taseditor.</span></p> <p class="rvps7"><span class="rvts20">Using compact saving you can get an fm3 project being less than 500KB in size, while still sharing all essential data the recipient may need. For example, if you are working in co-authorship with another TASer(s), you will need to share not only Input, but also Markers and Bookmarks. As for the Greenzone, the recipient can recreate it by replaying the project movie in Taseditor.</span></p>
<p class="rvps10"><span class="rvts21">On compact saving, your project name receives the "-compact" suffix. Compact saving doesn't replace normal project saving, so if you have any unsaved changes in the project, the asterisk in the window caption will not disappear after Save Compact.</span></p> <p class="rvps7"><span class="rvts20">On compact saving, your project name receives the "-compact" suffix. Compact saving doesn't replace normal project saving, so if you have any unsaved changes in the project, the asterisk in the window caption will not disappear after Save Compact.</span></p>
<p class="rvps10"><img align="left" alt="" style="padding : 6px;" src="lib/export-to-fm2.png"/></p> <p class="rvps7"><img alt="" style="float: left; padding : 6px;" src="lib/export-to-fm2.png"></p>
<p class="rvps10"><span class="rvts21">Besides saving a compact fm3 you can also export movie data to fm2 format, accepted at TASVideos before Taseditor even existed. But in such files you will share only Input. To do that, choose </span><span class="rvts25">File -&gt; Export to FM2</span><span class="rvts21"> in Taseditor's main menu. The "Export to FM2" window will appear, prompting you to choose target movie type (1P, 2P, Fourscore).</span></p> <p class="rvps7"><span class="rvts20">Besides saving a compact fm3 you can also export movie data to fm2 format, accepted at TASVideos before Taseditor even existed. But in such files you will share only Input. To do that, choose </span><span class="rvts22">File -&gt; Export to FM2</span><span class="rvts20"> in Taseditor's main menu. The "Export to FM2" window will appear, prompting you to choose target movie type (1P, 2P, Fourscore).</span></p>
<p class="rvps10"><span class="rvts21">Since FM2 format also supports text subtitles, you can use existing Marker Notes as a source for generating movie subtitles. For that, enable the "Convert Marker Notes to Movie Subtitles" checkbox. Then while watching the fm2 file the viewers will see text messages appearing when passing certain frames (the frames where your project had Markers at). If necessary, you can then convert those fm2 subtitles into the commonly used .srt format to post the TAS on Youtube. To do that, right-click the FCEUX window while replaying the subtitled movie and choose "Dump Subtitles to SRT file" command.</span></p> <p class="rvps7"><span class="rvts20">Since FM2 format also supports text subtitles, you can use existing Marker Notes as a source for generating movie subtitles. For that, enable the "Convert Marker Notes to Movie Subtitles" checkbox. Then while watching the fm2 file the viewers will see text messages appearing when passing certain frames (the frames where your project had Markers at). If necessary, you can then convert those fm2 subtitles into the commonly used .srt format to post the TAS on Youtube. To do that, right-click the FCEUX window while replaying the subtitled movie and choose "Dump Subtitles to SRT file" command.</span></p>
<p class="rvps10"><span class="rvts21">FM2 files can be opened in Taseditor similarly to loading fm3 projects. In the "Open TAS Editor Project" window (</span><span class="rvts25">File -&gt; Open</span><span class="rvts21">) switch to the filter "All Files (*.*)" and then choose your fm2 movie file. Taseditor will bring the message box saying that this is not a project file, and will ask confirmation. After you click "Yes" it will create new project using Input and settings from the fm2 file.</span></p> <p class="rvps7"><span class="rvts20">FM2 files can be opened in Taseditor similarly to loading fm3 projects. In the "Open TAS Editor Project" window (</span><span class="rvts22">File -&gt; Open</span><span class="rvts20">) switch to the filter "All Files (*.*)" and then choose your fm2 movie file. Taseditor will bring the message box saying that this is not a project file, and will ask confirmation. After you click "Yes" it will create new project using Input and settings from the fm2 file.</span></p>
<p class="rvps10"><span class="rvts21">Also, you can import Input from any fm2 or fm3 file using </span><span class="rvts25">File -&gt; Import Input</span><span class="rvts21">. This time no new project will be created, but Input of current project will be replaced with Input from the file. This operation is very similar to pasting Input from the Clipboard, it is registered in History Log and can be undone by </span><span class="rvts30">Ctrl + Z</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Also, you can import Input from any fm2 or fm3 file using </span><span class="rvts22">File -&gt; Import Input</span><span class="rvts20">. This time no new project will be created, but Input of current project will be replaced with Input from the file. This operation is very similar to pasting Input from the Clipboard, it is registered in History Log and can be undone by </span><span class="rvts27">Ctrl + Z</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="UsingPatterns"></a> <p class="rvps7"><a name="UsingPatterns"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">2. Patterns usage.</span></p>
<p class="rvps10"><span class="rvts22">2. Patterns usage.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">When editing Input, TASer actually creates a unique sequence of presses and releases for every button of joypad. But, despite the uniqueness, this large sequence still contains many typical segments, which are are short sequences of presses and releases that repeat many times in succession, or appear many times in different places of the movie.</span></p>
<p class="rvps10"><span class="rvts21">When editing Input, TASer actually creates a unique sequence of presses and releases for every button of joypad. But, despite the uniqueness, this large sequence still contains many typical segments, which are are short sequences of presses and releases that repeat many times in succession, or appear many times in different places of the movie.</span></p> <p class="rvps7"><span class="rvts20">To speed up the work, you can remember the most typical or frequent sequences as </span><span class="rvts33">patterns</span><span class="rvts20">, to be able to put them with a couple of clicks, not drawing every single buttonpress manually each time.</span></p>
<p class="rvps10"><span class="rvts21">To speed up the work, you can remember the most typical or frequent sequences as </span><span class="rvts37">patterns</span><span class="rvts21">, to be able to put them with a couple of clicks, not drawing every single buttonpress manually each time.</span></p> <p class="rvps7"><span class="rvts20">Patterns are useful in several cases:</span></p>
<p class="rvps10"><span class="rvts21">Patterns are useful in several cases:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">when one sequence is frequently used in the movie (for example, an accurate alternation of pressing and releasing the </span><span class="rvts26">B</span><span class="rvts20"> button)</span></li>
<li class="rvps10"><span class="rvts21">when one sequence is frequently used in the movie (for example, an accurate alternation of pressing and releasing the </span><span class="rvts29">B</span><span class="rvts21"> button)</span></li> <li class="rvps7"><span class="rvts20">when you need the same sequence for several buttons (for example, alternating </span><span class="rvts26">L</span><span class="rvts20"> and </span><span class="rvts26">R</span><span class="rvts20">)</span></li>
<li class="rvps10"><span class="rvts21">when you need the same sequence for several buttons (for example, alternating </span><span class="rvts29">L</span><span class="rvts21"> and </span><span class="rvts29">R</span><span class="rvts21">)</span></li> <li class="rvps7"><span class="rvts20">when a certain sequence needs to be drawn (or redrawn) many times (for example, making a running start by tapping </span><span class="rvts26">R</span><span class="rvts20"> twice)</span></li>
<li class="rvps10"><span class="rvts21">when a certain sequence needs to be drawn (or redrawn) many times (for example, making a running start by tapping </span><span class="rvts29">R</span><span class="rvts21"> twice)</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21">Some of the most obvious patterns are already added by author. To add your own pattern you need to edit the </span><span class="rvts20">taseditor_patterns.txt</span><span class="rvts21"> file in any text editor (like Notepad), this file is stored in </span><span class="rvts20">/tools</span><span class="rvts21"> subfolder of FCEUX main folder. Every second line in this file constitutes an encoded sequence of button states. The code is straightforward: "button pressed" is encoded by 1, "button released" by 0.</span></p> <p class="rvps7"><span class="rvts20">Some of the most obvious patterns are already added by author. To add your own pattern you need to edit the </span><span class="rvts19">taseditor_patterns.txt</span><span class="rvts20"> file in any text editor (like Notepad), this file is stored in </span><span class="rvts19">/tools</span><span class="rvts20"> subfolder of FCEUX main folder. Every second line in this file constitutes an encoded sequence of button states. The code is straightforward: "button pressed" is encoded by 1, "button released" by 0.</span></p>
<p class="rvps10"><span class="rvts21">Every pattern is looped, which means, when a long sequence of Input is created using a short pattern, the pattern is repeated the necessary amount of times to fill the whole given interval.</span></p> <p class="rvps7"><span class="rvts20">Every pattern is looped, which means, when a long sequence of Input is created using a short pattern, the pattern is repeated the necessary amount of times to fill the whole given interval.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/patterns-menu.png"/></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/patterns-menu.png"></p>
<p class="rvps10"><span class="rvts21">After adding or editing the patterns file, restart Taseditor to reread the file changes. The list of all available patterns is always in the upper right corner of the TAS Editor window. To change the current pattern, enter that menu and click the needed pattern name. For easy orientation in patterns it's recommended to call each pattern by a distinct name that reflects its in-game meaning.</span></p> <p class="rvps7"><span class="rvts20">After adding or editing the patterns file, restart Taseditor to reread the file changes. The list of all available patterns is always in the upper right corner of the TAS Editor window. To change the current pattern, enter that menu and click the needed pattern name. For easy orientation in patterns it's recommended to call each pattern by a distinct name that reflects its in-game meaning.</span></p>
<p class="rvps10"><span class="rvts21">To apply current pattern, Taseditor needs to know the beginning and the end of the interval where the chosen button is going to be pressed and released according to the rule. There are 3 different ways to apply a pattern:</span></p> <p class="rvps7"><span class="rvts20">To apply current pattern, Taseditor needs to know the beginning and the end of the interval where the chosen button is going to be pressed and released according to the rule. There are 3 different ways to apply a pattern:</span></p>
<p class="rvps10"><span class="rvts25">Example 1. </span><span class="rvts21">Point and click the start frame (click in any Piano Roll column except the icons column), thus selecting that frame. Then hold the </span><span class="rvts30">Alt</span><span class="rvts21"> key and left-click the end frame in the column of the button you are editing. In the interval between those two frames you will get the needed sequence of the chosen button presses. This method is rather handy when the start frame is already selected by previous clicks in Piano Roll, and you only need to to hold down </span><span class="rvts30">Alt</span><span class="rvts21"> and click the end frame.</span></p> <p class="rvps7"><span class="rvts22">Example 1. </span><span class="rvts20">Point and click the start frame (click in any Piano Roll column except the icons column), thus selecting that frame. Then hold the </span><span class="rvts27">Alt</span><span class="rvts20"> key and left-click the end frame in the column of the button you are editing. In the interval between those two frames you will get the needed sequence of the chosen button presses. This method is rather handy when the start frame is already selected by previous clicks in Piano Roll, and you only need to to hold down </span><span class="rvts27">Alt</span><span class="rvts20"> and click the end frame.</span></p>
<p class="rvps10"><span class="rvts25">Example 2. </span><span class="rvts21">Left-click the start frame in the column of the button you are editing, and hold the mouse button to start drawing. Hold </span><span class="rvts30">Alt</span><span class="rvts21"> and move the mouse cursor up or down. This way you will be </span><span class="rvts37">drawing</span><span class="rvts21"> the pattern sequence of buttonpresses.</span></p> <p class="rvps7"><span class="rvts22">Example 2. </span><span class="rvts20">Left-click the start frame in the column of the button you are editing, and hold the mouse button to start drawing. Hold </span><span class="rvts27">Alt</span><span class="rvts20"> and move the mouse cursor up or down. This way you will be </span><span class="rvts33">drawing</span><span class="rvts20"> the pattern sequence of buttonpresses.</span></p>
<p class="rvps10"><span class="rvts25">Example 3. </span><span class="rvts21">Select a range of frames, then hold </span><span class="rvts30">Alt</span><span class="rvts21"> and left-click on the edited button symbol in the Piano Roll Header. The pattern will be applied to the selected area.</span></p> <p class="rvps7"><span class="rvts22">Example 3. </span><span class="rvts20">Select a range of frames, then hold </span><span class="rvts27">Alt</span><span class="rvts20"> and left-click on the edited button symbol in the Piano Roll Header. The pattern will be applied to the selected area.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When using traditional method of TASing you are also able to apply patterns to recorded sequences, although in a less convenient manner. To do that you should set the "</span><a class="rvts27" href="Toolbox.html#UsePattern">Use pattern</a><span class="rvts21">" checkbox on Recorder panel. Before that you may want to record the buttons you don't need to alternate (record them without using patterns), and then record the needed button(s) with pattern, using the "Superimpose" function for the segment.</span></p> <p class="rvps7"><span class="rvts20">When using traditional method of TASing you are also able to apply patterns to recorded sequences, although in a less convenient manner. To do that you should set the "</span><a class="rvts24" href="Toolbox.html#UsePattern">Use pattern</a><span class="rvts20">" checkbox on Recorder panel. Before that you may want to record the buttons you don't need to alternate (record them without using patterns), and then record the needed button(s) with pattern, using the "Superimpose" function for the segment.</span></p>
<p class="rvps10"><span class="rvts21">For example, you need to record a burst of fire while jumping over the pit. At first, record that jump without shooting, then return the Playback cursor to the beginning of the segment (by jumping to the Bookmark left here), check "Superimpose" and "Use pattern", hold the </span><span class="rvts29">B</span><span class="rvts21"> button and unpause the emulation. You'll see how the shooting Input superimposes over jump Input.</span></p> <p class="rvps7"><span class="rvts20">For example, you need to record a burst of fire while jumping over the pit. At first, record that jump without shooting, then return the Playback cursor to the beginning of the segment (by jumping to the Bookmark left here), check "Superimpose" and "Use pattern", hold the </span><span class="rvts26">B</span><span class="rvts20"> button and unpause the emulation. You'll see how the shooting Input superimposes over jump Input.</span></p>
<p class="rvps10"><span class="rvts21">Before Taseditor there was the "Autofire" concept similar to patterns. But due to inconveniences of the Recording method that feature was rarely used, because when you are typing Input it's usually easier to press and release the needed buttons manually. So if you stick to traditional method of TASing, you won't likely use patterns. But in the non-linear or semi-automatic TASing, patterns are drawn as quickly as regular buttonpresses, so that's where they can really speed up the work.</span></p> <p class="rvps7"><span class="rvts20">Before Taseditor there was the "Autofire" concept similar to patterns. But due to inconveniences of the Recording method that feature was rarely used, because when you are typing Input it's usually easier to press and release the needed buttons manually. So if you stick to traditional method of TASing, you won't likely use patterns. But in the non-linear or semi-automatic TASing, patterns are drawn as quickly as regular buttonpresses, so that's where they can really speed up the work.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Patterns are used when creating sequences for a single button. But when you want to use a typical macro involving several buttons, use Copy/Paste.</span></p> <p class="rvps7"><span class="rvts20">Patterns are used when creating sequences for a single button. But when you want to use a typical macro involving several buttons, use Copy/Paste.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="UsingMarkers"></a> <p class="rvps7"><a name="UsingMarkers"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">3. Effective usage of Markers.</span></p>
<p class="rvps10"><span class="rvts22">3. Effective usage of Markers.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Markers exist to simplify complicated situations by structurizing the problem. When the game requires you to perform (or think over) several complex actions, you should break the large segment into separate intervals, in order to understand clearly where one action stops and another one starts. Even if the initial subdividing appears to be wrong, it still helps you to get thoughts in order.</span></p>
<p class="rvps10"><span class="rvts21">Markers exist to simplify complicated situations by structurizing the problem. When the game requires you to perform (or think over) several complex actions, you should break the large segment into separate intervals, in order to understand clearly where one action stops and another one starts. Even if the initial subdividing appears to be wrong, it still helps you to get thoughts in order.</span></p> <p class="rvps7"><span class="rvts20">Obviously, you are not expected to set Markers on commonplace segments, most of which aren't even polished (e.g. where it's enough to hold </span><span class="rvts26">R</span><span class="rvts20"> to win). But key moments and memorable situations of the movie should be marked and commented with Notes. It will help you to keep the whole picture of the project in mind and navigate the movie by text.</span></p>
<p class="rvps10"><span class="rvts21">Obviously, you are not expected to set Markers on commonplace segments, most of which aren't even polished (e.g. where it's enough to hold </span><span class="rvts29">R</span><span class="rvts21"> to win). But key moments and memorable situations of the movie should be marked and commented with Notes. It will help you to keep the whole picture of the project in mind and navigate the movie by text.</span></p> <p class="rvps7"><span class="rvts20">No need to write works of literature inside the Notes. You may just confine yourself with simple label words, numbers, tags. Invent the words on the fly, but try to keep systematic approach. As in, if at the beginning of the first level (on the transition screen) you've set a Marker with the Note "level 1 start", you should also write "level 2 start" at the beginning of the second level, and not "act II begin" or something. During the creation of TAS you naturally form a unique glossary in your mind using various terms that are topical for that specific game. And the more systematic approach you apply to writing the Notes, the easier it will be to describe another (similar) segment and understand its task. The easier it'll be to find similar Input segments, recalling only their vague in-game appearance.</span></p>
<p class="rvps10"><span class="rvts21">No need to write works of literature inside the Notes. You may just confine yourself with simple label words, numbers, tags. Invent the words on the fly, but try to keep systematic approach. As in, if at the beginning of the first level (on the transition screen) you've set a Marker with the Note "level 1 start", you should also write "level 2 start" at the beginning of the second level, and not "act II begin" or something. During the creation of TAS you naturally form a unique glossary in your mind using various terms that are topical for that specific game. And the more systematic approach you apply to writing the Notes, the easier it will be to describe another (similar) segment and understand its task. The easier it'll be to find similar Input segments, recalling only their vague in-game appearance.</span></p> <p class="rvps7"><span class="rvts20">The tasks you meet in video games are often repeatable. Details and environment may be different, but player actions remain more or less the same. In some cases you can just copy the Input (solution of the similar task) from the previous level, and it will successfully sync with the new in-game situation (probably after a little adjustment). Though, after the copy/paste it's recommended to diversify the Input to prevent the TAS viewers from noticing the repetition and getting bored.</span></p>
<p class="rvps10"><span class="rvts21">The tasks you meet in video games are often repeatable. Details and environment may be different, but player actions remain more or less the same. In some cases you can just copy the Input (solution of the similar task) from the previous level, and it will successfully sync with the new in-game situation (probably after a little adjustment). Though, after the copy/paste it's recommended to diversify the Input to prevent the TAS viewers from noticing the repetition and getting bored.</span></p> <p class="rvps7"><span class="rvts20">For example, at the beginning of many levels in Super Mario Bros you need to use the same button sequence to accelerate to maximum speed optimally. Let's imagine, you are honestly commenting Input during TASing. Then in World 1-1 in the acceleration section you probably left a Note with words like "acceleration" or similar. Now, when you start creating Input for a segment with that task again, in a new level you put a Marker at the beginning of the segment and write a Note, describing your current task. Obviously enough, you are going to use the word "acceleration" there as well, because you need to accelerate.</span></p>
<p class="rvps10"><span class="rvts21">For example, at the beginning of many levels in Super Mario Bros you need to use the same button sequence to accelerate to maximum speed optimally. Let's imagine, you are honestly commenting Input during TASing. Then in World 1-1 in the acceleration section you probably left a Note with words like "acceleration" or similar. Now, when you start creating Input for a segment with that task again, in a new level you put a Marker at the beginning of the segment and write a Note, describing your current task. Obviously enough, you are going to use the word "acceleration" there as well, because you need to accelerate.</span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-selection.png"></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-selection.png"/></p> <p class="rvps7"><span class="rvts20">And that's where you can use Taseditor's function of automatic searching for similar Notes. Leave the Playback cursor inside the current segment and press the "</span><span class="rvts26">Similar</span><span class="rvts20">" button at the bottom of the Toolbox. The Selection cursor will instantly jump to the Marker that contains the most resembling Note, in Taseditor's opinion. Most likely, it will be the Marker left at the beginning of the acceleration segment in the World 1-1. Therefore you can instantly select all Input in that segment by pressing </span><span class="rvts27">Ctrl + A</span><span class="rvts20">, then copy the Input to the Clipboard (</span><span class="rvts27">Ctrl + C</span><span class="rvts20">), return to the current segment (press </span><span class="rvts27">Shift</span><span class="rvts20"> twice) and paste from the Clipboard (</span><span class="rvts27">Ctrl + V</span><span class="rvts20">).</span></p>
<p class="rvps10"><span class="rvts21">And that's where you can use Taseditor's function of automatic searching for similar Notes. Leave the Playback cursor inside the current segment and press the "</span><span class="rvts29">Similar</span><span class="rvts21">" button at the bottom of the Toolbox. The Selection cursor will instantly jump to the Marker that contains the most resembling Note, in Taseditor's opinion. Most likely, it will be the Marker left at the beginning of the acceleration segment in the World 1-1. Therefore you can instantly select all Input in that segment by pressing </span><span class="rvts30">Ctrl + A</span><span class="rvts21">, then copy the Input to the Clipboard (</span><span class="rvts30">Ctrl + C</span><span class="rvts21">), return to the current segment (press </span><span class="rvts30">Shift</span><span class="rvts21"> twice) and paste from the Clipboard (</span><span class="rvts30">Ctrl + V</span><span class="rvts21">).</span></p> <p class="rvps7"><span class="rvts20">If the first search result doesn't bring you to the intended segment, you can press the "</span><span class="rvts26">More</span><span class="rvts20">" button to try next result of the search. Usually the right segment is among the first offered finds, granted that you marked the segment with a sensible Note.</span></p>
<p class="rvps10"><span class="rvts21">If the first search result doesn't bring you to the intended segment, you can press the "</span><span class="rvts29">More</span><span class="rvts21">" button to try next result of the search. Usually the right segment is among the first offered finds, granted that you marked the segment with a sensible Note.</span></p> <p class="rvps7"><span class="rvts20">Interesting fact: while writing the Note for the second appearance of the acceleration segment, you use the word "acceleration" without an intent to correlate to previous cases, but only according to the in-game situation. So you are not expected to actually remember the text of old Notes. The right words will come to your mind in the right time.</span></p>
<p class="rvps10"><span class="rvts21">Interesting fact: while writing the Note for the second appearance of the acceleration segment, you use the word "acceleration" without an intent to correlate to previous cases, but only according to the in-game situation. So you are not expected to actually remember the text of old Notes. The right words will come to your mind in the right time.</span></p> <p class="rvps7"><span class="rvts20">This way, right during the TASing process you form a </span><span class="rvts22">library of useful Input combinations</span><span class="rvts20">, not unlike the pattern list described above, except that you don't have to purposely prepare the button sequences they appear natural way during the segments shaping and optimization, and they are stored inside the movie, not in an external file. And when you improve a combination for some segment (e.g. find a faster way to accelerate), you can easily find and fix all related segments with similar button sequence. Also, here you don't have to remember the exact description or the name of the needed sequence, because, if you use systematic approach to describe tasks, the words will partially match (and a perfect match is not required, since the searching algorithm is rather smart).</span></p>
<p class="rvps10"><span class="rvts21">This way, right during the TASing process you form a </span><span class="rvts25">library of useful Input combinations</span><span class="rvts21">, not unlike the pattern list described above, except that you don't have to purposely prepare the button sequences they appear natural way during the segments shaping and optimization, and they are stored inside the movie, not in an external file. And when you improve a combination for some segment (e.g. find a faster way to accelerate), you can easily find and fix all related segments with similar button sequence. Also, here you don't have to remember the exact description or the name of the needed sequence, because, if you use systematic approach to describe tasks, the words will partially match (and a perfect match is not required, since the searching algorithm is rather smart).</span></p> <p class="rvps7"><span class="rvts20">The auto-search is also useful when you need to jump between two (or more) related segments, located far from each other in the movie. Scrolling the Piano Roll with the mouse wheel or jumping through dozens of Markers from one segment to another is not as handy as clicking the "</span><span class="rvts26">Similar</span><span class="rvts20">" or "</span><span class="rvts26">More</span><span class="rvts20">" button. To let the algorithm instantly find the twin segment (or the</span><span class="rvts33"> source</span><span class="rvts20"> segment and the </span><span class="rvts33">destination</span><span class="rvts20"> segment), consider using some unique word in their Notes, one that isn't used in other places of the movie.</span></p>
<p class="rvps10"><span class="rvts21">The auto-search is also useful when you need to jump between two (or more) related segments, located far from each other in the movie. Scrolling the Piano Roll with the mouse wheel or jumping through dozens of Markers from one segment to another is not as handy as clicking the "</span><span class="rvts29">Similar</span><span class="rvts21">" or "</span><span class="rvts29">More</span><span class="rvts21">" button. To let the algorithm instantly find the twin segment (or the</span><span class="rvts37"> source</span><span class="rvts21"> segment and the </span><span class="rvts37">destination</span><span class="rvts21"> segment), consider using some unique word in their Notes, one that isn't used in other places of the movie.</span></p> <p class="rvps7"><span class="rvts20">For example, in the "Megaman" game each robot master must be beaten twice (second time it's in the end of the game). It's logical to suppose that both battles will be entitled by Marker Notes containing the name of the robot and the word "boss" or "fight", or something like that. As a result, when the Playback cursor is in one of those 2 places, pressing the "</span><span class="rvts26">Similar</span><span class="rvts20">" button will get you to another one.</span></p>
<p class="rvps10"><span class="rvts21">For example, in the "Megaman" game each robot master must be beaten twice (second time it's in the end of the game). It's logical to suppose that both battles will be entitled by Marker Notes containing the name of the robot and the word "boss" or "fight", or something like that. As a result, when the Playback cursor is in one of those 2 places, pressing the "</span><span class="rvts29">Similar</span><span class="rvts21">" button will get you to another one.</span></p> <p class="rvps7"><span class="rvts20">In this example the proper words for the Notes text are no-brainer, yet they are unique enough not to repeat in other places (at least not in that combination), so the auto-search will work perfectly. In a different case you may have to invent a unique label, but usually the first description you think of is enough.</span></p>
<p class="rvps10"><span class="rvts21">In this example the proper words for the Notes text are no-brainer, yet they are unique enough not to repeat in other places (at least not in that combination), so the auto-search will work perfectly. In a different case you may have to invent a unique label, but usually the first description you think of is enough.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/find-note.png"></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/find-note.png"/></p> <p class="rvps7"><span class="rvts20">You can also use standard search for Note text. For example, it's common to leave a Note beginning with the "TODO" word at some places where you are not sure the best solution is found (the segment Input is optimal). So, when you have mood to make fixes, you could skim through all Markers with that tag by bringing the "Find Note" window (</span><span class="rvts27">Ctrl + F</span><span class="rvts20">) and typing the word "TODO" to search for.</span></p>
<p class="rvps10"><span class="rvts21">You can also use standard search for Note text. For example, it's common to leave a Note beginning with the "TODO" word at some places where you are not sure the best solution is found (the segment Input is optimal). So, when you have mood to make fixes, you could skim through all Markers with that tag by bringing the "Find Note" window (</span><span class="rvts30">Ctrl + F</span><span class="rvts21">) and typing the word "TODO" to search for.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If you don't like all these big ideas with Markers, you can TAS without them. After all, many games provide rather simple tasks for a TASer, they don't require a highly organized approach to the solving process. If the problem can be solved on impulse, don't spend time on preparation and fortification. Markers provide advantages only in long-term goals.</span></p>
<p class="rvps10"><span class="rvts21">If you don't like all these big ideas with Markers, you can TAS without them. After all, many games provide rather simple tasks for a TASer, they don't require a highly organized approach to the solving process. If the problem can be solved on impulse, don't spend time on preparation and fortification. Markers provide advantages only in long-term goals.</span></p> <p class="rvps7"><span class="rvts20">So, just like in programming, in most cases you can successfully write the so-called "dirty code" (here it would be a project without Markers and Notes) that is fast to create, but hard to maintain and extend. Or you can make a lovingly formatted project which is nice to watch and modify. Since TASers have to modify their movies very often (in order to beat previous records), the today's time costs for the project formatting are likely to be repaid by the fact that the looks of the project motivate to continue the work on it.</span></p>
<p class="rvps10"><span class="rvts21">So, just like in programming, in most cases you can successfully write the so-called "dirty code" (here it would be a project without Markers and Notes) that is fast to create, but hard to maintain and extend. Or you can make a lovingly formatted project which is nice to watch and modify. Since TASers have to modify their movies very often (in order to beat previous records), the today's time costs for the project formatting are likely to be repaid by the fact that the looks of the project motivate to continue the work on it.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <p class="rvps7"><a name="UsingLua"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="UsingLua"></a> <p class="rvps7"><span class="rvts21">4. Lua usage.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">4. Lua usage.</span></p> <p class="rvps7"><span class="rvts20">With the Lua language you can write scripts that can be executed by FCEUX along with game emulation. Writing scripts requires minimal programming skill, while the range of possibilities is pretty huge. You can create your own TAS tools, modify the game at the time of execution, have access to images and sound on the fly, send data via network or record it to disk, etc. And you can make custom extensions for TAS Editor.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">To master the Lua language completely you would need to read its documentation and gain actual experience, but for making simple scripts it should be enough to read this Manual and the </span><a class="rvts24" href="http://www.fceux.com/web/help/fceux.html?LuaScripting.html" target="_blank">Lua chapter in FCEUX docs</a><span class="rvts20">. At first, try to run scripts created for FCEUX by various people. They are stored in the </span><span class="rvts19">/luaScripts</span><span class="rvts20"> subfolder. Each script is a text file with </span><span class="rvts19">.lua</span><span class="rvts20"> extension, such file may be created and modified in any text editor. Before running scripts you need to open some game ROM in FCEUX. To run a script, open the Lua console (</span><span class="rvts22">File -&gt; Lua -&gt; New Lua Script Window</span><span class="rvts20">), in this window press the "</span><span class="rvts26">Browse</span><span class="rvts20">" button and load the script file, then press "</span><span class="rvts26">Run</span><span class="rvts20">". If emulator is paused, either unpause it or advance a frame to activate the script. As for the Lua console, the window may be hidden or minimized.</span></p>
<p class="rvps10"><span class="rvts21">With the Lua language you can write scripts that can be executed by FCEUX along with game emulation. Writing scripts requires minimal programming skill, while the range of possibilities is pretty huge. You can create your own TAS tools, modify the game at the time of execution, have access to images and sound on the fly, send data via network or record it to disk, etc. And you can make custom extensions for TAS Editor.</span></p> <p class="rvps7"><span class="rvts20">Program code in Lua scripts for FCEUX usually consists of 2 parts: the first part is executed once the script is activated, another part runs on certain emulation events, such as the end of a frame emulation, loading a savestate and so on.</span></p>
<p class="rvps10"><span class="rvts21">To master the Lua language completely you would need to read its documentation and gain actual experience, but for making simple scripts it should be enough to read this Manual and the </span><a class="rvts27" href="http://www.fceux.com/web/help/fceux.html?LuaScripting.html" target="_blank">Lua chapter in FCEUX docs</a><span class="rvts21">. At first, try to run scripts created for FCEUX by various people. They are stored in the </span><span class="rvts20">/luaScripts</span><span class="rvts21"> subfolder. Each script is a text file with </span><span class="rvts20">.lua</span><span class="rvts21"> extension, such file may be created and modified in any text editor. Before running scripts you need to open some game ROM in FCEUX. To run a script, open the Lua console (</span><span class="rvts25">File -&gt; Lua -&gt; New Lua Script Window</span><span class="rvts21">), in this window press the "</span><span class="rvts29">Browse</span><span class="rvts21">" button and load the script file, then press "</span><span class="rvts29">Run</span><span class="rvts21">". If emulator is paused, either unpause it or advance a frame to activate the script. As for the Lua console, the window may be hidden or minimized.</span></p> <p class="rvps7"><span class="rvts20">The first part, which runs on script activation, is usually executed only once (unless you made an infinite loop in it). The code is executed line by line, from top to down. Usually the task of that part is to initialize global variables and register functions to be launched by FCEUX when certain events occur.</span></p>
<p class="rvps10"><span class="rvts21">Program code in Lua scripts for FCEUX usually consists of 2 parts: the first part is executed once the script is activated, another part runs on certain emulation events, such as the end of a frame emulation, loading a savestate and so on.</span></p> <p class="rvps7"><span class="rvts20">In most of cases the main code of the script is contained in the single function that is automatically executed at the end of every frame. For example, this is how Mario hitbox drawing code for SMB may look:</span></p>
<p class="rvps10"><span class="rvts21">The first part, which runs on script activation, is usually executed only once (unless you made an infinite loop in it). The code is executed line by line, from top to down. Usually the task of that part is to initialize global variables and register functions to be launched by FCEUX when certain events occur.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">In most of cases the main code of the script is contained in the single function that is automatically executed at the end of every frame. For example, this is how Mario hitbox drawing code for SMB may look:</span></p> <div class="rvps7">
<p class="rvps10"><span class="rvts21"><br/></span></p> <table width="98%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<div class="rvps10"><table width="98%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <tr valign="top">
<tr valign="top"> <td style="border-color: #000000; border-style: solid; padding: 6px;">
<td style="border-color: #000000; border-style: solid;"><p class="rvps2"><span class="rvts50">marioWidth = 16</span></p> <p class="rvps2"><span class="rvts42">marioWidth = 16</span></p>
<p class="rvps2"><span class="rvts50">marioHeight = 32</span></p> <p class="rvps2"><span class="rvts42">marioHeight = 32</span></p>
<p class="rvps2"><span class="rvts50"><br/></span></p> <p class="rvps2"><span class="rvts42"><br/></span></p>
<p class="rvps2"><span class="rvts50">function everyframe()</span></p> <p class="rvps2"><span class="rvts42">function everyframe()</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">marioX = memory.readbyte(0x3AD)</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">marioX = memory.readbyte(0x3AD)</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">marioY = memory.readbyte(0xCE)</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">marioY = memory.readbyte(0xCE)</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">gui.drawbox(marioX, marioY, marioX + marioWidth, marioY + marioHeight)</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">gui.drawbox(marioX, marioY, marioX + marioWidth, marioY + marioHeight)</span></p>
<p class="rvps2"><span class="rvts50">end</span></p> <p class="rvps2"><span class="rvts42">end</span></p>
<p class="rvps2"><span class="rvts50"><br/></span></p> <p class="rvps2"><span class="rvts42"><br/></span></p>
<p class="rvps2"><span class="rvts50">emu.registerafter(everyframe)</span></p> <p class="rvps2"><span class="rvts42">emu.registerafter(everyframe)</span></p>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When activating this script, FCEUX creates and initializes two variables ("marioWidth" and "marioHeight"), then registers the function called everyframe() to the "frame end" event (registerafter). After that the text ends and the script finishes its execution, but the registered function remains in emulator memory, and if you unpause it or press </span><span class="rvts26">Frame Advance</span><span class="rvts21">, after every frame it will run the code stored within the everyframe() function. That code consists of 3 lines. The first two create variables for the hitbox position and initialize them with current values from RAM of the emulated console. The third line draws graphics over the game picture output.</span></p> <p class="rvps7"><span class="rvts20">When activating this script, FCEUX creates and initializes two variables ("marioWidth" and "marioHeight"), then registers the function called everyframe() to the "frame end" event (registerafter). After that the text ends and the script finishes its execution, but the registered function remains in emulator memory, and if you unpause it or press </span><span class="rvts23">Frame Advance</span><span class="rvts20">, after every frame it will run the code stored within the everyframe() function. That code consists of 3 lines. The first two create variables for the hitbox position and initialize them with current values from RAM of the emulated console. The third line draws graphics over the game picture output.</span></p>
<p class="rvps10"><span class="rvts21">Actual RAM addresses can be found in public resources (like </span><a class="rvts27" href="http://tasvideos.org/GameResources/NES/SuperMarioBros.html" target="_blank">http://tasvideos.org/GameResources/NES/SuperMarioBros.html</a><span class="rvts21">) or found on your own using the Cheat Search tool or the RAM Search tool built in FCEUX. In this case we know that Mario's X position is stored in memory address 0x3AD, and his Y position is in 0xCE. So, the script just takes their current values and draws the rectangle in the corresponding screen position. Sometimes there's need to recalculate the values to translate the in-game world coordinates into on-screen coordinates, but in this case they match.</span></p> <p class="rvps7"><span class="rvts20">Actual RAM addresses can be found in public resources (like </span><a class="rvts24" href="http://tasvideos.org/GameResources/NES/SuperMarioBros.html" target="_blank">http://tasvideos.org/GameResources/NES/SuperMarioBros.html</a><span class="rvts20">) or found on your own using the Cheat Search tool or the RAM Search tool built in FCEUX. In this case we know that Mario's X position is stored in memory address 0x3AD, and his Y position is in 0xCE. So, the script just takes their current values and draws the rectangle in the corresponding screen position. Sometimes there's need to recalculate the values to translate the in-game world coordinates into on-screen coordinates, but in this case they match.</span></p>
<p class="rvps10"><span class="rvts21">The standard functions readbyte(), drawbox() and other useful functions are described in the </span><a class="rvts27" href="http://www.fceux.com/web/help/fceux.html?LuaFunctionsList.html" target="_blank">FCEUX documentation</a><span class="rvts21">. It also describes how to use mathematical expressions and make loops and conditions.</span></p> <p class="rvps7"><span class="rvts20">The standard functions readbyte(), drawbox() and other useful functions are described in the </span><a class="rvts24" href="http://www.fceux.com/web/help/fceux.html?LuaFunctionsList.html" target="_blank">FCEUX documentation</a><span class="rvts20">. It also describes how to use mathematical expressions and make loops and conditions.</span></p>
<p class="rvps10"><span class="rvts21">The standard functions available only when Taseditor is engaged are listed in the </span><a class="rvts27" href="LuaAPI.html">Reference</a><span class="rvts21">. Using all this knowledge you can not only draw and write messages over the emulator screen, but also control Playback and Selection, and most importantly, modify the movie Input and Markers.</span></p> <p class="rvps7"><span class="rvts20">The standard functions available only when Taseditor is engaged are listed in the </span><a class="rvts24" href="LuaAPI.html">Reference</a><span class="rvts20">. Using all this knowledge you can not only draw and write messages over the emulator screen, but also control Playback and Selection, and most importantly, modify the movie Input and Markers.</span></p>
<p class="rvps10"><span class="rvts21">For example, this code copies one joypad Input to the second one's place:</span></p> <p class="rvps7"><span class="rvts20">For example, this code copies one joypad Input to the second one's place:</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<div class="rvps10"><table width="98%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <div class="rvps7">
<tr valign="top"> <table width="98%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<td style="border-color: #000000; border-style: solid;"><p class="rvps2"><span class="rvts50">function doCopy()</span></p> <tr valign="top">
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">selection_table = taseditor.getselection()</span></p> <td style="border-color: #000000; border-style: solid; padding: 6px;">
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">if (selection_table ~= nil) then</span></p> <p class="rvps2"><span class="rvts42">function doCopy()</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">for i = 1, #selection_table do</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">selection_table = taseditor.getselection()</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">selected_frame = selection_table[i]</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">if (selection_table ~= nil) then</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">joypad1data = taseditor.getinput(selected_frame, 1)</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">for i = 1, #selection_table do</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">taseditor.submitinputchange(selected_frame, 2, joypad1data)</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">selected_frame = selection_table[i]</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">end</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">joypad1data = taseditor.getinput(selected_frame, 1)</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">taseditor.applyinputchanges("Copy 1P-&gt;2P")</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">taseditor.submitinputchange(selected_frame, 2, joypad1data)</span></p>
<p class="rvps2"><span class="rvts50"></span><span class="rvts50"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts50">end</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">end</span></p>
<p class="rvps2"><span class="rvts50">end</span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">taseditor.applyinputchanges("Copy 1P-&gt;2P")</span></p>
<p class="rvps2"><span class="rvts50"><br/></span></p> <p class="rvps2"><span class="rvts42"></span><span class="rvts42"> &nbsp; &nbsp; &nbsp; &nbsp;</span><span class="rvts42">end</span></p>
<p class="rvps2"><span class="rvts50">taseditor.registermanual(doCopy, "Copy 1P to 2P")</span></p> <p class="rvps2"><span class="rvts42">end</span></p>
</td> <p class="rvps2"><span class="rvts42"><br/></span></p>
</tr> <p class="rvps2"><span class="rvts42">taseditor.registermanual(doCopy, "Copy 1P to 2P")</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When launching this script, FCEUX registers the doCopy() function to the event of pressing the "</span><span class="rvts29">Run function</span><span class="rvts21">" button (registermanual). Now any click on the button will run the code of that function, consisting of 9 lines. At first, the function gets information about Selection from Taseditor, and if it's not blank (i.e. at least one frame is selected in the Piano Roll) it runs the FOR loop, going through all the selected frames from the first to the last. For each selected frame the function requests the Input of the first player from Taseditor (and stores this data to the "joypad1data" variable), then it submits the claim to change the second player Input for that frame. All these submissions are accumulated in Taseditor memory until the FOR loop ends, after that they all are applied by calling the applyinputchanges(). As a result, the second joypad in the selected range of frames contains the same Input as the first joypad.</span></p> <p class="rvps7"><span class="rvts20">When launching this script, FCEUX registers the doCopy() function to the event of pressing the "</span><span class="rvts26">Run function</span><span class="rvts20">" button (registermanual). Now any click on the button will run the code of that function, consisting of 9 lines. At first, the function gets information about Selection from Taseditor, and if it's not blank (i.e. at least one frame is selected in the Piano Roll) it runs the FOR loop, going through all the selected frames from the first to the last. For each selected frame the function requests the Input of the first player from Taseditor (and stores this data to the "joypad1data" variable), then it submits the claim to change the second player Input for that frame. All these submissions are accumulated in Taseditor memory until the FOR loop ends, after that they all are applied by calling the applyinputchanges(). As a result, the second joypad in the selected range of frames contains the same Input as the first joypad.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/lua-run-manual.png"/></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/lua-run-manual.png"></p>
<p class="rvps10"><span class="rvts21">This simple script is already a useful mini-tool that may be needed when making a TAS for 2 or more players. Launch it, and while TASing you will be able to select a range of frames in the Piano Roll and click the "</span><span class="rvts29">Copy 1P to 2P</span><span class="rvts21">" button (or press the "</span><span class="rvts25">Run Manual Lua function</span><span class="rvts21">" hotkey) to synchronize both players. Every time the script work results in an Input change, the Greenzone is automatically truncated, and a new item is added to the History Log, allowing you to undo the changes done by the script. This way you've got a feature completely integrated into Taseditor, and you've programmed the behavior of the feature yourself.</span></p> <p class="rvps7"><span class="rvts20">This simple script is already a useful mini-tool that may be needed when making a TAS for 2 or more players. Launch it, and while TASing you will be able to select a range of frames in the Piano Roll and click the "</span><span class="rvts26">Copy 1P to 2P</span><span class="rvts20">" button (or press the "</span><span class="rvts22">Run Manual Lua function</span><span class="rvts20">" hotkey) to synchronize both players. Every time the script work results in an Input change, the Greenzone is automatically truncated, and a new item is added to the History Log, allowing you to undo the changes done by the script. This way you've got a feature completely integrated into Taseditor, and you've programmed the behavior of the feature yourself.</span></p>
<p class="rvps10"><span class="rvts21">Even though you can successfully TAS without Lua knowledge, its support can save you much time and even hint on a less obvious solutions during the Input optimization (or more exactly, during the game Output analysis).</span></p> <p class="rvps7"><span class="rvts20">Even though you can successfully TAS without Lua knowledge, its support can save you much time and even hint on a less obvious solutions during the Input optimization (or more exactly, during the game Output analysis).</span></p>
<p class="rvps10"><span class="rvts21">Videogames often hide important details of the situation, and TASer has to watch memory state directly in order to know for sure what's going on and to precisely perceive the optimality factors while polishing segments.</span></p> <p class="rvps7"><span class="rvts20">Videogames often hide important details of the situation, and TASer has to watch memory state directly in order to know for sure what's going on and to precisely perceive the optimality factors while polishing segments.</span></p>
<p class="rvps10"><span class="rvts21">For example, many games don't show boss HP on screen. So, to know exactly the damage you inflict, you need to watch the numeric value of the corresponding RAM address in the Memory Watch window. And when there is a plenty of hidden factors (for example, several timers of invulnerability and boss attack, and some special counters of the player character), TASer needs to watch and analyze many memory addresses as they change according to different rules. In this case an on-screen visualization of some data would be huge helper. For example, boss HP can be displayed as a bar or a number above his head, and a red color can indicate the damage frames or other events. As a result, your mind is relieved by moving from deciphering an abstract data format to the format that instantly delivers the main idea (e.g. "the boss was damaged", "good/bad").</span></p> <p class="rvps7"><span class="rvts20">For example, many games don't show boss HP on screen. So, to know exactly the damage you inflict, you need to watch the numeric value of the corresponding RAM address in the Memory Watch window. And when there is a plenty of hidden factors (for example, several timers of invulnerability and boss attack, and some special counters of the player character), TASer needs to watch and analyze many memory addresses as they change according to different rules. In this case an on-screen visualization of some data would be huge helper. For example, boss HP can be displayed as a bar or a number above his head, and a red color can indicate the damage frames or other events. As a result, your mind is relieved by moving from deciphering an abstract data format to the format that instantly delivers the main idea (e.g. "the boss was damaged", "good/bad").</span></p>
<p class="rvps10"><span class="rvts21">So it's recommended to learn Lua at least to the level of being able to sensibly modify others' scripts. For the long time FCEUX existed, people wrote and published a lot of scripts serving for various purposes, and you'll probably only need to change some RAM addresses to adjust a script to your game. Oftentimes it also makes sense to ask for help at </span><a class="rvts27" href="http://tasvideos.org/forum/viewforum.php?f=25" target="_blank">TASVideos forums</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">So it's recommended to learn Lua at least to the level of being able to sensibly modify others' scripts. For the long time FCEUX existed, people wrote and published a lot of scripts serving for various purposes, and you'll probably only need to change some RAM addresses to adjust a script to your game. Oftentimes it also makes sense to ask for help at </span><a class="rvts24" href="http://tasvideos.org/forum/viewforum.php?f=25" target="_blank">TASVideos forums</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The Taseditor guide is over. If you were reading carefully, you should now know everything necessary to make a TAS up to the high standards of TASVideos. The only thing left is to gain an experience in real work, master some actions to automatism in order to feel no trace of routine and have fun from the process of armed playthrough and investigation of games.</span></p> <p class="rvps7"><span class="rvts20">The Taseditor guide is over. If you were reading carefully, you should now know everything necessary to make a TAS up to the high standards of TASVideos. The only thing left is to gain an experience in real work, master some actions to automatism in order to feel no trace of routine and have fun from the process of armed playthrough and investigation of games.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com">Free CHM Help documentation generator</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,97 +1,292 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>Beginner's Guide</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>Beginner's Guide</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="Beginner's Guide">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="Beginner's Guide" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("BeginnersGuide"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>Beginner's Guide</h1>
</div>
<div id="topic_header_nav">
<a href="Title.html"><img src="img/arrow_left.png" alt="Previous"/></a>
<a href="Introduction.html"><img src="img/arrow_right.png" alt="Next"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
</div> <header class="headroom">
<div class="clear"></div> <button class="hnd-toggle btn btn-default">
</div> <span class="sr-only">Toggle navigation</span>
<div id="topic_content"> <span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</header>
<nav id="panel-left" class="md-nav-expanded">
<!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="BeginnersGuide"
data-hnd-context="1"
data-hnd-title="Beginner's Guide"
>
<div class="navigation">
<ol class="breadcrumb">
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="Title.html" title="Title" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="Introduction.html" title="1. Introduction" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Beginner's Guide</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Beginner's Guide</span></p> <p class="rvps2"><span class="rvts18">Beginner's Guide</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">This part of the documentation is presented in the form of a textbook on TASing.</span></p> <p class="rvps7"><span class="rvts20">This part of the documentation is presented in the form of a textbook on TASing.</span></p>
<p class="rvps10"><span class="rvts21">It explains the practice of using Taseditor and describes the mechanism of conventional TASing methods.</span></p> <p class="rvps7"><span class="rvts20">It explains the practice of using Taseditor and describes the mechanism of conventional TASing methods.</span></p>
<p class="rvps10"><span class="rvts21">The course will be useful both to people who wish to learn TASing and to already experienced TASers who are open to new trends and wish to improve their knowledge.</span></p> <p class="rvps7"><span class="rvts20">The course will be useful both to people who wish to learn TASing and to already experienced TASers who are open to new trends and wish to improve their knowledge.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts23" href="Introduction.html">Introduction</a></p> <p class="rvps7"><a class="rvts11" href="Introduction.html">Introduction</a></p>
<p class="rvps12"><span class="rvts24">General overview of TAS Editor's goals and features</span></p> <p class="rvps8"><span class="rvts20">General overview of TAS Editor's goals and features</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts23" href="ProgramInterface.html">Program Interface</a></p> <p class="rvps7"><a class="rvts11" href="ProgramInterface.html">Program Interface</a></p>
<p class="rvps12"><span class="rvts24">Learning the fundamentals of the program usage</span></p> <p class="rvps8"><span class="rvts20">Learning the fundamentals of the program usage</span></p>
<p class="rvps10"><a class="rvts23" href="Navigation.html"><br/></a></p> <p class="rvps7"><a class="rvts11" href="Navigation.html"><br/></a></p>
<p class="rvps10"><a class="rvts23" href="TASingProcess.html">TASing Process</a></p> <p class="rvps7"><a class="rvts11" href="TASingProcess.html">TASing Process</a></p>
<p class="rvps12"><span class="rvts24">The author's vision of the competent working process</span></p> <p class="rvps8"><span class="rvts20">The author's vision of the competent working process</span></p>
<p class="rvps10"><a class="rvts23" href="Operations.html"><br/></a></p> <p class="rvps7"><a class="rvts11" href="Operations.html"><br/></a></p>
<p class="rvps10"><a class="rvts23" href="TASingMethodology.html">TASing Methodology</a></p> <p class="rvps7"><a class="rvts11" href="TASingMethodology.html">TASing Methodology</a></p>
<p class="rvps12"><span class="rvts24">Dissection of the Input improvement methods</span></p> <p class="rvps8"><span class="rvts20">Dissection of the Input improvement methods</span></p>
<p class="rvps10"><a class="rvts23" href="LuaAPI.html"><br/></a></p> <p class="rvps7"><a class="rvts11" href="LuaAPI.html"><br/></a></p>
<p class="rvps10"><a class="rvts23" href="ProgramCustomization.html">Program customization</a></p> <p class="rvps7"><a class="rvts11" href="ProgramCustomization.html">Program customization</a></p>
<p class="rvps12"><span class="rvts24">Detailed review of all settings</span></p> <p class="rvps8"><span class="rvts20">Detailed review of all settings</span></p>
<p class="rvps10"><span class="rvts23"><br/></span></p> <p class="rvps7"><span class="rvts11"><br/></span></p>
<p class="rvps10"><a class="rvts23" href="AdvancedFeatures.html">Advanced Features</a></p> <p class="rvps7"><a class="rvts11" href="AdvancedFeatures.html">Advanced Features</a></p>
<p class="rvps12"><span class="rvts24">Describing the additional possibilities</span></p> <p class="rvps8"><span class="rvts20">Describing the additional possibilities</span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Full-featured Kindle eBooks generator</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/help-authoring-tool">Easy to use tool to create HTML Help files and Help web sites</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@ -1,140 +1,331 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>FAQ</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>FAQ</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="FAQ">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="FAQ" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("FAQ"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>FAQ</h1>
<div id="topic_breadcrumb">
<a href="Reference.html">Reference</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="Reference.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="LuaAPI.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="SpeedrunningSynopsis.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="FAQ"
data-hnd-context="16"
data-hnd-title="FAQ"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="Reference.html">Reference</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="Reference.html" title="Reference" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="LuaAPI.html" title="Lua API" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="SpeedrunningSynopsis.html" title="Speedrunning synopsis" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>FAQ</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">FAQ</span></p> <p class="rvps2"><span class="rvts18">FAQ</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts21">If after reading the Manual you still have any questions on the topic, feel free to ask them at </span><a class="rvts27" href="http://tasvideos.org/forum/index.php" target="_blank">TASVideos</a><span class="rvts21"> forum.</span></p> <p class="rvps7"><span class="rvts20">If after reading the Manual you still have any questions on the topic, feel free to ask them at </span><a class="rvts24" href="http://tasvideos.org/forum/index.php" target="_blank">TASVideos</a><span class="rvts20"> forum.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">I think I've found a bug in the program, what should I do?</span></p> <p class="rvps7"><span class="rvts21">I think I've found a bug in the program, what should I do?</span></p>
<p class="rvps10"><span class="rvts21">Post a message in the </span><a class="rvts27" href="http://tasvideos.org/forum/viewforum.php?f=15" target="_blank">FCEUX</a><span class="rvts21"> subforum of TASVideos. Try to explain the issue precisely, to help author reproduce the situation. Attach a screenshot if you think it reflects the essence of the problem.</span></p> <p class="rvps7"><span class="rvts20">Post a message in the </span><a class="rvts24" href="http://tasvideos.org/forum/viewforum.php?f=15" target="_blank">FCEUX</a><span class="rvts20"> subforum of TASVideos. Try to explain the issue precisely, to help author reproduce the situation. Attach a screenshot if you think it reflects the essence of the problem.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">Is it possible to use Taseditor with other emulators?</span></p> <p class="rvps7"><span class="rvts21">Is it possible to use Taseditor with other emulators?</span></p>
<p class="rvps10"><span class="rvts21">No. Even though the program code of Taseditor is mostly isolated from the emulator code, it is by no means a plug-in. So it's necessary to manually port its source code and modify it according to specifications of target platform.</span></p> <p class="rvps7"><span class="rvts20">No. Even though the program code of Taseditor is mostly isolated from the emulator code, it is by no means a plug-in. So it's necessary to manually port its source code and modify it according to specifications of target platform.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">How can I TAS the traditional way, yet with Taseditor interface?</span></p> <p class="rvps7"><span class="rvts21">How can I TAS the traditional way, yet with Taseditor interface?</span></p>
<p class="rvps10"><span class="rvts21">Basically, you can start traditional TASing right away, no additional settings are required. But if you must keep some old habits intact, you can fine-tune the program. Try the following options:</span></p> <p class="rvps7"><span class="rvts20">Basically, you can start traditional TASing right away, no additional settings are required. But if you must keep some old habits intact, you can fine-tune the program. Try the following options:</span></p>
<ul style="text-indent: 25px; margin-left: 5px; list-style-position: inside;"> <ul style="text-indent: 25px; padding: 0; margin: 0 0 0 5px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10" style="text-indent: 25px"><span class="rvts21">switch on the </span><a class="rvts27" href="ProgramCustomization.html#OldcontrolschemeforBranching">Config -&gt; Old control scheme for Branching</a><span class="rvts21"> option</span></li> <li style="text-indent: 25px" class="rvps7"><span class="rvts20">switch on the </span><a class="rvts24" href="ProgramCustomization.html#OldcontrolschemeforBranching">Config -&gt; Old control scheme for Branching</a><span class="rvts20"> option</span></li>
<li class="rvps10" style="text-indent: 25px"><span class="rvts21">switch off the </span><a class="rvts27" href="ProgramCustomization.html#BranchesrestoreentireMovie">Config -&gt; Branches restore entire Movie</a><span class="rvts21"> option</span></li> <li style="text-indent: 25px" class="rvps7"><span class="rvts20">switch off the </span><a class="rvts24" href="ProgramCustomization.html#BranchesrestoreentireMovie">Config -&gt; Branches restore entire Movie</a><span class="rvts20"> option</span></li>
<li class="rvps10" style="text-indent: 25px"><span class="rvts21">switch on the </span><a class="rvts27" href="ProgramCustomization.html#CombineconsecutiveRecordings">Config -&gt; Combine consecutive Recordings/Draws</a><span class="rvts21"> option</span></li> <li style="text-indent: 25px" class="rvps7"><span class="rvts20">switch on the </span><a class="rvts24" href="ProgramCustomization.html#CombineconsecutiveRecordings">Config -&gt; Combine consecutive Recordings/Draws</a><span class="rvts20"> option</span></li>
<li class="rvps10" style="text-indent: 25px"><span class="rvts21">switch off the </span><a class="rvts27" href="ProgramCustomization.html#UseInputkeysforColumnSet">Config -&gt; Use Input keys for Column Set</a><span class="rvts21"> option</span></li> <li style="text-indent: 25px" class="rvps7"><span class="rvts20">switch off the </span><a class="rvts24" href="ProgramCustomization.html#UseInputkeysforColumnSet">Config -&gt; Use Input keys for Column Set</a><span class="rvts20"> option</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21">Also, it's recommended to switch the Bookmarks List to the "Branches Tree" view.</span></p> <p class="rvps7"><span class="rvts20">Also, it's recommended to switch the Bookmarks List to the "Branches Tree" view.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">Why the right-click on the FCEUX window doesn't prompt the usual context menu?</span></p> <p class="rvps7"><span class="rvts21">Why the right-click on the FCEUX window doesn't prompt the usual context menu?</span></p>
<p class="rvps10"><span class="rvts21">It's done to facilitate the </span><a class="rvts27" href="Navigation.html#rewinding-by-wheel">Playback cursor navigation with the mouse wheel</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">It's done to facilitate the </span><a class="rvts24" href="Navigation.html#rewinding-by-wheel">Playback cursor navigation with the mouse wheel</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">Usually users move the mouse cursor in such a manner that it's in sight. Thus when TASer is watching the game events the cursor will often be inside the FCEUX window. Context menus would obstruct the view when you want to rewind the Playback by holding the right mouse button and rolling the mouse wheel. So, since there's no important items in the menu while TAS Editor is engaged, the menu was removed.</span></p> <p class="rvps7"><span class="rvts20">Usually users move the mouse cursor in such a manner that it's in sight. Thus when TASer is watching the game events the cursor will often be inside the FCEUX window. Context menus would obstruct the view when you want to rewind the Playback by holding the right mouse button and rolling the mouse wheel. So, since there's no important items in the menu while TAS Editor is engaged, the menu was removed.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">Why the right-click on the Piano Roll sometimes prompts a context menu and sometimes doesn't?</span></p> <p class="rvps7"><span class="rvts21">Why the right-click on the Piano Roll sometimes prompts a context menu and sometimes doesn't?</span></p>
<p class="rvps10"><span class="rvts21">Taseditor's context menu only appears when you right-click on the number of a selected frame. If you right-click on a frame that is not selected, or you right-click on the Input of a selected frame, the menu won't appear.</span></p> <p class="rvps7"><span class="rvts20">Taseditor's context menu only appears when you right-click on the number of a selected frame. If you right-click on a frame that is not selected, or you right-click on the Input of a selected frame, the menu won't appear.</span></p>
<p class="rvps10"><span class="rvts21">It's done to facilitate the Piano Roll scrolling by right-clicking and dragging.</span></p> <p class="rvps7"><span class="rvts20">It's done to facilitate the Piano Roll scrolling by right-clicking and dragging.</span></p>
<p class="rvps10"><span class="rvts21">Generally, it's recommended to use keyboard shortcuts and other means of accessing Taseditor features instead of using context menu.</span></p> <p class="rvps7"><span class="rvts20">Generally, it's recommended to use keyboard shortcuts and other means of accessing Taseditor features instead of using context menu.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">How do I insert a Reset command into the movie?</span></p> <p class="rvps7"><span class="rvts21">How do I insert a Reset command into the movie?</span></p>
<p class="rvps10"><span class="rvts21">You should use Input Recording here. Place the Playback cursor to the target frame, switch on Recording, then choose </span><span class="rvts25">NES -&gt; Reset</span><span class="rvts21"> in FCEUX main menu and press </span><span class="rvts26">Frame Advance</span><span class="rvts21">. Also, it's recommended to set a Marker to this frame, since there's no other way to mark a Reset/Power switch in the Piano Roll (there's no columns for commands, only for buttons).</span></p> <p class="rvps7"><span class="rvts20">You should use Input Recording here. Place the Playback cursor to the target frame, switch on Recording, then choose </span><span class="rvts22">NES -&gt; Reset</span><span class="rvts20"> in FCEUX main menu and press </span><span class="rvts23">Frame Advance</span><span class="rvts20">. Also, it's recommended to set a Marker to this frame, since there's no other way to mark a Reset/Power switch in the Piano Roll (there's no columns for commands, only for buttons).</span></p>
<p class="rvps10"><span class="rvts21">Then you can switch Recording off and continue usual movie editing. The frame with the Reset command can be transposed up or down by inserting or deleting frames above it.</span></p> <p class="rvps7"><span class="rvts20">Then you can switch Recording off and continue usual movie editing. The frame with the Reset command can be transposed up or down by inserting or deleting frames above it.</span></p>
<p class="rvps10"><span class="rvts21">Other hardware commands are invoked the same way, see </span><a class="rvts27" href="Controls.html#virtual_joypad">Controls</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Other hardware commands are invoked the same way, see </span><a class="rvts24" href="Controls.html#virtual_joypad">Controls</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">How do I change the order of columns in the Piano Roll?</span></p> <p class="rvps7"><span class="rvts21">How do I change the order of columns in the Piano Roll?</span></p>
<p class="rvps10"><span class="rvts21">Unfortunately, this feature is not supported in TAS Editor 1.0. &nbsp;This will be </span><a class="rvts27" href="Ideas.html#BetterColumns">fixed</a><span class="rvts21"> in next versions.</span></p> <p class="rvps7"><span class="rvts20">Unfortunately, this feature is not supported in TAS Editor 1.0. &nbsp;This will be </span><a class="rvts24" href="Ideas.html#BetterColumns">fixed</a><span class="rvts20"> in next versions.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">How do I change the number of players (joypads) in my movie?</span></p> <p class="rvps7"><span class="rvts21">How do I change the number of players (joypads) in my movie?</span></p>
<p class="rvps10"><span class="rvts21">You should create a new project, copying the Input and Markers from the current one.</span></p> <p class="rvps7"><span class="rvts20">You should create a new project, copying the Input and Markers from the current one.</span></p>
<p class="rvps10"><span class="rvts21">Choose </span><span class="rvts25">File -&gt; New</span><span class="rvts21"> in TAS Editor main menu. In the "Create New Project" window: choose the needed Input type, check "Copy current Input" and "Copy current Markers" checkboxes and click "OK".</span></p> <p class="rvps7"><span class="rvts20">Choose </span><span class="rvts22">File -&gt; New</span><span class="rvts20"> in TAS Editor main menu. In the "Create New Project" window: choose the needed Input type, check "Copy current Input" and "Copy current Markers" checkboxes and click "OK".</span></p>
<p class="rvps10"><span class="rvts21">Old project's Bookmarks won't be copied to the new project this way. But you can recreate them using Input export/import features.</span></p> <p class="rvps7"><span class="rvts20">Old project's Bookmarks won't be copied to the new project this way. But you can recreate them using Input export/import features.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">How can I quickly compare two movies?</span></p> <p class="rvps7"><span class="rvts21">How can I quickly compare two movies?</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ol style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10"><span class="rvts21">Make sure that </span><a class="rvts27" href="ProgramCustomization.html#EnableHotChanges">Hot Changes</a><span class="rvts21"> are enabled.</span></li> <li value="1" class="rvps7"><span class="rvts20">Make sure that </span><a class="rvts24" href="ProgramCustomization.html#EnableHotChanges">Hot Changes</a><span class="rvts20"> are enabled.</span></li>
<li class="rvps10"><span class="rvts21">Create an empty project, import the first movie into it (using </span><span class="rvts25">File -&gt; Import Input</span><span class="rvts21">), replay the movie to the end and save it to Bookmark 1.</span></li> <li value="2" class="rvps7"><span class="rvts20">Create an empty project, import the first movie into it (using </span><span class="rvts22">File -&gt; Import Input</span><span class="rvts20">), replay the movie to the end and save it to Bookmark 1.</span></li>
<li class="rvps10"><span class="rvts21">Import the second movie over the existing Input and save the result to Bookmark 2.</span></li> <li value="3" class="rvps7"><span class="rvts20">Import the second movie over the existing Input and save the result to Bookmark 2.</span></li>
</ol> </ol>
<p class="rvps10"><span class="rvts21">The import operation will truncate the Greenzone after the frame where the first difference between Input of the two movies was found. Other places of discrepancy can be detected by observing the Input in the Piano Roll:</span></p> <p class="rvps7"><span class="rvts20">The import operation will truncate the Greenzone after the frame where the first difference between Input of the two movies was found. Other places of discrepancy can be detected by observing the Input in the Piano Roll:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">buttonpresses that match in both movies are colored black</span></li> <li class="rvps7"><span class="rvts20">buttonpresses that match in both movies are colored black</span></li>
<li class="rvps10"><span class="rvts21">new buttonpresses (added by the 2nd movie) are colored bright-red</span></li> <li class="rvps7"><span class="rvts20">new buttonpresses (added by the 2nd movie) are colored bright-red</span></li>
<li class="rvps10"><span class="rvts21">deleted buttonpresses are marked by dash</span></li> <li class="rvps7"><span class="rvts20">deleted buttonpresses are marked by dash</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21">For extra convenience it's recommended to name both Bookmarks, for example, copy/paste the filename of the imported movie into the upper Marker Note just before creating a Bookmark.</span></p> <p class="rvps7"><span class="rvts20">For extra convenience it's recommended to name both Bookmarks, for example, copy/paste the filename of the imported movie into the upper Marker Note just before creating a Bookmark.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">Why are those fm3 files so large?</span></p> <p class="rvps7"><span class="rvts21">Why are those fm3 files so large?</span></p>
<p class="rvps10"><span class="rvts21">An FM3 file usually contains full snapshot of the working process, including the Greenzone data (which takes the most part of the file). See </span><a class="rvts27" href="AdvancedFeatures.html#ProjectsSharing">Advanced Features</a><span class="rvts21"> for details. You can customize this in the </span><a class="rvts27" href="ProgramCustomization.html#Projectfilesavingoptions">Config</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">An FM3 file usually contains full snapshot of the working process, including the Greenzone data (which takes the most part of the file). See </span><a class="rvts24" href="AdvancedFeatures.html#ProjectsSharing">Advanced Features</a><span class="rvts20"> for details. You can customize this in the </span><a class="rvts24" href="ProgramCustomization.html#Projectfilesavingoptions">Config</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">Why is the Manual so long?</span></p> <p class="rvps7"><span class="rvts21">Why is the Manual so long?</span></p>
<p class="rvps10"><span class="rvts21">Because besides the program specifications the Manual contains a comprehensive tutorial (the </span><a class="rvts27" href="BeginnersGuide.html">Beginner's Guide</a><span class="rvts21">) which systematizes known principles of effective TASing. Since there was no similar endeavors before, the author decided that lengthy explanations are the lesser evil than possible inexactitude.</span></p> <p class="rvps7"><span class="rvts20">Because besides the program specifications the Manual contains a comprehensive tutorial (the </span><a class="rvts24" href="BeginnersGuide.html">Beginner's Guide</a><span class="rvts20">) which systematizes known principles of effective TASing. Since there was no similar endeavors before, the author decided that lengthy explanations are the lesser evil than possible inexactitude.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/feature-tour">Full-featured Help generator</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/help-authoring-tool">Create HTML Help, DOC, PDF and print manuals from 1 single source</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,392 +1,635 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>FM3 format</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>FM3 format</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="FM3 format">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="FM3 format" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("FM3format"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>FM3 format</h1>
<div id="topic_breadcrumb">
<a href="TASEditorInside.html">TAS Editor Inside</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="TASEditorInside.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="MistakeProofing.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
</div> <header class="headroom">
<div class="clear"></div> <button class="hnd-toggle btn btn-default">
</div> <span class="sr-only">Toggle navigation</span>
<div id="topic_content"> <span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</header>
<nav id="panel-left" class="md-nav-expanded">
<!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="FM3format"
data-hnd-context="26"
data-hnd-title="FM3 format"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="TASEditorInside.html">TAS Editor Inside</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="TASEditorInside.html" title="TAS Editor Inside" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="MistakeProofing.html" title="Mistake-proofing" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>FM3 format</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">FM3 format</span></p> <p class="rvps2"><span class="rvts18">FM3 format</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts21">The FM3 format is a simple extension of the FM2 format. FM2 files contain data which is needed for replaying the movie, and FM3 just adds Taseditor's working data to the end of FM2 file.</span></p> <p class="rvps7"><span class="rvts20">The FM3 format is a simple extension of the FM2 format. FM2 files contain data which is needed for replaying the movie, and FM3 just adds Taseditor's working data to the end of FM2 file.</span></p>
<p class="rvps10"><span class="rvts21">You can read full specifications of FM2 format in the FCEUX Help and on </span><a class="rvts27" href="http://www.fceux.com/web/FM2.html" target="_blank">official site</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">You can read full specifications of FM2 format in the FCEUX Help and on </span><a class="rvts24" href="http://www.fceux.com/web/FM2.html" target="_blank">official site</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Every FM3 consists of 3 parts:</span></p> <p class="rvps7"><span class="rvts20">Every FM3 consists of 3 parts:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><a class="rvts27" href="FM3format.html#Header">Header</a><span class="rvts21"> (as in fm2)</span></li> <li class="rvps7"><a class="rvts24" href="FM3format.html#Header">Header</a><span class="rvts20"> (as in fm2)</span></li>
<li class="rvps10"><a class="rvts27" href="FM3format.html#InputLog">Input Log</a><span class="rvts21"> (as in fm2)</span></li> <li class="rvps7"><a class="rvts24" href="FM3format.html#InputLog">Input Log</a><span class="rvts20"> (as in fm2)</span></li>
<li class="rvps10"><a class="rvts27" href="FM3format.html#TaseditorData">Taseditor data</a></li> <li class="rvps7"><a class="rvts24" href="FM3format.html#TaseditorData">Taseditor data</a></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="Header"></a> <p class="rvps7"><a name="Header"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">Header</span></p>
<p class="rvps10"><span class="rvts22">Header</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The Header is always in ASCII plain text format.</span></p>
<p class="rvps10"><span class="rvts21">The Header is always in ASCII plain text format.</span></p> <p class="rvps7"><span class="rvts20">It consists of several key-value pairs (lines of text where all symbols before the first space separator are considered to be the keyword and all symbols after this separator are considered to be the text representation of the value).</span></p>
<p class="rvps10"><span class="rvts21">It consists of several key-value pairs (lines of text where all symbols before the first space separator are considered to be the keyword and all symbols after this separator are considered to be the text representation of the value).</span></p> <p class="rvps7"><span class="rvts20">Newlines may be </span><span class="rvts63">\r\n</span><span class="rvts20"> or </span><span class="rvts63">\n</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">Newlines may be </span><span class="rvts70">\r\n</span><span class="rvts21"> or </span><span class="rvts70">\n</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">If a line starts from "|" (pipe), it means the end of Header and the beginning of Input Log.</span></p>
<p class="rvps10"><span class="rvts21">If a line starts from "|" (pipe), it means the end of Header and the beginning of Input Log.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The key-value pairs may be in any order, except that the first key must be </span><span class="rvts22">version</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">The key-value pairs may be in any order, except that the first key must be </span><span class="rvts25">version</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Value text is always terminated by a newline, which the value text does not include.</span></p>
<p class="rvps10"><span class="rvts21">Value text is always terminated by a newline, which the value text does not include.</span></p> <p class="rvps7"><span class="rvts20">The value text is parsed differently depending on the keyword, it can be either integer or string.</span></p>
<p class="rvps10"><span class="rvts21">The value text is parsed differently depending on the keyword, it can be either integer or string.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts31">Keys with integer value:</span></p>
<p class="rvps10"><span class="rvts34">Keys with integer value:</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">(also used for booleans, with a 1 for </span><span class="rvts63">true</span><span class="rvts20"> and 0 for </span><span class="rvts63">false</span><span class="rvts20">)</span></p>
<p class="rvps10"><span class="rvts21">(also used for booleans, with a 1 for </span><span class="rvts70">true</span><span class="rvts21"> and 0 for </span><span class="rvts70">false</span><span class="rvts21">)</span></p> <p class="rvps7"><span class="rvts20">(the value can be stored as </span><span class="rvts63">int32</span><span class="rvts20">)</span></p>
<p class="rvps10"><span class="rvts21">(the value can be stored as </span><span class="rvts70">int32</span><span class="rvts21">)</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts22">version</span><span class="rvts20"> (required) the version of the movie file format; for now it is always </span><span class="rvts22">3</span></li>
<li class="rvps10"><span class="rvts25">version</span><span class="rvts21"> (required) the version of the movie file format; for now it is always </span><span class="rvts25">3</span></li> <li class="rvps7"><span class="rvts22">emuVersion</span><span class="rvts20"> (required) the version of the emulator used to produce the file (e.g. </span><span class="rvts22">21060</span><span class="rvts20">)</span></li>
<li class="rvps10"><span class="rvts25">emuVersion</span><span class="rvts21"> (required) the version of the emulator used to produce the file (e.g. </span><span class="rvts25">21060</span><span class="rvts21">)</span></li> <li class="rvps7"><span class="rvts22">rerecordCount</span><span class="rvts20"> (optional) the rerecord count</span></li>
<li class="rvps10"><span class="rvts25">rerecordCount</span><span class="rvts21"> (optional) the rerecord count</span></li> <li class="rvps7"><span class="rvts22">palFlag</span><span class="rvts20"> (</span><span class="rvts63">bool</span><span class="rvts20">) (optional) </span><span class="rvts63">true </span><span class="rvts20">if the movie uses PAL timing</span></li>
<li class="rvps10"><span class="rvts25">palFlag</span><span class="rvts21"> (</span><span class="rvts70">bool</span><span class="rvts21">) (optional) </span><span class="rvts70">true </span><span class="rvts21">if the movie uses PAL timing</span></li> <li class="rvps7"><span class="rvts22">NewPPU</span><span class="rvts20"> (</span><span class="rvts63">bool</span><span class="rvts20">) (optional) </span><span class="rvts63">true </span><span class="rvts20">if the movie uses New PPU</span></li>
<li class="rvps10"><span class="rvts25">NewPPU</span><span class="rvts21"> (</span><span class="rvts70">bool</span><span class="rvts21">) (optional) </span><span class="rvts70">true </span><span class="rvts21">if the movie uses New PPU</span></li> <li class="rvps7"><span class="rvts22">FDS</span><span class="rvts20"> (</span><span class="rvts63">bool</span><span class="rvts20">) (optional) </span><span class="rvts63">true </span><span class="rvts20">if the movie was recorded on a Famicom Disk System (FDS) game</span></li>
<li class="rvps10"><span class="rvts25">FDS</span><span class="rvts21"> (</span><span class="rvts70">bool</span><span class="rvts21">) (optional) </span><span class="rvts70">true </span><span class="rvts21">if the movie was recorded on a Famicom Disk System (FDS) game</span></li> <li class="rvps7"><span class="rvts22">fourscore</span><span class="rvts20"> (</span><span class="rvts63">bool</span><span class="rvts20">) </span><span class="rvts63">true</span><span class="rvts20"> if a fourscore was used. If fourscore is not used, then </span><span class="rvts22">port0</span><span class="rvts20"> and </span><span class="rvts22">port1</span><span class="rvts20"> are required</span></li>
<li class="rvps10"><span class="rvts25">fourscore</span><span class="rvts21"> (</span><span class="rvts70">bool</span><span class="rvts21">) </span><span class="rvts70">true</span><span class="rvts21"> if a fourscore was used. If fourscore is not used, then </span><span class="rvts25">port0</span><span class="rvts21"> and </span><span class="rvts25">port1</span><span class="rvts21"> are required</span></li> <li class="rvps7"><span class="rvts22">port0</span><span class="rvts20"> the type of input device attached to the port 0. Supported values are:</span></li>
<li class="rvps10"><span class="rvts25">port0</span><span class="rvts21"> the type of input device attached to the port 0. Supported values are:</span></li>
</ul> </ul>
<ul style="text-indent: 60px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 60px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">SI_NONE = 0</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">SI_NONE = 0</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">SI_GAMEPAD = 1</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">SI_GAMEPAD = 1</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">SI_ZAPPER = 2</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">SI_ZAPPER = 2</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts25">port1</span><span class="rvts21"> the type of input device attached to the port 1. Supported values are:</span></li> <li class="rvps7"><span class="rvts22">port1</span><span class="rvts20"> the type of input device attached to the port 1. Supported values are:</span></li>
</ul> </ul>
<ul style="text-indent: 60px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 60px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">SI_NONE = 0</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">SI_NONE = 0</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">SI_GAMEPAD = 1</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">SI_GAMEPAD = 1</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">SI_ZAPPER = 2</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">SI_ZAPPER = 2</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts25">port2</span><span class="rvts21"> (required) the type of the FCExp port device which was attached. Supported values are:</span></li> <li class="rvps7"><span class="rvts22">port2</span><span class="rvts20"> (required) the type of the FCExp port device which was attached. Supported values are:</span></li>
</ul> </ul>
<ul style="text-indent: 60px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 60px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">SIFC_NONE = 0</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">SIFC_NONE = 0</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts25">binary</span><span class="rvts21"> (</span><span class="rvts70">bool</span><span class="rvts21">) (optional) </span><span class="rvts70">true </span><span class="rvts21">if Input Log is stored in binary format. FM2 files usually contain Input in text format, for easy editing and splicing. FM3 files usually contain Input in binary format, to save disk space</span></li> <li class="rvps7"><span class="rvts22">binary</span><span class="rvts20"> (</span><span class="rvts63">bool</span><span class="rvts20">) (optional) </span><span class="rvts63">true </span><span class="rvts20">if Input Log is stored in binary format. FM2 files usually contain Input in text format, for easy editing and splicing. FM3 files usually contain Input in binary format, to save disk space</span></li>
<li class="rvps10"><span class="rvts25">length</span><span class="rvts21"> (required in FM3) &nbsp;movie size (number of frames in the input log). If this key is specified and the number is &gt;= 0, the Input Log ends after specified number of records, and any remaining data should not be parsed (because it's Taseditor data). The Header of FM3s always has this keyword, the Header of FM2s doesn't have it.</span></li> <li class="rvps7"><span class="rvts22">length</span><span class="rvts20"> (required in FM3) &nbsp;movie size (number of frames in the input log). If this key is specified and the number is &gt;= 0, the Input Log ends after specified number of records, and any remaining data should not be parsed (because it's Taseditor data). The Header of FM3s always has this keyword, the Header of FM2s doesn't have it.</span></li>
</ul> </ul>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts34">Keys with string value:</span></p> <p class="rvps7"><span class="rvts31">Keys with string value:</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">(their values cannot contain newlines)</span></p> <p class="rvps7"><span class="rvts20">(their values cannot contain newlines)</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">romFilename</span><span class="rvts21"> (required) the name of the file used to record the movie</span></p> <p class="rvps7"><span class="rvts22">romFilename</span><span class="rvts20"> (required) the name of the file used to record the movie</span></p>
<p class="rvps10"><span class="rvts25">romChecksum</span><span class="rvts21"> (required) the base64 of the hexified MD5 hash of the ROM which was used to record the movie</span></p> <p class="rvps7"><span class="rvts22">romChecksum</span><span class="rvts20"> (required) the base64 of the hexified MD5 hash of the ROM which was used to record the movie</span></p>
<p class="rvps10"><span class="rvts25">comment</span><span class="rvts21"> (optional) simply a memo. By convention, the author of the movie should be stored in a comment with the subject "author". Example: "comment author AnS"</span></p> <p class="rvps7"><span class="rvts22">comment</span><span class="rvts20"> (optional) simply a memo. By convention, the author of the movie should be stored in a comment with the subject "author". Example: "comment author AnS"</span></p>
<p class="rvps10"><span class="rvts25">subtitle</span><span class="rvts21"> (optional) a message that will be displayed on screen when movie is played back (unless Subtitles are turned off). Right after the word "subtitle" and following space separator there must be an integer value indicating the frame that the subtitle will be displayed. &nbsp;Any remaining text after the integer and following space separator is considered to be the string displayed. Example: "subtitle 100 Level Two" at frame 100 the words "Level Two" will be displayed on the screen</span></p> <p class="rvps7"><span class="rvts22">subtitle</span><span class="rvts20"> (optional) a message that will be displayed on screen when movie is played back (unless Subtitles are turned off). Right after the word "subtitle" and following space separator there must be an integer value indicating the frame that the subtitle will be displayed. &nbsp;Any remaining text after the integer and following space separator is considered to be the string displayed. Example: "subtitle 100 Level Two" at frame 100 the words "Level Two" will be displayed on the screen</span></p>
<p class="rvps10"><span class="rvts25">guid</span><span class="rvts21"> (required) a unique identifier for a movie, generated when the movie is created. Meaningless in FM3, because all there's no external savestates associated with the project file.</span></p> <p class="rvps7"><span class="rvts22">guid</span><span class="rvts20"> (required) a unique identifier for a movie, generated when the movie is created. Meaningless in FM3, because all there's no external savestates associated with the project file.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="InputLog"></a> <p class="rvps7"><a name="InputLog"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">Input Log</span></p>
<p class="rvps10"><span class="rvts22">Input Log</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The Input Log section consists of movie records either in the form of text lines or in the form of binary data.</span></p>
<p class="rvps10"><span class="rvts21">The Input Log section consists of movie records either in the form of text lines or in the form of binary data.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts31">Text format:</span></p>
<p class="rvps10"><span class="rvts34">Text format:</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Every frame of the movie is represented by line of text beginning and ending with a "|" (pipe).</span></p>
<p class="rvps10"><span class="rvts21">Every frame of the movie is represented by line of text beginning and ending with a "|" (pipe).</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If fourscore is not used, the fields in the line are as follows:</span></p>
<p class="rvps10"><span class="rvts21">If fourscore is not used, the fields in the line are as follows:</span></p> <p class="rvps7"><span class="rvts22">|commands|port0|port1|port2|</span></p>
<p class="rvps10"><span class="rvts25">|commands|port0|port1|port2|</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Field </span><span class="rvts22">commands</span><span class="rvts20"> is a variable length decimal integer which is interpreted as a bit field corresponding to miscellaneous input states which are valid at the start of the frame. Current values for this are:</span></p>
<p class="rvps10"><span class="rvts21">Field </span><span class="rvts25">commands</span><span class="rvts21"> is a variable length decimal integer which is interpreted as a bit field corresponding to miscellaneous input states which are valid at the start of the frame. Current values for this are:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">bit 0 (number = 1) Soft Reset</span></li>
<li class="rvps10"><span class="rvts21">bit 0 (number = 1) Soft Reset</span></li> <li class="rvps7"><span class="rvts20">bit 1 (number = 2) Power</span></li>
<li class="rvps10"><span class="rvts21">bit 1 (number = 2) Power</span></li> <li class="rvps7"><span class="rvts20">bit 2 (number = 4) Eject/Insert Disk</span></li>
<li class="rvps10"><span class="rvts21">bit 2 (number = 4) Eject/Insert Disk</span></li> <li class="rvps7"><span class="rvts20">bit 3 (number = 8) Switch Disk Side</span></li>
<li class="rvps10"><span class="rvts21">bit 3 (number = 8) Switch Disk Side</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The format of </span><span class="rvts25">port0</span><span class="rvts21">, </span><span class="rvts25">port1</span><span class="rvts21">, </span><span class="rvts25">port2</span><span class="rvts21"> depends on which types of devices were attached.</span></p> <p class="rvps7"><span class="rvts20">The format of </span><span class="rvts22">port0</span><span class="rvts20">, </span><span class="rvts22">port1</span><span class="rvts20">, </span><span class="rvts22">port2</span><span class="rvts20"> depends on which types of devices were attached.</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">SI_NONE: the field must be empty</span></li> <li class="rvps7"><span class="rvts20">SI_NONE: the field must be empty</span></li>
<li class="rvps10"><span class="rvts21">SI_GAMEPAD: the field consists of eight characters which constitute a bit field. Any character other than ' ' (spacebar) or '.' (dot) means that the button was pressed. By convention, the following mnemonics are used in a column to remind us of which button corresponds to which column: RLDUTSBA (</span><span class="rvts29">Right</span><span class="rvts21">, </span><span class="rvts29">Left</span><span class="rvts21">, </span><span class="rvts29">Down</span><span class="rvts21">, </span><span class="rvts29">Up</span><span class="rvts21">, </span><span class="rvts29">Start</span><span class="rvts21">, </span><span class="rvts29">Select</span><span class="rvts21">, </span><span class="rvts29">B</span><span class="rvts21">, </span><span class="rvts29">A</span><span class="rvts21">)</span></li> <li class="rvps7"><span class="rvts20">SI_GAMEPAD: the field consists of eight characters which constitute a bit field. Any character other than ' ' (spacebar) or '.' (dot) means that the button was pressed. By convention, the following mnemonics are used in a column to remind us of which button corresponds to which column: RLDUTSBA (</span><span class="rvts26">Right</span><span class="rvts20">, </span><span class="rvts26">Left</span><span class="rvts20">, </span><span class="rvts26">Down</span><span class="rvts20">, </span><span class="rvts26">Up</span><span class="rvts20">, </span><span class="rvts26">Start</span><span class="rvts20">, </span><span class="rvts26">Select</span><span class="rvts20">, </span><span class="rvts26">B</span><span class="rvts20">, </span><span class="rvts26">A</span><span class="rvts20">)</span></li>
<li class="rvps10"><span class="rvts21">SI_ZAPPER: the field consists of several characters in the following pattern </span><span class="rvts25">XXX YYY B Q Z</span></li> <li class="rvps7"><span class="rvts20">SI_ZAPPER: the field consists of several characters in the following pattern </span><span class="rvts22">XXX YYY B Q Z</span></li>
</ul> </ul>
<ul style="text-indent: 60px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 60px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10" style="text-indent: 60px"><span class="rvts25">XXX</span><span class="rvts21">: %03d the X position of the mouse</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts22">XXX</span><span class="rvts20">: %03d the X position of the mouse</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts25">YYY</span><span class="rvts21">: %03d the Y position of the mouse</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts22">YYY</span><span class="rvts20">: %03d the Y position of the mouse</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts25">B</span><span class="rvts21">: %01d 1 if the mouse button is pressed; 0 if not</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts22">B</span><span class="rvts20">: %01d 1 if the mouse button is pressed; 0 if not</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts25">Q</span><span class="rvts21">: %01d an internal value used by the emulator's zapper code</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts22">Q</span><span class="rvts20">: %01d an internal value used by the emulator's zapper code</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts25">Z</span><span class="rvts21">: %d a variable-length decimal integer; an internal value used by the emulator's zapper code </span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts22">Z</span><span class="rvts20">: %d a variable-length decimal integer; an internal value used by the emulator's zapper code&nbsp;</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If fourscore is used, then port0 and port1 are irrelevant and ignored. The input types must all be gamepads, and each input log record must be in the following format:</span></p> <p class="rvps7"><span class="rvts20">If fourscore is used, then port0 and port1 are irrelevant and ignored. The input types must all be gamepads, and each input log record must be in the following format:</span></p>
<p class="rvps10"><span class="rvts25">|commands|RLDUTSBA|RLDUTSBA|RLDUTSBA|RLDUTSBA|port2|</span></p> <p class="rvps7"><span class="rvts22">|commands|RLDUTSBA|RLDUTSBA|RLDUTSBA|RLDUTSBA|port2|</span></p>
<p class="rvps10"><span class="rvts21">(commands, player 1, player 2, player 3, player 4, port2)</span></p> <p class="rvps7"><span class="rvts20">(commands, player 1, player 2, player 3, player 4, port2)</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts34">Binary format:</span></p> <p class="rvps7"><span class="rvts31">Binary format:</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Input Log section starts with a | (pipe).</span></p> <p class="rvps7"><span class="rvts20">Input Log section starts with a | (pipe).</span></p>
<p class="rvps10"><span class="rvts21">Every frame of the movie is represented by a record of a fixed length. The length can be determined by the devices on </span><span class="rvts25">port0</span><span class="rvts21"> and </span><span class="rvts25">port1</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Every frame of the movie is represented by a record of a fixed length. The length can be determined by the devices on </span><span class="rvts22">port0</span><span class="rvts20"> and </span><span class="rvts22">port1</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The first byte of each record stores "commands" bit field:</span></p> <p class="rvps7"><span class="rvts20">The first byte of each record stores "commands" bit field:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">bit 0 Soft Reset</span></li> <li class="rvps7"><span class="rvts20">bit 0 Soft Reset</span></li>
<li class="rvps10"><span class="rvts21">bit 1 Power</span></li> <li class="rvps7"><span class="rvts20">bit 1 Power</span></li>
<li class="rvps10"><span class="rvts21">bit 2 Eject/Insert Disk</span></li> <li class="rvps7"><span class="rvts20">bit 2 Eject/Insert Disk</span></li>
<li class="rvps10"><span class="rvts21">bit 3 Switch Disk Side</span></li> <li class="rvps7"><span class="rvts20">bit 3 Switch Disk Side</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If fourscore is not used, the remaining bytes in the record depend on which types of devices are attached to </span><span class="rvts25">port0</span><span class="rvts21"> and </span><span class="rvts25">port1</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts20">If fourscore is not used, the remaining bytes in the record depend on which types of devices are attached to </span><span class="rvts22">port0</span><span class="rvts20"> and </span><span class="rvts22">port1</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">SI_NONE: 0 bytes added to the size of record</span></li> <li class="rvps7"><span class="rvts20">SI_NONE: 0 bytes added to the size of record</span></li>
<li class="rvps10"><span class="rvts21">SI_GAMEPAD: 1 byte added to the size of record. Bits of the byte represent the state of buttons (bit0 = </span><span class="rvts29">A</span><span class="rvts21">, bit1 = </span><span class="rvts29">B</span><span class="rvts21">, bit2 = </span><span class="rvts29">Select</span><span class="rvts21">, bit3 = S</span><span class="rvts29">Start</span><span class="rvts21">, bit4 = </span><span class="rvts29">Up</span><span class="rvts21">, bit5 = </span><span class="rvts29">Down</span><span class="rvts21">, bit6 = </span><span class="rvts29">Left</span><span class="rvts21">, bit7 = </span><span class="rvts29">Right</span><span class="rvts21">). If the bit is set, respective button is considered to be pressed, if the bit is clear, the button is not pressed</span></li> <li class="rvps7"><span class="rvts20">SI_GAMEPAD: 1 byte added to the size of record. Bits of the byte represent the state of buttons (bit0 = </span><span class="rvts26">A</span><span class="rvts20">, bit1 = </span><span class="rvts26">B</span><span class="rvts20">, bit2 = </span><span class="rvts26">Select</span><span class="rvts20">, bit3 = S</span><span class="rvts26">Start</span><span class="rvts20">, bit4 = </span><span class="rvts26">Up</span><span class="rvts20">, bit5 = </span><span class="rvts26">Down</span><span class="rvts20">, bit6 = </span><span class="rvts26">Left</span><span class="rvts20">, bit7 = </span><span class="rvts26">Right</span><span class="rvts20">). If the bit is set, respective button is considered to be pressed, if the bit is clear, the button is not pressed</span></li>
<li class="rvps10"><span class="rvts21">SI_ZAPPER: 12 bytes added to the size of record:</span></li> <li class="rvps7"><span class="rvts20">SI_ZAPPER: 12 bytes added to the size of record:</span></li>
</ul> </ul>
<ul style="text-indent: 60px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 60px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">1st byte the X position of the mouse</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">1st byte the X position of the mouse</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">2nd byte the Y position of the mouse</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">2nd byte the Y position of the mouse</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">3rd byte 1 if the mouse button is pressed; 0 if not</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">3rd byte 1 if the mouse button is pressed; 0 if not</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">4th byte an internal value used by the emulator's zapper code</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">4th byte an internal value used by the emulator's zapper code</span></li>
<li class="rvps10" style="text-indent: 60px"><span class="rvts21">bytes 5-12 (</span><span class="rvts70">uint64</span><span class="rvts21">) an internal value used by the emulator's zapper code</span></li> <li style="text-indent: 60px" class="rvps7"><span class="rvts20">bytes 5-12 (</span><span class="rvts63">uint64</span><span class="rvts20">) an internal value used by the emulator's zapper code</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If fourscore is used, then </span><span class="rvts25">port0</span><span class="rvts21"> and </span><span class="rvts25">port1</span><span class="rvts21"> are irrelevant and ignored. 4 bytes are added to the size of record. The bits of the 1st byte represent the state of buttons of the 1st joypad (bit0 = </span><span class="rvts29">A</span><span class="rvts21">, bit1 = </span><span class="rvts29">B</span><span class="rvts21">, bit2 = </span><span class="rvts29">Select</span><span class="rvts21">, bit3 = </span><span class="rvts29">Start</span><span class="rvts21">, bit4 = </span><span class="rvts29">Up</span><span class="rvts21">, bit5 = </span><span class="rvts29">Down</span><span class="rvts21">, bit6 = </span><span class="rvts29">Left</span><span class="rvts21">, bit7 = </span><span class="rvts29">Right</span><span class="rvts21">); bits of the 2nd byte represent the state of buttons of the 2nd joypad, and so on.</span></p> <p class="rvps7"><span class="rvts20">If fourscore is used, then </span><span class="rvts22">port0</span><span class="rvts20"> and </span><span class="rvts22">port1</span><span class="rvts20"> are irrelevant and ignored. 4 bytes are added to the size of record. The bits of the 1st byte represent the state of buttons of the 1st joypad (bit0 = </span><span class="rvts26">A</span><span class="rvts20">, bit1 = </span><span class="rvts26">B</span><span class="rvts20">, bit2 = </span><span class="rvts26">Select</span><span class="rvts20">, bit3 = </span><span class="rvts26">Start</span><span class="rvts20">, bit4 = </span><span class="rvts26">Up</span><span class="rvts20">, bit5 = </span><span class="rvts26">Down</span><span class="rvts20">, bit6 = </span><span class="rvts26">Left</span><span class="rvts20">, bit7 = </span><span class="rvts26">Right</span><span class="rvts20">); bits of the 2nd byte represent the state of buttons of the 2nd joypad, and so on.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="TaseditorData"></a> <p class="rvps7"><a name="TaseditorData"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">Taseditor Data</span></p>
<p class="rvps10"><span class="rvts22">Taseditor Data</span></p> <p class="rvps13"><span class="rvts20"><br/></span></p>
<p class="rvps21"><span class="rvts21"><br/></span></p> <div class="rvps13">
<div class="rvps21"><table width="450" border="1" cellpadding="0" cellspacing="0" style="border-color: #d3c4af #000000 #000000 #d3c4af; border-style: solid;"> <table width="450" border="1" cellpadding="0" cellspacing="0" style="border-color: #ffffff #000000 #000000 #ffffff; border-style: solid; border-spacing: 0px; margin: 0px auto;">
<tr valign="middle"> <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 bytes</span></p> <td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">4 bytes</span></p>
<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>
</td> <td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<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> <p class="rvps3"><span class="rvts67">unsigned int32</span></p>
</td> </td>
</tr> <td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<tr valign="middle"> <p class="rvps3"><span class="rvts6">FM3 version</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">4 bytes</span></p> </td>
</td> </tr>
<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> <tr valign="middle">
</td> <td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<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> <p class="rvps3"><span class="rvts6">4 bytes</span></p>
</td> </td>
</tr> <td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<tr valign="top"> <p class="rvps3"><span class="rvts67">unsigned int32</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">4 bytes</span></p> </td>
</td> <td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<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> <p class="rvps3"><span class="rvts6">Saved modules</span></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">Number of offsets (N = 6)</span></p> </tr>
</td> <tr valign="top">
</tr> <td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<tr valign="top"> <p class="rvps3"><span class="rvts6">4 bytes</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">4 * 6 bytes</span></p> </td>
</td> <td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts6">pointers</span></p> <p class="rvps3"><span class="rvts67">unsigned int32</span></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">Offsets</span></p> <td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">Number of offsets (N = 6)</span></p>
</tr> </td>
<tr valign="middle"> </tr>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">???</span></p> <tr valign="top">
</td> <td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts6">stream</span></p> <p class="rvps3"><span class="rvts6">4 * 6 bytes</span></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">MARKERS DATA</span></p> <td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">pointers</span></p>
</tr> </td>
<tr valign="middle"> <td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">???</span></p> <p class="rvps3"><span class="rvts6">Offsets</span></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts6">stream</span></p> </tr>
</td> <tr valign="middle">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">BOOKMARKS DATA</span></p> <td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">???</span></p>
</tr> </td>
<tr valign="middle"> <td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">???</span></p> <p class="rvps3"><span class="rvts6">stream</span></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts6">stream</span></p> <td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">MARKERS DATA</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">GREENZONE DATA</span></p> </td>
</td> </tr>
</tr> <tr valign="middle">
<tr valign="middle"> <td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">???</span></p> <p class="rvps3"><span class="rvts6">???</span></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts6">stream</span></p> <td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">stream</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">HISTORY DATA</span></p> </td>
</td> <td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</tr> <p class="rvps3"><span class="rvts6">BOOKMARKS DATA</span></p>
<tr valign="middle"> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">???</span></p> </tr>
</td> <tr valign="middle">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts6">stream</span></p> <td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">???</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">PIANO ROLL DATA</span></p> </td>
</td> <td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</tr> <p class="rvps3"><span class="rvts6">stream</span></p>
<tr valign="middle"> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 104px;"><p class="rvps5"><span class="rvts6">???</span></p> <td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">GREENZONE DATA</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 146px;"><p class="rvps5"><span class="rvts6">stream</span></p> </td>
</td> </tr>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 192px;"><p class="rvps5"><span class="rvts6">SELECTION DATA</span></p> <tr valign="middle">
</td> <td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</tr> <p class="rvps3"><span class="rvts6">???</span></p>
</td>
<td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">stream</span></p>
</td>
<td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">HISTORY DATA</span></p>
</td>
</tr>
<tr valign="middle">
<td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">???</span></p>
</td>
<td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">stream</span></p>
</td>
<td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">PIANO ROLL DATA</span></p>
</td>
</tr>
<tr valign="middle">
<td width="104" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">???</span></p>
</td>
<td width="146" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">stream</span></p>
</td>
<td width="192" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">SELECTION DATA</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps21"><span class="rvts21"><br/></span></p> <p class="rvps13"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The data starts right after the last record of the Input Log. If there's EOF after the last record, TAS Editor will interpret the file as an FM2 file.</span></p> <p class="rvps7"><span class="rvts20">The data starts right after the last record of the Input Log. If there's EOF after the last record, TAS Editor will interpret the file as an FM2 file.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">First 4 bytes of Taseditor Data contain the version of the project file format. The first release version of TAS Editor 1.0 saves projects with version = 3.</span></p> <p class="rvps7"><span class="rvts20">First 4 bytes of Taseditor Data contain the version of the project file format. The first release version of TAS Editor 1.0 saves projects with version = 3.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Next 4 bytes contain bit field that can be used for determining which modules of Taseditor were saved to the FM3 file:</span></p> <p class="rvps7"><span class="rvts20">Next 4 bytes contain bit field that can be used for determining which modules of Taseditor were saved to the FM3 file:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">bit 0 Markers were saved</span></li> <li class="rvps7"><span class="rvts20">bit 0 Markers were saved</span></li>
<li class="rvps10"><span class="rvts21">bit 1 Bookmarks were saved</span></li> <li class="rvps7"><span class="rvts20">bit 1 Bookmarks were saved</span></li>
<li class="rvps10"><span class="rvts21">bit 2 entire Greenzone was saved</span></li> <li class="rvps7"><span class="rvts20">bit 2 entire Greenzone was saved</span></li>
<li class="rvps10"><span class="rvts21">bit 3 History Log was saved</span></li> <li class="rvps7"><span class="rvts20">bit 3 History Log was saved</span></li>
<li class="rvps10"><span class="rvts21">bit 4 Piano Roll position was saved</span></li> <li class="rvps7"><span class="rvts20">bit 4 Piano Roll position was saved</span></li>
<li class="rvps10"><span class="rvts21">bit 5 Selection History was saved</span></li> <li class="rvps7"><span class="rvts20">bit 5 Selection History was saved</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Next 4 bytes contain the total number of modules, in the version 3 this number must be 6.</span></p> <p class="rvps7"><span class="rvts20">Next 4 bytes contain the total number of modules, in the version 3 this number must be 6.</span></p>
<p class="rvps10"><span class="rvts21">Then there are six offsets (4 bytes each) pointing at the data of each module. The offsets are counted from the beginning of the file.</span></p> <p class="rvps7"><span class="rvts20">Then there are six offsets (4 bytes each) pointing at the data of each module. The offsets are counted from the beginning of the file.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When Taseditor saves the project, it calls all 6 modules that need saving. Each of them saves current writing offset and then serializes its own data into the file stream and moves current write position forward. The order of calling modules is always the same (Markers, Bookmarks, Greenzone, History, Piano Roll, Selection). When loading a project Taseditor calls those modules in the same order and they seek to the given offset and load / deserialize the data from the file.</span></p> <p class="rvps7"><span class="rvts20">When Taseditor saves the project, it calls all 6 modules that need saving. Each of them saves current writing offset and then serializes its own data into the file stream and moves current write position forward. The order of calling modules is always the same (Markers, Bookmarks, Greenzone, History, Piano Roll, Selection). When loading a project Taseditor calls those modules in the same order and they seek to the given offset and load / deserialize the data from the file.</span></p>
<p class="rvps10"><span class="rvts21">To check the integrity of the data loaded, every module writes its own ID (string) into the file stream before writing the data. When loading the data it expects the ID to match, if it doesn't match then the module refuses to load following data, creates default state and reports "loading error" to Taseditor.</span></p> <p class="rvps7"><span class="rvts20">To check the integrity of the data loaded, every module writes its own ID (string) into the file stream before writing the data. When loading the data it expects the ID to match, if it doesn't match then the module refuses to load following data, creates default state and reports "loading error" to Taseditor.</span></p>
<p class="rvps10"><span class="rvts21">When using Save Compact settings, modules either save all their data as usual or write dummy ID which indicates that this module didn't save its data into the file. When loading the file a module that detects dummy ID refuses to load following data, creates default state but then reports "loading success" to Taseditor.</span></p> <p class="rvps7"><span class="rvts20">When using Save Compact settings, modules either save all their data as usual or write dummy ID which indicates that this module didn't save its data into the file. When loading the file a module that detects dummy ID refuses to load following data, creates default state but then reports "loading success" to Taseditor.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<div class="rvps21"><table width="450" border="1" cellpadding="0" cellspacing="0" style="border-color: #d3c4af #000000 #000000 #d3c4af; border-style: solid;"> <div class="rvps13">
<tr valign="middle"> <table width="450" border="1" cellpadding="0" cellspacing="0" style="border-color: #ffffff #000000 #000000 #ffffff; border-style: solid; border-spacing: 0px; margin: 0px auto;">
<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">Module</span></p> <tr valign="middle">
</td> <td width="106" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none; background-color: #0000ff;">
<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">ID when saved</span></p> <p class="rvps3"><span class="rvts66">Module</span></p>
</td> </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">ID when not saved</span></p> <td width="174" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none; background-color: #0000ff;">
</td> <p class="rvps3"><span class="rvts66">ID when saved</span></p>
</tr> </td>
<tr valign="middle"> <td width="162" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none; background-color: #0000ff;">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 106px;"><p class="rvps5"><span class="rvts6">Markers</span></p> <p class="rvps3"><span class="rvts66">ID when not saved</span></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 174px;"><p class="rvps5"><span class="rvts6">MARKERS</span></p> </tr>
</td> <tr valign="middle">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 162px;"><p class="rvps5"><span class="rvts6">MARKERX</span></p> <td width="106" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">Markers</span></p>
</tr> </td>
<tr valign="middle"> <td width="174" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 106px;"><p class="rvps5"><span class="rvts6">Bookmarks</span></p> <p class="rvps3"><span class="rvts6">MARKERS</span></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 174px;"><p class="rvps5"><span class="rvts6">BOOKMARKS</span></p> <td width="162" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">MARKERX</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 162px;"><p class="rvps5"><span class="rvts6">BOOKMARKX</span></p> </td>
</td> </tr>
</tr> <tr valign="middle">
<tr valign="middle"> <td width="106" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 106px;"><p class="rvps5"><span class="rvts6">Greenzone</span></p> <p class="rvps3"><span class="rvts6">Bookmarks</span></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 174px;"><p class="rvps5"><span class="rvts6">GREENZONE</span></p> <td width="174" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">BOOKMARKS</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 162px;"><p class="rvps5"><span class="rvts6">GREENZONX</span></p> </td>
</td> <td width="162" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</tr> <p class="rvps3"><span class="rvts6">BOOKMARKX</span></p>
<tr valign="middle"> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 106px;"><p class="rvps5"><span class="rvts6">History</span></p> </tr>
</td> <tr valign="middle">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 174px;"><p class="rvps5"><span class="rvts6">HISTORY</span></p> <td width="106" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">Greenzone</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 162px;"><p class="rvps5"><span class="rvts6">HISTORX</span></p> </td>
</td> <td width="174" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</tr> <p class="rvps3"><span class="rvts6">GREENZONE</span></p>
<tr valign="middle"> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 106px;"><p class="rvps5"><span class="rvts6">Piano Roll</span></p> <td width="162" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">GREENZONX</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 174px;"><p class="rvps5"><span class="rvts6">PIANO_ROLL</span></p> </td>
</td> </tr>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 162px;"><p class="rvps5"><span class="rvts6">PIANO_ROLX</span></p> <tr valign="middle">
</td> <td width="106" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</tr> <p class="rvps3"><span class="rvts6">History</span></p>
<tr valign="middle"> </td>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 106px;"><p class="rvps5"><span class="rvts6">Selection</span></p> <td width="174" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
</td> <p class="rvps3"><span class="rvts6">HISTORY</span></p>
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 174px;"><p class="rvps5"><span class="rvts6">SELECTION</span></p> </td>
</td> <td width="162" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<td style="border-color: #000000; border-style: solid; border-right: none; border-bottom: none; width: 162px;"><p class="rvps5"><span class="rvts6">SELECTIOX</span></p> <p class="rvps3"><span class="rvts6">HISTORX</span></p>
</td> </td>
</tr> </tr>
<tr valign="middle">
<td width="106" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">Piano Roll</span></p>
</td>
<td width="174" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">PIANO_ROLL</span></p>
</td>
<td width="162" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">PIANO_ROLX</span></p>
</td>
</tr>
<tr valign="middle">
<td width="106" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">Selection</span></p>
</td>
<td width="174" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">SELECTION</span></p>
</td>
<td width="162" style="border-color: #000000; border-style: solid; padding: 0px; border-right: none; border-bottom: none;">
<p class="rvps3"><span class="rvts6">SELECTIOX</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps21"><span class="rvts21"><br/></span></p> <p class="rvps13"><span class="rvts20"><br/></span></p>
<p class="rvps21"><span class="rvts21"><br/></span></p> <p class="rvps13"><span class="rvts20"><br/></span></p>
<p class="rvps21"><span class="rvts21"><br/></span></p> <p class="rvps13"><span class="rvts20"><br/></span></p>
<p class="rvps21"><span class="rvts21"><br/></span></p> <p class="rvps13"><span class="rvts20"><br/></span></p>
<p class="rvps21"><span class="rvts21"><br/></span></p> <p class="rvps13"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com">Free PDF documentation generator</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,286 +1,475 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>Glossary</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>Glossary</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="Glossary">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="Glossary" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("Glossary"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>Glossary</h1>
<div id="topic_breadcrumb">
<a href="Reference.html">Reference</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="Reference.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="Reference.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="Controls.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="Glossary"
data-hnd-context="15"
data-hnd-title="Glossary"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="Reference.html">Reference</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="Reference.html" title="Reference" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="Reference.html" title="Reference" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="Controls.html" title="Controls" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Glossary</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Glossary</span></p> <p class="rvps2"><span class="rvts18">Glossary</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts21">Here you can find definitions for many terms that are used throughout this Manual. Most of them were used in the context of TASing before TAS Editor was created. Some of those terms are described more thoroughly in the </span><a class="rvts27" href="BeginnersGuide.html">Beginner's Guide</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Here you can find definitions for many terms that are used throughout this Manual. Most of them were used in the context of TASing before TAS Editor was created. Some of those terms are described more thoroughly in the </span><a class="rvts24" href="BeginnersGuide.html">Beginner's Guide</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">It's recommended to read the Glossary at once, because many terms are interconnected.</span></p> <p class="rvps7"><span class="rvts20">It's recommended to read the Glossary at once, because many terms are interconnected.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="Input"></a> <p class="rvps7"><a name="Input"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/game-player-taser.png"></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/game-player-taser.png"/></p> <p class="rvps7"><span class="rvts22">Input</span></p>
<p class="rvps10"><span class="rvts25">Input</span></p> <p class="rvps7"><span class="rvts20">Data about player's actions, that can be received by a game.</span></p>
<p class="rvps10"><span class="rvts21">Data about player's actions, that can be received by a game.</span></p> <p class="rvps7"><span class="rvts20">TASing became feasible because of general assumption that behavior of a game is always determined by its initial state and player's input, and nothing else (see Determinism).</span></p>
<p class="rvps10"><span class="rvts21">TASing became feasible because of general assumption that behavior of a game is always determined by its initial state and player's input, and nothing else (see Determinism).</span></p> <p class="rvps7"><span class="rvts20">Examples of Input: pressing a button on a gamepad, pushing analog stick, touching by stylus, shouting into a microphone, etc.</span></p>
<p class="rvps10"><span class="rvts21">Examples of Input: pressing a button on a gamepad, pushing analog stick, touching by stylus, shouting into a microphone, etc.</span></p> <p class="rvps7"><span class="rvts20">Taseditor works with Input in the form of "sequence of buttons states".</span></p>
<p class="rvps10"><span class="rvts21">Taseditor works with Input in the form of "sequence of buttons states".</span></p> <p class="rvps7"><span class="rvts20">Note: the fact of player not pressing any button is also considered an Input.</span></p>
<p class="rvps10"><span class="rvts21">Note: the fact of player not pressing any button is also considered an Input.</span></p> <p class="rvps7"><a name="Output"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="Output"></a> <p class="rvps7"><span class="rvts22">Output</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Data sent from a game as a result of processing player's Input.</span></p>
<p class="rvps10"><span class="rvts25">Output</span></p> <p class="rvps7"><span class="rvts20">The process of playing a game can be depicted as a loop of interaction between a subject (player) and an object (game).</span></p>
<p class="rvps10"><span class="rvts21">Data sent from a game as a result of processing player's Input.</span></p> <p class="rvps7"><span class="rvts20">Examples of Output: displaying an image, producing a sound, vibrating gamepad, changing the value of an observed RAM address, providing an information about lag, etc.</span></p>
<p class="rvps10"><span class="rvts21">The process of playing a game can be depicted as a loop of interaction between a subject (player) and an object (game).</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Examples of Output: displaying an image, producing a sound, vibrating gamepad, changing the value of an observed RAM address, providing an information about lag, etc.</span></p> <p class="rvps7"><span class="rvts22">Playthrough / Walkthrough </span><span class="rvts20">(Solution)</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">A sequence of player's actions needed for successful completion of the game.</span></p>
<p class="rvps10"><span class="rvts25">Playthrough / Walkthrough </span><span class="rvts21">(Solution)</span></p> <p class="rvps7"><span class="rvts20">This sequence is inputted into the game using an input device (e.g. gamepad). The sequence can be either performed live (created in real-time) or constructed in advance in a form of reproducible recording (e.g. log of button presses). The latter form allows editing of the sequence.</span></p>
<p class="rvps10"><span class="rvts21">A sequence of player's actions needed for successful completion of the game.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">This sequence is inputted into the game using an input device (e.g. gamepad). The sequence can be either performed live (created in real-time) or constructed in advance in a form of reproducible recording (e.g. log of button presses). The latter form allows editing of the sequence.</span></p> <p class="rvps7"><span class="rvts22">Speedrun</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">A walkthrough aimed on fastest completion of the game.</span></p>
<p class="rvps10"><span class="rvts25">Speedrun</span></p> <p class="rvps7"><span class="rvts20">Some games have &nbsp;build-in "Speedrun" or "Time Attack" mode, where the game counts the time spent while playing. For other games it's possible to use external timer, measuring time in seconds or TV frames.</span></p>
<p class="rvps10"><span class="rvts21">A walkthrough aimed on fastest completion of the game.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Some games have &nbsp;build-in "Speedrun" or "Time Attack" mode, where the game counts the time spent while playing. For other games it's possible to use external timer, measuring time in seconds or TV frames.</span></p> <p class="rvps7"><span class="rvts22">TAS</span><span class="rvts20"> (Tool-Assisted Superplay / Tool-Assisted Speedrun)</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">A walkthrough made with use of tools for editing the sequence of player's actions.</span></p>
<p class="rvps10"><span class="rvts25">TAS</span><span class="rvts21"> (Tool-Assisted Superplay / Tool-Assisted Speedrun)</span></p> <p class="rvps7"><span class="rvts20">The process of creating TASes is called "TASing", authors are usually called "TASers".</span></p>
<p class="rvps10"><span class="rvts21">A walkthrough made with use of tools for editing the sequence of player's actions.</span></p> <p class="rvps7"><span class="rvts20">The Input editing exempts TASers from certain human limitations (e.g. slow reflexes), allowing to spend full energy on making extraordinary walkthroughs. It can be either speedruns or entertainment videos (playarounds).</span></p>
<p class="rvps10"><span class="rvts21">The process of creating TASes is called "TASing", authors are usually called "TASers".</span></p> <p class="rvps7"><span class="rvts20">TASes can be distributed:</span></p>
<p class="rvps10"><span class="rvts21">The Input editing exempts TASers from certain human limitations (e.g. slow reflexes), allowing to spend full energy on making extraordinary walkthroughs. It can be either speedruns or entertainment videos (playarounds).</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<p class="rvps10"><span class="rvts21">TASes can be distributed:</span></p> <li class="rvps9"><span class="rvts20">in the form of finished videos containing Output (youtube, AVI files and so on) easy to watch</span></li>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps9"><span class="rvts20">in the form of source files containing Input (FM2 movies and so on) easy to edit</span></li>
<li class="rvps14"><span class="rvts21">in the form of finished videos containing Output (youtube, AVI files and so on) easy to watch</span></li>
<li class="rvps14"><span class="rvts21">in the form of source files containing Input (FM2 movies and so on) easy to edit</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Movie</span><span class="rvts21"> (replay)</span></p> <p class="rvps7"><span class="rvts22">Movie</span><span class="rvts20"> (replay)</span></p>
<p class="rvps10"><span class="rvts21">Container for storing Input and associated data.</span></p> <p class="rvps7"><span class="rvts20">Container for storing Input and associated data.</span></p>
<p class="rvps10"><span class="rvts21">Unlike video containers, the TAS movies don't contain Output (game footage). The Output appears only when user applies the movie Input to an appropriate game file.</span></p> <p class="rvps7"><span class="rvts20">Unlike video containers, the TAS movies don't contain Output (game footage). The Output appears only when user applies the movie Input to an appropriate game file.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Lag</span></p> <p class="rvps7"><span class="rvts22">Lag</span></p>
<p class="rvps10"><span class="rvts21">The term used when the delay between Input and Output is greater than normally.</span></p> <p class="rvps7"><span class="rvts20">The term used when the delay between Input and Output is greater than normally.</span></p>
<p class="rvps10"><span class="rvts21">The loop of interaction between player and game usually establishes some fixed amount of time between polling Input and updating Output, for example 60 times per second.</span></p> <p class="rvps7"><span class="rvts20">The loop of interaction between player and game usually establishes some fixed amount of time between polling Input and updating Output, for example 60 times per second.</span></p>
<p class="rvps10"><span class="rvts21">A computer processor can only make fixed amount of operations in this fixed amount of time. But videogames try to mimic the unboundedness of real life, so the quantity of in-game objects may vary greatly. Thus it's possible that processing all objects will take more time than allotted. In such cases the Output update will be delayed, and next Input polling will be delayed too.</span></p> <p class="rvps7"><span class="rvts20">A computer processor can only make fixed amount of operations in this fixed amount of time. But videogames try to mimic the unboundedness of real life, so the quantity of in-game objects may vary greatly. Thus it's possible that processing all objects will take more time than allotted. In such cases the Output update will be delayed, and next Input polling will be delayed too.</span></p>
<p class="rvps10"><span class="rvts21">Speedrunners try to avoid excessive delays, and the lag is often considered as a factor when TASing. Usually TASers try to minimize the number of "frames containing lag".</span></p> <p class="rvps7"><span class="rvts20">Speedrunners try to avoid excessive delays, and the lag is often considered as a factor when TASing. Usually TASers try to minimize the number of "frames containing lag".</span></p>
<p class="rvps10"><span class="rvts21">Emulators can detect lag in a frame right after finishing the frame emulation. The criterion is simple: if the game didn't poll Input during the frame then it's the lag frame. If it did poll Input then this is normal frame. Taseditor highlights lag frames with red color, and it's useless to draw any Input on these frames.</span></p> <p class="rvps7"><span class="rvts20">Emulators can detect lag in a frame right after finishing the frame emulation. The criterion is simple: if the game didn't poll Input during the frame then it's the lag frame. If it did poll Input then this is normal frame. Taseditor highlights lag frames with red color, and it's useless to draw any Input on these frames.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Desync</span></p> <p class="rvps7"><span class="rvts22">Desync</span></p>
<p class="rvps10"><span class="rvts21">Discrepancy between expected and received Output, which results in player's Input not syncing with the logic of the game.</span></p> <p class="rvps7"><span class="rvts20">Discrepancy between expected and received Output, which results in player's Input not syncing with the logic of the game.</span></p>
<p class="rvps10"><span class="rvts21">Desync may appear when the Input made for one game is applied to another game, or using different emulator version or different settings. Also, desyncs appear when emulator doesn't support deterministic emulation.</span></p> <p class="rvps7"><span class="rvts20">Desync may appear when the Input made for one game is applied to another game, or using different emulator version or different settings. Also, desyncs appear when emulator doesn't support deterministic emulation.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Segment</span></p> <p class="rvps7"><span class="rvts22">Segment</span></p>
<p class="rvps10"><span class="rvts21">A part of the movie, representing the period of time between two in-game events.</span></p> <p class="rvps7"><span class="rvts20">A part of the movie, representing the period of time between two in-game events.</span></p>
<p class="rvps10"><span class="rvts21">Breaking the movie into segments is used to decompose big tasks to smaller subtasks.</span></p> <p class="rvps7"><span class="rvts20">Breaking the movie into segments is used to decompose big tasks to smaller subtasks.</span></p>
<p class="rvps10"><span class="rvts21">The size of a segment can be measured in frames, but the limits of a segment are usually defined by in-game events. The beginning event cuts all previous tasks and concentrates TASer's attention on the nearest set of conditions. The ending event serves as an optimality criterion for all possible approaches to the current task solution.</span></p> <p class="rvps7"><span class="rvts20">The size of a segment can be measured in frames, but the limits of a segment are usually defined by in-game events. The beginning event cuts all previous tasks and concentrates TASer's attention on the nearest set of conditions. The ending event serves as an optimality criterion for all possible approaches to the current task solution.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="TASingProcess.html">TASing Process</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="TASingProcess.html">TASing Process</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Optimization</span></p> <p class="rvps7"><span class="rvts22">Optimization</span></p>
<p class="rvps10"><span class="rvts21">The process of searching for the optimal (the best) solution of the task in current segment.</span></p> <p class="rvps7"><span class="rvts20">The process of searching for the optimal (the best) solution of the task in current segment.</span></p>
<p class="rvps10"><span class="rvts21">Almost any task in videogames can be solved in a variety of ways. Every way has its own pros and cons. When starting a project, TASer chooses his goal (e.g. pacifist speedrun), thus assigning priorities to those pros and cons, therefore all the ways of solving a task can be evaluated and compared to each other to determine which one is better.</span></p> <p class="rvps7"><span class="rvts20">Almost any task in videogames can be solved in a variety of ways. Every way has its own pros and cons. When starting a project, TASer chooses his goal (e.g. pacifist speedrun), thus assigning priorities to those pros and cons, therefore all the ways of solving a task can be evaluated and compared to each other to determine which one is better.</span></p>
<p class="rvps10"><span class="rvts21">Actual process of TAS optimization consists of editing Input and evaluating resulting Output. When TASer gets better result, he marks current Input as the best, until he finds an even more optimal Input. The final product (TAS movie) contains the best solution for every subtask.</span></p> <p class="rvps7"><span class="rvts20">Actual process of TAS optimization consists of editing Input and evaluating resulting Output. When TASer gets better result, he marks current Input as the best, until he finds an even more optimal Input. The final product (TAS movie) contains the best solution for every subtask.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="TASingMethodology.html">TASing Methodology</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="TASingMethodology.html">TASing Methodology</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Improvement</span></p> <p class="rvps7"><span class="rvts22">Improvement</span></p>
<p class="rvps10"><span class="rvts21">A way to solve the task better (closer to optimum).</span></p> <p class="rvps7"><span class="rvts20">A way to solve the task better (closer to optimum).</span></p>
<p class="rvps10"><span class="rvts21">Examples of improvements in speedruns: removing inaccuracy, applying unused timesaver, increasing the usefulness of an old timesaver, adding entertainment without losing speed.</span></p> <p class="rvps7"><span class="rvts20">Examples of improvements in speedruns: removing inaccuracy, applying unused timesaver, increasing the usefulness of an old timesaver, adding entertainment without losing speed.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Timesaver</span></p> <p class="rvps7"><span class="rvts22">Timesaver</span></p>
<p class="rvps10"><span class="rvts21">Any in-game trick that can save time.</span></p> <p class="rvps7"><span class="rvts20">Any in-game trick that can save time.</span></p>
<p class="rvps10"><span class="rvts21">When making a speedrun, TASer is supposed to use every unprohibited opportunity to make the walkthrough become as fast as possible. One thing is polishing the Input to find the best outcome from current knowledge about the game. Another important activity is expanding this knowledge base finding and applying tricks. True TASer strives to gather the maximum information about the game and use all known tricks to full extent, so that his record wouldn't be easily beaten.</span></p> <p class="rvps7"><span class="rvts20">When making a speedrun, TASer is supposed to use every unprohibited opportunity to make the walkthrough become as fast as possible. One thing is polishing the Input to find the best outcome from current knowledge about the game. Another important activity is expanding this knowledge base finding and applying tricks. True TASer strives to gather the maximum information about the game and use all known tricks to full extent, so that his record wouldn't be easily beaten.</span></p>
<p class="rvps10"><span class="rvts21">Examples of timesavers: features of the game, bugs of the game, luck manipulation.</span></p> <p class="rvps7"><span class="rvts20">Examples of timesavers: features of the game, bugs of the game, luck manipulation.</span></p>
<p class="rvps10"><span class="rvts21">Note: sometimes TASers deliberately refuse certain timesavers, in this case the TAS aims for extra category. Examples: Super Mario Bros TAS without using </span><span class="rvts29">B</span><span class="rvts21"> button (denying certain feature of the game), Sonic the Hedgehog TAS without zipping (denying certain bug of the game).</span></p> <p class="rvps7"><span class="rvts20">Note: sometimes TASers deliberately refuse certain timesavers, in this case the TAS aims for extra category. Examples: Super Mario Bros TAS without using </span><span class="rvts26">B</span><span class="rvts20"> button (denying certain feature of the game), Sonic the Hedgehog TAS without zipping (denying certain bug of the game).</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Feature</span></p> <p class="rvps7"><span class="rvts22">Feature</span></p>
<p class="rvps10"><span class="rvts21">An intended aspect of the game. </span></p> <p class="rvps7"><span class="rvts20">An intended aspect of the game.&nbsp;</span></p>
<p class="rvps10"><span class="rvts21">Some features are unimportant (or even unnoticeable) for an ordinary player, but substantial for a TASer. So, before optimizing Input it's recommended to research the game engine.</span></p> <p class="rvps7"><span class="rvts20">Some features are unimportant (or even unnoticeable) for an ordinary player, but substantial for a TASer. So, before optimizing Input it's recommended to research the game engine.</span></p>
<p class="rvps10"><span class="rvts21">Examples of such features: damage boost, forced waiting for score countdown, coordinate subpixels, AI peculiarities, etc...</span></p> <p class="rvps7"><span class="rvts20">Examples of such features: damage boost, forced waiting for score countdown, coordinate subpixels, AI peculiarities, etc...</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Bug / Glitch</span></p> <p class="rvps7"><span class="rvts22">Bug / Glitch</span></p>
<p class="rvps10"><span class="rvts21">An unintended aspect of the game. </span></p> <p class="rvps7"><span class="rvts20">An unintended aspect of the game.&nbsp;</span></p>
<p class="rvps10"><span class="rvts21">Bugs abused by TASer should be reproducible on real console (at least theoretically). Bugs caused by emulation are not permitted.</span></p> <p class="rvps7"><span class="rvts20">Bugs abused by TASer should be reproducible on real console (at least theoretically). Bugs caused by emulation are not permitted.</span></p>
<p class="rvps10"><span class="rvts21">Many bugs are discovered during real-time play. Some of them require thorough research and disassembly of the game code.</span></p> <p class="rvps7"><span class="rvts20">Many bugs are discovered during real-time play. Some of them require thorough research and disassembly of the game code.</span></p>
<p class="rvps10"><span class="rvts21">Examples of bugs: simplistic collision detection system, not checking save data corruption, race conditions, mistake in the order of checks, etc...</span></p> <p class="rvps7"><span class="rvts20">Examples of bugs: simplistic collision detection system, not checking save data corruption, race conditions, mistake in the order of checks, etc...</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Luck Manipulation</span></p> <p class="rvps7"><span class="rvts22">Luck Manipulation</span></p>
<p class="rvps10"><span class="rvts21">Unrestricted exploiting of certain game features, which are normally limited by the shortage of player's knowledge.</span></p> <p class="rvps7"><span class="rvts20">Unrestricted exploiting of certain game features, which are normally limited by the shortage of player's knowledge.</span></p>
<p class="rvps10"><span class="rvts21">Although any experiments with Input modification are manipulations of game features, but some aspects of games appear especially unpredictable for an ordinary player. Developers intentionally entangle algorithms of those features, so that for a naked eye they seem completely random and uncontrollable.</span></p> <p class="rvps7"><span class="rvts20">Although any experiments with Input modification are manipulations of game features, but some aspects of games appear especially unpredictable for an ordinary player. Developers intentionally entangle algorithms of those features, so that for a naked eye they seem completely random and uncontrollable.</span></p>
<p class="rvps10"><span class="rvts21">However, in deterministic world all aspects of videogames are predictable (defined by Input). Using tools and careful analysis you can reveal those hidden laws and dependencies, and then use the knowledge when creating the Input. And sometimes you don't even have to dissect algorithms, when you can use trial-and-error method.</span></p> <p class="rvps7"><span class="rvts20">However, in deterministic world all aspects of videogames are predictable (defined by Input). Using tools and careful analysis you can reveal those hidden laws and dependencies, and then use the knowledge when creating the Input. And sometimes you don't even have to dissect algorithms, when you can use trial-and-error method.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="NonlinearTASing.html#turbo-seeking">Nonlinear TASing</a><span class="rvts21"> (example of luck manipulation)</span></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="NonlinearTASing.html#turbo-seeking">Nonlinear TASing</a><span class="rvts20"> (example of luck manipulation)</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Subpixels</span></p> <p class="rvps7"><span class="rvts22">Subpixels</span></p>
<p class="rvps10"><span class="rvts21">The term used when in-game objects have coordinates with fractional parts.</span></p> <p class="rvps7"><span class="rvts20">The term used when in-game objects have coordinates with fractional parts.</span></p>
<p class="rvps10"><span class="rvts21">Generally, there's difference between on-screen coordinates of a sprite and in-game coordinates of the object this sprite represents. In some games those coordinates have the same scale and their values coincide, but usually on-screen images represent a rough outline of the real state of things. So, to get max precision TASers observe the memory of emulated console, using Memory Watch tool or custom Lua HUD. This way also allows to see hidden variables of the game, those that aren't displayed on screen normally.</span></p> <p class="rvps7"><span class="rvts20">Generally, there's difference between on-screen coordinates of a sprite and in-game coordinates of the object this sprite represents. In some games those coordinates have the same scale and their values coincide, but usually on-screen images represent a rough outline of the real state of things. So, to get max precision TASers observe the memory of emulated console, using Memory Watch tool or custom Lua HUD. This way also allows to see hidden variables of the game, those that aren't displayed on screen normally.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Recording</span></p> <p class="rvps7"><span class="rvts22">Recording</span></p>
<p class="rvps10"><span class="rvts21">One of possible ways to create Input for a movie.</span></p> <p class="rvps7"><span class="rvts20">One of possible ways to create Input for a movie.</span></p>
<p class="rvps10"><span class="rvts21">It consists of appending new Input sequentially to the end of current movie, while watching interim results of the Input.</span></p> <p class="rvps7"><span class="rvts20">It consists of appending new Input sequentially to the end of current movie, while watching interim results of the Input.</span></p>
<p class="rvps10"><span class="rvts21">Another way would be drawing Input directly in the movie.</span></p> <p class="rvps7"><span class="rvts20">Another way would be drawing Input directly in the movie.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="Toolbox.html#recorder">Toolbox</a><span class="rvts21">, </span><a class="rvts27" href="TASingMethodology.html#linear-tasing">TASing Methodology</a><span class="rvts21">, </span><a class="rvts27" href="TraditionalTASing.html">Traditional TASing</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="Toolbox.html#recorder">Toolbox</a><span class="rvts20">, </span><a class="rvts24" href="TASingMethodology.html#linear-tasing">TASing Methodology</a><span class="rvts20">, </span><a class="rvts24" href="TraditionalTASing.html">Traditional TASing</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Rerecording</span></p> <p class="rvps7"><span class="rvts22">Rerecording</span></p>
<p class="rvps10"><span class="rvts21">One of possible ways to edit Input in a movie.</span></p> <p class="rvps7"><span class="rvts20">One of possible ways to edit Input in a movie.</span></p>
<p class="rvps10"><span class="rvts21">It consists of rewriting old Input sequentially from starting frame to ending frame, while watching interim results of the Input changes.</span></p> <p class="rvps7"><span class="rvts20">It consists of rewriting old Input sequentially from starting frame to ending frame, while watching interim results of the Input changes.</span></p>
<p class="rvps10"><span class="rvts21">Another way would be direct modification of existing Input in the movie.</span></p> <p class="rvps7"><span class="rvts20">Another way would be direct modification of existing Input in the movie.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="TASingMethodology.html#linear-tasing">TASing Methodology</a><span class="rvts21">, </span><a class="rvts27" href="TraditionalTASing.html">Traditional TASing</a><span class="rvts21">, </span><a class="rvts27" href="Ideas.html#RerecordsCounter">Rerecords counter</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="TASingMethodology.html#linear-tasing">TASing Methodology</a><span class="rvts20">, </span><a class="rvts24" href="TraditionalTASing.html">Traditional TASing</a><span class="rvts20">, </span><a class="rvts24" href="Ideas.html#RerecordsCounter">Rerecords counter</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Multitracking</span><span class="rvts21"> (multi-track recording)</span></p> <p class="rvps7"><span class="rvts22">Multitracking</span><span class="rvts20"> (multi-track recording)</span></p>
<p class="rvps10"><span class="rvts21">One of ways to record Input for a walkthrough of the game in multi-player mode.</span></p> <p class="rvps7"><span class="rvts20">One of ways to record Input for a walkthrough of the game in multi-player mode.</span></p>
<p class="rvps10"><span class="rvts21">It consists of recording Input for a segment of the movie by taking turns for every player separately.</span></p> <p class="rvps7"><span class="rvts20">It consists of recording Input for a segment of the movie by taking turns for every player separately.</span></p>
<p class="rvps10"><span class="rvts21">Another way would be recording Input for all players simultaneously.</span></p> <p class="rvps7"><span class="rvts20">Another way would be recording Input for all players simultaneously.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="Toolbox.html#multitracking">Toolbox</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="Toolbox.html#multitracking">Toolbox</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Frame Advance</span></p> <p class="rvps7"><span class="rvts22">Frame Advance</span></p>
<p class="rvps10"><span class="rvts21">Step-by-step emulation of a game using the minimum units of measuring time frames.</span></p> <p class="rvps7"><span class="rvts20">Step-by-step emulation of a game using the minimum units of measuring time frames.</span></p>
<p class="rvps10"><span class="rvts21">Used for manual control of progression of time. Considered to be more effective replacement to "slow motion".</span></p> <p class="rvps7"><span class="rvts20">Used for manual control of progression of time. Considered to be more effective replacement to "slow motion".</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Turbo</span><span class="rvts21"> (turbo speed)</span></p> <p class="rvps7"><span class="rvts22">Turbo</span><span class="rvts20"> (turbo speed)</span></p>
<p class="rvps10"><span class="rvts21">The feature of speeding up emulation to the maximum possible speed.</span></p> <p class="rvps7"><span class="rvts20">The feature of speeding up emulation to the maximum possible speed.</span></p>
<p class="rvps10"><span class="rvts21">Used for skipping meaningless in-game events and reducing waiting time when the emulator is seeking.</span></p> <p class="rvps7"><span class="rvts20">Used for skipping meaningless in-game events and reducing waiting time when the emulator is seeking.</span></p>
<p class="rvps10"><span class="rvts21">Most emulators allow to customize emulation speed, slowing it down or speeding up when needed. Turbo speed means the fastest speed possible, which is only limited by your computer speed.</span></p> <p class="rvps7"><span class="rvts20">Most emulators allow to customize emulation speed, slowing it down or speeding up when needed. Turbo speed means the fastest speed possible, which is only limited by your computer speed.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="Toolbox.html#turbo-seek">Toolbox</a><span class="rvts21">, </span><a class="rvts27" href="NonlinearTASing.html#turbo-seeking">Nonlinear TASing</a><span class="rvts21">, </span><a class="rvts27" href="SemiautomaticTASing.html#turbo-seeking">Semiautomatic TASing</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="Toolbox.html#turbo-seek">Toolbox</a><span class="rvts20">, </span><a class="rvts24" href="NonlinearTASing.html#turbo-seeking">Nonlinear TASing</a><span class="rvts20">, </span><a class="rvts24" href="SemiautomaticTASing.html#turbo-seeking">Semiautomatic TASing</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Savestate</span></p> <p class="rvps7"><span class="rvts22">Savestate</span></p>
<p class="rvps10"><span class="rvts21">A snapshot of the emulated system's state at that current moment.</span></p> <p class="rvps7"><span class="rvts20">A snapshot of the emulated system's state at that current moment.</span></p>
<p class="rvps10"><span class="rvts21">Unlike in-game saves, a savestate contains all the comprehensive data on the state of emulated hardware.</span></p> <p class="rvps7"><span class="rvts20">Unlike in-game saves, a savestate contains all the comprehensive data on the state of emulated hardware.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Piano Roll</span></p> <p class="rvps7"><span class="rvts22">Piano Roll</span></p>
<p class="rvps10"><span class="rvts21">A medium for visual representation of data, similar to table or grid view.</span></p> <p class="rvps7"><span class="rvts20">A medium for visual representation of data, similar to table or grid view.</span></p>
<p class="rvps10"><span class="rvts21">The interface is used in many music editing programs (MIDI sequencers and MOD trackers). Its name and basic concept was derived from existing storage medium used to operate a mechanic piano (paper rolls).</span></p> <p class="rvps7"><span class="rvts20">The interface is used in many music editing programs (MIDI sequencers and MOD trackers). Its name and basic concept was derived from existing storage medium used to operate a mechanic piano (paper rolls).</span></p>
<p class="rvps10"><span class="rvts21">Taseditor's Piano Roll displays current movie data (Input and Markers) and allows to edit the data by mouse clicks. It also displays auxiliary information like pointers, Bookmarks, Lag log, etc.</span></p> <p class="rvps7"><span class="rvts20">Taseditor's Piano Roll displays current movie data (Input and Markers) and allows to edit the data by mouse clicks. It also displays auxiliary information like pointers, Bookmarks, Lag log, etc.</span></p>
<p class="rvps10"><span class="rvts21">Every row of the Piano Roll corresponds to one frame of the movie.</span></p> <p class="rvps7"><span class="rvts20">Every row of the Piano Roll corresponds to one frame of the movie.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="PianoRoll.html">Piano Roll</a><span class="rvts21">, </span><a class="rvts27" href="Ideas.html#PianoRoll">Piano Roll specs</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="PianoRoll.html">Piano Roll</a><span class="rvts20">, </span><a class="rvts24" href="Ideas.html#PianoRoll">Piano Roll specs</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Playback cursor</span></p> <p class="rvps7"><span class="rvts22">Playback cursor</span></p>
<p class="rvps10"><span class="rvts21">Pointer to currently played frame of the movie.</span></p> <p class="rvps7"><span class="rvts20">Pointer to currently played frame of the movie.</span></p>
<p class="rvps10"><span class="rvts21">Events of this frame are displayed in emulator's main window as current screenshot. Piano Roll marks respective row with light-blue color and the "Play" symbol (light-blue arrow).</span></p> <p class="rvps7"><span class="rvts20">Events of this frame are displayed in emulator's main window as current screenshot. Piano Roll marks respective row with light-blue color and the "Play" symbol (light-blue arrow).</span></p>
<p class="rvps10"><span class="rvts21">Only one frame of the movie can be seen at any given moment. To see the screenshot of upcoming events you'll have to move the Playback cursor forward (down in the Piano Roll). To see the screenshot of previous events you'll have to move the Playback cursor backward (up in the Piano Roll).</span></p> <p class="rvps7"><span class="rvts20">Only one frame of the movie can be seen at any given moment. To see the screenshot of upcoming events you'll have to move the Playback cursor forward (down in the Piano Roll). To see the screenshot of previous events you'll have to move the Playback cursor backward (up in the Piano Roll).</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="PianoRoll.html">Piano Roll</a><span class="rvts21">, </span><a class="rvts27" href="Navigation.html#playback-cursor">Playback cursor Navigation</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="PianoRoll.html">Piano Roll</a><span class="rvts20">, </span><a class="rvts24" href="Navigation.html#playback-cursor">Playback cursor Navigation</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Greenzone </span><span class="rvts21">(access zone)</span></p> <p class="rvps7"><span class="rvts22">Greenzone </span><span class="rvts20">(access zone)</span></p>
<p class="rvps10"><span class="rvts21">The storage designed for speeding up Playback cursor navigation.</span></p> <p class="rvps7"><span class="rvts20">The storage designed for speeding up Playback cursor navigation.</span></p>
<p class="rvps10"><span class="rvts21">This storage automatically collects savestates for all emulated frames of the movie, and when it's necessary to rewind or jump forward to a frame, Taseditor loads respective savestate from Greenzone.</span></p> <p class="rvps7"><span class="rvts20">This storage automatically collects savestates for all emulated frames of the movie, and when it's necessary to rewind or jump forward to a frame, Taseditor loads respective savestate from Greenzone.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="Toolbox.html#progressbar">Toolbox</a><span class="rvts21">, </span><a class="rvts27" href="ProgramCustomization.html#SetGreenzonecapacity">Program Customization</a><span class="rvts21">, </span><a class="rvts27" href="Ideas.html#Greenzone">Greenzone specs</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="Toolbox.html#progressbar">Toolbox</a><span class="rvts20">, </span><a class="rvts24" href="ProgramCustomization.html#SetGreenzonecapacity">Program Customization</a><span class="rvts20">, </span><a class="rvts24" href="Ideas.html#Greenzone">Greenzone specs</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Selection</span></p> <p class="rvps7"><span class="rvts22">Selection</span></p>
<p class="rvps10"><span class="rvts21">Set of rows in the Piano Roll that are highlighted by special color (usually dark-blue).</span></p> <p class="rvps7"><span class="rvts20">Set of rows in the Piano Roll that are highlighted by special color (usually dark-blue).</span></p>
<p class="rvps10"><span class="rvts21">Any row of the Piano Roll (and thus any frame of the movie) can be either selected or not selected.</span></p> <p class="rvps7"><span class="rvts20">Any row of the Piano Roll (and thus any frame of the movie) can be either selected or not selected.</span></p>
<p class="rvps10"><span class="rvts21">Selection allows to operate with many frames at once, for example, delete a whole section of the movie at once instead of deleting every single frame in it.</span></p> <p class="rvps7"><span class="rvts20">Selection allows to operate with many frames at once, for example, delete a whole section of the movie at once instead of deleting every single frame in it.</span></p>
<p class="rvps10"><span class="rvts21">The upper row of the Selection is called "Selection cursor".</span></p> <p class="rvps7"><span class="rvts20">The upper row of the Selection is called "Selection cursor".</span></p>
<p class="rvps10"><span class="rvts21">The Selection cursor automatically follows the process of Input editing.</span></p> <p class="rvps7"><span class="rvts20">The Selection cursor automatically follows the process of Input editing.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="PianoRoll.html">Piano Roll</a><span class="rvts21">, </span><a class="rvts27" href="Navigation.html#selection-cursor">Selection cursor Navigation</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="PianoRoll.html">Piano Roll</a><span class="rvts20">, </span><a class="rvts24" href="Navigation.html#selection-cursor">Selection cursor Navigation</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Marker</span></p> <p class="rvps7"><span class="rvts22">Marker</span></p>
<p class="rvps10"><span class="rvts21">Yellow mark for a row in Piano Roll that emphasizes the frame among its neighbors.</span></p> <p class="rvps7"><span class="rvts20">Yellow mark for a row in Piano Roll that emphasizes the frame among its neighbors.</span></p>
<p class="rvps10"><span class="rvts21">Any row in the Piano Roll can be marked. Markers allow to improve the distinctness of movie data.</span></p> <p class="rvps7"><span class="rvts20">Any row in the Piano Roll can be marked. Markers allow to improve the distinctness of movie data.</span></p>
<p class="rvps10"><span class="rvts21">Markers can be used to:</span></p> <p class="rvps7"><span class="rvts20">Markers can be used to:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">organize the Input</span></li> <li class="rvps7"><span class="rvts20">organize the Input</span></li>
<li class="rvps10"><span class="rvts21">formalize knowledge (using text Notes)</span></li> <li class="rvps7"><span class="rvts20">formalize knowledge (using text Notes)</span></li>
<li class="rvps10"><span class="rvts21">speed up navigation</span></li> <li class="rvps7"><span class="rvts20">speed up navigation</span></li>
<li class="rvps10"><span class="rvts21">speed up selection of segments (</span><span class="rvts30">Ctrl + A</span><span class="rvts21">)</span></li> <li class="rvps7"><span class="rvts20">speed up selection of segments (</span><span class="rvts27">Ctrl + A</span><span class="rvts20">)</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="PianoRoll.html#markers">Piano Roll</a><span class="rvts21">, </span><a class="rvts27" href="Ideas.html#Markers">Markers specs</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="PianoRoll.html#markers">Piano Roll</a><span class="rvts20">, </span><a class="rvts24" href="Ideas.html#Markers">Markers specs</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Note</span></p> <p class="rvps7"><span class="rvts22">Note</span></p>
<p class="rvps10"><span class="rvts21">A single line of text accompanying every Marker.</span></p> <p class="rvps7"><span class="rvts20">A single line of text accompanying every Marker.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="PianoRoll.html#markers">Piano Roll</a><span class="rvts21">, </span><a class="rvts27" href="Controls.html#notes">Controls</a><span class="rvts21">, </span><a class="rvts27" href="AdvancedFeatures.html#UsingMarkers">Advanced Features</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="PianoRoll.html#markers">Piano Roll</a><span class="rvts20">, </span><a class="rvts24" href="Controls.html#notes">Controls</a><span class="rvts20">, </span><a class="rvts24" href="AdvancedFeatures.html#UsingMarkers">Advanced Features</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Bookmark</span></p> <p class="rvps7"><span class="rvts22">Bookmark</span></p>
<p class="rvps10"><span class="rvts21">A numbered mark for a frame of the movie.</span></p> <p class="rvps7"><span class="rvts20">A numbered mark for a frame of the movie.</span></p>
<p class="rvps10"><span class="rvts21">Taseditor has 10 slots for Bookmarks.</span></p> <p class="rvps7"><span class="rvts20">Taseditor has 10 slots for Bookmarks.</span></p>
<p class="rvps10"><span class="rvts21">A Bookmark stores all necessary data about the frame it was placed on. Including the movie branch that contains an Input that definitely leads the game to the events of this frame.</span></p> <p class="rvps7"><span class="rvts20">A Bookmark stores all necessary data about the frame it was placed on. Including the movie branch that contains an Input that definitely leads the game to the events of this frame.</span></p>
<p class="rvps10"><span class="rvts21">Bookmarks can be used for Playback cursor navigation, but their main purpose is to store branches.</span></p> <p class="rvps7"><span class="rvts20">Bookmarks can be used for Playback cursor navigation, but their main purpose is to store branches.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="Toolbox.html#bookmarks">Toolbox</a><span class="rvts21">, </span><a class="rvts27" href="Ideas.html#BookmarksBranches">Bookmarks specs</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="Toolbox.html#bookmarks">Toolbox</a><span class="rvts20">, </span><a class="rvts24" href="Ideas.html#BookmarksBranches">Bookmarks specs</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Branch</span></p> <p class="rvps7"><span class="rvts22">Branch</span></p>
<p class="rvps10"><span class="rvts21">A full copy of the movie, storing its state at the moment of creating the Bookmark.</span></p> <p class="rvps7"><span class="rvts20">A full copy of the movie, storing its state at the moment of creating the Bookmark.</span></p>
<p class="rvps10"><span class="rvts21">The current movie can be replaced by the branch when necessary, thus restoring saved state of the movie.</span></p> <p class="rvps7"><span class="rvts20">The current movie can be replaced by the branch when necessary, thus restoring saved state of the movie.</span></p>
<p class="rvps10"><span class="rvts21">With branches you can have many different movies in one project, and you can instantly switch among them:</span></p> <p class="rvps7"><span class="rvts20">With branches you can have many different movies in one project, and you can instantly switch among them:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">to compare alternative strategies of walkthrough</span></li> <li class="rvps7"><span class="rvts20">to compare alternative strategies of walkthrough</span></li>
<li class="rvps10"><span class="rvts21">to store current best approach when testing different solutions in a segment</span></li> <li class="rvps7"><span class="rvts20">to store current best approach when testing different solutions in a segment</span></li>
<li class="rvps10"><span class="rvts21">to store examples of unused tricks that could be useful in future</span></li> <li class="rvps7"><span class="rvts20">to store examples of unused tricks that could be useful in future</span></li>
<li class="rvps10"><span class="rvts21">to compare your own movie with somebody else's movie (e.g. when making an improvement)</span></li> <li class="rvps7"><span class="rvts20">to compare your own movie with somebody else's movie (e.g. when making an improvement)</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="Toolbox.html#bookmarks">Toolbox</a><span class="rvts21">, </span><a class="rvts27" href="ProgramCustomization.html#BranchesrestoreentireMovie">Program Customization</a><span class="rvts21">, </span><a class="rvts27" href="Ideas.html#BookmarksBranches">Branches specs</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="Toolbox.html#bookmarks">Toolbox</a><span class="rvts20">, </span><a class="rvts24" href="ProgramCustomization.html#BranchesrestoreentireMovie">Program Customization</a><span class="rvts20">, </span><a class="rvts24" href="Ideas.html#BookmarksBranches">Branches specs</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Project</span></p> <p class="rvps7"><span class="rvts22">Project</span></p>
<p class="rvps10"><span class="rvts21">Container for storing working data in Taseditor.</span></p> <p class="rvps7"><span class="rvts20">Container for storing working data in Taseditor.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="AdvancedFeatures.html#ProjectsSharing">Advanced Features</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="AdvancedFeatures.html#ProjectsSharing">Advanced Features</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Lua</span></p> <p class="rvps7"><span class="rvts22">Lua</span></p>
<p class="rvps10"><span class="rvts21">Programming language used in many TAS-friendly emulators.</span></p> <p class="rvps7"><span class="rvts20">Programming language used in many TAS-friendly emulators.</span></p>
<p class="rvps10"><span class="rvts21">Useful for making custom tools and for data visualization.</span></p> <p class="rvps7"><span class="rvts20">Useful for making custom tools and for data visualization.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="AdvancedFeatures.html#UsingLua">Advanced Features</a><span class="rvts21">, </span><span class="rvts27">Lua</span><span class="rvts21">, </span><a class="rvts27" href="LuaAPI.html">Lua API</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="AdvancedFeatures.html#UsingLua">Advanced Features</a><span class="rvts20">, </span><span class="rvts24">Lua</span><span class="rvts20">, </span><a class="rvts24" href="LuaAPI.html">Lua API</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Bot </span><span class="rvts21">(robot)</span></p> <p class="rvps7"><span class="rvts22">Bot </span><span class="rvts20">(robot)</span></p>
<p class="rvps10"><span class="rvts21">A program made for automation of a specific task.</span></p> <p class="rvps7"><span class="rvts20">A program made for automation of a specific task.</span></p>
<p class="rvps10"><span class="rvts21">Bots are created to free humans from tedious work that doesn't require high intelligence. Unlike humans, bots don't invent the solution, they just methodically test all possible approaches within given limits, following an algorithm made by the programmer.</span></p> <p class="rvps7"><span class="rvts20">Bots are created to free humans from tedious work that doesn't require high intelligence. Unlike humans, bots don't invent the solution, they just methodically test all possible approaches within given limits, following an algorithm made by the programmer.</span></p>
<p class="rvps10"><span class="rvts21">Nowadays bots are only practical for running exhaustive search within a very small segment of the movie. Most of time it's faster to search for best solution manually, using human intuition to eliminate dead ends without unnecessary tests.</span></p> <p class="rvps7"><span class="rvts20">Nowadays bots are only practical for running exhaustive search within a very small segment of the movie. Most of time it's faster to search for best solution manually, using human intuition to eliminate dead ends without unnecessary tests.</span></p>
<p class="rvps10"><span class="rvts21">Making bots requires programming skills. TASing bots are either written in Lua or built-in into emulators by modifying an open source code.</span></p> <p class="rvps7"><span class="rvts20">Making bots requires programming skills. TASing bots are either written in Lua or built-in into emulators by modifying an open source code.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Pattern</span></p> <p class="rvps7"><span class="rvts22">Pattern</span></p>
<p class="rvps10"><span class="rvts21">A predefined sequence of Input values for a button.</span></p> <p class="rvps7"><span class="rvts20">A predefined sequence of Input values for a button.</span></p>
<p class="rvps10"><span class="rvts21">More: </span><a class="rvts27" href="AdvancedFeatures.html#UsingPatterns">Advanced Features</a><span class="rvts21">, </span><a class="rvts27" href="Ideas.html#Patterns">Patterns specs</a></p> <p class="rvps7"><span class="rvts20">More: </span><a class="rvts24" href="AdvancedFeatures.html#UsingPatterns">Advanced Features</a><span class="rvts20">, </span><a class="rvts24" href="Ideas.html#Patterns">Patterns specs</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com">Free EBook and documentation generator</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com">Easy EPub and documentation editor</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@ -1,420 +1,611 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>Implementation</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>Implementation</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="Implementation">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="Implementation" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("Implementation"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>Implementation</h1>
<div id="topic_breadcrumb">
<a href="TASEditorInside.html">TAS Editor Inside</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="TASEditorInside.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="Ideas.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="MistakeProofing.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="Implementation"
data-hnd-context="24"
data-hnd-title="Implementation"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="TASEditorInside.html">TAS Editor Inside</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="TASEditorInside.html" title="TAS Editor Inside" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="Ideas.html" title="Ideas" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="MistakeProofing.html" title="Mistake-proofing" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Implementation</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Implementation</span></p> <p class="rvps2"><span class="rvts18">Implementation</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">At first the TAS Editor was based on the codebase of experimental tool named TASEdit, using FCEUX 2.1.5 as a kick-start.</span></p> <p class="rvps7"><span class="rvts20">At first the TAS Editor was based on the codebase of experimental tool named TASEdit, using FCEUX 2.1.5 as a kick-start.</span></p>
<p class="rvps10"><span class="rvts21">The premise of TASEdit was to build an input editor (like TAS Movie Editor) into emulator, so that the delay between editing and checking results would greatly shrink. Since there was no research done on typical behaviors in TASing process, the concept was vague and the code wasn't scalable. Thus, soon after formulating the new vision of the editing tool the code of TAS Editor was fully rewritten to make adding new features easier.</span></p> <p class="rvps7"><span class="rvts20">The premise of TASEdit was to build an input editor (like TAS Movie Editor) into emulator, so that the delay between editing and checking results would greatly shrink. Since there was no research done on typical behaviors in TASing process, the concept was vague and the code wasn't scalable. Thus, soon after formulating the new vision of the editing tool the code of TAS Editor was fully rewritten to make adding new features easier.</span></p>
<p class="rvps10"><span class="rvts21">The premise of TAS Editor is to create a tool that is more handy than traditional rerecording tools, not just for Input editing/splicing, but also for Input creation and, most importantly, polishing (optimizing).</span></p> <p class="rvps7"><span class="rvts20">The premise of TAS Editor is to create a tool that is more handy than traditional rerecording tools, not just for Input editing/splicing, but also for Input creation and, most importantly, polishing (optimizing).</span></p>
<p class="rvps10"><span class="rvts21">The following architecture of TAS Editor was designed according to author's notion of a methodical TASing and of features needed for such TASing.</span></p> <p class="rvps7"><span class="rvts20">The following architecture of TAS Editor was designed according to author's notion of a methodical TASing and of features needed for such TASing.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts75">TAS Editor modules (classes)</span></p> <p class="rvps7"><span class="rvts18">TAS Editor modules (classes)</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">taseditor.cpp</span></p> <p class="rvps7"><span class="rvts19">taseditor.cpp</span></p>
<p class="rvps10"><span class="rvts21">Main Main gate between emulator and Taseditor</span></p> <p class="rvps7"><span class="rvts20">Main Main gate between emulator and Taseditor</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">the point of launching TAS Editor from emulator</span></li> <li class="rvps7"><span class="rvts20">the point of launching TAS Editor from emulator</span></li>
<li class="rvps10"><span class="rvts21">the point of quitting from TAS Editor</span></li> <li class="rvps7"><span class="rvts20">the point of quitting from TAS Editor</span></li>
<li class="rvps10"><span class="rvts21">regularly (at the end of every frame) updates all modules that need regular update</span></li> <li class="rvps7"><span class="rvts20">regularly (at the end of every frame) updates all modules that need regular update</span></li>
<li class="rvps10"><span class="rvts21">implements operations of the "File" menu: creating New project, opening a file, saving, compact saving, import, export</span></li> <li class="rvps7"><span class="rvts20">implements operations of the "File" menu: creating New project, opening a file, saving, compact saving, import, export</span></li>
<li class="rvps10"><span class="rvts21">handles some FCEUX hotkeys</span></li> <li class="rvps7"><span class="rvts20">handles some FCEUX hotkeys</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">taseditor_window.cpp</span></p> <p class="rvps7"><span class="rvts19">taseditor_window.cpp</span></p>
<p class="rvps10"><span class="rvts21">Window User Interface</span></p> <p class="rvps7"><span class="rvts20">Window User Interface</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">implements all operations with TAS Editor window: creating, redrawing, resizing, moving, tooltips, clicks</span></li> <li class="rvps7"><span class="rvts20">implements all operations with TAS Editor window: creating, redrawing, resizing, moving, tooltips, clicks</span></li>
<li class="rvps10"><span class="rvts21">subclasses all buttons and checkboxes in TAS Editor window GUI in order to disable Spacebar key and process Middle clicks</span></li> <li class="rvps7"><span class="rvts20">subclasses all buttons and checkboxes in TAS Editor window GUI in order to disable Spacebar key and process Middle clicks</span></li>
<li class="rvps10"><span class="rvts21">processes OS messages and sends signals from user to TAS Editor modules (also implements some minor commands on-site, like Greenzone capacity dialog and such)</span></li> <li class="rvps7"><span class="rvts20">processes OS messages and sends signals from user to TAS Editor modules (also implements some minor commands on-site, like Greenzone capacity dialog and such)</span></li>
<li class="rvps10"><span class="rvts21">switches off/on emulator's keyboard input when the window loses/gains focus</span></li> <li class="rvps7"><span class="rvts20">switches off/on emulator's keyboard input when the window loses/gains focus</span></li>
<li class="rvps10"><span class="rvts21">on demand: updates the window caption; updates mouse cursor icon</span></li> <li class="rvps7"><span class="rvts20">on demand: updates the window caption; updates mouse cursor icon</span></li>
<li class="rvps10"><span class="rvts21">updates all checkboxes and menu items when some settings change</span></li> <li class="rvps7"><span class="rvts20">updates all checkboxes and menu items when some settings change</span></li>
<li class="rvps10"><span class="rvts21">stores info about 10 last projects (File-&gt;Recent) and updates it when saving/loading files</span></li> <li class="rvps7"><span class="rvts20">stores info about 10 last projects (File-&gt;Recent) and updates it when saving/loading files</span></li>
<li class="rvps10"><span class="rvts21">stores resources: window caption, help filename, size and other properties of all GUI items</span></li> <li class="rvps7"><span class="rvts20">stores resources: window caption, help filename, size and other properties of all GUI items</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">bookmarks.cpp</span></p> <p class="rvps7"><span class="rvts19">bookmarks.cpp</span></p>
<p class="rvps10"><span class="rvts21">Bookmarks Manager of Bookmarks</span></p> <p class="rvps7"><span class="rvts20">Bookmarks Manager of Bookmarks</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores 10 Bookmarks</span></li> <li class="rvps7"><span class="rvts20">stores 10 Bookmarks</span></li>
<li class="rvps10"><span class="rvts21">implements all operations with Bookmarks: initialization, setting Bookmarks, jumping to Bookmarks, deploying Branches</span></li> <li class="rvps7"><span class="rvts20">implements all operations with Bookmarks: initialization, setting Bookmarks, jumping to Bookmarks, deploying Branches</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: resets all Bookmarks and Branches</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: resets all Bookmarks and Branches</span></li>
<li class="rvps10"><span class="rvts21">implements the working of Bookmarks List: creating, redrawing, mouseover, clicks</span></li> <li class="rvps7"><span class="rvts20">implements the working of Bookmarks List: creating, redrawing, mouseover, clicks</span></li>
<li class="rvps10"><span class="rvts21">regularly updates flashings in Bookmarks List</span></li> <li class="rvps7"><span class="rvts20">regularly updates flashings in Bookmarks List</span></li>
<li class="rvps10"><span class="rvts21">on demand: updates colors of rows in Bookmarks List, reflecting conditions of respective Piano Roll rows</span></li> <li class="rvps7"><span class="rvts20">on demand: updates colors of rows in Bookmarks List, reflecting conditions of respective Piano Roll rows</span></li>
<li class="rvps10"><span class="rvts21">stores resources: save id, ids of commands, labels for panel, gradients for flashings, id of default slot</span></li> <li class="rvps7"><span class="rvts20">stores resources: save id, ids of commands, labels for panel, gradients for flashings, id of default slot</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">branches.cpp</span></p> <p class="rvps7"><span class="rvts19">branches.cpp</span></p>
<p class="rvps10"><span class="rvts21">Branches Manager of Branches</span></p> <p class="rvps7"><span class="rvts20">Branches Manager of Branches</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores info about Branches (relations of Bookmarks) and the id of current Branch</span></li> <li class="rvps7"><span class="rvts20">stores info about Branches (relations of Bookmarks) and the id of current Branch</span></li>
<li class="rvps10"><span class="rvts21">also stores the time of the last modification (see fireball) and the time of project beginning (see cloudlet)</span></li> <li class="rvps7"><span class="rvts20">also stores the time of the last modification (see fireball) and the time of project beginning (see cloudlet)</span></li>
<li class="rvps10"><span class="rvts21">also caches data used in calculations (cached_first_difference, cached_timelines)</span></li> <li class="rvps7"><span class="rvts20">also caches data used in calculations (cached_first_difference, cached_timelines)</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: sends warning to caller</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: sends warning to caller</span></li>
<li class="rvps10"><span class="rvts21">implements the working of Branches Tree: creating, recalculating relations, animating, redrawing, mouseover, clicks</span></li> <li class="rvps7"><span class="rvts20">implements the working of Branches Tree: creating, recalculating relations, animating, redrawing, mouseover, clicks</span></li>
<li class="rvps10"><span class="rvts21">on demand: reacts on Bookmarks/current Movie changes and recalculates the Branches Tree</span></li> <li class="rvps7"><span class="rvts20">on demand: reacts on Bookmarks/current Movie changes and recalculates the Branches Tree</span></li>
<li class="rvps10"><span class="rvts21">regularly updates animations in Branches Tree and calculates Playback cursor position on the Tree</span></li> <li class="rvps7"><span class="rvts20">regularly updates animations in Branches Tree and calculates Playback cursor position on the Tree</span></li>
<li class="rvps10"><span class="rvts21">stores resources: coordinates for building Branches Tree, animation timings</span></li> <li class="rvps7"><span class="rvts20">stores resources: coordinates for building Branches Tree, animation timings</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">bookmark.cpp</span></p> <p class="rvps7"><span class="rvts19">bookmark.cpp</span></p>
<p class="rvps10"><span class="rvts21">Bookmark Single Bookmark data</span></p> <p class="rvps7"><span class="rvts20">Bookmark Single Bookmark data</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores all info of one specific Bookmark: movie snapshot, a savestate of 1 frame, a screenshot of the frame, a state of flashing for this Bookmark's row</span></li> <li class="rvps7"><span class="rvts20">stores all info of one specific Bookmark: movie snapshot, a savestate of 1 frame, a screenshot of the frame, a state of flashing for this Bookmark's row</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: sends warning to caller</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: sends warning to caller</span></li>
<li class="rvps10"><span class="rvts21">implements procedure of "Bookmark set": creating movie snapshot, setting key frame on current Playback position, copying savestate from Greenzone, making and compressing screenshot, launching flashing animation</span></li> <li class="rvps7"><span class="rvts20">implements procedure of "Bookmark set": creating movie snapshot, setting key frame on current Playback position, copying savestate from Greenzone, making and compressing screenshot, launching flashing animation</span></li>
<li class="rvps10"><span class="rvts21">launches respective flashings for "Bookmark jump" and "Branch deploy"</span></li> <li class="rvps7"><span class="rvts20">launches respective flashings for "Bookmark jump" and "Branch deploy"</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">snapshot.cpp</span></p> <p class="rvps7"><span class="rvts19">snapshot.cpp</span></p>
<p class="rvps10"><span class="rvts21">Snapshot Snapshot of all edited data</span></p> <p class="rvps7"><span class="rvts20">Snapshot Snapshot of all edited data</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores the data of specific snapshot of the movie: InputLog, LagLog, Markers at the moment of creating the snapshot, keyframe, start and end frame of operation, type of operation and description of the snapshot (including the time of creation)</span></li> <li class="rvps7"><span class="rvts20">stores the data of specific snapshot of the movie: InputLog, LagLog, Markers at the moment of creating the snapshot, keyframe, start and end frame of operation, type of operation and description of the snapshot (including the time of creation)</span></li>
<li class="rvps10"><span class="rvts21">also stores info about sequential recording/drawing of input</span></li> <li class="rvps7"><span class="rvts20">also stores info about sequential recording/drawing of input</span></li>
<li class="rvps10"><span class="rvts21">streamlines snapshot creation: copying Input from movie data, copying LagLog from Greenzone, copying Markers from Markers Manager, setting time of creation</span></li> <li class="rvps7"><span class="rvts20">streamlines snapshot creation: copying Input from movie data, copying LagLog from Greenzone, copying Markers from Markers Manager, setting time of creation</span></li>
<li class="rvps10"><span class="rvts21">streamlines restoring Markers data from snapshot</span></li> <li class="rvps7"><span class="rvts20">streamlines restoring Markers data from snapshot</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: sends warning to caller</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: sends warning to caller</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">inputlog.cpp</span></p> <p class="rvps7"><span class="rvts19">inputlog.cpp</span></p>
<p class="rvps10"><span class="rvts21">InputLog Log of Input</span></p> <p class="rvps7"><span class="rvts20">InputLog Log of Input</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores the data about Input state: size, type of Input, Input Log data (commands and joysticks)</span></li> <li class="rvps7"><span class="rvts20">stores the data about Input state: size, type of Input, Input Log data (commands and joysticks)</span></li>
<li class="rvps10"><span class="rvts21">optionally can store map of Hot Changes</span></li> <li class="rvps7"><span class="rvts20">optionally can store map of Hot Changes</span></li>
<li class="rvps10"><span class="rvts21">implements InputLog creation: copying Input, copying Hot Changes</span></li> <li class="rvps7"><span class="rvts20">implements InputLog creation: copying Input, copying Hot Changes</span></li>
<li class="rvps10"><span class="rvts21">implements full/partial restoring of data from InputLog: Input, Hot Changes</span></li> <li class="rvps7"><span class="rvts20">implements full/partial restoring of data from InputLog: Input, Hot Changes</span></li>
<li class="rvps10"><span class="rvts21">implements compression and decompression of stored data</span></li> <li class="rvps7"><span class="rvts20">implements compression and decompression of stored data</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: sends warning to caller</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: sends warning to caller</span></li>
<li class="rvps10"><span class="rvts21">implements searching of first mismatch comparing two InputLogs or comparing this InputLog to a movie</span></li> <li class="rvps7"><span class="rvts20">implements searching of first mismatch comparing two InputLogs or comparing this InputLog to a movie</span></li>
<li class="rvps10"><span class="rvts21">provides interface for reading specific data: reading Input of any given frame, reading value at any point of Hot Changes map</span></li> <li class="rvps7"><span class="rvts20">provides interface for reading specific data: reading Input of any given frame, reading value at any point of Hot Changes map</span></li>
<li class="rvps10"><span class="rvts21">implements all operations with Hot Changes maps: copying (full/partial), updating/fading, setting new hot places by comparing two InputLogs</span></li> <li class="rvps7"><span class="rvts20">implements all operations with Hot Changes maps: copying (full/partial), updating/fading, setting new hot places by comparing two InputLogs</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">laglog.cpp</span></p> <p class="rvps7"><span class="rvts19">laglog.cpp</span></p>
<p class="rvps10"><span class="rvts21">LagLog Log of Lag occurrence</span></p> <p class="rvps7"><span class="rvts20">LagLog Log of Lag occurrence</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores the frame-by-frame log of lag occurrence</span></li> <li class="rvps7"><span class="rvts20">stores the frame-by-frame log of lag occurrence</span></li>
<li class="rvps10"><span class="rvts21">implements compression and decompression of stored data</span></li> <li class="rvps7"><span class="rvts20">implements compression and decompression of stored data</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: sends warning to caller</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: sends warning to caller</span></li>
<li class="rvps10"><span class="rvts21">provides interface for reading and writing log data</span></li> <li class="rvps7"><span class="rvts20">provides interface for reading and writing log data</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">markers.cpp</span></p> <p class="rvps7"><span class="rvts19">markers.cpp</span></p>
<p class="rvps10"><span class="rvts21">Markers Snapshot of Markers state</span></p> <p class="rvps7"><span class="rvts20">Markers Snapshot of Markers state</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores the data about Markers state: array of distributing Markers among movie frames, and array of Notes</span></li> <li class="rvps7"><span class="rvts20">stores the data about Markers state: array of distributing Markers among movie frames, and array of Notes</span></li>
<li class="rvps10"><span class="rvts21">implements compression and decompression of stored data</span></li> <li class="rvps7"><span class="rvts20">implements compression and decompression of stored data</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: sends warning to caller</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: sends warning to caller</span></li>
<li class="rvps10"><span class="rvts21">stores resources: max length of a Note</span></li> <li class="rvps7"><span class="rvts20">stores resources: max length of a Note</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">popup_display.cpp</span></p> <p class="rvps7"><span class="rvts19">popup_display.cpp</span></p>
<p class="rvps10"><span class="rvts21">Popup display Manager of popup windows</span></p> <p class="rvps7"><span class="rvts20">Popup display Manager of popup windows</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">implements all operations with popup windows: initialization, redrawing, centering, screenshot decompression and conversion</span></li> <li class="rvps7"><span class="rvts20">implements all operations with popup windows: initialization, redrawing, centering, screenshot decompression and conversion</span></li>
<li class="rvps10"><span class="rvts21">regularly inspects changes of Bookmarks Manager and shows/updates/hides popup windows</span></li> <li class="rvps7"><span class="rvts20">regularly inspects changes of Bookmarks Manager and shows/updates/hides popup windows</span></li>
<li class="rvps10"><span class="rvts21">on demand: updates contents of popup windows</span></li> <li class="rvps7"><span class="rvts20">on demand: updates contents of popup windows</span></li>
<li class="rvps10"><span class="rvts21">stores resources: coordinates and appearance of popup windows, timings of fade in/out</span></li> <li class="rvps7"><span class="rvts20">stores resources: coordinates and appearance of popup windows, timings of fade in/out</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">history.cpp</span></p> <p class="rvps7"><span class="rvts19">history.cpp</span></p>
<p class="rvps10"><span class="rvts21">History History of movie modifications</span></p> <p class="rvps7"><span class="rvts20">History History of movie modifications</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores array of History items (snapshots, backup_bookmarks, backup_current_branch) and pointer to current snapshot</span></li> <li class="rvps7"><span class="rvts20">stores array of History items (snapshots, backup_bookmarks, backup_current_branch) and pointer to current snapshot</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: clears the array and starts new history by making snapshot of current movie data</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: clears the array and starts new history by making snapshot of current movie data</span></li>
<li class="rvps10"><span class="rvts21">on demand: checks the difference between the last snapshot and current movie, and makes a decision to create new point of rollback. In special cases it can create a point of rollback without checking the difference, assuming that caller already checked it</span></li> <li class="rvps7"><span class="rvts20">on demand: checks the difference between the last snapshot and current movie, and makes a decision to create new point of rollback. In special cases it can create a point of rollback without checking the difference, assuming that caller already checked it</span></li>
<li class="rvps10"><span class="rvts21">implements all restoring operations: undo, redo, revert to any snapshot from the array</span></li> <li class="rvps7"><span class="rvts20">implements all restoring operations: undo, redo, revert to any snapshot from the array</span></li>
<li class="rvps10"><span class="rvts21">also stores the state of "undo pointer"</span></li> <li class="rvps7"><span class="rvts20">also stores the state of "undo pointer"</span></li>
<li class="rvps10"><span class="rvts21">regularly updates the state of "undo pointer"</span></li> <li class="rvps7"><span class="rvts20">regularly updates the state of "undo pointer"</span></li>
<li class="rvps10"><span class="rvts21">regularly (when emulator is paused) searches for uncompressed items in the History Log and compresses first found item</span></li> <li class="rvps7"><span class="rvts20">regularly (when emulator is paused) searches for uncompressed items in the History Log and compresses first found item</span></li>
<li class="rvps10"><span class="rvts21">implements the working of History List: creating, redrawing, clicks, auto-scrolling</span></li> <li class="rvps7"><span class="rvts20">implements the working of History List: creating, redrawing, clicks, auto-scrolling</span></li>
<li class="rvps10"><span class="rvts21">stores resources: save id, ids and names of all possible types of modification, timings of "undo pointer"</span></li> <li class="rvps7"><span class="rvts20">stores resources: save id, ids and names of all possible types of modification, timings of "undo pointer"</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">piano_roll.cpp</span></p> <p class="rvps7"><span class="rvts19">piano_roll.cpp</span></p>
<p class="rvps10"><span class="rvts21">Piano Roll Piano Roll interface</span></p> <p class="rvps7"><span class="rvts20">Piano Roll Piano Roll interface</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">implements the working of Piano Roll List: creating, redrawing, scrolling, mouseover, clicks, drag</span></li> <li class="rvps7"><span class="rvts20">implements the working of Piano Roll List: creating, redrawing, scrolling, mouseover, clicks, drag</span></li>
<li class="rvps10"><span class="rvts21">regularly updates the size of the List according to current movie input</span></li> <li class="rvps7"><span class="rvts20">regularly updates the size of the List according to current movie input</span></li>
<li class="rvps10"><span class="rvts21">on demand: scrolls visible area of the List to any given item: to Playback Cursor, to Selection Cursor, to "undo pointer", to a Marker</span></li> <li class="rvps7"><span class="rvts20">on demand: scrolls visible area of the List to any given item: to Playback Cursor, to Selection Cursor, to "undo pointer", to a Marker</span></li>
<li class="rvps10"><span class="rvts21">saves and loads current position of vertical scrolling from a project file. On error: scrolls the List to the beginning</span></li> <li class="rvps7"><span class="rvts20">saves and loads current position of vertical scrolling from a project file. On error: scrolls the List to the beginning</span></li>
<li class="rvps10"><span class="rvts21">implements the working of Piano Roll List Header: creating, redrawing, animating, mouseover, clicks</span></li> <li class="rvps7"><span class="rvts20">implements the working of Piano Roll List Header: creating, redrawing, animating, mouseover, clicks</span></li>
<li class="rvps10"><span class="rvts21">regularly updates lights in the Header according to button presses data from Recorder and Alt key state</span></li> <li class="rvps7"><span class="rvts20">regularly updates lights in the Header according to button presses data from Recorder and Alt key state</span></li>
<li class="rvps10"><span class="rvts21">on demand: launches flashes in the Header</span></li> <li class="rvps7"><span class="rvts20">on demand: launches flashes in the Header</span></li>
<li class="rvps10"><span class="rvts21">implements the working of mouse wheel: List scrolling, Playback cursor movement, Selection cursor movement, scrolling across gaps</span></li> <li class="rvps7"><span class="rvts20">implements the working of mouse wheel: List scrolling, Playback cursor movement, Selection cursor movement, scrolling across gaps</span></li>
<li class="rvps10"><span class="rvts21">implements context menu on Right-click</span></li> <li class="rvps7"><span class="rvts20">implements context menu on Right-click</span></li>
<li class="rvps10"><span class="rvts21">stores resources: save id, ids of columns, widths of columns, tables of colors, gradient of Hot Changes, gradient of Header flashings, timings of flashes, all fonts used in TAS Editor, images</span></li> <li class="rvps7"><span class="rvts20">stores resources: save id, ids of columns, widths of columns, tables of colors, gradient of Hot Changes, gradient of Header flashings, timings of flashes, all fonts used in TAS Editor, images</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">selection.cpp</span></p> <p class="rvps7"><span class="rvts19">selection.cpp</span></p>
<p class="rvps10"><span class="rvts21">Selection Manager of selections</span></p> <p class="rvps7"><span class="rvts20">Selection Manager of selections</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">contains definition of the type "Set of selected frames"</span></li> <li class="rvps7"><span class="rvts20">contains definition of the type "Set of selected frames"</span></li>
<li class="rvps10"><span class="rvts21">stores array of Sets of selected frames (History of selections)</span></li> <li class="rvps7"><span class="rvts20">stores array of Sets of selected frames (History of selections)</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: clears the array and starts new history by making empty selection</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: clears the array and starts new history by making empty selection</span></li>
<li class="rvps10"><span class="rvts21">constantly tracks changes in selected rows of Piano Roll List, and makes a decision to create new point of selection rollback</span></li> <li class="rvps7"><span class="rvts20">constantly tracks changes in selected rows of Piano Roll List, and makes a decision to create new point of selection rollback</span></li>
<li class="rvps10"><span class="rvts21">implements all selection restoring operations: undo, redo</span></li> <li class="rvps7"><span class="rvts20">implements all selection restoring operations: undo, redo</span></li>
<li class="rvps10"><span class="rvts21">on demand: changes current selection: remove selection, jump to a frame with Selection cursor, select region, select all, select between Markers, reselect clipboard</span></li> <li class="rvps7"><span class="rvts20">on demand: changes current selection: remove selection, jump to a frame with Selection cursor, select region, select all, select between Markers, reselect clipboard</span></li>
<li class="rvps10"><span class="rvts21">regularly ensures that selection doesn't go beyond curent Piano Roll limits, detects if selection moved to another Marker and updates Note in the lower text field</span></li> <li class="rvps7"><span class="rvts20">regularly ensures that selection doesn't go beyond curent Piano Roll limits, detects if selection moved to another Marker and updates Note in the lower text field</span></li>
<li class="rvps10"><span class="rvts21">implements the working of lower buttons &lt;&lt; and &gt;&gt; (jumping on Markers)</span></li> <li class="rvps7"><span class="rvts20">implements the working of lower buttons &lt;&lt; and &gt;&gt; (jumping on Markers)</span></li>
<li class="rvps10"><span class="rvts21">also here's the code of lower text field (for editing Marker Notes)</span></li> <li class="rvps7"><span class="rvts20">also here's the code of lower text field (for editing Marker Notes)</span></li>
<li class="rvps10"><span class="rvts21">stores resource: save id, lower text field prefix</span></li> <li class="rvps7"><span class="rvts20">stores resource: save id, lower text field prefix</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">editor.cpp</span></p> <p class="rvps7"><span class="rvts19">editor.cpp</span></p>
<p class="rvps10"><span class="rvts21">Editor Tool for editing</span></p> <p class="rvps7"><span class="rvts20">Editor Tool for editing</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">implements operations of changing Input: toggle input in region, set input by pattern, toggle selected region, apply pattern to input selection</span></li> <li class="rvps7"><span class="rvts20">implements operations of changing Input: toggle input in region, set input by pattern, toggle selected region, apply pattern to input selection</span></li>
<li class="rvps10"><span class="rvts21">implements operations of changing Markers: toggle Markers in selection, apply patern to Markers in selection, mark/unmark all selected frames</span></li> <li class="rvps7"><span class="rvts20">implements operations of changing Markers: toggle Markers in selection, apply patern to Markers in selection, mark/unmark all selected frames</span></li>
<li class="rvps10"><span class="rvts21">stores Autofire Patterns data and their loading/generating code</span></li> <li class="rvps7"><span class="rvts20">stores Autofire Patterns data and their loading/generating code</span></li>
<li class="rvps10"><span class="rvts21">stores resources: patterns filename, id of buttonpresses in patterns</span></li> <li class="rvps7"><span class="rvts20">stores resources: patterns filename, id of buttonpresses in patterns</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">splicer.cpp</span></p> <p class="rvps7"><span class="rvts19">splicer.cpp</span></p>
<p class="rvps10"><span class="rvts21">Splicer Tool for montage</span></p> <p class="rvps7"><span class="rvts20">Splicer Tool for montage</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">implements operations of mass-changing input: copy/paste, cloning, clearing region, insertion and deletion of frames, truncating</span></li> <li class="rvps7"><span class="rvts20">implements operations of mass-changing input: copy/paste, cloning, clearing region, insertion and deletion of frames, truncating</span></li>
<li class="rvps10"><span class="rvts21">stores data about the selection used in last "Copy to Clipboard" operation</span></li> <li class="rvps7"><span class="rvts20">stores data about the selection used in last "Copy to Clipboard" operation</span></li>
<li class="rvps10"><span class="rvts21">regularly checks the state of current selection and displays info on GUI, also displays info about input in Clipboard</span></li> <li class="rvps7"><span class="rvts20">regularly checks the state of current selection and displays info on GUI, also displays info about input in Clipboard</span></li>
<li class="rvps10"><span class="rvts21">when launching TAS Editor, it checks Clipboard contents</span></li> <li class="rvps7"><span class="rvts20">when launching TAS Editor, it checks Clipboard contents</span></li>
<li class="rvps10"><span class="rvts21">stores resources: mnemonics of buttons, texts for selection/clipboard info on GUI</span></li> <li class="rvps7"><span class="rvts20">stores resources: mnemonics of buttons, texts for selection/clipboard info on GUI</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">taseditor_config.cpp</span></p> <p class="rvps7"><span class="rvts19">taseditor_config.cpp</span></p>
<p class="rvps10"><span class="rvts21">Config Current settings</span></p> <p class="rvps7"><span class="rvts20">Config Current settings</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores current state of all TAS Editor settings</span></li> <li class="rvps7"><span class="rvts20">stores current state of all TAS Editor settings</span></li>
<li class="rvps10"><span class="rvts21">all TAS Editor modules can get or set any data within Config</span></li> <li class="rvps7"><span class="rvts20">all TAS Editor modules can get or set any data within Config</span></li>
<li class="rvps10"><span class="rvts21">when launching FCEUX, the emulator writes data from fceux.cfg file to the Config, when exiting it reads the data back to fceux.cfg</span></li> <li class="rvps7"><span class="rvts20">when launching FCEUX, the emulator writes data from fceux.cfg file to the Config, when exiting it reads the data back to fceux.cfg</span></li>
<li class="rvps10"><span class="rvts21">stores resources: default values of all settings, min/max values of settings</span></li> <li class="rvps7"><span class="rvts20">stores resources: default values of all settings, min/max values of settings</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">playback.cpp</span></p> <p class="rvps7"><span class="rvts19">playback.cpp</span></p>
<p class="rvps10"><span class="rvts21">Playback Player of emulation states</span></p> <p class="rvps7"><span class="rvts20">Playback Player of emulation states</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">implements the working of movie player: show any frame (jump), run/cancel seekng. pause, rewinding</span></li> <li class="rvps7"><span class="rvts20">implements the working of movie player: show any frame (jump), run/cancel seekng. pause, rewinding</span></li>
<li class="rvps10"><span class="rvts21">regularly tracks and controls emulation process, prompts redrawing of Piano Roll List rows, finishes seeking when reaching target frame, animates target frame, makes Piano Roll follow Playback cursor, detects if Playback cursor moved to another Marker and updates Note in the upper text field</span></li> <li class="rvps7"><span class="rvts20">regularly tracks and controls emulation process, prompts redrawing of Piano Roll List rows, finishes seeking when reaching target frame, animates target frame, makes Piano Roll follow Playback cursor, detects if Playback cursor moved to another Marker and updates Note in the upper text field</span></li>
<li class="rvps10"><span class="rvts21">implements the working of upper buttons &lt;&lt; and &gt;&gt; (jumping on Markers)</span></li> <li class="rvps7"><span class="rvts20">implements the working of upper buttons &lt;&lt; and &gt;&gt; (jumping on Markers)</span></li>
<li class="rvps10"><span class="rvts21">implements the working of buttons &lt; and &gt; (frame-by-frame movement)</span></li> <li class="rvps7"><span class="rvts20">implements the working of buttons &lt; and &gt; (frame-by-frame movement)</span></li>
<li class="rvps10"><span class="rvts21">implements the working of button || (pause) and middle mouse button, also reacts on external changes of emulation pause</span></li> <li class="rvps7"><span class="rvts20">implements the working of button || (pause) and middle mouse button, also reacts on external changes of emulation pause</span></li>
<li class="rvps10"><span class="rvts21">implements the working of progressbar: init, reset, set value, click (cancel seeking)</span></li> <li class="rvps7"><span class="rvts20">implements the working of progressbar: init, reset, set value, click (cancel seeking)</span></li>
<li class="rvps10"><span class="rvts21">also here's the code of upper text field (for editing Marker Notes)</span></li> <li class="rvps7"><span class="rvts20">also here's the code of upper text field (for editing Marker Notes)</span></li>
<li class="rvps10"><span class="rvts21">stores resources: upper text field prefix, timings of target frame animation, response times of GUI buttons, progressbar scale</span></li> <li class="rvps7"><span class="rvts20">stores resources: upper text field prefix, timings of target frame animation, response times of GUI buttons, progressbar scale</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">greenzone.cpp</span></p> <p class="rvps7"><span class="rvts19">greenzone.cpp</span></p>
<p class="rvps10"><span class="rvts21">Greenzone Access zone</span></p> <p class="rvps7"><span class="rvts20">Greenzone Access zone</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores array of savestates, used for faster movie navigation by Playback cursor</span></li> <li class="rvps7"><span class="rvts20">stores array of savestates, used for faster movie navigation by Playback cursor</span></li>
<li class="rvps10"><span class="rvts21">also stores LagLog of current movie Input</span></li> <li class="rvps7"><span class="rvts20">also stores LagLog of current movie Input</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: truncates Greenzone to last successfully read savestate</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: truncates Greenzone to last successfully read savestate</span></li>
<li class="rvps10"><span class="rvts21">regularly checks if there's a savestate of current emulation state, if there's no such savestate in array then creates one and updates lag info for previous frame</span></li> <li class="rvps7"><span class="rvts20">regularly checks if there's a savestate of current emulation state, if there's no such savestate in array then creates one and updates lag info for previous frame</span></li>
<li class="rvps10"><span class="rvts21">implements the working of "Auto-adjust Input according to lag" feature</span></li> <li class="rvps7"><span class="rvts20">implements the working of "Auto-adjust Input according to lag" feature</span></li>
<li class="rvps10"><span class="rvts21">regularly runs gradual cleaning of the savestates array (for memory saving), deleting oldest savestates</span></li> <li class="rvps7"><span class="rvts20">regularly runs gradual cleaning of the savestates array (for memory saving), deleting oldest savestates</span></li>
<li class="rvps10"><span class="rvts21">on demand: (when movie input was changed) truncates the size of Greenzone, deleting savestates that became irrelevant because of new input. After truncating it may also move Playback cursor (which must always reside within Greenzone) and may launch Playback seeking</span></li> <li class="rvps7"><span class="rvts20">on demand: (when movie input was changed) truncates the size of Greenzone, deleting savestates that became irrelevant because of new input. After truncating it may also move Playback cursor (which must always reside within Greenzone) and may launch Playback seeking</span></li>
<li class="rvps10"><span class="rvts21">stores resources: save id, properties of gradual cleaning, timing of cleaning</span></li> <li class="rvps7"><span class="rvts20">stores resources: save id, properties of gradual cleaning, timing of cleaning</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">recorder.cpp</span></p> <p class="rvps7"><span class="rvts19">recorder.cpp</span></p>
<p class="rvps10"><span class="rvts21">Recorder Tool for input recording</span></p> <p class="rvps7"><span class="rvts20">Recorder Tool for input recording</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">at the moment of recording movie input (at the very end of a frame) by emulator's call the Recorder intercepts input data and applies its filters (multitracking/etc), then reflects input changes into History and Greenzone</span></li> <li class="rvps7"><span class="rvts20">at the moment of recording movie input (at the very end of a frame) by emulator's call the Recorder intercepts input data and applies its filters (multitracking/etc), then reflects input changes into History and Greenzone</span></li>
<li class="rvps10"><span class="rvts21">regularly tracks virtual joypad buttonpresses and provides data for Piano Roll List Header lights. Also reacts on external changes of Recording status, and updates GUI (Recorder panel and Bookmarks/Branches caption)</span></li> <li class="rvps7"><span class="rvts20">regularly tracks virtual joypad buttonpresses and provides data for Piano Roll List Header lights. Also reacts on external changes of Recording status, and updates GUI (Recorder panel and Bookmarks/Branches caption)</span></li>
<li class="rvps10"><span class="rvts21">implements input editing in Read-only mode (ColumnSet by pressing buttons on virtual joypad)</span></li> <li class="rvps7"><span class="rvts20">implements input editing in Read-only mode (ColumnSet by pressing buttons on virtual joypad)</span></li>
<li class="rvps10"><span class="rvts21">stores resources: ids and names of multitracking modes, suffixes for TAS Editor window caption</span></li> <li class="rvps7"><span class="rvts20">stores resources: ids and names of multitracking modes, suffixes for TAS Editor window caption</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">markers_manager.cpp</span></p> <p class="rvps7"><span class="rvts19">markers_manager.cpp</span></p>
<p class="rvps10"><span class="rvts21">Markers_manager Manager of Markers</span></p> <p class="rvps7"><span class="rvts20">Markers_manager Manager of Markers</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores one snapshot of Markers, representing current state of Markers in the project</span></li> <li class="rvps7"><span class="rvts20">stores one snapshot of Markers, representing current state of Markers in the project</span></li>
<li class="rvps10"><span class="rvts21">saves and loads the data from a project file. On error: clears the data</span></li> <li class="rvps7"><span class="rvts20">saves and loads the data from a project file. On error: clears the data</span></li>
<li class="rvps10"><span class="rvts21">regularly ensures that the size of current Markers array is not less than the number of frames in current input</span></li> <li class="rvps7"><span class="rvts20">regularly ensures that the size of current Markers array is not less than the number of frames in current input</span></li>
<li class="rvps10"><span class="rvts21">implements all operations with Markers: setting Marker to a frame, removing Marker, inserting/deleting frames between Markers, truncating Markers array, changing Notes, finding frame for any given Marker, access to the data of Snapshot of Markers state</span></li> <li class="rvps7"><span class="rvts20">implements all operations with Markers: setting Marker to a frame, removing Marker, inserting/deleting frames between Markers, truncating Markers array, changing Notes, finding frame for any given Marker, access to the data of Snapshot of Markers state</span></li>
<li class="rvps10"><span class="rvts21">implements full/partial copying of data between two Snapshots of Markers state, and searching for first difference between two Snapshots of Markers state</span></li> <li class="rvps7"><span class="rvts20">implements full/partial copying of data between two Snapshots of Markers state, and searching for first difference between two Snapshots of Markers state</span></li>
<li class="rvps10"><span class="rvts21">also here's the code of searching for "similar" Notes</span></li> <li class="rvps7"><span class="rvts20">also here's the code of searching for "similar" Notes</span></li>
<li class="rvps10"><span class="rvts21">also here's the code of editing Marker Notes</span></li> <li class="rvps7"><span class="rvts20">also here's the code of editing Marker Notes</span></li>
<li class="rvps10"><span class="rvts21">also here's the code of Find Note dialog </span></li> <li class="rvps7"><span class="rvts20">also here's the code of Find Note dialog&nbsp;</span></li>
<li class="rvps10"><span class="rvts21">stores resources: save id, properties of searching for similar Notes</span></li> <li class="rvps7"><span class="rvts20">stores resources: save id, properties of searching for similar Notes</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">taseditor_lua.cpp</span></p> <p class="rvps7"><span class="rvts19">taseditor_lua.cpp</span></p>
<p class="rvps10"><span class="rvts21">Lua Manager of Lua features</span></p> <p class="rvps7"><span class="rvts20">Lua Manager of Lua features</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">implements logic of all functions of "taseditor" Lua library</span></li> <li class="rvps7"><span class="rvts20">implements logic of all functions of "taseditor" Lua library</span></li>
<li class="rvps10"><span class="rvts21">stores the list of pending input changes</span></li> <li class="rvps7"><span class="rvts20">stores the list of pending input changes</span></li>
<li class="rvps10"><span class="rvts21">on demand: (from FCEUX Lua engine) updates "</span><span class="rvts29">Run function</span><span class="rvts21">" button</span></li> <li class="rvps7"><span class="rvts20">on demand: (from FCEUX Lua engine) updates "</span><span class="rvts26">Run function</span><span class="rvts20">" button</span></li>
<li class="rvps10"><span class="rvts21">stores resources: ids of joypads for input changes, max length of a name for </span><span class="rvts20">applychanges()</span><span class="rvts21">, default caption for the "</span><span class="rvts29">Run function</span><span class="rvts21">" button</span></li> <li class="rvps7"><span class="rvts20">stores resources: ids of joypads for input changes, max length of a name for </span><span class="rvts19">applychanges()</span><span class="rvts20">, default caption for the "</span><span class="rvts26">Run function</span><span class="rvts20">" button</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts20">taseditor_project.cpp</span></p> <p class="rvps7"><span class="rvts19">taseditor_project.cpp</span></p>
<p class="rvps10"><span class="rvts21">Project Manager of working project</span></p> <p class="rvps7"><span class="rvts20">Project Manager of working project</span></p>
<p class="rvps10"><span class="rvts39">[single instance]</span></p> <p class="rvps7"><span class="rvts35">[single instance]</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">stores the info about current project filename and about having unsaved changes</span></li> <li class="rvps7"><span class="rvts20">stores the info about current project filename and about having unsaved changes</span></li>
<li class="rvps10"><span class="rvts21">implements saving and loading project files from filesystem</span></li> <li class="rvps7"><span class="rvts20">implements saving and loading project files from filesystem</span></li>
<li class="rvps10"><span class="rvts21">implements autosave function</span></li> <li class="rvps7"><span class="rvts20">implements autosave function</span></li>
<li class="rvps10"><span class="rvts21">stores resources: autosave period scale, default filename, fm3 format offsets</span></li> <li class="rvps7"><span class="rvts20">stores resources: autosave period scale, default filename, fm3 format offsets</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts75">Emulator modifications</span></p> <p class="rvps7"><span class="rvts18">Emulator modifications</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Taseditor needs the following modifications to be applied to an emulator code.</span></p> <p class="rvps7"><span class="rvts20">Taseditor needs the following modifications to be applied to an emulator code.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Main</span><span class="rvts21">/</span><span class="rvts25">Window</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts22">Main</span><span class="rvts20">/</span><span class="rvts22">Window</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">call Taseditor's update() function after every emulated frame and when emulation is paused, no less than 20 times per second (necessary for smooth animations and controls in TAS Editor window)</span></li> <li class="rvps7"><span class="rvts20">call Taseditor's update() function after every emulated frame and when emulation is paused, no less than 20 times per second (necessary for smooth animations and controls in TAS Editor window)</span></li>
<li class="rvps10"><span class="rvts21">dispatch OS messages to Taseditor window, including accelerator table commands</span></li> <li class="rvps7"><span class="rvts20">dispatch OS messages to Taseditor window, including accelerator table commands</span></li>
<li class="rvps10"><span class="rvts21">if emulator doesn't make use of mouse wheel, it should resend WM_MOUSEWHEEL to Taseditor, same with middle mouse clicks on emulator's own window</span></li> <li class="rvps7"><span class="rvts20">if emulator doesn't make use of mouse wheel, it should resend WM_MOUSEWHEEL to Taseditor, same with middle mouse clicks on emulator's own window</span></li>
<li class="rvps24" style="text-indent: 30px"><span class="rvts21">on exit: emulator should ask Taseditor, so it can check unsaved changes in current project and allow user to save before quitting. If the </span><span class="rvts20">askSave()</span><span class="rvts21"> function returns </span><span class="rvts70">false</span><span class="rvts21">, the exit should be cancelled (means that user chose "Cancel")</span></li> <li style="text-indent: 30px" class="rvps15"><span class="rvts20">on exit: emulator should ask Taseditor, so it can check unsaved changes in current project and allow user to save before quitting. If the </span><span class="rvts19">askSave()</span><span class="rvts20"> function returns </span><span class="rvts63">false</span><span class="rvts20">, the exit should be cancelled (means that user chose "Cancel")</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Movie</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts22">Movie</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">there should be an interface for full control over the current movie data (creating/reading/writing/any modification). The movie should be the last layer between user's input and emulated game, which means that the game should not take input from virtual pads, only from movie data. An alternative (FCEUX example) would be to always sync changes into virtual pads every time the movie data changes. Either way, Taseditor interacts with the game by reading and modifying movie data and doesn't poll virtual pads. The Piano Roll displays current movie data and edits Input of current movie data only</span></li> <li class="rvps7"><span class="rvts20">there should be an interface for full control over the current movie data (creating/reading/writing/any modification). The movie should be the last layer between user's input and emulated game, which means that the game should not take input from virtual pads, only from movie data. An alternative (FCEUX example) would be to always sync changes into virtual pads every time the movie data changes. Either way, Taseditor interacts with the game by reading and modifying movie data and doesn't poll virtual pads. The Piano Roll displays current movie data and edits Input of current movie data only</span></li>
<li class="rvps10"><span class="rvts21">in Recording mode: at the very beginning of a frame (right after the Input for the frame is written into current movie data) emulator should call Taseditor's Recorder function (and Recorder may change the movie data)</span></li> <li class="rvps7"><span class="rvts20">in Recording mode: at the very beginning of a frame (right after the Input for the frame is written into current movie data) emulator should call Taseditor's Recorder function (and Recorder may change the movie data)</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Input</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts22">Input</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">provide an interface for knowing which buttons are currently held (it's necessary for the Piano Roll Header)</span></li> <li class="rvps7"><span class="rvts20">provide an interface for knowing which buttons are currently held (it's necessary for the Piano Roll Header)</span></li>
<li class="rvps10"><span class="rvts21">hardware commands (Reset/Power/etc) should not be executed immediately after user invokes them, they should work as well as buttons input from virtual pads, meaning that when Taseditor is engaged it may either allow or prohibit the commands. In fact, when Taseditor is engaged and is not Recording, user should not be able to even invoke hardware commands</span></li> <li class="rvps7"><span class="rvts20">hardware commands (Reset/Power/etc) should not be executed immediately after user invokes them, they should work as well as buttons input from virtual pads, meaning that when Taseditor is engaged it may either allow or prohibit the commands. In fact, when Taseditor is engaged and is not Recording, user should not be able to even invoke hardware commands</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Output</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts22">Output</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">provide read access to current state of lag indicator (needed at the end of every frame)</span></li> <li class="rvps7"><span class="rvts20">provide read access to current state of lag indicator (needed at the end of every frame)</span></li>
<li class="rvps10"><span class="rvts21">have public function for storing current screenshot in RAM (also screenshot with Lua HUD)</span></li> <li class="rvps7"><span class="rvts20">have public function for storing current screenshot in RAM (also screenshot with Lua HUD)</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">SaveStates</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts22">SaveStates</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">have public function for making a savestate in RAM and function for loading the state from RAM array</span></li> <li class="rvps7"><span class="rvts20">have public function for making a savestate in RAM and function for loading the state from RAM array</span></li>
<li class="rvps10"><span class="rvts21">savestates must restore the game state precisely</span></li> <li class="rvps7"><span class="rvts20">savestates must restore the game state precisely</span></li>
<li class="rvps10"><span class="rvts21">saving and loading should not take too much time, because the Greenzone automatically creates a new savestate for every frame, which should be transparent for user</span></li> <li class="rvps7"><span class="rvts20">saving and loading should not take too much time, because the Greenzone automatically creates a new savestate for every frame, which should be transparent for user</span></li>
<li class="rvps10"><span class="rvts21">savestates should be stored in compressed form, so that they don't take too much space, because for a comfortable work in Taseditor the Greenzone should have at least 1000 savestates for nearby frames</span></li> <li class="rvps7"><span class="rvts20">savestates should be stored in compressed form, so that they don't take too much space, because for a comfortable work in Taseditor the Greenzone should have at least 1000 savestates for nearby frames</span></li>
<li class="rvps10"><span class="rvts21">Greenzone savestates should not store current movie data (that would be a waste of space)</span></li> <li class="rvps7"><span class="rvts20">Greenzone savestates should not store current movie data (that would be a waste of space)</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Config</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts22">Config</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">on emulator start: emulator should load </span><span class="rvts70">taseditor_config</span><span class="rvts21"> data from the common settings file. If the file is not found, no changes should be made to </span><span class="rvts70">taseditor_config</span><span class="rvts21"> (it will have its default settings)</span></li> <li class="rvps7"><span class="rvts20">on emulator start: emulator should load </span><span class="rvts63">taseditor_config</span><span class="rvts20"> data from the common settings file. If the file is not found, no changes should be made to </span><span class="rvts63">taseditor_config</span><span class="rvts20"> (it will have its default settings)</span></li>
<li class="rvps10"><span class="rvts21">on emulator exit: save </span><span class="rvts70">taseditor_config</span><span class="rvts21"> data to the common settings file</span></li> <li class="rvps7"><span class="rvts20">on emulator exit: save </span><span class="rvts63">taseditor_config</span><span class="rvts20"> data to the common settings file</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Lua engine</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts22">Lua engine</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">add support for </span><span class="rvts20">taseditor</span><span class="rvts21"> library. The core of each function is implemented by Taseditor, but emulator should take parameters from Lua stack and send them to respective function of Taseditor's Lua gate, then receive returned data and push it into Lua stack</span></li> <li class="rvps7"><span class="rvts20">add support for </span><span class="rvts19">taseditor</span><span class="rvts20"> library. The core of each function is implemented by Taseditor, but emulator should take parameters from Lua stack and send them to respective function of Taseditor's Lua gate, then receive returned data and push it into Lua stack</span></li>
<li class="rvps10"><span class="rvts21">add support for </span><a class="rvts27" href="LuaAPI.html#registermanual">Manual function</a><span class="rvts21"> and </span><a class="rvts27" href="LuaAPI.html#registerauto">Auto function</a></li> <li class="rvps7"><span class="rvts20">add support for </span><a class="rvts24" href="LuaAPI.html#registermanual">Manual function</a><span class="rvts20"> and </span><a class="rvts24" href="LuaAPI.html#registerauto">Auto function</a></li>
<li class="rvps10"><span class="rvts21">notify Taseditor about changing the Manual function status (registered/re-registered/empty) so that it can change the appearance of the "</span><span class="rvts29">Run function</span><span class="rvts21">" button</span></li> <li class="rvps7"><span class="rvts20">notify Taseditor about changing the Manual function status (registered/re-registered/empty) so that it can change the appearance of the "</span><span class="rvts26">Run function</span><span class="rvts20">" button</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Replay</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts22">Replay</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">emulator should be able to replay Taseditor project files as usual movie files, ignoring the additional data at the end of the file</span></li> <li class="rvps7"><span class="rvts20">emulator should be able to replay Taseditor project files as usual movie files, ignoring the additional data at the end of the file</span></li>
<li class="rvps10"><span class="rvts21">since Taseditor project file can be huge, emulator shouldn't load it into memory when opening</span></li> <li class="rvps7"><span class="rvts20">since Taseditor project file can be huge, emulator shouldn't load it into memory when opening</span></li>
<li class="rvps10"><span class="rvts21">emulator should be able to distinguish between a normal movie and a Taseditor project file. If it's a project file: when user tries to rerecord, emulator should refuse and suggest launching TAS Editor instead. If user agrees, emulator should send Taseditor the reference to the project file</span></li> <li class="rvps7"><span class="rvts20">emulator should be able to distinguish between a normal movie and a Taseditor project file. If it's a project file: when user tries to rerecord, emulator should refuse and suggest launching TAS Editor instead. If user agrees, emulator should send Taseditor the reference to the project file</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Other</span><span class="rvts21">:</span></p> <p class="rvps7"><span class="rvts22">Other</span><span class="rvts20">:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">emulator must be stable and deterministic. Desyncs will totally break Playback cursor navigation and make TASing unfeasible</span></li> <li class="rvps7"><span class="rvts20">emulator must be stable and deterministic. Desyncs will totally break Playback cursor navigation and make TASing unfeasible</span></li>
<li class="rvps10"><span class="rvts21">it's recommended to implement all the points mentioned in </span><a class="rvts27" href="MistakeProofing.html">Mistake-proofing</a><span class="rvts21"> that are related to emulator modification. In particular, Taseditor should be able to change certain settings, and user shouldn't be able to change them while Taseditor is engaged</span></li> <li class="rvps7"><span class="rvts20">it's recommended to implement all the points mentioned in </span><a class="rvts24" href="MistakeProofing.html">Mistake-proofing</a><span class="rvts20"> that are related to emulator modification. In particular, Taseditor should be able to change certain settings, and user shouldn't be able to change them while Taseditor is engaged</span></li>
<li class="rvps10"><span class="rvts21">good emulation speed is necessary for adequate </span><a class="rvts27" href="NonlinearTASing.html#turbo-seeking">Turbo seeking</a><span class="rvts21"> feature. Also there should be an option to mute sound when turbo is on.</span></li> <li class="rvps7"><span class="rvts20">good emulation speed is necessary for adequate </span><a class="rvts24" href="NonlinearTASing.html#turbo-seeking">Turbo seeking</a><span class="rvts20"> feature. Also there should be an option to mute sound when turbo is on.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/create-epub-ebooks">Free EPub producer</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,145 +1,336 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>1. Introduction</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>1. Introduction</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="1. Introduction">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="1. Introduction" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("Introduction"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>1. Introduction</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="BeginnersGuide.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="BeginnersGuide.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="ProgramInterface.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="Introduction"
data-hnd-context="4"
data-hnd-title="1. Introduction"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="BeginnersGuide.html" title="Beginner's Guide" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="BeginnersGuide.html" title="Beginner's Guide" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="ProgramInterface.html" title="2. Program Interface" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>1. Introduction</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Introduction</span></p> <p class="rvps2"><span class="rvts18">Introduction</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/famtasia-smb3j.png"/></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/famtasia-smb3j.png"></p>
<p class="rvps10"><span class="rvts21">TASing the process of creating an extraordinary game playthrough. For a true TASer, just simply beating the game is not enough. You must do something unique, something that would justify the use of tools.</span></p> <p class="rvps7"><span class="rvts20">TASing the process of creating an extraordinary game playthrough. For a true TASer, just simply beating the game is not enough. You must do something unique, something that would justify the use of tools.</span></p>
<p class="rvps10"><span class="rvts21">And that requires a non-standard way of thinking. During a regular playing, almost entire flow of our thoughts is determined by the gameplay rules, and those who try to question the rules are quickly fined with a game over and other means. These trivial psychological methods help the game to direct player's fantasy to an intended path, giving him a credible atmosphere of integral world and keeping him within a craftily devised comfort zone.</span></p> <p class="rvps7"><span class="rvts20">And that requires a non-standard way of thinking. During a regular playing, almost entire flow of our thoughts is determined by the gameplay rules, and those who try to question the rules are quickly fined with a game over and other means. These trivial psychological methods help the game to direct player's fantasy to an intended path, giving him a credible atmosphere of integral world and keeping him within a craftily devised comfort zone.</span></p>
<p class="rvps10"><span class="rvts21">So, to create an extraordinary playthrough, TASer needs to both use emulator tools masterfully and be able to mentally abstract from the original game rules, while still obeying them physically (because TASing is not cheating, we won't influence the game other way than by joypad input).</span></p> <p class="rvps7"><span class="rvts20">So, to create an extraordinary playthrough, TASer needs to both use emulator tools masterfully and be able to mentally abstract from the original game rules, while still obeying them physically (because TASing is not cheating, we won't influence the game other way than by joypad input).</span></p>
<p class="rvps10"><span class="rvts21">Early TASing, just as regular speedrunning, was not too far away from the "normal" gaming process. TASer simply launched an emulator, switched on buttons logging and played a game, saving and loading often enough to fix the most obvious mistakes, slowing down the gameplay at the most intense moments, thus compensating for the slow reaction of the human organism.</span></p> <p class="rvps7"><span class="rvts20">Early TASing, just as regular speedrunning, was not too far away from the "normal" gaming process. TASer simply launched an emulator, switched on buttons logging and played a game, saving and loading often enough to fix the most obvious mistakes, slowing down the gameplay at the most intense moments, thus compensating for the slow reaction of the human organism.</span></p>
<p class="rvps10"><span class="rvts21">The ability to fix mistakes emancipates man's imagination and incites him to experiment. Illusions of the game realm now confine his mind much less than before. But real-world stereotypes still affect his thinking. For instance, if a harmful object usually kills you, it's only natural to assume it always kills. But in truth it may appear to be killing only at even frame numbers, or when the subpixel value is equal to zero. But how would you guess it using only savestates and slowdown?</span></p> <p class="rvps7"><span class="rvts20">The ability to fix mistakes emancipates man's imagination and incites him to experiment. Illusions of the game realm now confine his mind much less than before. But real-world stereotypes still affect his thinking. For instance, if a harmful object usually kills you, it's only natural to assume it always kills. But in truth it may appear to be killing only at even frame numbers, or when the subpixel value is equal to zero. But how would you guess it using only savestates and slowdown?</span></p>
<p class="rvps10"><span class="rvts21">You have to stop being a gamer and become a researcher. And there are tools made exactly for this mental transformation.</span></p> <p class="rvps7"><span class="rvts20">You have to stop being a gamer and become a researcher. And there are tools made exactly for this mental transformation.</span></p>
<p class="rvps10"><span class="rvts21">A huge breakthrough in the TASing history was the introduction of </span><span class="rvts25">Frame Advance</span><span class="rvts21"> a frame-by-frame emulation. Now when you're TASing, the game is constantly being held paused, thus allowing to analyze every in-game aspect separately. Before, even with a strong slowdown the game still appeared as a coherent stream of events. The stream that the player had to perceive as a complex emotional cocktail. And now with frame-by-frame play TASer can mentally isolate any given event of the current frame. This drastically changes the principles of consuming an in-game information. Material world stereotypes don't dictate how to act in the virtual world anymore, and you see the game more objectively, thus finding imperfections and loopholes in its rules.</span></p> <p class="rvps7"><span class="rvts20">A huge breakthrough in the TASing history was the introduction of </span><span class="rvts22">Frame Advance</span><span class="rvts20"> a frame-by-frame emulation. Now when you're TASing, the game is constantly being held paused, thus allowing to analyze every in-game aspect separately. Before, even with a strong slowdown the game still appeared as a coherent stream of events. The stream that the player had to perceive as a complex emotional cocktail. And now with frame-by-frame play TASer can mentally isolate any given event of the current frame. This drastically changes the principles of consuming an in-game information. Material world stereotypes don't dictate how to act in the virtual world anymore, and you see the game more objectively, thus finding imperfections and loopholes in its rules.</span></p>
<p class="rvps10"><span class="rvts21">Of course the game still keeps trying to impose typical behavior templates, and they are harder to resist when you're newbie rather than experienced TASer. That's the main reason why a skilled TASer can beat someone's speedrun (even his own old TAS) not because of handling the tools better, but because of "Déformation professionnelle" that helps to notice vulnerabilities in games.</span></p> <p class="rvps7"><span class="rvts20">Of course the game still keeps trying to impose typical behavior templates, and they are harder to resist when you're newbie rather than experienced TASer. That's the main reason why a skilled TASer can beat someone's speedrun (even his own old TAS) not because of handling the tools better, but because of "Déformation professionnelle" that helps to notice vulnerabilities in games.</span></p>
<p class="rvps10"><span class="rvts21">Many more TASing tools were invented since then, but the very way of interaction between a TASer and a game remained the same. Using rerecords, TASer edits Input in the same succession as the flow of in-game time. This linearity of TASing process builds certain limits in TASer's thinking. When you get used to receiving the game reaction on each button press, you involuntarily associate yourself with a game character. This makes it harder to look at the events from an outsider's viewpoint. And yet a TASer is expected to have the most objective point of view possible. Thus we need further transformation of TASer's way of perception.</span></p> <p class="rvps7"><span class="rvts20">Many more TASing tools were invented since then, but the very way of interaction between a TASer and a game remained the same. Using rerecords, TASer edits Input in the same succession as the flow of in-game time. This linearity of TASing process builds certain limits in TASer's thinking. When you get used to receiving the game reaction on each button press, you involuntarily associate yourself with a game character. This makes it harder to look at the events from an outsider's viewpoint. And yet a TASer is expected to have the most objective point of view possible. Thus we need further transformation of TASer's way of perception.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The development of the toolset named "TAS Editor" aims for 2 main goals:</span></p> <p class="rvps7"><span class="rvts20">The development of the toolset named "TAS Editor" aims for 2 main goals:</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ol style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps14"><span class="rvts21">to lower the threshold of joining TASing</span></li> <li value="1" class="rvps9"><span class="rvts20">to lower the threshold of joining TASing</span></li>
<li class="rvps14"><span class="rvts21">to raise the objectivity of gameplay analysis</span></li> <li value="2" class="rvps9"><span class="rvts20">to raise the objectivity of gameplay analysis</span></li>
</ol> </ol>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The first goal is achieved by detailed visualization of all major aspects of TASing.</span></p> <p class="rvps7"><span class="rvts20">The first goal is achieved by detailed visualization of all major aspects of TASing.</span></p>
<p class="rvps10"><span class="rvts21">The second goal is achieved by switching from linear recording of movie segments to non-linear Input editing. The higher level of abstracting from in-game rules is reached by giving the TASer the following new abilities:</span></p> <p class="rvps7"><span class="rvts20">The second goal is achieved by switching from linear recording of movie segments to non-linear Input editing. The higher level of abstracting from in-game rules is reached by giving the TASer the following new abilities:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps15"><span class="rvts0"><span class="rvts21">changing Input in any arbitrary order (not just in the order the events flow in the game) thanks to Piano Roll interface</span></span></li> <li class="rvps10"><span class="rvts0"><span class="rvts20">changing Input in any arbitrary order (not just in the order the events flow in the game) thanks to Piano Roll interface</span></span></li>
<li class="rvps15"><span class="rvts0"><span class="rvts21">watching game events in an arbitrary order (not just frame by frame) thanks to Greenzone</span></span></li> <li class="rvps10"><span class="rvts0"><span class="rvts20">watching game events in an arbitrary order (not just frame by frame) thanks to Greenzone</span></span></li>
<li class="rvps15"><span class="rvts0"><span class="rvts21">emphasizing the Cause-Effect relation between Input and its remote consequences (not just the nearest ones) thanks to Turbo-seeking</span></span></li> <li class="rvps10"><span class="rvts0"><span class="rvts20">emphasizing the Cause-Effect relation between Input and its remote consequences (not just the nearest ones) thanks to Turbo-seeking</span></span></li>
<li class="rvps15"><span class="rvts0"><span class="rvts21">enforcing custom logic of the movie segmentation (not just dividing into TV frames or into in-game levels) thanks to Markers</span></span></li> <li class="rvps10"><span class="rvts0"><span class="rvts20">enforcing custom logic of the movie segmentation (not just dividing into TV frames or into in-game levels) thanks to Markers</span></span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">In addition, TAS Editor 1.0 developed some old TASing tools up to a new level:</span></p> <p class="rvps7"><span class="rvts20">In addition, TAS Editor 1.0 developed some old TASing tools up to a new level:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps14"><span class="rvts21">Lag log evolved from Lag counter</span></li> <li class="rvps9"><span class="rvts20">Lag log evolved from Lag counter</span></li>
<li class="rvps14"><span class="rvts21">Input log evolved from Input Display</span></li> <li class="rvps9"><span class="rvts20">Input log evolved from Input Display</span></li>
<li class="rvps14"><span class="rvts21">step-by-step undo in addition to movie state reloads</span></li> <li class="rvps9"><span class="rvts20">step-by-step undo in addition to movie state reloads</span></li>
<li class="rvps14"><span class="rvts21">inbuilt editor in place of hex-editors and a Notepad</span></li> <li class="rvps9"><span class="rvts20">inbuilt editor in place of hex-editors and a Notepad</span></li>
<li class="rvps14"><span class="rvts21">auto-identification of current logical segment in addition to current frame number display</span></li> <li class="rvps9"><span class="rvts20">auto-identification of current logical segment in addition to current frame number display</span></li>
<li class="rvps14"><span class="rvts21">Selection counter (ruler) in addition to frame counter</span></li> <li class="rvps9"><span class="rvts20">Selection counter (ruler) in addition to frame counter</span></li>
<li class="rvps14"><span class="rvts21">patterns in place of Autofire settings</span></li> <li class="rvps9"><span class="rvts20">patterns in place of Autofire settings</span></li>
<li class="rvps14"><span class="rvts21">Superimpose in place of Auto-hold</span></li> <li class="rvps9"><span class="rvts20">Superimpose in place of Auto-hold</span></li>
</ul> </ul>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p class="rvps14"><span class="rvts21">When launching Taseditor, get ready to control the game from bird's eye view. The following chapters of this tutorial will explain you almost everything a prolific TASer needs to know. If you already have an experience in traditional TASing, some learning aspects should come easier, but some may appear more difficult to you than to a newcomer. Either way, try to finish the whole Guide, and you will likely learn a thing or two about TASing in general.</span></p> <p class="rvps9"><span class="rvts20">When launching Taseditor, get ready to control the game from bird's eye view. The following chapters of this tutorial will explain you almost everything a prolific TASer needs to know. If you already have an experience in traditional TASing, some learning aspects should come easier, but some may appear more difficult to you than to a newcomer. Either way, try to finish the whole Guide, and you will likely learn a thing or two about TASing in general.</span></p>
<p class="rvps14"><span class="rvts21">One of the most unconventional features of TASing with Taseditor is the stress on mouse control. Mouse allows high speed of Input editing and unparalleled convenience of Playback navigation. Even though most of Taseditor functions also have keyboard shortcuts, the comfortable work would be impossible without a mouse.</span></p> <p class="rvps9"><span class="rvts20">One of the most unconventional features of TASing with Taseditor is the stress on mouse control. Mouse allows high speed of Input editing and unparalleled convenience of Playback navigation. Even though most of Taseditor functions also have keyboard shortcuts, the comfortable work would be impossible without a mouse.</span></p>
<p class="rvps14"><span class="rvts21">The gamepad is useful when you need to quickly record an Input without caring about accuracy. But most of his time TASer spends on various manipulations with once created Input. And here the mouse or keyboard becomes much more handy than gamepad. For example, using a key combination you can move any part of Input one frame back or forth. And when you need to adjust the jump height (the duration of holding the </span><span class="rvts29">A</span><span class="rvts21"> button), it's easier to do it with single click, than to switch Recording on and retype the whole range of frames.</span></p> <p class="rvps9"><span class="rvts20">The gamepad is useful when you need to quickly record an Input without caring about accuracy. But most of his time TASer spends on various manipulations with once created Input. And here the mouse or keyboard becomes much more handy than gamepad. For example, using a key combination you can move any part of Input one frame back or forth. And when you need to adjust the jump height (the duration of holding the </span><span class="rvts26">A</span><span class="rvts20"> button), it's easier to do it with single click, than to switch Recording on and retype the whole range of frames.</span></p>
<p class="rvps10"><span class="rvts21">Nevertheless, it's still possible to work in Taseditor the same way people were TASing before. The program interface supports all essential aspects of the traditional TASing method. If you were to use the TAS Editor window only as an informational panel left in a corner of the desktop, you probably would not even notice any difference from usual flow of TASing. It can be good reason to smoothly move from the old method of TASing to the new one. At first you may only like some accessory features of Taseditor, such as the Lag visualization or the Branches Tree. Then you'll need some Input copy/paste, and Taseditor is better alternative to an external editor. After some time you'll notice that direct Input editing turns out faster than rerecording.</span></p> <p class="rvps7"><span class="rvts20">Nevertheless, it's still possible to work in Taseditor the same way people were TASing before. The program interface supports all essential aspects of the traditional TASing method. If you were to use the TAS Editor window only as an informational panel left in a corner of the desktop, you probably would not even notice any difference from usual flow of TASing. It can be good reason to smoothly move from the old method of TASing to the new one. At first you may only like some accessory features of Taseditor, such as the Lag visualization or the Branches Tree. Then you'll need some Input copy/paste, and Taseditor is better alternative to an external editor. After some time you'll notice that direct Input editing turns out faster than rerecording.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/chip-and-dale.png"/></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/chip-and-dale.png"></p>
<p class="rvps10"><span class="rvts21">Advantages of the new method reveal themselves quicker when you're making a TAS controlling 2 and more players simultaneously. In old times people invented plenty of hacks and workarounds to make such kind of TASing easier, e.g. binding several buttons to one key, using "Auto-hold", macros and custom multitracking scripts. Now all of this is irrelevant with Taseditor, because here TASer does not play the role of a gamer that associates himself with the controlled character. Now you are not playing the game, you are meditating over the decomposed continuum of the game, while creating a scenario of events via Input. And thus it's does not matter whether you control 1 character, or 2, or many.</span></p> <p class="rvps7"><span class="rvts20">Advantages of the new method reveal themselves quicker when you're making a TAS controlling 2 and more players simultaneously. In old times people invented plenty of hacks and workarounds to make such kind of TASing easier, e.g. binding several buttons to one key, using "Auto-hold", macros and custom multitracking scripts. Now all of this is irrelevant with Taseditor, because here TASer does not play the role of a gamer that associates himself with the controlled character. Now you are not playing the game, you are meditating over the decomposed continuum of the game, while creating a scenario of events via Input. And thus it's does not matter whether you control 1 character, or 2, or many.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Taseditor was also designed to reduce the rut. There are always lots of tedious recurring activities in TASing. Surely, the program won't save you from the necessity to test all possible branches of gameplay development, but it automates some actions and increases the efficiency in many little things, allowing TASer to keep patience longer than during raw TASing.</span></p> <p class="rvps7"><span class="rvts20">Taseditor was also designed to reduce the rut. There are always lots of tedious recurring activities in TASing. Surely, the program won't save you from the necessity to test all possible branches of gameplay development, but it automates some actions and increases the efficiency in many little things, allowing TASer to keep patience longer than during raw TASing.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Interesting facts:</span></p> <p class="rvps7"><span class="rvts20">Interesting facts:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">During the development of TAS Editor the actual programming took less time than was spent on figuring out the ways to improve the TASing process.</span></li> <li class="rvps7"><span class="rvts20">During the development of TAS Editor the actual programming took less time than was spent on figuring out the ways to improve the TASing process.</span></li>
<li class="rvps10"><span class="rvts21">Most of the actions in Taseditor can be done multiple ways.</span></li> <li class="rvps7"><span class="rvts20">Most of the actions in Taseditor can be done multiple ways.</span></li>
<li class="rvps10"><span class="rvts21">Any operation can be undone and redone.</span></li> <li class="rvps7"><span class="rvts20">Any operation can be undone and redone.</span></li>
<li class="rvps10"><span class="rvts21">You can totally ignore any part of Taseditor's functionality, using only the features you actually like.</span></li> <li class="rvps7"><span class="rvts20">You can totally ignore any part of Taseditor's functionality, using only the features you actually like.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Special attention was paid to user interface. When you gain enough experience, you'll be able to do most of things mechanically, staying focused on the in-game situation analysis.</span></p> <p class="rvps7"><span class="rvts20">Special attention was paid to user interface. When you gain enough experience, you'll be able to do most of things mechanically, staying focused on the in-game situation analysis.</span></p>
<p class="rvps10"><span class="rvts21">If you happen to get a nice idea how to reduce the rut some more, feel free to post on TASVideos forums. Many ideas implemented in TAS Editor were first voiced on these forums as "dream tools".</span></p> <p class="rvps7"><span class="rvts20">If you happen to get a nice idea how to reduce the rut some more, feel free to post on TASVideos forums. Many ideas implemented in TAS Editor were first voiced on these forums as "dream tools".</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Besides the new approach to TASing, Taseditor offers simple means for organization of your working process. Because of unsystematic approach to TASing many newcomers waste their time ineffectively, dissipate the effort and get tired quickly, then start to save the energy by reducing the amount of tests. As a result, they end up with a very suboptimal TAS. Then, as the time goes, they acquire a set of methods and habits, become experienced TASers. But every newbie had to learn by his own mistakes. In this Guide we will try to formulate a clear notion on a methodical TASing (both traditional and new), so that newcomers can realize the essence of the process faster.</span></p> <p class="rvps7"><span class="rvts20">Besides the new approach to TASing, Taseditor offers simple means for organization of your working process. Because of unsystematic approach to TASing many newcomers waste their time ineffectively, dissipate the effort and get tired quickly, then start to save the energy by reducing the amount of tests. As a result, they end up with a very suboptimal TAS. Then, as the time goes, they acquire a set of methods and habits, become experienced TASers. But every newbie had to learn by his own mistakes. In this Guide we will try to formulate a clear notion on a methodical TASing (both traditional and new), so that newcomers can realize the essence of the process faster.</span></p>
<p class="rvps10"><span class="rvts21">Working with Taseditor is pretty similar to an interactive programming using an interpreted language. You just edit the code and instantly see the result of its execution on the screen. TASer can either immediately observe the effect of his interim actions, or he can get carried away by the construction of a code section and watch the result only after the section is finished.</span></p> <p class="rvps7"><span class="rvts20">Working with Taseditor is pretty similar to an interactive programming using an interpreted language. You just edit the code and instantly see the result of its execution on the screen. TASer can either immediately observe the effect of his interim actions, or he can get carried away by the construction of a code section and watch the result only after the section is finished.</span></p>
<p class="rvps10"><span class="rvts21">Programmers have the valuable ability to increase the code readability with comments. It allows to keep more clear picture of the project in mind, and proceed without constant re-inspection of results, because in most cases the result is rather predictable, when the context is known. </span><span class="rvts21">Also, good code readability allows to quickly refresh all necessary memories when you return to a project delayed long ago. Granted that this project was well documented.</span></p> <p class="rvps7"><span class="rvts20">Programmers have the valuable ability to increase the code readability with comments. It allows to keep more clear picture of the project in mind, and proceed without constant re-inspection of results, because in most cases the result is rather predictable, when the context is known. </span><span class="rvts20">Also, good code readability allows to quickly refresh all necessary memories when you return to a project delayed long ago. Granted that this project was well documented.</span></p>
<p class="rvps10"><span class="rvts21">Taseditor encourages documenting of TAS projects on the fly you can write comments, assign clear names to structures (patterns and Input sections), test different code versions in separate branches of the repository (see "Branches Tree") and efficiently work in co-authorship. And no, there's no strict conventions to follow. You set your own rules for when and how to shape your project. For example, if you didn't hesitate to describe a trick used in the first level, in next levels you'll be able to quickly duplicate the trick's Input by several key strokes. If you didn't you'll have to search the trick location manually. In simple TASes you can disregard comments and any long-term plans, but in complicated projects this program functionality should be very appropriate.</span></p> <p class="rvps7"><span class="rvts20">Taseditor encourages documenting of TAS projects on the fly you can write comments, assign clear names to structures (patterns and Input sections), test different code versions in separate branches of the repository (see "Branches Tree") and efficiently work in co-authorship. And no, there's no strict conventions to follow. You set your own rules for when and how to shape your project. For example, if you didn't hesitate to describe a trick used in the first level, in next levels you'll be able to quickly duplicate the trick's Input by several key strokes. If you didn't you'll have to search the trick location manually. In simple TASes you can disregard comments and any long-term plans, but in complicated projects this program functionality should be very appropriate.</span></p>
<p class="rvps10"><a class="rvts27" href="http://tasvideos.org" target="_blank">TASVideos.org</a><span class="rvts21"> site supports uploading and publishing Taseditor projects (.fm3 files), so you can publish not just the TAS movie, but your groundwork as well, encouraging the spirit of openness and mutual aid. If you don't want to share, export the data to .fm2 format and upload that.</span></p> <p class="rvps7"><a class="rvts24" href="http://tasvideos.org" target="_blank">TASVideos.org</a><span class="rvts20"> site supports uploading and publishing Taseditor projects (.fm3 files), so you can publish not just the TAS movie, but your groundwork as well, encouraging the spirit of openness and mutual aid. If you don't want to share, export the data to .fm2 format and upload that.</span></p>
<p class="rvps10"><span class="rvts21">FM3 files are played back by FCEUX emulator since version 2.2.0 the same way as FM2 files. Older versions of FCEUX can also play such files if you change the extension to fm2.</span></p> <p class="rvps7"><span class="rvts20">FM3 files are played back by FCEUX emulator since version 2.2.0 the same way as FM2 files. Older versions of FCEUX can also play such files if you change the extension to fm2.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Next chapter: </span><a class="rvts28" href="ProgramInterface.html">learning the basics of the program usage</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Next chapter: </span><a class="rvts25" href="ProgramInterface.html">learning the basics of the program usage</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/feature-tour/iphone-website-generation">Easily create iPhone documentation</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/feature-tour">Easily create Qt Help files</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,328 +1,495 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>Lua API</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>Lua API</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="Lua API">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="Lua API" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("LuaAPI"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>Lua API</h1>
<div id="topic_breadcrumb">
<a href="Reference.html">Reference</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="Reference.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="Operations.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="FAQ.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="LuaAPI"
data-hnd-context="20"
data-hnd-title="Lua API"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="Reference.html">Reference</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="Reference.html" title="Reference" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="Operations.html" title="Operations" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="FAQ.html" title="FAQ" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Lua API</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Lua API</span></p> <p class="rvps2"><span class="rvts18">Lua API</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="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">TAS Editor v1.0 comes with the library of 24 functions available for Lua scripts running in FCEUX emulator. With Lua scripts you can automate some aspects of TASing and even create your own tools for movie editing.</span></p> <p class="rvps7"><span class="rvts20">TAS Editor v1.0 comes with the library of 24 functions available for Lua scripts running in FCEUX emulator. With Lua scripts you can automate some aspects of TASing and even create your own tools for movie editing.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">In FCEUX folder there's </span><span class="rvts20">/luaScripts</span><span class="rvts21"> folder with </span><span class="rvts20">/taseditor</span><span class="rvts21"> subfolder in it. There you can find examples of scripts using functions of this library.</span></p> <p class="rvps7"><span class="rvts20">In FCEUX folder there's </span><span class="rvts19">/luaScripts</span><span class="rvts20"> folder with </span><span class="rvts19">/taseditor</span><span class="rvts20"> subfolder in it. There you can find examples of scripts using functions of this library.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If you don't know how to make and run Lua scripts in emulators, read </span><a class="rvts27" href="AdvancedFeatures.html#UsingLua">Advanced Features</a><span class="rvts21"> and also refer to </span><a class="rvts27" href="http://www.fceux.com/web/help/fceux.html?Commands.html" target="_blank">FCEUX Help</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">If you don't know how to make and run Lua scripts in emulators, read </span><a class="rvts24" href="AdvancedFeatures.html#UsingLua">Advanced Features</a><span class="rvts20"> and also refer to </span><a class="rvts24" href="http://www.fceux.com/web/help/fceux.html?Commands.html" target="_blank">FCEUX Help</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps3"><span class="rvts7">Full list of functions:</span></p> <p class="rvps2"><span class="rvts7">Full list of functions:</span></p>
<p class="rvps2"><span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#registerauto">taseditor.registerauto(function func)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#registerauto">taseditor.registerauto(function func)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#registermanual">taseditor.registermanual(function func, [string name])</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#registermanual">taseditor.registermanual(function func, [string name])</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#engaged">bool taseditor.engaged()</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#engaged">bool taseditor.engaged()</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#markedframe">bool taseditor.markedframe(int frame)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#markedframe">bool taseditor.markedframe(int frame)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#getmarker">int taseditor.getmarker(int frame)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#getmarker">int taseditor.getmarker(int frame)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#setmarker">int taseditor.setmarker(int frame)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#setmarker">int taseditor.setmarker(int frame)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#removemarker">taseditor.removemarker(int frame)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#removemarker">taseditor.removemarker(int frame)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#getnote">string taseditor.getnote(int index)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#getnote">string taseditor.getnote(int index)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#setnote">taseditor.setnote(int index, string newtext)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#setnote">taseditor.setnote(int index, string newtext)</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#getcurrentbranch">int taseditor.getcurrentbranch()</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#getcurrentbranch">int taseditor.getcurrentbranch()</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#getrecordermode">string taseditor.getrecordermode()</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#getrecordermode">string taseditor.getrecordermode()</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#getsuperimpose">int taseditor.getsuperimpose()</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#getsuperimpose">int taseditor.getsuperimpose()</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#getlostplayback">int taseditor.getlostplayback()</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#getlostplayback">int taseditor.getlostplayback()</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#getplaybacktarget">int taseditor.getplaybacktarget()</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#getplaybacktarget">int taseditor.getplaybacktarget()</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#setplayback">taseditor.setplayback(int frame)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#setplayback">taseditor.setplayback(int frame)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#stopseeking">taseditor.stopseeking()</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#stopseeking">taseditor.stopseeking()</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#getselection">table taseditor.getselection()</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#getselection">table taseditor.getselection()</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#setselection">taseditor.setselection(table new_set)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#setselection">taseditor.setselection(table new_set)</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#getinput">int taseditor.getinput(int frame, int joypad)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#getinput">int taseditor.getinput(int frame, int joypad)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#submitinputchange">taseditor.submitinputchange(int frame, int joypad, int input)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#submitinputchange">taseditor.submitinputchange(int frame, int joypad, int input)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#submitinsertframes">taseditor.submitinsertframes(int frame, int number)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#submitinsertframes">taseditor.submitinsertframes(int frame, int number)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#submitdeleteframes">taseditor.submitdeleteframes(int frame, int number)</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#submitdeleteframes">taseditor.submitdeleteframes(int frame, int number)</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#applyinputchanges">int taseditor.applyinputchanges([string name])</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#applyinputchanges">int taseditor.applyinputchanges([string name])</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#clearinputchanges">taseditor.clearinputchanges()</a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#clearinputchanges">taseditor.clearinputchanges()</a></p>
<p class="rvps10"><a class="rvts27" href="LuaAPI.html#clearinputchanges"><br/></a></p> <p class="rvps7"><a class="rvts24" href="LuaAPI.html#clearinputchanges"><br/></a></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="registerauto"></a> <p class="rvps7"><a name="registerauto"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts61">taseditor.registerauto(function func)</span></p>
<p class="rvps9"><span class="rvts68">taseditor.registerauto(function func)</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Registers a callback function ("Auto Function") that runs periodically. The Auto Function can be registered and will be called even when TAS Editor isn't engaged.</span></p>
<p class="rvps10"><span class="rvts21">Registers a callback function ("Auto Function") that runs periodically. The Auto Function can be registered and will be called even when TAS Editor isn't engaged.</span></p> <p class="rvps7"><span class="rvts20">When FCEUX is unpaused, your function will be called at the end of every frame (running 60 times per second on NTSC and 50 times per second on PAL).</span></p>
<p class="rvps10"><span class="rvts21">When FCEUX is unpaused, your function will be called at the end of every frame (running 60 times per second on NTSC and 50 times per second on PAL).</span></p> <p class="rvps7"><span class="rvts20">When FCEUX is paused, your function will be called 20 times per second.</span></p>
<p class="rvps10"><span class="rvts21">When FCEUX is paused, your function will be called 20 times per second.</span></p> <p class="rvps7"><span class="rvts20">User can switch on/off auto-calling by checking "Auto function" checkbox in TAS Editor GUI.</span></p>
<p class="rvps10"><span class="rvts21">User can switch on/off auto-calling by checking "Auto function" checkbox in TAS Editor GUI.</span></p> <p class="rvps7"><span class="rvts20">Like other callback-registering functions provided by FCEUX, there is only one registered callback at a time per registering function per script. If you register two callbacks, the second one will replace the first, and the call to </span><span class="rvts19">taseditor.registerauto()</span><span class="rvts20"> will return the old callback. You may register </span><span class="rvts63">nil</span><span class="rvts20"> instead of a function to clear a previously-registered callback.</span></p>
<p class="rvps10"><span class="rvts21">Like other callback-registering functions provided by FCEUX, there is only one registered callback at a time per registering function per script. If you register two callbacks, the second one will replace the first, and the call to </span><span class="rvts20">taseditor.registerauto()</span><span class="rvts21"> will return the old callback. You may register </span><span class="rvts71">nil</span><span class="rvts21"> instead of a function to clear a previously-registered callback.</span></p> <p class="rvps7"><span class="rvts20">If a script returns while it still has registered callbacks, FCEUX will keep it alive to call those callbacks when appropriate, until either the script is stopped by the user or all of the callbacks are de-registered.</span></p>
<p class="rvps10"><span class="rvts21">If a script returns while it still has registered callbacks, FCEUX will keep it alive to call those callbacks when appropriate, until either the script is stopped by the user or all of the callbacks are de-registered.</span></p> <p class="rvps7"><a name="registermanual"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="registermanual"></a> <p class="rvps2"><span class="rvts61">taseditor.registermanual(function func, [string name])</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps9"><span class="rvts68">taseditor.registermanual(function func, [string name])</span></p> <p class="rvps7"><span class="rvts20">Registers a callback function ("Manual Function") that can be called manually by TAS Editor user. The function can be registered even when TAS Editor isn't engaged.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The Manual function doesn't depend on paused or unpaused FCEUX status. It will be called once every time user presses </span><span class="rvts26">Run function</span><span class="rvts20"> button in TAS Editor GUI.</span></p>
<p class="rvps10"><span class="rvts21">Registers a callback function ("Manual Function") that can be called manually by TAS Editor user. The function can be registered even when TAS Editor isn't engaged.</span></p> <p class="rvps7"><span class="rvts20">You can provide a new name for this button.</span></p>
<p class="rvps10"><span class="rvts21">The Manual function doesn't depend on paused or unpaused FCEUX status. It will be called once every time user presses </span><span class="rvts29">Run function</span><span class="rvts21"> button in TAS Editor GUI.</span></p> <p class="rvps7"><span class="rvts20">The Manual function cannot be run more often than TAS Editor window updates (60/50 FPS or 20FPS when emulator is paused).</span></p>
<p class="rvps10"><span class="rvts21">You can provide a new name for this button.</span></p> <p class="rvps7"><span class="rvts20">In FCEUX code Manual function runs right after Auto Function.</span></p>
<p class="rvps10"><span class="rvts21">The Manual function cannot be run more often than TAS Editor window updates (60/50 FPS or 20FPS when emulator is paused).</span></p> <p class="rvps7"><span class="rvts20">You can use this feature to create new tools for TAS Editor. For example, you can write a script that reverses currently selected input, so user will be able to reverse input by selecting a range and clicking </span><span class="rvts26">Run function</span><span class="rvts20"> button.</span></p>
<p class="rvps10"><span class="rvts21">In FCEUX code Manual function runs right after Auto Function.</span></p> <p class="rvps7"><span class="rvts20">Like other callback-registering functions provided by FCEUX, there is only one registered callback at a time per registering function per script. If you register two callbacks, the second one will replace the first, and the call to </span><span class="rvts19">taseditor.registermanual()</span><span class="rvts20"> will return the old callback. You may call </span><span class="rvts19">taseditor.registermanual(</span><span class="rvts63">nil</span><span class="rvts19">)</span><span class="rvts20"> to clear a previously-registered callback.</span></p>
<p class="rvps10"><span class="rvts21">You can use this feature to create new tools for TAS Editor. For example, you can write a script that reverses currently selected input, so user will be able to reverse input by selecting a range and clicking </span><span class="rvts29">Run function</span><span class="rvts21"> button.</span></p> <p class="rvps7"><span class="rvts20">If a script returns while it still has registered callbacks, FCEUX will keep it alive to call those callbacks when appropriate, until either the script is stopped by the user or all of the callbacks are de-registered.</span></p>
<p class="rvps10"><span class="rvts21">Like other callback-registering functions provided by FCEUX, there is only one registered callback at a time per registering function per script. If you register two callbacks, the second one will replace the first, and the call to </span><span class="rvts20">taseditor.registermanual()</span><span class="rvts21"> will return the old callback. You may call </span><span class="rvts20">taseditor.registermanual(</span><span class="rvts71">nil</span><span class="rvts20">)</span><span class="rvts21"> to clear a previously-registered callback.</span></p> <p class="rvps7"><a name="engaged"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If a script returns while it still has registered callbacks, FCEUX will keep it alive to call those callbacks when appropriate, until either the script is stopped by the user or all of the callbacks are de-registered.</span></p> <p class="rvps2"><span class="rvts61">bool taseditor.engaged()</span></p>
<p class="rvps10"><a name="engaged"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Returns </span><span class="rvts63">true</span><span class="rvts20"> if TAS Editor is currently engaged, </span><span class="rvts63">false</span><span class="rvts20"> if otherwise.</span></p>
<p class="rvps9"><span class="rvts68">bool taseditor.engaged()</span></p> <p class="rvps7"><span class="rvts20">Also when TAS Editor is engaged, </span><span class="rvts19">movie.mode()</span><span class="rvts20"> returns "taseditor" string.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><a name="markedframe"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Returns </span><span class="rvts71">true</span><span class="rvts21"> if TAS Editor is currently engaged, </span><span class="rvts71">false</span><span class="rvts21"> if otherwise.</span></p> <p class="rvps2"><span class="rvts61">bool taseditor.markedframe(int frame)</span></p>
<p class="rvps10"><span class="rvts21">Also when TAS Editor is engaged, </span><span class="rvts20">movie.mode()</span><span class="rvts21"> returns "taseditor" string.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="markedframe"></a> <p class="rvps7"><span class="rvts20">Returns </span><span class="rvts63">true</span><span class="rvts20"> if given frame is marked in TAS Editor, </span><span class="rvts63">false</span><span class="rvts20"> if not marked.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, returns </span><span class="rvts63">false</span><span class="rvts20">.</span></p>
<p class="rvps9"><span class="rvts68">bool taseditor.markedframe(int frame)</span></p> <p class="rvps7"><a name="getmarker"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts61">int taseditor.getmarker(int frame)</span></p>
<p class="rvps10"><span class="rvts21">Returns </span><span class="rvts71">true</span><span class="rvts21"> if given frame is marked in TAS Editor, </span><span class="rvts71">false</span><span class="rvts21"> if not marked.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, returns </span><span class="rvts71">false</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Returns index number of the Marker under which given frame is located.</span></p>
<p class="rvps10"><a name="getmarker"></a> <p class="rvps7"><span class="rvts20">Returns -1 if TAS Editor is not engaged.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><a name="setmarker"></a><span class="rvts20"><br/></span></p>
<p class="rvps9"><span class="rvts68">int taseditor.getmarker(int frame)</span></p> <p class="rvps2"><span class="rvts61">int taseditor.setmarker(int frame)</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Returns index number of the Marker under which given frame is located.</span></p> <p class="rvps7"><span class="rvts20">Sets Marker on given frame. Returns index number of the Marker created.</span></p>
<p class="rvps10"><span class="rvts21">Returns -1 if TAS Editor is not engaged.</span></p> <p class="rvps7"><span class="rvts20">If that frame is already marked, no changes will be made, and the function will return the index number of existing Marker.</span></p>
<p class="rvps10"><a name="setmarker"></a> <p class="rvps7"><span class="rvts20">You can set markers even outside input range.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, returns -1.</span></p>
<p class="rvps9"><span class="rvts68">int taseditor.setmarker(int frame)</span></p> <p class="rvps7"><a name="removemarker"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts61">taseditor.removemarker(int frame)</span></p>
<p class="rvps10"><span class="rvts21">Sets Marker on given frame. Returns index number of the Marker created.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If that frame is already marked, no changes will be made, and the function will return the index number of existing Marker.</span></p> <p class="rvps7"><span class="rvts20">Removes marker from given frame. If that frame was not marked, no changes will be made.</span></p>
<p class="rvps10"><span class="rvts21">You can set markers even outside input range.</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, no changes will be made.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, returns -1.</span></p> <p class="rvps7"><a name="getnote"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="removemarker"></a> <p class="rvps2"><span class="rvts61">string taseditor.getnote(int index)</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps9"><span class="rvts68">taseditor.removemarker(int frame)</span></p> <p class="rvps7"><span class="rvts20">Returns string representing the Note of given Marker.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Returns </span><span class="rvts63">nil</span><span class="rvts20"> if TAS Editor is not engaged.</span></p>
<p class="rvps10"><span class="rvts21">Removes marker from given frame. If that frame was not marked, no changes will be made.</span></p> <p class="rvps7"><span class="rvts20">If given index is invalid (if Marker with this index number doesn't exist), returns note of the zeroth marker.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, no changes will be made.</span></p> <p class="rvps7"><a name="setnote"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="getnote"></a> <p class="rvps2"><span class="rvts61">taseditor.setnote(int index, string newtext)</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps9"><span class="rvts68">string taseditor.getnote(int index)</span></p> <p class="rvps7"><span class="rvts20">Sets text of the Note of given Marker.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If given index is invalid (if Marker with this index number doesn't exist), no changes will be made.</span></p>
<p class="rvps10"><span class="rvts21">Returns string representing the Note of given Marker.</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, no changes will be made.</span></p>
<p class="rvps10"><span class="rvts21">Returns </span><span class="rvts71">nil</span><span class="rvts21"> if TAS Editor is not engaged.</span></p> <p class="rvps7"><a name="getcurrentbranch"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If given index is invalid (if Marker with this index number doesn't exist), returns note of the zeroth marker.</span></p> <p class="rvps2"><span class="rvts61">int taseditor.getcurrentbranch()</span></p>
<p class="rvps10"><a name="setnote"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Returns number from 0 to 9 representing current Branch.</span></p>
<p class="rvps9"><span class="rvts68">taseditor.setnote(int index, string newtext)</span></p> <p class="rvps7"><span class="rvts20">Returns -1 if there's no Branches or if TAS Editor is not engaged.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><a name="getrecordermode"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Sets text of the Note of given Marker.</span></p> <p class="rvps2"><span class="rvts61">string taseditor.getrecordermode()</span></p>
<p class="rvps10"><span class="rvts21">If given index is invalid (if Marker with this index number doesn't exist), no changes will be made.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, no changes will be made.</span></p> <p class="rvps7"><span class="rvts20">Returns string representing current recorder mode.</span></p>
<p class="rvps10"><a name="getcurrentbranch"></a> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<span class="rvts21"><br/></span></p> <li class="rvps7"><span class="rvts20">"All"</span></li>
<p class="rvps9"><span class="rvts68">int taseditor.getcurrentbranch()</span></p> <li class="rvps7"><span class="rvts20">"1P"</span></li>
<p class="rvps10"><span class="rvts21"><br/></span></p> <li class="rvps7"><span class="rvts20">"2P"</span></li>
<p class="rvps10"><span class="rvts21">Returns number from 0 to 9 representing current Branch.</span></p> <li class="rvps7"><span class="rvts20">"3P"</span></li>
<p class="rvps10"><span class="rvts21">Returns -1 if there's no Branches or if TAS Editor is not engaged.</span></p> <li class="rvps7"><span class="rvts20">"4P"</span></li>
<p class="rvps10"><a name="getrecordermode"></a>
<span class="rvts21"><br/></span></p>
<p class="rvps9"><span class="rvts68">string taseditor.getrecordermode()</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21">Returns string representing current recorder mode.</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts21">"All"</span></li>
<li class="rvps10"><span class="rvts21">"1P"</span></li>
<li class="rvps10"><span class="rvts21">"2P"</span></li>
<li class="rvps10"><span class="rvts21">"3P"</span></li>
<li class="rvps10"><span class="rvts21">"4P"</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21">Returns </span><span class="rvts71">nil</span><span class="rvts21"> if TAS Editor is not engaged.</span></p> <p class="rvps7"><span class="rvts20">Returns </span><span class="rvts63">nil</span><span class="rvts20"> if TAS Editor is not engaged.</span></p>
<p class="rvps10"><span class="rvts21">When you want to check Recorder's read-only state, use </span><span class="rvts20">emu.readonly()</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">When you want to check Recorder's read-only state, use </span><span class="rvts19">emu.readonly()</span><span class="rvts20">.</span></p>
<p class="rvps10"><a name="getsuperimpose"></a> <p class="rvps7"><a name="getsuperimpose"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts61">int taseditor.getsuperimpose()</span></p>
<p class="rvps9"><span class="rvts68">int taseditor.getsuperimpose()</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Returns number representing current state of Superimpose checkbox in TAS Editor GUI.</span></p>
<p class="rvps10"><span class="rvts21">Returns number representing current state of Superimpose checkbox in TAS Editor GUI.</span></p> <p class="rvps7"><span class="rvts20">0 unchecked</span></p>
<p class="rvps10"><span class="rvts21">0 unchecked</span></p> <p class="rvps7"><span class="rvts20">1 checked</span></p>
<p class="rvps10"><span class="rvts21">1 checked</span></p> <p class="rvps7"><span class="rvts20">2 indeterminate (you can interpret is as half-checked)</span></p>
<p class="rvps10"><span class="rvts21">2 indeterminate (you can interpret is as half-checked)</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, returns -1.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, returns -1.</span></p> <p class="rvps7"><a name="getlostplayback"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="getlostplayback"></a> <p class="rvps2"><span class="rvts61">int taseditor.getlostplayback()</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps9"><span class="rvts68">int taseditor.getlostplayback()</span></p> <p class="rvps7"><span class="rvts20">Returns the number of the frame where Playback cursor was before input was changed.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If Playback didn't lose position during Greenzone invalidation, returns -1.</span></p>
<p class="rvps10"><span class="rvts21">Returns the number of the frame where Playback cursor was before input was changed.</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, returns -1.</span></p>
<p class="rvps10"><span class="rvts21">If Playback didn't lose position during Greenzone invalidation, returns -1.</span></p> <p class="rvps7"><a name="getplaybacktarget"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, returns -1.</span></p> <p class="rvps2"><span class="rvts61">int taseditor.getplaybacktarget()</span></p>
<p class="rvps10"><a name="getplaybacktarget"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If TAS Editor's Playback is currently seeking, returns number of target frame.</span></p>
<p class="rvps9"><span class="rvts68">int taseditor.getplaybacktarget()</span></p> <p class="rvps7"><span class="rvts20">If Playback is not seeking or if TAS Editor is not engaged, returns -1.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><a name="setplayback"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor's Playback is currently seeking, returns number of target frame.</span></p> <p class="rvps2"><span class="rvts61">taseditor.setplayback(int frame)</span></p>
<p class="rvps10"><span class="rvts21">If Playback is not seeking or if TAS Editor is not engaged, returns -1.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="setplayback"></a> <p class="rvps7"><span class="rvts20">Sends Playback cursor (current frame counter) to given frame.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If given frame wasn't found in TAS Editor Greenzone, starts seeking to the frame.</span></p>
<p class="rvps9"><span class="rvts68">taseditor.setplayback(int frame)</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, nothing will be done.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><a name="stopseeking"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Sends Playback cursor (current frame counter) to given frame.</span></p> <p class="rvps2"><span class="rvts61">taseditor.stopseeking()</span></p>
<p class="rvps10"><span class="rvts21">If given frame wasn't found in TAS Editor Greenzone, starts seeking to the frame.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, nothing will be done.</span></p> <p class="rvps7"><span class="rvts20">Stops Playback seeking and pauses emulation.</span></p>
<p class="rvps10"><a name="stopseeking"></a> <p class="rvps7"><span class="rvts20">If Playback wasn't seeking, this function only pauses emulation.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, nothing will be done.</span></p>
<p class="rvps9"><span class="rvts68">taseditor.stopseeking()</span></p> <p class="rvps7"><a name="getselection"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts61">table taseditor.getselection()</span></p>
<p class="rvps10"><span class="rvts21">Stops Playback seeking and pauses emulation.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If Playback wasn't seeking, this function only pauses emulation.</span></p> <p class="rvps7"><span class="rvts20">Returns a table (array) containing numbers of currently selected frames. These numbers are sorted in ascending order.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, nothing will be done.</span></p> <p class="rvps7"><span class="rvts20">If no frames are selected at the moment, returns </span><span class="rvts63">nil</span><span class="rvts20">.</span></p>
<p class="rvps10"><a name="getselection"></a> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, returns </span><span class="rvts63">nil</span><span class="rvts20">.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><a name="setselection"></a><span class="rvts20"><br/></span></p>
<p class="rvps9"><span class="rvts68">table taseditor.getselection()</span></p> <p class="rvps2"><span class="rvts61">taseditor.setselection(table new_set)</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Returns a table (array) containing numbers of currently selected frames. These numbers are sorted in ascending order.</span></p> <p class="rvps7"><span class="rvts20">Changes current selection to the given set of frames. Frame number in your table don't have to be sorted.</span></p>
<p class="rvps10"><span class="rvts21">If no frames are selected at the moment, returns </span><span class="rvts71">nil</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Call </span><span class="rvts19">taseditor.setselection(</span><span class="rvts63">nil</span><span class="rvts19">)</span><span class="rvts20"> to clear selection.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, returns </span><span class="rvts71">nil</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, nothing will be done.</span></p>
<p class="rvps10"><a name="setselection"></a> <p class="rvps7"><a name="getinput"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts61">int taseditor.getinput(int frame, int joypad)</span></p>
<p class="rvps9"><span class="rvts68">taseditor.setselection(table new_set)</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Returns a number representing input of given joypad stored in current movie at given frame.</span></p>
<p class="rvps10"><span class="rvts21">Changes current selection to the given set of frames. Frame number in your table don't have to be sorted.</span></p> <p class="rvps7"><span class="rvts20">If given frame is negative, returns -1.</span></p>
<p class="rvps10"><span class="rvts21">Call </span><span class="rvts20">taseditor.setselection(</span><span class="rvts71">nil</span><span class="rvts20">)</span><span class="rvts21"> to clear selection.</span></p> <p class="rvps7"><span class="rvts20">If given frame is outside current input range, returns 0, which can be interpreted as a blank frame (no buttons pressed at this frame yet).</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, nothing will be done.</span></p> <p class="rvps7"><span class="rvts20">Joypad value must be one of the following:</span></p>
<p class="rvps10"><a name="getinput"></a> <p class="rvps7"><span class="rvts20">0 </span><span class="rvts20">to get hardware commands (bit 0 = reset, bit 1 = poweron, bit 2 = FDS insert disk, bit 3 = FDS switch side)</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">1 </span><span class="rvts20">to get 1P buttons</span><span class="rvts20"> (</span><span class="rvts20">bit</span><span class="rvts20"> 0 = A, </span><span class="rvts20">bit</span><span class="rvts20"> 1 = B, </span><span class="rvts20">bit</span><span class="rvts20"> 2 = Select, </span><span class="rvts20">bit</span><span class="rvts20"> 3 = Start, </span><span class="rvts20">bit</span><span class="rvts20"> 4 = Up, </span><span class="rvts20">bit</span><span class="rvts20"> 5 = Down, </span><span class="rvts20">bit</span><span class="rvts20"> 6 = Left, </span><span class="rvts20">bit</span><span class="rvts20"> 7 = Right)</span></p>
<p class="rvps9"><span class="rvts68">int taseditor.getinput(int frame, int joypad)</span></p> <p class="rvps7"><span class="rvts20">2 </span><span class="rvts20">to get 2P buttons</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">3 </span><span class="rvts20">to get 3P buttons</span></p>
<p class="rvps10"><span class="rvts21">Returns a number representing input of given joypad stored in current movie at given frame.</span></p> <p class="rvps7"><span class="rvts20">4 </span><span class="rvts20">to get 4P buttons</span></p>
<p class="rvps10"><span class="rvts21">If given frame is negative, returns -1.</span></p> <p class="rvps7"><span class="rvts20">You should handle returned number (if it's not equal to -1) as a byte, each bit corresponds to one button (e.g. if bit 1 is set that means A button is pressed). Use Bitwise Operations to retrieve the state of specific buttons.</span></p>
<p class="rvps10"><span class="rvts21">If given frame is outside current input range, returns 0, which can be interpreted as a blank frame (no buttons pressed at this frame yet).</span></p> <p class="rvps7"><span class="rvts20">If given joypad is outside [0-4] range, returns -1.</span></p>
<p class="rvps10"><span class="rvts21">Joypad value must be one of the following:</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, returns -1.</span></p>
<p class="rvps10"><span class="rvts21">0 </span><span class="rvts21">to get hardware commands (bit 0 = reset, bit 1 = poweron, bit 2 = FDS insert disk, bit 3 = FDS switch side)</span></p> <p class="rvps7"><a name="submitinputchange"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">1 </span><span class="rvts21">to get 1P buttons</span><span class="rvts21"> (</span><span class="rvts21">bit</span><span class="rvts21"> 0 = A, </span><span class="rvts21">bit</span><span class="rvts21"> 1 = B, </span><span class="rvts21">bit</span><span class="rvts21"> 2 = Select, </span><span class="rvts21">bit</span><span class="rvts21"> 3 = Start, </span><span class="rvts21">bit</span><span class="rvts21"> 4 = Up, </span><span class="rvts21">bit</span><span class="rvts21"> 5 = Down, </span><span class="rvts21">bit</span><span class="rvts21"> 6 = Left, </span><span class="rvts21">bit</span><span class="rvts21"> 7 = Right)</span></p> <p class="rvps2"><span class="rvts61">taseditor.submitinputchange(int frame, int joypad, int input)</span></p>
<p class="rvps10"><span class="rvts21">2 </span><span class="rvts21">to get 2P buttons</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">3 </span><span class="rvts21">to get 3P buttons</span></p> <p class="rvps7"><span class="rvts20">Sends request to TAS Editor asking to change input of given joypad at given frame.</span></p>
<p class="rvps10"><span class="rvts21">4 </span><span class="rvts21">to get 4P buttons</span></p> <p class="rvps7"><span class="rvts20">Actual movie input won't be changed until the moment you call </span><span class="rvts19">taseditor.applyinputchanges()</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">You should handle returned number (if it's not equal to -1) as a byte, each bit corresponds to one button (e.g. if bit 1 is set that means A button is pressed). Use Bitwise Operations to retrieve the state of specific buttons.</span></p> <p class="rvps7"><span class="rvts20">Using several consecutive requests and then calling </span><span class="rvts19">applyinputchanges()</span><span class="rvts20"> at the end, you can change several frames of current movie in one moment.</span></p>
<p class="rvps10"><span class="rvts21">If given joypad is outside [0-4] range, returns -1.</span></p> <p class="rvps7"><span class="rvts20">When applying the pile of requests, TAS Editor will execute them in consecutive order.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, returns -1.</span></p> <p class="rvps7"><span class="rvts20">If given frame is negative, TAS Editor will ignore such request.</span></p>
<p class="rvps10"><a name="submitinputchange"></a> <p class="rvps7"><span class="rvts20">If given frame is outside current input range, TAS Editor will expand movie during </span><span class="rvts19">applyinputchanges()</span><span class="rvts20"> to fit the frame.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If given joypad is outside [0-4] range, TAS Editor will ignore such request.</span></p>
<p class="rvps9"><span class="rvts68">taseditor.submitinputchange(int frame, int joypad, int input)</span></p> <p class="rvps7"><span class="rvts20">Given input will be treated by TAS Editor as a sequence of bits representing state of each button of given joypad </span><span class="rvts20">(</span><span class="rvts20">bit</span><span class="rvts20"> 0 = A, </span><span class="rvts20">bit</span><span class="rvts20"> 1 = B, </span><span class="rvts20">bit</span><span class="rvts20"> 2 = Select, </span><span class="rvts20">bit</span><span class="rvts20"> 3 = Start, </span><span class="rvts20">bit</span><span class="rvts20"> 4 = Up, </span><span class="rvts20">bit</span><span class="rvts20"> 5 = Down, </span><span class="rvts20">bit</span><span class="rvts20"> 6 = Left, </span><span class="rvts20">bit</span><span class="rvts20"> 7 = Right)</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, nothing will be done.</span></p>
<p class="rvps10"><span class="rvts21">Sends request to TAS Editor asking to change input of given joypad at given frame.</span></p> <p class="rvps7"><a name="submitinsertframes"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Actual movie input won't be changed until the moment you call </span><span class="rvts20">taseditor.applyinputchanges()</span><span class="rvts21">.</span></p> <p class="rvps2"><span class="rvts61">taseditor.submitinsertframes(int frame, int number)</span></p>
<p class="rvps10"><span class="rvts21">Using several consecutive requests and then calling </span><span class="rvts20">applyinputchanges()</span><span class="rvts21"> at the end, you can change several frames of current movie in one moment.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When applying the pile of requests, TAS Editor will execute them in consecutive order.</span></p> <p class="rvps7"><span class="rvts20">Sends request to TAS Editor asking to insert given number of blank frames before given frame.</span></p>
<p class="rvps10"><span class="rvts21">If given frame is negative, TAS Editor will ignore such request.</span></p> <p class="rvps7"><span class="rvts20">Actual movie won't be changed until the moment you call </span><span class="rvts19">taseditor.applyinputchanges()</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">If given frame is outside current input range, TAS Editor will expand movie during </span><span class="rvts20">applyinputchanges()</span><span class="rvts21"> to fit the frame.</span></p> <p class="rvps7"><span class="rvts20">Insertion can move down some old input and Markers (if "</span><a class="rvts24" href="ProgramCustomization.html#BindMarkerstoInput">Bind Markers to Input</a><span class="rvts20">" option is checked by user).</span></p>
<p class="rvps10"><span class="rvts21">If given joypad is outside [0-4] range, TAS Editor will ignore such request.</span></p> <p class="rvps7"><span class="rvts20">If given number is less or equal to zero, TAS Editor will ignore such request.</span></p>
<p class="rvps10"><span class="rvts21">Given input will be treated by TAS Editor as a sequence of bits representing state of each button of given joypad </span><span class="rvts21">(</span><span class="rvts21">bit</span><span class="rvts21"> 0 = A, </span><span class="rvts21">bit</span><span class="rvts21"> 1 = B, </span><span class="rvts21">bit</span><span class="rvts21"> 2 = Select, </span><span class="rvts21">bit</span><span class="rvts21"> 3 = Start, </span><span class="rvts21">bit</span><span class="rvts21"> 4 = Up, </span><span class="rvts21">bit</span><span class="rvts21"> 5 = Down, </span><span class="rvts21">bit</span><span class="rvts21"> 6 = Left, </span><span class="rvts21">bit</span><span class="rvts21"> 7 = Right)</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">If given frame is negative, TAS Editor will ignore such request.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, nothing will be done.</span></p> <p class="rvps7"><span class="rvts20">If given frame is outside current input range, TAS Editor will expand movie during </span><span class="rvts19">applyinputchanges()</span><span class="rvts20"> to fit the frame.</span></p>
<p class="rvps10"><a name="submitinsertframes"></a> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, nothing will be done.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><a name="submitdeleteframes"></a><span class="rvts20"><br/></span></p>
<p class="rvps9"><span class="rvts68">taseditor.submitinsertframes(int frame, int number)</span></p> <p class="rvps2"><span class="rvts61">taseditor.submitdeleteframes(int frame, int number)</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Sends request to TAS Editor asking to insert given number of blank frames before given frame.</span></p> <p class="rvps7"><span class="rvts20">Sends request to TAS Editor asking to delete given number of frames starting from given frame.</span></p>
<p class="rvps10"><span class="rvts21">Actual movie won't be changed until the moment you call </span><span class="rvts20">taseditor.applyinputchanges()</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Actual movie won't be changed until the moment you call </span><span class="rvts19">taseditor.applyinputchanges()</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">Insertion can move down some old input and Markers (if "</span><a class="rvts27" href="ProgramCustomization.html#BindMarkerstoInput">Bind Markers to Input</a><span class="rvts21">" option is checked by user).</span></p> <p class="rvps7"><span class="rvts20">Deletion can move up some old input and Markers (if "</span><a class="rvts24" href="ProgramCustomization.html#BindMarkerstoInput">Bind Markers to Input</a><span class="rvts20">" option is checked by user).</span></p>
<p class="rvps10"><span class="rvts21">If given number is less or equal to zero, TAS Editor will ignore such request.</span></p> <p class="rvps7"><span class="rvts20">If given number is less or equal to zero, TAS Editor will ignore such request.</span></p>
<p class="rvps10"><span class="rvts21">If given frame is negative, TAS Editor will ignore such request.</span></p> <p class="rvps7"><span class="rvts20">If given frame is negative, TAS Editor will ignore such request.</span></p>
<p class="rvps10"><span class="rvts21">If given frame is outside current input range, TAS Editor will expand movie during </span><span class="rvts20">applyinputchanges()</span><span class="rvts21"> to fit the frame.</span></p> <p class="rvps7"><span class="rvts20">If given frame is outside current input range, TAS Editor will expand movie during </span><span class="rvts19">applyinputchanges()</span><span class="rvts20"> to fit the frame.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, nothing will be done.</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, nothing will be done.</span></p>
<p class="rvps10"><a name="submitdeleteframes"></a> <p class="rvps7"><a name="applyinputchanges"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts61">int taseditor.applyinputchanges([string name])</span></p>
<p class="rvps9"><span class="rvts68">taseditor.submitdeleteframes(int frame, int number)</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Instantly applies the list of previously requested changes to current movie. If these requests actually modified movie data, new item will appear in History Log (so user can undo these changes), and Greenzone may become truncated, Playback cursor may lose its position, auto-seeking may be triggered.</span></p>
<p class="rvps10"><span class="rvts21">Sends request to TAS Editor asking to delete given number of frames starting from given frame.</span></p> <p class="rvps7"><span class="rvts20">Returns number of frame where first actual changes occurred.</span></p>
<p class="rvps10"><span class="rvts21">Actual movie won't be changed until the moment you call </span><span class="rvts20">taseditor.applyinputchanges()</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">If no actual changes were found (for example, you asked TAS Editor to set buttons that were already pressed), returns -1.</span></p>
<p class="rvps10"><span class="rvts21">Deletion can move up some old input and Markers (if "</span><a class="rvts27" href="ProgramCustomization.html#BindMarkerstoInput">Bind Markers to Input</a><span class="rvts21">" option is checked by user).</span></p> <p class="rvps7"><span class="rvts20">If pending list of changes is empty, returns -1.</span></p>
<p class="rvps10"><span class="rvts21">If given number is less or equal to zero, TAS Editor will ignore such request.</span></p> <p class="rvps7"><span class="rvts20">You can provide a name that will be assigned to this change. This name will be shown in History Log. If you don't provide a name, TAS Editor will use default name ("Change").</span></p>
<p class="rvps10"><span class="rvts21">If given frame is negative, TAS Editor will ignore such request.</span></p> <p class="rvps7"><span class="rvts20">After applying all requests TAS Editor clears the list of requests.</span></p>
<p class="rvps10"><span class="rvts21">If given frame is outside current input range, TAS Editor will expand movie during </span><span class="rvts20">applyinputchanges()</span><span class="rvts21"> to fit the frame.</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, nothing will be done.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, nothing will be done.</span></p> <p class="rvps7"><a name="clearinputchanges"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="applyinputchanges"></a> <p class="rvps2"><span class="rvts61">taseditor.clearinputchanges()</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps9"><span class="rvts68">int taseditor.applyinputchanges([string name])</span></p> <p class="rvps7"><span class="rvts20">Clears the list of previously requested changes, making TAS Editor forget about them before you call </span><span class="rvts19">applyinputchanges()</span><span class="rvts20">. Use this function to discard previously submitted input changes.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">It's also recommended to call this function before making several requests in a row, so that you'll be sure that only your new changes will apply.</span></p>
<p class="rvps10"><span class="rvts21">Instantly applies the list of previously requested changes to current movie. If these requests actually modified movie data, new item will appear in History Log (so user can undo these changes), and Greenzone may become truncated, Playback cursor may lose its position, auto-seeking may be triggered.</span></p> <p class="rvps7"><span class="rvts20">If TAS Editor is not engaged, nothing will be done.</span></p>
<p class="rvps10"><span class="rvts21">Returns number of frame where first actual changes occurred.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If no actual changes were found (for example, you asked TAS Editor to set buttons that were already pressed), returns -1.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If pending list of changes is empty, returns -1.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">You can provide a name that will be assigned to this change. This name will be shown in History Log. If you don't provide a name, TAS Editor will use default name ("Change").</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">After applying all requests TAS Editor clears the list of requests.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, nothing will be done.</span></p>
<p class="rvps10"><a name="clearinputchanges"></a>
<span class="rvts21"><br/></span></p>
<p class="rvps9"><span class="rvts68">taseditor.clearinputchanges()</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21">Clears the list of previously requested changes, making TAS Editor forget about them before you call </span><span class="rvts20">applyinputchanges()</span><span class="rvts21">. Use this function to discard previously submitted input changes.</span></p>
<p class="rvps10"><span class="rvts21">It's also recommended to call this function before making several requests in a row, so that you'll be sure that only your new changes will apply.</span></p>
<p class="rvps10"><span class="rvts21">If TAS Editor is not engaged, nothing will be done.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com">Full-featured Documentation generator</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/create-epub-ebooks">Full-featured EPub generator</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,202 +1,393 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>Mistake-proofing</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>Mistake-proofing</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="Mistake-proofing">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="Mistake-proofing" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("MistakeProofing"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>Mistake-proofing</h1>
<div id="topic_breadcrumb">
<a href="TASEditorInside.html">TAS Editor Inside</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="TASEditorInside.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="Implementation.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="FM3format.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="MistakeProofing"
data-hnd-context="25"
data-hnd-title="Mistake-proofing"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="TASEditorInside.html">TAS Editor Inside</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="TASEditorInside.html" title="TAS Editor Inside" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="Implementation.html" title="Implementation" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="FM3format.html" title="FM3 format" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Mistake-proofing</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Mistake-proofing</span></p> <p class="rvps2"><span class="rvts18">Mistake-proofing</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">This page lists many small details of implementation that improve interaction between user and the program. All these points must be considered when porting Taseditor to other platforms.</span></p> <p class="rvps7"><span class="rvts20">This page lists many small details of implementation that improve interaction between user and the program. All these points must be considered when porting Taseditor to other platforms.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">When the user closes the emulator, emulator sends a request to Taseditor in order to allow it to close the project first. If the project contains unsaved data, Taseditor shows the Yes/No/Cancel dialog. The user can either save the changes, or save none of them, or cancel the attempt to close the emulator.</span></li> <li class="rvps7"><span class="rvts20">When the user closes the emulator, emulator sends a request to Taseditor in order to allow it to close the project first. If the project contains unsaved data, Taseditor shows the Yes/No/Cancel dialog. The user can either save the changes, or save none of them, or cancel the attempt to close the emulator.</span></li>
<li class="rvps10"><span class="rvts21">When playing back an fm3 project outside Taseditor (like a regular movie), the user can switch the emulator to Recording mode and try rerecording. In this case, the emulator tells the user that current movie is a Taseditor project, and suggests to start editing it. In case of refuse, emulator disables the Recording mode and resumes playing back the project movie. In case of agreement, emulator sends a signal to Taseditor, and at the end of the current frame Taseditor will launch and load the currently played project.</span></li> <li class="rvps7"><span class="rvts20">When playing back an fm3 project outside Taseditor (like a regular movie), the user can switch the emulator to Recording mode and try rerecording. In this case, the emulator tells the user that current movie is a Taseditor project, and suggests to start editing it. In case of refuse, emulator disables the Recording mode and resumes playing back the project movie. In case of agreement, emulator sends a signal to Taseditor, and at the end of the current frame Taseditor will launch and load the currently played project.</span></li>
<li class="rvps10"><span class="rvts21">When a ROM is loaded into emulator, the user can launch Taseditor at any moment. If he opens the Taseditor window while playing or recording a movie, Taseditor will automatically create a nameless project containing this movie Input. But if the movie is starting from a savestate, Taseditor will display a warning about not supporting such movies and then create a blank project.</span></li> <li class="rvps7"><span class="rvts20">When a ROM is loaded into emulator, the user can launch Taseditor at any moment. If he opens the Taseditor window while playing or recording a movie, Taseditor will automatically create a nameless project containing this movie Input. But if the movie is starting from a savestate, Taseditor will display a warning about not supporting such movies and then create a blank project.</span></li>
<li class="rvps10"><span class="rvts21">While the project has no name, autosave function doesn't work.</span></li> <li class="rvps7"><span class="rvts20">While the project has no name, autosave function doesn't work.</span></li>
<li class="rvps10"><span class="rvts21">When saving a nameless project, Taseditor suggests the current ROM name as a name for the fm3 project, with the extension changed to .fm3.</span></li> <li class="rvps7"><span class="rvts20">When saving a nameless project, Taseditor suggests the current ROM name as a name for the fm3 project, with the extension changed to .fm3.</span></li>
<li class="rvps10"><span class="rvts21">Since the FM3 format is a superstructure over the FM2 format, the user can open fm2 files just like Taseditor projects, using the "Open TAS Editor Project" dialog and choosing the filter "All Files (*.*)". When opening fm2 files, Taseditor additionally informs the user about it with the Yes/No dialog. The user can either load the fm2 file as a new project or cancel the loading.</span></li> <li class="rvps7"><span class="rvts20">Since the FM3 format is a superstructure over the FM2 format, the user can open fm2 files just like Taseditor projects, using the "Open TAS Editor Project" dialog and choosing the filter "All Files (*.*)". When opening fm2 files, Taseditor additionally informs the user about it with the Yes/No dialog. The user can either load the fm2 file as a new project or cancel the loading.</span></li>
<li class="rvps10"><span class="rvts21">After opening an fm2 file or a corrupted fm3 file, the project is considered nameless, even though the TAS Editor window caption displays the name of the loaded file. At the first saving attempt (</span><span class="rvts30">Ctrl + S</span><span class="rvts21">) Taseditor will bring the SaveAs dialog, where the loaded fm2/fm3 file name will be suggested as a name for the project. The user can either save the project with this name or change the name. This way Taseditor draws your attention to the fact that the new project significantly differs from the file that exists on the disk under the same name.</span></li> <li class="rvps7"><span class="rvts20">After opening an fm2 file or a corrupted fm3 file, the project is considered nameless, even though the TAS Editor window caption displays the name of the loaded file. At the first saving attempt (</span><span class="rvts27">Ctrl + S</span><span class="rvts20">) Taseditor will bring the SaveAs dialog, where the loaded fm2/fm3 file name will be suggested as a name for the project. The user can either save the project with this name or change the name. This way Taseditor draws your attention to the fact that the new project significantly differs from the file that exists on the disk under the same name.</span></li>
<li class="rvps10"><span class="rvts21">FM3 projects store the version number of the FM3 format used when saving the file. Different versions can be totally or partially incompatible with each other. If the loaded project version doesn't match the currently supported one, Taseditor shows the Yes/No/Cancel dialog. The user can either resume his attempt to load the whole project (not recommended), or load only the Input from the FM2 data (recommended), or cancel loading.</span></li> <li class="rvps7"><span class="rvts20">FM3 projects store the version number of the FM3 format used when saving the file. Different versions can be totally or partially incompatible with each other. If the loaded project version doesn't match the currently supported one, Taseditor shows the Yes/No/Cancel dialog. The user can either resume his attempt to load the whole project (not recommended), or load only the Input from the FM2 data (recommended), or cancel loading.</span></li>
<li class="rvps10"><span class="rvts21">FM2 format (and therefore fm3 too) stores the MD5 checksum of the ROM used when creating the movie/project. When loading a project, Taseditor compares the current ROM checksum with the project's one, and if they don't match, brings the Yes/No dialog, displaying the original and the current ROM names. The user can resume loading or cancel it. Later, when saving this project, Taseditor will notice the checksum mismatch again and suggest replacing the ROM name and the checksum in the file before saving. The user can either approve the replacing, or save the project with the old name and checksum, or cancel the saving.</span></li> <li class="rvps7"><span class="rvts20">FM2 format (and therefore fm3 too) stores the MD5 checksum of the ROM used when creating the movie/project. When loading a project, Taseditor compares the current ROM checksum with the project's one, and if they don't match, brings the Yes/No dialog, displaying the original and the current ROM names. The user can resume loading or cancel it. Later, when saving this project, Taseditor will notice the checksum mismatch again and suggest replacing the ROM name and the checksum in the file before saving. The user can either approve the replacing, or save the project with the old name and checksum, or cancel the saving.</span></li>
<li class="rvps10"><span class="rvts21">When loading a corrupted project file, Taseditor tries the best of its ability to prevent emulator crash. If an error is found in the middle of loading, the further loading stops and the rest data is replaced with the default data. Particularly, if the error occurred while loading the Greenzone, the project is left with only the Greenzone frames that were successfully pulled out of the file, the rest frames will be pale. Project loading error messages are logged into the FCEUX Message Log.</span></li> <li class="rvps7"><span class="rvts20">When loading a corrupted project file, Taseditor tries the best of its ability to prevent emulator crash. If an error is found in the middle of loading, the further loading stops and the rest data is replaced with the default data. Particularly, if the error occurred while loading the Greenzone, the project is left with only the Greenzone frames that were successfully pulled out of the file, the rest frames will be pale. Project loading error messages are logged into the FCEUX Message Log.</span></li>
<li class="rvps10"><span class="rvts21">When loading a project, Taseditor respects current settings of "Greenzone capacity" and "Undo levels". For example, if while saving a project the Greenzone capacity was 5000, but when loading the project the Greenzone capacity is 3000, some frames will be skipped when loading. It's necessary so that a project saved on a more powerful computer can be opened on a less powerful one, that doesn't have enough memory.</span></li> <li class="rvps7"><span class="rvts20">When loading a project, Taseditor respects current settings of "Greenzone capacity" and "Undo levels". For example, if while saving a project the Greenzone capacity was 5000, but when loading the project the Greenzone capacity is 3000, some frames will be skipped when loading. It's necessary so that a project saved on a more powerful computer can be opened on a less powerful one, that doesn't have enough memory.</span></li>
<li class="rvps10"><span class="rvts21">When launching, Taseditor loads the data about patterns from the </span><span class="rvts20">taseditor_patterns.txt</span><span class="rvts21"> file. If this file cannot be opened (fer example, it was removed), Taseditor creates a small set of default patterns, in order to keep the Patterns menu filled.</span></li> <li class="rvps7"><span class="rvts20">When launching, Taseditor loads the data about patterns from the </span><span class="rvts19">taseditor_patterns.txt</span><span class="rvts20"> file. If this file cannot be opened (fer example, it was removed), Taseditor creates a small set of default patterns, in order to keep the Patterns menu filled.</span></li>
<li class="rvps10"><span class="rvts21">Savestates used by the Greenzone differ from regular savestates a bit. They don't contain movie data, because it's useless information for the Greenzone purposes. Besides, they are always compressed, in order to save memory.</span></li> <li class="rvps7"><span class="rvts20">Savestates used by the Greenzone differ from regular savestates a bit. They don't contain movie data, because it's useless information for the Greenzone purposes. Besides, they are always compressed, in order to save memory.</span></li>
<li class="rvps10"><span class="rvts21">If after a </span><a class="rvts27" href="Operations.html#Delete">Delete</a><span class="rvts21"> or </span><a class="rvts27" href="Operations.html#LUAChange">Lua Change</a><span class="rvts21"> operation the user effectively removes all Input from the movie, Taseditor will create one blank frame in the movie beginning.</span></li> <li class="rvps7"><span class="rvts20">If after a </span><a class="rvts24" href="Operations.html#Delete">Delete</a><span class="rvts20"> or </span><a class="rvts24" href="Operations.html#LUAChange">Lua Change</a><span class="rvts20"> operation the user effectively removes all Input from the movie, Taseditor will create one blank frame in the movie beginning.</span></li>
<li class="rvps10"><span class="rvts21">When user is selecting a range of frames by stretching, it's still possible to use hotkeys with the other hand. To avoid conflict, during DRAG_MODE_SELECTION and DRAG_MODE_DESELECTION some functions related to changing the Selection will not work:</span></li> <li class="rvps7"><span class="rvts20">When user is selecting a range of frames by stretching, it's still possible to use hotkeys with the other hand. To avoid conflict, during DRAG_MODE_SELECTION and DRAG_MODE_DESELECTION some functions related to changing the Selection will not work:</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts20">clearSelection()</span></li> <li class="rvps7"><span class="rvts19">clearSelection()</span></li>
<li class="rvps10"><span class="rvts20">selectAll()</span></li> <li class="rvps7"><span class="rvts19">selectAll()</span></li>
<li class="rvps10"><span class="rvts20">selectBetweenMarkers()</span><span class="rvts21"> </span><span class="rvts30">Ctrl + A</span></li> <li class="rvps7"><span class="rvts19">selectBetweenMarkers()</span><span class="rvts20"> </span><span class="rvts27">Ctrl + A</span></li>
<li class="rvps10"><span class="rvts20">selection.undo()</span><span class="rvts21"> </span><span class="rvts30">Ctrl + Q</span></li> <li class="rvps7"><span class="rvts19">selection.undo()</span><span class="rvts20"> </span><span class="rvts27">Ctrl + Q</span></li>
<li class="rvps10"><span class="rvts20">selection.redo()</span><span class="rvts21"> </span><span class="rvts30">Ctrl + W</span></li> <li class="rvps7"><span class="rvts19">selection.redo()</span><span class="rvts20"> </span><span class="rvts27">Ctrl + W</span></li>
<li class="rvps10"><span class="rvts20">reselectClipboard()</span><span class="rvts21"> </span><span class="rvts30">Ctrl + B</span></li> <li class="rvps7"><span class="rvts19">reselectClipboard()</span><span class="rvts20"> </span><span class="rvts27">Ctrl + B</span></li>
<li class="rvps10"><span class="rvts20">selection.Transpose()</span><span class="rvts21"> </span><span class="rvts30">Ctrl + Up</span><span class="rvts21">, </span><span class="rvts30">Ctrl + Down</span><span class="rvts21">, </span><span class="rvts30">Ctrl + Home</span><span class="rvts21">, </span><span class="rvts30">Ctrl + End</span></li> <li class="rvps7"><span class="rvts19">selection.Transpose()</span><span class="rvts20"> </span><span class="rvts27">Ctrl + Up</span><span class="rvts20">, </span><span class="rvts27">Ctrl + Down</span><span class="rvts20">, </span><span class="rvts27">Ctrl + Home</span><span class="rvts20">, </span><span class="rvts27">Ctrl + End</span></li>
<li class="rvps10"><span class="rvts20">selection.JumpPrevMarker()</span><span class="rvts21"> </span><span class="rvts30">Ctrl + Page Up</span></li> <li class="rvps7"><span class="rvts19">selection.JumpPrevMarker()</span><span class="rvts20"> </span><span class="rvts27">Ctrl + Page Up</span></li>
<li class="rvps10"><span class="rvts20">selection.JumpNextMarker()</span><span class="rvts21"> </span><span class="rvts30">Ctrl + Page Down</span></li> <li class="rvps7"><span class="rvts19">selection.JumpNextMarker()</span><span class="rvts20"> </span><span class="rvts27">Ctrl + Page Down</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">Since the icon column is rather narrow, the user may accidentally miss clicking it. So when you click the left border of the Piano Roll or a bit to the left from it, Taseditor assumes that was a click on the icons column. As a result, the user doesn't have to precisely aim when he needs to move the Playback cursor or start dragging it.</span></li> <li class="rvps7"><span class="rvts20">Since the icon column is rather narrow, the user may accidentally miss clicking it. So when you click the left border of the Piano Roll or a bit to the left from it, Taseditor assumes that was a click on the icons column. As a result, the user doesn't have to precisely aim when he needs to move the Playback cursor or start dragging it.</span></li>
<li class="rvps10"><span class="rvts21">When emulator is paused, the middle mouse button works only under condition that the right button is released. Since the middle button is usually a wheel, the user can accidentally push it while rolling the wheel with the right button held (Playback cursor navigation). As for rolling the wheel with modifier keys held, this is used much less often, so they don't need such protection.</span></li> <li class="rvps7"><span class="rvts20">When emulator is paused, the middle mouse button works only under condition that the right button is released. Since the middle button is usually a wheel, the user can accidentally push it while rolling the wheel with the right button held (Playback cursor navigation). As for rolling the wheel with modifier keys held, this is used much less often, so they don't need such protection.</span></li>
<li class="rvps10"><span class="rvts21">Any middleclick over the FCEUX window is sent to Taseditor window. Similarly, the wheel rolling message is sent to Taseditor, when the focus is on the FCEUX window. And the rightclick on the FCEUX window doesn't work at all. Thanks to that, you can use the middle button (the wheel) even when the mouse cursor is over the FCEUX window.</span></li> <li class="rvps7"><span class="rvts20">Any middleclick over the FCEUX window is sent to Taseditor window. Similarly, the wheel rolling message is sent to Taseditor, when the focus is on the FCEUX window. And the rightclick on the FCEUX window doesn't work at all. Thanks to that, you can use the middle button (the wheel) even when the mouse cursor is over the FCEUX window.</span></li>
<li class="rvps10"><span class="rvts21">Even when the Recording mode is on, Taseditor won't rerecord Input while seeking. Thanks to that, you can safely drag the Playback cursor without disabling the Recording mode.</span></li> <li class="rvps7"><span class="rvts20">Even when the Recording mode is on, Taseditor won't rerecord Input while seeking. Thanks to that, you can safely drag the Playback cursor without disabling the Recording mode.</span></li>
<li class="rvps10"><span class="rvts21">When Taseditor is engaged, the following menu commands are available only when the Recording mode if on and the Playback is not seeking:</span></li> <li class="rvps7"><span class="rvts20">When Taseditor is engaged, the following menu commands are available only when the Recording mode if on and the Playback is not seeking:</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">NES -&gt; Reset</span></li> <li class="rvps7"><span class="rvts20">NES -&gt; Reset</span></li>
<li class="rvps10"><span class="rvts21">NES -&gt; Power</span></li> <li class="rvps7"><span class="rvts20">NES -&gt; Power</span></li>
<li class="rvps10"><span class="rvts21">NES -&gt; Eject/insert Disk</span></li> <li class="rvps7"><span class="rvts20">NES -&gt; Eject/insert Disk</span></li>
<li class="rvps10"><span class="rvts21">NES -&gt; Switch Disk Side</span></li> <li class="rvps7"><span class="rvts20">NES -&gt; Switch Disk Side</span></li>
<li class="rvps10"><span class="rvts21">NES -&gt; Insert Coin</span></li> <li class="rvps7"><span class="rvts20">NES -&gt; Insert Coin</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">When Taseditor is engaged, the following FCEUX menu commands are unavailable:</span></li> <li class="rvps7"><span class="rvts20">When Taseditor is engaged, the following FCEUX menu commands are unavailable:</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">File -&gt; Open ROM</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Open ROM</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Close</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Close</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Recent</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Recent</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Savestate -&gt; Load State</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Savestate -&gt; Load State</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Savestate -&gt; Save State</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Savestate -&gt; Save State</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Savestate -&gt; Load State From</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Savestate -&gt; Load State From</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Savestate -&gt; Save State As</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Savestate -&gt; Save State As</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Savestate -&gt; Next save slot</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Savestate -&gt; Next save slot</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Savestate -&gt; Previous save slot</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Savestate -&gt; Previous save slot</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Savestate -&gt; View save slots</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Savestate -&gt; View save slots</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Movie -&gt; Recent</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Movie -&gt; Recent</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Movie -&gt; Record Movie</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Movie -&gt; Record Movie</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Movie -&gt; Play Movie</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Movie -&gt; Play Movie</span></li>
<li class="rvps10"><span class="rvts21">File -&gt; Movie -&gt; Stop Movie</span></li> <li class="rvps7"><span class="rvts20">File -&gt; Movie -&gt; Stop Movie</span></li>
<li class="rvps10"><span class="rvts21">Config -&gt; Enable -&gt; Auto-savestates (always off when Taseditor is engaged)</span></li> <li class="rvps7"><span class="rvts20">Config -&gt; Enable -&gt; Auto-savestates (always off when Taseditor is engaged)</span></li>
<li class="rvps10"><span class="rvts21">Config -&gt; Enable -&gt; Backup Savestates (always off when Taseditor is engaged)</span></li> <li class="rvps7"><span class="rvts20">Config -&gt; Enable -&gt; Backup Savestates (always off when Taseditor is engaged)</span></li>
<li class="rvps10"><span class="rvts21">Config -&gt; Enable -&gt; Compress Savestates (always on when Taseditor is engaged)</span></li> <li class="rvps7"><span class="rvts20">Config -&gt; Enable -&gt; Compress Savestates (always on when Taseditor is engaged)</span></li>
<li class="rvps10"><span class="rvts21">Config -&gt; PAL Emulation (set up this before launching Taseditor)</span></li> <li class="rvps7"><span class="rvts20">Config -&gt; PAL Emulation (set up this before launching Taseditor)</span></li>
<li class="rvps10"><span class="rvts21">Config -&gt; PPU -&gt; New PPU / Old PPU (set up this before launching Taseditor)</span></li> <li class="rvps7"><span class="rvts20">Config -&gt; PPU -&gt; New PPU / Old PPU (set up this before launching Taseditor)</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">It's also necessary to ensure that the user can not change the movie synchronization settings while editing the project. So when Taseditor is engaged, the following GUI elements in the "Input Configuration" window are locked:</span></li> <li class="rvps7"><span class="rvts20">It's also necessary to ensure that the user can not change the movie synchronization settings while editing the project. So when Taseditor is engaged, the following GUI elements in the "Input Configuration" window are locked:</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">the "Attach four-score" checkbox</span></li> <li class="rvps7"><span class="rvts20">the "Attach four-score" checkbox</span></li>
<li class="rvps10"><span class="rvts21">the "Replace port 2 Start With &nbsp;Microphone" checkbox</span></li> <li class="rvps7"><span class="rvts20">the "Replace port 2 Start With &nbsp;Microphone" checkbox</span></li>
<li class="rvps10"><span class="rvts21">ListBox for port0</span></li> <li class="rvps7"><span class="rvts20">ListBox for port0</span></li>
<li class="rvps10"><span class="rvts21">ListBox for port1</span></li> <li class="rvps7"><span class="rvts20">ListBox for port1</span></li>
<li class="rvps10"><span class="rvts21">ListBox for port2</span></li> <li class="rvps7"><span class="rvts20">ListBox for port2</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">When Taseditor is engaged, the following hotkeys are not working:</span></li> <li class="rvps7"><span class="rvts20">When Taseditor is engaged, the following hotkeys are not working:</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">Hide Menu Toggle</span></li> <li class="rvps7"><span class="rvts20">Hide Menu Toggle</span></li>
<li class="rvps10"><span class="rvts21">Fastest Speed</span></li> <li class="rvps7"><span class="rvts20">Fastest Speed</span></li>
<li class="rvps10"><span class="rvts21">Save State As...</span></li> <li class="rvps7"><span class="rvts20">Save State As...</span></li>
<li class="rvps10"><span class="rvts21">Load State From...</span></li> <li class="rvps7"><span class="rvts20">Load State From...</span></li>
<li class="rvps10"><span class="rvts21">Record Movie To...</span></li> <li class="rvps7"><span class="rvts20">Record Movie To...</span></li>
<li class="rvps10"><span class="rvts21">Play Movie From...</span></li> <li class="rvps7"><span class="rvts20">Play Movie From...</span></li>
<li class="rvps10"><span class="rvts21">Stop Movie</span></li> <li class="rvps7"><span class="rvts20">Stop Movie</span></li>
<li class="rvps10"><span class="rvts21">Toggle Dipswitch because these commands are not supported by the FM2 format yet</span></li> <li class="rvps7"><span class="rvts20">Toggle Dipswitch because these commands are not supported by the FM2 format yet</span></li>
<li class="rvps10"><span class="rvts21">Load Last Auto-save</span></li> <li class="rvps7"><span class="rvts20">Load Last Auto-save</span></li>
<li class="rvps10"><span class="rvts21">View save slots</span></li> <li class="rvps7"><span class="rvts20">View save slots</span></li>
<li class="rvps10"><span class="rvts21">Open ROM</span></li> <li class="rvps7"><span class="rvts20">Open ROM</span></li>
<li class="rvps10"><span class="rvts21">Close ROM</span></li> <li class="rvps7"><span class="rvts20">Close ROM</span></li>
<li class="rvps10"><span class="rvts21">Undo/Redo Savestate</span></li> <li class="rvps7"><span class="rvts20">Undo/Redo Savestate</span></li>
<li class="rvps10"><span class="rvts21">Toggle Fullscreen</span></li> <li class="rvps7"><span class="rvts20">Toggle Fullscreen</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">Hotkeys that change their behavior when Taseditor is engaged:</span></li> <li class="rvps7"><span class="rvts20">Hotkeys that change their behavior when Taseditor is engaged:</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 40px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">Power</span></li> <li class="rvps7"><span class="rvts20">Power</span></li>
<li class="rvps10"><span class="rvts26">Reset</span></li> <li class="rvps7"><span class="rvts23">Reset</span></li>
<li class="rvps10"><span class="rvts21">Eject or Insert FDS Disk</span></li> <li class="rvps7"><span class="rvts20">Eject or Insert FDS Disk</span></li>
<li class="rvps10"><span class="rvts21">Switch FDS Disk Side</span></li> <li class="rvps7"><span class="rvts20">Switch FDS Disk Side</span></li>
<li class="rvps10"><span class="rvts21">Insert Coin</span></li> <li class="rvps7"><span class="rvts20">Insert Coin</span></li>
<li class="rvps10"><span class="rvts26">Savestate Slot 0</span><span class="rvts21"> </span><span class="rvts26">Savestate Slot 9</span></li> <li class="rvps7"><span class="rvts23">Savestate Slot 0</span><span class="rvts20"> </span><span class="rvts23">Savestate Slot 9</span></li>
<li class="rvps10"><span class="rvts26">Save State</span></li> <li class="rvps7"><span class="rvts23">Save State</span></li>
<li class="rvps10"><span class="rvts26">Save State to Slot 0</span><span class="rvts21"> </span><span class="rvts26">Save State to Slot 9</span></li> <li class="rvps7"><span class="rvts23">Save State to Slot 0</span><span class="rvts20"> </span><span class="rvts23">Save State to Slot 9</span></li>
<li class="rvps10"><span class="rvts26">Load State</span></li> <li class="rvps7"><span class="rvts23">Load State</span></li>
<li class="rvps10"><span class="rvts26">Load State from Slot 0</span><span class="rvts21"> </span><span class="rvts26">Load State from Slot 9</span></li> <li class="rvps7"><span class="rvts23">Load State from Slot 0</span><span class="rvts20"> </span><span class="rvts23">Load State from Slot 9</span></li>
<li class="rvps10"><span class="rvts26">Play Movie From Beginning</span></li> <li class="rvps7"><span class="rvts23">Play Movie From Beginning</span></li>
<li class="rvps10"><span class="rvts26">Reload ROM or TAS Editor Project</span></li> <li class="rvps7"><span class="rvts23">Reload ROM or TAS Editor Project</span></li>
<li class="rvps10"><span class="rvts21">Open TAS Editor</span></li> <li class="rvps7"><span class="rvts20">Open TAS Editor</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">Since the </span><span class="rvts30">Alt</span><span class="rvts21"> and </span><span class="rvts26">F10</span><span class="rvts21"> keys are actively used in Taseditor work, their standard behavior (open main menu) is disabled.</span></li> <li class="rvps7"><span class="rvts20">Since the </span><span class="rvts27">Alt</span><span class="rvts20"> and </span><span class="rvts23">F10</span><span class="rvts20"> keys are actively used in Taseditor work, their standard behavior (open main menu) is disabled.</span></li>
<li class="rvps10"><span class="rvts21">Since the </span><span class="rvts26">Spacebar</span><span class="rvts21"> key is used as a hotkey by default, its standard behavior (simulate the click on the currently focused GUI element) is disabled. Also, all GUI elements of the TAS Editor window handle the middleclick message and send it to the Playback, thus the middleclick works independently of the mouse cursor position.</span></li> <li class="rvps7"><span class="rvts20">Since the </span><span class="rvts23">Spacebar</span><span class="rvts20"> key is used as a hotkey by default, its standard behavior (simulate the click on the currently focused GUI element) is disabled. Also, all GUI elements of the TAS Editor window handle the middleclick message and send it to the Playback, thus the middleclick works independently of the mouse cursor position.</span></li>
<li class="rvps10"><span class="rvts21">Since the context menu on the rightclick at the Piano Roll is not often used, it appears only if the user clicks the selected line in the frame number column (Frame#). In all the rest cases the context menu doesn't appear, instead the rightclick-and-hold at the Piano Roll allows to drag its contents in any direction.</span></li> <li class="rvps7"><span class="rvts20">Since the context menu on the rightclick at the Piano Roll is not often used, it appears only if the user clicks the selected line in the frame number column (Frame#). In all the rest cases the context menu doesn't appear, instead the rightclick-and-hold at the Piano Roll allows to drag its contents in any direction.</span></li>
<li class="rvps10"><span class="rvts21">Since the right button is often used for the Playback cursor navigation with the wheel, the user is encouraged to click it without caring about the current mouse cursor position. In theory it's possible that the user accidentally rightclicks a Bookmark. To avoid such unintended commands, the Bookmark List and the Branches Tree both require to press and release the right button over the same Bookmark. Also, if between pressing and releasing the user rotated the wheel, the Bookmark won't be changed.</span></li> <li class="rvps7"><span class="rvts20">Since the right button is often used for the Playback cursor navigation with the wheel, the user is encouraged to click it without caring about the current mouse cursor position. In theory it's possible that the user accidentally rightclicks a Bookmark. To avoid such unintended commands, the Bookmark List and the Branches Tree both require to press and release the right button over the same Bookmark. Also, if between pressing and releasing the user rotated the wheel, the Bookmark won't be changed.</span></li>
<li class="rvps10"><span class="rvts21">The user can jump to a Bookmark with a single click on the desired icon in the Branches Tree. Doing so he expects that after the click the light-blue triangle (the Playback cursor icon) will also jump to the place in the Branches Tree. It is indeed so for Bookmarks that don't contradict with the current timeline, but it's not so for Bookmarks representing alternative strategies. After jumping to the frame of such Bookmark, the Playback cursor will appear on another branch (even though it's on the same frame of the movie). To notify the user about possible misconception, the mouse cursor turns into an arrow with a question mark when the user points to such Bookmarks.</span></li> <li class="rvps7"><span class="rvts20">The user can jump to a Bookmark with a single click on the desired icon in the Branches Tree. Doing so he expects that after the click the light-blue triangle (the Playback cursor icon) will also jump to the place in the Branches Tree. It is indeed so for Bookmarks that don't contradict with the current timeline, but it's not so for Bookmarks representing alternative strategies. After jumping to the frame of such Bookmark, the Playback cursor will appear on another branch (even though it's on the same frame of the movie). To notify the user about possible misconception, the mouse cursor turns into an arrow with a question mark when the user points to such Bookmarks.</span></li>
<li class="rvps10"><span class="rvts21">While the Branches Tree is transforming, hovering the mouse cursor over its elements doesn't work, because the active element area is constantly moving and running away from the mouse cursor.</span></li> <li class="rvps7"><span class="rvts20">While the Branches Tree is transforming, hovering the mouse cursor over its elements doesn't work, because the active element area is constantly moving and running away from the mouse cursor.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com">Full-featured Documentation generator</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/create-epub-ebooks">Full-featured EPub generator</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,373 +1,538 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>Navigation</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>Navigation</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="Navigation">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="Navigation" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("Navigation"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>Navigation</h1>
<div id="topic_breadcrumb">
<a href="Reference.html">Reference</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="Reference.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="Controls.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="Operations.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="Navigation"
data-hnd-context="18"
data-hnd-title="Navigation"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="Reference.html">Reference</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="Reference.html" title="Reference" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="Controls.html" title="Controls" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="Operations.html" title="Operations" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Navigation</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Navigation</span></p> <p class="rvps2"><span class="rvts18">Navigation</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts21">Emulator's main window can only display data of a single frame of the movie at any given moment.</span></p> <p class="rvps7"><span class="rvts20">Emulator's main window can only display data of a single frame of the movie at any given moment.</span></p>
<p class="rvps10"><span class="rvts21">The Piano Roll can cover data for tens of frames at the same time.</span></p> <p class="rvps7"><span class="rvts20">The Piano Roll can cover data for tens of frames at the same time.</span></p>
<p class="rvps10"><span class="rvts21">But an average movie has tens of thousands of frames. So TASer must often scroll the Piano Roll up and down to see the data about needed segment, and rewind emulator playback to see the data about needed frame.</span></p> <p class="rvps7"><span class="rvts20">But an average movie has tens of thousands of frames. So TASer must often scroll the Piano Roll up and down to see the data about needed segment, and rewind emulator playback to see the data about needed frame.</span></p>
<p class="rvps10"><span class="rvts21">Throughout the documentation this behavior is called "movie navigation". It takes major part of TASing, and Taseditor introduces many new ways of navigation, striving to make it as fast as possible. Depending on the situation some of them are better then others, so it's not recommended to stick to a single method.</span></p> <p class="rvps7"><span class="rvts20">Throughout the documentation this behavior is called "movie navigation". It takes major part of TASing, and Taseditor introduces many new ways of navigation, striving to make it as fast as possible. Depending on the situation some of them are better then others, so it's not recommended to stick to a single method.</span></p>
<p class="rvps10"><span class="rvts21">Ideally, the navigation skills should move to your muscle memory, allowing you to always appear at the necessary place of the movie without interrupting the mental analysis of the current task.</span></p> <p class="rvps7"><span class="rvts20">Ideally, the navigation skills should move to your muscle memory, allowing you to always appear at the necessary place of the movie without interrupting the mental analysis of the current task.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts46">All ways of navigating a movie:</span></p> <p class="rvps7"><span class="rvts21">All ways of navigating a movie:</span></p>
<p class="rvps10"><span class="rvts52"><br/></span></p> <p class="rvps7"><span class="rvts44"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><a class="rvts57" href="Navigation.html#scrolling-piano-roll">Scrolling the Piano Roll</a></li> <li class="rvps7"><a class="rvts48" href="Navigation.html#scrolling-piano-roll">Scrolling the Piano Roll</a></li>
</ul> </ul>
<ol style="text-indent: 32px; margin-left: 20px; list-style-position: inside;"> <ol style="text-indent: 32px; padding: 0; margin: 0 0 0 20px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#scrollbar-drag">Using vertical scrollbar</a></li> <li value="1" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#scrollbar-drag">Using vertical scrollbar</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#wheel">Rolling mouse wheel</a></li> <li value="2" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#wheel">Rolling mouse wheel</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#crossing-gaps">Crossing gaps</a></li> <li value="3" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#crossing-gaps">Crossing gaps</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#jumping-by-pages">Paging through</a></li> <li value="4" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#jumping-by-pages">Paging through</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#jump-home-end">Jumping to the beginning / to the end of the movie</a></li> <li value="5" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#jump-home-end">Jumping to the beginning / to the end of the movie</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#scroll-to-playback">Jumping to the Playback cursor</a></li> <li value="6" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#scroll-to-playback">Jumping to the Playback cursor</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#scroll-to-selection">Jumping to the Selection cursor</a></li> <li value="7" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#scroll-to-selection">Jumping to the Selection cursor</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#scroll-to-playback-marker">Jumping to the Marker above Playback cursor</a></li> <li value="8" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#scroll-to-playback-marker">Jumping to the Marker above Playback cursor</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#scroll-to-selection-marker">Jumping to the Marker above Selection cursor</a></li> <li value="9" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#scroll-to-selection-marker">Jumping to the Marker above Selection cursor</a></li>
</ol> </ol>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><a class="rvts58" href="Navigation.html#playback-cursor">Playback cursor navigation</a></li> <li class="rvps7"><a class="rvts49" href="Navigation.html#playback-cursor">Playback cursor navigation</a></li>
</ul> </ul>
<ol style="text-indent: 32px; margin-left: 20px; list-style-position: inside;"> <ol style="text-indent: 32px; padding: 0; margin: 0 0 0 20px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#frame-advance-rewind">Frame-by-frame shift</a></li> <li value="1" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#frame-advance-rewind">Frame-by-frame shift</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#rewinding-by-wheel">Rewinding by mouse wheel</a></li> <li value="2" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#rewinding-by-wheel">Rewinding by mouse wheel</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts61" href="Navigation.html#drag-playback">Dragging with mouse</a></li> <li value="3" style="text-indent: 32px" class="rvps7"><a class="rvts52" href="Navigation.html#drag-playback">Dragging with mouse</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#playback-jumping-markers">Jumping on Markers</a></li> <li value="4" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#playback-jumping-markers">Jumping on Markers</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#jump-bookmark">Jumping to Bookmarks</a></li> <li value="5" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#jump-bookmark">Jumping to Bookmarks</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#playback-home-end">Jumping to the beginning / to the end of the movie</a></li> <li value="6" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#playback-home-end">Jumping to the beginning / to the end of the movie</a></li>
</ol> </ol>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><a class="rvts60" href="Navigation.html#selection-cursor">Selection cursor navigation</a></li> <li class="rvps7"><a class="rvts51" href="Navigation.html#selection-cursor">Selection cursor navigation</a></li>
</ul> </ul>
<ol style="text-indent: 32px; margin-left: 20px; list-style-position: inside;"> <ol style="text-indent: 32px; padding: 0; margin: 0 0 0 20px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#selection-up-down">Frame-by-frame shift</a></li> <li value="1" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#selection-up-down">Frame-by-frame shift</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#selection-home-end">Moving Selection to the beginning / to the end of the movie</a></li> <li value="2" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#selection-home-end">Moving Selection to the beginning / to the end of the movie</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#selection-jumping-markers">Jumping on Markers</a></li> <li value="3" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#selection-jumping-markers">Jumping on Markers</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#selection-history">Tracking the Selection History</a></li> <li value="4" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#selection-history">Tracking the Selection History</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#reselect-clipboard">Returning to the origin of Clipboard data</a></li> <li value="5" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#reselect-clipboard">Returning to the origin of Clipboard data</a></li>
</ol> </ol>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><a class="rvts59" href="Navigation.html#special">Special</a></li> <li class="rvps7"><a class="rvts50" href="Navigation.html#special">Special</a></li>
</ul> </ul>
<ol style="text-indent: 32px; margin-left: 20px; list-style-position: inside;"> <ol style="text-indent: 32px; padding: 0; margin: 0 0 0 20px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#find-note">Finding Markers with a given text</a></li> <li value="1" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#find-note">Finding Markers with a given text</a></li>
<li class="rvps10" style="text-indent: 32px"><a class="rvts57" href="Navigation.html#similar-note">Jumping to segment with similar description</a></li> <li value="2" style="text-indent: 32px" class="rvps7"><a class="rvts48" href="Navigation.html#similar-note">Jumping to segment with similar description</a></li>
</ol> </ol>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps2"><a name="scrolling-piano-roll"></a> <p class="rvps2"><a name="scrolling-piano-roll"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts45">Scrolling the Piano Roll</span></p>
<p><span class="rvts53">Scrolling the Piano Roll</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><a name="scrollbar-drag"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="scrollbar-drag"></a> <p class="rvps7"><span class="rvts21">1. Using vertical scrollbar</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts46">1. Using vertical scrollbar</span></p> <p class="rvps7"><span class="rvts20">Click on the scrollbar or drag its thumb to scroll the Piano Roll like any other list.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Playback cursor and Selection cursor positions are not affected by the Piano Roll scrolling.</span></p>
<p class="rvps10"><span class="rvts21">Click on the scrollbar or drag its thumb to scroll the Piano Roll like any other list.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">Playback cursor and Selection cursor positions are not affected by the Piano Roll scrolling.</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<p class="rvps10"><span class="rvts21">When to use:</span></p> <li class="rvps7"><span class="rvts20">when you need to get to a far away section of the movie. The scrollbar allows to traverse thousands of frames at once</span></li>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">when you're searching for a segment which can be anywhere in the movie</span></li>
<li class="rvps10"><span class="rvts21">when you need to get to a far away section of the movie. The scrollbar allows to traverse thousands of frames at once</span></li>
<li class="rvps10"><span class="rvts21">when you're searching for a segment which can be anywhere in the movie</span></li>
</ul> </ul>
<p class="rvps10"><a name="wheel"></a> <p class="rvps7"><a name="wheel"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">2. Rolling mouse wheel</span></p>
<p class="rvps10"><span class="rvts46">2. Rolling mouse wheel</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Roll mouse wheel up or down </span><span class="rvts20">to scroll the Piano Roll like any other list.</span></p>
<p class="rvps10"><span class="rvts21">Roll mouse wheel up or down </span><span class="rvts21">to scroll the Piano Roll like any other list.</span></p> <p class="rvps7"><span class="rvts20">The mouse cursor can be pointing anywhere, except History Log window.</span></p>
<p class="rvps10"><span class="rvts21">The mouse cursor can be pointing anywhere, except History Log window.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">when you're observing a segment that doesn't fit into the Piano Roll visible area</span></li>
<li class="rvps10"><span class="rvts21">when you're observing a segment that doesn't fit into the Piano Roll visible area</span></li> <li class="rvps7"><span class="rvts20">when you're searching for a nearby segment</span></li>
<li class="rvps10"><span class="rvts21">when you're searching for a nearby segment</span></li>
</ul> </ul>
<p><a name="crossing-gaps"></a> <p class="rvps2"><a name="crossing-gaps"></a><span class="rvts31"><br/></span></p>
<span class="rvts62"><br/></span></p> <p class="rvps7"><span class="rvts21">3. Crossing gaps</span></p>
<p class="rvps10"><span class="rvts22">3. Crossing gaps</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Point mouse cursor to any cell in Input/Markers/icons, hold </span><span class="rvts27">Alt</span><span class="rvts20"> and roll the mouse wheel up or down to scroll the Piano Roll to the closest cell that contains a data different from the data of adjacent cell.</span></p>
<p class="rvps10"><span class="rvts21">Point mouse cursor to any cell in Input/Markers/icons, hold </span><span class="rvts30">Alt</span><span class="rvts21"> and roll the mouse wheel up or down to scroll the Piano Roll to the closest cell that contains a data different from the data of adjacent cell.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">when you see an emptiness in specific button column and you want to find the nearest frame where the button becomes pressed</span></li>
<li class="rvps10"><span class="rvts21">when you see an emptiness in specific button column and you want to find the nearest frame where the button becomes pressed</span></li> <li class="rvps7"><span class="rvts20">when you see the specific button is held for many frames and you want to find exactly the first frame where the button was pressed, or the frame where it will be released</span></li>
<li class="rvps10"><span class="rvts21">when you see the specific button is held for many frames and you want to find exactly the first frame where the button was pressed, or the frame where it will be released</span></li> <li class="rvps7"><span class="rvts20">when you need to find previous/next Marker</span></li>
<li class="rvps10"><span class="rvts21">when you need to find previous/next Marker</span></li> <li class="rvps7"><span class="rvts20">when you need to find previous/next buttonpress</span></li>
<li class="rvps10"><span class="rvts21">when you need to find previous/next buttonpress</span></li> <li class="rvps7"><span class="rvts20">when you need to find the Bookmark above/below (in the icons column)</span></li>
<li class="rvps10"><span class="rvts21">when you need to find the Bookmark above/below (in the icons column)</span></li>
</ul> </ul>
<p class="rvps10"><a name="jumping-by-pages"></a> <p class="rvps7"><a name="jumping-by-pages"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">4. Paging through</span></p>
<p class="rvps10"><span class="rvts46">4. Paging through</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Press</span><span class="rvts20"> </span><span class="rvts27">Page Up</span><span class="rvts20"> or </span><span class="rvts27">Page Down</span><span class="rvts20"> key </span><span class="rvts20">to scroll the Piano Roll like any other list. The amount of scrolling depends on the size of the Piano Roll visible area.</span></p>
<p class="rvps10"><span class="rvts21">Press</span><span class="rvts21"> </span><span class="rvts30">Page Up</span><span class="rvts21"> or </span><span class="rvts30">Page Down</span><span class="rvts21"> key </span><span class="rvts21">to scroll the Piano Roll like any other list. The amount of scrolling depends on the size of the Piano Roll visible area.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">when you're searching for a segment which is likely somewhere nearby</span></li>
<li class="rvps10"><span class="rvts21">when you're searching for a segment which is likely somewhere nearby</span></li>
</ul> </ul>
<p class="rvps10"><a name="jump-home-end"></a> <p class="rvps7"><a name="jump-home-end"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">5. Jumping to the beginning / to the end of the movie</span></p>
<p class="rvps10"><span class="rvts46">5. Jumping to the beginning / to the end of the movie</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Press</span><span class="rvts20"> </span><span class="rvts27">Home</span><span class="rvts20"> or </span><span class="rvts27">End</span><span class="rvts20"> </span><span class="rvts20">to scroll Piano Roll to the beginning or to the end of the movie.</span></p>
<p class="rvps10"><span class="rvts21">Press</span><span class="rvts21"> </span><span class="rvts30">Home</span><span class="rvts21"> or </span><span class="rvts30">End</span><span class="rvts21"> </span><span class="rvts21">to scroll Piano Roll to the beginning or to the end of the movie.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to observe </span><span class="rvts20">the beginning or the end of the movie</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to observe </span><span class="rvts21">the beginning or the end of the movie</span></li>
</ul> </ul>
<p class="rvps10"><a name="scroll-to-playback"></a> <p class="rvps7"><a name="scroll-to-playback"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">6. Jumping to the Playback cursor</span></p>
<p class="rvps10"><span class="rvts46">6. Jumping to the Playback cursor</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Click on the upper "Marker #" label (colored light-blue) to immediately scroll the Piano Roll to the Playback cursor position. Alternative way to do it is to press </span><span class="rvts27">Shift</span><span class="rvts20"> key twice within a short amount of time.</span></p>
<p class="rvps10"><span class="rvts21">Click on the upper "Marker #" label (colored light-blue) to immediately scroll the Piano Roll to the Playback cursor position. Alternative way to do it is to press </span><span class="rvts30">Shift</span><span class="rvts21"> key twice within a short amount of time.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to see the context of currently played frame of the movie</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to see the context of currently played frame of the movie</span></li> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you wish to return to the currently played segment from any other place</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you wish to return to the currently played segment from any other place</span></li>
</ul> </ul>
<p class="rvps10"><a name="scroll-to-selection"></a> <p class="rvps7"><a name="scroll-to-selection"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">7. Jumping to the Selection cursor</span></p>
<p class="rvps10"><span class="rvts46">7. Jumping to the Selection cursor</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Click on the lower "Marker #" label to immediately scroll the Piano Roll to the Selection cursor position. Alternative way to do it is to press </span><span class="rvts27">Ctrl</span><span class="rvts20"> key twice within a short amount of time.</span></p>
<p class="rvps10"><span class="rvts21">Click on the lower "Marker #" label to immediately scroll the Piano Roll to the Selection cursor position. Alternative way to do it is to press </span><span class="rvts30">Ctrl</span><span class="rvts21"> key twice within a short amount of time.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you wish to return to the currently edited segment from any other place</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you wish to return to the currently edited segment from any other place</span></li>
</ul> </ul>
<p class="rvps10"><a name="scroll-to-playback-marker"></a> <p class="rvps7"><a name="scroll-to-playback-marker"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">8. Jumping to the Marker above Playback cursor</span></p>
<p class="rvps10"><span class="rvts46">8. Jumping to the Marker above Playback cursor</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Click on the upper edit field to immediately scroll the Piano Roll to the Marker which Note is going to be edited.</span></p>
<p class="rvps10"><span class="rvts21">Click on the upper edit field to immediately scroll the Piano Roll to the Marker which Note is going to be edited.</span></p> <p class="rvps7"><span class="rvts20">Works only when the </span><a class="rvts24" href="ProgramCustomization.html#FollowMarkerNotecontext">View -&gt; Follow Marker Note context</a><span class="rvts20"> option is enabled.</span></p>
<p class="rvps10"><span class="rvts21">Works only when the </span><a class="rvts27" href="ProgramCustomization.html#FollowMarkerNotecontext">View -&gt; Follow Marker Note context</a><span class="rvts21"> option is enabled.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to see the beginning of the </span><span class="rvts20">currently played segment</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to see the beginning of the </span><span class="rvts21">currently played segment</span></li>
</ul> </ul>
<p class="rvps14"><a name="scroll-to-selection-marker"></a> <p class="rvps9"><a name="scroll-to-selection-marker"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">9. Jumping to the Marker above Selection cursor</span></p>
<p class="rvps10"><span class="rvts22">9. Jumping to the Marker above Selection cursor</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Click on the lower edit field to immediately scroll the Piano Roll to the Marker which Note is going to be edited.</span></p>
<p class="rvps10"><span class="rvts21">Click on the lower edit field to immediately scroll the Piano Roll to the Marker which Note is going to be edited.</span></p> <p class="rvps7"><span class="rvts20">Works only when the </span><a class="rvts24" href="ProgramCustomization.html#FollowMarkerNotecontext">View -&gt; Follow Marker Note context</a><span class="rvts20"> option is enabled.</span></p>
<p class="rvps10"><span class="rvts21">Works only when the </span><a class="rvts27" href="ProgramCustomization.html#FollowMarkerNotecontext">View -&gt; Follow Marker Note context</a><span class="rvts21"> option is enabled.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to see the beginning of the </span><span class="rvts20">currently edited segment</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to see the beginning of the </span><span class="rvts21">currently edited segment</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="playback-cursor"></a> <p class="rvps7"><a name="playback-cursor"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts45">Playback cursor navigation</span></p>
<p><span class="rvts53">Playback cursor navigation</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The Playback cursor is always bound to current state of emulated game. This means that emulator affects this cursor when emulating the game, and vice versa, when you move this cursor, you affect the emulator.</span></p>
<p class="rvps10"><span class="rvts21">The Playback cursor is always bound to current state of emulated game. This means that emulator affects this cursor when emulating the game, and vice versa, when you move this cursor, you affect the emulator.</span></p> <p class="rvps7"><span class="rvts20">There's one limitation in the controlling of the cursor: sometimes it can't immediately move to the desired frame, seeking takes some time.</span></p>
<p class="rvps10"><span class="rvts21">There's one limitation in the controlling of the cursor: sometimes it can't immediately move to the desired frame, seeking takes some time.</span></p> <p class="rvps7"><span class="rvts20">When the "Follow cursor" checkbox in the Playback panel is checked, the Piano Roll automatically scrolls after the Playback cursor (except when seeking).</span></p>
<p class="rvps10"><span class="rvts21">When the "Follow cursor" checkbox in the Playback panel is checked, the Piano Roll automatically scrolls after the Playback cursor (except when seeking).</span></p> <p class="rvps7"><a name="frame-advance-rewind"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="frame-advance-rewind"></a> <p class="rvps7"><span class="rvts21">1. Frame-by-frame shift</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">1. Frame-by-frame shift</span></p> <p class="rvps7"><span class="rvts20">Click on </span><span class="rvts26">&lt;</span><span class="rvts20"> or </span><span class="rvts26">&gt;</span><span class="rvts20"> button in the Playback panel, or press </span><span class="rvts27">Shift + Up</span><span class="rvts20"> or </span><span class="rvts27">Shift + Down</span><span class="rvts20">, or use </span><span class="rvts23">Frame Rewind </span><span class="rvts20">or </span><span class="rvts23">Frame Advance</span><span class="rvts20"> hotkey to move the Playback cursor 1 frame back of forward.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">Click on </span><span class="rvts29">&lt;</span><span class="rvts21"> or </span><span class="rvts29">&gt;</span><span class="rvts21"> button in the Playback panel, or press </span><span class="rvts30">Shift + Up</span><span class="rvts21"> or </span><span class="rvts30">Shift + Down</span><span class="rvts21">, or use </span><span class="rvts26">Frame Rewind </span><span class="rvts21">or </span><span class="rvts26">Frame Advance</span><span class="rvts21"> hotkey to move the Playback cursor 1 frame back of forward.</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<p class="rvps10"><span class="rvts21">When to use:</span></p> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to explore events of current segment carefully</span></li>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to explore events of current segment carefully</span></li>
</ul> </ul>
<p class="rvps10"><a name="rewinding-by-wheel"></a> <p class="rvps7"><a name="rewinding-by-wheel"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">2. Rewinding by mouse wheel</span></p>
<p class="rvps10"><span class="rvts22">2. Rewinding by mouse wheel</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Hold the right mouse button and r</span><span class="rvts20">oll mouse wheel up or down </span><span class="rvts20">to move the Playback cursor.</span></p>
<p class="rvps10"><span class="rvts21">Hold the right mouse button and r</span><span class="rvts21">oll mouse wheel up or down </span><span class="rvts21">to move the Playback cursor.</span></p> <p class="rvps7"><span class="rvts20">The mouse cursor can be pointing anywhere.</span></p>
<p class="rvps10"><span class="rvts21">The mouse cursor can be pointing anywhere.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to explore events of current segment carefully/quickly</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to explore events of current segment carefully/quickly</span></li>
</ul> </ul>
<p class="rvps10"><a name="drag-playback"></a> <p class="rvps7"><a name="drag-playback"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">3. Dragging with mouse</span></p>
<p class="rvps10"><span class="rvts46">3. Dragging with mouse</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Click on any cell in the leftmost column of the Piano Roll ("Icons" column) to send the Playback cursor to the frame. Also, click on any cell of the column and hold the left mouse button to drag the Playback cursor by moving the mouse. This method also allows to scroll the Piano Roll by dragging the Playback cursor outside (above or below the Piano Roll).</span></p>
<p class="rvps10"><span class="rvts21">Click on any cell in the leftmost column of the Piano Roll ("Icons" column) to send the Playback cursor to the frame. Also, click on any cell of the column and hold the left mouse button to drag the Playback cursor by moving the mouse. This method also allows to scroll the Piano Roll by dragging the Playback cursor outside (above or below the Piano Roll).</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen </span><span class="rvts20">you're </span><span class="rvts20">searching for an in-game event of the movie</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen </span><span class="rvts21">you're </span><span class="rvts21">searching for an in-game event of the movie</span></li>
</ul> </ul>
<p class="rvps10"><a name="playback-jumping-markers"></a> <p class="rvps7"><a name="playback-jumping-markers"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">4. Jumping on Markers</span></p>
<p class="rvps10"><span class="rvts22">4. Jumping on Markers</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Click on </span><span class="rvts26">&lt;&lt;</span><span class="rvts20"> or </span><span class="rvts26">&gt;&gt;</span><span class="rvts20"> button in the Playback panel, or press </span><span class="rvts27">Shift + Page Up</span><span class="rvts20"> or </span><span class="rvts27">Shift + Page Down</span><span class="rvts20">, or hold </span><span class="rvts27">Shift</span><span class="rvts20"> and roll the mouse wheel to move the Playback cursor to previous or next Marker.</span></p>
<p class="rvps10"><span class="rvts21">Click on </span><span class="rvts29">&lt;&lt;</span><span class="rvts21"> or </span><span class="rvts29">&gt;&gt;</span><span class="rvts21"> button in the Playback panel, or press </span><span class="rvts30">Shift + Page Up</span><span class="rvts21"> or </span><span class="rvts30">Shift + Page Down</span><span class="rvts21">, or hold </span><span class="rvts30">Shift</span><span class="rvts21"> and roll the mouse wheel to move the Playback cursor to previous or next Marker.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to set the Playback cursor to the beginning of currently played segment (provided that the frame of the beginning is marked)</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to set the Playback cursor to the beginning of currently played segment (provided that the frame of the beginning is marked)</span></li> <li class="rvps7"><span class="rvts20">when you want to see </span><span class="rvts20">events of previous/next segments</span></li>
<li class="rvps10"><span class="rvts21">when you want to see </span><span class="rvts21">events of previous/next segments</span></li>
</ul> </ul>
<p class="rvps10"><a name="jump-bookmark"></a> <p class="rvps7"><a name="jump-bookmark"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">5. Jumping to Bookmarks</span></p>
<p class="rvps10"><span class="rvts22">5. Jumping to Bookmarks</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Press the hotkey (</span><span class="rvts23">0-9</span><span class="rvts20">) corresponding to the number of desired Bookmark, or click on a frame number in Bookmarks List, or click on a Bookmark icon in the Branches Tree to send the Playback cursor to the bookmarked frame.</span></p>
<p class="rvps10"><span class="rvts21">Press the hotkey (</span><span class="rvts26">0-9</span><span class="rvts21">) corresponding to the number of desired Bookmark, or click on a frame number in Bookmarks List, or click on a Bookmark icon in the Branches Tree to send the Playback cursor to the bookmarked frame.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to re-watch events of the movie starting from a bookmarked frame (e.g. watch the movie from the beginning of Level 2)</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to re-watch events of the movie starting from a bookmarked frame (e.g. watch the movie from the beginning of Level 2)</span></li> <li class="rvps7"><span class="rvts20">when you changed Input before the bookmarked frame and want to see new events at the frame</span></li>
<li class="rvps10"><span class="rvts21">when you changed Input before the bookmarked frame and want to see new events at the frame</span></li>
</ul> </ul>
<p class="rvps10"><a name="playback-home-end"></a> <p class="rvps7"><a name="playback-home-end"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">6. Jumping to the beginning / to the end of the movie</span></p>
<p class="rvps10"><span class="rvts22">6. Jumping to the beginning / to the end of the movie</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Press </span><span class="rvts27">Shift + </span><span class="rvts27">Home</span><span class="rvts20"> or </span><span class="rvts27">Shift + </span><span class="rvts27">End</span><span class="rvts20">, or click the cloudlet or the fireball in the Branches Tree to move the Playback cursor to the beginning or to the end of the movie.</span></p>
<p class="rvps10"><span class="rvts21">Press </span><span class="rvts30">Shift + </span><span class="rvts30">Home</span><span class="rvts21"> or </span><span class="rvts30">Shift + </span><span class="rvts30">End</span><span class="rvts21">, or click the cloudlet or the fireball in the Branches Tree to move the Playback cursor to the beginning or to the end of the movie.</span></p> <p class="rvps7"><span class="rvts20">You can also press the </span><span class="rvts23">Play movie from the beginning</span><span class="rvts20"> hotkey (</span><span class="rvts23">Shift + R</span><span class="rvts20"> by default) to move the Playback cursor to the beginning of the movie.</span></p>
<p class="rvps10"><span class="rvts21">You can also press the </span><span class="rvts26">Play movie from the beginning</span><span class="rvts21"> hotkey (</span><span class="rvts26">Shift + R</span><span class="rvts21"> by default) to move the Playback cursor to the beginning of the movie.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you want to watch the movie from the very beginning</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you want to watch the movie from the very beginning</span></li> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to fill all movie frames with Greenzone data</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to fill all movie frames with Greenzone data</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="selection-cursor"></a> <p class="rvps7"><a name="selection-cursor"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts45">Selection cursor navigation</span></p>
<p><span class="rvts53">Selection cursor navigation</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Selection cursor is usually located on the frame where the most recent changes of Input were made, but you can also move the cursor to any other frame when needed.</span></p>
<p class="rvps10"><span class="rvts21">Selection cursor is usually located on the frame where the most recent changes of Input were made, but you can also move the cursor to any other frame when needed.</span></p> <p class="rvps7"><span class="rvts20">The Piano Roll automatically scrolls after the Selection.</span></p>
<p class="rvps10"><span class="rvts21">The Piano Roll automatically scrolls after the Selection.</span></p> <p class="rvps7"><a name="selection-up-down"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="selection-up-down"></a> <p class="rvps7"><span class="rvts21">1. Frame-by-frame shift</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">1. Frame-by-frame shift</span></p> <p class="rvps7"><span class="rvts20">Press </span><span class="rvts27">Ctrl + Up</span><span class="rvts20"> or </span><span class="rvts27">Ctrl + Down</span><span class="rvts20"> to move current Selection 1 frame up or down.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">Press </span><span class="rvts30">Ctrl + Up</span><span class="rvts21"> or </span><span class="rvts30">Ctrl + Down</span><span class="rvts21"> to move current Selection 1 frame up or down.</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<p class="rvps10"><span class="rvts21">When to use:</span></p> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to transpose Selection up or down</span></li>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to transpose Selection up or down</span></li>
</ul> </ul>
<p class="rvps10"><a name="selection-home-end"></a> <p class="rvps7"><a name="selection-home-end"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">2. Moving Selection to the beginning / to the end of the movie</span></p>
<p class="rvps10"><span class="rvts22">2. Moving Selection to the beginning / to the end of the movie</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Press </span><span class="rvts27">Ctrl + </span><span class="rvts27">Home</span><span class="rvts20"> or </span><span class="rvts27">Ctrl + </span><span class="rvts27">End</span><span class="rvts20"> to move current Selection to the beginning or to the end of the movie.</span></p>
<p class="rvps10"><span class="rvts21">Press </span><span class="rvts30">Ctrl + </span><span class="rvts30">Home</span><span class="rvts21"> or </span><span class="rvts30">Ctrl + </span><span class="rvts30">End</span><span class="rvts21"> to move current Selection to the beginning or to the end of the movie.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to select the same set of frames at the beginning or at the end of the movie</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to select the same set of frames at the beginning or at the end of the movie</span></li>
</ul> </ul>
<p class="rvps10"><a name="selection-jumping-markers"></a> <p class="rvps7"><a name="selection-jumping-markers"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">3. Jumping on Markers</span></p>
<p class="rvps10"><span class="rvts22">3. Jumping on Markers</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Click on </span><span class="rvts26">&lt;&lt;</span><span class="rvts20"> or </span><span class="rvts26">&gt;&gt;</span><span class="rvts20"> button at the bottom of the Toolbox, or press </span><span class="rvts27">Ctrl + Page Up</span><span class="rvts20"> or </span><span class="rvts27">Ctrl + Page Down</span><span class="rvts20">, or hold </span><span class="rvts27">Ctrl</span><span class="rvts20"> and roll the mouse wheel</span><span class="rvts20"> to move Selection cursor </span><span class="rvts20">to previous or next Marker.</span></p>
<p class="rvps10"><span class="rvts21">Click on </span><span class="rvts29">&lt;&lt;</span><span class="rvts21"> or </span><span class="rvts29">&gt;&gt;</span><span class="rvts21"> button at the bottom of the Toolbox, or press </span><span class="rvts30">Ctrl + Page Up</span><span class="rvts21"> or </span><span class="rvts30">Ctrl + Page Down</span><span class="rvts21">, or hold </span><span class="rvts30">Ctrl</span><span class="rvts21"> and roll the mouse wheel</span><span class="rvts21"> to move Selection cursor </span><span class="rvts21">to previous or next Marker.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">when you need to set the Selection cursor to the beginning of currently edited segment (provided that the frame of the beginning is marked)</span></li>
<li class="rvps10"><span class="rvts21">when you need to set the Selection cursor to the beginning of currently edited segment (provided that the frame of the beginning is marked)</span></li> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you want to move to </span><span class="rvts20">previous/next segments</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you want to move to </span><span class="rvts21">previous/next segments</span></li>
</ul> </ul>
<p class="rvps10"><a name="selection-history"></a> <p class="rvps7"><a name="selection-history"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">4. Tracking the Selection History</span></p>
<p class="rvps10"><span class="rvts22">4. Tracking the Selection History</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Press </span><span class="rvts27">Ctrl + Q</span><span class="rvts20"> or </span><span class="rvts27">Ctrl + W</span><span class="rvts20"> to revert Selection to its previous or next state.</span></p>
<p class="rvps10"><span class="rvts21">Press </span><span class="rvts30">Ctrl + Q</span><span class="rvts21"> or </span><span class="rvts30">Ctrl + W</span><span class="rvts21"> to revert Selection to its previous or next state.</span></p> <p class="rvps7"><span class="rvts20">This method of navigation allows to return to previously edited segments and quickly recollect the sequence of recent changes.&nbsp;</span></p>
<p class="rvps10"><span class="rvts21">This method of navigation allows to return to previously edited segments and quickly recollect the sequence of recent changes. </span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to return to previously edited segment</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to return to previously edited segment</span></li> <li class="rvps7"><span class="rvts20">w</span><span class="rvts20">hen you need to select the same set of frames as before</span></li>
<li class="rvps10"><span class="rvts21">w</span><span class="rvts21">hen you need to select the same set of frames as before</span></li>
</ul> </ul>
<p class="rvps10"><a name="reselect-clipboard"></a> <p class="rvps7"><a name="reselect-clipboard"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">5. Returning to the origin of Clipboard data</span></p>
<p class="rvps10"><span class="rvts22">5. Returning to the origin of Clipboard data</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Press </span><span class="rvts27">Ctrl + B</span><span class="rvts20"> to revert Selection to its state at the moment of the last "Copy to Clipboard" operation.</span></p>
<p class="rvps10"><span class="rvts21">Press </span><span class="rvts30">Ctrl + B</span><span class="rvts21"> to revert Selection to its state at the moment of the last "Copy to Clipboard" operation.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">when you need to remember where the Input was copied from</span></li>
<li class="rvps10"><span class="rvts21">when you need to remember where the Input was copied from</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="special"></a> <p class="rvps7"><a name="special"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts45">Special</span></p>
<p><span class="rvts53">Special</span></p> <p class="rvps2"><span class="rvts20"><br/></span></p>
<p><span class="rvts21"><br/></span></p> <p class="rvps7"><a name="find-note"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="find-note"></a> <p class="rvps7"><span class="rvts21">1. Finding Markers with a given text</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">1. Finding Markers with a given text</span></p> <p class="rvps7"><span class="rvts20">Open the </span><span class="rvts22">Find Note</span><span class="rvts20"> window, enter the text to search and click </span><span class="rvts26">Find next</span><span class="rvts20"> or press Enter key to set the Selection cursor to the closest Marker which Note contains the text. </span><span class="rvts20">The Piano Roll automatically scrolls after the Selection. You can search up or down from the current position of the Selection cursor.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">Open the </span><span class="rvts25">Find Note</span><span class="rvts21"> window, enter the text to search and click </span><span class="rvts29">Find next</span><span class="rvts21"> or press Enter key to set the Selection cursor to the closest Marker which Note contains the text. </span><span class="rvts21">The Piano Roll automatically scrolls after the Selection. You can search up or down from the current position of the Selection cursor.</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<p class="rvps10"><span class="rvts21">When to use:</span></p> <li class="rvps7"><span class="rvts20">when you need to find the segment, knowing some of the exact text it is labeled with</span></li>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts21">when you need to find the segment, knowing some of the exact text it is labeled with</span></li>
</ul> </ul>
<p class="rvps10"><a name="similar-note"></a> <p class="rvps7"><a name="similar-note"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">2. Jumping to the segment with similar description</span></p>
<p class="rvps10"><span class="rvts22">2. Jumping to the segment with similar description</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Leave the Playback cursor in the current segment and click the </span><span class="rvts26">Similar</span><span class="rvts20"> or </span><span class="rvts26">More</span><span class="rvts20"> button to set the Selection cursor to the Marker containing the most relevant Note. </span><span class="rvts20">The Piano Roll automatically scrolls after the Selection.</span></p>
<p class="rvps10"><span class="rvts21">Leave the Playback cursor in the current segment and click the </span><span class="rvts29">Similar</span><span class="rvts21"> or </span><span class="rvts29">More</span><span class="rvts21"> button to set the Selection cursor to the Marker containing the most relevant Note. </span><span class="rvts21">The Piano Roll automatically scrolls after the Selection.</span></p> <p class="rvps7"><span class="rvts20">This method is described in the </span><a class="rvts24" href="AdvancedFeatures.html#UsingMarkers">Advanced Features</a><span class="rvts20"> chapter.</span></p>
<p class="rvps10"><span class="rvts21">This method is described in the </span><a class="rvts27" href="AdvancedFeatures.html#UsingMarkers">Advanced Features</a><span class="rvts21"> chapter.</span></p> <p class="rvps7"><span class="rvts20">When to use:</span></p>
<p class="rvps10"><span class="rvts21">When to use:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">when you need to find the segment with a description similar to currently played segment.</span></li>
<li class="rvps10"><span class="rvts21">when you need to find the segment with a description similar to currently played segment.</span></li>
</ul> </ul>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/create-epub-ebooks">Write EPub books for the iPad</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/feature-tour">Easily create PDF Help documents</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,164 +1,352 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>4.2. Nonlinear TASing</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>4.2. Nonlinear TASing</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="4.2. Nonlinear TASing">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="4.2. Nonlinear TASing" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("NonlinearTASing"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>4.2. Nonlinear TASing</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; <a href="TASingMethodology.html">4. TASing Methodology</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="TASingMethodology.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="TraditionalTASing.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="SemiautomaticTASing.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="NonlinearTASing"
data-hnd-context="11"
data-hnd-title="4.2. Nonlinear TASing"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li><li><a href="TASingMethodology.html">4. TASing Methodology</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="TASingMethodology.html" title="4. TASing Methodology" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="TraditionalTASing.html" title="4.1. Traditional TASing" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="SemiautomaticTASing.html" title="4.3. Semiautomatic TASing" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>4.2. Nonlinear TASing</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Nonlinear TASing</span></p> <p class="rvps2"><span class="rvts18">Nonlinear TASing</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-method2.png"/></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-method2.png"></p>
<p class="rvps10"><span class="rvts21">This is the main method when working with Taseditor. At first it may seem rather different from the traditional TASing, however, they are essentially very similar.</span></p> <p class="rvps7"><span class="rvts20">This is the main method when working with Taseditor. At first it may seem rather different from the traditional TASing, however, they are essentially very similar.</span></p>
<p class="rvps10"><span class="rvts21">When using this method, the Recording mode should always be off. The </span><span class="rvts21">"Auto-restore last position" checkbox should be disabled. The "Turbo seek" and "Follow cursor" checkboxes are usually disabled, but may be enabled when necessary.</span></p> <p class="rvps7"><span class="rvts20">When using this method, the Recording mode should always be off. The </span><span class="rvts20">"Auto-restore last position" checkbox should be disabled. The "Turbo seek" and "Follow cursor" checkboxes are usually disabled, but may be enabled when necessary.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">General activity:</span></p> <p class="rvps7"><span class="rvts21">General activity:</span></p>
<p class="rvps10"><span class="rvts48"><br/></span></p> <p class="rvps7"><span class="rvts22"><br/></span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ol style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10"><span class="rvts21">Scroll the Piano Roll to the beginning of the edited segment, put</span><span class="rvts21"> the Playback cursor here, define the goal. It's also recommended to mark the beginning with a Marker</span><span class="rvts21">.</span></li> <li value="1" class="rvps7"><span class="rvts20">Scroll the Piano Roll to the beginning of the edited segment, put</span><span class="rvts20"> the Playback cursor here, define the goal. It's also recommended to mark the beginning with a Marker</span><span class="rvts20">.</span></li>
<li class="rvps10"><span class="rvts21">Suppose there's a mistake in the segment, weigh known factors of optimality and figure out the way to fix the mistake.</span></li> <li value="2" class="rvps7"><span class="rvts20">Suppose there's a mistake in the segment, weigh known factors of optimality and figure out the way to fix the mistake.</span></li>
<li class="rvps10"><span class="rvts21">The mouse cursor navigation to any frame of the current segment is practically instant.</span></li> <li value="3" class="rvps7"><span class="rvts20">The mouse cursor navigation to any frame of the current segment is practically instant.</span></li>
<li class="rvps10"><span class="rvts21">Edit the segment with the mouse. You can either change the Input blindly, or move the Playback cursor from time to time in order to check with the game. The steps 3 and 4 are constantly alternating until you consider the editing complete.</span></li> <li value="4" class="rvps7"><span class="rvts20">Edit the segment with the mouse. You can either change the Input blindly, or move the Playback cursor from time to time in order to check with the game. The steps 3 and 4 are constantly alternating until you consider the editing complete.</span></li>
<li class="rvps10"><span class="rvts21">Detect the end of the segment by putting the Playback cursor at the target event.</span></li> <li value="5" class="rvps7"><span class="rvts20">Detect the end of the segment by putting the Playback cursor at the target event.</span></li>
<li class="rvps10"><span class="rvts21">[</span><span class="rvts34">optional step</span><span class="rvts21">] Save the finished approach to any free Bookmark, e.g. to slot </span><span class="rvts26">8</span><span class="rvts21"> or </span><span class="rvts26">7</span><span class="rvts21">.</span></li> <li value="6" class="rvps7"><span class="rvts20">[</span><span class="rvts31">optional step</span><span class="rvts20">] Save the finished approach to any free Bookmark, e.g. to slot </span><span class="rvts23">8</span><span class="rvts20"> or </span><span class="rvts23">7</span><span class="rvts20">.</span></li>
<li class="rvps10"><span class="rvts21">If this isn't the first approach to the segment, compare the new result to the best old result, using the optimality criterion. If the new approach is better (or it's the first approach), save the result to the Bookmark </span><span class="rvts26">9</span><span class="rvts21">. The slot </span><span class="rvts26">9</span><span class="rvts21"> will be used for keeping the best result of polishing the segment.</span></li> <li value="7" class="rvps7"><span class="rvts20">If this isn't the first approach to the segment, compare the new result to the best old result, using the optimality criterion. If the new approach is better (or it's the first approach), save the result to the Bookmark </span><span class="rvts23">9</span><span class="rvts20">. The slot </span><span class="rvts23">9</span><span class="rvts20"> will be used for keeping the best result of polishing the segment.</span></li>
<li class="rvps10"><span class="rvts21">If you still want to try different approaches, return to step 2, until you run out of ideas.</span></li> <li value="8" class="rvps7"><span class="rvts20">If you still want to try different approaches, return to step 2, until you run out of ideas.</span></li>
<li class="rvps10"><span class="rvts21">[</span><span class="rvts34">optional step</span><span class="rvts21">] If you need more ideas, you can get some information from the past or the future by moving the Playback cursor to different segments of the movie or unpausing the emulator. When necessary, you can quickly draw a rough Input for watching the upcoming events of the game.</span></li> <li value="9" class="rvps7"><span class="rvts20">[</span><span class="rvts31">optional step</span><span class="rvts20">] If you need more ideas, you can get some information from the past or the future by moving the Playback cursor to different segments of the movie or unpausing the emulator. When necessary, you can quickly draw a rough Input for watching the upcoming events of the game.</span></li>
<li class="rvps10"><span class="rvts21">When there's no more ideas, restore the best approach from the History Log or the Bookmark </span><span class="rvts26">9</span><span class="rvts21"> into the current movie and proceed to the next segment.</span></li> <li value="10" class="rvps7"><span class="rvts20">When there's no more ideas, restore the best approach from the History Log or the Bookmark </span><span class="rvts23">9</span><span class="rvts20"> into the current movie and proceed to the next segment.</span></li>
</ol> </ol>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Since all created approaches to playing the segment are automatically saved in the History Log, you could follow the temptation to rely on the Log and not save the approaches to Bookmarks (steps 6 and 7), instead just reach the target event once and then experiment with this Input, gradually improving it (and simply undoing all the changes that are for the worse). Such perfunctory way of TASing is technically possible, but not recommended, because it doesn't let you think far outside the terms of the first approach (because you subconsciously fear to lose the old best approach by leaving it too far away).</span></p> <p class="rvps7"><span class="rvts20">Since all created approaches to playing the segment are automatically saved in the History Log, you could follow the temptation to rely on the Log and not save the approaches to Bookmarks (steps 6 and 7), instead just reach the target event once and then experiment with this Input, gradually improving it (and simply undoing all the changes that are for the worse). Such perfunctory way of TASing is technically possible, but not recommended, because it doesn't let you think far outside the terms of the first approach (because you subconsciously fear to lose the old best approach by leaving it too far away).</span></p>
<p class="rvps10"><span class="rvts21">Even if the outcome of the latest modification of the Input made the game behave worse, you should not immediately forget it and revert to the previous state of the movie, better try to examine the cause of the worsening and continue the modification to turn it into an improvement. And in order to never be afraid to lose the previous successful playthrough in the depths of the History Log, you should do exactly like they do in the traditional TASing allot a special slot for storing the best result and set this Bookmark to the end of the segment every time you improve the result.</span></p> <p class="rvps7"><span class="rvts20">Even if the outcome of the latest modification of the Input made the game behave worse, you should not immediately forget it and revert to the previous state of the movie, better try to examine the cause of the worsening and continue the modification to turn it into an improvement. And in order to never be afraid to lose the previous successful playthrough in the depths of the History Log, you should do exactly like they do in the traditional TASing allot a special slot for storing the best result and set this Bookmark to the end of the segment every time you improve the result.</span></p>
<p class="rvps10"><span class="rvts21">And you can do the same with those promising approaches that are somewhat better, but somewhat worse than the current best result. When you're saving all alternative approaches to separate Bookmarks, you can safely remove their Input from the working movie or change it beyond recognition, because you can return to any of them with a single key press, and no need to search within the History Log.</span></p> <p class="rvps7"><span class="rvts20">And you can do the same with those promising approaches that are somewhat better, but somewhat worse than the current best result. When you're saving all alternative approaches to separate Bookmarks, you can safely remove their Input from the working movie or change it beyond recognition, because you can return to any of them with a single key press, and no need to search within the History Log.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Unlike the traditional TASing method, here you may lose sight of dividing the movie into logical segments, because now you don't have to mark the beginning and the end of the current segment with Bookmarks. However, it's still recommended to keep an order and mark the beginning of every important segment with Markers, in order to limit the number of optimality factors.</span></p> <p class="rvps7"><span class="rvts20">Unlike the traditional TASing method, here you may lose sight of dividing the movie into logical segments, because now you don't have to mark the beginning and the end of the current segment with Bookmarks. However, it's still recommended to keep an order and mark the beginning of every important segment with Markers, in order to limit the number of optimality factors.</span></p>
<p class="rvps10"><span class="rvts21">The beginning and the end of a segment are usually associated with certain events of the game, and not with a soulless frame number. But since the starting event of the segment is not affected by modifying the Input of the segment, this event will always occur at the same frame, so you can lock the frame with a Marker.</span></p> <p class="rvps7"><span class="rvts20">The beginning and the end of a segment are usually associated with certain events of the game, and not with a soulless frame number. But since the starting event of the segment is not affected by modifying the Input of the segment, this event will always occur at the same frame, so you can lock the frame with a Marker.</span></p>
<p class="rvps10"><span class="rvts21">The ending event of the segment may occur in various points of time, depending on the Input in the segment. So if you mark the end with a Marker, you will need to move the Marker up or down every time you change the target event by modifying the Input. Often it's impractical to spend time on dragging Markers, so instead of the trailing Marker you can use the aforementioned Bookmark which stores the best approach and its icon serves as a mark of the end of current segment.</span></p> <p class="rvps7"><span class="rvts20">The ending event of the segment may occur in various points of time, depending on the Input in the segment. So if you mark the end with a Marker, you will need to move the Marker up or down every time you change the target event by modifying the Input. Often it's impractical to spend time on dragging Markers, so instead of the trailing Marker you can use the aforementioned Bookmark which stores the best approach and its icon serves as a mark of the end of current segment.</span></p>
<p class="rvps10"><a name="GreenArrow"></a> <p class="rvps7"><a name="GreenArrow"></a><span class="rvts20">As for simple segments, you can polish them without marking the ending frame at all, by simply relying on your own memory and on the green arrow provided by Taseditor. With this green arrow the Taseditor hints you the frame where you've stopped watching the segment the last time (before you started modifying the Input of the segment). Usually this is the frame where the target event was detected in previous approach. So you may as well replay the updated segment up to the frame and compare the new result with the old one. For example, if the target event is now detected 2 frames above the green arrow, it means you've outran previous result by 2 frames, so the new Input is better (if your criterion is speed). This entire logical chain pops in your mind once you glance at the Piano Roll after watching the outcome of the recent Input modification.</span></p>
<span class="rvts21">As for simple segments, you can polish them without marking the ending frame at all, by simply relying on your own memory and on the green arrow provided by Taseditor. With this green arrow the Taseditor hints you the frame where you've stopped watching the segment the last time (before you started modifying the Input of the segment). Usually this is the frame where the target event was detected in previous approach. So you may as well replay the updated segment up to the frame and compare the new result with the old one. For example, if the target event is now detected 2 frames above the green arrow, it means you've outran previous result by 2 frames, so the new Input is better (if your criterion is speed). This entire logical chain pops in your mind once you glance at the Piano Roll after watching the outcome of the recent Input modification.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The process of polishing the Input in the nonlinear method is a constant alternation of editing and watching the segment. You analyze the situation during the watching and right after stopping the watching.</span></p>
<p class="rvps10"><span class="rvts21">The process of polishing the Input in the nonlinear method is a constant alternation of editing and watching the segment. You analyze the situation during the watching and right after stopping the watching.</span></p> <p class="rvps7"><span class="rvts20">Possible ways to watch the outcome of Input:</span></p>
<p class="rvps10"><span class="rvts21">Possible ways to watch the outcome of Input:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">unpause the emulator by pressing the </span><span class="rvts23">Pause</span><span class="rvts20"> hotkey or the middle mouse button. After the segment ends, you have to pause emulator manually (and no problem if you stop it a bit later, since you can always rewind up)</span></li>
<li class="rvps10"><span class="rvts21">unpause the emulator by pressing the </span><span class="rvts26">Pause</span><span class="rvts21"> hotkey or the middle mouse button. After the segment ends, you have to pause emulator manually (and no problem if you stop it a bit later, since you can always rewind up)</span></li> <li class="rvps7"><span class="rvts20">start seeking to the green arrow by pressing the </span><span class="rvts23">Restore Playback</span><span class="rvts20"> hotkey or the middle mouse button (when the green arrow is outside the Greenzone).</span></li>
<li class="rvps10"><span class="rvts21">start seeking to the green arrow by pressing the </span><span class="rvts26">Restore Playback</span><span class="rvts21"> hotkey or the middle mouse button (when the green arrow is outside the Greenzone).</span></li> <li class="rvps7"><span class="rvts20">start seeking to the nearest Marker by holding </span><span class="rvts27">Shift</span><span class="rvts20"> and pressing the middle mouse button</span></li>
<li class="rvps10"><span class="rvts21">start seeking to the nearest Marker by holding </span><span class="rvts30">Shift</span><span class="rvts21"> and pressing the middle mouse button</span></li> <li class="rvps7"><span class="rvts20">start seeking to the Selection cursor by holding </span><span class="rvts27">Ctrl </span><span class="rvts20">and pressing the middle mouse button, granted that the Selection cursor is below the Playback cursor</span></li>
<li class="rvps10"><span class="rvts21">start seeking to the Selection cursor by holding </span><span class="rvts30">Ctrl </span><span class="rvts21">and pressing the middle mouse button, granted that the Selection cursor is below the Playback cursor</span></li> <li class="rvps7"><span class="rvts20">rewatch the segment from the Selection cursor position to the Playback cursor position by by holding </span><span class="rvts27">Ctrl </span><span class="rvts20">and pressing the middle mouse button, granted that the Selection cursor is above the Playback cursor</span></li>
<li class="rvps10"><span class="rvts21">rewatch the segment from the Selection cursor position to the Playback cursor position by by holding </span><span class="rvts30">Ctrl </span><span class="rvts21">and pressing the middle mouse button, granted that the Selection cursor is above the Playback cursor</span></li> <li class="rvps7"><span class="rvts20">just drag the Playback cursor manually, using the mouse cursor</span></li>
<li class="rvps10"><span class="rvts21">just drag the Playback cursor manually, using the mouse cursor</span></li> <li class="rvps7"><span class="rvts20">move the Playback cursor by holding the right mouse button and rolling the mouse wheel</span></li>
<li class="rvps10"><span class="rvts21">move the Playback cursor by holding the right mouse button and rolling the mouse wheel</span></li> <li class="rvps7"><span class="rvts20">shift the Playback cursor frame-by-frame using </span><span class="rvts23">Frame Rewind</span><span class="rvts20"> and </span><span class="rvts23">Frame Advance</span><span class="rvts20"> hotkeys or </span><span class="rvts26">&lt;</span><span class="rvts20"> and </span><span class="rvts26">&gt; </span><span class="rvts20">buttons or </span><span class="rvts27">Shift + Up</span><span class="rvts20"> и </span><span class="rvts27">Shift + Down</span><span class="rvts20"> keys</span></li>
<li class="rvps10"><span class="rvts21">shift the Playback cursor frame-by-frame using </span><span class="rvts26">Frame Rewind</span><span class="rvts21"> and </span><span class="rvts26">Frame Advance</span><span class="rvts21"> hotkeys or </span><span class="rvts29">&lt;</span><span class="rvts21"> and </span><span class="rvts29">&gt; </span><span class="rvts21">buttons or </span><span class="rvts30">Shift + Up</span><span class="rvts21"> и </span><span class="rvts30">Shift + Down</span><span class="rvts21"> keys</span></li> <li class="rvps7"><span class="rvts20">and there are other </span><a class="rvts24" href="Navigation.html#playback-cursor">ways of navigation with the Playback cursor</a><span class="rvts20">.</span></li>
<li class="rvps10"><span class="rvts21">and there are other </span><a class="rvts27" href="Navigation.html#playback-cursor">ways of navigation with the Playback cursor</a><span class="rvts21">.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Most often you are going to either click the middle mouse button or move the Playback cursor by scrolling the mouse wheel. Don't attach yourself to a single one of the ways, learn to use them depending on the situation.</span></p> <p class="rvps7"><span class="rvts20">Most often you are going to either click the middle mouse button or move the Playback cursor by scrolling the mouse wheel. Don't attach yourself to a single one of the ways, learn to use them depending on the situation.</span></p>
<p class="rvps10"><span class="rvts21">The ratio between the time spent on editing and on watching depends on the complexity of the current segment and on the volume of your knowledge about the game. The more you TAS a single game, the better you are aware of its regularities. So near the end of your project you'll be able to foresee the outcome of your Input modifications before even attempting to edit them in. Then you'll only need to watch the segment in order to confirm your guess.</span></p> <p class="rvps7"><span class="rvts20">The ratio between the time spent on editing and on watching depends on the complexity of the current segment and on the volume of your knowledge about the game. The more you TAS a single game, the better you are aware of its regularities. So near the end of your project you'll be able to foresee the outcome of your Input modifications before even attempting to edit them in. Then you'll only need to watch the segment in order to confirm your guess.</span></p>
<p class="rvps10"><span class="rvts21">In some cases you can judge about the optimality of an Input by seeing its interim results and not even watching the segment to the end. For example, if the character bumps into a wall and nullifies his speed in the middle of the segment, you can immediately guess that he is going to reach the target event later than previous time. So sometimes you want to only watch a few frames and continue the editing. However, such a hurry may lead you to reject a solution that is suboptimal at first glance but has a potential to be very successful in another segment. For example, after bumping the wall Mario may accidentally enter inside and go through it. That's why it's recommended to never hurry when TASing, and to watch the current segment to the end, where you can be sure the optimality criterion won't let you down.</span></p> <p class="rvps7"><span class="rvts20">In some cases you can judge about the optimality of an Input by seeing its interim results and not even watching the segment to the end. For example, if the character bumps into a wall and nullifies his speed in the middle of the segment, you can immediately guess that he is going to reach the target event later than previous time. So sometimes you want to only watch a few frames and continue the editing. However, such a hurry may lead you to reject a solution that is suboptimal at first glance but has a potential to be very successful in another segment. For example, after bumping the wall Mario may accidentally enter inside and go through it. That's why it's recommended to never hurry when TASing, and to watch the current segment to the end, where you can be sure the optimality criterion won't let you down.</span></p>
<p class="rvps10"><span class="rvts21">Technically you can watch and edit the Input simultaneously. When the </span><span class="rvts21">"Follow cursor" checkbox is disabled, the Piano Roll stays still, while the movie is played, so you can draw buttonpresses right when they are executed (replayed). For example, when Mario jumps over an obstacle, try to change the height of the jump by drawing and erasing the </span><span class="rvts29">A</span><span class="rvts21"> button presses without pausing the emulation. You can slow the emulation down by the </span><span class="rvts26">-</span><span class="rvts21"> and </span><span class="rvts26">=</span><span class="rvts21"> hotkeys, in order to have more time for clicking while watching.</span></p> <p class="rvps7"><span class="rvts20">Technically you can watch and edit the Input simultaneously. When the </span><span class="rvts20">"Follow cursor" checkbox is disabled, the Piano Roll stays still, while the movie is played, so you can draw buttonpresses right when they are executed (replayed). For example, when Mario jumps over an obstacle, try to change the height of the jump by drawing and erasing the </span><span class="rvts26">A</span><span class="rvts20"> button presses without pausing the emulation. You can slow the emulation down by the </span><span class="rvts23">-</span><span class="rvts20"> and </span><span class="rvts23">=</span><span class="rvts20"> hotkeys, in order to have more time for clicking while watching.</span></p>
<p class="rvps10"><span class="rvts21">But when you need to have enough time not just for clicking, but also for thinking, better pause the emulator and TAS properly.</span></p> <p class="rvps7"><span class="rvts20">But when you need to have enough time not just for clicking, but also for thinking, better pause the emulator and TAS properly.</span></p>
<p class="rvps10"><a name="turbo-seeking"></a> <p class="rvps7"><a name="turbo-seeking"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The emulation speed can be both decreased and increased. Before Taseditor, speeding up the emulation was used only for quick replay of the finished part of the movie. But now the </span><span class="rvts33">turbo emulation</span><span class="rvts20"> also serves as an original way of TASing. With an extremely fast emulation you can feel the interconnection between a buttonpress and its distant outcome.</span></p>
<p class="rvps10"><span class="rvts21">The emulation speed can be both decreased and increased. Before Taseditor, speeding up the emulation was used only for quick replay of the finished part of the movie. But now the </span><span class="rvts37">turbo emulation</span><span class="rvts21"> also serves as an original way of TASing. With an extremely fast emulation you can feel the interconnection between a buttonpress and its distant outcome.</span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/dw-luck_manipulation.gif"></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/dw-luck_manipulation.gif"/></p> <p class="rvps7"><a name="LuckManipulation"></a><span class="rvts20">A good example would be the process of luck manipulation.</span></p>
<p class="rvps10"><a name="LuckManipulation"></a> <p class="rvps7"><span class="rvts20">Normally, when shooting you can see the connection between pressing the </span><span class="rvts26">B</span><span class="rvts20"> button and a bullet appearing on screen at the next frame. Applying this association (</span><span class="rvts26">B</span><span class="rvts20"> = shot) to an in-game situation makes you think "the later I press </span><span class="rvts26">B</span><span class="rvts20">, the later the bullet will appear".</span></p>
<span class="rvts21">A good example would be the process of luck manipulation.</span></p> <p class="rvps7"><span class="rvts20">But with turbo-seeking you effectively skip all irrelevant steps of the movie (shooting, bullet flying, collision, enemy death, etc), so right after making the </span><span class="rvts26">B</span><span class="rvts20"> buttonpress you immediately see which item was dropped by the enemy. This new association (</span><span class="rvts26">B</span><span class="rvts20"> = possibility of a bonus item) makes you think about this in-game situation more like "the type of the item drop depends on when I press </span><span class="rvts26">B</span><span class="rvts20">".</span></p>
<p class="rvps10"><span class="rvts21">Normally, when shooting you can see the connection between pressing the </span><span class="rvts29">B</span><span class="rvts21"> button and a bullet appearing on screen at the next frame. Applying this association (</span><span class="rvts29">B</span><span class="rvts21"> = shot) to an in-game situation makes you think "the later I press </span><span class="rvts29">B</span><span class="rvts21">, the later the bullet will appear".</span></p> <p class="rvps7"><span class="rvts20">This way turbo allows to automatically filter useless information that is produced by the game in the middle of the segment, and only consume the necessary data that appears at the end of the segment.</span></p>
<p class="rvps10"><span class="rvts21">But with turbo-seeking you effectively skip all irrelevant steps of the movie (shooting, bullet flying, collision, enemy death, etc), so right after making the </span><span class="rvts29">B</span><span class="rvts21"> buttonpress you immediately see which item was dropped by the enemy. This new association (</span><span class="rvts29">B</span><span class="rvts21"> = possibility of a bonus item) makes you think about this in-game situation more like "the type of the item drop depends on when I press </span><span class="rvts29">B</span><span class="rvts21">".</span></p> <p class="rvps7"><span class="rvts20">Here's how you do it:</span></p>
<p class="rvps10"><span class="rvts21">This way turbo allows to automatically filter useless information that is produced by the game in the middle of the segment, and only consume the necessary data that appears at the end of the segment.</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<p class="rvps10"><span class="rvts21">Here's how you do it:</span></p> <li class="rvps7"><span class="rvts20">Switch on the "Turbo seek" checkbox. Switch off the </span><span class="rvts20">"Follow cursor".</span></li>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">Set a trial buttonpress of the </span><span class="rvts26">B</span><span class="rvts20"> at the beginning of the segment where you can shoot the enemy.</span></li>
<li class="rvps10"><span class="rvts21">Switch on the "Turbo seek" checkbox. Switch off the </span><span class="rvts21">"Follow cursor".</span></li> <li class="rvps7"><span class="rvts20">Watch how the bullet hits the enemy and leave the Playback cursor at the frame where the item is supposedly laying on the ground for a second or two. That will be the end of current segment.</span></li>
<li class="rvps10"><span class="rvts21">Set a trial buttonpress of the </span><span class="rvts29">B</span><span class="rvts21"> at the beginning of the segment where you can shoot the enemy.</span></li> <li class="rvps7"><span class="rvts20">So we assume that the first try didn't bring you the needed item, but you know that killing the enemy a bit later may change the outcome. </span><span class="rvts20">Move the </span><span class="rvts26">B</span><span class="rvts20"> buttonpress forward one frame (just insert a blank frame before the old position of the buttonpress).</span></li>
<li class="rvps10"><span class="rvts21">Watch how the bullet hits the enemy and leave the Playback cursor at the frame where the item is supposedly laying on the ground for a second or two. That will be the end of current segment.</span></li> <li class="rvps7"><span class="rvts20">This action makes Taseditor rewind the game back, and on FCEUX screen you can see the moment before shooting.</span></li>
<li class="rvps10"><span class="rvts21">So we assume that the first try didn't bring you the needed item, but you know that killing the enemy a bit later may change the outcome. </span><span class="rvts21">Move the </span><span class="rvts29">B</span><span class="rvts21"> buttonpress forward one frame (just insert a blank frame before the old position of the buttonpress).</span></li> <li class="rvps7"><span class="rvts20">Press the middle mouse button or </span><span class="rvts23">Spacebar</span><span class="rvts20"> (the key assigned to the </span><span class="rvts23">Restore Playback</span><span class="rvts20"> hotkey). The game events will replay like a flash, and you'll almost immediately see which item the enemy drops now.</span></li>
<li class="rvps10"><span class="rvts21">This action makes Taseditor rewind the game back, and on FCEUX screen you can see the moment before shooting.</span></li> <li class="rvps7"><span class="rvts20">If the result is not satisfying, press </span><span class="rvts27">Ctrl + Shift + Insert</span><span class="rvts20"> again, thus inserting another frame before the existing </span><span class="rvts26">B</span><span class="rvts20"> buttonpress. The shot is delayed by one more frame. Restore Playback again to see the new result.</span></li>
<li class="rvps10"><span class="rvts21">Press the middle mouse button or </span><span class="rvts26">Spacebar</span><span class="rvts21"> (the key assigned to the </span><span class="rvts26">Restore Playback</span><span class="rvts21"> hotkey). The game events will replay like a flash, and you'll almost immediately see which item the enemy drops now.</span></li> <li class="rvps7"><span class="rvts20">Continue until you find the frame where shooting the enemy brings you the needed item. This way you can test a hundred of options within a minute, by simply pressing the hotkeys and only watching the FCEUX screen.</span></li>
<li class="rvps10"><span class="rvts21">If the result is not satisfying, press </span><span class="rvts30">Ctrl + Shift + Insert</span><span class="rvts21"> again, thus inserting another frame before the existing </span><span class="rvts29">B</span><span class="rvts21"> buttonpress. The shot is delayed by one more frame. Restore Playback again to see the new result.</span></li>
<li class="rvps10"><span class="rvts21">Continue until you find the frame where shooting the enemy brings you the needed item. This way you can test a hundred of options within a minute, by simply pressing the hotkeys and only watching the FCEUX screen.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Pros of the method:</span></p> <p class="rvps7"><span class="rvts20">Pros of the method:</span></p>
<p class="rvps14"><span class="rvts22">+ </span><span class="rvts21">Instant navigation.</span></p> <p class="rvps9"><span class="rvts21">+ </span><span class="rvts20">Instant navigation.</span></p>
<p class="rvps14"><span class="rvts22">+ </span><span class="rvts21">Possibility to skip useless scenes.</span></p> <p class="rvps9"><span class="rvts21">+ </span><span class="rvts20">Possibility to skip useless scenes.</span></p>
<p class="rvps14"><span class="rvts22">+ </span><span class="rvts21">Detachment from the game flow increases the objectivity of analysis.</span></p> <p class="rvps9"><span class="rvts21">+ </span><span class="rvts20">Detachment from the game flow increases the objectivity of analysis.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Cons of the method:</span></p> <p class="rvps7"><span class="rvts20">Cons of the method:</span></p>
<p class="rvps14"><span class="rvts22"> </span><span class="rvts21">Lack of the feedback inherent to normal game-player interaction.</span></p> <p class="rvps9"><span class="rvts21"> </span><span class="rvts20">Lack of the feedback inherent to normal game-player interaction.</span></p>
<p class="rvps14"><span class="rvts22"> </span><span class="rvts21">Emphasis on the mouse controls.</span></p> <p class="rvps9"><span class="rvts21"> </span><span class="rvts20">Emphasis on the mouse controls.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">When the method is recommended to use:</span><span class="rvts21"> most of time. Combine this method with the next method in order to construct the full picture of the in-game possibilities.</span></p> <p class="rvps7"><span class="rvts22">When the method is recommended to use:</span><span class="rvts20"> most of time. Combine this method with the next method in order to construct the full picture of the in-game possibilities.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="SemiautomaticTASing.html">The next method</a><span class="rvts21"> fixes the main disadvantage of this method.</span></p> <p class="rvps7"><a class="rvts24" href="SemiautomaticTASing.html">The next method</a><span class="rvts20"> fixes the main disadvantage of this method.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/feature-tour">Easily create EBooks</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@ -1,156 +1,348 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>2.1. Piano Roll</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>2.1. Piano Roll</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="2.1. Piano Roll">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="2.1. Piano Roll" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("PianoRoll"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>2.1. Piano Roll</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; <a href="ProgramInterface.html">2. Program Interface</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="ProgramInterface.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="ProgramInterface.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="Toolbox.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="PianoRoll"
data-hnd-context="6"
data-hnd-title="2.1. Piano Roll"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li><li><a href="ProgramInterface.html">2. Program Interface</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="ProgramInterface.html" title="2. Program Interface" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="ProgramInterface.html" title="2. Program Interface" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="Toolbox.html" title="2.2. Toolbox" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>2.1. Piano Roll</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Piano Roll</span></p> <p class="rvps2"><span class="rvts18">Piano Roll</span></p>
<p class="rvps5"><span class="rvts36"><br/></span></p> <p class="rvps3"><span class="rvts20"><br/></span></p>
<p class="rvps5"><img alt="" style="padding : 1px;" src="lib/taseditor-smb.png"/></p> <p class="rvps3"><img alt="" style="padding : 1px;" src="lib/taseditor-smb.png"></p>
<p class="rvps21"><span class="rvts21"><br/></span></p> <p class="rvps13"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Taseditor's workspace is similar to the interface found in many music-sequencing programs. Piano Roll is a table containing the most necessary data about the edited project. Users can both observe that data and edit it by mouse clicks on various cells of the table.</span></p> <p class="rvps7"><span class="rvts20">Taseditor's workspace is similar to the interface found in many music-sequencing programs. Piano Roll is a table containing the most necessary data about the edited project. Users can both observe that data and edit it by mouse clicks on various cells of the table.</span></p>
<p class="rvps10"><span class="rvts21">If you just opened the Taseditor window you will most likely see an empty project that contains only the starting (zeroth) frame of the movie. So, before you begin any experiments, you should temporarily unpause the emulator to let the movie reach at least the title screen of the game, the point where players can already affect the game with buttons Input. By default the hotkey to pause/unpause emulator is the </span><span class="rvts26">Pause</span><span class="rvts21"> key on the keyboard, but in Taseditor you can use </span><span class="rvts34">middle mouse button</span><span class="rvts21"> (the wheel) instead. Try watching the running game for a couple of seconds, then again press the </span><span class="rvts26">Pause</span><span class="rvts21"> key or make the middle-click (anywhere) to stop emulation.</span></p> <p class="rvps7"><span class="rvts20">If you just opened the Taseditor window you will most likely see an empty project that contains only the starting (zeroth) frame of the movie. So, before you begin any experiments, you should temporarily unpause the emulator to let the movie reach at least the title screen of the game, the point where players can already affect the game with buttons Input. By default the hotkey to pause/unpause emulator is the </span><span class="rvts23">Pause</span><span class="rvts20"> key on the keyboard, but in Taseditor you can use </span><span class="rvts31">middle mouse button</span><span class="rvts20"> (the wheel) instead. Try watching the running game for a couple of seconds, then again press the </span><span class="rvts23">Pause</span><span class="rvts20"> key or make the middle-click (anywhere) to stop emulation.</span></p>
<p class="rvps10"><span class="rvts21">During the emulation, Piano Roll contents become filled with the information about the processed frames. Each line in the Piano Roll list is responsible for a single frame. The index number of the frame is shown at the beginning of the line, the numeration goes top-down. When the window size is not enough to display all the frames, the list gets a vertical scrollbar.</span></p> <p class="rvps7"><span class="rvts20">During the emulation, Piano Roll contents become filled with the information about the processed frames. Each line in the Piano Roll list is responsible for a single frame. The index number of the frame is shown at the beginning of the line, the numeration goes top-down. When the window size is not enough to display all the frames, the list gets a vertical scrollbar.</span></p>
<p class="rvps10"><span class="rvts21">By the color of each line you can tell the following data about the corresponding frame:</span></p> <p class="rvps7"><span class="rvts20">By the color of each line you can tell the following data about the corresponding frame:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">Pale (almost white) lines stand for frames that are outside of the Greenzone. This means that the emulator haven't processed these frames yet and thus it knows nothing about them. For example, if you import some finished movie into Taseditor, at first Piano Roll will display all frames in whitish colors, before running through them. In the above picture such lines begin from the frame 21, because the Greenzone ends at the frame 20.</span></li> <li class="rvps7"><span class="rvts20">Pale (almost white) lines stand for frames that are outside of the Greenzone. This means that the emulator haven't processed these frames yet and thus it knows nothing about them. For example, if you import some finished movie into Taseditor, at first Piano Roll will display all frames in whitish colors, before running through them. In the above picture such lines begin from the frame 21, because the Greenzone ends at the frame 20.</span></li>
<li class="rvps10"><span class="rvts21">Green and red lines mean that those frames are contained in the Greenzone, the emulator has already played back that part of the movie, and you've already seen on the FCEUX screen what happens with the game during these frames. Lag frames are marked red, otherwise there's no difference between red and green lines.</span></li> <li class="rvps7"><span class="rvts20">Green and red lines mean that those frames are contained in the Greenzone, the emulator has already played back that part of the movie, and you've already seen on the FCEUX screen what happens with the game during these frames. Lag frames are marked red, otherwise there's no difference between red and green lines.</span></li>
<li class="rvps10"><span class="rvts21">The light-blue line (frame 18 on the picture) shows the currently emulated frame. Events of the frame are displayed on the FCEUX screen at the moment. This is always a sole line. In this Manual we will call it the </span><span class="rvts25">Playback cursor</span><span class="rvts21">. When emulator is paused, the Playback cursor stays at the same frame, and while emulation the cursor runs down, leaving the trail of green and red Greenzone frames behind. You can put the Playback cursor at any frame of the movie to see the game events of that frame. To do that, click the very left column of the Piano Roll (the column where the blue triangle pointer travels down) in the line you wish to observe the blue pointer will jump to the chosen line along with the Playback cursor, and the FCEUX window will update accordingly, showing the in-game state of the frame. Now, if you don't let go of the left mouse button, you can drag the light-blue cursor up and down.</span></li> <li class="rvps7"><span class="rvts20">The light-blue line (frame 18 on the picture) shows the currently emulated frame. Events of the frame are displayed on the FCEUX screen at the moment. This is always a sole line. In this Manual we will call it the </span><span class="rvts22">Playback cursor</span><span class="rvts20">. When emulator is paused, the Playback cursor stays at the same frame, and while emulation the cursor runs down, leaving the trail of green and red Greenzone frames behind. You can put the Playback cursor at any frame of the movie to see the game events of that frame. To do that, click the very left column of the Piano Roll (the column where the blue triangle pointer travels down) in the line you wish to observe the blue pointer will jump to the chosen line along with the Playback cursor, and the FCEUX window will update accordingly, showing the in-game state of the frame. Now, if you don't let go of the left mouse button, you can drag the light-blue cursor up and down.</span></li>
<li class="rvps10"><span class="rvts21">The dark-blue line highlights the selected movie segment. The actual color may differ depending on your Windows settings (the Visual theme chosen). Piano Roll lines become selected as you left-click on them. </span><span class="rvts21">In the above picture the</span><span class="rvts21"> single frame 27 is selected, but you can select any number of frames. To select a range of frames, click on the number of the first frame and stretch the selection by dragging the mouse up or down. </span><span class="rvts34">Note:</span><span class="rvts21"> Piano Roll lines will also be selected by clicking on the Input (i.e. almost any other column), but the column with frame numbers is specifically dedicated to working with the Selection. In this Manual we will call all dark-blue lines the </span><span class="rvts25">Selection</span><span class="rvts21">, and a single selected line will be called the </span><span class="rvts25">Selection cursor</span><span class="rvts21">. Unlike the Playback cursor, the Selection cursor isn't tied to the game state. To totally remove the Selection you could right-click the number of a selected frame and choose "Deselect" in the context menu, but usually there's no need to remove the Selection left from previous operations with the movie, because the next operation will automatically bring the Selection cursor to a new place.</span></li> <li class="rvps7"><span class="rvts20">The dark-blue line highlights the selected movie segment. The actual color may differ depending on your Windows settings (the Visual theme chosen). Piano Roll lines become selected as you left-click on them. </span><span class="rvts20">In the above picture the</span><span class="rvts20"> single frame 27 is selected, but you can select any number of frames. To select a range of frames, click on the number of the first frame and stretch the selection by dragging the mouse up or down. </span><span class="rvts31">Note:</span><span class="rvts20"> Piano Roll lines will also be selected by clicking on the Input (i.e. almost any other column), but the column with frame numbers is specifically dedicated to working with the Selection. In this Manual we will call all dark-blue lines the </span><span class="rvts22">Selection</span><span class="rvts20">, and a single selected line will be called the </span><span class="rvts22">Selection cursor</span><span class="rvts20">. Unlike the Playback cursor, the Selection cursor isn't tied to the game state. To totally remove the Selection you could right-click the number of a selected frame and choose "Deselect" in the context menu, but usually there's no need to remove the Selection left from previous operations with the movie, because the next operation will automatically bring the Selection cursor to a new place.</span></li>
<li class="rvps10"><span class="rvts21">A purple line appears for a brief moment when you use the Undo feature. This way the program shows you the exact place of the reverted changes. A huge convenience of Taseditor is that absolutely any change can be reverted with the standard key combination </span><span class="rvts30">Ctrl + Z</span><span class="rvts21">, so don't be afraid to experiment.</span></li> <li class="rvps7"><span class="rvts20">A purple line appears for a brief moment when you use the Undo feature. This way the program shows you the exact place of the reverted changes. A huge convenience of Taseditor is that absolutely any change can be reverted with the standard key combination </span><span class="rvts27">Ctrl + Z</span><span class="rvts20">, so don't be afraid to experiment.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">To start adding and changing the movie Input, click cells of those columns to the right from the column with frame numbers. If you click an empty cell, a symbol corresponding to the real joypad button will appear there.</span></p> <p class="rvps7"><span class="rvts20">To start adding and changing the movie Input, click cells of those columns to the right from the column with frame numbers. If you click an empty cell, a symbol corresponding to the real joypad button will appear there.</span></p>
<div class="rvps21"><table width="600" border="0" cellpadding="6" cellspacing="0" style="border-width: 0px;"> <div class="rvps13">
<tr valign="middle"> <table width="600" border="0" cellpadding="6" cellspacing="0" style="border-width: 0px; border-spacing: 0px; margin: 0px auto;">
<td style="width: 586px; height: 14px;"><p class="rvps14"><span class="rvts25">A</span><span class="rvts21"> </span><span class="rvts29">A </span><span class="rvts21">button</span></p> <tr valign="middle">
<p class="rvps14"><span class="rvts25">B</span><span class="rvts21"> </span><span class="rvts29">B </span><span class="rvts21">button</span></p> <td width="586" height="26" style="padding: 6px;">
<p class="rvps14"><span class="rvts25">S</span><span class="rvts21"> </span><span class="rvts29">Select </span><span class="rvts21">button</span></p> <p class="rvps9"><span class="rvts22">A</span><span class="rvts20"> </span><span class="rvts26">A </span><span class="rvts20">button</span></p>
<p class="rvps14"><span class="rvts25">T</span><span class="rvts21"> </span><span class="rvts29">Start </span><span class="rvts21">button</span></p> <p class="rvps9"><span class="rvts22">B</span><span class="rvts20"> </span><span class="rvts26">B </span><span class="rvts20">button</span></p>
<p class="rvps14"><span class="rvts25">U</span><span class="rvts21"> D-pad </span><span class="rvts29">Up</span></p> <p class="rvps9"><span class="rvts22">S</span><span class="rvts20"> </span><span class="rvts26">Select </span><span class="rvts20">button</span></p>
<p class="rvps14"><span class="rvts25">D</span><span class="rvts21"> </span><span class="rvts21">D-pad</span><span class="rvts21"> </span><span class="rvts29">Down</span></p> <p class="rvps9"><span class="rvts22">T</span><span class="rvts20"> </span><span class="rvts26">Start </span><span class="rvts20">button</span></p>
<p class="rvps14"><span class="rvts25">L</span><span class="rvts21"> </span><span class="rvts21">D-pad</span><span class="rvts21"> </span><span class="rvts29">Left</span></p> <p class="rvps9"><span class="rvts22">U</span><span class="rvts20"> D-pad </span><span class="rvts26">Up</span></p>
<p class="rvps14"><span class="rvts25">R</span><span class="rvts21"> </span><span class="rvts21">D-pad</span><span class="rvts21"> </span><span class="rvts29">Right</span></p> <p class="rvps9"><span class="rvts22">D</span><span class="rvts20"> </span><span class="rvts20">D-pad</span><span class="rvts20"> </span><span class="rvts26">Down</span></p>
</td> <p class="rvps9"><span class="rvts22">L</span><span class="rvts20"> </span><span class="rvts20">D-pad</span><span class="rvts20"> </span><span class="rvts26">Left</span></p>
<td style="width: 258px; height: 178px;"><p class="rvps5"><img alt="" style="padding : 1px;" src="lib/NES-controller.png"/></p> <p class="rvps9"><span class="rvts22">R</span><span class="rvts20"> </span><span class="rvts20">D-pad</span><span class="rvts20"> </span><span class="rvts26">Right</span></p>
</td> </td>
</tr> <td width="258" height="190" style="padding: 6px;">
<p class="rvps3"><img alt="" style="padding : 1px;" src="lib/NES-controller.png"></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21">If you click on an occupied cell, it will become cleared, and the corresponding button will be considered released on that frame. There is no other button states except these two: either pressed or released.</span></p> <p class="rvps7"><span class="rvts20">If you click on an occupied cell, it will become cleared, and the corresponding button will be considered released on that frame. There is no other button states except these two: either pressed or released.</span></p>
<p class="rvps10"><span class="rvts21">At first it might not be very trivial to correlate these 8 symbols with plastic buttons of a real joypad, but try pressing the first player input keys (set in your emulator) while you are in Taseditor. As you tap the buttons, the corresponding letters will flash in the Piano Roll Header, and you can easily associate the columns with buttons.</span></p> <p class="rvps7"><span class="rvts20">At first it might not be very trivial to correlate these 8 symbols with plastic buttons of a real joypad, but try pressing the first player input keys (set in your emulator) while you are in Taseditor. As you tap the buttons, the corresponding letters will flash in the Piano Roll Header, and you can easily associate the columns with buttons.</span></p>
<p class="rvps10"><span class="rvts21">When working in Taseditor, the most of time is spent on that very process of setting and removing buttons at different frames. This way you form the </span><span class="rvts34">sequence of button states</span><span class="rvts21">, which is then fed to the game and reflected by actions of the game character(s). For example, if you put the letter "A" to a chosen Piano Roll cell at the middle of Super Mario Bros gameplay, Mario will perform a low jump, because a short </span><span class="rvts29">A</span><span class="rvts21"> button press occurred in the movie. And if you set several "A" symbols in a row (vertically), Mario will do a high jump, because </span><span class="rvts29">A</span><span class="rvts21"> was held longer.</span></p> <p class="rvps7"><span class="rvts20">When working in Taseditor, the most of time is spent on that very process of setting and removing buttons at different frames. This way you form the </span><span class="rvts31">sequence of button states</span><span class="rvts20">, which is then fed to the game and reflected by actions of the game character(s). For example, if you put the letter "A" to a chosen Piano Roll cell at the middle of Super Mario Bros gameplay, Mario will perform a low jump, because a short </span><span class="rvts26">A</span><span class="rvts20"> button press occurred in the movie. And if you set several "A" symbols in a row (vertically), Mario will do a high jump, because </span><span class="rvts26">A</span><span class="rvts20"> was held longer.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Every time you change the Input above the line with the Playback cursor, the light-blue cursor steps back (up in the Piano Roll) also clearing some part of the Greenzone. This happens because the change of Input leads to a change in the game events, so the game data memorized inside the Greenzone becomes irrelevant. Thus after you change Input you need to replay some frames of the movie again either by unpausing the emulator, or by manually dragging the Playback cursor to the frame of interest and you will see results of the latest Input changes on FCEUX screen (and also restore a part of the Greenzone).</span></p> <p class="rvps7"><span class="rvts20">Every time you change the Input above the line with the Playback cursor, the light-blue cursor steps back (up in the Piano Roll) also clearing some part of the Greenzone. This happens because the change of Input leads to a change in the game events, so the game data memorized inside the Greenzone becomes irrelevant. Thus after you change Input you need to replay some frames of the movie again either by unpausing the emulator, or by manually dragging the Playback cursor to the frame of interest and you will see results of the latest Input changes on FCEUX screen (and also restore a part of the Greenzone).</span></p>
<p class="rvps10"><span class="rvts21">Besides, you can hold the </span><span class="rvts25">right mouse button</span><span class="rvts21"> and roll the mouse wheel down to move the Playback cursor to the needed frame manually. Wheel-based navigation is the most responsive way to observe a little segment of the movie. You may use a single hand, and the mouse pointer may be anywhere, e.g. it may be left over the edited Input cells. Try this method, it's a very effective way to rewind back and forth. Just hold the right mouse button with one finger and roll the wheel with another finger while looking at the FCEUX window.</span></p> <p class="rvps7"><span class="rvts20">Besides, you can hold the </span><span class="rvts22">right mouse button</span><span class="rvts20"> and roll the mouse wheel down to move the Playback cursor to the needed frame manually. Wheel-based navigation is the most responsive way to observe a little segment of the movie. You may use a single hand, and the mouse pointer may be anywhere, e.g. it may be left over the edited Input cells. Try this method, it's a very effective way to rewind back and forth. Just hold the right mouse button with one finger and roll the wheel with another finger while looking at the FCEUX window.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">In addition to single cell clicks, you can also change button states in many frames at once. For instance, if you want the </span><span class="rvts29">R</span><span class="rvts21"> button (</span><span class="rvts29">Right</span><span class="rvts21">) to be pressed for 20 straight frames, you don't have to click all 20 cells. You can just click on one of them, hold the left mouse button and move the mouse cursor up or down it will leave a trail of symbols, thus you will draw a vertical row of buttonpresses. Similarly, you can quickly erase a row of symbols by clicking the first one and moving the eraser up or down. As you may notice, erasing starts when you click an occupied cell, and drawing starts when you click an empty cell.</span></p> <p class="rvps7"><span class="rvts20">In addition to single cell clicks, you can also change button states in many frames at once. For instance, if you want the </span><span class="rvts26">R</span><span class="rvts20"> button (</span><span class="rvts26">Right</span><span class="rvts20">) to be pressed for 20 straight frames, you don't have to click all 20 cells. You can just click on one of them, hold the left mouse button and move the mouse cursor up or down it will leave a trail of symbols, thus you will draw a vertical row of buttonpresses. Similarly, you can quickly erase a row of symbols by clicking the first one and moving the eraser up or down. As you may notice, erasing starts when you click an occupied cell, and drawing starts when you click an empty cell.</span></p>
<p class="rvps10"><span class="rvts21">Moreover, you can hold the </span><span class="rvts30">Shift</span><span class="rvts21"> key before clicking on the Input to spread the effect of the click across all frames between the point of click and the Selection cursor. For example, you can set "R" in the first frame, then scroll the Piano Roll to the end, hold </span><span class="rvts30">Shift</span><span class="rvts21"> and set "R" in the last frame the </span><span class="rvts29">R</span><span class="rvts21"> button press will appear in all frames.</span></p> <p class="rvps7"><span class="rvts20">Moreover, you can hold the </span><span class="rvts27">Shift</span><span class="rvts20"> key before clicking on the Input to spread the effect of the click across all frames between the point of click and the Selection cursor. For example, you can set "R" in the first frame, then scroll the Piano Roll to the end, hold </span><span class="rvts27">Shift</span><span class="rvts20"> and set "R" in the last frame the </span><span class="rvts26">R</span><span class="rvts20"> button press will appear in all frames.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/piano-roll-header-l.png"/></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/piano-roll-header-l.png"></p>
<p class="rvps10"><span class="rvts21">There's one more way to mass set or mass remove buttonpresses. First, select several frames, for example, the 5th, the 10th and the 20th (to do it you have to hold </span><span class="rvts30">Ctrl</span><span class="rvts21"> while clicking on numbers </span><span class="rvts21">0000005, 0000010 and 0000020)</span><span class="rvts21">. Then click on the "L" letter in the Piano Roll Header. If the selected frames didn't have the </span><span class="rvts29">Left</span><span class="rvts21"> button symbols, they will get it. And if all of the frames had the </span><span class="rvts29">Left</span><span class="rvts21"> button already pressed, the click will clear it.</span></p> <p class="rvps7"><span class="rvts20">There's one more way to mass set or mass remove buttonpresses. First, select several frames, for example, the 5th, the 10th and the 20th (to do it you have to hold </span><span class="rvts27">Ctrl</span><span class="rvts20"> while clicking on numbers </span><span class="rvts20">0000005, 0000010 and 0000020)</span><span class="rvts20">. Then click on the "L" letter in the Piano Roll Header. If the selected frames didn't have the </span><span class="rvts26">Left</span><span class="rvts20"> button symbols, they will get it. And if all of the frames had the </span><span class="rvts26">Left</span><span class="rvts20"> button already pressed, the click will clear it.</span></p>
<p class="rvps10"><span class="rvts21">Later you will find a few other ways to edit the Input, but these were the main ones. At first it might look unnatural to draw buttonpresses with the mouse instead of simulating them using keyboard keys. But this discomfort feeling will disappear soon after you devote a few days to Taseditor.</span></p> <p class="rvps7"><span class="rvts20">Later you will find a few other ways to edit the Input, but these were the main ones. At first it might look unnatural to draw buttonpresses with the mouse instead of simulating them using keyboard keys. But this discomfort feeling will disappear soon after you devote a few days to Taseditor.</span></p>
<p class="rvps10"><a name="HotChanges"></a> <p class="rvps7"><a name="HotChanges"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">When drawing the Input you've probably noticed that previously drawn letters have different color, and as you add new buttonpresses the old letters change their color from orange to violet and blue, eventually becoming standard black. This is one of experimental features of Taseditor, called "Hot Changes". It was invented to unobtrusively increase TASer's awareness about recent changes. Every time you modify the Input, the latest buttonpresses receive the hottest color (bright orange), and all the previous edits cool down by one level, becoming less bright.</span></p>
<p class="rvps10"><span class="rvts21">When drawing the Input you've probably noticed that previously drawn letters have different color, and as you add new buttonpresses the old letters change their color from orange to violet and blue, eventually becoming standard black. This is one of experimental features of Taseditor, called "Hot Changes". It was invented to unobtrusively increase TASer's awareness about recent changes. Every time you modify the Input, the latest buttonpresses receive the hottest color (bright orange), and all the previous edits cool down by one level, becoming less bright.</span></p> <p class="rvps7"><span class="rvts20">Because of the coloring, even a cursory glance on the Piano Roll is enough to get the idea which buttonpresses were added just recently and which were set long ago. Also, you can see which of them were recently removed (they are replaced with a dash).</span></p>
<p class="rvps10"><span class="rvts21">Because of the coloring, even a cursory glance on the Piano Roll is enough to get the idea which buttonpresses were added just recently and which were set long ago. Also, you can see which of them were recently removed (they are replaced with a dash).</span></p> <p class="rvps7"><span class="rvts20">If you don't like this feature, you can disable it, but within this Guide we'll imply that you have the "Hot Changes" enabled.</span></p>
<p class="rvps10"><span class="rvts21">If you don't like this feature, you can disable it, but within this Guide we'll imply that you have the "Hot Changes" enabled.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The narrow column to the left from the column with frame numbers is not just for dragging the Playback cursor. It also displays various informational icons. The blue arrow pointer always points to the frame where the Playback cursor is now. The green arrow pointer shows where the Playback cursor was before the Input above it has changed. And the digit cards in this column indicate Bookmarks, they will be described later.</span></p>
<p class="rvps10"><span class="rvts21">The narrow column to the left from the column with frame numbers is not just for dragging the Playback cursor. It also displays various informational icons. The blue arrow pointer always points to the frame where the Playback cursor is now. The green arrow pointer shows where the Playback cursor was before the Input above it has changed. And the digit cards in this column indicate Bookmarks, they will be described later.</span></p> <p class="rvps7"><a name="markers"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="markers"></a> <p class="rvps7"><span class="rvts20">The yellow marks on the numbers of some frames (frames 12 and 22 on the above picture) are called </span><span class="rvts22">Markers</span><span class="rvts20">. Besides the yellow color, they can be recognized by the wide font of the frame number.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Markers are meant to facilitate the movie navigation and improve TASer's self-organization. You decide how to use them on your own: whether to put them at the beginning of each level or to mark every jump, shot or any in-game event. Essentially, by setting Markers you logically break your movie down into sections, and then you can cross the movie not just by jumping from frame to frame, but from section to section. This allows you to interpret the movie on a higher level of abstraction.</span></p>
<p class="rvps10"><span class="rvts21">The yellow marks on the numbers of some frames (frames 12 and 22 on the above picture) are called </span><span class="rvts25">Markers</span><span class="rvts21">. Besides the yellow color, they can be recognized by the wide font of the frame number.</span></p> <p class="rvps7"><span class="rvts20">Such structuring helps to keep a precise image of the entire movie in mind. That kind of an image exists in each TASer's mind, but usually it's rather fuzzy we remember a rough sequence of the evens, but omit the details (because most of time they are insignificant). When TASer turns emulator off, the image starts to gradually become vague and forgotten. Thus at the next session one needs to re-watch his own movie from the beginning in order to refresh memories, figure key events, arrange priorities and, in general, mentally prepare for resumption of TASing. Sometimes this is needed even more often depending on the complexity of the TAS. That's why it's recommended to consolidate that image by setting real Markers, not just in your mind but in actual movie.</span></p>
<p class="rvps10"><span class="rvts21">Markers are meant to facilitate the movie navigation and improve TASer's self-organization. You decide how to use them on your own: whether to put them at the beginning of each level or to mark every jump, shot or any in-game event. Essentially, by setting Markers you logically break your movie down into sections, and then you can cross the movie not just by jumping from frame to frame, but from section to section. This allows you to interpret the movie on a higher level of abstraction.</span></p> <p class="rvps7"><span class="rvts20">A Marker can be set at any frame. Unlike the Input, Markers don't affect the game events. There are several ways to set Markers:</span></p>
<p class="rvps10"><span class="rvts21">Such structuring helps to keep a precise image of the entire movie in mind. That kind of an image exists in each TASer's mind, but usually it's rather fuzzy we remember a rough sequence of the evens, but omit the details (because most of time they are insignificant). When TASer turns emulator off, the image starts to gradually become vague and forgotten. Thus at the next session one needs to re-watch his own movie from the beginning in order to refresh memories, figure key events, arrange priorities and, in general, mentally prepare for resumption of TASing. Sometimes this is needed even more often depending on the complexity of the TAS. That's why it's recommended to consolidate that image by setting real Markers, not just in your mind but in actual movie.</span></p> <p class="rvps7"><span class="rvts22">Example 1. </span><span class="rvts20">Double-click on a frame number. If there was no Marker at this frame, it will appear there. If the Marker already exists, you can drag it while the left button is still held after the double-click. This way you can move any Marker to a different frame or simply dump it outside the Piano Roll, thus removing it from the movie.</span></p>
<p class="rvps10"><span class="rvts21">A Marker can be set at any frame. Unlike the Input, Markers don't affect the game events. There are several ways to set Markers:</span></p> <p class="rvps7"><span class="rvts22">Example 2. </span><span class="rvts20">Select one or several frames by clicking the frame number(s), then click the "Frame#" label in the Piano Roll Header. If some of the selected frames didn't have Markers, they will all become marked. If all of them were already marked, all the Markers will be removed. This way you may mass set or mass remove Markers the same way as Input.</span></p>
<p class="rvps10"><span class="rvts25">Example 1. </span><span class="rvts21">Double-click on a frame number. If there was no Marker at this frame, it will appear there. If the Marker already exists, you can drag it while the left button is still held after the double-click. This way you can move any Marker to a different frame or simply dump it outside the Piano Roll, thus removing it from the movie.</span></p> <p class="rvps7"><span class="rvts22">Example 3. </span><span class="rvts20">Select one or several frames in the Piano Roll, right-click on any of the selected frame numbers and choose "Set Markers" or "Remove Markers" in the context menu. This is the slowest way, so the other two are more preferred.</span></p>
<p class="rvps10"><span class="rvts25">Example 2. </span><span class="rvts21">Select one or several frames by clicking the frame number(s), then click the "Frame#" label in the Piano Roll Header. If some of the selected frames didn't have Markers, they will all become marked. If all of them were already marked, all the Markers will be removed. This way you may mass set or mass remove Markers the same way as Input.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Example 3. </span><span class="rvts21">Select one or several frames in the Piano Roll, right-click on any of the selected frame numbers and choose "Set Markers" or "Remove Markers" in the context menu. This is the slowest way, so the other two are more preferred.</span></p> <p class="rvps7"><span class="rvts20">Any Marker operation may be undone (</span><span class="rvts27">Ctrl + Z</span><span class="rvts20">) anytime, just like any Input operation.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Markers are automatically numbered by the order they are located in the movie top-down from first to last. In the upper left corner of TAS Editor window you can see the number of the Marker that is located just above the Playback cursor in the movie (light-blue "Marker </span><span class="rvts33">#</span><span class="rvts20">" label). This label both informs you and serves as a button for auto-scrolling. E.g. if you left the Playback cursor in one part of the movie and scrolled the Piano Roll far from that point, you can immediately return to the light-blue cursor anytime by clicking the "Marker" label (or tapping the </span><span class="rvts27">Shift</span><span class="rvts20"> key twice). You are definitely going to need this feature when editing large movies.</span></p>
<p class="rvps10"><span class="rvts21">Any Marker operation may be undone (</span><span class="rvts30">Ctrl + Z</span><span class="rvts21">) anytime, just like any Input operation.</span></p> <p class="rvps7"><span class="rvts20">A similar button can be found in the lower left corner of Taseditor. The "Marker </span><span class="rvts33">#</span><span class="rvts20">" label of a dark blue color (the same color as the Selection cursor) displays the number of the Marker located just above the Selection. If you click this label, the Piano Roll will automatically jump to Selection. This button is going to be used as often as the upper one. Its keyboard alternative is tapping the </span><span class="rvts27">Ctrl</span><span class="rvts20"> key twice.</span></p>
<p class="rvps10"><span class="rvts21">Markers are automatically numbered by the order they are located in the movie top-down from first to last. In the upper left corner of TAS Editor window you can see the number of the Marker that is located just above the Playback cursor in the movie (light-blue "Marker </span><span class="rvts37">#</span><span class="rvts21">" label). This label both informs you and serves as a button for auto-scrolling. E.g. if you left the Playback cursor in one part of the movie and scrolled the Piano Roll far from that point, you can immediately return to the light-blue cursor anytime by clicking the "Marker" label (or tapping the </span><span class="rvts30">Shift</span><span class="rvts21"> key twice). You are definitely going to need this feature when editing large movies.</span></p> <p class="rvps7"><span class="rvts20">It should be easy to remember that the </span><span class="rvts27">Shift</span><span class="rvts20"> key is almost always used to control the Playback cursor, while the </span><span class="rvts27">Ctrl</span><span class="rvts20"> key is to control the Selection cursor.</span></p>
<p class="rvps10"><span class="rvts21">A similar button can be found in the lower left corner of Taseditor. The "Marker </span><span class="rvts37">#</span><span class="rvts21">" label of a dark blue color (the same color as the Selection cursor) displays the number of the Marker located just above the Selection. If you click this label, the Piano Roll will automatically jump to Selection. This button is going to be used as often as the upper one. Its keyboard alternative is tapping the </span><span class="rvts30">Ctrl</span><span class="rvts21"> key twice.</span></p> <p class="rvps7"><span class="rvts20">If both Playback and Selection cursors are under the same Marker, the numbers in both corners will obviously be the same.</span></p>
<p class="rvps10"><span class="rvts21">It should be easy to remember that the </span><span class="rvts30">Shift</span><span class="rvts21"> key is almost always used to control the Playback cursor, while the </span><span class="rvts30">Ctrl</span><span class="rvts21"> key is to control the Selection cursor.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">If both Playback and Selection cursors are under the same Marker, the numbers in both corners will obviously be the same.</span></p> <p class="rvps7"><span class="rvts20">Markers can do more than just divide the movie into logical parts. They may also contain text records (comments and work notes). The Marker </span><span class="rvts22">Note</span><span class="rvts20"> is displayed right near its number. The upper edit field contains the Note of the Marker above the Playback Cursor, and the lower field shows the Note of the Marker above the Selection cursor.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">By default, every new Marker contains an empty Note. When you create a new Marker by double-click, the lower edit field automatically becomes active, because the Selection cursor points to the just marked frame. So you may quickly type any text for the Note of that Marker and then resume your work with the movie. Text changes are saved automatically.</span></p>
<p class="rvps10"><span class="rvts21">Markers can do more than just divide the movie into logical parts. They may also contain text records (comments and work notes). The Marker </span><span class="rvts25">Note</span><span class="rvts21"> is displayed right near its number. The upper edit field contains the Note of the Marker above the Playback Cursor, and the lower field shows the Note of the Marker above the Selection cursor.</span></p> <p class="rvps7"><span class="rvts20">You can edit an old Marker Note in any of the following ways:</span></p>
<p class="rvps10"><span class="rvts21">By default, every new Marker contains an empty Note. When you create a new Marker by double-click, the lower edit field automatically becomes active, because the Selection cursor points to the just marked frame. So you may quickly type any text for the Note of that Marker and then resume your work with the movie. Text changes are saved automatically.</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<p class="rvps10"><span class="rvts21">You can edit an old Marker Note in any of the following ways:</span></p> <li class="rvps7"><span class="rvts20">Put the Selection cursor to that frame and click the lower edit field to activate it.</span></li>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">Simply double-click on the Marker, and the lower edit field will activate automatically.</span></li>
<li class="rvps10"><span class="rvts21">Put the Selection cursor to that frame and click the lower edit field to activate it.</span></li> <li class="rvps7"><span class="rvts20">Put the Playback cursor to that frame and click the upper edit field to activate it.</span></li>
<li class="rvps10"><span class="rvts21">Simply double-click on the Marker, and the lower edit field will activate automatically.</span></li>
<li class="rvps10"><span class="rvts21">Put the Playback cursor to that frame and click the upper edit field to activate it.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21">When typing a Note, press </span><span class="rvts25">Enter</span><span class="rvts21"> or just click any unrelated element of TAS Editor window to finish editing. If you changed your mind, press </span><span class="rvts25">Esc</span><span class="rvts21"> to cancel the editing. All the controls when editing Notes are listed in the </span><a class="rvts35" href="Controls.html#notes">Reference</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">When typing a Note, press </span><span class="rvts22">Enter</span><span class="rvts20"> or just click any unrelated element of TAS Editor window to finish editing. If you changed your mind, press </span><span class="rvts22">Esc</span><span class="rvts20"> to cancel the editing. All the controls when editing Notes are listed in the </span><a class="rvts32" href="Controls.html#notes">Reference</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">It is recommended to enter Notes when creating Markers, so you won't forget why the Marker was set there. This won't take much time if you set Markers by double-clicks and type laconic messages at the same second.</span></p> <p class="rvps7"><span class="rvts20">It is recommended to enter Notes when creating Markers, so you won't forget why the Marker was set there. This won't take much time if you set Markers by double-clicks and type laconic messages at the same second.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps17"><a class="rvts23" href="Toolbox.html">Proceed to the Toolbox description</a></p> <p class="rvps11"><a class="rvts11" href="Toolbox.html">Proceed to the Toolbox description</a></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com">Full-featured Documentation generator</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Generate Kindle eBooks with ease</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,283 +1,455 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>5. Program customization</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>5. Program customization</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="5. Program customization">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="5. Program customization" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("ProgramCustomization"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>5. Program customization</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="BeginnersGuide.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="SemiautomaticTASing.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="AdvancedFeatures.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="ProgramCustomization"
data-hnd-context="13"
data-hnd-title="5. Program customization"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="BeginnersGuide.html" title="Beginner's Guide" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="SemiautomaticTASing.html" title="4.3. Semiautomatic TASing" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="AdvancedFeatures.html" title="6. Advanced Features" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>5. Program customization</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Program customization</span></p> <p class="rvps2"><span class="rvts18">Program customization</span></p>
<p class="rvps2"><span class="rvts36"><br/></span></p> <p class="rvps2"><span class="rvts20"><br/></span></p>
<p class="rvps2"><span class="rvts36"><br/></span></p> <p class="rvps2"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Certain useful features of Taseditor are disabled by default, because using them requires understanding of their working principles. This chapter describes all Taseditor options and settings, as well as FCEUX settings that affect your work in Taseditor.</span></p> <p class="rvps7"><span class="rvts20">Certain useful features of Taseditor are disabled by default, because using them requires understanding of their working principles. This chapter describes all Taseditor options and settings, as well as FCEUX settings that affect your work in Taseditor.</span></p>
<p class="rvps10"><span class="rvts21">Settings are kept in the </span><span class="rvts37">fceux.cfg</span><span class="rvts21"> file in the emulator's main folder. If you delete this file, all settings will reset to default values when you launch FCEUX.</span></p> <p class="rvps7"><span class="rvts20">Settings are kept in the </span><span class="rvts33">fceux.cfg</span><span class="rvts20"> file in the emulator's main folder. If you delete this file, all settings will reset to default values when you launch FCEUX.</span></p>
<div class="rvps10"><table width="100%" border="0" cellpadding="4" cellspacing="0" style="border-width: 0px;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="0" cellpadding="4" cellspacing="0" style="border-width: 0px; border-spacing: 0px;">
<td style="width: 847px;"><p class="rvps10"><span class="rvts21">First, if you've already read the </span><a class="rvts27" href="ProgramInterface.html">chapter 2</a><span class="rvts21"> and understood the purpose of all GUI elements, you should disable pop-up tooltips (intended for newbies only). Go to the "Help" submenu of Taseditor main menu and uncheck the option "Enable Tooltips". Before doing it you may want to actually read all the tooltips by pointing the mouse cursor at different elements of TAS Editor window, and thus consolidate your knowledge of the GUI.</span></p> <tr valign="top">
</td> <td width="847" style="padding: 4px;">
<td valign="top" style="width: 148px;"><p class="rvps19"><img alt="" style="padding : 1px;" src="lib/help-menu.png"/></p> <p class="rvps7"><span class="rvts20">First, if you've already read the </span><a class="rvts24" href="ProgramInterface.html">chapter 2</a><span class="rvts20"> and understood the purpose of all GUI elements, you should disable pop-up tooltips (intended for newbies only). Go to the "Help" submenu of Taseditor main menu and uncheck the option "Enable Tooltips". Before doing it you may want to actually read all the tooltips by pointing the mouse cursor at different elements of TAS Editor window, and thus consolidate your knowledge of the GUI.</span></p>
</td> </td>
</tr> <td width="148" valign="top" style="padding: 4px;">
<p class="rvps12"><img alt="" style="padding : 1px;" src="lib/help-menu.png"></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21">Now open the "View" submenu.</span></p> <p class="rvps7"><span class="rvts20">Now open the "View" submenu.</span></p>
<p class="rvps10"><img align="left" alt="" style="padding : 6px;" src="lib/view-menu.png"/></p> <p class="rvps7"><img alt="" style="float: left; padding : 6px;" src="lib/view-menu.png"></p>
<p class="rvps10"><span class="rvts21">The "Find Note window" brings up the window dedicated to searching text in Marker Notes. This function is useful when you're documenting your movie with Notes. It's described in the next chapter.</span></p> <p class="rvps7"><span class="rvts20">The "Find Note window" brings up the window dedicated to searching text in Marker Notes. This function is useful when you're documenting your movie with Notes. It's described in the next chapter.</span></p>
<p class="rvps10"><span class="rvts21">Then there are several checkboxes allowing to customize the program interface. To try the customization possibilities, create a test project and experiment with it.</span></p> <p class="rvps7"><span class="rvts20">Then there are several checkboxes allowing to customize the program interface. To try the customization possibilities, create a test project and experiment with it.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="DisplayBranchScreenshots"></a> <p class="rvps7"><a name="DisplayBranchScreenshots"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">View -&gt; Display Branch Screenshots</span></p>
<p class="rvps10"><span class="rvts22">View -&gt; Display Branch Screenshots</span></p> <p class="rvps7"><span class="rvts20">Displays pop-up screenshots when you point mouse cursor over Bookmarks. The screenshot helps you to recall movie events saved to the Bookmark, which simplifies searching for the needed branch of the movie, as you don't have to actually load the Bookmark when you need to have an idea on its contents. This way you can also quickly compare results of several alternative approaches.</span></p>
<p class="rvps10"><span class="rvts21">Displays pop-up screenshots when you point mouse cursor over Bookmarks. The screenshot helps you to recall movie events saved to the Bookmark, which simplifies searching for the needed branch of the movie, as you don't have to actually load the Bookmark when you need to have an idea on its contents. This way you can also quickly compare results of several alternative approaches.</span></p> <p class="rvps7"><span class="rvts20">This option is enabled by default. If disabled, no screenshots will pop up on mouse hover.</span></p>
<p class="rvps10"><span class="rvts21">This option is enabled by default. If disabled, no screenshots will pop up on mouse hover.</span></p> <p class="rvps7"><span class="rvts20">It's recommended to have it enabled, unless you're annoyed with pop-up pictures partially obstructing the view on the Piano Roll.</span></p>
<p class="rvps10"><span class="rvts21">It's recommended to have it enabled, unless you're annoyed with pop-up pictures partially obstructing the view on the Piano Roll.</span></p> <p class="rvps7"><a name="DisplayBranchDescriptions"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="DisplayBranchDescriptions"></a> <p class="rvps7"><span class="rvts21">View -&gt; Display Branch Descriptions</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Displays pop-up descriptions </span><span class="rvts20">when you point mouse cursor over Bookmarks.</span><span class="rvts20"> The text, as well as the screenshot, gives you additional information about the contents of the Bookmark, helping to decide whether this branch should be loaded or not.</span></p>
<p class="rvps10"><span class="rvts22">View -&gt; Display Branch Descriptions</span></p> <p class="rvps7"><span class="rvts20">The description text is taken from the Marker above the frame of that Bookmark. The Marker itself may be actually removed from the working movie long ago, but if the Bookmark was created while the Marked existed, then this Marker still exists in the branch of this Bookmark. And if you load this Bookmark, the Marker will reappear on its place.</span></p>
<p class="rvps10"><span class="rvts21">Displays pop-up descriptions </span><span class="rvts21">when you point mouse cursor over Bookmarks.</span><span class="rvts21"> The text, as well as the screenshot, gives you additional information about the contents of the Bookmark, helping to decide whether this branch should be loaded or not.</span></p> <p class="rvps7"><span class="rvts20">So, when trying alternative strategies of playing through a large segment (e.g. whole level of the game), before saving every approach to a separate branch, you can make a name for the approach by setting a Marker at the Playback cursor position and typing a text message like "</span><span class="rvts33">here I chose upper way</span><span class="rvts20">" or just "</span><span class="rvts33">upper way</span><span class="rvts20">". After that, save a Bookmark on that frame. Then you can remove the Marker together with the Input of the old approach and create next approach by applying another strategy of playing the segment. When the new approach if finished and replayed, you can again create a Marker with a Note like "</span><span class="rvts33">here I chose lower way</span><span class="rvts20">" and save all that to another Bookmark. After that you can save the project and, say, close Taseditor. Next day you can easily recall all pros and cons of the two strategies you tried. Each Bookmark will show you the screenshot of the bookmarked frame and the text you wrote for that Bookmark. While it can be hard to distinguish the strategies by screenshots (since both approaches end at the same event of the game), but text descriptions will make them easy to recognize.</span></p>
<p class="rvps10"><span class="rvts21">The description text is taken from the Marker above the frame of that Bookmark. The Marker itself may be actually removed from the working movie long ago, but if the Bookmark was created while the Marked existed, then this Marker still exists in the branch of this Bookmark. And if you load this Bookmark, the Marker will reappear on its place.</span></p> <p class="rvps7"><span class="rvts20">This option is enabled by default. </span><span class="rvts20">If disabled, no descriptions will pop up on mouse hover.</span></p>
<p class="rvps10"><span class="rvts21">So, when trying alternative strategies of playing through a large segment (e.g. whole level of the game), before saving every approach to a separate branch, you can make a name for the approach by setting a Marker at the Playback cursor position and typing a text message like "</span><span class="rvts37">here I chose upper way</span><span class="rvts21">" or just "</span><span class="rvts37">upper way</span><span class="rvts21">". After that, save a Bookmark on that frame. Then you can remove the Marker together with the Input of the old approach and create next approach by applying another strategy of playing the segment. When the new approach if finished and replayed, you can again create a Marker with a Note like "</span><span class="rvts37">here I chose lower way</span><span class="rvts21">" and save all that to another Bookmark. After that you can save the project and, say, close Taseditor. Next day you can easily recall all pros and cons of the two strategies you tried. Each Bookmark will show you the screenshot of the bookmarked frame and the text you wrote for that Bookmark. While it can be hard to distinguish the strategies by screenshots (since both approaches end at the same event of the game), but text descriptions will make them easy to recognize.</span></p> <p class="rvps7"><span class="rvts20">It's recommended to have it enabled, unless you're annoyed with pop-up text fields.</span></p>
<p class="rvps10"><span class="rvts21">This option is enabled by default. </span><span class="rvts21">If disabled, no descriptions will pop up on mouse hover.</span></p> <p class="rvps7"><a name="EnableHotChanges"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">It's recommended to have it enabled, unless you're annoyed with pop-up text fields.</span></p> <p class="rvps7"><span class="rvts21">View -&gt; Enable Hot Changes</span></p>
<p class="rvps10"><a name="EnableHotChanges"></a> <p class="rvps7"><span class="rvts20">Switches the Hot Changes feature on and off.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Enabled by default. If disabled, all buttonpress symbols will be displayed in a standard black color. Otherwise, each symbol will have its own level of "hotness", depending on how long ago the corresponding Piano Roll cell was edited. Recently modified buttonpresses are more hot, so they are displayed by more intense shade of red. As the hotness decreases, the symbol colors become darker (more cold) and finally turn into standard black.</span></p>
<p class="rvps10"><span class="rvts22">View -&gt; Enable Hot Changes</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Switches the Hot Changes feature on and off.</span></p> <p class="rvps3"><img alt="" style="padding : 1px;" src="lib/hotchanges-colors.png"></p>
<p class="rvps10"><span class="rvts21">Enabled by default. If disabled, all buttonpress symbols will be displayed in a standard black color. Otherwise, each symbol will have its own level of "hotness", depending on how long ago the corresponding Piano Roll cell was edited. Recently modified buttonpresses are more hot, so they are displayed by more intense shade of red. As the hotness decreases, the symbol colors become darker (more cold) and finally turn into standard black.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">In total, Taseditor supports 15 shades of hotness + zeroth black color. When you change the state of an Input cell, it receives maximum hotness value (15), and all the previously edited cells cool down by 1. Thereby you only need a quick look at the Piano Roll to get an idea which edits were done just recently and which were done before, or long ago.</span></p>
<p class="rvps18"><img alt="" style="padding : 1px;" src="lib/hotchanges-colors.png"/></p> <p class="rvps7"><span class="rvts20">Also, with Hot Changes you can see which buttonpresses were recently removed instead of an empty cell there will be a dash of the corresponding color. The dash also changes its color while cooling down, and after 15 levels it finally disappears.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The same dashes appear when you insert new frames in the movie.</span></p>
<p class="rvps10"><span class="rvts21">In total, Taseditor supports 15 shades of hotness + zeroth black color. When you change the state of an Input cell, it receives maximum hotness value (15), and all the previously edited cells cool down by 1. Thereby you only need a quick look at the Piano Roll to get an idea which edits were done just recently and which were done before, or long ago.</span></p> <p class="rvps7"><span class="rvts20">It's recommended to </span><span class="rvts20">enable this feature to increase the usability of Taseditor. In theory it should even increase your working speed, because this way you never have to recall which actions you did a minute ago. Of course even without Hot Changes you can always remind the sequence of last actions by reverting History (making several </span><span class="rvts27">Ctrl + Z</span><span class="rvts20"> keypresses) and then returning the movie to normal state again (making as many </span><span class="rvts27">Ctrl + Y</span><span class="rvts20"> keypresses). But in this case you will also truncate the Greenzone. So better just leave the Hot Changes enabled.</span></p>
<p class="rvps10"><span class="rvts21">Also, with Hot Changes you can see which buttonpresses were recently removed instead of an empty cell there will be a dash of the corresponding color. The dash also changes its color while cooling down, and after 15 levels it finally disappears.</span></p> <p class="rvps7"><span class="rvts20">The only downside of this feature is that Hot Changes data will be stored in the History Log and in FM3 project file, thus increasing the amount of occupied memory.</span></p>
<p class="rvps10"><span class="rvts21">The same dashes appear when you insert new frames in the movie.</span></p> <p class="rvps7"><a name="Followundocontext"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">It's recommended to </span><span class="rvts21">enable this feature to increase the usability of Taseditor. In theory it should even increase your working speed, because this way you never have to recall which actions you did a minute ago. Of course even without Hot Changes you can always remind the sequence of last actions by reverting History (making several </span><span class="rvts30">Ctrl + Z</span><span class="rvts21"> keypresses) and then returning the movie to normal state again (making as many </span><span class="rvts30">Ctrl + Y</span><span class="rvts21"> keypresses). But in this case you will also truncate the Greenzone. So better just leave the Hot Changes enabled.</span></p> <p class="rvps7"><span class="rvts21">View -&gt; Follow undo context</span></p>
<p class="rvps10"><span class="rvts21">The only downside of this feature is that Hot Changes data will be stored in the History Log and in FM3 project file, thus increasing the amount of occupied memory.</span></p> <p class="rvps7"><span class="rvts20">Scrolls the Piano Roll to relevant place every time you make an undo or redo. A purple pointer appears on the modified frame </span><span class="rvts20">for a brief moment</span><span class="rvts20">, thus drawing your attention to the movie changes.</span></p>
<p class="rvps10"><a name="Followundocontext"></a> <p class="rvps7"><span class="rvts20">This option is enabled by default. </span><span class="rvts20">If disabled, the Piano Roll won't automatically scroll to the purple pointer.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">It's recommended to have it enabled, in order</span><span class="rvts20"> to be able to backtrack undos. Usually, right after you revert an operation you want to make another edit on the same frame or nearby, so the autoscrolling is useful.</span></p>
<p class="rvps10"><span class="rvts22">View -&gt; Follow undo context</span></p> <p class="rvps7"><a name="FollowMarkerNotecontext"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Scrolls the Piano Roll to relevant place every time you make an undo or redo. A purple pointer appears on the modified frame </span><span class="rvts21">for a brief moment</span><span class="rvts21">, thus drawing your attention to the movie changes.</span></p> <p class="rvps7"><span class="rvts21">View -&gt; Follow Marker Note context</span></p>
<p class="rvps10"><span class="rvts21">This option is enabled by default. </span><span class="rvts21">If disabled, the Piano Roll won't automatically scroll to the purple pointer.</span></p> <p class="rvps7"><span class="rvts20">Scrolls the Piano Roll to relevant Marker when you start editing its Note.</span><span class="rvts20"> For example, when you click the upper edit field to start editing the Note of the Marker above the Playback cursor, Piano Roll jumps to that Marker, allowing you to see its context (neighbor Markers and Input). And when you click the lower edit field (a Note above the Selection cursor), Piano Roll scrolls to the Marker above the Selection. This way you can observe the surroundings of the relevant Marker while editing its Note.</span></p>
<p class="rvps10"><span class="rvts21">It's recommended to have it enabled, in order</span><span class="rvts21"> to be able to backtrack undos. Usually, right after you revert an operation you want to make another edit on the same frame or nearby, so the autoscrolling is useful.</span></p> <p class="rvps7"><span class="rvts20">This option is enabled by default. </span><span class="rvts20">If disabled, the Piano Roll won't automatically scroll to the Markers.</span></p>
<p class="rvps10"><a name="FollowMarkerNotecontext"></a> <p class="rvps7"><span class="rvts20">It's recommended to have it enabled.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">View -&gt; Follow Marker Note context</span></p> <p class="rvps7"><span class="rvts20">And the View settings are over. During your future work you likely won't need to change these checkboxes.</span></p>
<p class="rvps10"><span class="rvts21">Scrolls the Piano Roll to relevant Marker when you start editing its Note.</span><span class="rvts21"> For example, when you click the upper edit field to start editing the Note of the Marker above the Playback cursor, Piano Roll jumps to that Marker, allowing you to see its context (neighbor Markers and Input). And when you click the lower edit field (a Note above the Selection cursor), Piano Roll scrolls to the Marker above the Selection. This way you can observe the surroundings of the relevant Marker while editing its Note.</span></p> <p class="rvps7"><img alt="" style="float: left; padding : 6px;" src="lib/config-menu.png"></p>
<p class="rvps10"><span class="rvts21">This option is enabled by default. </span><span class="rvts21">If disabled, the Piano Roll won't automatically scroll to the Markers.</span></p> <p class="rvps7"><span class="rvts20">Now open the "Config" submenu. Options listed in this menu affect Taseditor workflow more significantly. You may need reconfiguring some of them more than once.</span></p>
<p class="rvps10"><span class="rvts21">It's recommended to have it enabled.</span></p> <p class="rvps7"><a name="Projectfilesavingoptions"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Project file saving options</span></p>
<p class="rvps10"><span class="rvts21">And the View settings are over. During your future work you likely won't need to change these checkboxes.</span></p> <p class="rvps7"><span class="rvts20">Opens the dialog window where you can configure the autosave function and </span><span class="rvts20">select which aspects should be saved to FM3 files.</span></p>
<p class="rvps10"><img align="left" alt="" style="padding : 6px;" src="lib/config-menu.png"/></p> <p class="rvps7"><span class="rvts20">Taseditor has the feature of automatically saving current project to disk when user doesn't save it manually </span><span class="rvts20">(</span><span class="rvts27">Ctrl + S</span><span class="rvts20">)</span><span class="rvts20"> for too long. Before Taseditor, TASers saved their movie to disk every time they saved a savestate. But Taseditor projects store much more data, and saving FM3 files can take several seconds, so it's not reasonable to resave them too often.</span></p>
<p class="rvps10"><span class="rvts21">Now open the "Config" submenu. Options listed in this menu affect Taseditor workflow more significantly. You may need reconfiguring some of them more than once.</span></p> <p class="rvps7"><span class="rvts20">The default autosave period is 15 minutes. This means, if you've made some substantial changes to the project (e.g. you edited Input, and an asterisk appeared in the TAS Editor window caption), and then didn't save project for 15 minutes, Taseditor will remind you about that or just execute saving itself, depending on the state of the "silently" checkbox. </span><span class="rvts20">If the checkbox is enabled, Taseditor silently saves the project to disk under the same filename. If it is disabled, Taseditor brings up the "Save As" dialog, where you can confirm the saving or cancel it. In the latter case Taseditor will wait another period of time until reminding you about the unsaved data.</span></p>
<p class="rvps10"><a name="Projectfilesavingoptions"></a> <p class="rvps7"><span class="rvts20">The autosave function only works when current project already has a filename.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Maximum possible value of the period is 1440 minutes (24 hours). You can disable this function by switching off the "Autosave project" checkbox, but that's not recommended.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Project file saving options</span></p> <p class="rvps7"><a name="Setmaxundolevels"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Opens the dialog window where you can configure the autosave function and </span><span class="rvts21">select which aspects should be saved to FM3 files.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Set max undo levels</span></p>
<p class="rvps10"><span class="rvts21">Taseditor has the feature of automatically saving current project to disk when user doesn't save it manually </span><span class="rvts21">(</span><span class="rvts30">Ctrl + S</span><span class="rvts21">)</span><span class="rvts21"> for too long. Before Taseditor, TASers saved their movie to disk every time they saved a savestate. But Taseditor projects store much more data, and saving FM3 files can take several seconds, so it's not reasonable to resave them too often.</span></p> <p class="rvps7"><span class="rvts20">Specifies</span><span class="rvts20"> the maximum number of undo steps, how many times you can restore previous state of the project by pressing </span><span class="rvts27">Ctrl + Z</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">The default autosave period is 15 minutes. This means, if you've made some substantial changes to the project (e.g. you edited Input, and an asterisk appeared in the TAS Editor window caption), and then didn't save project for 15 minutes, Taseditor will remind you about that or just execute saving itself, depending on the state of the "silently" checkbox. </span><span class="rvts21">If the checkbox is enabled, Taseditor silently saves the project to disk under the same filename. If it is disabled, Taseditor brings up the "Save As" dialog, where you can confirm the saving or cancel it. In the latter case Taseditor will wait another period of time until reminding you about the unsaved data.</span></p> <p class="rvps7"><span class="rvts20">The History Log needs a lot of computer memory and takes some disk space to save FM3 files. The whole Log is stored in project files in compressed state. The compression is done in background when the emulator is idle, Taseditor gradually compresses new items of the History Log. Thanks to this behavior, the History Log size doesn't affect FM3 saving time much.</span></p>
<p class="rvps10"><span class="rvts21">The autosave function only works when current project already has a filename.</span></p> <p class="rvps7"><span class="rvts20">With this setting you can adjust the amount of memory occupied by History Log. By default you have 100 undo levels, which means you can revert up to hundred of recent movie edits. It's not very much, because during real TASing you make lots of various edits within a small time span, as the time runs imperceptibly. If your computer has enough RAM, you can increase the "max undo levels" value up to the maximum possible number 1000.</span></p>
<p class="rvps10"><span class="rvts21">Maximum possible value of the period is 1440 minutes (24 hours). You can disable this function by switching off the "Autosave project" checkbox, but that's not recommended.</span></p> <p class="rvps7"><a name="SetGreenzonecapacity"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="Setmaxundolevels"></a> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/greenzone-capacity.png"></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Set Greenzone capacity</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Set max undo levels</span></p> <p class="rvps7"><span class="rvts20">Defines the maximum size of the Greenzone. The Greenzone is used for easier Playback cursor navigation, allowing to instantly return to any frame that has been emulated. It needs a lot of computer memory to store emulator's information and a lot of disk space for saving FM3 projects.</span></p>
<p class="rvps10"><span class="rvts21">Specifies</span><span class="rvts21"> the maximum number of undo steps, how many times you can restore previous state of the project by pressing </span><span class="rvts30">Ctrl + Z</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">The more of green and red frames there are in the Piano Roll, the more memory the Greenzone occupies. For most NES games 1 frame costs about 10 kilobytes (compressed data). So, big movie projects may take hundreds of megabytes. It affects the project loading and saving time.</span></p>
<p class="rvps10"><span class="rvts21">The History Log needs a lot of computer memory and takes some disk space to save FM3 files. The whole Log is stored in project files in compressed state. The compression is done in background when the emulator is idle, Taseditor gradually compresses new items of the History Log. Thanks to this behavior, the History Log size doesn't affect FM3 saving time much.</span></p> <p class="rvps7"><span class="rvts20">To decrease the amount of needed memory, Taseditor regularly cleans the Greenzone tail, forgetting the info about segments that are too far from the Playback cursor.</span></p>
<p class="rvps10"><span class="rvts21">With this setting you can adjust the amount of memory occupied by History Log. By default you have 100 undo levels, which means you can revert up to hundred of recent movie edits. It's not very much, because during real TASing you make lots of various edits within a small time span, as the time runs imperceptibly. If your computer has enough RAM, you can increase the "max undo levels" value up to the maximum possible number 1000.</span></p> <p class="rvps7"><span class="rvts20">This cleaning doesn't mean the Greenzone becomes inaccessible (white) on those frames. That would be very inconvenient, because to replay these frames you would need to wait until the emulation runs from the beginning of the movie. </span><span class="rvts20">To avoid such inconvenience and still free some memory from old Greenzone sections, Taseditor uses </span><span class="rvts33">gradual rarefication</span><span class="rvts20"> of the Greenzone tail.</span></p>
<p class="rvps10"><a name="SetGreenzonecapacity"></a> <p class="rvps7"><span class="rvts20">This process works like shown on the picture to the right. The light-blue cursor runs down along the Piano Roll. The cursor is the head of the Greenzone. It leaves green/red lines behind, but far above it some of the lines become pale again. At first, every odd frame is cleared, then 3 of every 4, then 7 of 8, and finally 15 of 16.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Thus the Greenzone tail contains many hollow sections. And if you decide to send emulator to a frame inside such hollow section, you'll need to wait while emulation runs to it from the nearest bright Greenzone frame. But since bright frames alternate every 2 or 4 frames, the waiting will only last a split second, so you won't likely notice the difference between jumping to a regular Greenzone frame (instant jump) and jumping to a cleared tail (instant seeking).</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/greenzone-capacity.png"/></p> <p class="rvps7"><span class="rvts20">By adjusting the "</span><span class="rvts20">Set greenzone capacity</span><span class="rvts20">" setting you can specify how many Greenzone frames (starting from its head) must stay untouched. On the picture to the right this number is 8.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Set Greenzone capacity</span></p> <p class="rvps7"><span class="rvts20">For an experiment, choose the "</span><span class="rvts20">Set greenzone capacity</span><span class="rvts20">" item, a dialog window will appear asking you to enter a number, type 100 and press OK. This will mean that first hundred of frames above the Playback cursor should not be cleaned. Any cursor navigation along this area will be instant, so you may drag the light-blue cursor and use rewind with maximum comfort. After the first hundred of frames the cleaning will be removing every other frame you'll see alternation of bright and pale lines in the Piano Roll. This alternation will last for about 200 frames. The Playback cursor navigation along the area of 200 frames will also be almost instant.</span></p>
<p class="rvps10"><span class="rvts21">Defines the maximum size of the Greenzone. The Greenzone is used for easier Playback cursor navigation, allowing to instantly return to any frame that has been emulated. It needs a lot of computer memory to store emulator's information and a lot of disk space for saving FM3 projects.</span></p> <p class="rvps7"><span class="rvts20">This way the Greenzone covers 100 + 200 = 300 frames, while only 100 + 100 = 200 frames are stored in memory. Then, during next 400 frames, every filled line will alternate with 3 cleared lines, and so on. In total, the Greenzone will only occupy memory needed for storing the data of 500 frames (about 5 MB), while the accessible area will be 3100 frames (about a minute).</span></p>
<p class="rvps10"><span class="rvts21">The more of green and red frames there are in the Piano Roll, the more memory the Greenzone occupies. For most NES games 1 frame costs about 10 kilobytes (compressed data). So, big movie projects may take hundreds of megabytes. It affects the project loading and saving time.</span></p> <p class="rvps7"><span class="rvts20">By default, the Greenzone capacity is 10000 frames. This should be enough for most TASes. </span><span class="rvts20">It's recommended to TAS with</span><span class="rvts20"> no less than 1000 frames of Greenzone capacity, because the further economy would be impractical.</span></p>
<p class="rvps10"><span class="rvts21">To decrease the amount of needed memory, Taseditor regularly cleans the Greenzone tail, forgetting the info about segments that are too far from the Playback cursor.</span></p> <p class="rvps7"><span class="rvts20">The maximum number for that parameter is 50000.</span></p>
<p class="rvps10"><span class="rvts21">This cleaning doesn't mean the Greenzone becomes inaccessible (white) on those frames. That would be very inconvenient, because to replay these frames you would need to wait until the emulation runs from the beginning of the movie. </span><span class="rvts21">To avoid such inconvenience and still free some memory from old Greenzone sections, Taseditor uses </span><span class="rvts37">gradual rarefication</span><span class="rvts21"> of the Greenzone tail.</span></p> <p class="rvps7"><a name="EnableGreenzoning"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">This process works like shown on the picture to the right. The light-blue cursor runs down along the Piano Roll. The cursor is the head of the Greenzone. It leaves green/red lines behind, but far above it some of the lines become pale again. At first, every odd frame is cleared, then 3 of every 4, then 7 of 8, and finally 15 of 16.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Enable Greenzoning</span></p>
<p class="rvps10"><span class="rvts21">Thus the Greenzone tail contains many hollow sections. And if you decide to send emulator to a frame inside such hollow section, you'll need to wait while emulation runs to it from the nearest bright Greenzone frame. But since bright frames alternate every 2 or 4 frames, the waiting will only last a split second, so you won't likely notice the difference between jumping to a regular Greenzone frame (instant jump) and jumping to a cleared tail (instant seeking).</span></p> <p class="rvps7"><span class="rvts20">Controls the process of collecting data to the Greenzone.</span></p>
<p class="rvps10"><span class="rvts21">By adjusting the "</span><span class="rvts21">Set greenzone capacity</span><span class="rvts21">" setting you can specify how many Greenzone frames (starting from its head) must stay untouched. On the picture to the right this number is 8.</span></p> <p class="rvps7"><span class="rvts20">If the option is enabled, every new frame is saved into the Greenzone right after it has been emulated. This is intended behavior of Taseditor, so the option is enabled by default.</span></p>
<p class="rvps10"><span class="rvts21">For an experiment, choose the "</span><span class="rvts21">Set greenzone capacity</span><span class="rvts21">" item, a dialog window will appear asking you to enter a number, type 100 and press OK. This will mean that first hundred of frames above the Playback cursor should not be cleaned. Any cursor navigation along this area will be instant, so you may drag the light-blue cursor and use rewind with maximum comfort. After the first hundred of frames the cleaning will be removing every other frame you'll see alternation of bright and pale lines in the Piano Roll. This alternation will last for about 200 frames. The Playback cursor navigation along the area of 200 frames will also be almost instant.</span></p> <p class="rvps7"><span class="rvts20">Disabling this option may be useful in rare cases, for example, when running bots which need high performance. But in normal situations it's recommended to have this function enabled.</span></p>
<p class="rvps10"><span class="rvts21">This way the Greenzone covers 100 + 200 = 300 frames, while only 100 + 100 = 200 frames are stored in memory. Then, during next 400 frames, every filled line will alternate with 3 cleared lines, and so on. In total, the Greenzone will only occupy memory needed for storing the data of 500 frames (about 5 MB), while the accessible area will be 3100 frames (about a minute).</span></p> <p class="rvps7"><a name="AutofirePatternskipsLag"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">By default, the Greenzone capacity is 10000 frames. This should be enough for most TASes. </span><span class="rvts21">It's recommended to TAS with</span><span class="rvts21"> no less than 1000 frames of Greenzone capacity, because the further economy would be impractical.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Autofire Pattern skips Lag</span></p>
<p class="rvps10"><span class="rvts21">The maximum number for that parameter is 50000.</span></p> <p class="rvps7"><span class="rvts20">Accounts for lag when you're using patterns (</span><span class="rvts27">Alt</span><span class="rvts20"> + clicks on Input).</span></p>
<p class="rvps10"><a name="EnableGreenzoning"></a> <p class="rvps7"><span class="rvts20">If the option is disabled, patterns appear in the Piano Roll exactly like they were coded (e.g. for the pattern "</span><span class="rvts33">Alternating (1010...)</span><span class="rvts20">" the new buttonpresses will indeed alternate one after another).</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If </span><span class="rvts20">the option is</span><span class="rvts20"> enabled, the resulting sequence of buttonpresses may differ from original pattern (lag frames will have additional gaps not present in the pattern).</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Enable Greenzoning</span></p> <p class="rvps7"><span class="rvts20">Since lag frames aren't accounted by most games, you have to skip red lines of the Piano Roll to correctly calculate the gaps between presses. For instance, if there must be exactly 3 blank frames between every buttonpress (pattern "10001000"), but there's also one lag frame in the middle of current segment, you have to add 1 more blank frame &nbsp;(100</span><span class="rvts22">0</span><span class="rvts20">01000).</span></p>
<p class="rvps10"><span class="rvts21">Controls the process of collecting data to the Greenzone.</span></p> <p class="rvps7"><span class="rvts20">This option is enabled by default.</span><span class="rvts20"> It's recommended to leave it enabled, because in vast majority of cases you'll need to skip lag frames, in order to adapt buttonpresses to how the game interprets Input.</span></p>
<p class="rvps10"><span class="rvts21">If the option is enabled, every new frame is saved into the Greenzone right after it has been emulated. This is intended behavior of Taseditor, so the option is enabled by default.</span></p> <p class="rvps7"><a name="AutoAdjustInputAccordingtoLag"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Disabling this option may be useful in rare cases, for example, when running bots which need high performance. But in normal situations it's recommended to have this function enabled.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Auto-adjust Input according to Lag</span></p>
<p class="rvps10"><a name="AutofirePatternskipsLag"></a> <p class="rvps7"><span class="rvts20">Enables automatic adjustment of Input according to changes of lag data.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Basically, games only care about Input at green lines of the Piano Roll. It's pointless to draw any Input on red lines, because during lag frames the game doesn't poll Input. Those frames simply don't exist from the point of view of the game engine.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Autofire Pattern skips Lag</span></p> <p class="rvps7"><span class="rvts20">When you edit Input, you change the flow of game events, and lag may appear on different frames too. If those frames previously had a meaningful Input, this Input must be shifted to the frames without lag, to allow it to affect the game.</span></p>
<p class="rvps10"><span class="rvts21">Accounts for lag when you're using patterns (</span><span class="rvts30">Alt</span><span class="rvts21"> + clicks on Input).</span></p> <p class="rvps7"><span class="rvts20">If this checkbox is enabled, you won't have to adjust the Input manually every time the Lag appears on different frames. Taseditor will insert an extra line at every new lag frame, thus shifting Input 1 frame down. And when an old lag frame disappears, Taseditor will remove respective frames from the movie, thus shifting Input up. As a result, you can be sure that the game will always perceive your old Input correctly, no matter any Lag changes.</span></p>
<p class="rvps10"><span class="rvts21">If the option is disabled, patterns appear in the Piano Roll exactly like they were coded (e.g. for the pattern "</span><span class="rvts37">Alternating (1010...)</span><span class="rvts21">" the new buttonpresses will indeed alternate one after another).</span></p> <p class="rvps7"><span class="rvts20">Auto-adjustment operations are done by Taseditor only when you're watching (emulating) a segment, i.e. when Playback cursor runs through pale Piano Roll lines. The result of these operations is saved into the current History Log item.</span></p>
<p class="rvps10"><span class="rvts21">If </span><span class="rvts21">the option is</span><span class="rvts21"> enabled, the resulting sequence of buttonpresses may differ from original pattern (lag frames will have additional gaps not present in the pattern).</span></p> <p class="rvps7"><span class="rvts20">This feature is enabled by default, and it's recommended to always work with the function enabled. It significantly increases the comfort of TASing, especially when dealing with lag-heavy games.</span></p>
<p class="rvps10"><span class="rvts21">Since lag frames aren't accounted by most games, you have to skip red lines of the Piano Roll to correctly calculate the gaps between presses. For instance, if there must be exactly 3 blank frames between every buttonpress (pattern "10001000"), but there's also one lag frame in the middle of current segment, you have to add 1 more blank frame &nbsp;(100</span><span class="rvts25">0</span><span class="rvts21">01000).</span></p> <p class="rvps7"><a name="DrawInputbydragging"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">This option is enabled by default.</span><span class="rvts21"> It's recommended to leave it enabled, because in vast majority of cases you'll need to skip lag frames, in order to adapt buttonpresses to how the game interprets Input.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Draw Input by dragging</span></p>
<p class="rvps10"><a name="AutoAdjustInputAccordingtoLag"></a> <p class="rvps7"><span class="rvts20">Allows to literally draw Input by holding the left mouse button and moving the mouse cursor over the Piano Roll.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">This option is enabled by default, so you can </span><span class="rvts20">quickly draw or erase a long line of buttonpresses.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Auto-adjust Input according to Lag</span></p> <p class="rvps7"><span class="rvts20">Drawing/erasing is usually constrained by single column, which allows user to do sweeping motions with the mouse. But if you hold the </span><span class="rvts27">Shift</span><span class="rvts20"> key while drawing, you will be able to draw/erase Input freely (it's rather impractical, but fun).</span></p>
<p class="rvps10"><span class="rvts21">Enables automatic adjustment of Input according to changes of lag data.</span></p> <p class="rvps7"><span class="rvts20">If you disable this option, your clicks will only set/unset single buttonpresses. It may be necessary, for example, if you have trembling hands. But otherwise enabling this feature is recommended.</span></p>
<p class="rvps10"><span class="rvts21">Basically, games only care about Input at green lines of the Piano Roll. It's pointless to draw any Input on red lines, because during lag frames the game doesn't poll Input. Those frames simply don't exist from the point of view of the game engine.</span></p> <p class="rvps7"><a name="CombineconsecutiveRecordings"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When you edit Input, you change the flow of game events, and lag may appear on different frames too. If those frames previously had a meaningful Input, this Input must be shifted to the frames without lag, to allow it to affect the game.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Combine consecutive Recordings/Draws</span></p>
<p class="rvps10"><span class="rvts21">If this checkbox is enabled, you won't have to adjust the Input manually every time the Lag appears on different frames. Taseditor will insert an extra line at every new lag frame, thus shifting Input 1 frame down. And when an old lag frame disappears, Taseditor will remove respective frames from the movie, thus shifting Input up. As a result, you can be sure that the game will always perceive your old Input correctly, no matter any Lag changes.</span></p> <p class="rvps7"><span class="rvts20">Combines consecutive operations of Input Recording into single item of the History Log. Also combines all Input drawn with the same press of mouse button.</span></p>
<p class="rvps10"><span class="rvts21">Auto-adjustment operations are done by Taseditor only when you're watching (emulating) a segment, i.e. when Playback cursor runs through pale Piano Roll lines. The result of these operations is saved into the current History Log item.</span></p> <p class="rvps7"><span class="rvts20">This feature is disabled by default. So when you're recording Input, </span><span class="rvts20">every recorded frame will create a separate item in the History Log, and you can undo changes for any frame. Also, when you're drawing Input, every new stroke will create a new History Log item, and you can undo each of them separately.</span></p>
<p class="rvps10"><span class="rvts21">This feature is enabled by default, and it's recommended to always work with the function enabled. It significantly increases the comfort of TASing, especially when dealing with lag-heavy games.</span></p> <p class="rvps7"><span class="rvts20">However, in real TASing you don't need such precision of the undo. In fact, it may even become irritating when you have to undo every buttonpress separately. So, to save considerable amount of space in History Log, it's recommended to enable this option.</span></p>
<p class="rvps10"><a name="DrawInputbydragging"></a> <p class="rvps7"><a name="Use1PkeysforallsingleRecordings"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Use 1P keys for all single Recordings</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Draw Input by dragging</span></p> <p class="rvps7"><span class="rvts20">Allows to record any joypad Input using only the first gamepad (1P). This function is used when you record Input traditional way using multitracking method to take turns for different players, e.g. first you record a short segment of Input for player one (1P), then record the Input for 2P and so on.</span></p>
<p class="rvps10"><span class="rvts21">Allows to literally draw Input by holding the left mouse button and moving the mouse cursor over the Piano Roll.</span></p> <p class="rvps7"><span class="rvts20">Thanks to multitracking, you don't have to press buttons on both controllers at once. And with the "Use 1P keys for all single Recordings" option you don't even have to configure 2P controls, because the same keys used for 1P can be used for all the rest joypads too.</span></p>
<p class="rvps10"><span class="rvts21">This option is enabled by default, so you can </span><span class="rvts21">quickly draw or erase a long line of buttonpresses.</span></p> <p class="rvps7"><span class="rvts20">The option is enabled by default. If you disable it, emulator will use the second controller keys for recording 2P.</span></p>
<p class="rvps10"><span class="rvts21">Drawing/erasing is usually constrained by single column, which allows user to do sweeping motions with the mouse. But if you hold the </span><span class="rvts30">Shift</span><span class="rvts21"> key while drawing, you will be able to draw/erase Input freely (it's rather impractical, but fun).</span></p> <p class="rvps7"><span class="rvts20">It's recommended to have it enabled, in order to save the space on the keyboard.</span></p>
<p class="rvps10"><span class="rvts21">If you disable this option, your clicks will only set/unset single buttonpresses. It may be necessary, for example, if you have trembling hands. But otherwise enabling this feature is recommended.</span></p> <p class="rvps7"><a name="UseInputkeysforColumnSet"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="CombineconsecutiveRecordings"></a> <p class="rvps7"><span class="rvts21">Config -&gt; Use Input keys for Column Set</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Allows editing Input in selected frames by pressing corresponding joypad keys.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Combine consecutive Recordings/Draws</span></p> <p class="rvps7"><span class="rvts20">This feature is intended to speed up the Input editing process. To mass-set/mass-unset buttonpresses in a given segment, you usually either draw with mouse, or select a range of frames and click the necessary symbol in the Piano Roll Header the symbol flashes and the respective Input changes in all the selected frames.</span></p>
<p class="rvps10"><span class="rvts21">Combines consecutive operations of Input Recording into single item of the History Log. Also combines all Input drawn with the same press of mouse button.</span></p> <p class="rvps7"><span class="rvts20">With the "Use Input keys for Column Set" option you can press real keys (assigned to joypads) instead of clicking the Piano Roll Header. The result will be the same.</span></p>
<p class="rvps10"><span class="rvts21">This feature is disabled by default. So when you're recording Input, </span><span class="rvts21">every recorded frame will create a separate item in the History Log, and you can undo changes for any frame. Also, when you're drawing Input, every new stroke will create a new History Log item, and you can undo each of them separately.</span></p> <p class="rvps7"><span class="rvts20">The option is disabled by default. </span><span class="rvts20">Turn it on if you mostly use the new TASing methods and don't record Input traditional way. But when you're using Recording, either disable it or just remove the Selection to avoid Input changes on the selected frames when pressing joypad buttons.</span></p>
<p class="rvps10"><span class="rvts21">However, in real TASing you don't need such precision of the undo. In fact, it may even become irritating when you have to undo every buttonpress separately. So, to save considerable amount of space in History Log, it's recommended to enable this option.</span></p> <p class="rvps7"><span class="rvts20">With this feature you can record joypad buttons even when Recording is off. Put the Selection cursor to the frame you want to apply Input to, and press the needed joypad buttons.</span></p>
<p class="rvps10"><a name="Use1PkeysforallsingleRecordings"></a> <p class="rvps7"><span class="rvts20">Multitracking mode in this case works the same way as with regular Recording. For example, if the "2P" radiobutton is chosen at the moment, pressing the key assigned to the </span><span class="rvts26">A</span><span class="rvts20"> button will only record Input for the "A" column of the 2nd player.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><a name="BindMarkerstoInput"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Use 1P keys for all single Recordings</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Bind Markers to Input</span></p>
<p class="rvps10"><span class="rvts21">Allows to record any joypad Input using only the first gamepad (1P). This function is used when you record Input traditional way using multitracking method to take turns for different players, e.g. first you record a short segment of Input for player one (1P), then record the Input for 2P and so on.</span></p> <p class="rvps7"><span class="rvts20">Attaches Markers to Input. If the option is enabled, various Input editing functions will also affect Markers. For example, inserting blank frames into the movie will shift down both Input and Markers.</span></p>
<p class="rvps10"><span class="rvts21">Thanks to multitracking, you don't have to press buttons on both controllers at once. And with the "Use 1P keys for all single Recordings" option you don't even have to configure 2P controls, because the same keys used for 1P can be used for all the rest joypads too.</span></p> <p class="rvps7"><span class="rvts20">Usually Markers are set to frames where certain in-game events occur. And when you improve previous result and reach the given place earlier than before, the corresponding Marker (set there after previous attempt) should point to an earlier frame now. Sometimes you have to drag such Markers manually. But thanks to the binding feature, Markers will shift themselves during Input modifications, so the manual adjustment of Markers is rarely needed.</span></p>
<p class="rvps10"><span class="rvts21">The option is enabled by default. If you disable it, emulator will use the second controller keys for recording 2P.</span></p> <p class="rvps7"><span class="rvts20">Detaching Markers may be necessary when you need to edit Input without shifting Markers. For example, when you need to remove a part of Input, leaving Markers intact.</span></p>
<p class="rvps10"><span class="rvts21">It's recommended to have it enabled, in order to save the space on the keyboard.</span></p> <p class="rvps7"><span class="rvts20">The option is on by default. It's</span><span class="rvts20"> recommended to work with attached Markers most of the time, temporarily detaching them when necessary.</span></p>
<p class="rvps10"><a name="UseInputkeysforColumnSet"></a> <p class="rvps7"><span class="rvts20">For clarification, Taseditor highlights attached Markers with a pale yellow color, and detached Markers with more bright yellow.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><a name="EmptynewMarkerNotes"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Use Input keys for Column Set</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Empty new Marker Notes</span></p>
<p class="rvps10"><span class="rvts21">Allows editing Input in selected frames by pressing corresponding joypad keys.</span></p> <p class="rvps7"><span class="rvts20">Defines the default Notes text. If the option is set, each newly created Marker will have an empty Note. If not set, the new Marker will copy the above Marker's Note text.</span></p>
<p class="rvps10"><span class="rvts21">This feature is intended to speed up the Input editing process. To mass-set/mass-unset buttonpresses in a given segment, you usually either draw with mouse, or select a range of frames and click the necessary symbol in the Piano Roll Header the symbol flashes and the respective Input changes in all the selected frames.</span></p> <p class="rvps7"><span class="rvts20">The option is enabled by default. It's</span><span class="rvts20"> recommended to </span><span class="rvts20">left it on and type original Notes for important Markers, thus not leaving all Notes blank.</span></p>
<p class="rvps10"><span class="rvts21">With the "Use Input keys for Column Set" option you can press real keys (assigned to joypads) instead of clicking the Piano Roll Header. The result will be the same.</span></p> <p class="rvps7"><a name="OldcontrolschemeforBranching"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The option is disabled by default. </span><span class="rvts21">Turn it on if you mostly use the new TASing methods and don't record Input traditional way. But when you're using Recording, either disable it or just remove the Selection to avoid Input changes on the selected frames when pressing joypad buttons.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Old control scheme for Branching</span></p>
<p class="rvps10"><span class="rvts21">With this feature you can record joypad buttons even when Recording is off. Put the Selection cursor to the frame you want to apply Input to, and press the needed joypad buttons.</span></p> <p class="rvps7"><span class="rvts20">Imitates certain limitations of the traditional TASing method, particularly related to handling the Bookmarks (savestates).</span></p>
<p class="rvps10"><span class="rvts21">Multitracking mode in this case works the same way as with regular Recording. For example, if the "2P" radiobutton is chosen at the moment, pressing the key assigned to the </span><span class="rvts29">A</span><span class="rvts21"> button will only record Input for the "A" column of the 2nd player.</span></p> <p class="rvps7"><span class="rvts20">The option is disabled by default</span><span class="rvts20">, so hotkeys </span><span class="rvts23">F1</span><span class="rvts20">-</span><span class="rvts23">F10</span><span class="rvts20"> are used to load branch of the the corresponding Bookmarks, and the numeric keys </span><span class="rvts23">1</span><span class="rvts20">-</span><span class="rvts23">10</span><span class="rvts20"> are used for simple jumps to bookmarked frames without changing the movie.</span></p>
<p class="rvps10"><a name="BindMarkerstoInput"></a> <p class="rvps7"><span class="rvts20">Also, Input Recording is switched on with a simple press of the </span><span class="rvts23">Toggle Read-Only</span><span class="rvts20"> hotkey.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">But if you enable this option, the controls scheme will be the same as in old emulators. Pressing </span><span class="rvts23">F1</span><span class="rvts20">-</span><span class="rvts23">F10</span><span class="rvts20"> will work depending on the Recording mode. When the Recording is off, functional keys jump to respective Bookmark frame, and when Recording is on, </span><span class="rvts23">F1</span><span class="rvts20">-</span><span class="rvts23">F10</span><span class="rvts20"> keys load the branch of the Bookmark.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Bind Markers to Input</span></p> <p class="rvps7"><span class="rvts20">Also, Input Recording won't work until you load some Bookmark. This behavior allows you to press the </span><span class="rvts23">Toggle Read-Only</span><span class="rvts20"> hotkey in the middle of watching the movie, without overwriting old Input until you actually load a savestate.</span></p>
<p class="rvps10"><span class="rvts21">Attaches Markers to Input. If the option is enabled, various Input editing functions will also affect Markers. For example, inserting blank frames into the movie will shift down both Input and Markers.</span></p> <p class="rvps7"><span class="rvts20">Plus, there will be a red frame around the "current slot" number in the Bookmarks List. Press numeric keys </span><span class="rvts23">1</span><span class="rvts20">-</span><span class="rvts23">10</span><span class="rvts20"> to switch the current slot.</span></p>
<p class="rvps10"><span class="rvts21">Usually Markers are set to frames where certain in-game events occur. And when you improve previous result and reach the given place earlier than before, the corresponding Marker (set there after previous attempt) should point to an earlier frame now. Sometimes you have to drag such Markers manually. But thanks to the binding feature, Markers will shift themselves during Input modifications, so the manual adjustment of Markers is rarely needed.</span></p> <p class="rvps7"><span class="rvts20">This option is only left here to help old TASers move to Taseditor. But it's recommended to use the new controls scheme, because it fits the specifics of TASing process in Taseditor much better.</span></p>
<p class="rvps10"><span class="rvts21">Detaching Markers may be necessary when you need to edit Input without shifting Markers. For example, when you need to remove a part of Input, leaving Markers intact.</span></p> <p class="rvps7"><a name="BranchesrestoreentireMovie"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The option is on by default. It's</span><span class="rvts21"> recommended to work with attached Markers most of the time, temporarily detaching them when necessary.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Branches restore entire Movie</span></p>
<p class="rvps10"><span class="rvts21">For clarification, Taseditor highlights attached Markers with a pale yellow color, and detached Markers with more bright yellow.</span></p> <p class="rvps7"><span class="rvts20">Defines the way a branch is restored when you load its Bookmark.</span></p>
<p class="rvps10"><a name="EmptynewMarkerNotes"></a> <p class="rvps7"><span class="rvts20">The option is enabled by default, so </span><span class="rvts20">when you're loading a Bookmark, you replace the current movie with the movie state stored in that Bookmark.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If this option is disabled, when you're loading a Bookmark, the current movie is replaced with a truncated version of the bookmarked movie state. The movie will be truncated at the bookmarked frame, thus imitating the traditional behavior of loading a savestate: savestates only recover the part of the movie before the Playback cursor, and the rest frames (from the light-blue cursor to the movie end) aren't loaded. This makes sense when TASing traditional way, because after loading a savestate TASer usually records a new Input starting from the position of the Playback cursor, so there's no need to load the data that is going to be be overwritten anyway. But in Taseditor the movie is edited independently from the Playback cursor position, so you can load the entire movie state from Bookmarks, without caring if the Playback cursor is in the end of the movie or it is in the middle.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Empty new Marker Notes</span></p> <p class="rvps7"><span class="rvts20">It's recommended to leave this option enabled.</span></p>
<p class="rvps10"><span class="rvts21">Defines the default Notes text. If the option is set, each newly created Marker will have an empty Note. If not set, the new Marker will copy the above Marker's Note text.</span></p> <p class="rvps7"><a name="HUDinBranchscreenshots"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The option is enabled by default. It's</span><span class="rvts21"> recommended to </span><span class="rvts21">left it on and type original Notes for important Markers, thus not leaving all Notes blank.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; HUD in Branch screenshots</span></p>
<p class="rvps10"><a name="OldcontrolschemeforBranching"></a> <p class="rvps7"><span class="rvts20">Defines the way to capture screenshots when creating Bookmarks.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">If the option is on, it takes a snapshot of the whole emulator window, including icons and emulator messages, Lua output and other data placed over the game picture. If the option is disabled, Bookmarks will only capture the game output.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Old control scheme for Branching</span></p> <p class="rvps7"><span class="rvts20">The option is enabled by default. </span><span class="rvts20">It's recommended to leave it on, in order to use Lua output and frame counter when comparing alternate approaches to playing through a segment.</span></p>
<p class="rvps10"><span class="rvts21">Imitates certain limitations of the traditional TASing method, particularly related to handling the Bookmarks (savestates).</span></p> <p class="rvps7"><a name="AutopauseattheendofMovie"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The option is disabled by default</span><span class="rvts21">, so hotkeys </span><span class="rvts26">F1</span><span class="rvts21">-</span><span class="rvts26">F10</span><span class="rvts21"> are used to load branch of the the corresponding Bookmarks, and the numeric keys </span><span class="rvts26">1</span><span class="rvts21">-</span><span class="rvts26">10</span><span class="rvts21"> are used for simple jumps to bookmarked frames without changing the movie.</span></p> <p class="rvps7"><span class="rvts21">Config -&gt; Autopause at the end of Movie</span></p>
<p class="rvps10"><span class="rvts21">Also, Input Recording is switched on with a simple press of the </span><span class="rvts26">Toggle Read-Only</span><span class="rvts21"> hotkey.</span></p> <p class="rvps7"><span class="rvts20">Automatically stops movie playback at the last frame, unless it started playing from the last frame.</span></p>
<p class="rvps10"><span class="rvts21">But if you enable this option, the controls scheme will be the same as in old emulators. Pressing </span><span class="rvts26">F1</span><span class="rvts21">-</span><span class="rvts26">F10</span><span class="rvts21"> will work depending on the Recording mode. When the Recording is off, functional keys jump to respective Bookmark frame, and when Recording is on, </span><span class="rvts26">F1</span><span class="rvts21">-</span><span class="rvts26">F10</span><span class="rvts21"> keys load the branch of the Bookmark.</span></p> <p class="rvps7"><span class="rvts20">When replaying a finished (or partially finished) movie, you usually don't want to pass over the boundary of its Input. That's why the "Autopause at the end of Movie" option is enabled by default. If you disable it, the emulator will play infinitely after the current movie Input ended, expanding the movie size until you press </span><span class="rvts23">Pause</span><span class="rvts20"> or the middle mouse button.</span></p>
<p class="rvps10"><span class="rvts21">Also, Input Recording won't work until you load some Bookmark. This behavior allows you to press the </span><span class="rvts26">Toggle Read-Only</span><span class="rvts21"> hotkey in the middle of watching the movie, without overwriting old Input until you actually load a savestate.</span></p> <p class="rvps7"><span class="rvts20">It's recommended to leave this option enabled.</span></p>
<p class="rvps10"><span class="rvts21">Plus, there will be a red frame around the "current slot" number in the Bookmarks List. Press numeric keys </span><span class="rvts26">1</span><span class="rvts21">-</span><span class="rvts26">10</span><span class="rvts21"> to switch the current slot.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">This option is only left here to help old TASers move to Taseditor. But it's recommended to use the new controls scheme, because it fits the specifics of TASing process in Taseditor much better.</span></p> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="BranchesrestoreentireMovie"></a> <p class="rvps7"><a name="fceux-config"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Now you are aware of all Taseditor settings, the remaining part of the chapter describes FCEUX emulator settings that may be useful for a TASer.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Branches restore entire Movie</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Defines the way a branch is restored when you load its Bookmark.</span></p> <p class="rvps7"><span class="rvts20">If you are going to TAS traditional way, it's obligatory to set the first controller buttons to such keys that would be easy to press together with the </span><span class="rvts23">Frame Advance</span><span class="rvts20"> hotkey. While FCEUX supports binding the virtual NES joypad to a real PC gamepad, it's recommended to use the keyboard for recording Input, in order to have fast access to </span><span class="rvts23">Frame Advance</span><span class="rvts20">, </span><span class="rvts23">Frame Rewind</span><span class="rvts20">, </span><span class="rvts23">Pause</span><span class="rvts20">, and to all 10 savestate slots.</span></p>
<p class="rvps10"><span class="rvts21">The option is enabled by default, so </span><span class="rvts21">when you're loading a Bookmark, you replace the current movie with the movie state stored in that Bookmark.</span></p> <p class="rvps7"><span class="rvts20">However, if you use Taseditor as intended, you won't need to use Recording too much, and even in cases when you use it (for example, when recording a test playthrough of a level), an access to functional keys isn't critical. So, you can reassign the game controls to a USB gamepad, if you have one.</span></p>
<p class="rvps10"><span class="rvts21">If this option is disabled, when you're loading a Bookmark, the current movie is replaced with a truncated version of the bookmarked movie state. The movie will be truncated at the bookmarked frame, thus imitating the traditional behavior of loading a savestate: savestates only recover the part of the movie before the Playback cursor, and the rest frames (from the light-blue cursor to the movie end) aren't loaded. This makes sense when TASing traditional way, because after loading a savestate TASer usually records a new Input starting from the position of the Playback cursor, so there's no need to load the data that is going to be be overwritten anyway. But in Taseditor the movie is edited independently from the Playback cursor position, so you can load the entire movie state from Bookmarks, without caring if the Playback cursor is in the end of the movie or it is in the middle.</span></p> <p class="rvps7"><span class="rvts20">Virtual controller buttons are configured in FCEUX the following way. Choose </span><span class="rvts22">Config -&gt; Input</span><span class="rvts20"> in emulator main menu. In the appeared dialog, select the "Gamepad" item from the leftmost drop-down listbox (usually it's already selected). Click the left </span><span class="rvts26">Configure</span><span class="rvts20"> button (since you need to configure the first gamepad). In the new window click the </span><span class="rvts26">Up</span><span class="rvts20"> button, then a small window will appear, now press the keyboard key you want to set for the virtual </span><span class="rvts26">Up</span><span class="rvts20"> button. Press that key 2nd time to confirms your choice, or just click </span><span class="rvts26">Close</span><span class="rvts20">. Then you need to do the same for the rest buttons of NES gamepad </span><span class="rvts26">Down</span><span class="rvts20">, </span><span class="rvts26">Left</span><span class="rvts20">, </span><span class="rvts26">Right</span><span class="rvts20">, </span><span class="rvts26">Select</span><span class="rvts20">, </span><span class="rvts26">Start</span><span class="rvts20">, </span><span class="rvts26">B</span><span class="rvts20">, </span><span class="rvts26">A</span><span class="rvts20">. After you're done with the first controller buttons (Virtual Gamepad 1), you may close both windows: Gamepad and Input Configuration.</span></p>
<p class="rvps10"><span class="rvts21">It's recommended to leave this option enabled.</span></p> <p class="rvps7"><span class="rvts20">You can check the assigned buttons while playing the game or while Taseditor is engaged as you press them, the corresponding symbols in the Piano Roll Header will shine with green color. Besides, if you enable Input display (FCEUX: </span><span class="rvts22">Config -&gt; Display -&gt; Input Display -&gt; 2 player</span><span class="rvts20">), FCEUX screen will show you the pressed buttons too.</span></p>
<p class="rvps10"><a name="HUDinBranchscreenshots"></a> <p class="rvps7"><span class="rvts20">In addition to recording the regular gaming session, virtual gamepad buttons may be used to quickly set Input when editing movie (see </span><a class="rvts24" href="ProgramCustomization.html#UseInputkeysforColumnSet">Config -&gt; Use Input keys for Column Set</a><span class="rvts20">). Select a range of frames where you want to change Input and press the key you assigned to a button of the virtual gamepad.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">When you map the virtual buttons to keyboard keys, make sure none of the emulator or Taseditor hotkeys are already assigned to those keys. The full list of default hotkeys can be found in the </span><a class="rvts24" href="Controls.html#hotkeys">Reference</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; HUD in Branch screenshots</span></p> <p class="rvps7"><span class="rvts20">Some FCEUX hotkeys don't have default mapping (they're not mapped to any key yet). You can configure them the following way. In the emulator main menu choose </span><span class="rvts22">Config -&gt; Map Hotkeys</span><span class="rvts20">. A window listing all possible emulator hotkeys will appear. Choose the necessary hotkey, double-click it and then press the desired keyboard key.</span></p>
<p class="rvps10"><span class="rvts21">Defines the way to capture screenshots when creating Bookmarks.</span></p> <p class="rvps7"><span class="rvts20">First of all, find the item called "</span><span class="rvts22">Open TAS Editor</span><span class="rvts20">" and double-click it. In the appeared window press the key that you will always use to quickly launch Taseditor.</span></p>
<p class="rvps10"><span class="rvts21">If the option is on, it takes a snapshot of the whole emulator window, including icons and emulator messages, Lua output and other data placed over the game picture. If the option is disabled, Bookmarks will only capture the game output.</span></p> <p class="rvps7"><span class="rvts20">Second, find the item "</span><span class="rvts23">Reload ROM or TAS Editor Project</span><span class="rvts20">" and either remap it or remember the default combination (</span><span class="rvts23">Ctrl + F1</span><span class="rvts20">). This hotkey will help you quickly return to your interrupted work just launch FCEUX, press the </span><span class="rvts23">Reload ROM</span><span class="rvts20"> hotkey, then press the aforementioned </span><span class="rvts22">Open TAS Editor</span><span class="rvts20"> hotkey, and then again </span><span class="rvts23">Reload ROM</span><span class="rvts20"> (this time it will work as </span><span class="rvts23">Reload TAS Editor Project</span><span class="rvts20">). This way you'll return to the state of your paused work in a split second.</span></p>
<p class="rvps10"><span class="rvts21">The option is enabled by default. </span><span class="rvts21">It's recommended to leave it on, in order to use Lua output and frame counter when comparing alternate approaches to playing through a segment.</span></p> <p class="rvps7"><span class="rvts20">Now look at the hotkeys "</span><span class="rvts23">Frame Advance</span><span class="rvts20">" и "</span><span class="rvts23">Frame Rewind</span><span class="rvts20">". They are used for Playback cursor navigation. By default they are mapped to "</span><span class="rvts23">\</span><span class="rvts20">" and "</span><span class="rvts23">Backspace</span><span class="rvts20">". You can reconfigure them to more handy keys or just use the mouse wheel for the Playback cursor frame-by-frame navigation.</span></p>
<p class="rvps10"><a name="AutopauseattheendofMovie"></a> <p class="rvps7"><span class="rvts20">Also see the "</span><span class="rvts23">Speed Down</span><span class="rvts20">" and "</span><span class="rvts23">Speed Up</span><span class="rvts20">" hotkeys. You may consider remapping them to Numpad keys "</span><span class="rvts22">+</span><span class="rvts20">" and "</span><span class="rvts22">-</span><span class="rvts20">".</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts23">Pause</span><span class="rvts20">" и "</span><span class="rvts23">Restore Playback</span><span class="rvts20">" hotkeys are set to "</span><span class="rvts23">Pause/Break</span><span class="rvts20">" and "</span><span class="rvts23">Spacebar</span><span class="rvts20">" keys by default, but in most cases it's easier to use the middle mouse button instead of these hotkeys, so you can even reassign the "</span><span class="rvts23">Spacebar</span><span class="rvts20">" for something else if you wish.</span></p>
<p class="rvps10"><span class="rvts22">Config -&gt; Autopause at the end of Movie</span></p> <p class="rvps7"><span class="rvts20">Finally, there is the "</span><span class="rvts23">Cancel Seeking</span><span class="rvts20">" hotkey ("</span><span class="rvts23">Esc</span><span class="rvts20">" key by default). Pressing it is the same as clicking the Taseditor progressbar if the Playback was seeking to a target frame, the seeking will be aborted.</span></p>
<p class="rvps10"><span class="rvts21">Automatically stops movie playback at the last frame, unless it started playing from the last frame.</span></p> <p class="rvps7"><span class="rvts20">Some FCEUX hotkeys don't work when Taseditor is engaged. For example, the "</span><span class="rvts22">Open ROM</span><span class="rvts20">" won't work you have to load ROM before running Taseditor. This is done for </span><a class="rvts24" href="MistakeProofing.html#DisabledHotkeys">mistake-proofing</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">When replaying a finished (or partially finished) movie, you usually don't want to pass over the boundary of its Input. That's why the "Autopause at the end of Movie" option is enabled by default. If you disable it, the emulator will play infinitely after the current movie Input ended, expanding the movie size until you press </span><span class="rvts26">Pause</span><span class="rvts21"> or the middle mouse button.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts49">It's recommended to leave this option enabled.</span></p> <p class="rvps7"><span class="rvts20">The next chapter describes </span><a class="rvts24" href="AdvancedFeatures.html">additional features of Taseditor</a><span class="rvts20">. You may postpone reading it until you are used to main features. Anyway, now you're ready enough for productive work in Taseditor.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="fceux-config"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Now you are aware of all Taseditor settings, the remaining part of the chapter describes FCEUX emulator settings that may be useful for a TASer.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21">If you are going to TAS traditional way, it's obligatory to set the first controller buttons to such keys that would be easy to press together with the </span><span class="rvts26">Frame Advance</span><span class="rvts21"> hotkey. While FCEUX supports binding the virtual NES joypad to a real PC gamepad, it's recommended to use the keyboard for recording Input, in order to have fast access to </span><span class="rvts26">Frame Advance</span><span class="rvts21">, </span><span class="rvts26">Frame Rewind</span><span class="rvts21">, </span><span class="rvts26">Pause</span><span class="rvts21">, and to all 10 savestate slots.</span></p>
<p class="rvps10"><span class="rvts21">However, if you use Taseditor as intended, you won't need to use Recording too much, and even in cases when you use it (for example, when recording a test playthrough of a level), an access to functional keys isn't critical. So, you can reassign the game controls to a USB gamepad, if you have one.</span></p>
<p class="rvps10"><span class="rvts21">Virtual controller buttons are configured in FCEUX the following way. Choose </span><span class="rvts25">Config -&gt; Input</span><span class="rvts21"> in emulator main menu. In the appeared dialog, select the "Gamepad" item from the leftmost drop-down listbox (usually it's already selected). Click the left </span><span class="rvts29">Configure</span><span class="rvts21"> button (since you need to configure the first gamepad). In the new window click the </span><span class="rvts29">Up</span><span class="rvts21"> button, then a small window will appear, now press the keyboard key you want to set for the virtual </span><span class="rvts29">Up</span><span class="rvts21"> button. Press that key 2nd time to confirms your choice, or just click </span><span class="rvts29">Close</span><span class="rvts21">. Then you need to do the same for the rest buttons of NES gamepad </span><span class="rvts29">Down</span><span class="rvts21">, </span><span class="rvts29">Left</span><span class="rvts21">, </span><span class="rvts29">Right</span><span class="rvts21">, </span><span class="rvts29">Select</span><span class="rvts21">, </span><span class="rvts29">Start</span><span class="rvts21">, </span><span class="rvts29">B</span><span class="rvts21">, </span><span class="rvts29">A</span><span class="rvts21">. After you're done with the first controller buttons (Virtual Gamepad 1), you may close both windows: Gamepad and Input Configuration.</span></p>
<p class="rvps10"><span class="rvts21">You can check the assigned buttons while playing the game or while Taseditor is engaged as you press them, the corresponding symbols in the Piano Roll Header will shine with green color. Besides, if you enable Input display (FCEUX: </span><span class="rvts25">Config -&gt; Display -&gt; Input Display -&gt; 2 player</span><span class="rvts21">), FCEUX screen will show you the pressed buttons too.</span></p>
<p class="rvps10"><span class="rvts21">In addition to recording the regular gaming session, virtual gamepad buttons may be used to quickly set Input when editing movie (see </span><a class="rvts27" href="ProgramCustomization.html#UseInputkeysforColumnSet">Config -&gt; Use Input keys for Column Set</a><span class="rvts21">). Select a range of frames where you want to change Input and press the key you assigned to a button of the virtual gamepad.</span></p>
<p class="rvps10"><span class="rvts21">When you map the virtual buttons to keyboard keys, make sure none of the emulator or Taseditor hotkeys are already assigned to those keys. The full list of default hotkeys can be found in the </span><a class="rvts27" href="Controls.html#hotkeys">Reference</a><span class="rvts21">.</span></p>
<p class="rvps10"><span class="rvts21">Some FCEUX hotkeys don't have default mapping (they're not mapped to any key yet). You can configure them the following way. In the emulator main menu choose </span><span class="rvts25">Config -&gt; Map Hotkeys</span><span class="rvts21">. A window listing all possible emulator hotkeys will appear. Choose the necessary hotkey, double-click it and then press the desired keyboard key.</span></p>
<p class="rvps10"><span class="rvts21">First of all, find the item called "</span><span class="rvts25">Open TAS Editor</span><span class="rvts21">" and double-click it. In the appeared window press the key that you will always use to quickly launch Taseditor.</span></p>
<p class="rvps10"><span class="rvts21">Second, find the item "</span><span class="rvts26">Reload ROM or TAS Editor Project</span><span class="rvts21">" and either remap it or remember the default combination (</span><span class="rvts26">Ctrl + F1</span><span class="rvts21">). This hotkey will help you quickly return to your interrupted work just launch FCEUX, press the </span><span class="rvts26">Reload ROM</span><span class="rvts21"> hotkey, then press the aforementioned </span><span class="rvts25">Open TAS Editor</span><span class="rvts21"> hotkey, and then again </span><span class="rvts26">Reload ROM</span><span class="rvts21"> (this time it will work as </span><span class="rvts26">Reload TAS Editor Project</span><span class="rvts21">). This way you'll return to the state of your paused work in a split second.</span></p>
<p class="rvps10"><span class="rvts21">Now look at the hotkeys "</span><span class="rvts26">Frame Advance</span><span class="rvts21">" и "</span><span class="rvts26">Frame Rewind</span><span class="rvts21">". They are used for Playback cursor navigation. By default they are mapped to "</span><span class="rvts26">\</span><span class="rvts21">" and "</span><span class="rvts26">Backspace</span><span class="rvts21">". You can reconfigure them to more handy keys or just use the mouse wheel for the Playback cursor frame-by-frame navigation.</span></p>
<p class="rvps10"><span class="rvts21">Also see the "</span><span class="rvts26">Speed Down</span><span class="rvts21">" and "</span><span class="rvts26">Speed Up</span><span class="rvts21">" hotkeys. You may consider remapping them to Numpad keys "</span><span class="rvts25">+</span><span class="rvts21">" and "</span><span class="rvts25">-</span><span class="rvts21">".</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts26">Pause</span><span class="rvts21">" и "</span><span class="rvts26">Restore Playback</span><span class="rvts21">" hotkeys are set to "</span><span class="rvts26">Pause/Break</span><span class="rvts21">" and "</span><span class="rvts26">Spacebar</span><span class="rvts21">" keys by default, but in most cases it's easier to use the middle mouse button instead of these hotkeys, so you can even reassign the "</span><span class="rvts26">Spacebar</span><span class="rvts21">" for something else if you wish.</span></p>
<p class="rvps10"><span class="rvts21">Finally, there is the "</span><span class="rvts26">Cancel Seeking</span><span class="rvts21">" hotkey ("</span><span class="rvts26">Esc</span><span class="rvts21">" key by default). Pressing it is the same as clicking the Taseditor progressbar if the Playback was seeking to a target frame, the seeking will be aborted.</span></p>
<p class="rvps10"><span class="rvts21">Some FCEUX hotkeys don't work when Taseditor is engaged. For example, the "</span><span class="rvts25">Open ROM</span><span class="rvts21">" won't work you have to load ROM before running Taseditor. This is done for </span><a class="rvts27" href="MistakeProofing.html#DisabledHotkeys">mistake-proofing</a><span class="rvts21">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21">The next chapter describes </span><a class="rvts27" href="AdvancedFeatures.html">additional features of Taseditor</a><span class="rvts21">. You may postpone reading it until you are used to main features. Anyway, now you're ready enough for productive work in Taseditor.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/create-epub-ebooks">Write EPub books for the iPad</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/help-authoring-tool">Free help authoring environment</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,129 +1,326 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>2. Program Interface</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>2. Program Interface</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="2. Program Interface">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="2. Program Interface" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("ProgramInterface"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>2. Program Interface</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="BeginnersGuide.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="Introduction.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="PianoRoll.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="ProgramInterface"
data-hnd-context="5"
data-hnd-title="2. Program Interface"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="BeginnersGuide.html" title="Beginner's Guide" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="Introduction.html" title="1. Introduction" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="PianoRoll.html" title="2.1. Piano Roll" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>2. Program Interface</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Program Interface</span></p> <p class="rvps2"><span class="rvts18">Program Interface</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts21">This chapter describes the program interface and ways of interacting with it.</span></p> <p class="rvps7"><span class="rvts20">This chapter describes the program interface and ways of interacting with it.</span></p>
<p class="rvps10"><span class="rvts21">The description uses many specific terms, so make sure you know the </span><a class="rvts32" href="Glossary.html">Glossary</a><span class="rvts21"> before starting the read. Also, it's advisable to run Taseditor right now, to be able to check everything you read in practice.</span></p> <p class="rvps7"><span class="rvts20">The description uses many specific terms, so make sure you know the </span><a class="rvts29" href="Glossary.html">Glossary</a><span class="rvts20"> before starting the read. Also, it's advisable to run Taseditor right now, to be able to check everything you read in practice.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">To enter Taseditor do the following:</span></p> <p class="rvps7"><span class="rvts20">To enter Taseditor do the following:</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ol style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps14"><span class="rvts21">launch FCEUX emulator</span></li> <li value="1" class="rvps9"><span class="rvts20">launch FCEUX emulator</span></li>
<li class="rvps14"><span class="rvts21">load any game ROM (File -&gt; Open ROM)</span></li> <li value="2" class="rvps9"><span class="rvts20">load any game ROM (File -&gt; Open ROM)</span></li>
<li class="rvps14"><span class="rvts21">open Taseditor window (Tools -&gt; TAS Editor)</span></li> <li value="3" class="rvps9"><span class="rvts20">open Taseditor window (Tools -&gt; TAS Editor)</span></li>
</ol> </ol>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When you engage Taseditor, the game is reset, and the emulator pauses. It shall stay paused as you TAS, to prevent the game from urging you on and distracting from analysis of information.</span></p> <p class="rvps7"><span class="rvts20">When you engage Taseditor, the game is reset, and the emulator pauses. It shall stay paused as you TAS, to prevent the game from urging you on and distracting from analysis of information.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps18"><img alt="" style="padding : 1px;" src="lib/Monitor-example.png"/></p> <p class="rvps3"><img alt="" style="padding : 1px;" src="lib/Monitor-example.png"></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">While TASing in Taseditor, a considerable part of the desktop is covered by the very Taseditor window. Emulator window is used for picture output, and you'd better scale it up to 2x size, so you won't miss a tiny detail even at a cursory glance. During your work you'll have to move eyes between emulator window and Taseditor window (mostly contents of the Piano Roll). So put those windows close to each other. The remaining space of the desktop can be populated with RAM Watch window, Lua console, etc.</span></p> <p class="rvps7"><span class="rvts20">While TASing in Taseditor, a considerable part of the desktop is covered by the very Taseditor window. Emulator window is used for picture output, and you'd better scale it up to 2x size, so you won't miss a tiny detail even at a cursory glance. During your work you'll have to move eyes between emulator window and Taseditor window (mostly contents of the Piano Roll). So put those windows close to each other. The remaining space of the desktop can be populated with RAM Watch window, Lua console, etc.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">You can adjust the size of TAS Editor window by dragging its edges with the mouse. The size and position are automatically saved and restored at next launch.</span></p> <p class="rvps7"><span class="rvts20">You can adjust the size of TAS Editor window by dragging its edges with the mouse. The size and position are automatically saved and restored at next launch.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The window caption displays the program name ("TAS Editor") and the name of current project. If there are any unsaved changes, an asterisk is added to the end of the text. Besides, when the Input Recording mode is on, the word "Recording" appears in the window caption.</span></p> <p class="rvps7"><span class="rvts20">The window caption displays the program name ("TAS Editor") and the name of current project. If there are any unsaved changes, an asterisk is added to the end of the text. Besides, when the Input Recording mode is on, the word "Recording" appears in the window caption.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The main menu of the program is similar to one found in text editors like Notepad.</span></p> <p class="rvps7"><span class="rvts20">The main menu of the program is similar to one found in text editors like Notepad.</span></p>
<p class="rvps10"><span class="rvts21">The </span><span class="rvts25">File</span><span class="rvts21"> item is responsible for all file operations creating a new TAS project, opening an existing file, saving, data importing and exporting. There's also a "Recent" sub-menu that stores direct paths to recently used projects.</span></p> <p class="rvps7"><span class="rvts20">The </span><span class="rvts22">File</span><span class="rvts20"> item is responsible for all file operations creating a new TAS project, opening an existing file, saving, data importing and exporting. There's also a "Recent" sub-menu that stores direct paths to recently used projects.</span></p>
<p class="rvps10"><span class="rvts21">The </span><span class="rvts25">Edit</span><span class="rvts21"> item contains functions that let you edit TAS movie like a simple text file or a table file. Most of those functions can be accessed through standard key combinations, such as </span><span class="rvts30">Ctrl + C</span><span class="rvts21">, </span><span class="rvts30">Ctrl + V</span><span class="rvts21"> and others. They will be reviewed later.</span></p> <p class="rvps7"><span class="rvts20">The </span><span class="rvts22">Edit</span><span class="rvts20"> item contains functions that let you edit TAS movie like a simple text file or a table file. Most of those functions can be accessed through standard key combinations, such as </span><span class="rvts27">Ctrl + C</span><span class="rvts20">, </span><span class="rvts27">Ctrl + V</span><span class="rvts20"> and others. They will be reviewed later.</span></p>
<p class="rvps10"><span class="rvts21">The </span><span class="rvts25">View</span><span class="rvts21"> item allows to adjust the program appearance. Besides, here you can open the "Find Note" window, used to search text in Marker Notes. All of that will be described later. Until you study the </span><a class="rvts33" href="ProgramCustomization.html">Chapter 5</a><span class="rvts21"> of this Guide, it's recommended to keep default preferences.</span></p> <p class="rvps7"><span class="rvts20">The </span><span class="rvts22">View</span><span class="rvts20"> item allows to adjust the program appearance. Besides, here you can open the "Find Note" window, used to search text in Marker Notes. All of that will be described later. Until you study the </span><a class="rvts30" href="ProgramCustomization.html">Chapter 5</a><span class="rvts20"> of this Guide, it's recommended to keep default preferences.</span></p>
<p class="rvps10"><span class="rvts21">The </span><span class="rvts25">Config</span><span class="rvts21"> item stores the rest settings, e.g. project auto-saving timer, the number of undo levels and other features that will be described during the learning flow. Don't change those settings for now.</span></p> <p class="rvps7"><span class="rvts20">The </span><span class="rvts22">Config</span><span class="rvts20"> item stores the rest settings, e.g. project auto-saving timer, the number of undo levels and other features that will be described during the learning flow. Don't change those settings for now.</span></p>
<p class="rvps10"><span class="rvts21">Finally, the </span><span class="rvts25">Help</span><span class="rvts21"> item contains the link to local copy of this Guide and the "About" window. Here you can also switch on/off hints (tooltips).</span></p> <p class="rvps7"><span class="rvts20">Finally, the </span><span class="rvts22">Help</span><span class="rvts20"> item contains the link to local copy of this Guide and the "About" window. Here you can also switch on/off hints (tooltips).</span></p>
<p class="rvps10"><span class="rvts21">To the right of the main menu there is the </span><span class="rvts25">Pattern</span><span class="rvts21"> item, displaying the name of current pattern. Patterns are just templates for speeding up the Input creation. They will be described in </span><a class="rvts31" href="AdvancedFeatures.html#UsingPatterns">Chapter 6</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">To the right of the main menu there is the </span><span class="rvts22">Pattern</span><span class="rvts20"> item, displaying the name of current pattern. Patterns are just templates for speeding up the Input creation. They will be described in </span><a class="rvts28" href="AdvancedFeatures.html#UsingPatterns">Chapter 6</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<div class="rvps10"><table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-width: 0px;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="0" cellpadding="0" cellspacing="0" style="border-width: 0px; border-spacing: 0px;">
<td style="width: 125px;"><p class="rvps2"><img alt="" style="padding : 1px;" src="lib/pianoroll.png"/></p> <tr valign="top">
</td> <td width="125" style="padding: 0px;">
<td style="width: 797px;"><div class="rvps10"><table width="100%" border="0" cellpadding="10" cellspacing="0" style="border-width: 0px;"> <p class="rvps2"><img alt="" style="padding : 1px;" src="lib/pianoroll.png"></p>
<tr valign="top"> </td>
<td><p class="rvps10"><span class="rvts21">Contents of the TAS Editor window can be divided into 2 parts the workspace (Piano Roll) to the left and the Toolbox to the right.</span></p> <td width="797" style="padding: 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <div class="rvps7">
<p class="rvps17"><a class="rvts23" href="PianoRoll.html">Proceed to the Piano Roll description</a></p> <table width="100%" border="0" cellpadding="10" cellspacing="0" style="border-width: 0px; border-spacing: 0px;">
<p class="rvps2"><span class="rvts6"><br/></span></p> <tr valign="top">
<p class="rvps2"><span class="rvts6"><br/></span></p> <td style="padding: 10px;">
</td> <p class="rvps7"><span class="rvts20">Contents of the TAS Editor window can be divided into 2 parts the workspace (Piano Roll) to the left and the Toolbox to the right.</span></p>
</tr> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps11"><a class="rvts11" href="PianoRoll.html">Proceed to the Piano Roll description</a></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
</td>
</tr>
</table>
</div>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts6"><br/></span></p>
</td>
<td width="67" style="padding: 0px;">
<p class="rvps12"><img alt="" style="padding : 1px;" src="lib/toolbox.png"></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts6"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
</td> <p class="rvps7"><span class="rvts20"><br/></span></p>
<td style="width: 67px;"><p class="rvps19"><img alt="" style="padding : 1px;" src="lib/toolbox.png"/></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
</td>
</tr>
</table>
</div>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com">Free PDF documentation generator</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/feature-tour/create-help-files-for-the-qt-help-framework">Create help files for the Qt Help Framework</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,95 +1,290 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>Reference</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>Reference</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="Reference">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="Reference" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("Reference"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>Reference</h1>
</div>
<div id="topic_header_nav">
<a href="AdvancedFeatures.html"><img src="img/arrow_left.png" alt="Previous"/></a>
<a href="Glossary.html"><img src="img/arrow_right.png" alt="Next"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
</div> <header class="headroom">
<div class="clear"></div> <button class="hnd-toggle btn btn-default">
</div> <span class="sr-only">Toggle navigation</span>
<div id="topic_content"> <span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</header>
<nav id="panel-left" class="md-nav-expanded">
<!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="Reference"
data-hnd-context="2"
data-hnd-title="Reference"
>
<div class="navigation">
<ol class="breadcrumb">
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="AdvancedFeatures.html" title="6. Advanced Features" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="Glossary.html" title="Glossary" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Reference</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Reference</span></p> <p class="rvps2"><span class="rvts18">Reference</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><a class="rvts23" href="Glossary.html">Glossary</a></p> <p class="rvps7"><a class="rvts11" href="Glossary.html">Glossary</a></p>
<p class="rvps12"><span class="rvts24">Terms that are used throughout this documentation</span></p> <p class="rvps8"><span class="rvts20">Terms that are used throughout this documentation</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts23" href="Controls.html">Controls</a></p> <p class="rvps7"><a class="rvts11" href="Controls.html">Controls</a></p>
<p class="rvps12"><span class="rvts24">Exhaustive review of controls</span></p> <p class="rvps8"><span class="rvts20">Exhaustive review of controls</span></p>
<p class="rvps10"><a class="rvts23" href="Navigation.html"><br/></a></p> <p class="rvps7"><a class="rvts11" href="Navigation.html"><br/></a></p>
<p class="rvps10"><a class="rvts23" href="Navigation.html">Navigation</a></p> <p class="rvps7"><a class="rvts11" href="Navigation.html">Navigation</a></p>
<p class="rvps12"><span class="rvts24">The summary of all ways to navigate a movie</span></p> <p class="rvps8"><span class="rvts20">The summary of all ways to navigate a movie</span></p>
<p class="rvps10"><a class="rvts23" href="Operations.html"><br/></a></p> <p class="rvps7"><a class="rvts11" href="Operations.html"><br/></a></p>
<p class="rvps10"><a class="rvts23" href="Operations.html">Operations</a></p> <p class="rvps7"><a class="rvts11" href="Operations.html">Operations</a></p>
<p class="rvps12"><span class="rvts24">The list and mini-reviews of all possible operations with a movie</span></p> <p class="rvps8"><span class="rvts20">The list and mini-reviews of all possible operations with a movie</span></p>
<p class="rvps10"><a class="rvts23" href="LuaAPI.html"><br/></a></p> <p class="rvps7"><a class="rvts11" href="LuaAPI.html"><br/></a></p>
<p class="rvps10"><a class="rvts23" href="LuaAPI.html">Lua API</a></p> <p class="rvps7"><a class="rvts11" href="LuaAPI.html">Lua API</a></p>
<p class="rvps12"><span class="rvts24">Specifications of </span><span class="rvts24">"taseditor" library of Lua functions</span></p> <p class="rvps8"><span class="rvts20">Specifications of </span><span class="rvts20">"taseditor" library of Lua functions</span></p>
<p class="rvps10"><span class="rvts23"><br/></span></p> <p class="rvps7"><span class="rvts11"><br/></span></p>
<p class="rvps10"><a class="rvts23" href="FAQ.html">FAQ</a></p> <p class="rvps7"><a class="rvts11" href="FAQ.html">FAQ</a></p>
<p class="rvps12"><span class="rvts24">Answers to some expected questions</span></p> <p class="rvps8"><span class="rvts20">Answers to some expected questions</span></p>
<p class="rvps10"><span class="rvts23"><br/></span></p> <p class="rvps7"><span class="rvts11"><br/></span></p>
<p class="rvps10"><a class="rvts23" href="SpeedrunningSynopsis.html">Speedrunning synopsis</a></p> <p class="rvps7"><a class="rvts11" href="SpeedrunningSynopsis.html">Speedrunning synopsis</a></p>
<p class="rvps12"><span class="rvts24">Abstract classification of typical issues arising when optimizing a segment for fastest time</span></p> <p class="rvps8"><span class="rvts20">Abstract classification of typical issues arising when optimizing a segment for fastest time</span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Write eBooks for the Kindle</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Generate Kindle eBooks with ease</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,168 +1,359 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>4.3. Semiautomatic TASing</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>4.3. Semiautomatic TASing</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="4.3. Semiautomatic TASing">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="4.3. Semiautomatic TASing" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("SemiautomaticTASing"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>4.3. Semiautomatic TASing</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; <a href="TASingMethodology.html">4. TASing Methodology</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="TASingMethodology.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="NonlinearTASing.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="ProgramCustomization.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="SemiautomaticTASing"
data-hnd-context="12"
data-hnd-title="4.3. Semiautomatic TASing"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li><li><a href="TASingMethodology.html">4. TASing Methodology</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="TASingMethodology.html" title="4. TASing Methodology" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="NonlinearTASing.html" title="4.2. Nonlinear TASing" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="ProgramCustomization.html" title="5. Program customization" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>4.3. Semiautomatic TASing</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Semiautomatic TASing</span></p> <p class="rvps2"><span class="rvts18">Semiautomatic TASing</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-method3.png"/></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-method3.png"></p>
<p class="rvps10"><span class="rvts21">This method further develops the ideas of the nonlinear TASing method.</span></p> <p class="rvps7"><span class="rvts20">This method further develops the ideas of the nonlinear TASing method.</span></p>
<p class="rvps10"><span class="rvts21">In many cases TASer needs to see the result of the Input modification immediately. Ideally, he should realize all the consequences of his decision right at the moment of making the decision. But in reality he has to spend precious time on inputting the decision and navigating with the Playback cursor to the end of the segment.</span></p> <p class="rvps7"><span class="rvts20">In many cases TASer needs to see the result of the Input modification immediately. Ideally, he should realize all the consequences of his decision right at the moment of making the decision. But in reality he has to spend precious time on inputting the decision and navigating with the Playback cursor to the end of the segment.</span></p>
<p class="rvps10"><span class="rvts21">In these cases you can leave the Playback navigation to Taseditor and just focus on editing. Taseditor will immediately react on any Input modification and display the new result.by bringing the Playback cursor to the end of the current segment.</span></p> <p class="rvps7"><span class="rvts20">In these cases you can leave the Playback navigation to Taseditor and just focus on editing. Taseditor will immediately react on any Input modification and display the new result.by bringing the Playback cursor to the end of the current segment.</span></p>
<p class="rvps10"><span class="rvts21">When you feel the influence of every click, you build very high level of interconnection between TASer and the game. In such close interaction both TASer controls the game and the game urges TASer's actions into right direction. Of course, such high level of interdependency is not always useful, because it narrows your spectrum of thoughts, not allowing to look down on the game and apply a logic from different games and other fields of life.</span></p> <p class="rvps7"><span class="rvts20">When you feel the influence of every click, you build very high level of interconnection between TASer and the game. In such close interaction both TASer controls the game and the game urges TASer's actions into right direction. Of course, such high level of interdependency is not always useful, because it narrows your spectrum of thoughts, not allowing to look down on the game and apply a logic from different games and other fields of life.</span></p>
<p class="rvps10"><span class="rvts21">However, when the current segment is simple and all optimality factors are already known (and you only need to find the perfect combination of them), it's useful to abstract from everything else and devote full attention to going over the possible options. This way you can test a lot of approaches before you become bored with the current segment.</span></p> <p class="rvps7"><span class="rvts20">However, when the current segment is simple and all optimality factors are already known (and you only need to find the perfect combination of them), it's useful to abstract from everything else and devote full attention to going over the possible options. This way you can test a lot of approaches before you become bored with the current segment.</span></p>
<p class="rvps10"><span class="rvts21">The Recording mode should be off. The </span><span class="rvts21">"Auto-restore last position" checkbox should be on. </span><span class="rvts21">The "Turbo seek" and "Follow cursor" checkboxes are usually disabled, but may be enabled when necessary.</span></p> <p class="rvps7"><span class="rvts20">The Recording mode should be off. The </span><span class="rvts20">"Auto-restore last position" checkbox should be on. </span><span class="rvts20">The "Turbo seek" and "Follow cursor" checkboxes are usually disabled, but may be enabled when necessary.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">General activity:</span></p> <p class="rvps7"><span class="rvts21">General activity:</span></p>
<p class="rvps10"><span class="rvts48"><br/></span></p> <p class="rvps7"><span class="rvts22"><br/></span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ol style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10"><span class="rvts21">Scroll the Piano Roll to the beginning of the edited segment, put the Playback cursor here, define the goal.</span></li> <li value="1" class="rvps7"><span class="rvts20">Scroll the Piano Roll to the beginning of the edited segment, put the Playback cursor here, define the goal.</span></li>
<li class="rvps10"><span class="rvts21">Detect the end of the segment and leave the Playback cursor there.</span></li> <li value="2" class="rvps7"><span class="rvts20">Detect the end of the segment and leave the Playback cursor there.</span></li>
<li class="rvps10"><span class="rvts21">Suppose there's a mistake in the segment, weigh known factors of optimality and figure out the way to fix the mistake.</span></li> <li value="3" class="rvps7"><span class="rvts20">Suppose there's a mistake in the segment, weigh known factors of optimality and figure out the way to fix the mistake.</span></li>
<li class="rvps10"><span class="rvts21">The mouse cursor navigation to any frame of the current segment is practically instant.</span></li> <li value="4" class="rvps7"><span class="rvts20">The mouse cursor navigation to any frame of the current segment is practically instant.</span></li>
<li class="rvps10"><span class="rvts21">Edit the segment with the mouse. After every Input modification the Playback cursor will automatically replay the segment and stop at the frame that was considered to be the end of the segment. If necessary, you can shift the end of the segment by moving the Playback cursor manually (e.g. using the mouse wheel). The steps 4 and 5 are constantly alternating until you consider the editing complete, according to the optimality criterion.</span></li> <li value="5" class="rvps7"><span class="rvts20">Edit the segment with the mouse. After every Input modification the Playback cursor will automatically replay the segment and stop at the frame that was considered to be the end of the segment. If necessary, you can shift the end of the segment by moving the Playback cursor manually (e.g. using the mouse wheel). The steps 4 and 5 are constantly alternating until you consider the editing complete, according to the optimality criterion.</span></li>
<li class="rvps10"><span class="rvts21">[</span><span class="rvts34">optional step</span><span class="rvts21">] Save the finished approach to any free Bookmark, e.g. to slot </span><span class="rvts26">8</span><span class="rvts21"> or </span><span class="rvts26">7</span><span class="rvts21">.</span></li> <li value="6" class="rvps7"><span class="rvts20">[</span><span class="rvts31">optional step</span><span class="rvts20">] Save the finished approach to any free Bookmark, e.g. to slot </span><span class="rvts23">8</span><span class="rvts20"> or </span><span class="rvts23">7</span><span class="rvts20">.</span></li>
<li class="rvps10"><span class="rvts21">If this isn't the first approach to the segment, compare the new result to the best old result, using the optimality criterion. If the new approach is better (or it's the first approach), save the result to the Bookmark </span><span class="rvts26">9</span><span class="rvts21">. The slot </span><span class="rvts26">9</span><span class="rvts21"> will be used for keeping the best result of polishing the segment.</span></li> <li value="7" class="rvps7"><span class="rvts20">If this isn't the first approach to the segment, compare the new result to the best old result, using the optimality criterion. If the new approach is better (or it's the first approach), save the result to the Bookmark </span><span class="rvts23">9</span><span class="rvts20">. The slot </span><span class="rvts23">9</span><span class="rvts20"> will be used for keeping the best result of polishing the segment.</span></li>
<li class="rvps10"><span class="rvts21">If you still want to try different series of approaches, return to step 3, until you run out of ideas.</span></li> <li value="8" class="rvps7"><span class="rvts20">If you still want to try different series of approaches, return to step 3, until you run out of ideas.</span></li>
<li class="rvps10"><span class="rvts21">[</span><span class="rvts34">optional step</span><span class="rvts21">] If you need more ideas, you can get some information from the past or the future by moving the Playback cursor to different segments of the movie or unpausing the emulator. When necessary, you can quickly draw a rough Input for watching the upcoming events of the game. But when returning to the segment modification you have to return the Playback cursor to the frame of the target event.</span></li> <li value="9" class="rvps7"><span class="rvts20">[</span><span class="rvts31">optional step</span><span class="rvts20">] If you need more ideas, you can get some information from the past or the future by moving the Playback cursor to different segments of the movie or unpausing the emulator. When necessary, you can quickly draw a rough Input for watching the upcoming events of the game. But when returning to the segment modification you have to return the Playback cursor to the frame of the target event.</span></li>
<li class="rvps10"><span class="rvts21">When there's no more ideas, restore the best approach from the History Log or the Bookmark </span><span class="rvts26">9</span><span class="rvts21"> into the current movie and proceed to the next segment.</span></li> <li value="10" class="rvps7"><span class="rvts20">When there's no more ideas, restore the best approach from the History Log or the Bookmark </span><span class="rvts23">9</span><span class="rvts20"> into the current movie and proceed to the next segment.</span></li>
</ol> </ol>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The main difference between this and previous method is that here the Playback cursor is generally located at the end of the current segment, and not at the beginning. Every time the Greenzone truncates, the Playback cursor seeks to the end of the segment, or rather to the frame where the segment end was before you modified the Input. If the Input modification also changed the frame of the target event, you can additionally move the light-blue cursor by mouse wheel if needed. But often there's no need for precise positioning, because you may only need to know the sequence of events occurring in the segment due to the Input modification.</span></p> <p class="rvps7"><span class="rvts20">The main difference between this and previous method is that here the Playback cursor is generally located at the end of the current segment, and not at the beginning. Every time the Greenzone truncates, the Playback cursor seeks to the end of the segment, or rather to the frame where the segment end was before you modified the Input. If the Input modification also changed the frame of the target event, you can additionally move the light-blue cursor by mouse wheel if needed. But often there's no need for precise positioning, because you may only need to know the sequence of events occurring in the segment due to the Input modification.</span></p>
<p class="rvps10"><span class="rvts21">The replay of the current segment is automatically launched after every interim step of the Input modifications, even when you haven't finished the thought yet and are not ready to compare the current result to the result of the previous approach. Fortunately, when TASer is carried away by the editing process, he doesn't look at FCEUX screen and only clicks the Piano Roll, until his idea is implemented in the form of a full-fledged button combination. And when the Input is starting to become interesting, TASer pays attention to the emulator screen or the Memory Watch window.</span></p> <p class="rvps7"><span class="rvts20">The replay of the current segment is automatically launched after every interim step of the Input modifications, even when you haven't finished the thought yet and are not ready to compare the current result to the result of the previous approach. Fortunately, when TASer is carried away by the editing process, he doesn't look at FCEUX screen and only clicks the Piano Roll, until his idea is implemented in the form of a full-fledged button combination. And when the Input is starting to become interesting, TASer pays attention to the emulator screen or the Memory Watch window.</span></p>
<p class="rvps10"><span class="rvts21">For example, when you need to create a jump over a pit, you first draw a long row of the </span><span class="rvts29">R</span><span class="rvts21"> button presses, and you don't care that at the same time the FCEUX screen displays how Mario runs and falls into the pit. You just draw some </span><span class="rvts29">A</span><span class="rvts21"> buttonpresses, then look at the emulator window and erase or draw additional </span><span class="rvts29">A</span><span class="rvts21"> buttonpresses, thus changing the beginning and the duration of the jump while watching the trajectory of Mario sprite.</span></p> <p class="rvps7"><span class="rvts20">For example, when you need to create a jump over a pit, you first draw a long row of the </span><span class="rvts26">R</span><span class="rvts20"> button presses, and you don't care that at the same time the FCEUX screen displays how Mario runs and falls into the pit. You just draw some </span><span class="rvts26">A</span><span class="rvts20"> buttonpresses, then look at the emulator window and erase or draw additional </span><span class="rvts26">A</span><span class="rvts20"> buttonpresses, thus changing the beginning and the duration of the jump while watching the trajectory of Mario sprite.</span></p>
<p class="rvps10"><span class="rvts21">So, the process of polishing the Input in this method is a simultaneous editing and watching the segment. TASer gets in close informational contact with the game and soon starts to think synchronously with its responses. The game starts to help you filter and accept decisions. As a result, you may lose impartiality of your mind and stick to obvious decisions encouraged by the game. That's why you shouldn't use this method all the time, it's recommended to alternate it with the previous one.</span></p> <p class="rvps7"><span class="rvts20">So, the process of polishing the Input in this method is a simultaneous editing and watching the segment. TASer gets in close informational contact with the game and soon starts to think synchronously with its responses. The game starts to help you filter and accept decisions. As a result, you may lose impartiality of your mind and stick to obvious decisions encouraged by the game. That's why you shouldn't use this method all the time, it's recommended to alternate it with the previous one.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Like with the simple nonlinear method, you can change the speed of emulation and get different variations of the semiautomatic method:</span></p> <p class="rvps7"><span class="rvts20">Like with the simple nonlinear method, you can change the speed of emulation and get different variations of the semiautomatic method:</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ol style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10"><span class="rvts21">editing and watching the changes in real time</span></li> <li value="1" class="rvps7"><span class="rvts20">editing and watching the changes in real time</span></li>
<li class="rvps10"><span class="rvts21">editing and watching the changes in slow motion</span></li> <li value="2" class="rvps7"><span class="rvts20">editing and watching the changes in slow motion</span></li>
<li class="rvps10"><span class="rvts21">editing and instantly seeing the final result (turbo)</span></li> <li value="3" class="rvps7"><span class="rvts20">editing and instantly seeing the final result (turbo)</span></li>
</ol> </ol>
<p class="rvps10"><a name="turbo-seeking"></a> <p class="rvps7"><a name="turbo-seeking"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Turbo-seeking creates an association between two distant events (the beginning and the end of the segment). Here the association is even more efficient, because there's even less intermediaries the seeking starts before you even release the mouse button when drawing the Input. So you see the distant result almost at the same time you change the decisive Input, even if the game normally only shows the result in a several seconds.</span></p>
<p class="rvps10"><span class="rvts21">Turbo-seeking creates an association between two distant events (the beginning and the end of the segment). Here the association is even more efficient, because there's even less intermediaries the seeking starts before you even release the mouse button when drawing the Input. So you see the distant result almost at the same time you change the decisive Input, even if the game normally only shows the result in a several seconds.</span></p> <p class="rvps7"><a name="LuckManipulation"></a><span class="rvts20">A good example would be the process of searching for the first possible frame of pressing the </span><span class="rvts26">Start</span><span class="rvts20"> button. Some games actually allow to press the button before there's even any graphics on screen. Besides, after the </span><span class="rvts26">Start</span><span class="rvts20"> button is activated, games often meditate for some time, not giving you any information if the button worked or not. Only after a second or two you can see the changes in the scenery, thus learning the buttonpress was successful.</span></p>
<p class="rvps10"><a name="LuckManipulation"></a> <p class="rvps7"><span class="rvts20">In the traditional method of TASing you would need to spend 5-10 minutes on examination of approaches (searching for the very first frame), but the semiautomatic method allows to go over all the approaches much faster:</span></p>
<span class="rvts21">A good example would be the process of searching for the first possible frame of pressing the </span><span class="rvts29">Start</span><span class="rvts21"> button. Some games actually allow to press the button before there's even any graphics on screen. Besides, after the </span><span class="rvts29">Start</span><span class="rvts21"> button is activated, games often meditate for some time, not giving you any information if the button worked or not. Only after a second or two you can see the changes in the scenery, thus learning the buttonpress was successful.</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<p class="rvps10"><span class="rvts21">In the traditional method of TASing you would need to spend 5-10 minutes on examination of approaches (searching for the very first frame), but the semiautomatic method allows to go over all the approaches much faster:</span></p> <li class="rvps7"><span class="rvts20">Switch on the </span><span class="rvts20">"Auto-restore last position" and </span><span class="rvts20">"Turbo seek" checkboxes. Switch off the </span><span class="rvts20">"Follow cursor" checkbox.</span></li>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;">
<li class="rvps10"><span class="rvts21">Switch on the </span><span class="rvts21">"Auto-restore last position" and </span><span class="rvts21">"Turbo seek" checkboxes. Switch off the </span><span class="rvts21">"Follow cursor" checkbox.</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">Set a trial </span><span class="rvts29">Start</span><span class="rvts21"> button press at the frame where it definitely works, e.g. at the frame 100.</span></li> <li class="rvps7"><span class="rvts20">Set a trial </span><span class="rvts26">Start</span><span class="rvts20"> button press at the frame where it definitely works, e.g. at the frame 100.</span></li>
</ul> </ul>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">Watch the game up to the frame where you can already tell by the picture that the </span><span class="rvts29">Start</span><span class="rvts21"> was successful (e.g. the screen changed to "World 1-1" text). For example, it's the frame 150. Leave the Playback cursor at this frame this will be the end of the segment.</span></li> <li class="rvps7"><span class="rvts20">Watch the game up to the frame where you can already tell by the picture that the </span><span class="rvts26">Start</span><span class="rvts20"> was successful (e.g. the screen changed to "World 1-1" text). For example, it's the frame 150. Leave the Playback cursor at this frame this will be the end of the segment.</span></li>
<li class="rvps10"><span class="rvts21">Now remove the trial buttonpress (the FCEUX window will flash and the "World 1-1" will disappear, leaving only the title screen, since there's no more </span><span class="rvts29">Start</span><span class="rvts21"> button press).</span></li> <li class="rvps7"><span class="rvts20">Now remove the trial buttonpress (the FCEUX window will flash and the "World 1-1" will disappear, leaving only the title screen, since there's no more </span><span class="rvts26">Start</span><span class="rvts20"> button press).</span></li>
<li class="rvps10"><span class="rvts21">Set the </span><span class="rvts29">Start </span><span class="rvts21">buttonpress to the beginning of the segment, which is the place where you know it's too early for the buttonpress to be registered. For example, set it to the first frame of the movie. The image in the FCEUX window will flash but then still show the title screen, because the </span><span class="rvts29">Start</span><span class="rvts21"> didn't work.</span></li> <li class="rvps7"><span class="rvts20">Set the </span><span class="rvts26">Start </span><span class="rvts20">buttonpress to the beginning of the segment, which is the place where you know it's too early for the buttonpress to be registered. For example, set it to the first frame of the movie. The image in the FCEUX window will flash but then still show the title screen, because the </span><span class="rvts26">Start</span><span class="rvts20"> didn't work.</span></li>
<li class="rvps10"><span class="rvts21">Hold </span><span class="rvts30">Ctrl + Shift</span><span class="rvts21"> by one hand and begin pressing </span><span class="rvts30">Insert</span><span class="rvts21"> key once per a second or so (that really depends on your computer performance). After every </span><span class="rvts30">Ctrl + Shift + Insert</span><span class="rvts21"> combination the </span><span class="rvts29">Start</span><span class="rvts21"> buttonpress moves one frame forward, and the FCEUX window shows you if the buttonpress changed the state of the game at frame 150 or not.</span></li> <li class="rvps7"><span class="rvts20">Hold </span><span class="rvts27">Ctrl + Shift</span><span class="rvts20"> by one hand and begin pressing </span><span class="rvts27">Insert</span><span class="rvts20"> key once per a second or so (that really depends on your computer performance). After every </span><span class="rvts27">Ctrl + Shift + Insert</span><span class="rvts20"> combination the </span><span class="rvts26">Start</span><span class="rvts20"> buttonpress moves one frame forward, and the FCEUX window shows you if the buttonpress changed the state of the game at frame 150 or not.</span></li>
<li class="rvps10"><span class="rvts21">Until the </span><span class="rvts29">Start</span><span class="rvts21"> doesn't reach the moment when the game is ready to accept the Input, the FCEUX window will show you the title screen. But when another press of </span><span class="rvts30">Ctrl + Shift + Insert</span><span class="rvts21"> moves the </span><span class="rvts29">Start</span><span class="rvts21"> to a suitable frame, the emulator will display the "</span><span class="rvts21">World 1-1" screen.</span></li> <li class="rvps7"><span class="rvts20">Until the </span><span class="rvts26">Start</span><span class="rvts20"> doesn't reach the moment when the game is ready to accept the Input, the FCEUX window will show you the title screen. But when another press of </span><span class="rvts27">Ctrl + Shift + Insert</span><span class="rvts20"> moves the </span><span class="rvts26">Start</span><span class="rvts20"> to a suitable frame, the emulator will display the "</span><span class="rvts20">World 1-1" screen.</span></li>
<li class="rvps10"><span class="rvts21">This way you've found the very first frame to press the </span><span class="rvts29">Start</span><span class="rvts21"> button. Most likely the frame number will be much less than 100.</span></li> <li class="rvps7"><span class="rvts20">This way you've found the very first frame to press the </span><span class="rvts26">Start</span><span class="rvts20"> button. Most likely the frame number will be much less than 100.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">In the same way you can search for an optimal duration of holding the </span><span class="rvts29">A</span><span class="rvts21"> button, trying to land at certain point. Also consider using this method for quick luck manipulation in many games. The automatic turbo-seeking works best when you deal with a single factor of optimality and need to quickly test a hundred of similar approaches.</span></p> <p class="rvps7"><span class="rvts20">In the same way you can search for an optimal duration of holding the </span><span class="rvts26">A</span><span class="rvts20"> button, trying to land at certain point. Also consider using this method for quick luck manipulation in many games. The automatic turbo-seeking works best when you deal with a single factor of optimality and need to quickly test a hundred of similar approaches.</span></p>
<p class="rvps10"><span class="rvts21">In general, the semiautomatic method induces you to think less and experiment more. Sure, many videogames allow this way of solving tasks, but TASing requires more from you, so try not to take a fancy to the comfort of this method.</span></p> <p class="rvps7"><span class="rvts20">In general, the semiautomatic method induces you to think less and experiment more. Sure, many videogames allow this way of solving tasks, but TASing requires more from you, so try not to take a fancy to the comfort of this method.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Pros of the method:</span></p> <p class="rvps7"><span class="rvts20">Pros of the method:</span></p>
<p class="rvps14"><span class="rvts22">+ </span><span class="rvts21">Instant navigation and high</span><span class="rvts21"> speed of the working process incites to conduct more tests.</span></p> <p class="rvps9"><span class="rvts21">+ </span><span class="rvts20">Instant navigation and high</span><span class="rvts20"> speed of the working process incites to conduct more tests.</span></p>
<p class="rvps14"><span class="rvts22">+ </span><span class="rvts21">Constant feedback allows to adapt to the game while editing the Input, adjust your decisions and discard incorrect approaches prematurely.</span></p> <p class="rvps9"><span class="rvts21">+ </span><span class="rvts20">Constant feedback allows to adapt to the game while editing the Input, adjust your decisions and discard incorrect approaches prematurely.</span></p>
<p class="rvps14"><span class="rvts22">+ </span><span class="rvts21">Possibility to skip useless scenes.</span></p> <p class="rvps9"><span class="rvts21">+ </span><span class="rvts20">Possibility to skip useless scenes.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Cons of the method:</span></p> <p class="rvps7"><span class="rvts20">Cons of the method:</span></p>
<p class="rvps14"><span class="rvts22"> </span><span class="rvts21">The insistent game feedback provokes TASer to discard some illogical but potentially advantageous approaches.</span></p> <p class="rvps9"><span class="rvts21"> </span><span class="rvts20">The insistent game feedback provokes TASer to discard some illogical but potentially advantageous approaches.</span></p>
<p class="rvps14"><span class="rvts22"> </span><span class="rvts21">Emphasis on the mouse controls.</span></p> <p class="rvps9"><span class="rvts21"> </span><span class="rvts20">Emphasis on the mouse controls.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">When the method is recommended to use:</span><span class="rvts21"> when you need to polish the segment already knowing all of its optimality factors. E.g. for quick resyncing of the old Input this method is better than previous. Also it may be better for making an initial playthrough of a segment.</span></p> <p class="rvps7"><span class="rvts22">When the method is recommended to use:</span><span class="rvts20"> when you need to polish the segment already knowing all of its optimality factors. E.g. for quick resyncing of the old Input this method is better than previous. Also it may be better for making an initial playthrough of a segment.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Now that you know the main principles of working in Taseditor, you can begin TASing your game of interest. Practice is the best teacher, so you'll only learn all intricacies of the activity by engaging in a real development of your own TAS.</span></p> <p class="rvps7"><span class="rvts20">Now that you know the main principles of working in Taseditor, you can begin TASing your game of interest. Practice is the best teacher, so you'll only learn all intricacies of the activity by engaging in a real development of your own TAS.</span></p>
<p class="rvps10"><span class="rvts21">After several weeks of practical TASing it's recommended to reread the 3rd and 4th chapters of this Guide, in order to understand the text on a deeper level.</span></p> <p class="rvps7"><span class="rvts20">After several weeks of practical TASing it's recommended to reread the 3rd and 4th chapters of this Guide, in order to understand the text on a deeper level.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">In the next chapter: </span><a class="rvts27" href="ProgramCustomization.html">tweaking the program</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">In the next chapter: </span><a class="rvts24" href="ProgramCustomization.html">tweaking the program</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<td style="border-color: #000000; border-style: solid;"><p class="rvps10"><span class="rvts25">PRACTICE: </span><span class="rvts21">Thoroughly polish the Input in the segments of your test movie. If the initial dividing appears to be wrong just redo it on the fly.</span></p> <tr valign="top">
<p class="rvps10"><span class="rvts21">Use only the 2nd and the 3rd method of TASing, because traditional method is obsolete. Also try using turbo when suitable.</span></p> <td style="border-color: #000000; border-style: solid; padding: 6px;">
<p class="rvps10"><span class="rvts25">Estimated time: </span><span class="rvts21">30-60 minutes.</span></p> <p class="rvps7"><span class="rvts22">PRACTICE: </span><span class="rvts20">Thoroughly polish the Input in the segments of your test movie. If the initial dividing appears to be wrong just redo it on the fly.</span></p>
</td> <p class="rvps7"><span class="rvts20">Use only the 2nd and the 3rd method of TASing, because traditional method is obsolete. Also try using turbo when suitable.</span></p>
</tr> <p class="rvps7"><span class="rvts22">Estimated time: </span><span class="rvts20">30-60 minutes.</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/feature-tour/create-ebooks-for-amazon-kindle">Produce Kindle eBooks easily</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/help-authoring-tool">Free help authoring environment</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,167 +1,347 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>Speedrunning synopsis</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>Speedrunning synopsis</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="Speedrunning synopsis">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="Speedrunning synopsis" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("SpeedrunningSynopsis"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>Speedrunning synopsis</h1>
<div id="topic_breadcrumb">
<a href="Reference.html">Reference</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="Reference.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="FAQ.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="TASEditorInside.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="SpeedrunningSynopsis"
data-hnd-context="21"
data-hnd-title="Speedrunning synopsis"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="Reference.html">Reference</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="Reference.html" title="Reference" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="FAQ.html" title="FAQ" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="TASEditorInside.html" title="TAS Editor Inside" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Speedrunning synopsis</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Speedrunning synopsis</span></p> <p class="rvps2"><span class="rvts18">Speedrunning synopsis</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts21">Thanks to having a definite goal, creating tool-assisted speedruns is the easiest application of TASing, and all relevant techniques are examined pretty well. Here you can find the summary of generic tasks emerging in the process of polishing the Input for a speedrun. Before reading this, make sure you've learned the materials in </span><a class="rvts27" href="TASingProcess.html">TASing Process</a><span class="rvts21"> and </span><a class="rvts27" href="TASingMethodology.html">TASing Methodology</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Thanks to having a definite goal, creating tool-assisted speedruns is the easiest application of TASing, and all relevant techniques are examined pretty well. Here you can find the summary of generic tasks emerging in the process of polishing the Input for a speedrun. Before reading this, make sure you've learned the materials in </span><a class="rvts24" href="TASingProcess.html">TASing Process</a><span class="rvts20"> and </span><a class="rvts24" href="TASingMethodology.html">TASing Methodology</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Speedrunners have to search for the shortest way of completing every segment of the game. This process of searching consists of testing a multitude of approaches for playing the segment and finally choosing the best approach. Here we will discuss only the problem of choice.</span></p> <p class="rvps7"><span class="rvts20">Speedrunners have to search for the shortest way of completing every segment of the game. This process of searching consists of testing a multitude of approaches for playing the segment and finally choosing the best approach. Here we will discuss only the problem of choice.</span></p>
<p class="rvps10"><span class="rvts21">To simplify the problem, TASers usually compare only two approaches: the </span><span class="rvts25">new working</span><span class="rvts21"> approach and the </span><span class="rvts25">old best</span><span class="rvts21"> approach; all other old approaches are promptly forgotten (although the interesting ones can always be saved in the Bookmarks).</span></p> <p class="rvps7"><span class="rvts20">To simplify the problem, TASers usually compare only two approaches: the </span><span class="rvts22">new working</span><span class="rvts20"> approach and the </span><span class="rvts22">old best</span><span class="rvts20"> approach; all other old approaches are promptly forgotten (although the interesting ones can always be saved in the Bookmarks).</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The best of all old (previously tested) approaches can be stored:</span></p> <p class="rvps7"><span class="rvts20">The best of all old (previously tested) approaches can be stored:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">in Bookmarks recommended</span></li> <li class="rvps7"><span class="rvts20">in Bookmarks recommended</span></li>
<li class="rvps10"><span class="rvts21">in the History Log automatically but temporary</span></li> <li class="rvps7"><span class="rvts20">in the History Log automatically but temporary</span></li>
<li class="rvps10"><span class="rvts21">in TASer's own memory not recommended</span></li> <li class="rvps7"><span class="rvts20">in TASer's own memory not recommended</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When the new working approach is considered to be better (more optimal) than the old best approach, it's naturally assumed that it's also better than any of the old approaches, so this working approach instantly becomes the best. In the case of using Bookmarks you should re-save the new approach to the slot where the old best approach was stored. At the end of the search the contents of this Bookmark slot are loaded into the final movie.</span></p> <p class="rvps7"><span class="rvts20">When the new working approach is considered to be better (more optimal) than the old best approach, it's naturally assumed that it's also better than any of the old approaches, so this working approach instantly becomes the best. In the case of using Bookmarks you should re-save the new approach to the slot where the old best approach was stored. At the end of the search the contents of this Bookmark slot are loaded into the final movie.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Optimality criteria in speedruns:</span></p> <p class="rvps7"><span class="rvts20">Optimality criteria in speedruns:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts21">presence/absence of the specific event in the new and old approach </span><span class="rvts70">(bool)</span></li> <li class="rvps7"><span class="rvts20">presence/absence of the specific event in the new and old approach </span><span class="rvts63">(bool)</span></li>
<li class="rvps10"><span class="rvts21">the time of occurrence of the target event in the new and old approach </span><span class="rvts70">(int)</span></li> <li class="rvps7"><span class="rvts20">the time of occurrence of the target event in the new and old approach </span><span class="rvts63">(int)</span></li>
<li class="rvps10"><span class="rvts21">the state of the game at the same frame in the new and old movie </span><span class="rvts70">(string)</span></li> <li class="rvps7"><span class="rvts20">the state of the game at the same frame in the new and old movie </span><span class="rvts63">(string)</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Respectively, when you're comparing any pair of approaches you are doing one of the three possible actions:</span></p> <p class="rvps7"><span class="rvts20">Respectively, when you're comparing any pair of approaches you are doing one of the three possible actions:</span></p>
<p class="rvps10"><a class="rvts27" href="SpeedrunningSynopsis.html#CompareEvent">1. Comparing presence/absence of the event.</a></p> <p class="rvps7"><a class="rvts24" href="SpeedrunningSynopsis.html#CompareEvent">1. Comparing presence/absence of the event.</a></p>
<p class="rvps31"><a class="rvts57" href="SpeedrunningSynopsis.html#CompareEvent-A">A. By memory</a></p> <p class="rvps19"><a class="rvts43" href="SpeedrunningSynopsis.html#CompareEvent-A">A. By memory</a></p>
<p class="rvps31"><a class="rvts57" href="SpeedrunningSynopsis.html#CompareEvent-B">B. Using Bookmarks</a></p> <p class="rvps19"><a class="rvts43" href="SpeedrunningSynopsis.html#CompareEvent-B">B. Using Bookmarks</a></p>
<p class="rvps10"><a class="rvts27" href="SpeedrunningSynopsis.html#CompareTime">2. Comparing the time of occurrence.</a></p> <p class="rvps7"><a class="rvts24" href="SpeedrunningSynopsis.html#CompareTime">2. Comparing the time of occurrence.</a></p>
<p class="rvps31"><a class="rvts57" href="SpeedrunningSynopsis.html#CompareTime-A">A. By memory</a></p> <p class="rvps19"><a class="rvts43" href="SpeedrunningSynopsis.html#CompareTime-A">A. By memory</a></p>
<p class="rvps31"><a class="rvts57" href="SpeedrunningSynopsis.html#CompareTime-B">B. Using the green arrow</a></p> <p class="rvps19"><a class="rvts43" href="SpeedrunningSynopsis.html#CompareTime-B">B. Using the green arrow</a></p>
<p class="rvps31"><a class="rvts57" href="SpeedrunningSynopsis.html#CompareTime-C">C. Using a Marker</a></p> <p class="rvps19"><a class="rvts43" href="SpeedrunningSynopsis.html#CompareTime-C">C. Using a Marker</a></p>
<p class="rvps31"><a class="rvts57" href="SpeedrunningSynopsis.html#CompareTime-D">D. Using Bookmarks</a></p> <p class="rvps19"><a class="rvts43" href="SpeedrunningSynopsis.html#CompareTime-D">D. Using Bookmarks</a></p>
<p class="rvps10"><a class="rvts27" href="SpeedrunningSynopsis.html#CompareState">3. Comparing the state of the game at one and the same frame.</a></p> <p class="rvps7"><a class="rvts24" href="SpeedrunningSynopsis.html#CompareState">3. Comparing the state of the game at one and the same frame.</a></p>
<p class="rvps31"><a class="rvts57" href="SpeedrunningSynopsis.html#CompareState-A">A. By memory</a></p> <p class="rvps19"><a class="rvts43" href="SpeedrunningSynopsis.html#CompareState-A">A. By memory</a></p>
<p class="rvps31"><a class="rvts57" href="SpeedrunningSynopsis.html#CompareState-B">B. Using Bookmarks</a></p> <p class="rvps19"><a class="rvts43" href="SpeedrunningSynopsis.html#CompareState-B">B. Using Bookmarks</a></p>
<p class="rvps30"><span class="rvts42"><br/></span></p> <p class="rvps18"><span class="rvts6"><br/></span></p>
<p class="rvps10"><a name="CompareEvent"></a> <p class="rvps7"><a name="CompareEvent"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts22">1. Comparing presence/absence of the event.</span></p>
<p class="rvps10"><span class="rvts25">1. Comparing presence/absence of the event.</span></p> <p class="rvps7"><span class="rvts20">Choose the approach where the needed event happens / unneeded event doesn't happen. The occurrence of the event is only the first (and often easy) step in creating the Input for current segment, and next step is to try speeding up the time of the occurrence.</span></p>
<p class="rvps10"><span class="rvts21">Choose the approach where the needed event happens / unneeded event doesn't happen. The occurrence of the event is only the first (and often easy) step in creating the Input for current segment, and next step is to try speeding up the time of the occurrence.</span></p> <p class="rvps7"><span class="rvts33">The search for approaches goes on until the first successful approach is found, or until you're tired (then the event is considered to be unfeasible).</span></p>
<p class="rvps10"><span class="rvts37">The search for approaches goes on until the first successful approach is found, or until you're tired (then the event is considered to be unfeasible).</span></p> <p class="rvps7"><span class="rvts63">Programming analogy: comparing two Booleans, comparing &nbsp;two arrays of Booleans.</span></p>
<p class="rvps10"><span class="rvts70">Programming analogy: comparing two Booleans, comparing &nbsp;two arrays of Booleans.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><a name="CompareEvent-A"></a><span class="rvts20">A. Most of time it's enough to simply keep in mind the fact that target event didn't occur in previous approaches. Example: </span><a class="rvts24" href="SemiautomaticTASing.html#FindStartButtonPress">finding the </a><a class="rvts24" href="SemiautomaticTASing.html#FindStartButtonPress">Start buttonpress</a><span class="rvts20">.</span></p>
<p class="rvps10"><a name="CompareEvent-A"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21">A. Most of time it's enough to simply keep in mind the fact that target event didn't occur in previous approaches. Example: </span><a class="rvts27" href="SemiautomaticTASing.html#FindStartButtonPress">finding the </a><a class="rvts72" href="SemiautomaticTASing.html#FindStartButtonPress">Start buttonpress</a><span class="rvts21">.</span></p> <p class="rvps7"><a name="CompareEvent-B"></a><span class="rvts20">B. When the target event is complex (e.g. you plan to shoot 3 enemies simultaneously), it's recommended to save the most promising approaches into Bookmarks (e.g. an approach where you shot 2 enemies simultaneously and 3rd one shortly after), because if the target event is unfeasible, you might be satisfied with such partial success.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="CompareEvent-B"></a> <p class="rvps7"><a name="CompareTime"></a><span class="rvts20"><br/></span></p>
<span class="rvts21">B. When the target event is complex (e.g. you plan to shoot 3 enemies simultaneously), it's recommended to save the most promising approaches into Bookmarks (e.g. an approach where you shot 2 enemies simultaneously and 3rd one shortly after), because if the target event is unfeasible, you might be satisfied with such partial success.</span></p> <p class="rvps7"><span class="rvts22">2. Comparing the time of occurrence.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Choose the approach where the target event occurs earlier. The time of occurrence is defined by the frame in which the event can be detected, while in previous frame it cannot be detected. The number of this frame is found by bringing the Playback cursor to the frame and watching the FCEUX screen (or Memory Watch) for confirming.</span></p>
<p class="rvps10"><a name="CompareTime"></a> <p class="rvps7"><span class="rvts33">The search for approaches goes on until you're tired, or until all possible types of approaches are exhausted (then the current best approach is considered to be frame perfect, until new factors are found).</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts63">Programming analogy: comparing two Integer Numbers.</span></p>
<p class="rvps10"><span class="rvts25">2. Comparing the time of occurrence.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Choose the approach where the target event occurs earlier. The time of occurrence is defined by the frame in which the event can be detected, while in previous frame it cannot be detected. The number of this frame is found by bringing the Playback cursor to the frame and watching the FCEUX screen (or Memory Watch) for confirming.</span></p> <p class="rvps7"><a name="CompareTime-A"></a><span class="rvts20">A. For simplest segments and small subsegments it may be enough to just keep in mind the current fastest frame number and compare results of all new approaches with this number. But in general it's not recommended to rely on human memory. Details: </span><a class="rvts24" href="TASingProcess.html#EndOfSegment">TASing Process</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts37">The search for approaches goes on until you're tired, or until all possible types of approaches are exhausted (then the current best approach is considered to be frame perfect, until new factors are found).</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts70">Programming analogy: comparing two Integer Numbers.</span></p> <p class="rvps7"><a name="CompareTime-B"></a><span class="rvts20">B. On simple segments you can refer to the green arrow of Taseditor. When using it, you're supposed to always leave the Playback cursor at the frame of target event (which is only natural). Thus if the new frame of target event is located above the green arrow, it means the new approach is faster than previous approach. Details:</span><a class="rvts24" href="NonlinearTASing.html#GreenArrow">TASing Methodology</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="CompareTime-A"></a> <p class="rvps7"><a name="CompareTime-C"></a><span class="rvts20">C. On complex segments use an unbound Marker that always points at the current fastest frame number in the Piano Roll. Every time you beat the old result you're supposed to manually move the Marker higher. Thus if the new frame of target event is located above the Marker, it means the new approach is faster than the old best approach.</span></p>
<span class="rvts21">A. For simplest segments and small subsegments it may be enough to just keep in mind the current fastest frame number and compare results of all new approaches with this number. But in general it's not recommended to rely on human memory. Details: </span><a class="rvts27" href="TASingProcess.html#EndOfSegment">TASing Process</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><a name="CompareTime-D"></a><span class="rvts20">D. On segments of any level of complexity it's recommended to use Bookmarks that are displayed in the icons column of the Piano Roll. Every time you beat the old result you're supposed to manually save the current approach to the same Bookmark slot, replacing the old best approach stored there. Thus if the new frame of target event is located above the Bookmark icon, it means the new approach is faster than the old best approach.</span></p>
<p class="rvps10"><a name="CompareTime-B"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21">B. On simple segments you can refer to the green arrow of Taseditor. When using it, you're supposed to always leave the Playback cursor at the frame of target event (which is only natural). Thus if the new frame of target event is located above the green arrow, it means the new approach is faster than previous approach. Details:</span><a class="rvts27" href="NonlinearTASing.html#GreenArrow">TASing Methodology</a><span class="rvts21">.</span></p> <p class="rvps7"><a name="CompareState"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts22">3. Comparing the state of the game at the same frame.</span></p>
<p class="rvps10"><a name="CompareTime-C"></a> <p class="rvps7"><span class="rvts20">Choose the approach where properties of the game are more advantageous in a whole. This type of comparison is useful when you need to evaluate compound in-game situations. For example, in Formula 1 racing you have to care both about being as fast as possible and wearing tyres as little as possible, so you need to find an optimal balance on each segment of the track instead of simply rushing.</span></p>
<span class="rvts21">C. On complex segments use an unbound Marker that always points at the current fastest frame number in the Piano Roll. Every time you beat the old result you're supposed to manually move the Marker higher. Thus if the new frame of target event is located above the Marker, it means the new approach is faster than the old best approach.</span></p> <p class="rvps7"><span class="rvts20">Here our segment has defined end frame, and every new test is supposed to replay the segment up to that frame. Taseditor stores this frame number in the form of the green arrow, which automatically pauses emulation when you watch new approaches. So TASer only needs to edit Input (creating new approaches), launch replaying, wait for the stopping and evaluate the result (judging by FCEUX screen or Memory Watch).</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts33">The search of approaches goes on until you're tired, or until all possible types of approaches are exhausted (then the current best approach is considered to be perfect, until new factors are found).</span></p>
<p class="rvps10"><a name="CompareTime-D"></a> <p class="rvps7"><span class="rvts63">Programming analogy: comparing two Strings, comparing &nbsp;two arrays of Integer Numbers.</span></p>
<span class="rvts21">D. On segments of any level of complexity it's recommended to use Bookmarks that are displayed in the icons column of the Piano Roll. Every time you beat the old result you're supposed to manually save the current approach to the same Bookmark slot, replacing the old best approach stored there. Thus if the new frame of target event is located above the Bookmark icon, it means the new approach is faster than the old best approach.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><a name="CompareState-A"></a><span class="rvts20">A. For simple segments it may be enough to just keep in mind the value of the most important property of the game state achieved in the old best approach. Every time you watch the replaying of a new approach, you can compare results of the new approach with this value. If you decide the new value is better, you have to memorize it in place of old value. Example: </span><a class="rvts24" href="NonlinearTASing.html#LuckManipulation">luck manipulation</a><span class="rvts20">.</span></p>
<p class="rvps10"><a name="CompareState"></a> <p class="rvps7"><span class="rvts20">When there's more than one important property, it's not recommended to rely on human memory.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">3. Comparing the state of the game at the same frame.</span></p> <p class="rvps7"><a name="CompareState-B"></a><span class="rvts20">B. On complex segments and especially on gigantic segments (e.g. with the size of a whole level of the game) use Bookmarks that store alternative branches of the movie. The best approach for playing the segment is saved into one Bookmark slot and the new approach is saved into another slot. Then you can easily switch between these slots and compare values of each property of the game state. In addition, you can point the mouse cursor to respective Bookmarks to see screenshots of the game state and visually compare their properties with current image on FCEUX screen.</span></p>
<p class="rvps10"><span class="rvts21">Choose the approach where properties of the game are more advantageous in a whole. This type of comparison is useful when you need to evaluate compound in-game situations. For example, in Formula 1 racing you have to care both about being as fast as possible and wearing tyres as little as possible, so you need to find an optimal balance on each segment of the track instead of simply rushing.</span></p> <p class="rvps7"><span class="rvts20">To display important RAM data on screenshots you should use Lua graphical output, then Memory Watch window won't be required to judge about hidden properties, and you will be able to successfully judge by screenshots only. Details: </span><a class="rvts24" href="ProgramCustomization.html#DisplayBranchScreenshots">Program Customization</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">Here our segment has defined end frame, and every new test is supposed to replay the segment up to that frame. Taseditor stores this frame number in the form of the green arrow, which automatically pauses emulation when you watch new approaches. So TASer only needs to edit Input (creating new approaches), launch replaying, wait for the stopping and evaluate the result (judging by FCEUX screen or Memory Watch).</span></p> <p class="rvps7"><span class="rvts20">In the situation when some properties in the new approach are better and some others are worse you'll have to thoroughly weigh all of them (either in your mind or using a Lua-powered aggregate formula) and then decide which state of the game is better.</span></p>
<p class="rvps10"><span class="rvts37">The search of approaches goes on until you're tired, or until all possible types of approaches are exhausted (then the current best approach is considered to be perfect, until new factors are found).</span></p> <p class="rvps7"><span class="rvts20">Every time you beat the old result you're supposed to manually save the new approach to the same Bookmark slot, replacing the old best approach stored there.</span></p>
<p class="rvps10"><span class="rvts70">Programming analogy: comparing two Strings, comparing &nbsp;two arrays of Integer Numbers.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="CompareState-A"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21">A. For simple segments it may be enough to just keep in mind the value of the most important property of the game state achieved in the old best approach. Every time you watch the replaying of a new approach, you can compare results of the new approach with this value. If you decide the new value is better, you have to memorize it in place of old value. Example: </span><a class="rvts27" href="NonlinearTASing.html#LuckManipulation">luck manipulation</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">After finding the fastest approach of playing the segment, a good TASer is expected to improve the entertainment value of the play through the segment. The optimality criteria in such activity may be very diverse, but the general requirement is to keep the same time of playing through the segment.</span></p>
<p class="rvps10"><span class="rvts21">When there's more than one important property, it's not recommended to rely on human memory.</span></p> <p class="rvps7"><span class="rvts20">Alternatively, you can postpone the entertainment improvement of the segment and proceed to the next.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="CompareState-B"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21">B. On complex segments and especially on gigantic segments (e.g. with the size of a whole level of the game) use Bookmarks that store alternative branches of the movie. The best approach for playing the segment is saved into one Bookmark slot and the new approach is saved into another slot. Then you can easily switch between these slots and compare values of each property of the game state. In addition, you can point the mouse cursor to respective Bookmarks to see screenshots of the game state and visually compare their properties with current image on FCEUX screen.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">To display important RAM data on screenshots you should use Lua graphical output, then Memory Watch window won't be required to judge about hidden properties, and you will be able to successfully judge by screenshots only. Details: </span><a class="rvts27" href="ProgramCustomization.html#DisplayBranchScreenshots">Program Customization</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">In the situation when some properties in the new approach are better and some others are worse you'll have to thoroughly weigh all of them (either in your mind or using a Lua-powered aggregate formula) and then decide which state of the game is better.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Every time you beat the old result you're supposed to manually save the new approach to the same Bookmark slot, replacing the old best approach stored there.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21">After finding the fastest approach of playing the segment, a good TASer is expected to improve the entertainment value of the play through the segment. The optimality criteria in such activity may be very diverse, but the general requirement is to keep the same time of playing through the segment.</span></p>
<p class="rvps10"><span class="rvts21">Alternatively, you can postpone the entertainment improvement of the segment and proceed to the next.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/feature-tour/create-help-files-for-the-qt-help-framework">Create help files for the Qt Help Framework</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,93 +1,288 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>TAS Editor Inside</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>TAS Editor Inside</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="TAS Editor Inside">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="TAS Editor Inside" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("TASEditorInside"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>TAS Editor Inside</h1>
</div>
<div id="topic_header_nav">
<a href="SpeedrunningSynopsis.html"><img src="img/arrow_left.png" alt="Previous"/></a>
<a href="Ideas.html"><img src="img/arrow_right.png" alt="Next"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
</div> <header class="headroom">
<div class="clear"></div> <button class="hnd-toggle btn btn-default">
</div> <span class="sr-only">Toggle navigation</span>
<div id="topic_content"> <span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</header>
<nav id="panel-left" class="md-nav-expanded">
<!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="TASEditorInside"
data-hnd-context="3"
data-hnd-title="TAS Editor Inside"
>
<div class="navigation">
<ol class="breadcrumb">
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="SpeedrunningSynopsis.html" title="Speedrunning synopsis" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="Ideas.html" title="Ideas" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>TAS Editor Inside</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">TAS Editor Inside</span></p> <p class="rvps2"><span class="rvts18">TAS Editor Inside</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps10"><span class="rvts21">This section of the documentation describes all ideas put into the Taseditor and reveals major details of the final implementation of TAS Editor 1.0. For more details check the source code of the program (in C++).</span></p> <p class="rvps7"><span class="rvts20">This section of the documentation describes all ideas put into the Taseditor and reveals major details of the final implementation of TAS Editor 1.0. For more details check the source code of the program (in C++).</span></p>
<p class="rvps10"><span class="rvts21">Taseditor is an open source program and is distributed under the </span><a class="rvts27" href="http://en.wikipedia.org/wiki/MIT_License" target="_blank">MIT</a><span class="rvts21"> license which allows unrestricted use. The license was chosen to encourage modification and porting to another platforms.</span></p> <p class="rvps7"><span class="rvts20">Taseditor is an open source program and is distributed under the </span><a class="rvts24" href="http://en.wikipedia.org/wiki/MIT_License" target="_blank">MIT</a><span class="rvts20"> license which allows unrestricted use. The license was chosen to encourage modification and porting to another platforms.</span></p>
<p class="rvps10"><span class="rvts21">You can download the source code of the FCEUX emulator with built-in Taseditor from the official SVN repository: </span><a class="rvts27" href="http://sourceforge.net/p/fceultra/code/" target="_blank">http://sourceforge.net/p/fceultra/code/</a></p> <p class="rvps7"><span class="rvts20">You can download the source code of the FCEUX emulator with built-in Taseditor from the official SVN repository: </span><a class="rvts24" href="http://sourceforge.net/p/fceultra/code/" target="_blank">http://sourceforge.net/p/fceultra/code/</a></p>
<p class="rvps10"><span class="rvts21">To work with SVN you'll need some SVN client program, like </span><a class="rvts27" href="http://en.wikipedia.org/wiki/Tortoise_SVN" target="_blank">TortoiseSVN</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">To work with SVN you'll need some SVN client program, like </span><a class="rvts24" href="http://en.wikipedia.org/wiki/Tortoise_SVN" target="_blank">TortoiseSVN</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">The source code of Taseditor is well-commented, and to understand the code you only need basic skills of programming in C++ under Win32 API.</span></p> <p class="rvps7"><span class="rvts20">The source code of Taseditor is well-commented, and to understand the code you only need basic skills of programming in C++ under Win32 API.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts23" href="Ideas.html">Ideas</a></p> <p class="rvps7"><a class="rvts11" href="Ideas.html">Ideas</a></p>
<p class="rvps12"><span class="rvts24">The intended functionality of the program</span></p> <p class="rvps8"><span class="rvts20">The intended functionality of the program</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts23" href="Implementation.html">Implementation</a></p> <p class="rvps7"><a class="rvts11" href="Implementation.html">Implementation</a></p>
<p class="rvps12"><span class="rvts24">The actual program architecture</span></p> <p class="rvps8"><span class="rvts20">The actual program architecture</span></p>
<p class="rvps10"><a class="rvts23" href="Navigation.html"><br/></a></p> <p class="rvps7"><a class="rvts11" href="Navigation.html"><br/></a></p>
<p class="rvps10"><a class="rvts23" href="MistakeProofing.html">Mistake-proofing</a></p> <p class="rvps7"><a class="rvts11" href="MistakeProofing.html">Mistake-proofing</a></p>
<p class="rvps12"><span class="rvts24">The list of unobvious nuances</span></p> <p class="rvps8"><span class="rvts20">The list of unobvious nuances</span></p>
<p class="rvps10"><a class="rvts23" href="Operations.html"><br/></a></p> <p class="rvps7"><a class="rvts11" href="Operations.html"><br/></a></p>
<p class="rvps10"><a class="rvts23" href="FM3format.html">FM3 format</a></p> <p class="rvps7"><a class="rvts11" href="FM3format.html">FM3 format</a></p>
<p class="rvps12"><span class="rvts24">Taseditor project file specifications</span></p> <p class="rvps8"><span class="rvts20">Taseditor project file specifications</span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p class="rvps12"><span class="rvts24"><br/></span></p> <p class="rvps8"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/help-authoring-tool">Full-featured multi-format Help generator</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/help-authoring-tool">Single source CHM, PDF, DOC and HTML Help creation</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,210 +1,411 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>4. TASing Methodology</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>4. TASing Methodology</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="4. TASing Methodology">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="4. TASing Methodology" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("TASingMethodology"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>4. TASing Methodology</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="BeginnersGuide.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="TASingProcess.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="TraditionalTASing.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="TASingMethodology"
data-hnd-context="9"
data-hnd-title="4. TASing Methodology"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="BeginnersGuide.html" title="Beginner's Guide" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="TASingProcess.html" title="3. TASing Process" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="TraditionalTASing.html" title="4.1. Traditional TASing" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>4. TASing Methodology</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">TASing Methodology</span></p> <p class="rvps2"><span class="rvts18">TASing Methodology</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">This chapter is dedicated to the principal activity in TASing the way of creating an optimal Input for any given segment of the movie. TASes look so shiny exactly because of persistent manual polishing of Input. The size of working segment can be anything, criteria and factors of optimality can vary, but the method is basically one and the same</span><span class="rvts21">: retry all sorts of approaches and choose the best one. The only question is how to do it with minimum time and effort.</span></p> <p class="rvps7"><span class="rvts20">This chapter is dedicated to the principal activity in TASing the way of creating an optimal Input for any given segment of the movie. TASes look so shiny exactly because of persistent manual polishing of Input. The size of working segment can be anything, criteria and factors of optimality can vary, but the method is basically one and the same</span><span class="rvts20">: retry all sorts of approaches and choose the best one. The only question is how to do it with minimum time and effort.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps10"><span class="rvts34">Gamers</span><span class="rvts21"> erroneously think that to make a TAS you only have to complete the game once, using savestates when you make some fatal mistakes (those resulting in inability to complete current segment, for example, death of the character).</span></li> <li class="rvps7"><span class="rvts31">Gamers</span><span class="rvts20"> erroneously think that to make a TAS you only have to complete the game once, using savestates when you make some fatal mistakes (those resulting in inability to complete current segment, for example, death of the character).</span></li>
<li class="rvps10"><span class="rvts34">Newbie TASers</span><span class="rvts21"> understand that to make a beautiful TAS you have to revert and fix </span><span class="rvts25">all</span><span class="rvts21"> noticed mistakes (e.g. even such minor flaws as stumbling over a threshold). They also complete each segment only once, but spend more time than regular players, because of saving and loading savestates much more often. For TASing simple games this can be sufficient.</span></li> <li class="rvps7"><span class="rvts31">Newbie TASers</span><span class="rvts20"> understand that to make a beautiful TAS you have to revert and fix </span><span class="rvts22">all</span><span class="rvts20"> noticed mistakes (e.g. even such minor flaws as stumbling over a threshold). They also complete each segment only once, but spend more time than regular players, because of saving and loading savestates much more often. For TASing simple games this can be sufficient.</span></li>
<li class="rvps10"><span class="rvts34">Experienced TASers</span><span class="rvts21"> know that to make a perfect TAS it's not enough to fix all noticed mistakes. You also have to fix unnoticed mistakes. Consider unknown factors. Approach the task from an unobvious side. To do all this they play through the same segment several times, both fixing all noticed mistakes and trying to somehow avert unnoticeable mistakes.</span></li> <li class="rvps7"><span class="rvts31">Experienced TASers</span><span class="rvts20"> know that to make a perfect TAS it's not enough to fix all noticed mistakes. You also have to fix unnoticed mistakes. Consider unknown factors. Approach the task from an unobvious side. To do all this they play through the same segment several times, both fixing all noticed mistakes and trying to somehow avert unnoticeable mistakes.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">It's rather difficult to convince yourself to spend time on alternative ways to play through the segment once it's already completed and all obvious mistakes are already fixed. After achieving the current in-game goal people usually want to set another in-game goal. But you must remember that TASer's goal is different from player's goals. So try to abstract away from the game rules and not to retreat from the segment until you complete real goal, not just player's small goal.</span></p> <p class="rvps7"><span class="rvts20">It's rather difficult to convince yourself to spend time on alternative ways to play through the segment once it's already completed and all obvious mistakes are already fixed. After achieving the current in-game goal people usually want to set another in-game goal. But you must remember that TASer's goal is different from player's goals. So try to abstract away from the game rules and not to retreat from the segment until you complete real goal, not just player's small goal.</span></p>
<p class="rvps10"><span class="rvts21">That's actually the most difficult part to invent new approaches to solving one and the same task. TASers mainly consider the same approach a regular player would have used in this place of the game. That's why people mostly use evolutionary way instead of revolutionary. You keep modifying the existing basic approach, both fixing its mistakes and conducting experiments. In the process of these thoughtful modifications you enrich your knowledge base about the game, and as a result you produce an Input that isn't immediately obvious.</span></p> <p class="rvps7"><span class="rvts20">That's actually the most difficult part to invent new approaches to solving one and the same task. TASers mainly consider the same approach a regular player would have used in this place of the game. That's why people mostly use evolutionary way instead of revolutionary. You keep modifying the existing basic approach, both fixing its mistakes and conducting experiments. In the process of these thoughtful modifications you enrich your knowledge base about the game, and as a result you produce an Input that isn't immediately obvious.</span></p>
<p class="rvps10"><span class="rvts21">Of course, sometimes you have a flash of inspiration, when a revolutionary idea leads to tremendous improvements that surpass all polishing gains. People love TASing exactly for these emotional moments. Yet it doesn't exempt you from the need to polish this new revolutionary approach using the same methods to bring it even closer to an ideal.</span></p> <p class="rvps7"><span class="rvts20">Of course, sometimes you have a flash of inspiration, when a revolutionary idea leads to tremendous improvements that surpass all polishing gains. People love TASing exactly for these emotional moments. Yet it doesn't exempt you from the need to polish this new revolutionary approach using the same methods to bring it even closer to an ideal.</span></p>
<p class="rvps10"><span class="rvts21">Instead of reading the techniques described here you can just immediately start real TASing, so in a course of several projects you would work out your own methods. But most likely after a year of TASing you'll come to the described scheme of work.</span></p> <p class="rvps7"><span class="rvts20">Instead of reading the techniques described here you can just immediately start real TASing, so in a course of several projects you would work out your own methods. But most likely after a year of TASing you'll come to the described scheme of work.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">So, the process of creating the best Input for the segment of optimization can be basically described as a loop of fixing mistakes in previous versions of Input of the segment. A mistake is any kind of divergence from the perfect yet unknown Input. Such statement of question is very advantageous, because it means that you can gradually approach the perfect Input by making small steps that you can elaborate even without being a genius. </span><span class="rvts25">The majority of mistakes can be successfully fixed by repeated examination and modification.</span><span class="rvts21"> That is, even when you don't have any original ideas, you can achieve a success by persistence. The successful progress motivates you to continue the work and thus prepare the ground for breakthrough ideas.</span></p> <p class="rvps7"><span class="rvts20">So, the process of creating the best Input for the segment of optimization can be basically described as a loop of fixing mistakes in previous versions of Input of the segment. A mistake is any kind of divergence from the perfect yet unknown Input. Such statement of question is very advantageous, because it means that you can gradually approach the perfect Input by making small steps that you can elaborate even without being a genius. </span><span class="rvts22">The majority of mistakes can be successfully fixed by repeated examination and modification.</span><span class="rvts20"> That is, even when you don't have any original ideas, you can achieve a success by persistence. The successful progress motivates you to continue the work and thus prepare the ground for breakthrough ideas.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">To correct a mistake in the Input of a movie you have to:</span></p> <p class="rvps7"><span class="rvts20">To correct a mistake in the Input of a movie you have to:</span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ol style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10"><span class="rvts21">Become aware of the mistake.</span></li> <li value="1" class="rvps7"><span class="rvts20">Become aware of the mistake.</span></li>
<li class="rvps10"><span class="rvts21">Conjecture a solution.</span></li> <li value="2" class="rvps7"><span class="rvts20">Conjecture a solution.</span></li>
<li class="rvps10"><span class="rvts21">Navigate to the place.</span></li> <li value="3" class="rvps7"><span class="rvts20">Navigate to the place.</span></li>
<li class="rvps10"><span class="rvts21">Apply changes.</span></li> <li value="4" class="rvps7"><span class="rvts20">Apply changes.</span></li>
<li class="rvps10"><span class="rvts21">Verify the outcome.</span></li> <li value="5" class="rvps7"><span class="rvts20">Verify the outcome.</span></li>
</ol> </ol>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">1. </span><span class="rvts21">Realizing a mistake happens either when watching the movie in Read-Only mode or right when recording/editing the Input.</span></p> <p class="rvps7"><span class="rvts22">1. </span><span class="rvts20">Realizing a mistake happens either when watching the movie in Read-Only mode or right when recording/editing the Input.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts41">Comment: </span><span class="rvts42">Instead of detecting a tangible mistake TASers often just assume that current segment is still improvable. It's always wise to doubt the perfectness of current result and try experimenting with the Input sometimes you indeed find unused possibilities.</span></p> <tr valign="top">
</td> <td height="27" style="border-color: #000000; border-style: solid; padding: 6px;">
</tr> <p class="rvps7"><span class="rvts37">Comment: </span><span class="rvts6">Instead of detecting a tangible mistake TASers often just assume that current segment is still improvable. It's always wise to doubt the perfectness of current result and try experimenting with the Input sometimes you indeed find unused possibilities.</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><a name="loop"></a> <p class="rvps7"><a name="loop"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts22">2. </span><span class="rvts20">The means of solving the mistake are either immediately obvious or are found experimentally. In rare cases you have to resort to calculations and comparisons. A correctly chosen segment usually encompasses all key factors of optimality. The information from previous or next segments is rarely needed.</span></p>
<p class="rvps10"><span class="rvts25">2. </span><span class="rvts21">The means of solving the mistake are either immediately obvious or are found experimentally. In rare cases you have to resort to calculations and comparisons. A correctly chosen segment usually encompasses all key factors of optimality. The information from previous or next segments is rarely needed.</span></p> <div class="rvps7">
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<tr valign="top"> <tr valign="top">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts41">Comment: </span><span class="rvts42">Sometimes while fixing one mistake we unwittingly create another mistake. In this case the optimization process would go in wrong direction, but fortunately such situations are extremely rare in TASing, because videogames are much more straightforward than real life, so player can find all factors and an unambiguous criterion of optimality. Taseditor additionally simplifies the process by data visualization.</span></p> <td height="27" style="border-color: #000000; border-style: solid; padding: 6px;">
</td> <p class="rvps7"><span class="rvts37">Comment: </span><span class="rvts6">Sometimes while fixing one mistake we unwittingly create another mistake. In this case the optimization process would go in wrong direction, but fortunately such situations are extremely rare in TASing, because videogames are much more straightforward than real life, so player can find all factors and an unambiguous criterion of optimality. Taseditor additionally simplifies the process by data visualization.</span></p>
</tr> </td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">3. </span><span class="rvts21">The ability to navigate to the place of making the mistake is the essential distinction between TASing and normal speedrunning. Regular players can detect the mistake post factum, but it's TASers who always return back to correct it.</span></p> <p class="rvps7"><span class="rvts22">3. </span><span class="rvts20">The ability to navigate to the place of making the mistake is the essential distinction between TASing and normal speedrunning. Regular players can detect the mistake post factum, but it's TASers who always return back to correct it.</span></p>
<p class="rvps10"><span class="rvts21">In traditional method of TASing the navigation may take noticeable amount of time and effort. Taseditor makes the navigation much faster.</span></p> <p class="rvps7"><span class="rvts20">In traditional method of TASing the navigation may take noticeable amount of time and effort. Taseditor makes the navigation much faster.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts41">Comment: </span><span class="rvts42">Sometimes the place of making the mistake is located long before the segment where it is revealed. In this case you have to find the segment affecting the mistake and edit it according to the information given by the played segment. And in this case the speed of navigation between those two segments is even more important.</span></p> <tr valign="top">
</td> <td height="27" style="border-color: #000000; border-style: solid; padding: 6px;">
</tr> <p class="rvps7"><span class="rvts37">Comment: </span><span class="rvts6">Sometimes the place of making the mistake is located long before the segment where it is revealed. In this case you have to find the segment affecting the mistake and edit it according to the information given by the played segment. And in this case the speed of navigation between those two segments is even more important.</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">4. </span><span class="rvts21">Applying modifications to Input is how you make your thoughts real. The less the delay between an idea and its implementation is, the better.</span></p> <p class="rvps7"><span class="rvts22">4. </span><span class="rvts20">Applying modifications to Input is how you make your thoughts real. The less the delay between an idea and its implementation is, the better.</span></p>
<p class="rvps10"><span class="rvts21">In the traditional method of TASing the Input modification generally takes longer, because in addition to rewriting erroneous frames you also have to rewrite adjacent frames &nbsp;In Taseditor this is often not necessary.</span></p> <p class="rvps7"><span class="rvts20">In the traditional method of TASing the Input modification generally takes longer, because in addition to rewriting erroneous frames you also have to rewrite adjacent frames &nbsp;In Taseditor this is often not necessary.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts41">Comment: </span><span class="rvts42">Since any Input modification entails a change in the game flow, sometimes even in Taseditor you have to resync the old Input that follows the place of fixing mistake.</span></p> <tr valign="top">
</td> <td height="27" style="border-color: #000000; border-style: solid; padding: 6px;">
</tr> <p class="rvps7"><span class="rvts37">Comment: </span><span class="rvts6">Since any Input modification entails a change in the game flow, sometimes even in Taseditor you have to resync the old Input that follows the place of fixing mistake.</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">5. </span><span class="rvts21">To see the outcome you need to resume playing the movie from the beginning of current segment of right from the frame of fixing the mistake. There's no need to re-check previous segments of the movie, because the mistake fixing affects only subsequent events.</span></p> <p class="rvps7"><span class="rvts22">5. </span><span class="rvts20">To see the outcome you need to resume playing the movie from the beginning of current segment of right from the frame of fixing the mistake. There's no need to re-check previous segments of the movie, because the mistake fixing affects only subsequent events.</span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<td style="border-color: #000000; border-style: solid; height: 15px;"><p class="rvps10"><span class="rvts41">Comment: </span><span class="rvts42">Although, when you're making an entertaining playthrough instead of a pure speedrun, after fixing a mistake (e.g. making the movement trajectory more smooth) you should ensure that this correction fits with the general sequence of in-game events, so it's recommended to rewatch some previous events together with the current segment.</span></p> <tr valign="top">
</td> <td height="27" style="border-color: #000000; border-style: solid; padding: 6px;">
</tr> <p class="rvps7"><span class="rvts37">Comment: </span><span class="rvts6">Although, when you're making an entertaining playthrough instead of a pure speedrun, after fixing a mistake (e.g. making the movement trajectory more smooth) you should ensure that this correction fits with the general sequence of in-game events, so it's recommended to rewatch some previous events together with the current segment.</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21">You almost always have to watch the current segment up to its end, that is, to the moment when the target event occurs, so that you can confidently apply the optimality criterion. Because the correction may seem profitable at first but appear worse in the end.</span></p> <p class="rvps7"><span class="rvts20">You almost always have to watch the current segment up to its end, that is, to the moment when the target event occurs, so that you can confidently apply the optimality criterion. Because the correction may seem profitable at first but appear worse in the end.</span></p>
<p class="rvps10"><span class="rvts21">After evaluating the outcome, the mistake is either considered to be fixed/non-existent, or you have to return to </span><a class="rvts27" href="TASingMethodology.html#loop">step 2</a><span class="rvts21"> and rethink the situation.</span></p> <p class="rvps7"><span class="rvts20">After evaluating the outcome, the mistake is either considered to be fixed/non-existent, or you have to return to </span><a class="rvts24" href="TASingMethodology.html#loop">step 2</a><span class="rvts20"> and rethink the situation.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="linear-tasing"></a> <p class="rvps7"><a name="linear-tasing"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Before Taseditor, all mistakes (both explicit and supposed) were being fixed by creating and reloading savestates. If you're not familiar with the traditional method of TASing, here's its basic principles:</span></p>
<p class="rvps10"><span class="rvts21">Before Taseditor, all mistakes (both explicit and supposed) were being fixed by creating and reloading savestates. If you're not familiar with the traditional method of TASing, here's its basic principles:</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts20">The game emulation is almost always paused. You only unpause it to rewatch finished segments.</span></li>
<li class="rvps10"><span class="rvts21">The game emulation is almost always paused. You only unpause it to rewatch finished segments.</span></li> <li class="rvps7"><span class="rvts20">TASer sequentially types the Input into frames pointed by the Playback cursor. You see the outcome of the committed Input next frame (or sometimes in several frames). Experienced TASers create a new savestate after each </span><span class="rvts33">hard-to-reproduce action</span><span class="rvts20">, so they are able to return back without the need to replay the whole segment from the beginning.</span></li>
<li class="rvps10"><span class="rvts21">TASer sequentially types the Input into frames pointed by the Playback cursor. You see the outcome of the committed Input next frame (or sometimes in several frames). Experienced TASers create a new savestate after each </span><span class="rvts37">hard-to-reproduce action</span><span class="rvts21">, so they are able to return back without the need to replay the whole segment from the beginning.</span></li> <li class="rvps7"><span class="rvts20">To correct a mistake, TASer returns to the supposed place of making the mistake and rerecords the whole Input, starting from the frame that needs to be changed. If there was a savestate created at this frame, you can instantly load the savestate in Read+Write mode and begin typing buttonpresses right away. But if you only have a savestate created at some distance before the frame, there are two options. </span><span class="rvts31">Option 1:</span><span class="rvts20"> load the nearest savestate in Read-Only mode and replay the movie up to the needed frame, then switch back to Read+Write mode and start the correction, thus not touching the Input in the interval from the savestate frame to the mistake frame. </span><span class="rvts31">Option 2:</span><span class="rvts20"> just load the nearest savestate in Read+Write mode and repeat the old Input by memory, thus rewriting it up to the needed frame, and then start the correction. The 2nd way is used more often, because after the nearest savestate there's usually an </span><span class="rvts33">easy-to-reproduce Input</span><span class="rvts20"> (e.g. simply holding </span><span class="rvts26">R + B</span><span class="rvts20">). Also, upon arriving to the supposed frame of the mistake, an experienced TASer mechanically creates a savestate (just in case!), so next time he will be able to return directly to the frame, without wasting time on navigation. Such a prudence makes sense, because mistakes are seldom fixed at the first attempt, usually you need to repeatedly rerecord the same section of Input, starting from about the same frame.</span></li>
<li class="rvps10"><span class="rvts21">To correct a mistake, TASer returns to the supposed place of making the mistake and rerecords the whole Input, starting from the frame that needs to be changed. If there was a savestate created at this frame, you can instantly load the savestate in Read+Write mode and begin typing buttonpresses right away. But if you only have a savestate created at some distance before the frame, there are two options. </span><span class="rvts34">Option 1:</span><span class="rvts21"> load the nearest savestate in Read-Only mode and replay the movie up to the needed frame, then switch back to Read+Write mode and start the correction, thus not touching the Input in the interval from the savestate frame to the mistake frame. </span><span class="rvts34">Option 2:</span><span class="rvts21"> just load the nearest savestate in Read+Write mode and repeat the old Input by memory, thus rewriting it up to the needed frame, and then start the correction. The 2nd way is used more often, because after the nearest savestate there's usually an </span><span class="rvts37">easy-to-reproduce Input</span><span class="rvts21"> (e.g. simply holding </span><span class="rvts29">R + B</span><span class="rvts21">). Also, upon arriving to the supposed frame of the mistake, an experienced TASer mechanically creates a savestate (just in case!), so next time he will be able to return directly to the frame, without wasting time on navigation. Such a prudence makes sense, because mistakes are seldom fixed at the first attempt, usually you need to repeatedly rerecord the same section of Input, starting from about the same frame.</span></li> <li class="rvps7"><span class="rvts20">The disadvantages of the traditional method clearly reveal when you need to see a distant result of your Input (for example, you press the button now, but the roulette only stops in several seconds). In such cases TASer makes a savestate before entering the Input, records the decisive Input and makes a savestate after it, then unpauses the emulator and carelessly (suboptimally) plays through the game up to the point of seeing the result. If the result is satisfactory, TASer loads the savestate made after the decisive Input and records an optimal playthrough, already being sure in successful outcome. And if the result is unsatisfactory, TASer loads the initial savestate, changes the decisive Input and repeats previous actions (creates a savestate after the Input and hastily plays up to the result). And this process may go for a long while.</span></li>
<li class="rvps10"><span class="rvts21">The disadvantages of the traditional method clearly reveal when you need to see a distant result of your Input (for example, you press the button now, but the roulette only stops in several seconds). In such cases TASer makes a savestate before entering the Input, records the decisive Input and makes a savestate after it, then unpauses the emulator and carelessly (suboptimally) plays through the game up to the point of seeing the result. If the result is satisfactory, TASer loads the savestate made after the decisive Input and records an optimal playthrough, already being sure in successful outcome. And if the result is unsatisfactory, TASer loads the initial savestate, changes the decisive Input and repeats previous actions (creates a savestate after the Input and hastily plays up to the result). And this process may go for a long while.</span></li> <li class="rvps7"><span class="rvts20">In order to copy an old Input (for example, the complex acceleration of Mario at the beginning of every level), TASer either learns the button combination by heart or copies it in parts by making several jumps between the source and the destination. First the game is sent to the place of old Input (by loading the savestate prepared at that frame) to watch the replay in Read-Only mode and memorize a few buttonpresses, then it's sent to the current segment (by loading the latest savestate in Read+Write mode) to lay out the buttonpresses. This way sounds tiresome, but if you keep moving both savestates a bit forward after every jump, the navigation between source and destination becomes rather quick. Still, when TASers need to copy a long sequence of buttonpresses, they use an external editor of Input, allowing to copy/paste. But the downside is that switching contexts is very distracting, so often it's less troublesome to just copy the Input manually.</span></li>
<li class="rvps10"><span class="rvts21">In order to copy an old Input (for example, the complex acceleration of Mario at the beginning of every level), TASer either learns the button combination by heart or copies it in parts by making several jumps between the source and the destination. First the game is sent to the place of old Input (by loading the savestate prepared at that frame) to watch the replay in Read-Only mode and memorize a few buttonpresses, then it's sent to the current segment (by loading the latest savestate in Read+Write mode) to lay out the buttonpresses. This way sounds tiresome, but if you keep moving both savestates a bit forward after every jump, the navigation between source and destination becomes rather quick. Still, when TASers need to copy a long sequence of buttonpresses, they use an external editor of Input, allowing to copy/paste. But the downside is that switching contexts is very distracting, so often it's less troublesome to just copy the Input manually.</span></li> <li class="rvps7"><span class="rvts20">To examine the current progress, TASer makes a savestate, turns off the Recording and loads the savestate left at the beginning of current level (usually it's the slot assigned to a rarely used key, such as </span><span class="rvts23">F10</span><span class="rvts20">). Then he unpaused the emulator and watches the movie like an outsider. To continue the recording, he switches to Read+Write mode and returns directly to the latest recorded frame by loading the latest savestate (usually it's the most often used slot, like </span><span class="rvts23">F1</span><span class="rvts20">). If while watching TASer decides to modify the old Input, he makes a savestate at this point, switches to Read+Write and loads the just created savestate. Beforehand, you should make sure the last state of the movie is saved to both </span><span class="rvts23">F1</span><span class="rvts20"> and another slot that won't be used in your experiments with the old Input. This is necessary in case your experiments fail, so you could restore the old movie even if the </span><span class="rvts23">F1</span><span class="rvts20"> slot becomes overwritten in the course of the experiments.</span></li>
<li class="rvps10"><span class="rvts21">To examine the current progress, TASer makes a savestate, turns off the Recording and loads the savestate left at the beginning of current level (usually it's the slot assigned to a rarely used key, such as </span><span class="rvts26">F10</span><span class="rvts21">). Then he unpaused the emulator and watches the movie like an outsider. To continue the recording, he switches to Read+Write mode and returns directly to the latest recorded frame by loading the latest savestate (usually it's the most often used slot, like </span><span class="rvts26">F1</span><span class="rvts21">). If while watching TASer decides to modify the old Input, he makes a savestate at this point, switches to Read+Write and loads the just created savestate. Beforehand, you should make sure the last state of the movie is saved to both </span><span class="rvts26">F1</span><span class="rvts21"> and another slot that won't be used in your experiments with the old Input. This is necessary in case your experiments fail, so you could restore the old movie even if the </span><span class="rvts26">F1</span><span class="rvts21"> slot becomes overwritten in the course of the experiments.</span></li> <li class="rvps7"><span class="rvts20">So, the majority of the 10 available slots is used for navigation between different moments of the game. Or, using Taseditor's terms, they are used for Playback cursor navigation along the movie. The 10 slots are more than enough to teleport back and forth among all places of interest, even when current segment is very large. Usually 3-5 slots are enough. Experienced TASers juggle these slots with astounding speed.</span></li>
<li class="rvps10"><span class="rvts21">So, the majority of the 10 available slots is used for navigation between different moments of the game. Or, using Taseditor's terms, they are used for Playback cursor navigation along the movie. The 10 slots are more than enough to teleport back and forth among all places of interest, even when current segment is very large. Usually 3-5 slots are enough. Experienced TASers juggle these slots with astounding speed.</span></li> <li class="rvps7"><span class="rvts20">A couple of another slots are used to store alternative strategies of playing. When you don't know which approach to playing a large segment (e.g. a whole level of the game) will be better, you first polish the 1st approach and save it into a separate slot (say, </span><span class="rvts23">F8</span><span class="rvts20">), then you polish the 2nd approach and save it into an adjacent slot (e.g. </span><span class="rvts23">F7</span><span class="rvts20">). After that you can alternately load these slots (or even alternately watch the two branches of the movie) and choose the best one, save it to </span><span class="rvts23">F1</span><span class="rvts20"> and continue TASing in this branch.</span></li>
<li class="rvps10"><span class="rvts21">A couple of another slots are used to store alternative strategies of playing. When you don't know which approach to playing a large segment (e.g. a whole level of the game) will be better, you first polish the 1st approach and save it into a separate slot (say, </span><span class="rvts26">F8</span><span class="rvts21">), then you polish the 2nd approach and save it into an adjacent slot (e.g. </span><span class="rvts26">F7</span><span class="rvts21">). After that you can alternately load these slots (or even alternately watch the two branches of the movie) and choose the best one, save it to </span><span class="rvts26">F1</span><span class="rvts21"> and continue TASing in this branch.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">As you see, almost everything in the traditional method of TASing is done using savestates (Bookmarks). In Taseditor some of their functions are replaced by the Greenzone and the History Log, yet Bookmarks still play important role, allowing to keep alternative branches of the movie in a single project. The Playback cursor navigation now can be done faster by either drag'n'drop or mouse wheel. In fact, now you don't need to put Playback cursor to the frame of modification, you can just scroll the Piano Roll to the place and change the Input by mouse.</span></p> <p class="rvps7"><span class="rvts20">As you see, almost everything in the traditional method of TASing is done using savestates (Bookmarks). In Taseditor some of their functions are replaced by the Greenzone and the History Log, yet Bookmarks still play important role, allowing to keep alternative branches of the movie in a single project. The Playback cursor navigation now can be done faster by either drag'n'drop or mouse wheel. In fact, now you don't need to put Playback cursor to the frame of modification, you can just scroll the Piano Roll to the place and change the Input by mouse.</span></p>
<p class="rvps10"><span class="rvts21">Since the Recording is less effective than direct editing, there's no more need to constantly switch modes. Now the emulator is always in Read-Only mode.</span></p> <p class="rvps7"><span class="rvts20">Since the Recording is less effective than direct editing, there's no more need to constantly switch modes. Now the emulator is always in Read-Only mode.</span></p>
<p class="rvps10"><span class="rvts21">The game is always paused, as before. But now you are seeing the outcome of your Input only when you actually want to see it. At first this may seem inconvenient (as you don't feel the habitual feedback from your keypresses), but it's actually very advantageous, because it means the higher level of independence from the game. Instead of the standard mechanism of "involvement into the gameplay" there are other mechanisms of data transmission. So in any case you will receive all needed information on how the game interprets your Input, it's just that this data stream won't continually flow into your mind, it will be delivered on command.</span></p> <p class="rvps7"><span class="rvts20">The game is always paused, as before. But now you are seeing the outcome of your Input only when you actually want to see it. At first this may seem inconvenient (as you don't feel the habitual feedback from your keypresses), but it's actually very advantageous, because it means the higher level of independence from the game. Instead of the standard mechanism of "involvement into the gameplay" there are other mechanisms of data transmission. So in any case you will receive all needed information on how the game interprets your Input, it's just that this data stream won't continually flow into your mind, it will be delivered on command.</span></p>
<p class="rvps10"><span class="rvts21">And when it's really necessary, you can have an intensified feedback by switching to the third method of TASing in Taseditor.</span></p> <p class="rvps7"><span class="rvts20">And when it's really necessary, you can have an intensified feedback by switching to the third method of TASing in Taseditor.</span></p>
<p class="rvps10"><span class="rvts21">Let's review pros and cons of all three methods, one by one.</span></p> <p class="rvps7"><span class="rvts20">Let's review pros and cons of all three methods, one by one.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="1" cellspacing="2" style="border-color: #000000; border-style: solid;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="1" cellpadding="1" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<td style="border-color: #000000; border-style: solid; height: 39px;"><p class="rvps10"><span class="rvts22"><br/></span></p> <tr valign="top">
<p class="rvps10"><span class="rvts22">The three methods of TASing in Taseditor:</span></p> <td height="41" style="border-color: #000000; border-style: solid; padding: 1px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21"><br/></span></p>
<ul style="text-indent: 0px; margin-left: 50px; list-style-position: outside;"> <p class="rvps7"><span class="rvts21">The three methods of TASing in Taseditor:</span></p>
<li class="rvps14" style="text-indent: 0px"><a class="rvts43" href="TraditionalTASing.html">Traditional method</a></li> <p class="rvps7"><span class="rvts20"><br/></span></p>
</ul> <ul style="text-indent: 0px; padding: 0; margin: 0 0 0 50px; list-style-position: outside;">
<ul style="text-indent: 0px; margin-left: 55px; list-style-position: outside;"> <li style="text-indent: 0px" class="rvps9"><a class="rvts38" href="TraditionalTASing.html">Traditional method</a></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts21">navigating the Input using the Playback cursor by jumping to Bookmarks</span></li> </ul>
<li class="rvps14" style="text-indent: 0px"><span class="rvts21">recording sequences of Input using the keyboard/joypad</span></li> <ul style="text-indent: 0px; padding: 0; margin: 0 0 0 55px; list-style-position: outside; list-style-type: disc;">
<li class="rvps14" style="text-indent: 0px"><span class="rvts21">watching interim results of the Input automatically</span></li> <li style="text-indent: 0px" class="rvps9"><span class="rvts20">navigating the Input using the Playback cursor by jumping to Bookmarks</span></li>
</ul> <li style="text-indent: 0px" class="rvps9"><span class="rvts20">recording sequences of Input using the keyboard/joypad</span></li>
<p class="rvps10"><span class="rvts21"><br/></span></p> <li style="text-indent: 0px" class="rvps9"><span class="rvts20">watching interim results of the Input automatically</span></li>
<ul style="text-indent: 0px; margin-left: 50px; list-style-position: outside;"> </ul>
<li class="rvps14" style="text-indent: 0px"><a class="rvts44" href="NonlinearTASing.html">Nonlinear method</a></li> <p class="rvps7"><span class="rvts20"><br/></span></p>
</ul> <ul style="text-indent: 0px; padding: 0; margin: 0 0 0 50px; list-style-position: outside;">
<ul style="text-indent: 0px; margin-left: 55px; list-style-position: outside;"> <li style="text-indent: 0px" class="rvps9"><a class="rvts39" href="NonlinearTASing.html">Nonlinear method</a></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts21">navigating the Input using the mouse</span></li> </ul>
<li class="rvps14" style="text-indent: 0px"><span class="rvts21">editing the Input using the mouse/</span><span class="rvts21">keyboard/joypad</span></li> <ul style="text-indent: 0px; padding: 0; margin: 0 0 0 55px; list-style-position: outside; list-style-type: disc;">
<li class="rvps14" style="text-indent: 0px"><span class="rvts21">watching interim or final results of the Input by user command</span></li> <li style="text-indent: 0px" class="rvps9"><span class="rvts20">navigating the Input using the mouse</span></li>
</ul> <li style="text-indent: 0px" class="rvps9"><span class="rvts20">editing the Input using the mouse/</span><span class="rvts20">keyboard/joypad</span></li>
<p class="rvps10"><span class="rvts21"><br/></span></p> <li style="text-indent: 0px" class="rvps9"><span class="rvts20">watching interim or final results of the Input by user command</span></li>
<ul style="text-indent: 0px; margin-left: 50px; list-style-position: outside;"> </ul>
<li class="rvps14" style="text-indent: 0px"><a class="rvts45" href="SemiautomaticTASing.html">Semiautomatic method</a></li> <p class="rvps7"><span class="rvts20"><br/></span></p>
</ul> <ul style="text-indent: 0px; padding: 0; margin: 0 0 0 50px; list-style-position: outside;">
<ul style="text-indent: 0px; margin-left: 55px; list-style-position: outside;"> <li style="text-indent: 0px" class="rvps9"><a class="rvts40" href="SemiautomaticTASing.html">Semiautomatic method</a></li>
<li class="rvps14" style="text-indent: 0px"><span class="rvts21">navigating the Input using the mouse</span></li> </ul>
<li class="rvps14" style="text-indent: 0px"><span class="rvts21">editing the Input using the mouse/</span><span class="rvts21">keyboard/joypad</span></li> <ul style="text-indent: 0px; padding: 0; margin: 0 0 0 55px; list-style-position: outside; list-style-type: disc;">
<li class="rvps14" style="text-indent: 0px"><span class="rvts21">watching interim or final results of the Input </span><span class="rvts21">automatically</span></li> <li style="text-indent: 0px" class="rvps9"><span class="rvts20">navigating the Input using the mouse</span></li>
</ul> <li style="text-indent: 0px" class="rvps9"><span class="rvts20">editing the Input using the mouse/</span><span class="rvts20">keyboard/joypad</span></li>
<p class="rvps14"><span class="rvts21"><br/></span></p> <li style="text-indent: 0px" class="rvps9"><span class="rvts20">watching interim or final results of the Input </span><span class="rvts20">automatically</span></li>
</td> </ul>
</tr> <p class="rvps9"><span class="rvts20"><br/></span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/feature-tour">Easily create Web Help sites</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/feature-tour/create-help-files-for-the-qt-help-framework">Produce online help for Qt applications</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,179 +1,374 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>3. TASing Process</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>3. TASing Process</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="3. TASing Process">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="3. TASing Process" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("TASingProcess"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>3. TASing Process</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="BeginnersGuide.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="Toolbox.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="TASingMethodology.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="TASingProcess"
data-hnd-context="8"
data-hnd-title="3. TASing Process"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="BeginnersGuide.html" title="Beginner's Guide" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="Toolbox.html" title="2.2. Toolbox" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="TASingMethodology.html" title="4. TASing Methodology" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>3. TASing Process</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">TASing Process</span></p> <p class="rvps2"><span class="rvts18">TASing Process</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">TASing is about striving for an absolute perfectness. For TASers, a game is more than just an amusement, it's an interesting and complex task.</span></p> <p class="rvps7"><span class="rvts20">TASing is about striving for an absolute perfectness. For TASers, a game is more than just an amusement, it's an interesting and complex task.</span></p>
<p class="rvps10"><span class="rvts21">People enjoy solving creative tasks, because it allows them to express their individuality and improve various skills. However, complicated tasks require both inventiveness and methodicalness. This Manual describes dry and methodical side of TASing, as for inventiveness you'll have to show it yourself in real setting.</span></p> <p class="rvps7"><span class="rvts20">People enjoy solving creative tasks, because it allows them to express their individuality and improve various skills. However, complicated tasks require both inventiveness and methodicalness. This Manual describes dry and methodical side of TASing, as for inventiveness you'll have to show it yourself in real setting.</span></p>
<p class="rvps10"><span class="rvts21">In general, to create a perfect (or very close to perfect) playthrough of the game you have to record an imperfect walkthrough and then work on consecutive improvements of its separate parts. When every fragment of the movie is perfect, we may consider the whole TAS to be perfect as well.</span></p> <p class="rvps7"><span class="rvts20">In general, to create a perfect (or very close to perfect) playthrough of the game you have to record an imperfect walkthrough and then work on consecutive improvements of its separate parts. When every fragment of the movie is perfect, we may consider the whole TAS to be perfect as well.</span></p>
<p class="rvps10"><span class="rvts21">The concentration of efforts on small segments of the movie is the key to success. Every working segment has to be large enough to represent an adequate subtask, but small enough to make the task simple.</span></p> <p class="rvps7"><span class="rvts20">The concentration of efforts on small segments of the movie is the key to success. Every working segment has to be large enough to represent an adequate subtask, but small enough to make the task simple.</span></p>
<p class="rvps10"><span class="rvts21">Without such structuring an effective and comfortable TASing would not be possible. There's too many factors affecting the final result of the game, and some of those factors append or contradict each other. Human memory is not enough to keep and calculate all interconnections of the game factors within a large segment of the playthrough. Therefore, when TASers deal with long play sessions, they aren't different from regular players who are carried by the temptation to use the first observations as a base for making decisions. But regular players can get away with such carefree approach, while TASers would end up with a clearly imperfect walkthrough.</span></p> <p class="rvps7"><span class="rvts20">Without such structuring an effective and comfortable TASing would not be possible. There's too many factors affecting the final result of the game, and some of those factors append or contradict each other. Human memory is not enough to keep and calculate all interconnections of the game factors within a large segment of the playthrough. Therefore, when TASers deal with long play sessions, they aren't different from regular players who are carried by the temptation to use the first observations as a base for making decisions. But regular players can get away with such carefree approach, while TASers would end up with a clearly imperfect walkthrough.</span></p>
<p class="rvps10"><span class="rvts21">Thus real TASing implies that segments are small. Much smaller than a single level of a typical videogame. The whole process of TASing may be portrayed like this: a man watches the recording of his own unfinished playthrough of the game, selects a small piece of the movie and throws all forces into improving it, then selects another piece and so on until the end of the game.</span></p> <p class="rvps7"><span class="rvts20">Thus real TASing implies that segments are small. Much smaller than a single level of a typical videogame. The whole process of TASing may be portrayed like this: a man watches the recording of his own unfinished playthrough of the game, selects a small piece of the movie and throws all forces into improving it, then selects another piece and so on until the end of the game.</span></p>
<p class="rvps10"><span class="rvts21">Of course, it's an incomplete picture, because besides the movie editing TASers also research and experiment with the game (to expose hidden factors) and do many other things. But that's beyond the scope of this Guide.</span></p> <p class="rvps7"><span class="rvts20">Of course, it's an incomplete picture, because besides the movie editing TASers also research and experiment with the game (to expose hidden factors) and do many other things. But that's beyond the scope of this Guide.</span></p>
<p class="rvps10"><span class="rvts21">The skill of choosing adequate segments comes with experience. Many TASers don't even think what makes them spontaneously focus on a segment of the game and unconsciously limit the beginning and the end of current work. Some believe that they simply record the movie frame-by-frame in succession, but if you watch it from outside you can note that those repeated rerecords occur within a window of 20-200 frames, and the window goes forward the movie by making jumps (the end of previous segment becomes the beginning of next segment). Consider watching live stream videos of TASing, and you'll see certain regularities in handling savestates.</span></p> <p class="rvps7"><span class="rvts20">The skill of choosing adequate segments comes with experience. Many TASers don't even think what makes them spontaneously focus on a segment of the game and unconsciously limit the beginning and the end of current work. Some believe that they simply record the movie frame-by-frame in succession, but if you watch it from outside you can note that those repeated rerecords occur within a window of 20-200 frames, and the window goes forward the movie by making jumps (the end of previous segment becomes the beginning of next segment). Consider watching live stream videos of TASing, and you'll see certain regularities in handling savestates.</span></p>
<p class="rvps10"><span class="rvts21">Here we'll try to analyze the behavior, in order to learn how to define current segment limits sensibly. And then practical TASing will make you do it mechanically.</span></p> <p class="rvps7"><span class="rvts20">Here we'll try to analyze the behavior, in order to learn how to define current segment limits sensibly. And then practical TASing will make you do it mechanically.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">An adequate segment (subtask) is supposed to give TASer a consistent goal and simple means to reach it.</span></p> <p class="rvps7"><span class="rvts20">An adequate segment (subtask) is supposed to give TASer a consistent goal and simple means to reach it.</span></p>
<p class="rvps10"><span class="rvts21">The </span><span class="rvts25">goal</span><span class="rvts21"> of a segment playthrough is usually to achieve certain in-game event. For example, the goal of playing through the whole game is the event when "THE END" text appears on the screen. The goal of one level can be such event as "the value of the level counter in RAM was increased" or simply "the screen faded at the end of current level". And the goal of a small segment may be something like "the character successfully landed on the other side of the pit". These intermediate goals are defined by the context.</span></p> <p class="rvps7"><span class="rvts20">The </span><span class="rvts22">goal</span><span class="rvts20"> of a segment playthrough is usually to achieve certain in-game event. For example, the goal of playing through the whole game is the event when "THE END" text appears on the screen. The goal of one level can be such event as "the value of the level counter in RAM was increased" or simply "the screen faded at the end of current level". And the goal of a small segment may be something like "the character successfully landed on the other side of the pit". These intermediate goals are defined by the context.</span></p>
<p class="rvps10"><span class="rvts21">Based on the goal, TASer defines the </span><span class="rvts25">optimality criterion</span><span class="rvts21"> in mind. The criterion is the rule which lets you compare any two versions of playing through the current segment of the game. When you're TASing, it's not enough to simply reach the goal, you have to try many approaches to reaching it, and then choose the best approach of all. For example, in a speedrun the best approach to playing a segment is usually the one in which the target event occurs as early as possible. E.g. if the 1st approach to playing the segment made the event occur at frame 350, and the 2nd approach made it appear at frame 340, then the 2nd approach is better than the 1st, and the final movie should contain exactly the 2nd approach.</span></p> <p class="rvps7"><span class="rvts20">Based on the goal, TASer defines the </span><span class="rvts22">optimality criterion</span><span class="rvts20"> in mind. The criterion is the rule which lets you compare any two versions of playing through the current segment of the game. When you're TASing, it's not enough to simply reach the goal, you have to try many approaches to reaching it, and then choose the best approach of all. For example, in a speedrun the best approach to playing a segment is usually the one in which the target event occurs as early as possible. E.g. if the 1st approach to playing the segment made the event occur at frame 350, and the 2nd approach made it appear at frame 340, then the 2nd approach is better than the 1st, and the final movie should contain exactly the 2nd approach.</span></p>
<p class="rvps10"><span class="rvts21">There's a lot of </span><span class="rvts25">means</span><span class="rvts21"> for reaching the target event. In theory, any gameplay aspect (including those not planned by developers) may help or impede the progress in some way. So, to cope with this vague multitude of possibilities you should regard all aspects of the game as </span><span class="rvts21">optimality factors</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">There's a lot of </span><span class="rvts22">means</span><span class="rvts20"> for reaching the target event. In theory, any gameplay aspect (including those not planned by developers) may help or impede the progress in some way. So, to cope with this vague multitude of possibilities you should regard all aspects of the game as </span><span class="rvts20">optimality factors</span><span class="rvts20">.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/smb-zigzag.png"/></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/smb-zigzag.png"></p>
<p class="rvps10"><span class="rvts21">An </span><span class="rvts25">optimality factor</span><span class="rvts21"> is an aspect of the game that directly affects optimality of playing current segment. The word "directly" implies a monotonous dependence of outcome from applying the factor. For example, on this picture there's no monotonous dependence between the distance to finish and the duration of holding </span><span class="rvts29">Right</span><span class="rvts21">. Pressing the same </span><span class="rvts29">R</span><span class="rvts21"> button either makes Mario be closer to the finish, or moves him away, depending on his position.</span></p> <p class="rvps7"><span class="rvts20">An </span><span class="rvts22">optimality factor</span><span class="rvts20"> is an aspect of the game that directly affects optimality of playing current segment. The word "directly" implies a monotonous dependence of outcome from applying the factor. For example, on this picture there's no monotonous dependence between the distance to finish and the duration of holding </span><span class="rvts26">Right</span><span class="rvts20">. Pressing the same </span><span class="rvts26">R</span><span class="rvts20"> button either makes Mario be closer to the finish, or moves him away, depending on his position.</span></p>
<p class="rvps10"><span class="rvts21">When people perceive such segment in a whole, it's difficult to guess the best moment to release the </span><span class="rvts29">R</span><span class="rvts21"> button, when to press the </span><span class="rvts29">L</span><span class="rvts21"> button and so on. So, in order to simplify the understanding of complex dependencies (and thus reveal factors), such segments should be broken into several subsegments.</span></p> <p class="rvps7"><span class="rvts20">When people perceive such segment in a whole, it's difficult to guess the best moment to release the </span><span class="rvts26">R</span><span class="rvts20"> button, when to press the </span><span class="rvts26">L</span><span class="rvts20"> button and so on. So, in order to simplify the understanding of complex dependencies (and thus reveal factors), such segments should be broken into several subsegments.</span></p>
<p class="rvps10"><span class="rvts21">Correct statement of question usually cuts off many irrelevant possibilities. For example, regular player could wait until the difficult enemy character walks away, but in a speedrun such tactic is not considered.</span></p> <p class="rvps7"><span class="rvts20">Correct statement of question usually cuts off many irrelevant possibilities. For example, regular player could wait until the difficult enemy character walks away, but in a speedrun such tactic is not considered.</span></p>
<p class="rvps10"><span class="rvts21">Thus even in an open-world game TASer is left with a limited set of useful actions and in-game indicators that must be followed while polishing one segment. And the less the segment is, the more limited is this set, so it's easier to find an ideal sequence of actions by going over combinations of factors.</span></p> <p class="rvps7"><span class="rvts20">Thus even in an open-world game TASer is left with a limited set of useful actions and in-game indicators that must be followed while polishing one segment. And the less the segment is, the more limited is this set, so it's easier to find an ideal sequence of actions by going over combinations of factors.</span></p>
<p class="rvps10"><span class="rvts21">On the other hand, the less the segment is, the less its goal intersects with the final goal of the TAS. The final goal is to make perfect walkthrough, e.g. the fastest in the world (which means the frame counter at the end of the movie should be as low as possible). But in terms of every specific segment the goal may be completely different, sometimes even opposite (for example, to stay in bonus stage as long as possible, which then grants time saving at another point of the game). That's why in very small segments the optimality criterion is not used, and playing such micro-segment is only evaluated as a part of a full-fledged segment.</span></p> <p class="rvps7"><span class="rvts20">On the other hand, the less the segment is, the less its goal intersects with the final goal of the TAS. The final goal is to make perfect walkthrough, e.g. the fastest in the world (which means the frame counter at the end of the movie should be as low as possible). But in terms of every specific segment the goal may be completely different, sometimes even opposite (for example, to stay in bonus stage as long as possible, which then grants time saving at another point of the game). That's why in very small segments the optimality criterion is not used, and playing such micro-segment is only evaluated as a part of a full-fledged segment.</span></p>
<p class="rvps10"><span class="rvts21">For example, when your character is jumping over a pit and shooting enemies at the same time, every bullet release can be considered a separate subsegment (so it becomes easy to isolate such factors as "recharge timer", "max 3 bullets on screen" and so on). But then, when comparing approaches, you should compare different versions of jumping over the pit. Even if the 1st approach to jumping (which ends at the frame 350) allowed you to shoot two enemies and the 2nd approach (which ends at frame 340) allowed to shoot only single enemy, you are supposed to choose the 2nd approach, because the optimality criterion of the unbroken segment fits the final goal of the speedrun better.</span></p> <p class="rvps7"><span class="rvts20">For example, when your character is jumping over a pit and shooting enemies at the same time, every bullet release can be considered a separate subsegment (so it becomes easy to isolate such factors as "recharge timer", "max 3 bullets on screen" and so on). But then, when comparing approaches, you should compare different versions of jumping over the pit. Even if the 1st approach to jumping (which ends at the frame 350) allowed you to shoot two enemies and the 2nd approach (which ends at frame 340) allowed to shoot only single enemy, you are supposed to choose the 2nd approach, because the optimality criterion of the unbroken segment fits the final goal of the speedrun better.</span></p>
<p class="rvps10"><span class="rvts21">While TASing you have to maintain an optimal balance between the necessity to decrease segments in order to grasp factors and the need to increase them in order to use a relevant criterion. This skill comes with time, so don't sweat it and just rely on your intuition.</span></p> <p class="rvps7"><span class="rvts20">While TASing you have to maintain an optimal balance between the necessity to decrease segments in order to grasp factors and the need to increase them in order to use a relevant criterion. This skill comes with time, so don't sweat it and just rely on your intuition.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<td valign="top" style="border-color: #000000; border-style: solid; height: 160px;"><p class="rvps10"><span class="rvts21">Let's have an example when the segment is too large. In a Super Mario Bros speedrun you are expected to reach the end of World 1-1 as fast as possible, which means you have to maximize the X coordinate of the character moving from left to right. The basic premise is that at the beginning of the level the X value equals zero and at the end of the level it is one thousand. Using gamepad buttons you can influence the coordinate in various ways.</span></p> <tr valign="top">
<p class="rvps10"><span class="rvts21">If we take the whole level from the moment </span><span class="rvts34">X = 0</span><span class="rvts21"> to the event </span><span class="rvts34">X = 1000</span><span class="rvts21"> as our working segment, we can immediately see the optimality criterion (the best approach will be the one with minimal value of the frame counter when </span><span class="rvts34">X &gt;= 1000</span><span class="rvts21">), but we can't see definite factors. How exactly we're supposed to press buttons to get the </span><span class="rvts34">X = 1000</span><span class="rvts21"> within minimal number of frames? Well, we can apply a regular player's logic and intuition. When we press the </span><span class="rvts29">R</span><span class="rvts21"> button, the X coordinate usually increases, and with the </span><span class="rvts29">L</span><span class="rvts21"> button it decreases. So the most obvious decision is to hold the </span><span class="rvts29">R</span><span class="rvts21"> button and see how many frames is needed to grow the value of X to one thousand. When testing such approach in emulator, it appears that Mario is hampered by obstacles and the X coordinate does not grow, even though the </span><span class="rvts29">R</span><span class="rvts21"> button is held. This way a new factor comes to light the need to jump over obstacles and pits. Using the </span><span class="rvts29">A</span><span class="rvts21"> button Mario eventually reaches the </span><span class="rvts34">X = 1000</span><span class="rvts21"> event, and the optimality criterion can eliminate all alternative playthroughs where the </span><span class="rvts29">A</span><span class="rvts21"> button presses were ill-timed (e.g. where Mario stumbled over edges of pipes, the frame counter at the end of the segment was higher).</span></p> <td height="172" valign="top" style="border-color: #000000; border-style: solid; padding: 6px;">
<p class="rvps10"><span class="rvts21">Now the player (or rather, TASer who is stuck in player's mindset) may think that all factors are applied and the segment is perfect. But it isn't. Super Mario Bros has somewhat complex physics engine. The X coordinate is influenced by current horizontal speed, and speed is influenced by acceleration. Acceleration is affected by the </span><span class="rvts29">B</span><span class="rvts21"> button, skidding, Mario's direction and air-ground state. There are also teleporter pipes and useful glitches like the "flagpole glitch" and so on. A lot of things to bear in mind. But, according to certain research, human working memory can only store </span><a class="rvts27" href="http://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two" target="_blank">about 7 objects</a><span class="rvts21">, thus some factors inevitably slip away when you're editing Input on large segment. You'd better shrink the segment to such a scale which reveals factors individually or in a small group.</span></p> <p class="rvps7"><span class="rvts20">Let's have an example when the segment is too large. In a Super Mario Bros speedrun you are expected to reach the end of World 1-1 as fast as possible, which means you have to maximize the X coordinate of the character moving from left to right. The basic premise is that at the beginning of the level the X value equals zero and at the end of the level it is one thousand. Using gamepad buttons you can influence the coordinate in various ways.</span></p>
<p class="rvps10"><span class="rvts21">If we focus on the segment from </span><span class="rvts34">X = 0</span><span class="rvts21"> to </span><span class="rvts34">X = 100</span><span class="rvts21">, the optimality criterion will be the same, but now it also becomes obvious that in the first half of the segment Mario runs slower, and in the second half he runs with constant speed which can be considered maximum. This way you begin to appreciate the acceleration factor, so you add the RAM address to Memory Watch and start analyzing possible ways to influence the acceleration. After some experiments with turning and jumping you can discover more factors. </span><span class="rvts21">As a result, you're going to find an intricate combination of </span><span class="rvts29">R</span><span class="rvts21">, </span><span class="rvts29">L</span><span class="rvts21">, </span><span class="rvts29">B</span><span class="rvts21"> and </span><span class="rvts29">A</span><span class="rvts21"> buttonpresses that makes the event </span><span class="rvts34">X = 100</span><span class="rvts21"> occur faster than simply holding </span><span class="rvts29">R</span><span class="rvts21"> and </span><span class="rvts29">B</span><span class="rvts21">. And even if the new playthrough of the segment is only several frames faster than old, it's much closer to perfectness.</span></p> <p class="rvps7"><span class="rvts20">If we take the whole level from the moment </span><span class="rvts31">X = 0</span><span class="rvts20"> to the event </span><span class="rvts31">X = 1000</span><span class="rvts20"> as our working segment, we can immediately see the optimality criterion (the best approach will be the one with minimal value of the frame counter when </span><span class="rvts31">X &gt;= 1000</span><span class="rvts20">), but we can't see definite factors. How exactly we're supposed to press buttons to get the </span><span class="rvts31">X = 1000</span><span class="rvts20"> within minimal number of frames? Well, we can apply a regular player's logic and intuition. When we press the </span><span class="rvts26">R</span><span class="rvts20"> button, the X coordinate usually increases, and with the </span><span class="rvts26">L</span><span class="rvts20"> button it decreases. So the most obvious decision is to hold the </span><span class="rvts26">R</span><span class="rvts20"> button and see how many frames is needed to grow the value of X to one thousand. When testing such approach in emulator, it appears that Mario is hampered by obstacles and the X coordinate does not grow, even though the </span><span class="rvts26">R</span><span class="rvts20"> button is held. This way a new factor comes to light the need to jump over obstacles and pits. Using the </span><span class="rvts26">A</span><span class="rvts20"> button Mario eventually reaches the </span><span class="rvts31">X = 1000</span><span class="rvts20"> event, and the optimality criterion can eliminate all alternative playthroughs where the </span><span class="rvts26">A</span><span class="rvts20"> button presses were ill-timed (e.g. where Mario stumbled over edges of pipes, the frame counter at the end of the segment was higher).</span></p>
</td> <p class="rvps7"><span class="rvts20">Now the player (or rather, TASer who is stuck in player's mindset) may think that all factors are applied and the segment is perfect. But it isn't. Super Mario Bros has somewhat complex physics engine. The X coordinate is influenced by current horizontal speed, and speed is influenced by acceleration. Acceleration is affected by the </span><span class="rvts26">B</span><span class="rvts20"> button, skidding, Mario's direction and air-ground state. There are also teleporter pipes and useful glitches like the "flagpole glitch" and so on. A lot of things to bear in mind. But, according to certain research, human working memory can only store </span><a class="rvts24" href="http://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two" target="_blank">about 7 objects</a><span class="rvts20">, thus some factors inevitably slip away when you're editing Input on large segment. You'd better shrink the segment to such a scale which reveals factors individually or in a small group.</span></p>
</tr> <p class="rvps7"><span class="rvts20">If we focus on the segment from </span><span class="rvts31">X = 0</span><span class="rvts20"> to </span><span class="rvts31">X = 100</span><span class="rvts20">, the optimality criterion will be the same, but now it also becomes obvious that in the first half of the segment Mario runs slower, and in the second half he runs with constant speed which can be considered maximum. This way you begin to appreciate the acceleration factor, so you add the RAM address to Memory Watch and start analyzing possible ways to influence the acceleration. After some experiments with turning and jumping you can discover more factors. </span><span class="rvts20">As a result, you're going to find an intricate combination of </span><span class="rvts26">R</span><span class="rvts20">, </span><span class="rvts26">L</span><span class="rvts20">, </span><span class="rvts26">B</span><span class="rvts20"> and </span><span class="rvts26">A</span><span class="rvts20"> buttonpresses that makes the event </span><span class="rvts31">X = 100</span><span class="rvts20"> occur faster than simply holding </span><span class="rvts26">R</span><span class="rvts20"> and </span><span class="rvts26">B</span><span class="rvts20">. And even if the new playthrough of the segment is only several frames faster than old, it's much closer to perfectness.</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <div class="rvps7">
<tr valign="top"> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<td valign="top" style="border-color: #000000; border-style: solid; height: 426px;"><p class="rvps10"><span class="rvts21">Now let's take a look at another extreme. When segment is too small, its optimality criterion may contradict the final goal of the TAS.</span></p> <tr valign="top">
<p class="rvps10"><span class="rvts21">First, if you get carried away by maximizing speed and acceleration in equal intervals between </span><span class="rvts34">every next hundred of pixels</span><span class="rvts21">, you may forget about the shortcut pipe, because diving into pipes resets speed value to zero, which contradicts with the goal of current segment. In short term the diving factor is disadvantageous for a speedrunner, and its long-term profit may be overlooked when you're busy with habitual actions.</span></p> <td height="438" valign="top" style="border-color: #000000; border-style: solid; padding: 6px;">
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/smb-segments.gif"/></p> <p class="rvps7"><span class="rvts20">Now let's take a look at another extreme. When segment is too small, its optimality criterion may contradict the final goal of the TAS.</span></p>
<p class="rvps10"><span class="rvts21">In this case the segment was chosen without much foresight, and as a consequence it sprouted wrong criterion of optimality ("the frame counter at the event </span><span class="rvts34">X = 200</span><span class="rvts21"> must be minimal"). Instead, the segment should end at the moment when </span><span class="rvts34">any </span><span class="rvts40">Down</span><span class="rvts34"> button press starts diving animation</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">First, if you get carried away by maximizing speed and acceleration in equal intervals between </span><span class="rvts31">every next hundred of pixels</span><span class="rvts20">, you may forget about the shortcut pipe, because diving into pipes resets speed value to zero, which contradicts with the goal of current segment. In short term the diving factor is disadvantageous for a speedrunner, and its long-term profit may be overlooked when you're busy with habitual actions.</span></p>
<p class="rvps10"><span class="rvts21">Of course such mistakes are often noticed when replaying finished movie on a fresh mind, but sometimes the situation is less obvious and is only revealed after publishing.</span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/smb-segments.gif"></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">In this case the segment was chosen without much foresight, and as a consequence it sprouted wrong criterion of optimality ("the frame counter at the event </span><span class="rvts31">X = 200</span><span class="rvts20"> must be minimal"). Instead, the segment should end at the moment when </span><span class="rvts31">any </span><span class="rvts36">Down</span><span class="rvts31"> button press starts diving animation</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">Second, in the same SMB game after diving into the pipe (World 1-1) you have to reach the exit to the right. It may seem necessary to start maximizing speed from the very beginning. But as you may see in the picture, within first dozen of frames it's better to hold the </span><span class="rvts29">L</span><span class="rvts21"> button instead of </span><span class="rvts29">R</span><span class="rvts21">, so that Mario lands slightly aloof from the wall that needs to be jumped over. If you hold </span><span class="rvts29">R</span><span class="rvts21"> too early, Mario will land close to the wall and will have to jump vertically, thus losing gathered speed.</span></p> <p class="rvps7"><span class="rvts20">Of course such mistakes are often noticed when replaying finished movie on a fresh mind, but sometimes the situation is less obvious and is only revealed after publishing.</span></p>
<p class="rvps10"><span class="rvts21">This peculiarity is not so obvious when you choose optimizing the segment from the event </span><span class="rvts34">Mario appears</span><span class="rvts21"> to the </span><span class="rvts34">Mario lands</span><span class="rvts21"> event. The optimality criterion of such small segment will direct you to wrong sequence of buttonpresses.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Here you should choose the segment from the frame when </span><span class="rvts34">Mario appears</span><span class="rvts21"> to the moment of </span><span class="rvts34">overcoming the corner of the wall</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">Second, in the same SMB game after diving into the pipe (World 1-1) you have to reach the exit to the right. It may seem necessary to start maximizing speed from the very beginning. But as you may see in the picture, within first dozen of frames it's better to hold the </span><span class="rvts26">L</span><span class="rvts20"> button instead of </span><span class="rvts26">R</span><span class="rvts20">, so that Mario lands slightly aloof from the wall that needs to be jumped over. If you hold </span><span class="rvts26">R</span><span class="rvts20"> too early, Mario will land close to the wall and will have to jump vertically, thus losing gathered speed.</span></p>
<p class="rvps10"><span class="rvts21">Unfortunately, even experienced TASers not always choose correct limits right away. Sometimes you have to rethink and redo, throw away results of many tests and change the scale of the segment, play the same part of the game many times again.</span></p> <p class="rvps7"><span class="rvts20">This peculiarity is not so obvious when you choose optimizing the segment from the event </span><span class="rvts31">Mario appears</span><span class="rvts20"> to the </span><span class="rvts31">Mario lands</span><span class="rvts20"> event. The optimality criterion of such small segment will direct you to wrong sequence of buttonpresses.</span></p>
</td> <p class="rvps7"><span class="rvts20">Here you should choose the segment from the frame when </span><span class="rvts31">Mario appears</span><span class="rvts20"> to the moment of </span><span class="rvts31">overcoming the corner of the wall</span><span class="rvts20">.</span></p>
</tr> <p class="rvps7"><span class="rvts20">Unfortunately, even experienced TASers not always choose correct limits right away. Sometimes you have to rethink and redo, throw away results of many tests and change the scale of the segment, play the same part of the game many times again.</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">As you might have noticed, this document avoids measuring segments in real frames of the movie. Because actual size of segment varies from game to game and from stage to stage. Some parts of the game contain so little possibilities that they can last for more than a thousand of frames and still be easy to play and replay. By the way, some segments don't even need to be played more than once, since they are so simple that any successful playthrough is optimal (for instance, watching unskippable cutscenes between levels). And on the contrary, some stages of the game are supersaturated with events and factors, so you are going to sweat even over a dozen of frames.</span></p> <p class="rvps7"><span class="rvts20">As you might have noticed, this document avoids measuring segments in real frames of the movie. Because actual size of segment varies from game to game and from stage to stage. Some parts of the game contain so little possibilities that they can last for more than a thousand of frames and still be easy to play and replay. By the way, some segments don't even need to be played more than once, since they are so simple that any successful playthrough is optimal (for instance, watching unskippable cutscenes between levels). And on the contrary, some stages of the game are supersaturated with events and factors, so you are going to sweat even over a dozen of frames.</span></p>
<p class="rvps10"><span class="rvts21">Experienced TASers regard every segment individually (although they don't think too much about it). It's bad idea to choose the next segment by the same principle as previous, this would only work well in extremely repetitive games.</span></p> <p class="rvps7"><span class="rvts20">Experienced TASers regard every segment individually (although they don't think too much about it). It's bad idea to choose the next segment by the same principle as previous, this would only work well in extremely repetitive games.</span></p>
<p class="rvps10"><span class="rvts21">If you want, you can limit the end of current segment by a fixed frame number (e.g. set the goal to maximize the X coordinate value when </span><span class="rvts34">the frame counter = 200</span><span class="rvts21">). But usually it's more convenient to associate the end with some small frontier of the game (like passing over a trap or defeating another enemy) then the goal itself is going to suggest you basic means for reaching it. The task "touch a flower as fast as possible" sounds more natural (for a gamer) than the task "at the frame 300 become as close to the flower as possible".</span></p> <p class="rvps7"><span class="rvts20">If you want, you can limit the end of current segment by a fixed frame number (e.g. set the goal to maximize the X coordinate value when </span><span class="rvts31">the frame counter = 200</span><span class="rvts20">). But usually it's more convenient to associate the end with some small frontier of the game (like passing over a trap or defeating another enemy) then the goal itself is going to suggest you basic means for reaching it. The task "touch a flower as fast as possible" sounds more natural (for a gamer) than the task "at the frame 300 become as close to the flower as possible".</span></p>
<p class="rvps10"><span class="rvts21">In the vast majority of video games the gameplay divides into "rooms", "enemy waves" and "traps", which are always separated by short periods of relaxation. Even in constantly scrolling and open-world games the level design ensures that there are intense moments and filler intervals between them. The truth is, </span><span class="rvts25">game designers also structure player's task into subtasks</span><span class="rvts21">, and in some cases TASer can even borrow the prepared segmentation. Just don't forget to critically assess it and subdivide into more subsegments when needed. Though, such subdivision will naturally take place in the process of editing Input on a excessively large segment. So TASing doesn't always require intense intellectual efforts. If you're skillful and smart, most of time you can just go with the flow and enjoy TASing no less than conventional gaming.</span></p> <p class="rvps7"><span class="rvts20">In the vast majority of video games the gameplay divides into "rooms", "enemy waves" and "traps", which are always separated by short periods of relaxation. Even in constantly scrolling and open-world games the level design ensures that there are intense moments and filler intervals between them. The truth is, </span><span class="rvts22">game designers also structure player's task into subtasks</span><span class="rvts20">, and in some cases TASer can even borrow the prepared segmentation. Just don't forget to critically assess it and subdivide into more subsegments when needed. Though, such subdivision will naturally take place in the process of editing Input on a excessively large segment. So TASing doesn't always require intense intellectual efforts. If you're skillful and smart, most of time you can just go with the flow and enjoy TASing no less than conventional gaming.</span></p>
<p class="rvps10"><span class="rvts21">All this can be compared to how writers divide their books into chapters (game levels), and chapters into paragraphs and sentences (segments) in order to aid with comfortable reading and comprehending author's ideas. A regular reader (player) is satisfied with the author's subdivision, but a literary critic (TASer) needs to be able to "read between lines" by dividing text his own way.</span></p> <p class="rvps7"><span class="rvts20">All this can be compared to how writers divide their books into chapters (game levels), and chapters into paragraphs and sentences (segments) in order to aid with comfortable reading and comprehending author's ideas. A regular reader (player) is satisfied with the author's subdivision, but a literary critic (TASer) needs to be able to "read between lines" by dividing text his own way.</span></p>
<p class="rvps10"><span class="rvts21">For example, in Super Mario Bros every group of enemies is separated by a quiet space which doesn't require any skills, and it can be light-heartedly ran over or jumped over while holding </span><span class="rvts29">Right</span><span class="rvts21"> (granted that Mario speed is already at maximum). So you don't even need TAS tools to be perfect at these moments. These intervals are the most suitable place to set a goal if you mark an end of the segment at such place, the optimality criterion won't contradict with final goal of TAS for sure. And usually these moments occur often enough so the segment between them is of an acceptable size.</span></p> <p class="rvps7"><span class="rvts20">For example, in Super Mario Bros every group of enemies is separated by a quiet space which doesn't require any skills, and it can be light-heartedly ran over or jumped over while holding </span><span class="rvts26">Right</span><span class="rvts20"> (granted that Mario speed is already at maximum). So you don't even need TAS tools to be perfect at these moments. These intervals are the most suitable place to set a goal if you mark an end of the segment at such place, the optimality criterion won't contradict with final goal of TAS for sure. And usually these moments occur often enough so the segment between them is of an acceptable size.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The division to segments was always present in TASing, but Taseditor allows to accentuate the process visually. Here you can mark the beginning and the end of a segment using Markers or Bookmarks. Thanks to the visible boundaries you won't be distracted onto adjacent Input and can focus on analyzing only closest factors.</span></p> <p class="rvps7"><span class="rvts20">The division to segments was always present in TASing, but Taseditor allows to accentuate the process visually. Here you can mark the beginning and the end of a segment using Markers or Bookmarks. Thanks to the visible boundaries you won't be distracted onto adjacent Input and can focus on analyzing only closest factors.</span></p>
<p class="rvps10"><span class="rvts21">The frame of current segment beginning is usually chosen when watching a test playthrough of the current segment. When recording or watching such playthrough you already pick one or two key factors of optimality. So it's only logical to start the segment at the moment when these factors join into force or dramatically change the behavior. For example, at the beginning of every level you usually start a new segment, because that's the point where you regain the ability to move forward (after the cutscene between levels ends). So it's wise to set a Marker or a Bookmark at the beginning of every level, thus marking both the level boundary and the beginning of current work segment.</span></p> <p class="rvps7"><span class="rvts20">The frame of current segment beginning is usually chosen when watching a test playthrough of the current segment. When recording or watching such playthrough you already pick one or two key factors of optimality. So it's only logical to start the segment at the moment when these factors join into force or dramatically change the behavior. For example, at the beginning of every level you usually start a new segment, because that's the point where you regain the ability to move forward (after the cutscene between levels ends). So it's wise to set a Marker or a Bookmark at the beginning of every level, thus marking both the level boundary and the beginning of current work segment.</span></p>
<p class="rvps10"><span class="rvts21">And if in the process of optimizing the segment you reveal some factors that join into force earlier than current beginning of the segment, you can always adjust the chosen boundaries of the segment, or break it in two subsegments.</span></p> <p class="rvps7"><span class="rvts20">And if in the process of optimizing the segment you reveal some factors that join into force earlier than current beginning of the segment, you can always adjust the chosen boundaries of the segment, or break it in two subsegments.</span></p>
<p class="rvps10"><a name="EndOfSegment"></a> <p class="rvps7"><a name="EndOfSegment"></a><span class="rvts20">The ending frame of current segment is more mobile than the frame of beginning. When you define your goal (e.g. to make the X coordinate reach the value of 50) you can mark the end of current segment by setting a Marker/Bookmark to the frame where current imperfect playthrough accomplishes this goal. Then by polishing the Input you try to reach the goal (</span><span class="rvts31">X = 50</span><span class="rvts20">) at an earlier frame. And if in the process of modifying and testing a new Input you discover that the goal indeed can be reached earlier, you move the closing Marker/Bookmark up (to the frame of the improved end). After that you continue testing new approaches, searching for even better one until you don't feel any more potential. In traditional TASing this is exactly how the main Bookmark (storing current best playthrough of the segment) gradually moves up.</span></p>
<span class="rvts21">The ending frame of current segment is more mobile than the frame of beginning. When you define your goal (e.g. to make the X coordinate reach the value of 50) you can mark the end of current segment by setting a Marker/Bookmark to the frame where current imperfect playthrough accomplishes this goal. Then by polishing the Input you try to reach the goal (</span><span class="rvts34">X = 50</span><span class="rvts21">) at an earlier frame. And if in the process of modifying and testing a new Input you discover that the goal indeed can be reached earlier, you move the closing Marker/Bookmark up (to the frame of the improved end). After that you continue testing new approaches, searching for even better one until you don't feel any more potential. In traditional TASing this is exactly how the main Bookmark (storing current best playthrough of the segment) gradually moves up.</span></p> <p class="rvps7"><span class="rvts20">Well, sometimes you can indulge in laziness and avoid marking the end of current segment, instead you just keep the goal in mind and remember the number of the frame where the target event occurs in the best case so far. Such behavior is reasonable when the segment is very simple and you don't plan to redo it many times.</span></p>
<p class="rvps10"><span class="rvts21">Well, sometimes you can indulge in laziness and avoid marking the end of current segment, instead you just keep the goal in mind and remember the number of the frame where the target event occurs in the best case so far. Such behavior is reasonable when the segment is very simple and you don't plan to redo it many times.</span></p> <p class="rvps7"><span class="rvts20">Moreover, in many platformer games where the player character has constant running speed most of segments can be played optimally from the first try (you just have to hold the </span><span class="rvts26">Right</span><span class="rvts20"> button and maybe jump over trivial obstacles). So if you don't see any obvious mistakes and don't intend to search for hidden flaws, you may as well skip the segment shaping, just proceed to next segment right away. Such simple games are especially suitable for newbie TASers, because TASing them is very similar to casual playing through videogames using savestates (when you only revise the most obvious mistakes, like falling into a pit, and ignore non-fatal roughness).</span></p>
<p class="rvps10"><span class="rvts21">Moreover, in many platformer games where the player character has constant running speed most of segments can be played optimally from the first try (you just have to hold the </span><span class="rvts29">Right</span><span class="rvts21"> button and maybe jump over trivial obstacles). So if you don't see any obvious mistakes and don't intend to search for hidden flaws, you may as well skip the segment shaping, just proceed to next segment right away. Such simple games are especially suitable for newbie TASers, because TASing them is very similar to casual playing through videogames using savestates (when you only revise the most obvious mistakes, like falling into a pit, and ignore non-fatal roughness).</span></p> <p class="rvps7"><span class="rvts20">But in complex TASes, where the mind is occupied with many optimality factors, you shouldn't hurry. To make your thought process more precise, you'd better be perfectly aware of current segment boundaries. So mark the beginning of any difficult segment with a Marker, and mark the end by setting a Bookmark every time you find an improvement (use one and the same slot). Since it's not easy to find an improvement when dealing with difficult tasks, don't expect you'll have to re-set the Bookmark too often.</span></p>
<p class="rvps10"><span class="rvts21">But in complex TASes, where the mind is occupied with many optimality factors, you shouldn't hurry. To make your thought process more precise, you'd better be perfectly aware of current segment boundaries. So mark the beginning of any difficult segment with a Marker, and mark the end by setting a Bookmark every time you find an improvement (use one and the same slot). Since it's not easy to find an improvement when dealing with difficult tasks, don't expect you'll have to re-set the Bookmark too often.</span></p> <p class="rvps7"><span class="rvts20">When you're confident you've found perfect solution of the segment, move to the next segment. Don't remove old Markers, since they may be useful in future, in case you begin doubting the perfectness of your decisions (e.g. after finding a new trick). The logic of movie dividing will most likely remain the same even after finding the new factor (the trick).</span></p>
<p class="rvps10"><span class="rvts21">When you're confident you've found perfect solution of the segment, move to the next segment. Don't remove old Markers, since they may be useful in future, in case you begin doubting the perfectness of your decisions (e.g. after finding a new trick). The logic of movie dividing will most likely remain the same even after finding the new factor (the trick).</span></p> <p class="rvps7"><span class="rvts20">Also, if in the middle of optimization process you become confident you've found perfect Input for the first half (or a third) of current segment, you can divide the segment in two and focus on optimizing the remaining section. Such situations often rise when the initially chosen segment was too large and its logical parts naturally emerged in the process of editing the Input.</span></p>
<p class="rvps10"><span class="rvts21">Also, if in the middle of optimization process you become confident you've found perfect Input for the first half (or a third) of current segment, you can divide the segment in two and focus on optimizing the remaining section. Such situations often rise when the initially chosen segment was too large and its logical parts naturally emerged in the process of editing the Input.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">So, if you don't like to keep things organized, you can avoid Markers and Bookmarks whatsoever, working mostly in terms of fuzzy in-game concepts and imagining segments as some emotional sequences of events. Unfortunately, the data about fuzzy goals also occupies part of human working memory, and as a result you won't have enough resources to keep all optimality factors in mind. And you won't even notice how you've overlooked a multitude of possibilities.</span></p>
<p class="rvps10"><span class="rvts21">So, if you don't like to keep things organized, you can avoid Markers and Bookmarks whatsoever, working mostly in terms of fuzzy in-game concepts and imagining segments as some emotional sequences of events. Unfortunately, the data about fuzzy goals also occupies part of human working memory, and as a result you won't have enough resources to keep all optimality factors in mind. And you won't even notice how you've overlooked a multitude of possibilities.</span></p> <p class="rvps7"><span class="rvts20">On the contrary, if you like to keep an order, it's recommended to accompany Markers with text Notes, either before, or during, or after the optimization of the current segment. For example, make up a name for the segment or put a tag. This way you document the development of the TAS during actual TASing, give an objective meaning to the Input appearing in the process. This is especially useful when TASing in co-authorship. But even when working alone, you may notice the documentation from previous levels motivates you to carry on. It only takes seconds to type that kind of texts, and then it helps not to abandon the project.</span></p>
<p class="rvps10"><span class="rvts21">On the contrary, if you like to keep an order, it's recommended to accompany Markers with text Notes, either before, or during, or after the optimization of the current segment. For example, make up a name for the segment or put a tag. This way you document the development of the TAS during actual TASing, give an objective meaning to the Input appearing in the process. This is especially useful when TASing in co-authorship. But even when working alone, you may notice the documentation from previous levels motivates you to carry on. It only takes seconds to type that kind of texts, and then it helps not to abandon the project.</span></p> <p class="rvps7"><span class="rvts20">Notes also help to better unlock the potential of tricks and bugs of the game. By writing the text you actually formalize your knowledge about the described phenomenon. When the essence of the trick is kept in your mind, you may think that you already know everything about it, and that your current TAS uses the trick the best way possible. But when you construct an objective model (a verbal description of the trick) you often find its new sides.</span></p>
<p class="rvps10"><span class="rvts21">Notes also help to better unlock the potential of tricks and bugs of the game. By writing the text you actually formalize your knowledge about the described phenomenon. When the essence of the trick is kept in your mind, you may think that you already know everything about it, and that your current TAS uses the trick the best way possible. But when you construct an objective model (a verbal description of the trick) you often find its new sides.</span></p> <p class="rvps7"><span class="rvts20">It's not uncommon for TASVideos.org to see how one TASer read the description of a trick in the submission text written by another TASer and found a way to use the trick better than original author. There were also cases when author himself reads his recent submission, facepalms and urgently records an improvement.</span></p>
<p class="rvps10"><span class="rvts21">It's not uncommon for TASVideos.org to see how one TASer read the description of a trick in the submission text written by another TASer and found a way to use the trick better than original author. There were also cases when author himself reads his recent submission, facepalms and urgently records an improvement.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Making a perfect TAS can take anything from several days to several years, depending on complexity of the chosen game. Most of that time is spent on finding an ideal sequence of buttonpresses for every segment.</span></p>
<p class="rvps10"><span class="rvts21">Making a perfect TAS can take anything from several days to several years, depending on complexity of the chosen game. Most of that time is spent on finding an ideal sequence of buttonpresses for every segment.</span></p> <p class="rvps7"><span class="rvts20">Often it seems right away that current Input is already the best possible. But usually it's not so, especially if you make the conclusion judging by the external image of the emulated game instead of its internal state (Memory Watch). So it's always reasonable to suppose that current result is not perfect. If you don't see any mistakes or potential improvements at the moment, try to watch the segment together with several previous segments (e.g. watch the last half a minute of your movie), because it's possible that previous segments contain some unregistered optimality factors that have an effect on current segment. And if you still don't get any ideas, consider moving to next segment, but don't completely refuse further attempts to criticize and improve finished segments.</span></p>
<p class="rvps10"><span class="rvts21">Often it seems right away that current Input is already the best possible. But usually it's not so, especially if you make the conclusion judging by the external image of the emulated game instead of its internal state (Memory Watch). So it's always reasonable to suppose that current result is not perfect. If you don't see any mistakes or potential improvements at the moment, try to watch the segment together with several previous segments (e.g. watch the last half a minute of your movie), because it's possible that previous segments contain some unregistered optimality factors that have an effect on current segment. And if you still don't get any ideas, consider moving to next segment, but don't completely refuse further attempts to criticize and improve finished segments.</span></p> <p class="rvps7"><span class="rvts20">Rewatch the finished part of your movie from time to time either from the very beginning, or from the beginning of current level and try to notice imperfections. Taseditor allows to edit Input in any part of the movie while the movie is still playing, so you can quickly test any spontaneous idea right when it comes to your mind. If the new idea appears to be unsuccessful, just undo latest changes or load the Bookmark containing the last stable state of the movie.</span></p>
<p class="rvps10"><span class="rvts21">Rewatch the finished part of your movie from time to time either from the very beginning, or from the beginning of current level and try to notice imperfections. Taseditor allows to edit Input in any part of the movie while the movie is still playing, so you can quickly test any spontaneous idea right when it comes to your mind. If the new idea appears to be unsuccessful, just undo latest changes or load the Bookmark containing the last stable state of the movie.</span></p> <p class="rvps7"><a name="resyncing"></a><span class="rvts20">And if the new idea in fact improves you TAS, after a joyful anticipation you have to ensure that all the following segments of Input sync to the game (because implementing the idea has changed the flow of the game). Most of time it's not necessary to redo all the following Input. Usually you only have to delete or insert a few frames (thus shifting all following segments up or down), or modify several segments between the place of implementing the new idea and the nearest checkpoint (the end of current level, etc). Checkpoints usually reset many in-game properties to default value (e.g. they require you to walk over specific platform, thus equalizing the Y coordinate), so after the checkpoint you old Input will sync with new timeline of the game once you adjust it to match the flow of game events.</span></p>
<p class="rvps10"><a name="resyncing"></a> <p class="rvps7"><span class="rvts20">Anyway, even in cases when you have to redo considerable parts of the movie, resyincing is much easier than TASing from zero ground, because now you know the best approach for each segment and only have to match your previous results. And sometimes you can even excel them, because, when you're doing these forced modifications in order to resync old Input, you still possess TASer's critical thinking, so you may notice another mistake or unimplemented idea by the way.</span></p>
<span class="rvts21">And if the new idea in fact improves you TAS, after a joyful anticipation you have to ensure that all the following segments of Input sync to the game (because implementing the idea has changed the flow of the game). Most of time it's not necessary to redo all the following Input. Usually you only have to delete or insert a few frames (thus shifting all following segments up or down), or modify several segments between the place of implementing the new idea and the nearest checkpoint (the end of current level, etc). Checkpoints usually reset many in-game properties to default value (e.g. they require you to walk over specific platform, thus equalizing the Y coordinate), so after the checkpoint you old Input will sync with new timeline of the game once you adjust it to match the flow of game events.</span></p> <p class="rvps7"><span class="rvts20">Sometimes it's like a snowslide as the trouble grows, so grows the thrill of all the discoveries. Many ingenious speedrun overtakes were made because of noticing a small improvement in the middle of the movie, which then forced TASer to re-record the remaining half of the movie (in order to resync it using traditional method) and stumble upon new discoveries in the process. And then these new tricks appear to be useful in the first level of the game! Since the game has single engine, a trick that works in one level may be applied in another, where the similar conditions are met. Even if some conditions aren't met, sometimes you can create them by losing something less important... So, in the end, as the movie gets rewritten many times, the initial small improvement turns into large-scale progress.</span></p>
<p class="rvps10"><span class="rvts21">Anyway, even in cases when you have to redo considerable parts of the movie, resyincing is much easier than TASing from zero ground, because now you know the best approach for each segment and only have to match your previous results. And sometimes you can even excel them, because, when you're doing these forced modifications in order to resync old Input, you still possess TASer's critical thinking, so you may notice another mistake or unimplemented idea by the way.</span></p> <p class="rvps7"><span class="rvts20">You should learn not to feel sorry when you have to throw away results of your hard work. In TASing you're expected to reconsider even polished parts of the movie from time to time. The traditional method of TASing quickly makes you accustomed to inevitable losses of time, because any inattention or slipped finger requires you to rerecord part of current segment. Taseditor averts such minor losses, but doesn't change the fact that you have to retry new approaches after finding new optimality factors.</span></p>
<p class="rvps10"><span class="rvts21">Sometimes it's like a snowslide as the trouble grows, so grows the thrill of all the discoveries. Many ingenious speedrun overtakes were made because of noticing a small improvement in the middle of the movie, which then forced TASer to re-record the remaining half of the movie (in order to resync it using traditional method) and stumble upon new discoveries in the process. And then these new tricks appear to be useful in the first level of the game! Since the game has single engine, a trick that works in one level may be applied in another, where the similar conditions are met. Even if some conditions aren't met, sometimes you can create them by losing something less important... So, in the end, as the movie gets rewritten many times, the initial small improvement turns into large-scale progress.</span></p> <p class="rvps7"><span class="rvts20">For example, when polishing the Input near the end of World 1-3, you've suddenly found a new trick allowing you to get a mushroom, and it also appears to work in the World 1-1. Now you have to redo both 1-1, 1-3 and even 1-2, because you now play World 1-2 with big Mario. Of course, TASing the same levels second time is easier, but the fact of wasted time may dispirit you at first. Sometimes it may seem that fixing the old mistake is not worth spending additional time. At this point you'd better stop thinking too much and just choose one of the two options either immediately start fixing, or postpone it for an indefinite period (and leave the Marker with a note describing the issue). If at the end of the project you accumulate a critical mass of such postponed plans, the movie should be called a "test run" and probably also published, at least as a WIP (work in progress). Then take some considerable rest until you feel like redoing the TAS (making an improvement).</span></p>
<p class="rvps10"><span class="rvts21">You should learn not to feel sorry when you have to throw away results of your hard work. In TASing you're expected to reconsider even polished parts of the movie from time to time. The traditional method of TASing quickly makes you accustomed to inevitable losses of time, because any inattention or slipped finger requires you to rerecord part of current segment. Taseditor averts such minor losses, but doesn't change the fact that you have to retry new approaches after finding new optimality factors.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">For example, when polishing the Input near the end of World 1-3, you've suddenly found a new trick allowing you to get a mushroom, and it also appears to work in the World 1-1. Now you have to redo both 1-1, 1-3 and even 1-2, because you now play World 1-2 with big Mario. Of course, TASing the same levels second time is easier, but the fact of wasted time may dispirit you at first. Sometimes it may seem that fixing the old mistake is not worth spending additional time. At this point you'd better stop thinking too much and just choose one of the two options either immediately start fixing, or postpone it for an indefinite period (and leave the Marker with a note describing the issue). If at the end of the project you accumulate a critical mass of such postponed plans, the movie should be called a "test run" and probably also published, at least as a WIP (work in progress). Then take some considerable rest until you feel like redoing the TAS (making an improvement).</span></p> <p class="rvps7"><span class="rvts20">Despite all the difficulties, TASing can bring enjoyment both to viewers and authors. TASes are made by people who consider this kind of work to be balanced (paid off) by the excitement from intermediate and final results. In many senses TASing is similar to a special meta-videogame with a unique gameplay mechanic. And until games bring fun, people play them no matter how hardcore they are.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Despite all the difficulties, TASing can bring enjoyment both to viewers and authors. TASes are made by people who consider this kind of work to be balanced (paid off) by the excitement from intermediate and final results. In many senses TASing is similar to a special meta-videogame with a unique gameplay mechanic. And until games bring fun, people play them no matter how hardcore they are.</span></p> <p class="rvps7"><span class="rvts20">In the next chapter: </span><a class="rvts24" href="TASingMethodology.html">descriptions of Input optimization methods</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">In the next chapter: </span><a class="rvts27" href="TASingMethodology.html">descriptions of Input optimization methods</a><span class="rvts21">.</span></p> <div class="rvps7">
<p class="rvps10"><span class="rvts21"><br/></span></p> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <tr valign="top">
<tr valign="top"> <td style="border-color: #000000; border-style: solid; padding: 6px;">
<td style="border-color: #000000; border-style: solid;"><p class="rvps10"><span class="rvts25">PRACTICE: </span><span class="rvts21">Watch the imperfect playthrough of the 1st level that you made in previous chapter, and divide it into segments using Markers and your own discretion. If the movie is rather long, no need to structure it all, you just have to feel the principles.</span></p> <p class="rvps7"><span class="rvts22">PRACTICE: </span><span class="rvts20">Watch the imperfect playthrough of the 1st level that you made in previous chapter, and divide it into segments using Markers and your own discretion. If the movie is rather long, no need to structure it all, you just have to feel the principles.</span></p>
<p class="rvps10"><span class="rvts25">Estimated time: </span><span class="rvts21">5-10 minutes.</span></p> <p class="rvps7"><span class="rvts22">Estimated time: </span><span class="rvts20">5-10 minutes.</span></p>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/help-authoring-tool">Free help authoring environment</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/feature-tour/iphone-website-generation">Create iPhone web-based documentation</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,135 +1,344 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>Title</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>Title</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="Title">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="Title" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("Title"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>Title</h1>
</div>
<div id="topic_header_nav">
<a href="BeginnersGuide.html"><img src="img/arrow_right.png" alt="Next"/></a>
</div> <div id="skip-link">
<div class="clear"></div> <a href="#main-content" class="element-invisible">Skip to main content</a>
</div> </div>
<div id="topic_content">
<header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</header>
<nav id="panel-left" class="md-nav-expanded">
<!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="Title"
data-hnd-context="0"
data-hnd-title="Title"
>
<div class="navigation">
<ol class="breadcrumb">
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="BeginnersGuide.html" title="Beginner's Guide" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Title</h2>
<div class="main-content">
<p></p> <p></p>
<p class="rvps5"><span class="rvts6"><br/></span></p> <p class="rvps3"><span class="rvts6"><br/></span></p>
<p class="rvps5"><span class="rvts6"><br/></span></p> <p class="rvps3"><span class="rvts6"><br/></span></p>
<p class="rvps4"><span class="rvts8">TAS Editor 1.01</span></p> <p class="rvps3"><span class="rvts8">TAS Editor 1.01</span></p>
<p class="rvps1"><span class="rvts9"><br/></span></p> <p class="rvps3"><span class="rvts9"><br/></span></p>
<p class="rvps1"><span class="rvts9"><br/></span></p> <p class="rvps3"><span class="rvts9"><br/></span></p>
<p class="rvps1"><span class="rvts9">Welcome to the TAS Editor Manual!</span></p> <p class="rvps3"><span class="rvts9">Welcome to the TAS Editor Manual!</span></p>
<p class="rvps1"><span class="rvts9"><br/></span></p> <p class="rvps3"><span class="rvts9"><br/></span></p>
<div class="rvps1"><table width="90%" border="0" cellpadding="0" cellspacing="0" style="border-width: 0px;"> <div class="rvps3">
<tr valign="top"> <table width="90%" border="0" cellpadding="0" cellspacing="0" style="border-width: 0px; border-spacing: 0px; margin: 0px auto;">
<td><p class="rvps1"><span class="rvts9">Taseditor is an Integrated development environment dedicated to TASing.</span></p> <tr valign="top">
<p class="rvps1"><span class="rvts9">Playing videogames in Taseditor resembles both interactive programming and drawing notes by mouse in a music editor.</span></p> <td style="padding: 0px;">
</td> <p class="rvps3"><span class="rvts9">Taseditor is an Integrated development environment dedicated to TASing.</span></p>
</tr> <p class="rvps3"><span class="rvts9">Playing videogames in Taseditor resembles both interactive programming and drawing notes by mouse in a music editor.</span></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps4"><span class="rvts6"><br/></span></p> <p class="rvps3"><span class="rvts6"><br/></span></p>
<div class="rvps4"><table width="700" border="1" cellpadding="8" cellspacing="0" style="border-color: #000000; border-style: solid;"> <div class="rvps3">
<tr valign="bottom"> <table width="700" border="1" cellpadding="8" cellspacing="0" style="border-color: #000000; border-style: solid; border-spacing: 0px; margin: 0px auto;">
<td style="border-color: #000000; border-style: solid; border-bottom: none; background-color: #ffe5e3; width: 32%; height: 20px;"><p class="rvps6"><a class="rvts15" href="BeginnersGuide.html">Beginner's Guide</a></p> <tr valign="bottom">
</td> <td width="32%" height="36" style="border-color: #000000; border-style: solid; padding: 8px; border-bottom: none; background-color: #ffe5e3;">
<td style="border-color: #000000; border-style: solid; border-bottom: none; background-color: #d9ffdd; width: 32%; height: 20px;"><p class="rvps6"><a class="rvts15" href="Reference.html">Reference</a></p> <p class="rvps4"><a class="rvts14" href="BeginnersGuide.html">Beginner's Guide</a></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-bottom: none; background-color: #d0ffff; width: 30%; height: 20px;"><p class="rvps6"><a class="rvts16" href="TASEditorInside.html">TAS Editor Inside</a></p> <td width="32%" height="36" style="border-color: #000000; border-style: solid; padding: 8px; border-bottom: none; background-color: #d9ffdd;">
</td> <p class="rvps4"><a class="rvts14" href="Reference.html">Reference</a></p>
</tr> </td>
<tr valign="top"> <td width="30%" height="36" style="border-color: #000000; border-style: solid; padding: 8px; border-bottom: none; background-color: #d0ffff;">
<td style="border-color: #000000; border-style: solid; border-top: none; border-bottom: none; background-color: #ffe5e3; width: 32%; height: 38px;"><p class="rvps5"><span class="rvts14">If you're seeing the Manual for the first time, please study this whole course</span></p> <p class="rvps4"><a class="rvts15" href="TASEditorInside.html">TAS Editor Inside</a></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-top: none; border-bottom: none; background-color: #d9ffdd; width: 32%; height: 38px;"><p class="rvps5"><span class="rvts14">Look here when you need to know comprehensive specifications about limits and possibilities of TAS Editor</span></p> </tr>
</td> <tr valign="top">
<td style="border-color: #000000; border-style: solid; border-top: none; border-bottom: none; background-color: #d0ffff; width: 30%; height: 38px;"><p class="rvps5"><span class="rvts14">Read these docs when you wish to learn details of the system</span></p> <td width="32%" height="54" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; border-bottom: none; background-color: #ffe5e3;">
</td> <p class="rvps3"><span class="rvts13">If you're seeing the Manual for the first time, please study this whole course</span></p>
</tr> </td>
<tr valign="top"> <td width="32%" height="54" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; border-bottom: none; background-color: #d9ffdd;">
<td style="border-color: #000000; border-style: solid; border-top: none; background-color: #ffe5e3; width: 32%; height: 163px;"><p class="rvps7"><a class="rvts12" href="Introduction.html">Introduction</a></p> <p class="rvps3"><span class="rvts13">Look here when you need to know comprehensive specifications about limits and possibilities of TAS Editor</span></p>
<p class="rvps7"><a class="rvts12" href="ProgramInterface.html">Program Interface</a></p> </td>
<p class="rvps7"><a class="rvts13" href="TASingProcess.html">TASing Process</a></p> <td width="30%" height="54" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; border-bottom: none; background-color: #d0ffff;">
<p class="rvps7"><a class="rvts13" href="TASingMethodology.html">TASing Methodology</a></p> <p class="rvps3"><span class="rvts13">Read these docs when you wish to learn details of the system</span></p>
<p class="rvps7"><a class="rvts13" href="ProgramCustomization.html">Program Customization</a></p> </td>
<p class="rvps7"><a class="rvts13" href="AdvancedFeatures.html">Advanced Features</a></p> </tr>
</td> <tr valign="top">
<td style="border-color: #000000; border-style: solid; border-top: none; background-color: #d9ffdd; width: 32%; height: 163px;"><p class="rvps7"><a class="rvts13" href="Glossary.html">Glossary</a></p> <td width="32%" height="179" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; background-color: #ffe5e3;">
<p class="rvps7"><a class="rvts13" href="Controls.html">Controls</a></p> <p class="rvps5"><a class="rvts11" href="Introduction.html">Introduction</a></p>
<p class="rvps7"><a class="rvts13" href="Navigation.html">Navigation</a></p> <p class="rvps5"><a class="rvts11" href="ProgramInterface.html">Program Interface</a></p>
<p class="rvps7"><a class="rvts13" href="Operations.html">Operations</a></p> <p class="rvps5"><a class="rvts12" href="TASingProcess.html">TASing Process</a></p>
<p class="rvps7"><a class="rvts13" href="LuaAPI.html">Lua API</a></p> <p class="rvps5"><a class="rvts12" href="TASingMethodology.html">TASing Methodology</a></p>
<p class="rvps7"><a class="rvts13" href="FAQ.html">FAQ</a></p> <p class="rvps5"><a class="rvts12" href="ProgramCustomization.html">Program Customization</a></p>
<p class="rvps7"><a class="rvts13" href="SpeedrunningSynopsis.html">Speedrunning Synopsis</a></p> <p class="rvps5"><a class="rvts12" href="AdvancedFeatures.html">Advanced Features</a></p>
</td> </td>
<td style="border-color: #000000; border-style: solid; border-top: none; background-color: #d0ffff; width: 30%; height: 163px;"><p class="rvps7"><a class="rvts13" href="Ideas.html">Ideas</a></p> <td width="32%" height="179" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; background-color: #d9ffdd;">
<p class="rvps7"><a class="rvts13" href="Implementation.html">Implementation</a></p> <p class="rvps5"><a class="rvts12" href="Glossary.html">Glossary</a></p>
<p class="rvps7"><a class="rvts13" href="MistakeProofing.html">Mistake-proofing</a></p> <p class="rvps5"><a class="rvts12" href="Controls.html">Controls</a></p>
<p class="rvps7"><a class="rvts13" href="FM3format.html">FM3 format</a></p> <p class="rvps5"><a class="rvts12" href="Navigation.html">Navigation</a></p>
</td> <p class="rvps5"><a class="rvts12" href="Operations.html">Operations</a></p>
</tr> <p class="rvps5"><a class="rvts12" href="LuaAPI.html">Lua API</a></p>
<p class="rvps5"><a class="rvts12" href="FAQ.html">FAQ</a></p>
<p class="rvps5"><a class="rvts12" href="SpeedrunningSynopsis.html">Speedrunning Synopsis</a></p>
</td>
<td width="30%" height="179" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; background-color: #d0ffff;">
<p class="rvps5"><a class="rvts12" href="Ideas.html">Ideas</a></p>
<p class="rvps5"><a class="rvts12" href="Implementation.html">Implementation</a></p>
<p class="rvps5"><a class="rvts12" href="MistakeProofing.html">Mistake-proofing</a></p>
<p class="rvps5"><a class="rvts12" href="FM3format.html">FM3 format</a></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps4"><span class="rvts6"><br/></span></p>
<p class="rvps4"><span class="rvts6"><br/></span></p>
<p class="rvps4"><span class="rvts6"><br/></span></p>
<p class="rvps3"><span class="rvts6">Author of TAS Editor v1.01: AnS</span></p>
<p class="rvps3"><span class="rvts6">Assistance in testing: feos</span></p>
<p class="rvps3"><span class="rvts6"><br/></span></p>
<p class="rvps3"><span class="rvts6">Author of this Manual: AnS</span></p>
<p class="rvps3"><span class="rvts6">English translation: AnS, feos</span></p>
<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 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 class="rvps3"><span class="rvts6"><br/></span></p> <p class="rvps3"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">Author of TAS Editor v1.01: AnS</span></p>
<p class="rvps2"><span class="rvts6">Assistance in testing: feos</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">Author of this Manual: AnS</span></p>
<p class="rvps2"><span class="rvts6">English translation: AnS, feos</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com">Free HTML Help documentation generator</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com">Free PDF documentation generator</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,278 +1,465 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>2.2. Toolbox</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>2.2. Toolbox</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="2.2. Toolbox">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="2.2. Toolbox" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("Toolbox"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>2.2. Toolbox</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; <a href="ProgramInterface.html">2. Program Interface</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="ProgramInterface.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="PianoRoll.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="TASingProcess.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="Toolbox"
data-hnd-context="7"
data-hnd-title="2.2. Toolbox"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li><li><a href="ProgramInterface.html">2. Program Interface</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="ProgramInterface.html" title="2. Program Interface" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="PianoRoll.html" title="2.1. Piano Roll" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="TASingProcess.html" title="3. TASing Process" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>2.2. Toolbox</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Toolbox</span></p> <p class="rvps2"><span class="rvts18">Toolbox</span></p>
<p class="rvps5"><span class="rvts36"><br/></span></p> <p class="rvps3"><span class="rvts20"><br/></span></p>
<p class="rvps5"><img alt="" style="padding : 1px;" src="lib/taseditor-smb.png"/></p> <p class="rvps3"><img alt="" style="padding : 1px;" src="lib/taseditor-smb.png"></p>
<p class="rvps21"><span class="rvts21"><br/></span></p> <p class="rvps13"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The Toolbox consists of 7 sections:</span></p> <p class="rvps7"><span class="rvts20">The Toolbox consists of 7 sections:</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps14"><a class="rvts38" href="Toolbox.html#playback">Playback</a></li> <li class="rvps9"><a class="rvts34" href="Toolbox.html#playback">Playback</a></li>
<li class="rvps14"><a class="rvts38" href="Toolbox.html#recorder">Recorder</a></li> <li class="rvps9"><a class="rvts34" href="Toolbox.html#recorder">Recorder</a></li>
<li class="rvps14"><a class="rvts38" href="Toolbox.html#splicer">Splicer</a></li> <li class="rvps9"><a class="rvts34" href="Toolbox.html#splicer">Splicer</a></li>
<li class="rvps14"><a class="rvts38" href="Toolbox.html#lua">Lua</a></li> <li class="rvps9"><a class="rvts34" href="Toolbox.html#lua">Lua</a></li>
<li class="rvps14"><a class="rvts38" href="Toolbox.html#bookmarks">Bookmarks</a></li> <li class="rvps9"><a class="rvts34" href="Toolbox.html#bookmarks">Bookmarks</a></li>
<li class="rvps14"><a class="rvts38" href="Toolbox.html#history">History</a></li> <li class="rvps9"><a class="rvts34" href="Toolbox.html#history">History</a></li>
<li class="rvps14"><a class="rvts38" href="Toolbox.html#selection">Selection cursor navigation buttons</a></li> <li class="rvps9"><a class="rvts34" href="Toolbox.html#selection">Selection cursor navigation buttons</a></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps2"><a name="playback"></a> <p class="rvps2"><a name="playback"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-playback.png"></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-playback.png"/></p> <p class="rvps7"><span class="rvts20">The top section is allotted to the Playback controls. The </span><span class="rvts22">Playback</span><span class="rvts20"> is the component of Taseditor dedicated to handle game emulation: keep it paused, replay in any direction, rewind to desired frame and so on. It allows to treat video games as straightforwardly as if they were regular video recordings, disregarding the interactivity element inherent to them.</span></p>
<p class="rvps10"><span class="rvts21">The top section is allotted to the Playback controls. The </span><span class="rvts25">Playback</span><span class="rvts21"> is the component of Taseditor dedicated to handle game emulation: keep it paused, replay in any direction, rewind to desired frame and so on. It allows to treat video games as straightforwardly as if they were regular video recordings, disregarding the interactivity element inherent to them.</span></p> <p class="rvps7"><span class="rvts20">There are 5 buttons at the top of the window.</span></p>
<p class="rvps10"><span class="rvts21">There are 5 buttons at the top of the window.</span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts26">||</span><span class="rvts20">" button (pause/resume) is simple graphical analog of the </span><span class="rvts23">Pause Emulation</span><span class="rvts20"> hotkey. When you click it, the game emulation either pauses or resumes. However, if your mouse has a middle button, it's easier to press it instead of clicking the "</span><span class="rvts26">||</span><span class="rvts20">" button, in this case you won't need to move the mouse cursor to the Playback section.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts29">||</span><span class="rvts21">" button (pause/resume) is simple graphical analog of the </span><span class="rvts26">Pause Emulation</span><span class="rvts21"> hotkey. When you click it, the game emulation either pauses or resumes. However, if your mouse has a middle button, it's easier to press it instead of clicking the "</span><span class="rvts29">||</span><span class="rvts21">" button, in this case you won't need to move the mouse cursor to the Playback section.</span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts26">&gt;</span><span class="rvts20">" button (step forward / advance 1 frame) moves the light-blue cursor 1 frame down, forcing FCEUX to emulate one frame if necessary. You can either click that button or click and hold it to make several steps forward. This button's keyboard analog is </span><span class="rvts27">Shift + Down</span><span class="rvts20">. If your mouse has a wheel, it's easier to hold the right mouse button and scroll the wheel 1 step down instead of using the "</span><span class="rvts26">&gt;</span><span class="rvts20">" button.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts29">&gt;</span><span class="rvts21">" button (step forward / advance 1 frame) moves the light-blue cursor 1 frame down, forcing FCEUX to emulate one frame if necessary. You can either click that button or click and hold it to make several steps forward. This button's keyboard analog is </span><span class="rvts30">Shift + Down</span><span class="rvts21">. If your mouse has a wheel, it's easier to hold the right mouse button and scroll the wheel 1 step down instead of using the "</span><span class="rvts29">&gt;</span><span class="rvts21">" button.</span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts26">&lt;</span><span class="rvts20">" button (step back / rewind 1 frame) moves the Playback cursor 1 frame up, displaying the previous frame's events in the FCEUX window. You can hold the button as well, when you wish to go several frames back. This button has its hotkey </span><span class="rvts23">Frame Rewind</span><span class="rvts20"> (mapped to </span><span class="rvts23">Backspace</span><span class="rvts20"> key by default), and has a keyboard analog: </span><span class="rvts27">Shift + Up</span><span class="rvts20">. If your mouse has a wheel, it's easier to hold the right mouse button and scroll the wheel 1 step up instead of using "</span><span class="rvts26">&lt;</span><span class="rvts20">" button.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts29">&lt;</span><span class="rvts21">" button (step back / rewind 1 frame) moves the Playback cursor 1 frame up, displaying the previous frame's events in the FCEUX window. You can hold the button as well, when you wish to go several frames back. This button has its hotkey </span><span class="rvts26">Frame Rewind</span><span class="rvts21"> (mapped to </span><span class="rvts26">Backspace</span><span class="rvts21"> key by default), and has a keyboard analog: </span><span class="rvts30">Shift + Up</span><span class="rvts21">. If your mouse has a wheel, it's easier to hold the right mouse button and scroll the wheel 1 step up instead of using "</span><span class="rvts29">&lt;</span><span class="rvts21">" button.</span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts26">&lt;&lt;</span><span class="rvts20">" button (fast rewind) also moves the Playback cursor back, just not by 1 frame but by multiple frames at once. This button moves the light-blue cursor to the frame where the nearest upper Marker is located. In the above picture, if you press the "</span><span class="rvts26">&lt;&lt;</span><span class="rvts20">", the light-blue cursor will jump to frame 12 (where the Marker 1 is set). Using this button you may quickly go back to the beginning of the edited segment or to any other past moment of the movie. The keyboard analog for this button is </span><span class="rvts27">Shift + Page Up</span><span class="rvts20">. You can also hold it the light-blue cursor will rapidly jump on Markers up in the Piano Roll, and in the meantime you can look for the desired fragment of the movie by watching FCEUX screen.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts29">&lt;&lt;</span><span class="rvts21">" button (fast rewind) also moves the Playback cursor back, just not by 1 frame but by multiple frames at once. This button moves the light-blue cursor to the frame where the nearest upper Marker is located. In the above picture, if you press the "</span><span class="rvts29">&lt;&lt;</span><span class="rvts21">", the light-blue cursor will jump to frame 12 (where the Marker 1 is set). Using this button you may quickly go back to the beginning of the edited segment or to any other past moment of the movie. The keyboard analog for this button is </span><span class="rvts30">Shift + Page Up</span><span class="rvts21">. You can also hold it the light-blue cursor will rapidly jump on Markers up in the Piano Roll, and in the meantime you can look for the desired fragment of the movie by watching FCEUX screen.</span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts26">&gt;&gt;</span><span class="rvts20">" button (fast forward) jumps on Markers forward. In the above picture, if you press the "</span><span class="rvts26">&gt;&gt;</span><span class="rvts20">", the light-blue cursor will jump to frame 22 (where the Marker 2 is located). With this button you can rapidly skip to the game events forward in the movie. But in case the next Marker is out of the Greenzone range, emulator would need some time to process the unknown frames, so such jump may take some time. This button's keyboard analog is </span><span class="rvts27">Shift + Page Down</span><span class="rvts20">. You can click and hold this button as well.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts29">&gt;&gt;</span><span class="rvts21">" button (fast forward) jumps on Markers forward. In the above picture, if you press the "</span><span class="rvts29">&gt;&gt;</span><span class="rvts21">", the light-blue cursor will jump to frame 22 (where the Marker 2 is located). With this button you can rapidly skip to the game events forward in the movie. But in case the next Marker is out of the Greenzone range, emulator would need some time to process the unknown frames, so such jump may take some time. This button's keyboard analog is </span><span class="rvts30">Shift + Page Down</span><span class="rvts21">. You can click and hold this button as well.</span></p> <p class="rvps7"><span class="rvts20">As an experiment, try to make a test movie of about 1000 frames in size and set a dozen of Markers, one per every 30-50 frames. Then hold </span><span class="rvts27">Shift</span><span class="rvts20"> and tap some </span><span class="rvts22">Page Up</span><span class="rvts20"> / </span><span class="rvts22">Page Down</span><span class="rvts20"> keys to feel the convenience of the fast scrolling. Alternatively you can roll the mouse wheel while holding the </span><span class="rvts27">Shift</span><span class="rvts20"> key.</span></p>
<p class="rvps10"><span class="rvts21">As an experiment, try to make a test movie of about 1000 frames in size and set a dozen of Markers, one per every 30-50 frames. Then hold </span><span class="rvts30">Shift</span><span class="rvts21"> and tap some </span><span class="rvts25">Page Up</span><span class="rvts21"> / </span><span class="rvts25">Page Down</span><span class="rvts21"> keys to feel the convenience of the fast scrolling. Alternatively you can roll the mouse wheel while holding the </span><span class="rvts30">Shift</span><span class="rvts21"> key.</span></p> <p class="rvps7"><a name="progressbar"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="progressbar"></a> <p class="rvps7"><span class="rvts20">Below these 5 buttons you can see a progress bar and three checkboxes.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The </span><span class="rvts22">Progress bar</span><span class="rvts20"> helps to estimate the time needed for Playback seeking. Immediate jumps to any frame are only possible after FCEUX emulated the game up to the target frame by applying your movie as a game Input to get the actual game state for the frame. After the actual game state was rendered at least once, it is saved into the Greenzone, so next time the emulator can instantly jump to that frame, granted that Input above the frame didn't change. If the Input was changed, a new emulation attempt is required, because even the smallest change in buttonpresses may cause serious changes in the gameplay chronology. Thus after every such change the Greenzone is automatically truncated, removing the data of all those frames that might be affected by the new Input. These frames must be emulated again, and it takes some time.</span></p>
<p class="rvps10"><span class="rvts21">Below these 5 buttons you can see a progress bar and three checkboxes.</span></p> <p class="rvps7"><span class="rvts20">So, when you send the Playback cursor to a frame far from the Greenzone, instead of immediate jump the light-blue cursor starts </span><span class="rvts33">seeking</span><span class="rvts20"> to that frame. A shadow of the light-blue cursor will be blinking at the target line of the Piano Roll, and the game images on the FCEUX screen will rapidly change as the Playback cursor runs to the target.</span></p>
<p class="rvps10"><span class="rvts21">The </span><span class="rvts25">Progress bar</span><span class="rvts21"> helps to estimate the time needed for Playback seeking. Immediate jumps to any frame are only possible after FCEUX emulated the game up to the target frame by applying your movie as a game Input to get the actual game state for the frame. After the actual game state was rendered at least once, it is saved into the Greenzone, so next time the emulator can instantly jump to that frame, granted that Input above the frame didn't change. If the Input was changed, a new emulation attempt is required, because even the smallest change in buttonpresses may cause serious changes in the gameplay chronology. Thus after every such change the Greenzone is automatically truncated, removing the data of all those frames that might be affected by the new Input. These frames must be emulated again, and it takes some time.</span></p> <p class="rvps7"><span class="rvts20">In this case you'll have to wait. The seek time depends on the distance between the target frame and the end of the Greenzone, on your computer power and a few other factors. The progress bar helps to estimate the waiting time. If you don't want to wait, left-click on the progress bar (in addition to being an indicator, it's also a button) or use the </span><span class="rvts23">Cancel Seeking</span><span class="rvts20"> hotkey (</span><span class="rvts23">Esc</span><span class="rvts20"> by default). Then the target frame will quit blinking, the light-blue cursor will stop and the emulation will be paused.</span></p>
<p class="rvps10"><span class="rvts21">So, when you send the Playback cursor to a frame far from the Greenzone, instead of immediate jump the light-blue cursor starts </span><span class="rvts37">seeking</span><span class="rvts21"> to that frame. A shadow of the light-blue cursor will be blinking at the target line of the Piano Roll, and the game images on the FCEUX screen will rapidly change as the Playback cursor runs to the target.</span></p> <p class="rvps7"><span class="rvts20">While Playback is seeking you may change the target by clicking on the desired frame row in the icons column of the Piano Roll. If you pause the emulator during seeking, the light-blue cursor will freeze and the target frame blinking will slow down, but the seeking won't be cancelled when you unpause, the Playback cursor will continue running to the target and stop automatically after hitting it.</span></p>
<p class="rvps10"><span class="rvts21">In this case you'll have to wait. The seek time depends on the distance between the target frame and the end of the Greenzone, on your computer power and a few other factors. The progress bar helps to estimate the waiting time. If you don't want to wait, left-click on the progress bar (in addition to being an indicator, it's also a button) or use the </span><span class="rvts26">Cancel Seeking</span><span class="rvts21"> hotkey (</span><span class="rvts26">Esc</span><span class="rvts21"> by default). Then the target frame will quit blinking, the light-blue cursor will stop and the emulation will be paused.</span></p> <p class="rvps7"><span class="rvts20">This Progress bar is also used when loading and saving Taseditor project files to disk.</span></p>
<p class="rvps10"><span class="rvts21">While Playback is seeking you may change the target by clicking on the desired frame row in the icons column of the Piano Roll. If you pause the emulator during seeking, the light-blue cursor will freeze and the target frame blinking will slow down, but the seeking won't be cancelled when you unpause, the Playback cursor will continue running to the target and stop automatically after hitting it.</span></p> <p class="rvps7"><a name="turbo-seek"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">This Progress bar is also used when loading and saving Taseditor project files to disk.</span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts22">Turbo seek</span><span class="rvts20">" checkbox allows to change the seeking speed. When the Turbo is on, FCEUX emulates the game on the highest speed possible, reducing the seeking time tenfold. So, if you seek to a distant frame, check that option. But during the TASing process its often necessary to see all the intermediate frames, not just the last one. In such cases you should uncheck the checkbox and maybe even slow down the emulation with the </span><span class="rvts23">-</span><span class="rvts20"> and </span><span class="rvts23">=</span><span class="rvts20"> hotkeys to ensure you're not missing any important detail of the gameplay.</span></p>
<p class="rvps10"><a name="turbo-seek"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts22">Follow cursor</span><span class="rvts20">" checkbox forces the Piano Roll to follow the movement of the Playback cursor and autoscroll the view so that the light-blue cursor is always visible. This allows you to observe the Input played back when the emulator is unpaused. But when you edit the movie you should uncheck this option to prevent the Piano Roll from running away from the edited spot.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts25">Turbo seek</span><span class="rvts21">" checkbox allows to change the seeking speed. When the Turbo is on, FCEUX emulates the game on the highest speed possible, reducing the seeking time tenfold. So, if you seek to a distant frame, check that option. But during the TASing process its often necessary to see all the intermediate frames, not just the last one. In such cases you should uncheck the checkbox and maybe even slow down the emulation with the </span><span class="rvts26">-</span><span class="rvts21"> and </span><span class="rvts26">=</span><span class="rvts21"> hotkeys to ensure you're not missing any important detail of the gameplay.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts22">Auto-restore last position</span><span class="rvts20">" checkbox makes the Playback automatically start seeking when the Playback cursor was moved back by the Greenzone. Every time you change an Input, the Greenzone is truncated after the first changed frame, forgetting old events that became irrelevant after that change. The Playback cursor must always be inside the Greenzone, so it steps back along with it. With the auto-restore checkbox you can instantly see new events on these frames. When the checkbox is checked, any Input modification triggers the replaying of the changed segment, helping you to compare different scenarios of the game events.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts25">Follow cursor</span><span class="rvts21">" checkbox forces the Piano Roll to follow the movement of the Playback cursor and autoscroll the view so that the light-blue cursor is always visible. This allows you to observe the Input played back when the emulator is unpaused. But when you edit the movie you should uncheck this option to prevent the Piano Roll from running away from the edited spot.</span></p> <p class="rvps7"><span class="rvts20">Thanks to auto-restore, TASers can focus on Input editing and rapidly go over many approaches to playing current segment of the movie. This method of TASing will be described later.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts25">Auto-restore last position</span><span class="rvts21">" checkbox makes the Playback automatically start seeking when the Playback cursor was moved back by the Greenzone. Every time you change an Input, the Greenzone is truncated after the first changed frame, forgetting old events that became irrelevant after that change. The Playback cursor must always be inside the Greenzone, so it steps back along with it. With the auto-restore checkbox you can instantly see new events on these frames. When the checkbox is checked, any Input modification triggers the replaying of the changed segment, helping you to compare different scenarios of the game events.</span></p> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21">Thanks to auto-restore, TASers can focus on Input editing and rapidly go over many approaches to playing current segment of the movie. This method of TASing will be described later.</span></p> <p class="rvps2"><a name="recorder"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-recorder.png"></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <p class="rvps7"><span class="rvts20">Below the Playback you can find the Recorder section. The </span><span class="rvts22">Recorder </span><span class="rvts20">is used to record buttons Input from keyboard (or gamepad) into the movie, just like in regular playing using any emulator.</span></p>
<p class="rvps2"><a name="recorder"></a> <p class="rvps7"><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts22">Recording</span><span class="rvts20">" checkbox turns the Recording mode on and off. Before you start recording any physical keypresses, make sure the Playback cursor is on the frame you want to record from. Then either press the "</span><span class="rvts23">Toggle Read-only</span><span class="rvts20">" hotkey (</span><span class="rvts23">Q</span><span class="rvts20"> key by default), or click the Recording checkbox. The word "Recording" will appear in the TAS Editor window caption, and the message "Movie is now Read+Write" will appear on the FCEUX screen. Now you can either unpause the emulator and play the game normally, or type the buttons frame-by-frame using the </span><span class="rvts23">Frame Advance</span><span class="rvts20"> hotkey. As the playback goes forward, the movie will fill with the data on the buttons you press.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-recorder.png"/></p> <p class="rvps7"><span class="rvts20">You may rerecord the same segment of the movie multiple times, overwriting the old button log with new buttonpresses data. If you don't like how a segment was played (e.g. the character fell into a pit), put the Playback cursor before the frame where you made wrong buttonpresses (e.g. the </span><span class="rvts26">A</span><span class="rvts20"> button was pressed too late) and resume Recording, this time pressing buttons properly.</span></p>
<p class="rvps10"><span class="rvts21">Below the Playback you can find the Recorder section. The </span><span class="rvts25">Recorder </span><span class="rvts21">is used to record buttons Input from keyboard (or gamepad) into the movie, just like in regular playing using any emulator.</span></p> <p class="rvps7"><span class="rvts20">When the segment is ready, turn the Recording mode off to prevent accidental erasing of the Input when replaying the movie. Uncheck the checkbox by mouse click or via the hotkey. When TASing in Taseditor, the Recording checkbox is usually unchecked, because direct Input editing is preferred to Recording.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">It's recommended to rationally combine the Recorder features with those of the Piano Roll. For long and easy segments of the game it may be convenient to record buttonpresses from the keyboard or a handy USB-gamepad, but for small dislocated edits the mouse is way better.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts25">Recording</span><span class="rvts21">" checkbox turns the Recording mode on and off. Before you start recording any physical keypresses, make sure the Playback cursor is on the frame you want to record from. Then either press the "</span><span class="rvts26">Toggle Read-only</span><span class="rvts21">" hotkey (</span><span class="rvts26">Q</span><span class="rvts21"> key by default), or click the Recording checkbox. The word "Recording" will appear in the TAS Editor window caption, and the message "Movie is now Read+Write" will appear on the FCEUX screen. Now you can either unpause the emulator and play the game normally, or type the buttons frame-by-frame using the </span><span class="rvts26">Frame Advance</span><span class="rvts21"> hotkey. As the playback goes forward, the movie will fill with the data on the buttons you press.</span></p> <p class="rvps7"><a name="superimpose"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">You may rerecord the same segment of the movie multiple times, overwriting the old button log with new buttonpresses data. If you don't like how a segment was played (e.g. the character fell into a pit), put the Playback cursor before the frame where you made wrong buttonpresses (e.g. the </span><span class="rvts29">A</span><span class="rvts21"> button was pressed too late) and resume Recording, this time pressing buttons properly.</span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts22">Superimpose</span><span class="rvts20">" checkbox in the Recorder section allows to combine the existing Input with the newly recorded data on the same segment of the movie. For example, you can draw the </span><span class="rvts26">R</span><span class="rvts20"> buttonpresses on rather long segment with a single mouse stroke, to make the character run right. Then you can enable the "Superimpose" option, turn on Recording and play the game by pressing only jump and shoot buttons, without the need to hold </span><span class="rvts26">Right</span><span class="rvts20">. The character in the game will still run right, jumping and shooting on command.</span></p>
<p class="rvps10"><span class="rvts21">When the segment is ready, turn the Recording mode off to prevent accidental erasing of the Input when replaying the movie. Uncheck the checkbox by mouse click or via the hotkey. When TASing in Taseditor, the Recording checkbox is usually unchecked, because direct Input editing is preferred to Recording.</span></p> <p class="rvps7"><span class="rvts20">Unlike other checkboxes, the "Superimpose" option has three possible states. In addition to "enabled" and "disabled" it can also be in an interim state between these two. The third state works like this: when the player presses some gamepad buttons during Recording, these buttons are recorded in place of old Input. But if the player presses no buttons during Recording, the old Input on these frames is not overwritten.</span></p>
<p class="rvps10"><span class="rvts21">It's recommended to rationally combine the Recorder features with those of the Piano Roll. For long and easy segments of the game it may be convenient to record buttonpresses from the keyboard or a handy USB-gamepad, but for small dislocated edits the mouse is way better.</span></p> <p class="rvps7"><a name="UsePattern"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="superimpose"></a> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts22">Use pattern</span><span class="rvts20">" checkbox applies current pattern to the process of buttons Recording. The name of the current pattern can be seen in the upper right corner of TAS Editor window (the last item of the main menu). If you click this menu item, a pop-down menu will appear, allowing you to choose another pattern from the list.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Patterns are used to speed up the process of entering monotonous buttonpresses and releases. For example, when you need to shoot at maximum rate (that is, alternate 1 frame of pressing </span><span class="rvts26">B</span><span class="rvts20"> and 1 frame when </span><span class="rvts26">B</span><span class="rvts20"> is released), you can just choose the "</span><span class="rvts33">Alternating (1010...)</span><span class="rvts20">" pattern and hold the </span><span class="rvts26">B</span><span class="rvts20"> button without caring about manual mashing. Thanks to the pattern, the </span><span class="rvts26">B</span><span class="rvts20"> buttonpresses will be recorded only for every other frame.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts25">Superimpose</span><span class="rvts21">" checkbox in the Recorder section allows to combine the existing Input with the newly recorded data on the same segment of the movie. For example, you can draw the </span><span class="rvts29">R</span><span class="rvts21"> buttonpresses on rather long segment with a single mouse stroke, to make the character run right. Then you can enable the "Superimpose" option, turn on Recording and play the game by pressing only jump and shoot buttons, without the need to hold </span><span class="rvts29">Right</span><span class="rvts21">. The character in the game will still run right, jumping and shooting on command.</span></p> <p class="rvps7"><a name="multitracking"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Unlike other checkboxes, the "Superimpose" option has three possible states. In addition to "enabled" and "disabled" it can also be in an interim state between these two. The third state works like this: when the player presses some gamepad buttons during Recording, these buttons are recorded in place of old Input. But if the player presses no buttons during Recording, the old Input on these frames is not overwritten.</span></p> <p class="rvps7"><span class="rvts20">Besides the checkboxes the Recorder section also contains radio buttons that implement the </span><span class="rvts22">multitracking</span><span class="rvts20"> feature.</span></p>
<p class="rvps10"><a name="UsePattern"></a> <p class="rvps7"><span class="rvts22">Multitrack Recording</span><span class="rvts20"> greatly simplifies the traditional method of TASing games made for 2 or more players. Instead of pressing buttons of both gamepads at once, you can record a short segment of controlling the Player 1 and then record actions of Player 2 on the same segment of the movie.</span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">By default the Recorder is set to recording "All" pads. You can choose a single pad by clicking the respective radio button ("1P", "2P", etc the number of available gamepads depends on your project type). You can also use the "</span><span class="rvts23">Switch current Multitracking mode</span><span class="rvts20">" hotkey (</span><span class="rvts23">W</span><span class="rvts20"> key by default). Now during the Recording the emulator will accept only the chosen player's buttonpresses, and the Piano Roll columns for other pads won't change even if you accidentally press another player's buttons.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts25">Use pattern</span><span class="rvts21">" checkbox applies current pattern to the process of buttons Recording. The name of the current pattern can be seen in the upper right corner of TAS Editor window (the last item of the main menu). If you click this menu item, a pop-down menu will appear, allowing you to choose another pattern from the list.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Patterns are used to speed up the process of entering monotonous buttonpresses and releases. For example, when you need to shoot at maximum rate (that is, alternate 1 frame of pressing </span><span class="rvts29">B</span><span class="rvts21"> and 1 frame when </span><span class="rvts29">B</span><span class="rvts21"> is released), you can just choose the "</span><span class="rvts37">Alternating (1010...)</span><span class="rvts21">" pattern and hold the </span><span class="rvts29">B</span><span class="rvts21"> button without caring about manual mashing. Thanks to the pattern, the </span><span class="rvts29">B</span><span class="rvts21"> buttonpresses will be recorded only for every other frame.</span></p> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><a name="multitracking"></a> <p class="rvps2"><a name="splicer"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-splicer.png"></p>
<p class="rvps10"><span class="rvts21">Besides the checkboxes the Recorder section also contains radio buttons that implement the </span><span class="rvts25">multitracking</span><span class="rvts21"> feature.</span></p> <p class="rvps7"><span class="rvts20">The </span><span class="rvts22">Splicer</span><span class="rvts20"> section comes after the Recorder. It's dedicated to displaying the most necessary data used in non-linear editing of the movie.</span></p>
<p class="rvps10"><span class="rvts25">Multitrack Recording</span><span class="rvts21"> greatly simplifies the traditional method of TASing games made for 2 or more players. Instead of pressing buttons of both gamepads at once, you can record a short segment of controlling the Player 1 and then record actions of Player 2 on the same segment of the movie.</span></p> <p class="rvps7"><span class="rvts20">Despite the similar sounding, editing TASes is totally different from using a non-linear video editing software, because Taseditor only allows you to edit Input, not the finished video footage (Output). The resulting video stream is built by the game itself.</span></p>
<p class="rvps10"><span class="rvts21">By default the Recorder is set to recording "All" pads. You can choose a single pad by clicking the respective radio button ("1P", "2P", etc the number of available gamepads depends on your project type). You can also use the "</span><span class="rvts26">Switch current Multitracking mode</span><span class="rvts21">" hotkey (</span><span class="rvts26">W</span><span class="rvts21"> key by default). Now during the Recording the emulator will accept only the chosen player's buttonpresses, and the Piano Roll columns for other pads won't change even if you accidentally press another player's buttons.</span></p> <p class="rvps7"><span class="rvts20">In this section you can see the information on current Selection size: how many rows and columns are covered. With this info you can use the Selection as a measuring scale (ruler). E.g. to find the temporal distance between two in-game events, click the frame of the first event and stretch the Selection to the frame of another all those frames will be selected, and in the Splicer section the message "Selection: </span><span class="rvts33">N</span><span class="rvts20"> rows, </span><span class="rvts33">M</span><span class="rvts20"> columns" will tell you the number of frames in question.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Also, here is the info about the Clipboard contents: whether it contains an Input that could be pasted to any place in the movie. When an Input is copied to the Clipboard, this line displays total amount of frames copied. The Clipboard data is stored independently of Taseditor, and it's kept there even after you close FCEUX, until some other application copies its own data to the Clipboard.</span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <p class="rvps7"><span class="rvts20">The "Splicer" section has no controls, because all Input splicing commands are kept in the Edit menu item and are assigned with accelerator keys. In actual TASing process it's recommended to use the keyboard combinations, because they're easy to remember and the working speed increases immensely.</span></p>
<p class="rvps2"><a name="splicer"></a> <p class="rvps7"><a name="splicing-operations"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts21">The list of all Editing functions</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-splicer.png"/></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The </span><span class="rvts25">Splicer</span><span class="rvts21"> section comes after the Recorder. It's dedicated to displaying the most necessary data used in non-linear editing of the movie.</span></p> <p class="rvps7"><span class="rvts20">Basically, these are the standard functions of any text editor, but in Taseditor they can be applied to Input in the middle of emulation, which allows to analyze the results on the fly and flexibly tune your plans.</span></p>
<p class="rvps10"><span class="rvts21">Despite the similar sounding, editing TASes is totally different from using a non-linear video editing software, because Taseditor only allows you to edit Input, not the finished video footage (Output). The resulting video stream is built by the game itself.</span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<p class="rvps10"><span class="rvts21">In this section you can see the information on current Selection size: how many rows and columns are covered. With this info you can use the Selection as a measuring scale (ruler). E.g. to find the temporal distance between two in-game events, click the frame of the first event and stretch the Selection to the frame of another all those frames will be selected, and in the Splicer section the message "Selection: </span><span class="rvts37">N</span><span class="rvts21"> rows, </span><span class="rvts37">M</span><span class="rvts21"> columns" will tell you the number of frames in question.</span></p> <li class="rvps7"><span class="rvts21">Copy </span><span class="rvts20">(</span><span class="rvts27">Ctrl + C</span><span class="rvts20">) copies the Input of all selected frames to the Clipboard.</span></li>
<p class="rvps10"><span class="rvts21">Also, here is the info about the Clipboard contents: whether it contains an Input that could be pasted to any place in the movie. When an Input is copied to the Clipboard, this line displays total amount of frames copied. The Clipboard data is stored independently of Taseditor, and it's kept there even after you close FCEUX, until some other application copies its own data to the Clipboard.</span></p> <li class="rvps7"><span class="rvts21">Paste </span><span class="rvts20">(</span><span class="rvts27">Ctrl + V</span><span class="rvts20">) pastes the Clipboard contents into the movie, starting from the position of the Selection cursor. Old Input data on the frames is replaced by the new data, or combined together if the "Superimpose" option in Recorder section is checked.</span></li>
<p class="rvps10"><span class="rvts21">The "Splicer" section has no controls, because all Input splicing commands are kept in the Edit menu item and are assigned with accelerator keys. In actual TASing process it's recommended to use the keyboard combinations, because they're easy to remember and the working speed increases immensely.</span></p> <li class="rvps7"><span class="rvts21">Paste Insert </span><span class="rvts20">(</span><span class="rvts27">Ctrl + </span><span class="rvts27">Shift</span><span class="rvts27"> + </span><span class="rvts27">V</span><span class="rvts20">) expands the movie and inserts the Clipboard content at the position of the Selection cursor. Old movie data is shifted down.</span></li>
<p class="rvps10"><a name="splicing-operations"></a> <li class="rvps7"><span class="rvts21">Clear </span><span class="rvts20">(</span><span class="rvts27">Delete</span><span class="rvts20">) clears selected frames, removing all buttonpresses from them.</span></li>
<span class="rvts21"><br/></span></p> <li class="rvps7"><span class="rvts21">Cut </span><span class="rvts20">(</span><span class="rvts27">Ctrl + X</span><span class="rvts20">) = </span><span class="rvts21">Copy</span><span class="rvts20"> + </span><span class="rvts21">Clear</span><span class="rvts20"> copies Input from the selected movie segment and clears the segment.</span></li>
<p class="rvps10"><span class="rvts22">The list of all Editing functions</span></p> <li class="rvps7"><span class="rvts21">Delete </span><span class="rvts20">(</span><span class="rvts27">Ctrl + Delete</span><span class="rvts20">) removes selected frames from the movie, shifting all the following frames up in their place. A handy way to move Input up.</span></li>
<p class="rvps10"><span class="rvts21"><br/></span></p> <li class="rvps7"><span class="rvts21">Insert </span><span class="rvts20">(</span><span class="rvts27">Ctrl + Shift + Insert</span><span class="rvts20">) inserts blank frame into the movie before every selected frame, shifting </span><span class="rvts20">existing</span><span class="rvts20"> Input down. A handy way to move Input down.</span></li>
<p class="rvps10"><span class="rvts21">Basically, these are the standard functions of any text editor, but in Taseditor they can be applied to Input in the middle of emulation, which allows to analyze the results on the fly and flexibly tune your plans.</span></p> <li class="rvps7"><span class="rvts21">Clone </span><span class="rvts20">(</span><span class="rvts27">Ctrl + Insert</span><span class="rvts20">) similar to </span><span class="rvts21">Insert</span><span class="rvts20">, but instead of blank frames it inserts a copy of selected frames. Usually this is the preferred way of </span><span class="rvts20">moving Input down.</span></li>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts21">Insert number of frames </span><span class="rvts20">(</span><span class="rvts27">Insert</span><span class="rvts20">) allows to insert any number of frames at the position of the Selection cursor. When you press the </span><span class="rvts27">Insert</span><span class="rvts20"> key, a small window pops up and prompts you to enter the number of frames to insert. Type the number and click OK. If you change your mind, press Cancel (Esc) to hide the window.</span></li>
<li class="rvps10"><span class="rvts22">Copy </span><span class="rvts21">(</span><span class="rvts30">Ctrl + C</span><span class="rvts21">) copies the Input of all selected frames to the Clipboard.</span></li> <li class="rvps7"><span class="rvts21">Truncate</span><span class="rvts20"> removes all frames of the movie, starting from the frame next to the Selection cursor. It's a rarely used function, so it has no hotkey, it's only available through the main menu or by the right-click.</span></li>
<li class="rvps10"><span class="rvts22">Paste </span><span class="rvts21">(</span><span class="rvts30">Ctrl + V</span><span class="rvts21">) pastes the Clipboard contents into the movie, starting from the position of the Selection cursor. Old Input data on the frames is replaced by the new data, or combined together if the "Superimpose" option in Recorder section is checked.</span></li>
<li class="rvps10"><span class="rvts22">Paste Insert </span><span class="rvts21">(</span><span class="rvts30">Ctrl + </span><span class="rvts30">Shift</span><span class="rvts30"> + </span><span class="rvts30">V</span><span class="rvts21">) expands the movie and inserts the Clipboard content at the position of the Selection cursor. Old movie data is shifted down.</span></li>
<li class="rvps10"><span class="rvts22">Clear </span><span class="rvts21">(</span><span class="rvts30">Delete</span><span class="rvts21">) clears selected frames, removing all buttonpresses from them.</span></li>
<li class="rvps10"><span class="rvts22">Cut </span><span class="rvts21">(</span><span class="rvts30">Ctrl + X</span><span class="rvts21">) = </span><span class="rvts22">Copy</span><span class="rvts21"> + </span><span class="rvts22">Clear</span><span class="rvts21"> copies Input from the selected movie segment and clears the segment.</span></li>
<li class="rvps10"><span class="rvts22">Delete </span><span class="rvts21">(</span><span class="rvts30">Ctrl + Delete</span><span class="rvts21">) removes selected frames from the movie, shifting all the following frames up in their place. A handy way to move Input up.</span></li>
<li class="rvps10"><span class="rvts22">Insert </span><span class="rvts21">(</span><span class="rvts30">Ctrl + Shift + Insert</span><span class="rvts21">) inserts blank frame into the movie before every selected frame, shifting </span><span class="rvts21">existing</span><span class="rvts21"> Input down. A handy way to move Input down.</span></li>
<li class="rvps10"><span class="rvts22">Clone </span><span class="rvts21">(</span><span class="rvts30">Ctrl + Insert</span><span class="rvts21">) similar to </span><span class="rvts22">Insert</span><span class="rvts21">, but instead of blank frames it inserts a copy of selected frames. Usually this is the preferred way of </span><span class="rvts21">moving Input down.</span></li>
<li class="rvps10"><span class="rvts22">Insert number of frames </span><span class="rvts21">(</span><span class="rvts30">Insert</span><span class="rvts21">) allows to insert any number of frames at the position of the Selection cursor. When you press the </span><span class="rvts30">Insert</span><span class="rvts21"> key, a small window pops up and prompts you to enter the number of frames to insert. Type the number and click OK. If you change your mind, press Cancel (Esc) to hide the window.</span></li>
<li class="rvps10"><span class="rvts22">Truncate</span><span class="rvts21"> removes all frames of the movie, starting from the frame next to the Selection cursor. It's a rarely used function, so it has no hotkey, it's only available through the main menu or by the right-click.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When TASing in Taseditor you're going to most often use </span><span class="rvts30">Ctrl + Delete</span><span class="rvts21"> (</span><span class="rvts22">Delete Frames</span><span class="rvts21">) and </span><span class="rvts30">Ctrl + Insert</span><span class="rvts21"> (</span><span class="rvts22">Clone Frames</span><span class="rvts21">) to quickly move edited segments up/down in the frame list, thus performing certain in-game actions sooner or later.</span></p> <p class="rvps7"><span class="rvts20">When TASing in Taseditor you're going to most often use </span><span class="rvts27">Ctrl + Delete</span><span class="rvts20"> (</span><span class="rvts21">Delete Frames</span><span class="rvts20">) and </span><span class="rvts27">Ctrl + Insert</span><span class="rvts20"> (</span><span class="rvts21">Clone Frames</span><span class="rvts20">) to quickly move edited segments up/down in the frame list, thus performing certain in-game actions sooner or later.</span></p>
<p class="rvps10"><span class="rvts21">Unlike FCEUX hotkeys, these key combinations can't be changed, so if you have some other emulator functions assigned to </span><span class="rvts30">Ctrl</span><span class="rvts21">, </span><span class="rvts30">Insert</span><span class="rvts21"> or </span><span class="rvts30">Delete</span><span class="rvts21">, you'll have to change emulator settings.</span></p> <p class="rvps7"><span class="rvts20">Unlike FCEUX hotkeys, these key combinations can't be changed, so if you have some other emulator functions assigned to </span><span class="rvts27">Ctrl</span><span class="rvts20">, </span><span class="rvts27">Insert</span><span class="rvts20"> or </span><span class="rvts27">Delete</span><span class="rvts20">, you'll have to change emulator settings.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps2"><a name="lua"></a> <p class="rvps2"><a name="lua"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-lua.png"></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-lua.png"/></p> <p class="rvps7"><span class="rvts20">Under the Splicer you can see a small </span><span class="rvts22">Lua</span><span class="rvts20"> section.</span></p>
<p class="rvps10"><span class="rvts21">Under the Splicer you can see a small </span><span class="rvts25">Lua</span><span class="rvts21"> section.</span></p> <p class="rvps7"><span class="rvts20">There is one inactive button and one checkbox here, their purpose will be described later. While you're not familiar with Lua scripting, you won't need this section.</span></p>
<p class="rvps10"><span class="rvts21">There is one inactive button and one checkbox here, their purpose will be described later. While you're not familiar with Lua scripting, you won't need this section.</span></p> <p class="rvps7"><span class="rvts20">The Lua scripting language allows to automate some part of TASers' work and to create your own plug-ins for Taseditor.</span></p>
<p class="rvps10"><span class="rvts21">The Lua scripting language allows to automate some part of TASers' work and to create your own plug-ins for Taseditor.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <p class="rvps7"><a name="bookmarks"></a><span class="rvts20"><br/></span></p>
<p class="rvps10"><a name="bookmarks"></a> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-bookmarks.png"></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Then goes the Bookmarks/Branches section. We should speak of </span><span class="rvts20">Bookmarks</span><span class="rvts20"> at a greater length here.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-bookmarks.png"/></p> <p class="rvps7"><span class="rvts22">Bookmarks</span><span class="rvts20"> are the evolution of emulator savestates. Before Taseditor the savestates were the main way to navigate the movie, with their help TASers return back to the place of a mistake and fix it. In Taseditor there are better navigation methods, but this one was left too.</span></p>
<p class="rvps10"><span class="rvts21">Then goes the Bookmarks/Branches section. We should speak of </span><span class="rvts21">Bookmarks</span><span class="rvts21"> at a greater length here.</span></p> <p class="rvps7"><span class="rvts20">You have 10 slots for Bookmarks in your disposal. These are numbered with digits from 0 to 9. You can set any of 10 Bookmarks to any movie frame, pointing to that frame with the Playback cursor beforehand.</span></p>
<p class="rvps10"><span class="rvts25">Bookmarks</span><span class="rvts21"> are the evolution of emulator savestates. Before Taseditor the savestates were the main way to navigate the movie, with their help TASers return back to the place of a mistake and fix it. In Taseditor there are better navigation methods, but this one was left too.</span></p> <p class="rvps7"><span class="rvts22">Example 1. </span><span class="rvts20">Set the light-blue cursor to the frame you want a Bookmark at, and make an emulator savestate (</span><span class="rvts27">Shift</span><span class="rvts20"> + </span><span class="rvts23">F1</span><span class="rvts20">-</span><span class="rvts23">F10</span><span class="rvts20"> by default). For example, press </span><span class="rvts23">Shift + F1</span><span class="rvts20"> to set the first Bookmark. It will appear in the Bookmarks List, flashing one time with the red light.</span></p>
<p class="rvps10"><span class="rvts21">You have 10 slots for Bookmarks in your disposal. These are numbered with digits from 0 to 9. You can set any of 10 Bookmarks to any movie frame, pointing to that frame with the Playback cursor beforehand.</span></p> <p class="rvps7"><span class="rvts22">Example 2. </span><span class="rvts20">Set the light-blue cursor to the needed frame and right-click on any line in the Bookmarks List. For example, right-click on the line 2 to create the Bookmark in slot 2.</span></p>
<p class="rvps10"><span class="rvts25">Example 1. </span><span class="rvts21">Set the light-blue cursor to the frame you want a Bookmark at, and make an emulator savestate (</span><span class="rvts30">Shift</span><span class="rvts21"> + </span><span class="rvts26">F1</span><span class="rvts21">-</span><span class="rvts26">F10</span><span class="rvts21"> by default). For example, press </span><span class="rvts26">Shift + F1</span><span class="rvts21"> to set the first Bookmark. It will appear in the Bookmarks List, flashing one time with the red light.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">Example 2. </span><span class="rvts21">Set the light-blue cursor to the needed frame and right-click on any line in the Bookmarks List. For example, right-click on the line 2 to create the Bookmark in slot 2.</span></p> <p class="rvps7"><span class="rvts20">You can undo the Bookmark set operations with </span><span class="rvts27">Ctrl + Z</span><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">The Bookmarks List displays the frame number where each Bookmark is sat, and the real time of setting the Bookmark. If you hover the mouse cursor over a Bookmark's time (the right column in the List), you'll see the screenshot from the game.</span></p>
<p class="rvps10"><span class="rvts21">You can undo the Bookmark set operations with </span><span class="rvts30">Ctrl + Z</span><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The Bookmarks List displays the frame number where each Bookmark is sat, and the real time of setting the Bookmark. If you hover the mouse cursor over a Bookmark's time (the right column in the List), you'll see the screenshot from the game.</span></p> <p class="rvps7"><span class="rvts20">When setting a Bookmark, Taseditor saves to the chosen slot the data about the Playback cursor position and entire movie contents. Now at any time you can either make a "</span><span class="rvts33">spatial jump to the Bookmark</span><span class="rvts20">" (simply returning the Playback cursor to the bookmarked place), or make a "</span><span class="rvts33">temporal jump to the Bookmark</span><span class="rvts20">", returning the whole movie to the state saved in the Bookmark slot.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">To jump to a Bookmark in space, left-click on the </span><span class="rvts22">left half</span><span class="rvts20"> of the needed Bookmark (the pale-colored half of the Bookmarks List where the frame number is displayed). Or use the keyboard press the corresponding number key (numeric keys </span><span class="rvts23">0</span><span class="rvts20">-</span><span class="rvts23">9</span><span class="rvts20"> are under the </span><span class="rvts23">F1</span><span class="rvts20">-</span><span class="rvts23">F10</span><span class="rvts20"> keys). You can notice the jump by seeing the light-blue cursor movement in the Piano Roll and by green flash in the Bookmarks List.</span></p>
<p class="rvps10"><span class="rvts21">When setting a Bookmark, Taseditor saves to the chosen slot the data about the Playback cursor position and entire movie contents. Now at any time you can either make a "</span><span class="rvts37">spatial jump to the Bookmark</span><span class="rvts21">" (simply returning the Playback cursor to the bookmarked place), or make a "</span><span class="rvts37">temporal jump to the Bookmark</span><span class="rvts21">", returning the whole movie to the state saved in the Bookmark slot.</span></p> <p class="rvps7"><span class="rvts20">To jump to a Bookmark in time, left-click on the </span><span class="rvts22">right half</span><span class="rvts20"> of the needed Bookmark (the brighter-colored half of the Bookmark List where the time is displayed). Or load the corresponding emulator savestate (keys </span><span class="rvts23">F1</span><span class="rvts20">-</span><span class="rvts23">F10</span><span class="rvts20"> by default). If any Input was changed during this jump in time (since it returns to its state at the time of creating the Bookmark), the Bookmark flashes with blue color, otherwise it flashes green, like in a simple Playback cursor jump. As usual, when an Input changes, the Greenzone truncates automatically. And of course you can undo the change using </span><span class="rvts27">Ctrl + Z</span><span class="rvts20"> to revert the movie to its state before the time jump to the Bookmark.</span></p>
<p class="rvps10"><span class="rvts21">To jump to a Bookmark in space, left-click on the </span><span class="rvts25">left half</span><span class="rvts21"> of the needed Bookmark (the pale-colored half of the Bookmarks List where the frame number is displayed). Or use the keyboard press the corresponding number key (numeric keys </span><span class="rvts26">0</span><span class="rvts21">-</span><span class="rvts26">9</span><span class="rvts21"> are under the </span><span class="rvts26">F1</span><span class="rvts21">-</span><span class="rvts26">F10</span><span class="rvts21"> keys). You can notice the jump by seeing the light-blue cursor movement in the Piano Roll and by green flash in the Bookmarks List.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">To jump to a Bookmark in time, left-click on the </span><span class="rvts25">right half</span><span class="rvts21"> of the needed Bookmark (the brighter-colored half of the Bookmark List where the time is displayed). Or load the corresponding emulator savestate (keys </span><span class="rvts26">F1</span><span class="rvts21">-</span><span class="rvts26">F10</span><span class="rvts21"> by default). If any Input was changed during this jump in time (since it returns to its state at the time of creating the Bookmark), the Bookmark flashes with blue color, otherwise it flashes green, like in a simple Playback cursor jump. As usual, when an Input changes, the Greenzone truncates automatically. And of course you can undo the change using </span><span class="rvts30">Ctrl + Z</span><span class="rvts21"> to revert the movie to its state before the time jump to the Bookmark.</span></p> <p class="rvps7"><span class="rvts20">So, part of the Bookmarks may be used to speed up your movie navigation. For example, set a Bookmark at the beginning of current game level to be able to return the Playback cursor to that frame and replay the level events anytime. You could use a Marker for the same purpose, but the advantage of the Bookmarks is that you can instantly jump to a Bookmark from any remote segment of the movie, no matter how many Markers are set in between, while to reach the desired Marker you would have to jump on the neighbor Markers.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Another part of the Bookmarks can be used to store alternative approaches to playing the same game segment. When TASing complex games we can't always immediately evaluate the optimality of a playing strategy. Sometimes TASer needs to record several different versions of playing the same segment and then carefully compare the resulting movies, choosing the most appropriate one to be left in the final TAS.</span></p>
<p class="rvps10"><span class="rvts21">So, part of the Bookmarks may be used to speed up your movie navigation. For example, set a Bookmark at the beginning of current game level to be able to return the Playback cursor to that frame and replay the level events anytime. You could use a Marker for the same purpose, but the advantage of the Bookmarks is that you can instantly jump to a Bookmark from any remote segment of the movie, no matter how many Markers are set in between, while to reach the desired Marker you would have to jump on the neighbor Markers.</span></p> <p class="rvps7"><span class="rvts20">In traditional TASing every such movie is kept in separate file, so to switch between the alternative movies (or rather between alternative branches of your main movie) you need to load corresponding savestates created when recording these playthroughs.</span></p>
<p class="rvps10"><span class="rvts21">Another part of the Bookmarks can be used to store alternative approaches to playing the same game segment. When TASing complex games we can't always immediately evaluate the optimality of a playing strategy. Sometimes TASer needs to record several different versions of playing the same segment and then carefully compare the resulting movies, choosing the most appropriate one to be left in the final TAS.</span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-branches.png"></p>
<p class="rvps10"><span class="rvts21">In traditional TASing every such movie is kept in separate file, so to switch between the alternative movies (or rather between alternative branches of your main movie) you need to load corresponding savestates created when recording these playthroughs.</span></p> <p class="rvps7"><span class="rvts20">In Taseditor all saved branches of the movie are held together, forming the hierarchy called the </span><span class="rvts22">Branches Tree</span><span class="rvts20">. To switch between the alternative branches you need to load the corresponding Bookmark, thus returning the working movie to one of the prepared versions. Basically, it's the same as before. But now we can visualize all alternative playthroughs in a graph scheme to facilitate TASer's comprehension of the multitude of options.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-branches.png"/></p> <p class="rvps7"><span class="rvts20">When you test a couple of approaches to playing the 2nd level of the game, the 1st level playthrough remains the same in both branches, so the discrepancy of the Input starts not from the beginning, but from the 2nd level. So, if you left the Bookmark 1 before the beginning of the 2nd level, you'll see the fork in the graph starting from the card 1.</span></p>
<p class="rvps10"><span class="rvts21">In Taseditor all saved branches of the movie are held together, forming the hierarchy called the </span><span class="rvts25">Branches Tree</span><span class="rvts21">. To switch between the alternative branches you need to load the corresponding Bookmark, thus returning the working movie to one of the prepared versions. Basically, it's the same as before. But now we can visualize all alternative playthroughs in a graph scheme to facilitate TASer's comprehension of the multitude of options.</span></p> <p class="rvps7"><span class="rvts20">As an experiment, create a new project and make a very short movie. Then set the Playback cursor to the end of existing Input and save a Bookmark into the first slot (</span><span class="rvts23">Shift + F1</span><span class="rvts20">). Advance a few frames after that Bookmark and draw some buttonpresses, then play this new Input and save to Bookmark 2 (</span><span class="rvts23">Shift + F2</span><span class="rvts20">). Now return the movie to the first Bookmark state (press </span><span class="rvts23">F1</span><span class="rvts20">) and add some buttonpresses after the bookmarked frame again, but make sure they are different from the last time. Play this new Input to the end and save the 3rd Bookmark (</span><span class="rvts23">Shift + F3</span><span class="rvts20">) or any other.</span></p>
<p class="rvps10"><span class="rvts21">When you test a couple of approaches to playing the 2nd level of the game, the 1st level playthrough remains the same in both branches, so the discrepancy of the Input starts not from the beginning, but from the 2nd level. So, if you left the Bookmark 1 before the beginning of the 2nd level, you'll see the fork in the graph starting from the card 1.</span></p> <p class="rvps7"><span class="rvts20">Now click on the header of the Bookmarks section ("Bookmarks/Branches" label). The Bookmarks List view will change to the Branches Tree view. If the third Bookmark movie differs from the second Bookmark movie, and the difference starts after the first Bookmark frame, you'll see the picture similar to the above. The cloudlet symbolizes the beginning of the movie (the root of the hierarchy). Bookmarks are presented with cards of corresponding numbers. The blue-colored number stands for the current Bookmark containing the branch that corresponds to working movie (currently displayed in the Piano Roll). If the working movie was changed after saving/loading this Bookmark, you'll see the fireball descending from the current Bookmark.</span></p>
<p class="rvps10"><span class="rvts21">As an experiment, create a new project and make a very short movie. Then set the Playback cursor to the end of existing Input and save a Bookmark into the first slot (</span><span class="rvts26">Shift + F1</span><span class="rvts21">). Advance a few frames after that Bookmark and draw some buttonpresses, then play this new Input and save to Bookmark 2 (</span><span class="rvts26">Shift + F2</span><span class="rvts21">). Now return the movie to the first Bookmark state (press </span><span class="rvts26">F1</span><span class="rvts21">) and add some buttonpresses after the bookmarked frame again, but make sure they are different from the last time. Play this new Input to the end and save the 3rd Bookmark (</span><span class="rvts26">Shift + F3</span><span class="rvts21">) or any other.</span></p> <p class="rvps7"><span class="rvts20">Red lines connect those Bookmarks that are compatible with the chronology of current working movie. For example, if you set one Bookmark at the end of every level, all such Bookmarks will be sitting on one red line, because the movie of every next Bookmark is actually composed from the movie of previous Bookmark plus an additional level playthrough.</span></p>
<p class="rvps10"><span class="rvts21">Now click on the header of the Bookmarks section ("Bookmarks/Branches" label). The Bookmarks List view will change to the Branches Tree view. If the third Bookmark movie differs from the second Bookmark movie, and the difference starts after the first Bookmark frame, you'll see the picture similar to the above. The cloudlet symbolizes the beginning of the movie (the root of the hierarchy). Bookmarks are presented with cards of corresponding numbers. The blue-colored number stands for the current Bookmark containing the branch that corresponds to working movie (currently displayed in the Piano Roll). If the working movie was changed after saving/loading this Bookmark, you'll see the fireball descending from the current Bookmark.</span></p> <p class="rvps7"><span class="rvts20">The Branches Tree also displays current Playback cursor position. Try dragging the cursor in the Piano Roll up and down, or just play the whole movie back (press </span><span class="rvts27">Shift + Home</span><span class="rvts20"> and unpause the emulator). You will see how the light-blue arrow pointer rides on red lines that connect all Bookmarks of the current timeline. E.g. if the current branch is the Bookmark 2, the pointer will ride that route: "cloudlet -&gt; Bookmark 1 -&gt; Bookmark 2". And the other Bookmarks will be left aside, because they represent an alternative timeline, conflicting with the currently played movie.</span></p>
<p class="rvps10"><span class="rvts21">Red lines connect those Bookmarks that are compatible with the chronology of current working movie. For example, if you set one Bookmark at the end of every level, all such Bookmarks will be sitting on one red line, because the movie of every next Bookmark is actually composed from the movie of previous Bookmark plus an additional level playthrough.</span></p> <p class="rvps7"><span class="rvts20">The Branches Tree is automatically rebuilt each time you create a new Bookmark or change an existing Bookmark's contents. Depending on how complex your project is, the graph may appear differently.</span></p>
<p class="rvps10"><span class="rvts21">The Branches Tree also displays current Playback cursor position. Try dragging the cursor in the Piano Roll up and down, or just play the whole movie back (press </span><span class="rvts30">Shift + Home</span><span class="rvts21"> and unpause the emulator). You will see how the light-blue arrow pointer rides on red lines that connect all Bookmarks of the current timeline. E.g. if the current branch is the Bookmark 2, the pointer will ride that route: "cloudlet -&gt; Bookmark 1 -&gt; Bookmark 2". And the other Bookmarks will be left aside, because they represent an alternative timeline, conflicting with the currently played movie.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The Branches Tree is automatically rebuilt each time you create a new Bookmark or change an existing Bookmark's contents. Depending on how complex your project is, the graph may appear differently.</span></p> <div class="rvps13">
<p class="rvps10"><span class="rvts21"><br/></span></p> <table width="10%" border="0" cellpadding="1" cellspacing="2" style="border-width: 0px; border-spacing: 2px; margin: 0px auto;">
<div class="rvps21"><table width="10%" border="0" cellpadding="1" cellspacing="2" style="border-width: 0px;"> <tr valign="top">
<tr valign="top"> <td style="padding: 1px;">
<td><p class="rvps5"><img alt="" style="padding : 1px;" src="lib/branches-example1.png"/></p> <p class="rvps3"><img alt="" style="padding : 1px;" src="lib/branches-example1.png"></p>
</td> </td>
<td><p class="rvps5"><img alt="" style="padding : 1px;" src="lib/branches-example2.png"/></p> <td style="padding: 1px;">
</td> <p class="rvps3"><img alt="" style="padding : 1px;" src="lib/branches-example2.png"></p>
<td><p class="rvps5"><img alt="" style="padding : 1px;" src="lib/branches-example3.png"/></p> </td>
</td> <td style="padding: 1px;">
</tr> <p class="rvps3"><img alt="" style="padding : 1px;" src="lib/branches-example3.png"></p>
<tr valign="top"> </td>
<td><p class="rvps5"><img alt="" style="padding : 1px;" src="lib/branches-example4.png"/></p> </tr>
</td> <tr valign="top">
<td><p class="rvps5"><img alt="" style="padding : 1px;" src="lib/branches-example5.png"/></p> <td style="padding: 1px;">
</td> <p class="rvps3"><img alt="" style="padding : 1px;" src="lib/branches-example4.png"></p>
<td><p class="rvps5"><img alt="" style="padding : 1px;" src="lib/branches-example6.png"/></p> </td>
</td> <td style="padding: 1px;">
</tr> <p class="rvps3"><img alt="" style="padding : 1px;" src="lib/branches-example5.png"></p>
</td>
<td style="padding: 1px;">
<p class="rvps3"><img alt="" style="padding : 1px;" src="lib/branches-example6.png"></p>
</td>
</tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">You can hover the mouse cursor over any Bookmark number to see some info about it.</span></p> <p class="rvps7"><span class="rvts20">You can hover the mouse cursor over any Bookmark number to see some info about it.</span></p>
<p class="rvps10"><span class="rvts21">Also you can make a </span><span class="rvts25">single left-click</span><span class="rvts21"> on any Bookmark card to send the Playback cursor to the bookmarked frame (spatial jump). By clicking the cloudlet you send the Playback cursor to the beginning of the movie (equal to pressing </span><span class="rvts30">Shift + Home</span><span class="rvts21">), and by clicking the fireball you send the Playback cursor to the end of the movie (equal to </span><span class="rvts30">Shift + End</span><span class="rvts21">).</span></p> <p class="rvps7"><span class="rvts20">Also you can make a </span><span class="rvts22">single left-click</span><span class="rvts20"> on any Bookmark card to send the Playback cursor to the bookmarked frame (spatial jump). By clicking the cloudlet you send the Playback cursor to the beginning of the movie (equal to pressing </span><span class="rvts27">Shift + Home</span><span class="rvts20">), and by clicking the fireball you send the Playback cursor to the end of the movie (equal to </span><span class="rvts27">Shift + End</span><span class="rvts20">).</span></p>
<p class="rvps10"><span class="rvts21">Besides, you can </span><span class="rvts25">double-click</span><span class="rvts21"> a Bookmark by the left mouse button to jump to the Bookmark in time. The working movie reverts to the Bookmark's state, the Bookmark becomes current branch and the Playback cursor moves to the Bookmark frame.</span></p> <p class="rvps7"><span class="rvts20">Besides, you can </span><span class="rvts22">double-click</span><span class="rvts20"> a Bookmark by the left mouse button to jump to the Bookmark in time. The working movie reverts to the Bookmark's state, the Bookmark becomes current branch and the Playback cursor moves to the Bookmark frame.</span></p>
<p class="rvps10"><span class="rvts21">Finally, you can </span><span class="rvts25">right-click</span><span class="rvts21"> any card to save the current movie state and the Playback cursor position to the chosen Bookmark.</span></p> <p class="rvps7"><span class="rvts20">Finally, you can </span><span class="rvts22">right-click</span><span class="rvts20"> any card to save the current movie state and the Playback cursor position to the chosen Bookmark.</span></p>
<p class="rvps10"><span class="rvts21">As you see, the Branches Tree view supports the same functionality as the Bookmarks List view does. Thus it's recommended for advanced users to stick to the Branch Tree view, because it provides more info for a TASer. When you want to switch back to the Bookmarks List view, click the section header again (the "Branches" label).</span></p> <p class="rvps7"><span class="rvts20">As you see, the Branches Tree view supports the same functionality as the Bookmarks List view does. Thus it's recommended for advanced users to stick to the Branch Tree view, because it provides more info for a TASer. When you want to switch back to the Bookmarks List view, click the section header again (the "Branches" label).</span></p>
<p class="rvps10"><span class="rvts21">Now try using all 10 available slots. Each time slightly change the current movie Input and watch the changes on the FCEUX screen before saving them to a Bookmark. The position of each card on the Tree is defined by the Input preceding the bookmarked frame. It's implied that TASer always watches the edited Input segment in the emulator, and only then saves the tested work into a Bookmark.</span></p> <p class="rvps7"><span class="rvts20">Now try using all 10 available slots. Each time slightly change the current movie Input and watch the changes on the FCEUX screen before saving them to a Bookmark. The position of each card on the Tree is defined by the Input preceding the bookmarked frame. It's implied that TASer always watches the edited Input segment in the emulator, and only then saves the tested work into a Bookmark.</span></p>
<p class="rvps10"><span class="rvts21">In hands of an experienced TASer Bookmarks become very powerful tool, allowing to greatly simplify the TASing process and implement ideas that look impossible. Usually, an idea is labeled "impossible" only due to its monstrous unbounded complexity. But lower the complexity a hundred times (with the help of tools and a smart process organization), and the achievement moves from the "impossible" category to just "hard" one.</span></p> <p class="rvps7"><span class="rvts20">In hands of an experienced TASer Bookmarks become very powerful tool, allowing to greatly simplify the TASing process and implement ideas that look impossible. Usually, an idea is labeled "impossible" only due to its monstrous unbounded complexity. But lower the complexity a hundred times (with the help of tools and a smart process organization), and the achievement moves from the "impossible" category to just "hard" one.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps2"><a name="history"></a> <p class="rvps2"><a name="history"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-history.png"></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-history.png"/></p> <p class="rvps7"><span class="rvts20">The </span><span class="rvts22">History</span><span class="rvts20"> section is located below the Bookmarks.</span></p>
<p class="rvps10"><span class="rvts21">The </span><span class="rvts25">History</span><span class="rvts21"> section is located below the Bookmarks.</span></p> <p class="rvps7"><span class="rvts20">Taseditor keeps strict accounting of all operations in the current project. Every user's action that changes an Input, Markers or Bookmarks is recorded to the log displayed in this section.</span></p>
<p class="rvps10"><span class="rvts21">Taseditor keeps strict accounting of all operations in the current project. Every user's action that changes an Input, Markers or Bookmarks is recorded to the log displayed in this section.</span></p> <p class="rvps7"><span class="rvts20">The current item of the History Log is highlighted blue. Other items have white background if they aren't related to the current item, or purple background if they represent the changes made in the same place as the current item. For example, if current History Log item was created by changing the Input of frame 27, all other items affecting that frame will be highlighted purple.</span></p>
<p class="rvps10"><span class="rvts21">The current item of the History Log is highlighted blue. Other items have white background if they aren't related to the current item, or purple background if they represent the changes made in the same place as the current item. For example, if current History Log item was created by changing the Input of frame 27, all other items affecting that frame will be highlighted purple.</span></p> <p class="rvps7"><span class="rvts20">To undo logged operations you can either use the </span><span class="rvts27">Ctrl + Z</span><span class="rvts20"> and </span><span class="rvts27">Ctrl + Y</span><span class="rvts20"> keys, or simply click </span><span class="rvts20">any line in the History Log with the left mouse button, thus returning the movie to the time when the clicked item was created.&nbsp;</span></p>
<p class="rvps10"><span class="rvts21">To undo logged operations you can either use the </span><span class="rvts30">Ctrl + Z</span><span class="rvts21"> and </span><span class="rvts30">Ctrl + Y</span><span class="rvts21"> keys, or simply click </span><span class="rvts21">any line in the History Log with the left mouse button, thus returning the movie to the time when the clicked item was created. </span></p> <p class="rvps7"><span class="rvts20">You may notice the purple cursor line appearing in the Piano Roll for a short moment. It's supposed to stress your attention on the place of the undone changes.</span></p>
<p class="rvps10"><span class="rvts21">You may notice the purple cursor line appearing in the Piano Roll for a short moment. It's supposed to stress your attention on the place of the undone changes.</span></p> <p class="rvps7"><span class="rvts20">The maximum number of undo levels can be set in the </span><a class="rvts34" href="ProgramCustomization.html#Setmaxundolevels">Config</a><span class="rvts20"> menu, that value defines the maximum size of the History Log and therefore the amount of used memory.</span></p>
<p class="rvps10"><span class="rvts21">The maximum number of undo levels can be set in the </span><a class="rvts38" href="ProgramCustomization.html#Setmaxundolevels">Config</a><span class="rvts21"> menu, that value defines the maximum size of the History Log and therefore the amount of used memory.</span></p> <p class="rvps7"><span class="rvts20">The full list of all possible records in the History Log can be found in the </span><a class="rvts34" href="Operations.html">Reference</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">The full list of all possible records in the History Log can be found in the </span><a class="rvts38" href="Operations.html">Reference</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <p class="rvps2"><a name="selection"></a><span class="rvts20"><br/></span></p>
<p class="rvps2"><a name="selection"></a> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-selection.png"></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">At the very bottom of the Toolbox there are 4 buttons controlling the Selection cursor.</span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-selection.png"/></p> <p class="rvps7"><span class="rvts20">The meaning of the "</span><span class="rvts26">&lt;&lt;</span><span class="rvts20">" and "</span><span class="rvts26">&gt;&gt;</span><span class="rvts20">" buttons can be easily guessed by analogy with the upper "</span><span class="rvts26">&lt;&lt;</span><span class="rvts20">" and "</span><span class="rvts26">&gt;&gt;</span><span class="rvts20">" buttons in the Playback section. The upper part of TAS Editor window contains the Playback cursor-related elements, and the lower window part contains Selection cursor-related elements.</span></p>
<p class="rvps10"><span class="rvts21">At the very bottom of the Toolbox there are 4 buttons controlling the Selection cursor.</span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts26">&lt;&lt;</span><span class="rvts20">" button (jump back) moves the Selection cursor </span><span class="rvts20">to the frame where the nearest upper Marker is located. </span><span class="rvts20">In the above picture it will jump from frame 27 to frame 22 where the Marker 2 is set. Using this button you can quickly return the selection to the beginning of the edited segment or to any marked segment. This button has its keyboard analog: </span><span class="rvts27">Ctrl + Page Up</span><span class="rvts20">. You can hold this button to let the dark-blue cursor rapidly jump on Markers up in the Piano Roll.</span></p>
<p class="rvps10"><span class="rvts21">The meaning of the "</span><span class="rvts29">&lt;&lt;</span><span class="rvts21">" and "</span><span class="rvts29">&gt;&gt;</span><span class="rvts21">" buttons can be easily guessed by analogy with the upper "</span><span class="rvts29">&lt;&lt;</span><span class="rvts21">" and "</span><span class="rvts29">&gt;&gt;</span><span class="rvts21">" buttons in the Playback section. The upper part of TAS Editor window contains the Playback cursor-related elements, and the lower window part contains Selection cursor-related elements.</span></p> <p class="rvps7"><span class="rvts20">The "</span><span class="rvts26">&gt;&gt;</span><span class="rvts20">" button (jump forward) moves the Selection cursor to the nearest marked frame below it. In the above picture it will jump from frame 27 to a frame outside the visible area (where the next Marker is set), and Piano Roll will automatically scroll after the Selection cursor. Using this button you can quickly navigate down through the movie. This button has its keyboard analog: </span><span class="rvts27">Ctrl + Page Down</span><span class="rvts20">. You can hold this button as well.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts29">&lt;&lt;</span><span class="rvts21">" button (jump back) moves the Selection cursor </span><span class="rvts21">to the frame where the nearest upper Marker is located. </span><span class="rvts21">In the above picture it will jump from frame 27 to frame 22 where the Marker 2 is set. Using this button you can quickly return the selection to the beginning of the edited segment or to any marked segment. This button has its keyboard analog: </span><span class="rvts30">Ctrl + Page Up</span><span class="rvts21">. You can hold this button to let the dark-blue cursor rapidly jump on Markers up in the Piano Roll.</span></p> <p class="rvps7"><span class="rvts20">Since the Selection cursor isn't tied to the game emulation, its jumps on Markers always happen instantly, regardless of the Greenzone presence on the target frame. So it's useful to read the Marker Notes one by one this way, watching them in the lower edit field and pressing </span><span class="rvts27">Ctrl + Page Down</span><span class="rvts20"> to make an instant jump to the next Note. </span><span class="rvts20">Besides </span><span class="rvts22">Page Up</span><span class="rvts20"> / </span><span class="rvts22">Page Down</span><span class="rvts20"> keys you can roll the mouse wheel while holding the </span><span class="rvts27">Ctrl</span><span class="rvts20"> key.</span></p>
<p class="rvps10"><span class="rvts21">The "</span><span class="rvts29">&gt;&gt;</span><span class="rvts21">" button (jump forward) moves the Selection cursor to the nearest marked frame below it. In the above picture it will jump from frame 27 to a frame outside the visible area (where the next Marker is set), and Piano Roll will automatically scroll after the Selection cursor. Using this button you can quickly navigate down through the movie. This button has its keyboard analog: </span><span class="rvts30">Ctrl + Page Down</span><span class="rvts21">. You can hold this button as well.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Since the Selection cursor isn't tied to the game emulation, its jumps on Markers always happen instantly, regardless of the Greenzone presence on the target frame. So it's useful to read the Marker Notes one by one this way, watching them in the lower edit field and pressing </span><span class="rvts30">Ctrl + Page Down</span><span class="rvts21"> to make an instant jump to the next Note. </span><span class="rvts21">Besides </span><span class="rvts25">Page Up</span><span class="rvts21"> / </span><span class="rvts25">Page Down</span><span class="rvts21"> keys you can roll the mouse wheel while holding the </span><span class="rvts30">Ctrl</span><span class="rvts21"> key.</span></p> <p class="rvps7"><span class="rvts20">The buttons "</span><span class="rvts26">Similar</span><span class="rvts20">" and "</span><span class="rvts26">More</span><span class="rvts20">" are used for searching similar Notes. This is another experimental feature of Taseditor, and it will be described later.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">The buttons "</span><span class="rvts29">Similar</span><span class="rvts21">" and "</span><span class="rvts29">More</span><span class="rvts21">" are used for searching similar Notes. This is another experimental feature of Taseditor, and it will be described later.</span></p> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <p class="rvps7"><span class="rvts20">Now you are familiar with fundamental principles of the program usage.</span></p>
<p class="rvps2"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">In the next chapter: </span><a class="rvts34" href="TASingProcess.html">systematic approach to TASing</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">Now you are familiar with fundamental principles of the program usage.</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">In the next chapter: </span><a class="rvts38" href="TASingProcess.html">systematic approach to TASing</a><span class="rvts21">.</span></p> <div class="rvps7">
<p class="rvps10"><span class="rvts21"><br/></span></p> <table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid; border-spacing: 2px;">
<div class="rvps10"><table width="100%" border="1" cellpadding="6" cellspacing="2" style="border-color: #000000; border-style: solid;"> <tr valign="top">
<tr valign="top"> <td style="border-color: #000000; border-style: solid; padding: 6px;">
<td style="border-color: #000000; border-style: solid;"><p class="rvps10"><span class="rvts25">PRACTICE: </span><span class="rvts21">Beat the World 1-1 in Super Mario Bros (or any other game) using only the mouse, without Recording.</span></p> <p class="rvps7"><span class="rvts22">PRACTICE: </span><span class="rvts20">Beat the World 1-1 in Super Mario Bros (or any other game) using only the mouse, without Recording.</span></p>
<p class="rvps10"><span class="rvts21">No need to do a speedrun, just make yourself familiar with the routine of Input drawing / erasing and watching the results using the mouse wheel / middle mouse button.</span></p> <p class="rvps7"><span class="rvts20">No need to do a speedrun, just make yourself familiar with the routine of Input drawing / erasing and watching the results using the mouse wheel / middle mouse button.</span></p>
<p class="rvps10"><span class="rvts25">Estimated time: </span><span class="rvts21">20-30 minutes.</span></p> <p class="rvps7"><span class="rvts22">Estimated time: </span><span class="rvts20">20-30 minutes.</span></p>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/feature-tour">Easily create Help documents</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com">Easy EBook and documentation generator</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -1,147 +1,337 @@
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<title>4.1. Traditional TASing</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<link type="text/css" rel="stylesheet" media="all" href="css/reset.css" /> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<link type="text/css" rel="stylesheet" media="all" href="css/base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1" />
<link type="text/css" rel="stylesheet" media="all" href="css/hnd.css" /> <link rel="icon" href="favicon.ico"/>
<!--[if lte IE 8]>
<link type="text/css" rel="stylesheet" media="all" href="css/ielte8.css" /> <title>4.1. Traditional TASing</title>
<![endif]--> <meta name="description" content="" />
<style type="text/css"> <meta name="keywords" content="">
#topic_header
{
background-color: #EFEFEF;
}
</style>
<script type="text/javascript" src="js/jquery.min.js"></script> <!-- Twitter Card data -->
<script type="text/javascript" src="js/hnd.js"></script> <meta name="twitter:card" content="summary">
<script type="text/javascript"> <meta name="twitter:title" content="4.1. Traditional TASing">
$(document).ready(function() <meta name="twitter:description" content="">
{
if (top.frames.length == 0) <!-- Open Graph data -->
{ <meta property="og:title" content="4.1. Traditional TASing" />
var sTopicUrl = top.location.href.substring(top.location.href.lastIndexOf("/") + 1, top.location.href.length); <meta property="og:type" content="article" />
top.location.href = "index.html?" + sTopicUrl; <meta property="og:description" content="" />
} <meta property="og:site_name" content="TAS Editor Manual" />
else if (top && top.FrameTOC && top.FrameTOC.SelectTocItem)
{ <!-- Bootstrap core CSS -->
top.FrameTOC.SelectTocItem("TraditionalTASing"); <link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
}
}); <!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
</script> <link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<body> <body class="md-nav-expanded">
<div id="topic_header">
<div id="topic_header_content">
<h1>4.1. Traditional TASing</h1>
<div id="topic_breadcrumb">
<a href="BeginnersGuide.html">Beginner's Guide</a> &rsaquo;&rsaquo; <a href="TASingMethodology.html">4. TASing Methodology</a> &rsaquo;&rsaquo; </div>
</div>
<div id="topic_header_nav">
<a href="TASingMethodology.html"><img src="img/arrow_up.png" alt="Parent"/></a>
<a href="TASingMethodology.html"><img src="img/arrow_left.png" alt="Previous"/></a> <div id="skip-link">
<a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<a href="NonlinearTASing.html"><img src="img/arrow_right.png" alt="Next"/></a> <header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</div> </header>
<div class="clear"></div>
</div> <nav id="panel-left" class="md-nav-expanded">
<div id="topic_content"> <!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-url="_toc.json"
data-openlvl="1"
>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-url="_keywords.json"
data-openlvl="1"
>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="TraditionalTASing"
data-hnd-context="10"
data-hnd-title="4.1. Traditional TASing"
>
<div class="navigation">
<ol class="breadcrumb">
<li><a href="BeginnersGuide.html">Beginner's Guide</a></li><li><a href="TASingMethodology.html">4. TASing Methodology</a></li>
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="TASingMethodology.html" title="4. TASing Methodology" role="button"><span class="glyphicon glyphicon-menu-up" aria-hidden="true"></span></a><a class="btn btn-default" href="TASingMethodology.html" title="4. TASing Methodology" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="NonlinearTASing.html" title="4.2. Nonlinear TASing" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>4.1. Traditional TASing</h2>
<div class="main-content">
<p></p> <p></p>
<p><span class="rvts19">Traditional TASing</span></p> <p class="rvps2"><span class="rvts18">Traditional TASing</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><img align="right" alt="" style="padding : 6px;" src="lib/toolbox-method1.png"/></p> <p class="rvps7"><img alt="" style="float: right; padding : 6px;" src="lib/toolbox-method1.png"></p>
<p class="rvps10"><span class="rvts21">This method is similar in form to normal videogames playing, however it is completely different in content and requires different way of thinking.</span></p> <p class="rvps7"><span class="rvts20">This method is similar in form to normal videogames playing, however it is completely different in content and requires different way of thinking.</span></p>
<p class="rvps10"><span class="rvts21">Editing Input is done here by recording a new Input over existing Input.</span></p> <p class="rvps7"><span class="rvts20">Editing Input is done here by recording a new Input over existing Input.</span></p>
<p class="rvps10"><span class="rvts21">To switch between movie watching and editing you have to turn the Recording mode off and on (default hotkey is </span><span class="rvts26">Q</span><span class="rvts21">). It's recommended to enable the "Follow cursor" checkbox, in order to observe the recorded Input in the Piano Roll.</span></p> <p class="rvps7"><span class="rvts20">To switch between movie watching and editing you have to turn the Recording mode off and on (default hotkey is </span><span class="rvts23">Q</span><span class="rvts20">). It's recommended to enable the "Follow cursor" checkbox, in order to observe the recorded Input in the Piano Roll.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts22">General activity:</span></p> <p class="rvps7"><span class="rvts21">General activity:</span></p>
<p class="rvps10"><span class="rvts48"><br/></span></p> <p class="rvps7"><span class="rvts22"><br/></span></p>
<ol style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ol style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: decimal;">
<li class="rvps10"><span class="rvts21">Put the Playback cursor at the beginning of the edited segment, create a Bookmark, define the goal.</span></li> <li value="1" class="rvps7"><span class="rvts20">Put the Playback cursor at the beginning of the edited segment, create a Bookmark, define the goal.</span></li>
<li class="rvps10"><span class="rvts21">Suppose there's a mistake in the segment, weigh known factors of optimality and figure out the way to fix the mistake.</span></li> <li value="2" class="rvps7"><span class="rvts20">Suppose there's a mistake in the segment, weigh known factors of optimality and figure out the way to fix the mistake.</span></li>
<li class="rvps10"><span class="rvts21">Navigate to the place of fixing the mistake (e.g. load a Bookmark and, if necessary, quickly repeat the existing Input up to the needed frame).</span></li> <li value="3" class="rvps7"><span class="rvts20">Navigate to the place of fixing the mistake (e.g. load a Bookmark and, if necessary, quickly repeat the existing Input up to the needed frame).</span></li>
<li class="rvps10"><span class="rvts21">Play the game in Read+Write mode up to the moment when the target event occurs. The newly recorded Input should be different from old Input in this segment. While recording, create Bookmarks in free slots from time to time to speed up navigation.</span></li> <li value="4" class="rvps7"><span class="rvts20">Play the game in Read+Write mode up to the moment when the target event occurs. The newly recorded Input should be different from old Input in this segment. While recording, create Bookmarks in free slots from time to time to speed up navigation.</span></li>
<li class="rvps10"><span class="rvts21">If you make a mistake while typing the Input, return to step 3. If you fail to reach the target event using the chosen approach, you can retreat and go to step 8.</span></li> <li value="5" class="rvps7"><span class="rvts20">If you make a mistake while typing the Input, return to step 3. If you fail to reach the target event using the chosen approach, you can retreat and go to step 8.</span></li>
<li class="rvps10"><span class="rvts21">[</span><span class="rvts34">optional step</span><span class="rvts21">] Save the finished approach to a temporary Bookmark, e.g. to slot </span><span class="rvts26">8</span><span class="rvts21"> or </span><span class="rvts26">7</span><span class="rvts21">.</span></li> <li value="6" class="rvps7"><span class="rvts20">[</span><span class="rvts31">optional step</span><span class="rvts20">] Save the finished approach to a temporary Bookmark, e.g. to slot </span><span class="rvts23">8</span><span class="rvts20"> or </span><span class="rvts23">7</span><span class="rvts20">.</span></li>
<li class="rvps10"><span class="rvts21">If this isn't the first approach to the segment, compare the new result to the best old result, using the optimality criterion. If the new approach is better (or it's the first approach), save the result to the Bookmark </span><span class="rvts26">9</span><span class="rvts21">. The slot </span><span class="rvts26">9</span><span class="rvts21"> will be used for keeping the best result of polishing the segment.</span></li> <li value="7" class="rvps7"><span class="rvts20">If this isn't the first approach to the segment, compare the new result to the best old result, using the optimality criterion. If the new approach is better (or it's the first approach), save the result to the Bookmark </span><span class="rvts23">9</span><span class="rvts20">. The slot </span><span class="rvts23">9</span><span class="rvts20"> will be used for keeping the best result of polishing the segment.</span></li>
<li class="rvps10"><span class="rvts21">If you still want to try different approaches, return to step 2, until you run out of ideas.</span></li> <li value="8" class="rvps7"><span class="rvts20">If you still want to try different approaches, return to step 2, until you run out of ideas.</span></li>
<li class="rvps10"><span class="rvts21">[</span><span class="rvts34">optional step</span><span class="rvts21">] If you need more ideas, you can get some information from the past by replaying the old segments of the movie (e.g. load the Bookmark </span><span class="rvts26">0</span><span class="rvts21"> left at the beginning of current level). Also you can get some food for the mind from the future, by playing with the game events happening after the current segment.</span></li> <li value="9" class="rvps7"><span class="rvts20">[</span><span class="rvts31">optional step</span><span class="rvts20">] If you need more ideas, you can get some information from the past by replaying the old segments of the movie (e.g. load the Bookmark </span><span class="rvts23">0</span><span class="rvts20"> left at the beginning of current level). Also you can get some food for the mind from the future, by playing with the game events happening after the current segment.</span></li>
<li class="rvps10"><span class="rvts21">When there's no more ideas, restore the best approach from the Bookmark </span><span class="rvts26">9</span><span class="rvts21"> into the current movie and proceed to the next segment.</span></li> <li value="10" class="rvps7"><span class="rvts20">When there's no more ideas, restore the best approach from the Bookmark </span><span class="rvts23">9</span><span class="rvts20"> into the current movie and proceed to the next segment.</span></li>
</ol> </ol>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps2"><span class="rvts21"><br/></span></p> <p class="rvps2"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">When you're making a test playthrough of the game (i.e. playing with savestates, but without polishing), you only do steps 3 5. And you are satisfied with any successful accomplishment of a segment, so after reaching the target for the first time you proceed to the next segment right away. In this kind of playing you only use savestates to speed up navigation in case you make a fatal mistake (e.g. didn't press the </span><span class="rvts29">A</span><span class="rvts21"> button in time and fell into the pit), only because you don't want to rewrite existing Input from the very beginning of the game.</span></p> <p class="rvps7"><span class="rvts20">When you're making a test playthrough of the game (i.e. playing with savestates, but without polishing), you only do steps 3 5. And you are satisfied with any successful accomplishment of a segment, so after reaching the target for the first time you proceed to the next segment right away. In this kind of playing you only use savestates to speed up navigation in case you make a fatal mistake (e.g. didn't press the </span><span class="rvts26">A</span><span class="rvts20"> button in time and fell into the pit), only because you don't want to rewrite existing Input from the very beginning of the game.</span></p>
<p class="rvps10"><span class="rvts21">But when you're seriously TASing the game, you need to try many different approaches in order to find the best one. So you have to repeat steps 2 8 many times, until you think the segment is played perfectly. The steps 6 9 are what distinguishes real TASing from casual playing with savestates.</span></p> <p class="rvps7"><span class="rvts20">But when you're seriously TASing the game, you need to try many different approaches in order to find the best one. So you have to repeat steps 2 8 many times, until you think the segment is played perfectly. The steps 6 9 are what distinguishes real TASing from casual playing with savestates.</span></p>
<p class="rvps10"><span class="rvts21">The process of Input Recording (step 4) means that you're editing the Input right while watching the results. That is, when watching the paused game state at the frame 200 you prepare the Input for the frame 201 (lay fingers on necessary buttons) and then pass the Input to the game using </span><span class="rvts26">Frame Advance</span><span class="rvts21">, and immediately see the outcome the game state at the frame 201 (granted that you look at the Memory Watch, because the game screen rendering is one frame behind). Usually this outcome is only an intermediate result, which means you can use it to estimate your progress (step 5) but should not use it to compare current and previous approaches of playing the segment (step 7). So you shouldn't apply the optimality criterion after every frame. Even if at the beginning of the segment you outrun the previous approach, you may fall behind somewhere in the middle. Only when you reach the end of the segment (step 6) you get an objective base for comparing.</span></p> <p class="rvps7"><span class="rvts20">The process of Input Recording (step 4) means that you're editing the Input right while watching the results. That is, when watching the paused game state at the frame 200 you prepare the Input for the frame 201 (lay fingers on necessary buttons) and then pass the Input to the game using </span><span class="rvts23">Frame Advance</span><span class="rvts20">, and immediately see the outcome the game state at the frame 201 (granted that you look at the Memory Watch, because the game screen rendering is one frame behind). Usually this outcome is only an intermediate result, which means you can use it to estimate your progress (step 5) but should not use it to compare current and previous approaches of playing the segment (step 7). So you shouldn't apply the optimality criterion after every frame. Even if at the beginning of the segment you outrun the previous approach, you may fall behind somewhere in the middle. Only when you reach the end of the segment (step 6) you get an objective base for comparing.</span></p>
<p class="rvps10"><span class="rvts21">Steps 3 and 4 take the most of time in this cycle. Often before reaching the target event you have to repeat steps 3, 5 and 5 several times in a row, recording and discarding decisions that are obviously wrong even without comparing them to old approaches. For example, if in the middle of acceleration Mario gets killed by an enemy, there's no point in entering the remaining buttons needed for acceleration. You have to return back and rewrite the Input in such a way that the enemy misses. In a tough situation it's even better to break current segment into two subsegments (before and after the interaction with the enemy), in order to optimize them separately. If you don't do so, you will probably become tired after finishing the first approach, and you'll decide to leave the segment as it is. See, you've got to manage your effort optimally as well!</span></p> <p class="rvps7"><span class="rvts20">Steps 3 and 4 take the most of time in this cycle. Often before reaching the target event you have to repeat steps 3, 5 and 5 several times in a row, recording and discarding decisions that are obviously wrong even without comparing them to old approaches. For example, if in the middle of acceleration Mario gets killed by an enemy, there's no point in entering the remaining buttons needed for acceleration. You have to return back and rewrite the Input in such a way that the enemy misses. In a tough situation it's even better to break current segment into two subsegments (before and after the interaction with the enemy), in order to optimize them separately. If you don't do so, you will probably become tired after finishing the first approach, and you'll decide to leave the segment as it is. See, you've got to manage your effort optimally as well!</span></p>
<p class="rvps10"><a name="savestates"></a> <p class="rvps7"><a name="savestates"></a><span class="rvts20"><br/></span></p>
<span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20">Since the Input editing in this method is done using the Playback cursor (and not the mouse cursor), for an effective work you must learn to quickly deliver the light-blue cursor to any frame necessary. Upon gaining an experience, TASers accustom themselves to "juggle" with Bookmarks using the motor memory. They mechanically create intermediate and auxiliary Bookmarks while recording the Input, and find the necessary Bookmark slot without looking.</span></p>
<p class="rvps10"><span class="rvts21">Since the Input editing in this method is done using the Playback cursor (and not the mouse cursor), for an effective work you must learn to quickly deliver the light-blue cursor to any frame necessary. Upon gaining an experience, TASers accustom themselves to "juggle" with Bookmarks using the motor memory. They mechanically create intermediate and auxiliary Bookmarks while recording the Input, and find the necessary Bookmark slot without looking.</span></p> <p class="rvps7"><span class="rvts20">This virtuosity comes with time, usually after having finished a couple of TASes. You cultivate certain habits, one finger adheres to </span><span class="rvts23">Frame Advance</span><span class="rvts20"> key, Bookmark slots become logically distributed according to their duties, so that fingers press right keys at right moments on their own. For example, that's how some TASers distribute 10 slots:</span></p>
<p class="rvps10"><span class="rvts21">This virtuosity comes with time, usually after having finished a couple of TASes. You cultivate certain habits, one finger adheres to </span><span class="rvts26">Frame Advance</span><span class="rvts21"> key, Bookmark slots become logically distributed according to their duties, so that fingers press right keys at right moments on their own. For example, that's how some TASers distribute 10 slots:</span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps13"><img alt="" style="padding : 1px;" src="lib/savestate_slots.png"></p>
<p class="rvps21"><img alt="" style="padding : 1px;" src="lib/savestate_slots.png"/></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <li class="rvps7"><span class="rvts23">F10</span><span class="rvts20"> points to the beginning of current level of the game, so you can see recent segments without rewatching the whole movie. </span><span class="rvts31">Used for navigation.</span></li>
<li class="rvps10"><span class="rvts26">F10</span><span class="rvts21"> points to the beginning of current level of the game, so you can see recent segments without rewatching the whole movie. </span><span class="rvts34">Used for navigation.</span></li> <li class="rvps7"><span class="rvts23">F9</span><span class="rvts20"> is responsible for keeping the best result of current segment. </span><span class="rvts31">Used for storing.</span></li>
<li class="rvps10"><span class="rvts26">F9</span><span class="rvts21"> is responsible for keeping the best result of current segment. </span><span class="rvts34">Used for storing.</span></li> <li class="rvps7"><span class="rvts23">F2</span><span class="rvts20">-</span><span class="rvts23">F6</span><span class="rvts20"> serve as Bookmarks left after every </span><span class="rvts33">hard-to-reproduce action</span><span class="rvts20"> of the current approach to the segment. These Bookmarks are needed for a quick navigation along the current segment. One of them points to the beginning of the segment, and other are used when necessary (may be left unused, if the segment is short and simple). These Bookmarks are created mechanically while successfully progressing with Input Recording. </span><span class="rvts31">Used for navigation.</span></li>
<li class="rvps10"><span class="rvts26">F2</span><span class="rvts21">-</span><span class="rvts26">F6</span><span class="rvts21"> serve as Bookmarks left after every </span><span class="rvts37">hard-to-reproduce action</span><span class="rvts21"> of the current approach to the segment. These Bookmarks are needed for a quick navigation along the current segment. One of them points to the beginning of the segment, and other are used when necessary (may be left unused, if the segment is short and simple). These Bookmarks are created mechanically while successfully progressing with Input Recording. </span><span class="rvts34">Used for navigation.</span></li> <li class="rvps7"><span class="rvts23">F1</span><span class="rvts20"> stores a backup copy of the movie at the last successful frame. Current movie state is saved to this slot with paranoid frequency, so you could always return to this stable state from any situation (e.g. after loading some other Bookmarks, or after recording an experiment). This is how the traditional method implements simple undo feature. Sometimes in addition to the </span><span class="rvts23">F1</span><span class="rvts20"> people use </span><span class="rvts23">F2</span><span class="rvts20"> to provide two levels of undo, but this complicates the logic of backups (as you'd have to alternate the slots), and usually one slot is sufficient. </span><span class="rvts31">Used for storing.</span></li>
<li class="rvps10"><span class="rvts26">F1</span><span class="rvts21"> stores a backup copy of the movie at the last successful frame. Current movie state is saved to this slot with paranoid frequency, so you could always return to this stable state from any situation (e.g. after loading some other Bookmarks, or after recording an experiment). This is how the traditional method implements simple undo feature. Sometimes in addition to the </span><span class="rvts26">F1</span><span class="rvts21"> people use </span><span class="rvts26">F2</span><span class="rvts21"> to provide two levels of undo, but this complicates the logic of backups (as you'd have to alternate the slots), and usually one slot is sufficient. </span><span class="rvts34">Used for storing.</span></li> <li class="rvps7"><span class="rvts23">F7</span><span class="rvts20">-</span><span class="rvts23">F8</span><span class="rvts20"> may store results of alternative strategies that aren't better than the contents of the </span><span class="rvts23">F9</span><span class="rvts20">, yet they are of some interest. Also, one of these slots (or one of </span><span class="rvts23">F2</span><span class="rvts20">-</span><span class="rvts23">F6</span><span class="rvts20">) is used during step 6 to temporarily save the result of the newly finished approach, in order to compare it to the old best result more precisely (by quickly switching between </span><span class="rvts23">F8</span><span class="rvts20"> and </span><span class="rvts23">F9</span><span class="rvts20">). </span><span class="rvts31">Used for storing.</span></li>
<li class="rvps10"><span class="rvts26">F7</span><span class="rvts21">-</span><span class="rvts26">F8</span><span class="rvts21"> may store results of alternative strategies that aren't better than the contents of the </span><span class="rvts26">F9</span><span class="rvts21">, yet they are of some interest. Also, one of these slots (or one of </span><span class="rvts26">F2</span><span class="rvts21">-</span><span class="rvts26">F6</span><span class="rvts21">) is used during step 6 to temporarily save the result of the newly finished approach, in order to compare it to the old best result more precisely (by quickly switching between </span><span class="rvts26">F8</span><span class="rvts21"> and </span><span class="rvts26">F9</span><span class="rvts21">). </span><span class="rvts34">Used for storing.</span></li> <li class="rvps7"><span class="rvts20">When creating an improvement for someone else's TAS, slots </span><span class="rvts23">F5</span><span class="rvts20">-</span><span class="rvts23">F7</span><span class="rvts20"> may be allotted for various points of the old movie. For example, </span><span class="rvts23">F5</span><span class="rvts20"> is responsible for the beginning of current level in old movie, </span><span class="rvts23">F6</span><span class="rvts20"> for the beginning of current segment in old movie, </span><span class="rvts23">F7</span><span class="rvts20"> for the end of the current segment in old movie. </span><span class="rvts31">Used for storing and navigating the old movie contents.</span></li>
<li class="rvps10"><span class="rvts21">When creating an improvement for someone else's TAS, slots </span><span class="rvts26">F5</span><span class="rvts21">-</span><span class="rvts26">F7</span><span class="rvts21"> may be allotted for various points of the old movie. For example, </span><span class="rvts26">F5</span><span class="rvts21"> is responsible for the beginning of current level in old movie, </span><span class="rvts26">F6</span><span class="rvts21"> for the beginning of current segment in old movie, </span><span class="rvts26">F7</span><span class="rvts21"> for the end of the current segment in old movie. </span><span class="rvts34">Used for storing and navigating the old movie contents.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">This skill is very similar to the skill of playing a musical instrument. The quicker you work it out, the better, because until you master it you will think the traditional TASing is too tiresome. That's why many people consider the bar to be too high. But once you master the technique of rapid savestates usage, other intricacies of TASing will come easier.</span></p> <p class="rvps7"><span class="rvts20">This skill is very similar to the skill of playing a musical instrument. The quicker you work it out, the better, because until you master it you will think the traditional TASing is too tiresome. That's why many people consider the bar to be too high. But once you master the technique of rapid savestates usage, other intricacies of TASing will come easier.</span></p>
<p class="rvps10"><span class="rvts21">However, now there is Taseditor. It revokes the need to train fingers, allowing to quickly navigate the movie without using Bookmarks. Also, you don't need to accustom to constant backups into </span><span class="rvts26">F1</span><span class="rvts21">, since there is the History Log. So technically you can forget about the traditional method and right away start editing the movie and testing approaches using the </span><a class="rvts27" href="NonlinearTASing.html">nonlinear method of TASing</a><span class="rvts21">.</span></p> <p class="rvps7"><span class="rvts20">However, now there is Taseditor. It revokes the need to train fingers, allowing to quickly navigate the movie without using Bookmarks. Also, you don't need to accustom to constant backups into </span><span class="rvts23">F1</span><span class="rvts20">, since there is the History Log. So technically you can forget about the traditional method and right away start editing the movie and testing approaches using the </span><a class="rvts24" href="NonlinearTASing.html">nonlinear method of TASing</a><span class="rvts20">.</span></p>
<p class="rvps10"><span class="rvts21">Anyway, Taseditor slightly expands possibilities of the traditional method:</span></p> <p class="rvps7"><span class="rvts20">Anyway, Taseditor slightly expands possibilities of the traditional method:</span></p>
<ul style="text-indent: 30px; margin-left: 0px; list-style-position: inside;"> <ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps24" style="text-indent: 30px"><span class="rvts21">New ways to navigate with the Playback cursor, allowing to get to the needed place faster and create savestates less often.</span></li> <li style="text-indent: 30px" class="rvps15"><span class="rvts20">New ways to navigate with the Playback cursor, allowing to get to the needed place faster and create savestates less often.</span></li>
<li class="rvps24" style="text-indent: 30px"><span class="rvts21">When loading a Bookmark, the movie doesn't truncate after the bookmarked frame. This allows, for example, to record the segment of frames 900-1000 and then rerecord the segment 700-900 without losing the data from 900-1000.</span></li> <li style="text-indent: 30px" class="rvps15"><span class="rvts20">When loading a Bookmark, the movie doesn't truncate after the bookmarked frame. This allows, for example, to record the segment of frames 900-1000 and then rerecord the segment 700-900 without losing the data from 900-1000.</span></li>
<li class="rvps10"><span class="rvts21">All possibilities of an external Input editor (copy/paste, etc).</span></li> <li class="rvps7"><span class="rvts20">All possibilities of an external Input editor (copy/paste, etc).</span></li>
<li class="rvps10"><span class="rvts21">Visualization of Bookmarks, Input, lag and so on.</span></li> <li class="rvps7"><span class="rvts20">Visualization of Bookmarks, Input, lag and so on.</span></li>
<li class="rvps10"><span class="rvts21">Additional tools: multitracking, superimposing, auto-adjustment of Input, etc.</span></li> <li class="rvps7"><span class="rvts20">Additional tools: multitracking, superimposing, auto-adjustment of Input, etc.</span></li>
</ul> </ul>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;"/> <hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Pros of the method:</span></p> <p class="rvps7"><span class="rvts20">Pros of the method:</span></p>
<p class="rvps14"><span class="rvts46">+ </span><span class="rvts21">The process is intuitive for any gamer.</span></p> <p class="rvps9"><span class="rvts21">+ </span><span class="rvts20">The process is intuitive for any gamer.</span></p>
<p class="rvps14"><span class="rvts46">+ </span><span class="rvts21">Constant feedback allows to adapt to the game while editing the Input, adjust your decisions and discard incorrect approaches prematurely.</span></p> <p class="rvps9"><span class="rvts21">+ </span><span class="rvts20">Constant feedback allows to adapt to the game while editing the Input, adjust your decisions and discard incorrect approaches prematurely.</span></p>
<p class="rvps14"><span class="rvts46">+ </span><span class="rvts21">The boundaries of current segment are always marked with Bookmarks (for navigation), thus training TASer to be orderly (which will pay off).</span></p> <p class="rvps9"><span class="rvts21">+ </span><span class="rvts20">The boundaries of current segment are always marked with Bookmarks (for navigation), thus training TASer to be orderly (which will pay off).</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21">Cons of the method:</span></p> <p class="rvps7"><span class="rvts20">Cons of the method:</span></p>
<p class="rvps14"><span class="rvts46"> </span><span class="rvts21">The insistent game feedback provokes TASer to discard some illogical but potentially advantageous approaches.</span></p> <p class="rvps9"><span class="rvts21"> </span><span class="rvts20">The insistent game feedback provokes TASer to discard some illogical but potentially advantageous approaches.</span></p>
<p class="rvps14"><span class="rvts46"></span><span class="rvts25"> </span><span class="rvts21">Slow navigation may distract and increase fatigability.</span></p> <p class="rvps9"><span class="rvts21"></span><span class="rvts22"> </span><span class="rvts20">Slow navigation may distract and increase fatigability.</span></p>
<p class="rvps14"><span class="rvts46"></span><span class="rvts25"> </span><span class="rvts21">Since the number of Bookmarks is limited, the markings of previous segments are lost when creating a new segment, so you have to write down some things in a text file.</span></p> <p class="rvps9"><span class="rvts21"></span><span class="rvts22"> </span><span class="rvts20">Since the number of Bookmarks is limited, the markings of previous segments are lost when creating a new segment, so you have to write down some things in a text file.</span></p>
<p class="rvps14"><span class="rvts21"><br/></span></p> <p class="rvps9"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts25">When the method is recommended to use: </span><span class="rvts21">never. You can use the Recording to make the first test playthrough of a segment (or the whole game), i.e. when you don't need precision. But for polishing a segment this method is inferior. Yet it's reasonable to learn it, because many modern emulators have sufficient tools for applying the method, while Taseditor is only in FCEUX as yet.</span></p> <p class="rvps7"><span class="rvts22">When the method is recommended to use: </span><span class="rvts20">never. You can use the Recording to make the first test playthrough of a segment (or the whole game), i.e. when you don't need precision. But for polishing a segment this method is inferior. Yet it's reasonable to learn it, because many modern emulators have sufficient tools for applying the method, while Taseditor is only in FCEUX as yet.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><a class="rvts27" href="NonlinearTASing.html">The next method</a><span class="rvts21"> is more effective, but it even less resembles a normal gaming.</span></p> <p class="rvps7"><a class="rvts34" href="NonlinearTASing.html">The next method</a><span class="rvts20"> is more effective, but it even less resembles a normal gaming.</span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps10"><span class="rvts21"><br/></span></p> <p class="rvps7"><span class="rvts20"><br/></span></p>
<p></p> <p></p>
<p class="rvps8"><span class="rvts17">Created with the Personal Edition of HelpNDoc: </span><a class="rvts18" href="http://www.helpndoc.com/feature-tour">Easily create CHM Help documents</a></p> <p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com/feature-tour">Easily create Web Help sites</a></p>
</div>
<div id="topic_footer"> </div>
<div id="topic_footer_content"> <div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
&copy; 2011-2013 AnS</div> </div> <!-- /#topic-content -->
</div> </article>
</body>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

View File

@ -0,0 +1 @@
[]

View File

@ -0,0 +1 @@
[{ "id": "Title", "parent" : "#", "text": "Title", "a_attr": {"href": "Title.html"} , "icon": "icon-20" },{ "id": "BeginnersGuide", "parent" : "#", "text": "Beginner's Guide", "a_attr": {"href": "BeginnersGuide.html"} },{ "id": "Introduction", "parent" : "BeginnersGuide", "text": "1. Introduction", "a_attr": {"href": "Introduction.html"} , "icon": "icon-1" },{ "id": "ProgramInterface", "parent" : "BeginnersGuide", "text": "2. Program Interface", "a_attr": {"href": "ProgramInterface.html"} },{ "id": "PianoRoll", "parent" : "ProgramInterface", "text": "2.1. Piano Roll", "a_attr": {"href": "PianoRoll.html"} , "icon": "icon-1" },{ "id": "Toolbox", "parent" : "ProgramInterface", "text": "2.2. Toolbox", "a_attr": {"href": "Toolbox.html"} , "icon": "icon-1" },{ "id": "TASingProcess", "parent" : "BeginnersGuide", "text": "3. TASing Process", "a_attr": {"href": "TASingProcess.html"} , "icon": "icon-1" },{ "id": "TASingMethodology", "parent" : "BeginnersGuide", "text": "4. TASing Methodology", "a_attr": {"href": "TASingMethodology.html"} },{ "id": "TraditionalTASing", "parent" : "TASingMethodology", "text": "4.1. Traditional TASing", "a_attr": {"href": "TraditionalTASing.html"} , "icon": "icon-1" },{ "id": "NonlinearTASing", "parent" : "TASingMethodology", "text": "4.2. Nonlinear TASing", "a_attr": {"href": "NonlinearTASing.html"} , "icon": "icon-1" },{ "id": "SemiautomaticTASing", "parent" : "TASingMethodology", "text": "4.3. Semiautomatic TASing", "a_attr": {"href": "SemiautomaticTASing.html"} , "icon": "icon-1" },{ "id": "ProgramCustomization", "parent" : "BeginnersGuide", "text": "5. Program customization", "a_attr": {"href": "ProgramCustomization.html"} , "icon": "icon-1" },{ "id": "AdvancedFeatures", "parent" : "BeginnersGuide", "text": "6. Advanced Features", "a_attr": {"href": "AdvancedFeatures.html"} , "icon": "icon-1" },{ "id": "Reference", "parent" : "#", "text": "Reference", "a_attr": {"href": "Reference.html"} },{ "id": "Glossary", "parent" : "Reference", "text": "Glossary", "a_attr": {"href": "Glossary.html"} , "icon": "icon-1" },{ "id": "Controls", "parent" : "Reference", "text": "Controls", "a_attr": {"href": "Controls.html"} , "icon": "icon-1" },{ "id": "Navigation", "parent" : "Reference", "text": "Navigation", "a_attr": {"href": "Navigation.html"} , "icon": "icon-1" },{ "id": "Operations", "parent" : "Reference", "text": "Operations", "a_attr": {"href": "Operations.html"} , "icon": "icon-1" },{ "id": "LuaAPI", "parent" : "Reference", "text": "Lua API", "a_attr": {"href": "LuaAPI.html"} , "icon": "icon-1" },{ "id": "FAQ", "parent" : "Reference", "text": "FAQ", "a_attr": {"href": "FAQ.html"} , "icon": "icon-1" },{ "id": "SpeedrunningSynopsis", "parent" : "Reference", "text": "Speedrunning synopsis", "a_attr": {"href": "SpeedrunningSynopsis.html"} , "icon": "icon-1" },{ "id": "TASEditorInside", "parent" : "#", "text": "TAS Editor Inside", "a_attr": {"href": "TASEditorInside.html"} },{ "id": "Ideas", "parent" : "TASEditorInside", "text": "Ideas", "a_attr": {"href": "Ideas.html"} , "icon": "icon-1" },{ "id": "Implementation", "parent" : "TASEditorInside", "text": "Implementation", "a_attr": {"href": "Implementation.html"} , "icon": "icon-1" },{ "id": "MistakeProofing", "parent" : "TASEditorInside", "text": "Mistake-proofing", "a_attr": {"href": "MistakeProofing.html"} , "icon": "icon-1" },{ "id": "FM3format", "parent" : "TASEditorInside", "text": "FM3 format", "a_attr": {"href": "FM3format.html"} , "icon": "icon-1" }]

View File

@ -0,0 +1,11 @@
function hnd_ut(a){
a.TRANSLATIONS['Search term too short'] = "Search term too short";
a.TRANSLATIONS['No results'] = "No results";
a.TRANSLATIONS['Please enter 3 or more characters'] = "Please enter 3 or more characters";
a.TRANSLATIONS['Word list not ready yet. Please wait until the word list is fully downloaded'] = "Word list not ready yet. Please wait until the word list is fully downloaded";
a.TRANSLATIONS['Incorrect or corrupt search data. Please check your HelpNDoc template'] = "Incorrect or corrupt search data. Please check your HelpNDoc template";
a.TRANSLATIONS['Related topics...'] = "Related topics...";
a.TRANSLATIONS['Loading...'] = "Loading...";
a.TRANSLATIONS['Close'] = "Close";
}

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Title"</title>
<link rel="canonical" href="../Title.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Title.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Beginner's Guide"</title>
<link rel="canonical" href="../BeginnersGuide.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../BeginnersGuide.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "4.1. Traditional TASing"</title>
<link rel="canonical" href="../TraditionalTASing.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../TraditionalTASing.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "4.2. Nonlinear TASing"</title>
<link rel="canonical" href="../NonlinearTASing.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../NonlinearTASing.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "4.3. Semiautomatic TASing"</title>
<link rel="canonical" href="../SemiautomaticTASing.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../SemiautomaticTASing.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "5. Program customization"</title>
<link rel="canonical" href="../ProgramCustomization.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../ProgramCustomization.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "6. Advanced Features"</title>
<link rel="canonical" href="../AdvancedFeatures.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../AdvancedFeatures.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Glossary"</title>
<link rel="canonical" href="../Glossary.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Glossary.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "FAQ"</title>
<link rel="canonical" href="../FAQ.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../FAQ.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Controls"</title>
<link rel="canonical" href="../Controls.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Controls.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Navigation"</title>
<link rel="canonical" href="../Navigation.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Navigation.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Operations"</title>
<link rel="canonical" href="../Operations.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Operations.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Reference"</title>
<link rel="canonical" href="../Reference.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Reference.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Lua API"</title>
<link rel="canonical" href="../LuaAPI.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../LuaAPI.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Speedrunning synopsis"</title>
<link rel="canonical" href="../SpeedrunningSynopsis.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../SpeedrunningSynopsis.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Ideas"</title>
<link rel="canonical" href="../Ideas.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Ideas.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Implementation"</title>
<link rel="canonical" href="../Implementation.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Implementation.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "Mistake-proofing"</title>
<link rel="canonical" href="../MistakeProofing.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../MistakeProofing.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "FM3 format"</title>
<link rel="canonical" href="../FM3format.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../FM3format.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "TAS Editor Inside"</title>
<link rel="canonical" href="../TASEditorInside.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../TASEditorInside.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "1. Introduction"</title>
<link rel="canonical" href="../Introduction.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Introduction.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "2. Program Interface"</title>
<link rel="canonical" href="../ProgramInterface.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../ProgramInterface.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "2.1. Piano Roll"</title>
<link rel="canonical" href="../PianoRoll.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../PianoRoll.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "2.2. Toolbox"</title>
<link rel="canonical" href="../Toolbox.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../Toolbox.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "3. TASing Process"</title>
<link rel="canonical" href="../TASingProcess.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../TASingProcess.html" />
</head>
</html>

View File

@ -0,0 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>Redirecting to "4. TASing Methodology"</title>
<link rel="canonical" href="../TASingMethodology.html" />
<meta name="robots" content="noindex">
<meta charset="utf-8" />
<meta http-equiv="refresh" content="0; url=../TASingMethodology.html" />
</head>
</html>

View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/header{transition:top 0.3s ease, padding-left 0.3s ease}div#main{transition:margin-left 0.3s ease}nav{transition:left 0.3s ease, margin-top 0.3s ease, opacity 0.3s ease}.mask{transition:visibility 0s, opacity 0.3s ease}.tab-tabs>li::after{transition:transform 250ms ease 0s}#hnd-splitter{transition:background-color 0.15s linear}

View File

@ -0,0 +1,600 @@
/* ========== Text Styles ========== */
hr { color: #000000}
.main-content, .main-content table span.rvts0 /* Normal text */
{
font-size: 10pt;
font-family: 'Arial', 'Helvetica', sans-serif;
font-style: normal;
font-weight: normal;
color: #000000;
text-decoration: none;
}
span.rvts1 /* Heading */
{
font-weight: bold;
color: #0000ff;
}
span.rvts2 /* Subheading */
{
font-weight: bold;
color: #000080;
}
span.rvts3 /* Keywords */
{
font-style: italic;
color: #800000;
}
a.rvts4, span.rvts4 /* Jump 1 */
{
color: #008000;
text-decoration: underline;
}
a.rvts5, span.rvts5 /* Jump 2 */
{
color: #008000;
text-decoration: underline;
}
span.rvts6
{
}
span.rvts7
{
font-size: 14pt;
font-weight: bold;
color: #365f91;
}
span.rvts8
{
font-size: 24pt;
font-weight: bold;
}
span.rvts9
{
font-size: 12pt;
}
span.rvts10
{
font-size: 14pt;
}
a.rvts11, span.rvts11
{
font-size: 12pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts11:hover
{
color: #0000ff;
}
a.rvts12, span.rvts12
{
font-size: 12pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts12:hover
{
color: #0000ff;
}
span.rvts13
{
font-size: 9pt;
}
a.rvts14, span.rvts14
{
font-size: 14pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts14:hover
{
color: #0000ff;
}
a.rvts15, span.rvts15
{
font-size: 14pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts15:hover
{
color: #0000ff;
}
span.rvts16 /* Font Style */
{
font-family: 'Tahoma', 'Geneva', sans-serif;
font-style: italic;
color: #c0c0c0;
}
a.rvts17, span.rvts17 /* Font Style */
{
font-family: 'Tahoma', 'Geneva', sans-serif;
font-style: italic;
color: #6666ff;
text-decoration: underline;
}
span.rvts18
{
font-size: 24pt;
text-decoration: underline;
}
span.rvts19
{
font-size: 11pt;
font-family: 'Courier New', 'Courier', monospace;
color: #000080;
}
span.rvts20
{
font-size: 11pt;
}
span.rvts21
{
font-size: 12pt;
font-weight: bold;
}
span.rvts22
{
font-size: 11pt;
font-weight: bold;
}
span.rvts23
{
font-size: 11pt;
font-weight: bold;
color: #0096bb;
}
a.rvts24, span.rvts24
{
font-size: 11pt;
color: #0000ff;
text-decoration: underline;
}
a.rvts24:hover
{
color: #0000ff;
}
a.rvts25, span.rvts25
{
font-size: 11pt;
color: #0000ff;
text-decoration: underline;
}
a.rvts25:hover
{
color: #0000ff;
}
span.rvts26
{
font-size: 11pt;
font-weight: bold;
color: #008817;
}
span.rvts27
{
font-size: 11pt;
color: #c10031;
}
a.rvts28, span.rvts28
{
font-size: 11pt;
color: #0000ff;
text-decoration: underline;
}
a.rvts28:hover
{
color: #0000ff;
}
a.rvts29, span.rvts29
{
font-size: 11pt;
color: #0000ff;
text-decoration: underline;
}
a.rvts29:hover
{
color: #0000ff;
}
a.rvts30, span.rvts30
{
font-size: 11pt;
color: #0000ff;
text-decoration: underline;
}
a.rvts30:hover
{
color: #0000ff;
}
span.rvts31
{
font-size: 11pt;
text-decoration: underline;
}
a.rvts32, span.rvts32
{
font-size: 11pt;
color: #0000ff;
text-decoration: underline;
}
a.rvts32:hover
{
color: #0000ff;
}
span.rvts33
{
font-size: 11pt;
font-style: italic;
}
a.rvts34, span.rvts34
{
font-size: 11pt;
color: #0000ff;
text-decoration: underline;
}
a.rvts34:hover
{
color: #0000ff;
}
span.rvts35
{
font-size: 9pt;
font-weight: bold;
}
span.rvts36
{
font-size: 11pt;
font-weight: bold;
color: #008817;
text-decoration: underline;
}
span.rvts37
{
font-weight: bold;
}
a.rvts38, span.rvts38
{
font-size: 11pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts38:hover
{
color: #0000ff;
}
a.rvts39, span.rvts39
{
font-size: 11pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts39:hover
{
color: #0000ff;
}
a.rvts40, span.rvts40
{
font-size: 11pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts40:hover
{
color: #0000ff;
}
span.rvts41
{
font-size: 11pt;
color: #4f81bd;
}
span.rvts42
{
color: #004000;
}
a.rvts43, span.rvts43
{
color: #0000ff;
text-decoration: underline;
}
a.rvts43:hover
{
color: #0000ff;
}
span.rvts44
{
font-size: 6pt;
}
span.rvts45
{
font-size: 16pt;
text-decoration: underline;
}
span.rvts46
{
color: #000000;
}
span.rvts47
{
font-size: 11pt;
font-weight: bold;
color: #000000;
}
a.rvts48, span.rvts48
{
color: #0000ff;
text-decoration: underline;
}
a.rvts48:hover
{
color: #0000ff;
}
a.rvts49, span.rvts49
{
color: #0000ff;
text-decoration: underline;
}
a.rvts49:hover
{
color: #0000ff;
}
a.rvts50, span.rvts50
{
color: #0000ff;
text-decoration: underline;
}
a.rvts50:hover
{
color: #0000ff;
}
a.rvts51, span.rvts51
{
color: #0000ff;
text-decoration: underline;
}
a.rvts51:hover
{
color: #0000ff;
}
a.rvts52, span.rvts52
{
color: #0000ff;
text-decoration: underline;
}
a.rvts52:hover
{
color: #0000ff;
}
span.rvts53
{
font-weight: bold;
color: #0000ff;
}
span.rvts54
{
font-weight: bold;
color: #000080;
}
span.rvts55
{
font-style: italic;
color: #800000;
}
a.rvts56, span.rvts56
{
color: #008000;
text-decoration: underline;
}
span.rvts57
{
font-size: 11pt;
color: #0a8200;
}
span.rvts58
{
font-size: 11pt;
color: #000000;
}
span.rvts59
{
font-weight: bold;
color: #ffffff;
}
a.rvts60, span.rvts60
{
font-size: 9pt;
font-weight: bold;
color: #0000ff;
text-decoration: underline;
}
a.rvts60:hover
{
color: #0000ff;
}
span.rvts61
{
font-size: 12pt;
font-family: 'Courier New', 'Courier', monospace;
color: #000080;
}
span.rvts62
{
font-size: 11pt;
font-style: italic;
color: #243f60;
}
span.rvts63
{
font-size: 11pt;
color: #333399;
}
span.rvts64
{
font-size: 11pt;
font-style: italic;
font-weight: bold;
}
a.rvts65, span.rvts65
{
font-weight: bold;
color: #ffffff;
text-decoration: underline;
}
a.rvts65:hover
{
color: #0000ff;
}
span.rvts66
{
color: #ffffff;
}
span.rvts67
{
color: #333399;
}
/* ========== Para Styles ========== */
p,ul,ol /* Paragraph Style */
{
text-align: left;
text-indent: 0px;
padding: 0px 0px 0px 0px;
margin: 0px 0px 0px 0px;
}
.rvps1 /* Centered */
{
text-align: center;
}
.rvps2
{
}
.rvps3
{
text-align: center;
}
.rvps4
{
text-align: center;
margin: 4px 0px 0px 0px;
}
.rvps5
{
text-align: center;
line-height: 21px;
margin: 0px 0px 10px 0px;
}
.rvps6 /* Paragraph Style */
{
text-align: center;
border-color: #c0c0c0;
border-style: solid;
border-width: 1px;
border-right: none;
border-left: none;
padding: 2px 0px 2px 0px;
margin: 7px 0px 7px 0px;
}
.rvps7
{
text-align: justify;
text-justify: inter-word;
text-align-last: auto;
text-indent: 30px;
}
.rvps8
{
text-indent: 20px;
margin: 8px 0px 0px 30px;
}
.rvps9
{
text-indent: 30px;
}
.rvps10
{
text-align: justify;
text-align-last: auto;
text-indent: 30px;
padding: 0px 0px 0px 0px;
margin: 0px 0px 0px 0px;
}
.rvps11
{
text-indent: 30px;
margin: 0px 0px 6px 0px;
}
.rvps12
{
text-align: right;
}
.rvps13
{
text-align: center;
text-indent: 30px;
}
.rvps14
{
margin: 0px 0px 0px 50px;
}
.rvps15
{
text-align: justify;
text-justify: inter-word;
text-align-last: auto;
}
.rvps16
{
text-align: justify;
text-justify: inter-word;
text-align-last: auto;
margin: 0px 0px 0px 50px;
}
.rvps17
{
text-align: justify;
text-justify: inter-word;
text-align-last: auto;
text-indent: 20px;
}
.rvps18
{
text-indent: 30px;
margin: 0px 0px 0px 30px;
}
.rvps19
{
text-align: justify;
text-justify: inter-word;
text-align-last: auto;
text-indent: 30px;
margin: 0px 0px 0px 30px;
}
/* ========== Lists ========== */
.list0 {text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: decimal;}
.list1 {text-indent: 0px; padding: 0; margin: 0 0 0 72px; list-style-position: outside; list-style-type: decimal;}
.list2 {text-indent: 0px; padding: 0; margin: 0 0 0 48px; list-style-position: outside; list-style-type: decimal;}
.list3 {text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;}
.list4 {text-indent: 0px; padding: 0; margin: 0 0 0 72px; list-style-position: outside; list-style-type: circle;}
.list5 {text-indent: 0px; padding: 0; margin: 0 0 0 48px; list-style-position: outside; list-style-type: square;}
.list6 {text-indent: 0px; padding: 0; margin: 0 0 0 48px; list-style-position: outside; list-style-type: disc;}
.list7 {text-indent: 0px; padding: 0; margin: 0 0 0 48px; list-style-position: outside; list-style-type: circle;}
.list8 {text-indent: 0px; padding: 0; margin: 0 0 0 72px; list-style-position: outside; list-style-type: square;}
.list9 {text-indent: 0px; padding: 0; margin: 0 0 0 50px; list-style-position: outside;}
.list10 {text-indent: 0px; padding: 0; margin: 0 0 0 22px; list-style-position: outside; list-style-type: square;}
.list11 {text-indent: 0px; padding: 0; margin: 0 0 0 55px; list-style-position: outside; list-style-type: disc;}
.list12 {text-indent: 0px; padding: 0; margin: 0 0 0 17px; list-style-position: outside; list-style-type: circle;}
.list13 {text-indent: 32px; padding: 0; margin: 0 0 0 20px; list-style-position: inside; list-style-type: decimal;}
.list14 {text-indent: 0px; padding: 0; margin: 0 0 0 52px; list-style-position: outside; list-style-type: decimal;}
.list15 {text-indent: 25px; padding: 0; margin: 0 0 0 5px; list-style-position: inside; list-style-type: disc;}
.list16 {text-indent: 0px; padding: 0; margin: 0 0 0 67px; list-style-position: outside; list-style-type: circle;}
.list17 {text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;}
.list18 {text-indent: 0px; padding: 0; margin: 0 0 0 32px; list-style-position: outside; list-style-type: circle;}
.list19 {text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: decimal;}
.list20 {text-indent: 0px; padding: 0; margin: 0 0 0 32px; list-style-position: outside; list-style-type: decimal;}
.list21 {text-indent: 30px; padding: 0; margin: 0 0 0 70px; list-style-position: inside; list-style-type: disc;}
.list22 {text-indent: 0px; padding: 0; margin: 0 0 0 2px; list-style-position: outside; list-style-type: circle;}
.list23 {text-indent: 60px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;}

5
web/help/taseditor/css/layout.min.css vendored Normal file

File diff suppressed because one or more lines are too long

5
web/help/taseditor/css/print.min.css vendored Normal file
View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/header,nav,footer{display:none}div#main{margin:0}div#main>article .navigation{border-bottom:1px solid #aaa}div#main>article .navigation .nav-arrows{display:none}

View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/a{color:#3598dc}a:focus,a:hover{color:#1d6fa7}header{background-color:#333;border-bottom-color:#1a1a1a;color:#eee}header .hnd-toggle .icon-bar{background-color:#fff}header .hnd-toggle.active,header .hnd-toggle:active,header .hnd-toggle.focus,header .hnd-toggle:focus,header .hnd-toggle:active:focus,header .hnd-toggle:hover{background-color:#292929;border-color:#0f0f0f}header .hnd-toggle.active .icon-bar,header .hnd-toggle:active .icon-bar,header .hnd-toggle.focus .icon-bar,header .hnd-toggle:focus .icon-bar,header .hnd-toggle:active:focus .icon-bar,header .hnd-toggle:hover .icon-bar{background-color:#3598dc}nav{background-color:#333}nav .tab-tabs{border-bottom-color:#1a1a1a}nav .tab-tabs .hnd-toggle{background-color:#2e2e2e;border-color:#1a1a1a;color:#eee}nav .tab-tabs .hnd-toggle.active,nav .tab-tabs .hnd-toggle:active,nav .tab-tabs .hnd-toggle.focus,nav .tab-tabs .hnd-toggle:focus,nav .tab-tabs .hnd-toggle:active:focus,nav .tab-tabs .hnd-toggle:hover{background-color:#292929;border-color:#0f0f0f;color:#3598dc}nav .tab-tabs>li>a,nav .tab-tabs>li.active>a,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{color:#eee}nav .tab-tabs>li.active>a{background-color:#2e2e2e;color:#3598dc}nav .tab-tabs>li>a:focus,nav .tab-tabs>li>a:hover,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{background-color:#292929;color:#3598dc}nav .tab-tabs>li.tab::after{background:#3598dc}nav #search-info{border-left-color:#eee;color:#eee}.jstree .jstree-anchor{color:#eee}.jstree .jstree-node .jstree-clicked{background-color:#1f1f1f;border-color:#121212}.jstree .jstree-node .jstree-hovered{background-color:#141414;border-color:#080808}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:before{color:#eee}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:hover:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:hover:before{color:#3598dc}div#main>article .navigation{border-bottom-color:#f2f2f2}div#main>article .navigation .breadcrumb>li::after{color:#ccc}div#main>article .navigation .nav-arrows a{color:#333}div#main>article .navigation .nav-arrows a:hover,div#main>article .navigation .nav-arrows a:focus:hover{color:#3598dc}

View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/a{color:#82b440}a:focus,a:hover{color:#597c2c}header{background-color:#333;border-bottom-color:#1a1a1a;color:#eee}header .hnd-toggle .icon-bar{background-color:#fff}header .hnd-toggle.active,header .hnd-toggle:active,header .hnd-toggle.focus,header .hnd-toggle:focus,header .hnd-toggle:active:focus,header .hnd-toggle:hover{background-color:#292929;border-color:#0f0f0f}header .hnd-toggle.active .icon-bar,header .hnd-toggle:active .icon-bar,header .hnd-toggle.focus .icon-bar,header .hnd-toggle:focus .icon-bar,header .hnd-toggle:active:focus .icon-bar,header .hnd-toggle:hover .icon-bar{background-color:#82b440}nav{background-color:#333}nav .tab-tabs{border-bottom-color:#1a1a1a}nav .tab-tabs .hnd-toggle{background-color:#2e2e2e;border-color:#1a1a1a;color:#eee}nav .tab-tabs .hnd-toggle.active,nav .tab-tabs .hnd-toggle:active,nav .tab-tabs .hnd-toggle.focus,nav .tab-tabs .hnd-toggle:focus,nav .tab-tabs .hnd-toggle:active:focus,nav .tab-tabs .hnd-toggle:hover{background-color:#292929;border-color:#0f0f0f;color:#82b440}nav .tab-tabs>li>a,nav .tab-tabs>li.active>a,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{color:#eee}nav .tab-tabs>li.active>a{background-color:#2e2e2e;color:#82b440}nav .tab-tabs>li>a:focus,nav .tab-tabs>li>a:hover,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{background-color:#292929;color:#82b440}nav .tab-tabs>li.tab::after{background:#82b440}nav #search-info{border-left-color:#eee;color:#eee}.jstree .jstree-anchor{color:#eee}.jstree .jstree-node .jstree-clicked{background-color:#1f1f1f;border-color:#121212}.jstree .jstree-node .jstree-hovered{background-color:#141414;border-color:#080808}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:before{color:#eee}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:hover:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:hover:before{color:#82b440}div#main>article .navigation{border-bottom-color:#f2f2f2}div#main>article .navigation .breadcrumb>li::after{color:#ccc}div#main>article .navigation .nav-arrows a{color:#333}div#main>article .navigation .nav-arrows a:hover,div#main>article .navigation .nav-arrows a:focus:hover{color:#82b440}

View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/a{color:#f40}a:focus,a:hover{color:#b33000}header{background-color:#333;border-bottom-color:#1a1a1a;color:#eee}header .hnd-toggle .icon-bar{background-color:#fff}header .hnd-toggle.active,header .hnd-toggle:active,header .hnd-toggle.focus,header .hnd-toggle:focus,header .hnd-toggle:active:focus,header .hnd-toggle:hover{background-color:#292929;border-color:#0f0f0f}header .hnd-toggle.active .icon-bar,header .hnd-toggle:active .icon-bar,header .hnd-toggle.focus .icon-bar,header .hnd-toggle:focus .icon-bar,header .hnd-toggle:active:focus .icon-bar,header .hnd-toggle:hover .icon-bar{background-color:#f40}nav{background-color:#333}nav .tab-tabs{border-bottom-color:#1a1a1a}nav .tab-tabs .hnd-toggle{background-color:#2e2e2e;border-color:#1a1a1a;color:#eee}nav .tab-tabs .hnd-toggle.active,nav .tab-tabs .hnd-toggle:active,nav .tab-tabs .hnd-toggle.focus,nav .tab-tabs .hnd-toggle:focus,nav .tab-tabs .hnd-toggle:active:focus,nav .tab-tabs .hnd-toggle:hover{background-color:#292929;border-color:#0f0f0f;color:#f40}nav .tab-tabs>li>a,nav .tab-tabs>li.active>a,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{color:#eee}nav .tab-tabs>li.active>a{background-color:#2e2e2e;color:#f40}nav .tab-tabs>li>a:focus,nav .tab-tabs>li>a:hover,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{background-color:#292929;color:#f40}nav .tab-tabs>li.tab::after{background:#f40}nav #search-info{border-left-color:#eee;color:#eee}.jstree .jstree-anchor{color:#eee}.jstree .jstree-node .jstree-clicked{background-color:#1f1f1f;border-color:#121212}.jstree .jstree-node .jstree-hovered{background-color:#141414;border-color:#080808}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:before{color:#eee}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:hover:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:hover:before{color:#f40}div#main>article .navigation{border-bottom-color:#f2f2f2}div#main>article .navigation .breadcrumb>li::after{color:#ccc}div#main>article .navigation .nav-arrows a{color:#333}div#main>article .navigation .nav-arrows a:hover,div#main>article .navigation .nav-arrows a:focus:hover{color:#f40}

View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/a{color:#D400FF}a:focus,a:hover{color:#9400b3}header{background-color:#333;border-bottom-color:#1a1a1a;color:#eee}header .hnd-toggle .icon-bar{background-color:#fff}header .hnd-toggle.active,header .hnd-toggle:active,header .hnd-toggle.focus,header .hnd-toggle:focus,header .hnd-toggle:active:focus,header .hnd-toggle:hover{background-color:#292929;border-color:#0f0f0f}header .hnd-toggle.active .icon-bar,header .hnd-toggle:active .icon-bar,header .hnd-toggle.focus .icon-bar,header .hnd-toggle:focus .icon-bar,header .hnd-toggle:active:focus .icon-bar,header .hnd-toggle:hover .icon-bar{background-color:#D400FF}nav{background-color:#333}nav .tab-tabs{border-bottom-color:#1a1a1a}nav .tab-tabs .hnd-toggle{background-color:#2e2e2e;border-color:#1a1a1a;color:#eee}nav .tab-tabs .hnd-toggle.active,nav .tab-tabs .hnd-toggle:active,nav .tab-tabs .hnd-toggle.focus,nav .tab-tabs .hnd-toggle:focus,nav .tab-tabs .hnd-toggle:active:focus,nav .tab-tabs .hnd-toggle:hover{background-color:#292929;border-color:#0f0f0f;color:#D400FF}nav .tab-tabs>li>a,nav .tab-tabs>li.active>a,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{color:#eee}nav .tab-tabs>li.active>a{background-color:#2e2e2e;color:#D400FF}nav .tab-tabs>li>a:focus,nav .tab-tabs>li>a:hover,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{background-color:#292929;color:#D400FF}nav .tab-tabs>li.tab::after{background:#D400FF}nav #search-info{border-left-color:#eee;color:#eee}.jstree .jstree-anchor{color:#eee}.jstree .jstree-node .jstree-clicked{background-color:#1f1f1f;border-color:#121212}.jstree .jstree-node .jstree-hovered{background-color:#141414;border-color:#080808}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:before{color:#eee}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:hover:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:hover:before{color:#D400FF}div#main>article .navigation{border-bottom-color:#f2f2f2}div#main>article .navigation .breadcrumb>li::after{color:#ccc}div#main>article .navigation .nav-arrows a{color:#333}div#main>article .navigation .nav-arrows a:hover,div#main>article .navigation .nav-arrows a:focus:hover{color:#D400FF}

View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/a{color:#337ab7}a:focus,a:hover{color:#22527b}header{background-color:#fff;border-bottom-color:#e6e6e6;color:#222}header .hnd-toggle .icon-bar{background-color:#6f6f6f}header .hnd-toggle.active,header .hnd-toggle:active,header .hnd-toggle.focus,header .hnd-toggle:focus,header .hnd-toggle:active:focus,header .hnd-toggle:hover{background-color:#f5f5f5;border-color:#dbdbdb}header .hnd-toggle.active .icon-bar,header .hnd-toggle:active .icon-bar,header .hnd-toggle.focus .icon-bar,header .hnd-toggle:focus .icon-bar,header .hnd-toggle:active:focus .icon-bar,header .hnd-toggle:hover .icon-bar{background-color:#337ab7}nav{background-color:#f7f7f7}nav .tab-tabs{border-bottom-color:#dedede}nav .tab-tabs .hnd-toggle{background-color:#f2f2f2;border-color:#dedede;color:#666}nav .tab-tabs .hnd-toggle.active,nav .tab-tabs .hnd-toggle:active,nav .tab-tabs .hnd-toggle.focus,nav .tab-tabs .hnd-toggle:focus,nav .tab-tabs .hnd-toggle:active:focus,nav .tab-tabs .hnd-toggle:hover{background-color:#ededed;border-color:#d3d3d3;color:#337ab7}nav .tab-tabs>li>a,nav .tab-tabs>li.active>a,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{color:#666}nav .tab-tabs>li.active>a{background-color:#f2f2f2;color:#337ab7}nav .tab-tabs>li>a:focus,nav .tab-tabs>li>a:hover,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{background-color:#ededed;color:#337ab7}nav .tab-tabs>li.tab::after{background:#337ab7}nav #search-info{border-left-color:#666;color:#666}.jstree .jstree-anchor{color:#666}.jstree .jstree-node .jstree-clicked{background-color:#e3e3e3;border-color:#d6d6d6}.jstree .jstree-node .jstree-hovered{background-color:#d8d8d8;border-color:#ccc}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:before{color:#666}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:hover:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:hover:before{color:#337ab7}div#main>article .navigation{border-bottom-color:#f2f2f2}div#main>article .navigation .breadcrumb>li::after{color:#ccc}div#main>article .navigation .nav-arrows a{color:#222}div#main>article .navigation .nav-arrows a:hover,div#main>article .navigation .nav-arrows a:focus:hover{color:#337ab7}

View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/a{color:#6f9a37}a:focus,a:hover{color:#466223}header{background-color:#fff;border-bottom-color:#e6e6e6;color:#222}header .hnd-toggle .icon-bar{background-color:#6f6f6f}header .hnd-toggle.active,header .hnd-toggle:active,header .hnd-toggle.focus,header .hnd-toggle:focus,header .hnd-toggle:active:focus,header .hnd-toggle:hover{background-color:#f5f5f5;border-color:#dbdbdb}header .hnd-toggle.active .icon-bar,header .hnd-toggle:active .icon-bar,header .hnd-toggle.focus .icon-bar,header .hnd-toggle:focus .icon-bar,header .hnd-toggle:active:focus .icon-bar,header .hnd-toggle:hover .icon-bar{background-color:#6f9a37}nav{background-color:#f7f7f7}nav .tab-tabs{border-bottom-color:#dedede}nav .tab-tabs .hnd-toggle{background-color:#f2f2f2;border-color:#dedede;color:#666}nav .tab-tabs .hnd-toggle.active,nav .tab-tabs .hnd-toggle:active,nav .tab-tabs .hnd-toggle.focus,nav .tab-tabs .hnd-toggle:focus,nav .tab-tabs .hnd-toggle:active:focus,nav .tab-tabs .hnd-toggle:hover{background-color:#ededed;border-color:#d3d3d3;color:#6f9a37}nav .tab-tabs>li>a,nav .tab-tabs>li.active>a,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{color:#666}nav .tab-tabs>li.active>a{background-color:#f2f2f2;color:#6f9a37}nav .tab-tabs>li>a:focus,nav .tab-tabs>li>a:hover,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{background-color:#ededed;color:#6f9a37}nav .tab-tabs>li.tab::after{background:#6f9a37}nav #search-info{border-left-color:#666;color:#666}.jstree .jstree-anchor{color:#666}.jstree .jstree-node .jstree-clicked{background-color:#e3e3e3;border-color:#d6d6d6}.jstree .jstree-node .jstree-hovered{background-color:#d8d8d8;border-color:#ccc}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:before{color:#666}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:hover:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:hover:before{color:#6f9a37}div#main>article .navigation{border-bottom-color:#f2f2f2}div#main>article .navigation .breadcrumb>li::after{color:#ccc}div#main>article .navigation .nav-arrows a{color:#222}div#main>article .navigation .nav-arrows a:hover,div#main>article .navigation .nav-arrows a:focus:hover{color:#6f9a37}

View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/a{color:#B23000}a:focus,a:hover{color:#661b00}header{background-color:#fff;border-bottom-color:#e6e6e6;color:#222}header .hnd-toggle .icon-bar{background-color:#6f6f6f}header .hnd-toggle.active,header .hnd-toggle:active,header .hnd-toggle.focus,header .hnd-toggle:focus,header .hnd-toggle:active:focus,header .hnd-toggle:hover{background-color:#f5f5f5;border-color:#dbdbdb}header .hnd-toggle.active .icon-bar,header .hnd-toggle:active .icon-bar,header .hnd-toggle.focus .icon-bar,header .hnd-toggle:focus .icon-bar,header .hnd-toggle:active:focus .icon-bar,header .hnd-toggle:hover .icon-bar{background-color:#B23000}nav{background-color:#f7f7f7}nav .tab-tabs{border-bottom-color:#dedede}nav .tab-tabs .hnd-toggle{background-color:#f2f2f2;border-color:#dedede;color:#666}nav .tab-tabs .hnd-toggle.active,nav .tab-tabs .hnd-toggle:active,nav .tab-tabs .hnd-toggle.focus,nav .tab-tabs .hnd-toggle:focus,nav .tab-tabs .hnd-toggle:active:focus,nav .tab-tabs .hnd-toggle:hover{background-color:#ededed;border-color:#d3d3d3;color:#B23000}nav .tab-tabs>li>a,nav .tab-tabs>li.active>a,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{color:#666}nav .tab-tabs>li.active>a{background-color:#f2f2f2;color:#B23000}nav .tab-tabs>li>a:focus,nav .tab-tabs>li>a:hover,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{background-color:#ededed;color:#B23000}nav .tab-tabs>li.tab::after{background:#B23000}nav #search-info{border-left-color:#666;color:#666}.jstree .jstree-anchor{color:#666}.jstree .jstree-node .jstree-clicked{background-color:#e3e3e3;border-color:#d6d6d6}.jstree .jstree-node .jstree-hovered{background-color:#d8d8d8;border-color:#ccc}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:before{color:#666}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:hover:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:hover:before{color:#B23000}div#main>article .navigation{border-bottom-color:#f2f2f2}div#main>article .navigation .breadcrumb>li::after{color:#ccc}div#main>article .navigation .nav-arrows a{color:#222}div#main>article .navigation .nav-arrows a:hover,div#main>article .navigation .nav-arrows a:focus:hover{color:#B23000}

View File

@ -0,0 +1,5 @@
/*!
* HelpNDoc HTML template
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/a{color:#9400B2}a:focus,a:hover{color:#540066}header{background-color:#fff;border-bottom-color:#e6e6e6;color:#222}header .hnd-toggle .icon-bar{background-color:#6f6f6f}header .hnd-toggle.active,header .hnd-toggle:active,header .hnd-toggle.focus,header .hnd-toggle:focus,header .hnd-toggle:active:focus,header .hnd-toggle:hover{background-color:#f5f5f5;border-color:#dbdbdb}header .hnd-toggle.active .icon-bar,header .hnd-toggle:active .icon-bar,header .hnd-toggle.focus .icon-bar,header .hnd-toggle:focus .icon-bar,header .hnd-toggle:active:focus .icon-bar,header .hnd-toggle:hover .icon-bar{background-color:#9400B2}nav{background-color:#f7f7f7}nav .tab-tabs{border-bottom-color:#dedede}nav .tab-tabs .hnd-toggle{background-color:#f2f2f2;border-color:#dedede;color:#666}nav .tab-tabs .hnd-toggle.active,nav .tab-tabs .hnd-toggle:active,nav .tab-tabs .hnd-toggle.focus,nav .tab-tabs .hnd-toggle:focus,nav .tab-tabs .hnd-toggle:active:focus,nav .tab-tabs .hnd-toggle:hover{background-color:#ededed;border-color:#d3d3d3;color:#9400B2}nav .tab-tabs>li>a,nav .tab-tabs>li.active>a,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{color:#666}nav .tab-tabs>li.active>a{background-color:#f2f2f2;color:#9400B2}nav .tab-tabs>li>a:focus,nav .tab-tabs>li>a:hover,nav .tab-tabs>li.active>a:focus,nav .tab-tabs>li.active>a:hover{background-color:#ededed;color:#9400B2}nav .tab-tabs>li.tab::after{background:#9400B2}nav #search-info{border-left-color:#666;color:#666}.jstree .jstree-anchor{color:#666}.jstree .jstree-node .jstree-clicked{background-color:#e3e3e3;border-color:#d6d6d6}.jstree .jstree-node .jstree-hovered{background-color:#d8d8d8;border-color:#ccc}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:before{color:#666}.jstree .jstree-node.jstree-closed>.jstree-icon.jstree-ocl:hover:before,.jstree .jstree-node.jstree-open>.jstree-icon.jstree-ocl:hover:before{color:#9400B2}div#main>article .navigation{border-bottom-color:#f2f2f2}div#main>article .navigation .breadcrumb>li::after{color:#ccc}div#main>article .navigation .nav-arrows a{color:#222}div#main>article .navigation .nav-arrows a:hover,div#main>article .navigation .nav-arrows a:focus:hover{color:#9400B2}

View File

@ -1,34 +1,344 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<!DOCTYPE html>
<html lang="en">
<head> <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta charset="utf-8" />
<meta name="generator" content="HelpNDoc Personal Edition 3.9.1.648"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<title>TAS Editor Manual</title> <meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<script type="text/javascript"> <meta name="viewport" content="width=device-width, initial-scale=1" />
function escapeHtml(unsafe) { <link rel="icon" href="favicon.ico"/>
return unsafe.replace(/javascript/gi, "").replace(/script/gi, "").replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;");
} <title>Title</title>
var sTopic = ""; <meta name="description" content="" />
if (top.location.href.lastIndexOf("?") > 0) <meta name="keywords" content="">
sTopic = top.location.href.substring(top.location.href.lastIndexOf("?") + 1, top.location.href.length);
if (sTopic == "") sTopic = "Title.html";
sTopic = escapeHtml(sTopic);
document.write('<frameset cols="250,*">');
document.write('<frame src="toc.html" name="FrameTOC">');
document.write('<frame src="' + sTopic + '" name="FrameMain">'); <!-- Twitter Card data -->
document.write('</frameset>'); <meta name="twitter:card" content="summary">
</script> <meta name="twitter:title" content="Title">
<meta name="twitter:description" content="">
<!-- Open Graph data -->
<meta property="og:title" content="Title" />
<meta property="og:type" content="article" />
<meta property="og:description" content="" />
<meta property="og:site_name" content="TAS Editor Manual" />
<!-- Bootstrap core CSS -->
<link href="vendors/bootstrap-3.4.1/css/bootstrap.min.css" rel="stylesheet"/>
<!-- IE10 viewport hack for Surface/desktop Windows 8 bug -->
<link href="vendors/bootstrap-3.4.1/css/ie10-viewport-bug-workaround.css" rel="stylesheet"/>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="vendors/html5shiv-3.7.3/html5shiv.min.js"></script>
<script src="vendors/respond-1.4.2/respond.min.js"></script>
<![endif]-->
<!-- JsTree styles -->
<link href="vendors/jstree-3.3.10/themes/default/style.min.css" rel="stylesheet"/>
<!-- Hnd styles -->
<link href="css/layout.min.css" rel="stylesheet" />
<link href="css/effects.min.css" rel="stylesheet" />
<link href="css/theme-light-blue.min.css" rel="stylesheet" />
<link href="css/print.min.css" rel="stylesheet" media="print" />
<style type="text/css">nav { width: 250px} @media screen and (min-width:769px) { body.md-nav-expanded div#main { margin-left: 250px} body.md-nav-expanded header { padding-left: 264px} }</style>
<!-- Content style -->
<link href="css/hnd.content.css" rel="stylesheet" />
</head> </head>
<noscript> <body class="md-nav-expanded">
<frameset cols="250,*">
<frame src="toc.html" name="FrameTOC">
<frame src="Title.html" name="FrameMain">
</frameset> <div id="skip-link">
</noscript> <a href="#main-content" class="element-invisible">Skip to main content</a>
</div>
<header class="headroom">
<button class="hnd-toggle btn btn-default">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span>
</button>
<h1>TAS Editor Manual</h1>
</header>
<nav id="panel-left" class="md-nav-expanded">
<!-- Nav tabs -->
<ul class="tab-tabs nav nav-tabs" role="tablist">
<li id="nav-close">
<button class="hnd-toggle btn btn-default">
<span class="glyphicon glyphicon-remove" aria-hidden="true"></span>
</button>
</li>
<li role="presentation" class="tab active">
<a href="#contents" id="tab-contents" aria-controls="contents" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-list"></i>
Contents
</a>
</li>
<li role="presentation" class="tab">
<a href="#index" id="tab-index" aria-controls="index" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-asterisk"></i>
Index
</a>
</li>
<li role="presentation" class="tab">
<a href="#search" id="tab-search" aria-controls="search" role="tab" data-toggle="tab">
<i class="glyphicon glyphicon-search"></i>
Search
</a>
</li>
</ul> <!-- /Nav tabs -->
<!-- Tab panes -->
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="contents">
<div id="toc" class="tree-container unselectable"
data-openlvl="1"
>
<ul><li id="Title" data-jstree='{"icon": "icon-20"}'><a href="Title.html">Title</a></li><li id="BeginnersGuide" ><a href="BeginnersGuide.html">Beginner's Guide</a><ul><li id="Introduction" data-jstree='{"icon": "icon-1"}'><a href="Introduction.html">1. Introduction</a></li><li id="ProgramInterface" ><a href="ProgramInterface.html">2. Program Interface</a><ul><li id="PianoRoll" data-jstree='{"icon": "icon-1"}'><a href="PianoRoll.html">2.1. Piano Roll</a></li><li id="Toolbox" data-jstree='{"icon": "icon-1"}'><a href="Toolbox.html">2.2. Toolbox</a></li></ul></li><li id="TASingProcess" data-jstree='{"icon": "icon-1"}'><a href="TASingProcess.html">3. TASing Process</a></li><li id="TASingMethodology" ><a href="TASingMethodology.html">4. TASing Methodology</a><ul><li id="TraditionalTASing" data-jstree='{"icon": "icon-1"}'><a href="TraditionalTASing.html">4.1. Traditional TASing</a></li><li id="NonlinearTASing" data-jstree='{"icon": "icon-1"}'><a href="NonlinearTASing.html">4.2. Nonlinear TASing</a></li><li id="SemiautomaticTASing" data-jstree='{"icon": "icon-1"}'><a href="SemiautomaticTASing.html">4.3. Semiautomatic TASing</a></li></ul></li><li id="ProgramCustomization" data-jstree='{"icon": "icon-1"}'><a href="ProgramCustomization.html">5. Program customization</a></li><li id="AdvancedFeatures" data-jstree='{"icon": "icon-1"}'><a href="AdvancedFeatures.html">6. Advanced Features</a></li></ul></li><li id="Reference" ><a href="Reference.html">Reference</a><ul><li id="Glossary" data-jstree='{"icon": "icon-1"}'><a href="Glossary.html">Glossary</a></li><li id="Controls" data-jstree='{"icon": "icon-1"}'><a href="Controls.html">Controls</a></li><li id="Navigation" data-jstree='{"icon": "icon-1"}'><a href="Navigation.html">Navigation</a></li><li id="Operations" data-jstree='{"icon": "icon-1"}'><a href="Operations.html">Operations</a></li><li id="LuaAPI" data-jstree='{"icon": "icon-1"}'><a href="LuaAPI.html">Lua API</a></li><li id="FAQ" data-jstree='{"icon": "icon-1"}'><a href="FAQ.html">FAQ</a></li><li id="SpeedrunningSynopsis" data-jstree='{"icon": "icon-1"}'><a href="SpeedrunningSynopsis.html">Speedrunning synopsis</a></li></ul></li><li id="TASEditorInside" ><a href="TASEditorInside.html">TAS Editor Inside</a><ul><li id="Ideas" data-jstree='{"icon": "icon-1"}'><a href="Ideas.html">Ideas</a></li><li id="Implementation" data-jstree='{"icon": "icon-1"}'><a href="Implementation.html">Implementation</a></li><li id="MistakeProofing" data-jstree='{"icon": "icon-1"}'><a href="MistakeProofing.html">Mistake-proofing</a></li><li id="FM3format" data-jstree='{"icon": "icon-1"}'><a href="FM3format.html">FM3 format</a></li></ul></li></ul>
</div>
</div> <!-- /contents-->
<div role="tabpanel" class="tab-pane" id="index">
<div id="keywords" class="tree-container unselectable"
data-openlvl="1"
>
<ul></ul>
</div>
</div> <!-- /index-->
<div role="tabpanel" class="tab-pane" id="search">
<div class="search-content">
<div class="search-input">
<form id="search-form">
<div class="form-group">
<div class="input-group">
<input type="text" class="form-control" id="input-search" name="input-search" placeholder="Search..." />
<span class="input-group-btn">
<button class="btn btn-default" type="submit">
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
</button>
</span>
</div>
</div>
</form>
</div> <!-- /search-input -->
<div class="search-result">
<div id="search-info"></div>
<div class="tree-container unselectable" id="search-tree"></div>
</div> <!-- /search-result -->
</div> <!-- /search-content -->
</div> <!-- /search-->
</div> <!-- /Tab panes -->
</nav>
<div id="main">
<article>
<div id="topic-content" class="container-fluid"
data-hnd-id="Title"
data-hnd-context="0"
data-hnd-title="Title"
>
<div class="navigation">
<ol class="breadcrumb">
</ol>
<div class="nav-arrows">
<div class="btn-group btn-group-xs" role="group"><a class="btn btn-default" href="BeginnersGuide.html" title="Beginner's Guide" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Title</h2>
<div class="main-content">
<p></p>
<p class="rvps3"><span class="rvts6"><br/></span></p>
<p class="rvps3"><span class="rvts6"><br/></span></p>
<p class="rvps3"><span class="rvts8">TAS Editor 1.01</span></p>
<p class="rvps3"><span class="rvts9"><br/></span></p>
<p class="rvps3"><span class="rvts9"><br/></span></p>
<p class="rvps3"><span class="rvts9">Welcome to the TAS Editor Manual!</span></p>
<p class="rvps3"><span class="rvts9"><br/></span></p>
<div class="rvps3">
<table width="90%" border="0" cellpadding="0" cellspacing="0" style="border-width: 0px; border-spacing: 0px; margin: 0px auto;">
<tr valign="top">
<td style="padding: 0px;">
<p class="rvps3"><span class="rvts9">Taseditor is an Integrated development environment dedicated to TASing.</span></p>
<p class="rvps3"><span class="rvts9">Playing videogames in Taseditor resembles both interactive programming and drawing notes by mouse in a music editor.</span></p>
</td>
</tr>
</table>
</div>
<p class="rvps3"><span class="rvts6"><br/></span></p>
<div class="rvps3">
<table width="700" border="1" cellpadding="8" cellspacing="0" style="border-color: #000000; border-style: solid; border-spacing: 0px; margin: 0px auto;">
<tr valign="bottom">
<td width="32%" height="36" style="border-color: #000000; border-style: solid; padding: 8px; border-bottom: none; background-color: #ffe5e3;">
<p class="rvps4"><a class="rvts14" href="BeginnersGuide.html">Beginner's Guide</a></p>
</td>
<td width="32%" height="36" style="border-color: #000000; border-style: solid; padding: 8px; border-bottom: none; background-color: #d9ffdd;">
<p class="rvps4"><a class="rvts14" href="Reference.html">Reference</a></p>
</td>
<td width="30%" height="36" style="border-color: #000000; border-style: solid; padding: 8px; border-bottom: none; background-color: #d0ffff;">
<p class="rvps4"><a class="rvts15" href="TASEditorInside.html">TAS Editor Inside</a></p>
</td>
</tr>
<tr valign="top">
<td width="32%" height="54" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; border-bottom: none; background-color: #ffe5e3;">
<p class="rvps3"><span class="rvts13">If you're seeing the Manual for the first time, please study this whole course</span></p>
</td>
<td width="32%" height="54" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; border-bottom: none; background-color: #d9ffdd;">
<p class="rvps3"><span class="rvts13">Look here when you need to know comprehensive specifications about limits and possibilities of TAS Editor</span></p>
</td>
<td width="30%" height="54" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; border-bottom: none; background-color: #d0ffff;">
<p class="rvps3"><span class="rvts13">Read these docs when you wish to learn details of the system</span></p>
</td>
</tr>
<tr valign="top">
<td width="32%" height="179" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; background-color: #ffe5e3;">
<p class="rvps5"><a class="rvts11" href="Introduction.html">Introduction</a></p>
<p class="rvps5"><a class="rvts11" href="ProgramInterface.html">Program Interface</a></p>
<p class="rvps5"><a class="rvts12" href="TASingProcess.html">TASing Process</a></p>
<p class="rvps5"><a class="rvts12" href="TASingMethodology.html">TASing Methodology</a></p>
<p class="rvps5"><a class="rvts12" href="ProgramCustomization.html">Program Customization</a></p>
<p class="rvps5"><a class="rvts12" href="AdvancedFeatures.html">Advanced Features</a></p>
</td>
<td width="32%" height="179" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; background-color: #d9ffdd;">
<p class="rvps5"><a class="rvts12" href="Glossary.html">Glossary</a></p>
<p class="rvps5"><a class="rvts12" href="Controls.html">Controls</a></p>
<p class="rvps5"><a class="rvts12" href="Navigation.html">Navigation</a></p>
<p class="rvps5"><a class="rvts12" href="Operations.html">Operations</a></p>
<p class="rvps5"><a class="rvts12" href="LuaAPI.html">Lua API</a></p>
<p class="rvps5"><a class="rvts12" href="FAQ.html">FAQ</a></p>
<p class="rvps5"><a class="rvts12" href="SpeedrunningSynopsis.html">Speedrunning Synopsis</a></p>
</td>
<td width="30%" height="179" style="border-color: #000000; border-style: solid; padding: 8px; border-top: none; background-color: #d0ffff;">
<p class="rvps5"><a class="rvts12" href="Ideas.html">Ideas</a></p>
<p class="rvps5"><a class="rvts12" href="Implementation.html">Implementation</a></p>
<p class="rvps5"><a class="rvts12" href="MistakeProofing.html">Mistake-proofing</a></p>
<p class="rvps5"><a class="rvts12" href="FM3format.html">FM3 format</a></p>
</td>
</tr>
</table>
</div>
<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 class="rvps2"><span class="rvts6">Author of TAS Editor v1.01: AnS</span></p>
<p class="rvps2"><span class="rvts6">Assistance in testing: feos</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6">Author of this Manual: AnS</span></p>
<p class="rvps2"><span class="rvts6">English translation: AnS, feos</span></p>
<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="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p></p>
<p class="rvps6" style="clear: both;"><span class="rvts16">Created with the Personal Edition of HelpNDoc: </span><a class="rvts17" href="https://www.helpndoc.com">Free PDF documentation generator</a></p>
</div>
<div id="topic_footer"><div id="topic_footer_content">&copy; 2011-2013 AnS</div></div>
</div> <!-- /#topic-content -->
</article>
<footer></footer>
</div> <!-- /#main -->
<div class="mask" data-toggle="sm-nav-expanded"></div>
<!-- Modal -->
<div class="modal fade" id="hndModal" tabindex="-1" role="dialog" aria-labelledby="hndModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="hndModalLabel"></h4>
</div>
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary modal-btn-close" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Splitter -->
<div id="hnd-splitter" style="left: 250px"></div>
<!-- Scripts -->
<script src="vendors/jquery-3.5.1/jquery.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/bootstrap.min.js"></script>
<script src="vendors/bootstrap-3.4.1/js/ie10-viewport-bug-workaround.js"></script>
<script src="vendors/markjs-8.11.1/jquery.mark.min.js"></script>
<script src="vendors/uri-1.19.2/uri.min.js"></script>
<script src="vendors/imageMapResizer-1.0.10/imageMapResizer.min.js"></script>
<script src="vendors/headroom-0.11.0/headroom.min.js"></script>
<script src="vendors/jstree-3.3.10/jstree.min.js"></script>
<script src="vendors/interactjs-1.9.22/interact.min.js"></script>
<!-- HelpNDoc scripts -->
<script src="js/polyfill.object.min.js"></script>
<script src="_translations.js"></script>
<script src="js/hndsd.min.js"></script>
<script src="js/hndse.min.js"></script>
<script src="js/app.min.js"></script>
<!-- Init script -->
<script>
$(function() {
// Create the app
var app = new Hnd.App();
// Update translations
hnd_ut(app);
// Instanciate imageMapResizer
imageMapResize();
// Custom JS
// Boot the app
app.Boot();
});
</script>
</body>
</html> </html>

6
web/help/taseditor/js/app.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1
web/help/taseditor/js/hndsd.min.js vendored Normal file

File diff suppressed because one or more lines are too long

6
web/help/taseditor/js/hndse.min.js vendored Normal file
View File

@ -0,0 +1,6 @@
"use strict";/*!
* HND JavaScript search engine
* Copyright (C) IBE Software - All rights reserved.
* Can only be used in documentation generated by HelpNDoc: http://www.helpndoc.com
*/
var Score;!function(r){r[r.TopicNumber=0]="TopicNumber",r[r.TopicScore=1]="TopicScore"}(Score||(Score={}));var HndJsSeWordList=function(){function r(){this.words=[]}return r.prototype.AddWord=function(r){this.words.push(r.toLowerCase())},r.prototype.Clear=function(){this.words=[]},r.prototype.Count=function(){return this.words.length},r.prototype.FindExact=function(r){return r=r.toLowerCase(),this.words.indexOf(r)},r.prototype.FindPartial=function(r){r=r.toLowerCase();for(var o=0;o<this.words.length;o++)if(-1!==this.words[o].indexOf(r))return o;return-1},r}(),HndJsSeResultScore=function(){function r(){this.scores=[]}return r.prototype.FindTopicIndex=function(r){for(var o=0;o<this.scores.length;o++){if(this.scores[o][Score.TopicNumber]===r)return o}return-1},r.prototype.AddTopics=function(r){var o=this;if(!r||!r.forEach)return void console.error("Invalid AddTopics call");r.forEach(function(r){if(!r||!Array.isArray(r)||2!==r.length)return void console.error("Invalid data in AddTopics");var e=r[Score.TopicNumber],t=r[Score.TopicScore];if("number"!=typeof e||e<0||"number"!=typeof t||t<0)return void console.error("Invalid topic data in AddTopics");var i=o.FindTopicIndex(e);i>-1?o.scores[i][Score.TopicScore]=o.scores[i][Score.TopicScore]+t:o.scores.push([e,t])})},r.prototype.Clear=function(){this.scores=[]},r.prototype.ExcludeTopics=function(r){var o=this;if(!r||!r.forEach)return void console.error("Invalid ExcludeTopics call");r.forEach(function(r){if(!r||!Array.isArray(r)||2!==r.length)return void console.error("Invalid data in ExcludeTopics");var e=r[Score.TopicNumber];if("number"!=typeof e||e<0)return void console.error("Invalid topic data in ExcludeTopics");var t=o.FindTopicIndex(e);t>-1&&o.scores.splice(t,1)})},r.prototype.SortByScore=function(){this.scores.sort(function(r,o){return r[Score.TopicScore]>o[Score.TopicScore]?-1:r[Score.TopicScore]<o[Score.TopicScore]?1:0})},r}(),HndJsSe=function(){function r(){this.inputWordsExcluded=new HndJsSeWordList,this.inputWordsIncluded=new HndJsSeWordList,this.inputWordsMandatory=new HndJsSeWordList,this.resultScoreIncluded=new HndJsSeResultScore,this.resultScoreMandatory=new HndJsSeResultScore,this.resultScoreExcluded=new HndJsSeResultScore}return r.prototype.Reset=function(){this.input="",this.inputWordsExcluded.Clear(),this.inputWordsIncluded.Clear(),this.inputWordsMandatory.Clear(),this.resultScoreIncluded.Clear(),this.resultScoreMandatory.Clear(),this.resultScoreExcluded.Clear()},r.prototype.ParseInput=function(r){this.Reset(),this.input=r.trim();for(var o,e=/[-+]?"[^"]+"|[-+]?[^"\s]+/g;o=e.exec(this.input);)if(o[0]){var t=o[0].trim().toLowerCase();if(""!=t){var i="";for("-"!==t[0]&&"+"!==t[0]||(i=t[0],t=t.substr(1));t.length>0&&'"'===t[0];)t=t.substr(1);for(;t.length>0&&'"'===t[t.length-1];)t=t.substr(0,t.length-1);switch(i){case"-":this.inputWordsExcluded.AddWord(t);break;case"+":this.inputWordsIncluded.AddWord(t);break;default:this.inputWordsMandatory.AddWord(t)}}}},r.prototype.PerformSearch=function(r){var o=this;if(this.resultScoreIncluded=new HndJsSeResultScore,this.resultScoreMandatory=new HndJsSeResultScore,this.resultScoreExcluded=new HndJsSeResultScore,!r||!r.length)return console.error("Invalid word list data"),[];var e;r.forEach(function(r){if("string"==typeof r)e=r.trim().toLowerCase();else{if(!Array.isArray(r))return void console.error("Invalid element in word list data:",r);if(""==e)return void console.warn("Empty word should not be included in list");-1!==o.inputWordsIncluded.FindPartial(e)&&o.resultScoreIncluded.AddTopics(r),-1!==o.inputWordsMandatory.FindPartial(e)&&o.resultScoreMandatory.AddTopics(r),-1!==o.inputWordsExcluded.FindPartial(e)&&o.resultScoreExcluded.AddTopics(r)}});var t=this.resultScoreIncluded;return t.AddTopics(this.resultScoreMandatory.scores),t.ExcludeTopics(this.resultScoreExcluded.scores),t.SortByScore(),t.scores},r}();

View File

@ -0,0 +1 @@
"use strict";"function"!=typeof Object.assign&&Object.defineProperty(Object,"assign",{value:function(e){for(var r=[],t=1;t<arguments.length;t++)r[t-1]=arguments[t];if(null===e||void 0===e)throw new TypeError("Cannot convert undefined or null to object");for(var n=Object(e),o=1;o<arguments.length;o++){var i=arguments[o];if(null!==i&&void 0!==i)for(var l in i)Object.prototype.hasOwnProperty.call(i,l)&&(n[l]=i[l])}return n},writable:!0,configurable:!0});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 238 B

After

Width:  |  Height:  |  Size: 238 B

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,15 @@
/*!
* IE10 viewport hack for Surface/desktop Windows 8 bug
* Copyright 2014-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
/*
* See the Getting Started docs for more information:
* http://getbootstrap.com/getting-started/#support-ie10-width
*/
@-webkit-viewport { width: device-width; }
@-moz-viewport { width: device-width; }
@-ms-viewport { width: device-width; }
@-o-viewport { width: device-width; }
@viewport { width: device-width; }

View File

@ -0,0 +1,288 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<svg xmlns="http://www.w3.org/2000/svg">
<metadata></metadata>
<defs>
<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >
<font-face units-per-em="1200" ascent="960" descent="-240" />
<missing-glyph horiz-adv-x="500" />
<glyph horiz-adv-x="0" />
<glyph horiz-adv-x="400" />
<glyph unicode=" " />
<glyph unicode="*" d="M600 1100q15 0 34 -1.5t30 -3.5l11 -1q10 -2 17.5 -10.5t7.5 -18.5v-224l158 158q7 7 18 8t19 -6l106 -106q7 -8 6 -19t-8 -18l-158 -158h224q10 0 18.5 -7.5t10.5 -17.5q6 -41 6 -75q0 -15 -1.5 -34t-3.5 -30l-1 -11q-2 -10 -10.5 -17.5t-18.5 -7.5h-224l158 -158 q7 -7 8 -18t-6 -19l-106 -106q-8 -7 -19 -6t-18 8l-158 158v-224q0 -10 -7.5 -18.5t-17.5 -10.5q-41 -6 -75 -6q-15 0 -34 1.5t-30 3.5l-11 1q-10 2 -17.5 10.5t-7.5 18.5v224l-158 -158q-7 -7 -18 -8t-19 6l-106 106q-7 8 -6 19t8 18l158 158h-224q-10 0 -18.5 7.5 t-10.5 17.5q-6 41 -6 75q0 15 1.5 34t3.5 30l1 11q2 10 10.5 17.5t18.5 7.5h224l-158 158q-7 7 -8 18t6 19l106 106q8 7 19 6t18 -8l158 -158v224q0 10 7.5 18.5t17.5 10.5q41 6 75 6z" />
<glyph unicode="+" d="M450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-350h350q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-350v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v350h-350q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5 h350v350q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xa0;" />
<glyph unicode="&#xa5;" d="M825 1100h250q10 0 12.5 -5t-5.5 -13l-364 -364q-6 -6 -11 -18h268q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-100h275q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-125v-174q0 -11 -7.5 -18.5t-18.5 -7.5h-148q-11 0 -18.5 7.5t-7.5 18.5v174 h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h125v100h-275q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h118q-5 12 -11 18l-364 364q-8 8 -5.5 13t12.5 5h250q25 0 43 -18l164 -164q8 -8 18 -8t18 8l164 164q18 18 43 18z" />
<glyph unicode="&#x2000;" horiz-adv-x="650" />
<glyph unicode="&#x2001;" horiz-adv-x="1300" />
<glyph unicode="&#x2002;" horiz-adv-x="650" />
<glyph unicode="&#x2003;" horiz-adv-x="1300" />
<glyph unicode="&#x2004;" horiz-adv-x="433" />
<glyph unicode="&#x2005;" horiz-adv-x="325" />
<glyph unicode="&#x2006;" horiz-adv-x="216" />
<glyph unicode="&#x2007;" horiz-adv-x="216" />
<glyph unicode="&#x2008;" horiz-adv-x="162" />
<glyph unicode="&#x2009;" horiz-adv-x="260" />
<glyph unicode="&#x200a;" horiz-adv-x="72" />
<glyph unicode="&#x202f;" horiz-adv-x="260" />
<glyph unicode="&#x205f;" horiz-adv-x="325" />
<glyph unicode="&#x20ac;" d="M744 1198q242 0 354 -189q60 -104 66 -209h-181q0 45 -17.5 82.5t-43.5 61.5t-58 40.5t-60.5 24t-51.5 7.5q-19 0 -40.5 -5.5t-49.5 -20.5t-53 -38t-49 -62.5t-39 -89.5h379l-100 -100h-300q-6 -50 -6 -100h406l-100 -100h-300q9 -74 33 -132t52.5 -91t61.5 -54.5t59 -29 t47 -7.5q22 0 50.5 7.5t60.5 24.5t58 41t43.5 61t17.5 80h174q-30 -171 -128 -278q-107 -117 -274 -117q-206 0 -324 158q-36 48 -69 133t-45 204h-217l100 100h112q1 47 6 100h-218l100 100h134q20 87 51 153.5t62 103.5q117 141 297 141z" />
<glyph unicode="&#x20bd;" d="M428 1200h350q67 0 120 -13t86 -31t57 -49.5t35 -56.5t17 -64.5t6.5 -60.5t0.5 -57v-16.5v-16.5q0 -36 -0.5 -57t-6.5 -61t-17 -65t-35 -57t-57 -50.5t-86 -31.5t-120 -13h-178l-2 -100h288q10 0 13 -6t-3 -14l-120 -160q-6 -8 -18 -14t-22 -6h-138v-175q0 -11 -5.5 -18 t-15.5 -7h-149q-10 0 -17.5 7.5t-7.5 17.5v175h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v100h-267q-10 0 -13 6t3 14l120 160q6 8 18 14t22 6h117v475q0 10 7.5 17.5t17.5 7.5zM600 1000v-300h203q64 0 86.5 33t22.5 119q0 84 -22.5 116t-86.5 32h-203z" />
<glyph unicode="&#x2212;" d="M250 700h800q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#x231b;" d="M1000 1200v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-50v-100q0 -91 -49.5 -165.5t-130.5 -109.5q81 -35 130.5 -109.5t49.5 -165.5v-150h50q21 0 35.5 -14.5t14.5 -35.5v-150h-800v150q0 21 14.5 35.5t35.5 14.5h50v150q0 91 49.5 165.5t130.5 109.5q-81 35 -130.5 109.5 t-49.5 165.5v100h-50q-21 0 -35.5 14.5t-14.5 35.5v150h800zM400 1000v-100q0 -60 32.5 -109.5t87.5 -73.5q28 -12 44 -37t16 -55t-16 -55t-44 -37q-55 -24 -87.5 -73.5t-32.5 -109.5v-150h400v150q0 60 -32.5 109.5t-87.5 73.5q-28 12 -44 37t-16 55t16 55t44 37 q55 24 87.5 73.5t32.5 109.5v100h-400z" />
<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
<glyph unicode="&#x2601;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -206.5q0 -121 -85 -207.5t-205 -86.5h-750q-79 0 -135.5 57t-56.5 137q0 69 42.5 122.5t108.5 67.5q-2 12 -2 37q0 153 108 260.5t260 107.5z" />
<glyph unicode="&#x26fa;" d="M774 1193.5q16 -9.5 20.5 -27t-5.5 -33.5l-136 -187l467 -746h30q20 0 35 -18.5t15 -39.5v-42h-1200v42q0 21 15 39.5t35 18.5h30l468 746l-135 183q-10 16 -5.5 34t20.5 28t34 5.5t28 -20.5l111 -148l112 150q9 16 27 20.5t34 -5zM600 200h377l-182 112l-195 534v-646z " />
<glyph unicode="&#x2709;" d="M25 1100h1150q10 0 12.5 -5t-5.5 -13l-564 -567q-8 -8 -18 -8t-18 8l-564 567q-8 8 -5.5 13t12.5 5zM18 882l264 -264q8 -8 8 -18t-8 -18l-264 -264q-8 -8 -13 -5.5t-5 12.5v550q0 10 5 12.5t13 -5.5zM918 618l264 264q8 8 13 5.5t5 -12.5v-550q0 -10 -5 -12.5t-13 5.5 l-264 264q-8 8 -8 18t8 18zM818 482l364 -364q8 -8 5.5 -13t-12.5 -5h-1150q-10 0 -12.5 5t5.5 13l364 364q8 8 18 8t18 -8l164 -164q8 -8 18 -8t18 8l164 164q8 8 18 8t18 -8z" />
<glyph unicode="&#x270f;" d="M1011 1210q19 0 33 -13l153 -153q13 -14 13 -33t-13 -33l-99 -92l-214 214l95 96q13 14 32 14zM1013 800l-615 -614l-214 214l614 614zM317 96l-333 -112l110 335z" />
<glyph unicode="&#xe001;" d="M700 650v-550h250q21 0 35.5 -14.5t14.5 -35.5v-50h-800v50q0 21 14.5 35.5t35.5 14.5h250v550l-500 550h1200z" />
<glyph unicode="&#xe002;" d="M368 1017l645 163q39 15 63 0t24 -49v-831q0 -55 -41.5 -95.5t-111.5 -63.5q-79 -25 -147 -4.5t-86 75t25.5 111.5t122.5 82q72 24 138 8v521l-600 -155v-606q0 -42 -44 -90t-109 -69q-79 -26 -147 -5.5t-86 75.5t25.5 111.5t122.5 82.5q72 24 138 7v639q0 38 14.5 59 t53.5 34z" />
<glyph unicode="&#xe003;" d="M500 1191q100 0 191 -39t156.5 -104.5t104.5 -156.5t39 -191l-1 -2l1 -5q0 -141 -78 -262l275 -274q23 -26 22.5 -44.5t-22.5 -42.5l-59 -58q-26 -20 -46.5 -20t-39.5 20l-275 274q-119 -77 -261 -77l-5 1l-2 -1q-100 0 -191 39t-156.5 104.5t-104.5 156.5t-39 191 t39 191t104.5 156.5t156.5 104.5t191 39zM500 1022q-88 0 -162 -43t-117 -117t-43 -162t43 -162t117 -117t162 -43t162 43t117 117t43 162t-43 162t-117 117t-162 43z" />
<glyph unicode="&#xe005;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104z" />
<glyph unicode="&#xe006;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429z" />
<glyph unicode="&#xe007;" d="M407 800l131 353q7 19 17.5 19t17.5 -19l129 -353h421q21 0 24 -8.5t-14 -20.5l-342 -249l130 -401q7 -20 -0.5 -25.5t-24.5 6.5l-343 246l-342 -247q-17 -12 -24.5 -6.5t-0.5 25.5l130 400l-347 251q-17 12 -14 20.5t23 8.5h429zM477 700h-240l197 -142l-74 -226 l193 139l195 -140l-74 229l192 140h-234l-78 211z" />
<glyph unicode="&#xe008;" d="M600 1200q124 0 212 -88t88 -212v-250q0 -46 -31 -98t-69 -52v-75q0 -10 6 -21.5t15 -17.5l358 -230q9 -5 15 -16.5t6 -21.5v-93q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v93q0 10 6 21.5t15 16.5l358 230q9 6 15 17.5t6 21.5v75q-38 0 -69 52 t-31 98v250q0 124 88 212t212 88z" />
<glyph unicode="&#xe009;" d="M25 1100h1150q10 0 17.5 -7.5t7.5 -17.5v-1050q0 -10 -7.5 -17.5t-17.5 -7.5h-1150q-10 0 -17.5 7.5t-7.5 17.5v1050q0 10 7.5 17.5t17.5 7.5zM100 1000v-100h100v100h-100zM875 1000h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5t17.5 -7.5h550 q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM1000 1000v-100h100v100h-100zM100 800v-100h100v100h-100zM1000 800v-100h100v100h-100zM100 600v-100h100v100h-100zM1000 600v-100h100v100h-100zM875 500h-550q-10 0 -17.5 -7.5t-7.5 -17.5v-350q0 -10 7.5 -17.5 t17.5 -7.5h550q10 0 17.5 7.5t7.5 17.5v350q0 10 -7.5 17.5t-17.5 7.5zM100 400v-100h100v100h-100zM1000 400v-100h100v100h-100zM100 200v-100h100v100h-100zM1000 200v-100h100v100h-100z" />
<glyph unicode="&#xe010;" d="M50 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM50 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM650 500h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe011;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM850 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 700h200q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM850 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5 t35.5 14.5z" />
<glyph unicode="&#xe012;" d="M50 1100h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 1100h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200 q0 21 14.5 35.5t35.5 14.5zM50 700h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 700h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700 q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM50 300h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5zM450 300h700q21 0 35.5 -14.5t14.5 -35.5v-200 q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe013;" d="M465 477l571 571q8 8 18 8t17 -8l177 -177q8 -7 8 -17t-8 -18l-783 -784q-7 -8 -17.5 -8t-17.5 8l-384 384q-8 8 -8 18t8 17l177 177q7 8 17 8t18 -8l171 -171q7 -7 18 -7t18 7z" />
<glyph unicode="&#xe014;" d="M904 1083l178 -179q8 -8 8 -18.5t-8 -17.5l-267 -268l267 -268q8 -7 8 -17.5t-8 -18.5l-178 -178q-8 -8 -18.5 -8t-17.5 8l-268 267l-268 -267q-7 -8 -17.5 -8t-18.5 8l-178 178q-8 8 -8 18.5t8 17.5l267 268l-267 268q-8 7 -8 17.5t8 18.5l178 178q8 8 18.5 8t17.5 -8 l268 -267l268 268q7 7 17.5 7t18.5 -7z" />
<glyph unicode="&#xe015;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM425 900h150q10 0 17.5 -7.5t7.5 -17.5v-75h75q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5 t-17.5 -7.5h-75v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-75q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v75q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe016;" d="M507 1177q98 0 187.5 -38.5t154.5 -103.5t103.5 -154.5t38.5 -187.5q0 -141 -78 -262l300 -299q8 -8 8 -18.5t-8 -18.5l-109 -108q-7 -8 -17.5 -8t-18.5 8l-300 299q-119 -77 -261 -77q-98 0 -188 38.5t-154.5 103t-103 154.5t-38.5 188t38.5 187.5t103 154.5 t154.5 103.5t188 38.5zM506.5 1023q-89.5 0 -165.5 -44t-120 -120.5t-44 -166t44 -165.5t120 -120t165.5 -44t166 44t120.5 120t44 165.5t-44 166t-120.5 120.5t-166 44zM325 800h350q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-350q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe017;" d="M550 1200h100q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM800 975v166q167 -62 272 -209.5t105 -331.5q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5 t-184.5 123t-123 184.5t-45.5 224q0 184 105 331.5t272 209.5v-166q-103 -55 -165 -155t-62 -220q0 -116 57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5q0 120 -62 220t-165 155z" />
<glyph unicode="&#xe018;" d="M1025 1200h150q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM725 800h150q10 0 17.5 -7.5t7.5 -17.5v-750q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v750 q0 10 7.5 17.5t17.5 7.5zM425 500h150q10 0 17.5 -7.5t7.5 -17.5v-450q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v450q0 10 7.5 17.5t17.5 7.5zM125 300h150q10 0 17.5 -7.5t7.5 -17.5v-250q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5 v250q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe019;" d="M600 1174q33 0 74 -5l38 -152l5 -1q49 -14 94 -39l5 -2l134 80q61 -48 104 -105l-80 -134l3 -5q25 -44 39 -93l1 -6l152 -38q5 -43 5 -73q0 -34 -5 -74l-152 -38l-1 -6q-15 -49 -39 -93l-3 -5l80 -134q-48 -61 -104 -105l-134 81l-5 -3q-44 -25 -94 -39l-5 -2l-38 -151 q-43 -5 -74 -5q-33 0 -74 5l-38 151l-5 2q-49 14 -94 39l-5 3l-134 -81q-60 48 -104 105l80 134l-3 5q-25 45 -38 93l-2 6l-151 38q-6 42 -6 74q0 33 6 73l151 38l2 6q13 48 38 93l3 5l-80 134q47 61 105 105l133 -80l5 2q45 25 94 39l5 1l38 152q43 5 74 5zM600 815 q-89 0 -152 -63t-63 -151.5t63 -151.5t152 -63t152 63t63 151.5t-63 151.5t-152 63z" />
<glyph unicode="&#xe020;" d="M500 1300h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-75h-1100v75q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5zM500 1200v-100h300v100h-300zM1100 900v-800q0 -41 -29.5 -70.5t-70.5 -29.5h-700q-41 0 -70.5 29.5t-29.5 70.5 v800h900zM300 800v-700h100v700h-100zM500 800v-700h100v700h-100zM700 800v-700h100v700h-100zM900 800v-700h100v700h-100z" />
<glyph unicode="&#xe021;" d="M18 618l620 608q8 7 18.5 7t17.5 -7l608 -608q8 -8 5.5 -13t-12.5 -5h-175v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v375h-300v-375q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v575h-175q-10 0 -12.5 5t5.5 13z" />
<glyph unicode="&#xe022;" d="M600 1200v-400q0 -41 29.5 -70.5t70.5 -29.5h300v-650q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5h450zM1000 800h-250q-21 0 -35.5 14.5t-14.5 35.5v250z" />
<glyph unicode="&#xe023;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h50q10 0 17.5 -7.5t7.5 -17.5v-275h175q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe024;" d="M1300 0h-538l-41 400h-242l-41 -400h-538l431 1200h209l-21 -300h162l-20 300h208zM515 800l-27 -300h224l-27 300h-170z" />
<glyph unicode="&#xe025;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-450h191q20 0 25.5 -11.5t-7.5 -27.5l-327 -400q-13 -16 -32 -16t-32 16l-327 400q-13 16 -7.5 27.5t25.5 11.5h191v450q0 21 14.5 35.5t35.5 14.5zM1125 400h50q10 0 17.5 -7.5t7.5 -17.5v-350q0 -10 -7.5 -17.5t-17.5 -7.5 h-1050q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h50q10 0 17.5 -7.5t7.5 -17.5v-175h900v175q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe026;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM525 900h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -275q-13 -16 -32 -16t-32 16l-223 275q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z " />
<glyph unicode="&#xe027;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM632 914l223 -275q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5l223 275q13 16 32 16 t32 -16z" />
<glyph unicode="&#xe028;" d="M225 1200h750q10 0 19.5 -7t12.5 -17l186 -652q7 -24 7 -49v-425q0 -12 -4 -27t-9 -17q-12 -6 -37 -6h-1100q-12 0 -27 4t-17 8q-6 13 -6 38l1 425q0 25 7 49l185 652q3 10 12.5 17t19.5 7zM878 1000h-556q-10 0 -19 -7t-11 -18l-87 -450q-2 -11 4 -18t16 -7h150 q10 0 19.5 -7t11.5 -17l38 -152q2 -10 11.5 -17t19.5 -7h250q10 0 19.5 7t11.5 17l38 152q2 10 11.5 17t19.5 7h150q10 0 16 7t4 18l-87 450q-2 11 -11 18t-19 7z" />
<glyph unicode="&#xe029;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM540 820l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
<glyph unicode="&#xe030;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-362q0 -10 -7.5 -17.5t-17.5 -7.5h-362q-11 0 -13 5.5t5 12.5l133 133q-109 76 -238 76q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5h150q0 -117 -45.5 -224 t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117z" />
<glyph unicode="&#xe031;" d="M947 1060l135 135q7 7 12.5 5t5.5 -13v-361q0 -11 -7.5 -18.5t-18.5 -7.5h-361q-11 0 -13 5.5t5 12.5l134 134q-110 75 -239 75q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5h-150q0 117 45.5 224t123 184.5t184.5 123t224 45.5q192 0 347 -117zM1027 600h150 q0 -117 -45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5q-192 0 -348 118l-134 -134q-7 -8 -12.5 -5.5t-5.5 12.5v360q0 11 7.5 18.5t18.5 7.5h360q10 0 12.5 -5.5t-5.5 -12.5l-133 -133q110 -76 240 -76q116 0 214.5 57t155.5 155.5t57 214.5z" />
<glyph unicode="&#xe032;" d="M125 1200h1050q10 0 17.5 -7.5t7.5 -17.5v-1150q0 -10 -7.5 -17.5t-17.5 -7.5h-1050q-10 0 -17.5 7.5t-7.5 17.5v1150q0 10 7.5 17.5t17.5 7.5zM1075 1000h-850q-10 0 -17.5 -7.5t-7.5 -17.5v-850q0 -10 7.5 -17.5t17.5 -7.5h850q10 0 17.5 7.5t7.5 17.5v850 q0 10 -7.5 17.5t-17.5 7.5zM325 900h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 900h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 700h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 700h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 500h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 500h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5zM325 300h50q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM525 300h450q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-450q-10 0 -17.5 7.5t-7.5 17.5v50 q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe033;" d="M900 800v200q0 83 -58.5 141.5t-141.5 58.5h-300q-82 0 -141 -59t-59 -141v-200h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h900q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-100zM400 800v150q0 21 15 35.5t35 14.5h200 q20 0 35 -14.5t15 -35.5v-150h-300z" />
<glyph unicode="&#xe034;" d="M125 1100h50q10 0 17.5 -7.5t7.5 -17.5v-1075h-100v1075q0 10 7.5 17.5t17.5 7.5zM1075 1052q4 0 9 -2q16 -6 16 -23v-421q0 -6 -3 -12q-33 -59 -66.5 -99t-65.5 -58t-56.5 -24.5t-52.5 -6.5q-26 0 -57.5 6.5t-52.5 13.5t-60 21q-41 15 -63 22.5t-57.5 15t-65.5 7.5 q-85 0 -160 -57q-7 -5 -15 -5q-6 0 -11 3q-14 7 -14 22v438q22 55 82 98.5t119 46.5q23 2 43 0.5t43 -7t32.5 -8.5t38 -13t32.5 -11q41 -14 63.5 -21t57 -14t63.5 -7q103 0 183 87q7 8 18 8z" />
<glyph unicode="&#xe035;" d="M600 1175q116 0 227 -49.5t192.5 -131t131 -192.5t49.5 -227v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v300q0 127 -70.5 231.5t-184.5 161.5t-245 57t-245 -57t-184.5 -161.5t-70.5 -231.5v-300q0 -10 -7.5 -17.5t-17.5 -7.5h-50 q-10 0 -17.5 7.5t-7.5 17.5v300q0 116 49.5 227t131 192.5t192.5 131t227 49.5zM220 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460q0 8 6 14t14 6zM820 500h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14v460 q0 8 6 14t14 6z" />
<glyph unicode="&#xe036;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM900 668l120 120q7 7 17 7t17 -7l34 -34q7 -7 7 -17t-7 -17l-120 -120l120 -120q7 -7 7 -17 t-7 -17l-34 -34q-7 -7 -17 -7t-17 7l-120 119l-120 -119q-7 -7 -17 -7t-17 7l-34 34q-7 7 -7 17t7 17l119 120l-119 120q-7 7 -7 17t7 17l34 34q7 8 17 8t17 -8z" />
<glyph unicode="&#xe037;" d="M321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6 l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238q-6 8 -4.5 18t9.5 17l29 22q7 5 15 5z" />
<glyph unicode="&#xe038;" d="M967 1004h3q11 -1 17 -10q135 -179 135 -396q0 -105 -34 -206.5t-98 -185.5q-7 -9 -17 -10h-3q-9 0 -16 6l-42 34q-8 6 -9 16t5 18q111 150 111 328q0 90 -29.5 176t-84.5 157q-6 9 -5 19t10 16l42 33q7 5 15 5zM321 814l258 172q9 6 15 2.5t6 -13.5v-750q0 -10 -6 -13.5 t-15 2.5l-258 172q-21 14 -46 14h-250q-10 0 -17.5 7.5t-7.5 17.5v350q0 10 7.5 17.5t17.5 7.5h250q25 0 46 14zM766 900h4q10 -1 16 -10q96 -129 96 -290q0 -154 -90 -281q-6 -9 -17 -10l-3 -1q-9 0 -16 6l-29 23q-7 7 -8.5 16.5t4.5 17.5q72 103 72 229q0 132 -78 238 q-6 8 -4.5 18.5t9.5 16.5l29 22q7 5 15 5z" />
<glyph unicode="&#xe039;" d="M500 900h100v-100h-100v-100h-400v-100h-100v600h500v-300zM1200 700h-200v-100h200v-200h-300v300h-200v300h-100v200h600v-500zM100 1100v-300h300v300h-300zM800 1100v-300h300v300h-300zM300 900h-100v100h100v-100zM1000 900h-100v100h100v-100zM300 500h200v-500 h-500v500h200v100h100v-100zM800 300h200v-100h-100v-100h-200v100h-100v100h100v200h-200v100h300v-300zM100 400v-300h300v300h-300zM300 200h-100v100h100v-100zM1200 200h-100v100h100v-100zM700 0h-100v100h100v-100zM1200 0h-300v100h300v-100z" />
<glyph unicode="&#xe040;" d="M100 200h-100v1000h100v-1000zM300 200h-100v1000h100v-1000zM700 200h-200v1000h200v-1000zM900 200h-100v1000h100v-1000zM1200 200h-200v1000h200v-1000zM400 0h-300v100h300v-100zM600 0h-100v91h100v-91zM800 0h-100v91h100v-91zM1100 0h-200v91h200v-91z" />
<glyph unicode="&#xe041;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
<glyph unicode="&#xe042;" d="M500 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-682 682l1 475q0 10 7.5 17.5t17.5 7.5h474zM800 1200l682 -682q8 -8 8 -18t-8 -18l-464 -464q-8 -8 -18 -8t-18 8l-56 56l424 426l-700 700h150zM319.5 1024.5q-29.5 29.5 -71 29.5t-71 -29.5 t-29.5 -71.5t29.5 -71.5t71 -29.5t71 29.5t29.5 71.5t-29.5 71.5z" />
<glyph unicode="&#xe043;" d="M300 1200h825q75 0 75 -75v-900q0 -25 -18 -43l-64 -64q-8 -8 -13 -5.5t-5 12.5v950q0 10 -7.5 17.5t-17.5 7.5h-700q-25 0 -43 -18l-64 -64q-8 -8 -5.5 -13t12.5 -5h700q10 0 17.5 -7.5t7.5 -17.5v-950q0 -10 -7.5 -17.5t-17.5 -7.5h-850q-10 0 -17.5 7.5t-7.5 17.5v975 q0 25 18 43l139 139q18 18 43 18z" />
<glyph unicode="&#xe044;" d="M250 1200h800q21 0 35.5 -14.5t14.5 -35.5v-1150l-450 444l-450 -445v1151q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe045;" d="M822 1200h-444q-11 0 -19 -7.5t-9 -17.5l-78 -301q-7 -24 7 -45l57 -108q6 -9 17.5 -15t21.5 -6h450q10 0 21.5 6t17.5 15l62 108q14 21 7 45l-83 301q-1 10 -9 17.5t-19 7.5zM1175 800h-150q-10 0 -21 -6.5t-15 -15.5l-78 -156q-4 -9 -15 -15.5t-21 -6.5h-550 q-10 0 -21 6.5t-15 15.5l-78 156q-4 9 -15 15.5t-21 6.5h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-650q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h750q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5 t7.5 17.5v650q0 10 -7.5 17.5t-17.5 7.5zM850 200h-500q-10 0 -19.5 -7t-11.5 -17l-38 -152q-2 -10 3.5 -17t15.5 -7h600q10 0 15.5 7t3.5 17l-38 152q-2 10 -11.5 17t-19.5 7z" />
<glyph unicode="&#xe046;" d="M500 1100h200q56 0 102.5 -20.5t72.5 -50t44 -59t25 -50.5l6 -20h150q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5h150q2 8 6.5 21.5t24 48t45 61t72 48t102.5 21.5zM900 800v-100 h100v100h-100zM600 730q-95 0 -162.5 -67.5t-67.5 -162.5t67.5 -162.5t162.5 -67.5t162.5 67.5t67.5 162.5t-67.5 162.5t-162.5 67.5zM600 603q43 0 73 -30t30 -73t-30 -73t-73 -30t-73 30t-30 73t30 73t73 30z" />
<glyph unicode="&#xe047;" d="M681 1199l385 -998q20 -50 60 -92q18 -19 36.5 -29.5t27.5 -11.5l10 -2v-66h-417v66q53 0 75 43.5t5 88.5l-82 222h-391q-58 -145 -92 -234q-11 -34 -6.5 -57t25.5 -37t46 -20t55 -6v-66h-365v66q56 24 84 52q12 12 25 30.5t20 31.5l7 13l399 1006h93zM416 521h340 l-162 457z" />
<glyph unicode="&#xe048;" d="M753 641q5 -1 14.5 -4.5t36 -15.5t50.5 -26.5t53.5 -40t50.5 -54.5t35.5 -70t14.5 -87q0 -67 -27.5 -125.5t-71.5 -97.5t-98.5 -66.5t-108.5 -40.5t-102 -13h-500v89q41 7 70.5 32.5t29.5 65.5v827q0 24 -0.5 34t-3.5 24t-8.5 19.5t-17 13.5t-28 12.5t-42.5 11.5v71 l471 -1q57 0 115.5 -20.5t108 -57t80.5 -94t31 -124.5q0 -51 -15.5 -96.5t-38 -74.5t-45 -50.5t-38.5 -30.5zM400 700h139q78 0 130.5 48.5t52.5 122.5q0 41 -8.5 70.5t-29.5 55.5t-62.5 39.5t-103.5 13.5h-118v-350zM400 200h216q80 0 121 50.5t41 130.5q0 90 -62.5 154.5 t-156.5 64.5h-159v-400z" />
<glyph unicode="&#xe049;" d="M877 1200l2 -57q-83 -19 -116 -45.5t-40 -66.5l-132 -839q-9 -49 13 -69t96 -26v-97h-500v97q186 16 200 98l173 832q3 17 3 30t-1.5 22.5t-9 17.5t-13.5 12.5t-21.5 10t-26 8.5t-33.5 10q-13 3 -19 5v57h425z" />
<glyph unicode="&#xe050;" d="M1300 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM175 1000h-75v-800h75l-125 -167l-125 167h75v800h-75l125 167z" />
<glyph unicode="&#xe051;" d="M1100 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-650q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v650h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM1167 50l-167 -125v75h-800v-75l-167 125l167 125v-75h800v75z" />
<glyph unicode="&#xe052;" d="M50 1100h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe053;" d="M250 1100h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM250 500h700q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe054;" d="M500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000 q-21 0 -35.5 14.5t-14.5 35.5zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5zM0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5z" />
<glyph unicode="&#xe055;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 800h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 500h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe056;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 1100h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 800h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 500h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 500h800q21 0 35.5 -14.5t14.5 -35.5v-100 q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM350 200h800 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe057;" d="M400 0h-100v1100h100v-1100zM550 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM267 550l-167 -125v75h-200v100h200v75zM550 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM550 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe058;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM900 0h-100v1100h100v-1100zM50 800h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM1100 600h200v-100h-200v-75l-167 125l167 125v-75zM50 500h300q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5zM50 200h600 q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-600q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe059;" d="M75 1000h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53v650q0 31 22 53t53 22zM1200 300l-300 300l300 300v-600z" />
<glyph unicode="&#xe060;" d="M44 1100h1112q18 0 31 -13t13 -31v-1012q0 -18 -13 -31t-31 -13h-1112q-18 0 -31 13t-13 31v1012q0 18 13 31t31 13zM100 1000v-737l247 182l298 -131l-74 156l293 318l236 -288v500h-1000zM342 884q56 0 95 -39t39 -94.5t-39 -95t-95 -39.5t-95 39.5t-39 95t39 94.5 t95 39z" />
<glyph unicode="&#xe062;" d="M648 1169q117 0 216 -60t156.5 -161t57.5 -218q0 -115 -70 -258q-69 -109 -158 -225.5t-143 -179.5l-54 -62q-9 8 -25.5 24.5t-63.5 67.5t-91 103t-98.5 128t-95.5 148q-60 132 -60 249q0 88 34 169.5t91.5 142t137 96.5t166.5 36zM652.5 974q-91.5 0 -156.5 -65 t-65 -157t65 -156.5t156.5 -64.5t156.5 64.5t65 156.5t-65 157t-156.5 65z" />
<glyph unicode="&#xe063;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 173v854q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57z" />
<glyph unicode="&#xe064;" d="M554 1295q21 -72 57.5 -143.5t76 -130t83 -118t82.5 -117t70 -116t49.5 -126t18.5 -136.5q0 -71 -25.5 -135t-68.5 -111t-99 -82t-118.5 -54t-125.5 -23q-84 5 -161.5 34t-139.5 78.5t-99 125t-37 164.5q0 69 18 136.5t49.5 126.5t69.5 116.5t81.5 117.5t83.5 119 t76.5 131t58.5 143zM344 710q-23 -33 -43.5 -70.5t-40.5 -102.5t-17 -123q1 -37 14.5 -69.5t30 -52t41 -37t38.5 -24.5t33 -15q21 -7 32 -1t13 22l6 34q2 10 -2.5 22t-13.5 19q-5 4 -14 12t-29.5 40.5t-32.5 73.5q-26 89 6 271q2 11 -6 11q-8 1 -15 -10z" />
<glyph unicode="&#xe065;" d="M1000 1013l108 115q2 1 5 2t13 2t20.5 -1t25 -9.5t28.5 -21.5q22 -22 27 -43t0 -32l-6 -10l-108 -115zM350 1100h400q50 0 105 -13l-187 -187h-368q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v182l200 200v-332 q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM1009 803l-362 -362l-161 -50l55 170l355 355z" />
<glyph unicode="&#xe066;" d="M350 1100h361q-164 -146 -216 -200h-195q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-103q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M824 1073l339 -301q8 -7 8 -17.5t-8 -17.5l-340 -306q-7 -6 -12.5 -4t-6.5 11v203q-26 1 -54.5 0t-78.5 -7.5t-92 -17.5t-86 -35t-70 -57q10 59 33 108t51.5 81.5t65 58.5t68.5 40.5t67 24.5t56 13.5t40 4.5v210q1 10 6.5 12.5t13.5 -4.5z" />
<glyph unicode="&#xe067;" d="M350 1100h350q60 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-219q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5z M643 639l395 395q7 7 17.5 7t17.5 -7l101 -101q7 -7 7 -17.5t-7 -17.5l-531 -532q-7 -7 -17.5 -7t-17.5 7l-248 248q-7 7 -7 17.5t7 17.5l101 101q7 7 17.5 7t17.5 -7l111 -111q8 -7 18 -7t18 7z" />
<glyph unicode="&#xe068;" d="M318 918l264 264q8 8 18 8t18 -8l260 -264q7 -8 4.5 -13t-12.5 -5h-170v-200h200v173q0 10 5 12t13 -5l264 -260q8 -7 8 -17.5t-8 -17.5l-264 -265q-8 -7 -13 -5t-5 12v173h-200v-200h170q10 0 12.5 -5t-4.5 -13l-260 -264q-8 -8 -18 -8t-18 8l-264 264q-8 8 -5.5 13 t12.5 5h175v200h-200v-173q0 -10 -5 -12t-13 5l-264 265q-8 7 -8 17.5t8 17.5l264 260q8 7 13 5t5 -12v-173h200v200h-175q-10 0 -12.5 5t5.5 13z" />
<glyph unicode="&#xe069;" d="M250 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe070;" d="M50 1100h100q21 0 35.5 -14.5t14.5 -35.5v-438l464 453q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5 t-14.5 35.5v1000q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe071;" d="M1200 1050v-1000q0 -21 -10.5 -25t-25.5 10l-464 453v-438q0 -21 -10.5 -25t-25.5 10l-492 480q-15 14 -15 35t15 35l492 480q15 14 25.5 10t10.5 -25v-438l464 453q15 14 25.5 10t10.5 -25z" />
<glyph unicode="&#xe072;" d="M243 1074l814 -498q18 -11 18 -26t-18 -26l-814 -498q-18 -11 -30.5 -4t-12.5 28v1000q0 21 12.5 28t30.5 -4z" />
<glyph unicode="&#xe073;" d="M250 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM650 1000h200q21 0 35.5 -14.5t14.5 -35.5v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v800 q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe074;" d="M1100 950v-800q0 -21 -14.5 -35.5t-35.5 -14.5h-800q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe075;" d="M500 612v438q0 21 10.5 25t25.5 -10l492 -480q15 -14 15 -35t-15 -35l-492 -480q-15 -14 -25.5 -10t-10.5 25v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10z" />
<glyph unicode="&#xe076;" d="M1048 1102l100 1q20 0 35 -14.5t15 -35.5l5 -1000q0 -21 -14.5 -35.5t-35.5 -14.5l-100 -1q-21 0 -35.5 14.5t-14.5 35.5l-2 437l-463 -454q-14 -15 -24.5 -10.5t-10.5 25.5l-2 437l-462 -455q-15 -14 -25.5 -9.5t-10.5 24.5l-5 1000q0 21 10.5 25.5t25.5 -10.5l466 -450 l-2 438q0 20 10.5 24.5t25.5 -9.5l466 -451l-2 438q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe077;" d="M850 1100h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-464 -453q-15 -14 -25.5 -10t-10.5 25v1000q0 21 10.5 25t25.5 -10l464 -453v438q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe078;" d="M686 1081l501 -540q15 -15 10.5 -26t-26.5 -11h-1042q-22 0 -26.5 11t10.5 26l501 540q15 15 36 15t36 -15zM150 400h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe079;" d="M885 900l-352 -353l352 -353l-197 -198l-552 552l552 550z" />
<glyph unicode="&#xe080;" d="M1064 547l-551 -551l-198 198l353 353l-353 353l198 198z" />
<glyph unicode="&#xe081;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM650 900h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-150 q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5h150v-150q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v150h150q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-150v150q0 21 -14.5 35.5t-35.5 14.5z" />
<glyph unicode="&#xe082;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM850 700h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5 t35.5 -14.5h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5z" />
<glyph unicode="&#xe083;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM741.5 913q-12.5 0 -21.5 -9l-120 -120l-120 120q-9 9 -21.5 9 t-21.5 -9l-141 -141q-9 -9 -9 -21.5t9 -21.5l120 -120l-120 -120q-9 -9 -9 -21.5t9 -21.5l141 -141q9 -9 21.5 -9t21.5 9l120 120l120 -120q9 -9 21.5 -9t21.5 9l141 141q9 9 9 21.5t-9 21.5l-120 120l120 120q9 9 9 21.5t-9 21.5l-141 141q-9 9 -21.5 9z" />
<glyph unicode="&#xe084;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM546 623l-84 85q-7 7 -17.5 7t-18.5 -7l-139 -139q-7 -8 -7 -18t7 -18 l242 -241q7 -8 17.5 -8t17.5 8l375 375q7 7 7 17.5t-7 18.5l-139 139q-7 7 -17.5 7t-17.5 -7z" />
<glyph unicode="&#xe085;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM588 941q-29 0 -59 -5.5t-63 -20.5t-58 -38.5t-41.5 -63t-16.5 -89.5 q0 -25 20 -25h131q30 -5 35 11q6 20 20.5 28t45.5 8q20 0 31.5 -10.5t11.5 -28.5q0 -23 -7 -34t-26 -18q-1 0 -13.5 -4t-19.5 -7.5t-20 -10.5t-22 -17t-18.5 -24t-15.5 -35t-8 -46q-1 -8 5.5 -16.5t20.5 -8.5h173q7 0 22 8t35 28t37.5 48t29.5 74t12 100q0 47 -17 83 t-42.5 57t-59.5 34.5t-64 18t-59 4.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
<glyph unicode="&#xe086;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM675 1000h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5 t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5zM675 700h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h75v-200h-75q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h350q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5 t-17.5 7.5h-75v275q0 10 -7.5 17.5t-17.5 7.5z" />
<glyph unicode="&#xe087;" d="M525 1200h150q10 0 17.5 -7.5t7.5 -17.5v-194q103 -27 178.5 -102.5t102.5 -178.5h194q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-194q-27 -103 -102.5 -178.5t-178.5 -102.5v-194q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v194 q-103 27 -178.5 102.5t-102.5 178.5h-194q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h194q27 103 102.5 178.5t178.5 102.5v194q0 10 7.5 17.5t17.5 7.5zM700 893v-168q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v168q-68 -23 -119 -74 t-74 -119h168q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-168q23 -68 74 -119t119 -74v168q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-168q68 23 119 74t74 119h-168q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h168 q-23 68 -74 119t-119 74z" />
<glyph unicode="&#xe088;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM759 823l64 -64q7 -7 7 -17.5t-7 -17.5l-124 -124l124 -124q7 -7 7 -17.5t-7 -17.5l-64 -64q-7 -7 -17.5 -7t-17.5 7l-124 124l-124 -124q-7 -7 -17.5 -7t-17.5 7l-64 64 q-7 7 -7 17.5t7 17.5l124 124l-124 124q-7 7 -7 17.5t7 17.5l64 64q7 7 17.5 7t17.5 -7l124 -124l124 124q7 7 17.5 7t17.5 -7z" />
<glyph unicode="&#xe089;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5t57 -214.5 t155.5 -155.5t214.5 -57t214.5 57t155.5 155.5t57 214.5t-57 214.5t-155.5 155.5t-214.5 57zM782 788l106 -106q7 -7 7 -17.5t-7 -17.5l-320 -321q-8 -7 -18 -7t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l197 197q7 7 17.5 7t17.5 -7z" />
<glyph unicode="&#xe090;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM600 1027q-116 0 -214.5 -57t-155.5 -155.5t-57 -214.5q0 -120 65 -225 l587 587q-105 65 -225 65zM965 819l-584 -584q104 -62 219 -62q116 0 214.5 57t155.5 155.5t57 214.5q0 115 -62 219z" />
<glyph unicode="&#xe091;" d="M39 582l522 427q16 13 27.5 8t11.5 -26v-291h550q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-550v-291q0 -21 -11.5 -26t-27.5 8l-522 427q-16 13 -16 32t16 32z" />
<glyph unicode="&#xe092;" d="M639 1009l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291h-550q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h550v291q0 21 11.5 26t27.5 -8z" />
<glyph unicode="&#xe093;" d="M682 1161l427 -522q13 -16 8 -27.5t-26 -11.5h-291v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v550h-291q-21 0 -26 11.5t8 27.5l427 522q13 16 32 16t32 -16z" />
<glyph unicode="&#xe094;" d="M550 1200h200q21 0 35.5 -14.5t14.5 -35.5v-550h291q21 0 26 -11.5t-8 -27.5l-427 -522q-13 -16 -32 -16t-32 16l-427 522q-13 16 -8 27.5t26 11.5h291v550q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe095;" d="M639 1109l522 -427q16 -13 16 -32t-16 -32l-522 -427q-16 -13 -27.5 -8t-11.5 26v291q-94 -2 -182 -20t-170.5 -52t-147 -92.5t-100.5 -135.5q5 105 27 193.5t67.5 167t113 135t167 91.5t225.5 42v262q0 21 11.5 26t27.5 -8z" />
<glyph unicode="&#xe096;" d="M850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5zM350 0h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249 q8 7 18 7t18 -7l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5z" />
<glyph unicode="&#xe097;" d="M1014 1120l106 -106q7 -8 7 -18t-7 -18l-249 -249l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l249 249q8 7 18 7t18 -7zM250 600h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-249 -249q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l249 249l-94 94q-14 14 -10 24.5t25 10.5z" />
<glyph unicode="&#xe101;" d="M600 1177q117 0 224 -45.5t184.5 -123t123 -184.5t45.5 -224t-45.5 -224t-123 -184.5t-184.5 -123t-224 -45.5t-224 45.5t-184.5 123t-123 184.5t-45.5 224t45.5 224t123 184.5t184.5 123t224 45.5zM704 900h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5 t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM675 400h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5z" />
<glyph unicode="&#xe102;" d="M260 1200q9 0 19 -2t15 -4l5 -2q22 -10 44 -23l196 -118q21 -13 36 -24q29 -21 37 -12q11 13 49 35l196 118q22 13 45 23q17 7 38 7q23 0 47 -16.5t37 -33.5l13 -16q14 -21 18 -45l25 -123l8 -44q1 -9 8.5 -14.5t17.5 -5.5h61q10 0 17.5 -7.5t7.5 -17.5v-50 q0 -10 -7.5 -17.5t-17.5 -7.5h-50q-10 0 -17.5 -7.5t-7.5 -17.5v-175h-400v300h-200v-300h-400v175q0 10 -7.5 17.5t-17.5 7.5h-50q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5h61q11 0 18 3t7 8q0 4 9 52l25 128q5 25 19 45q2 3 5 7t13.5 15t21.5 19.5t26.5 15.5 t29.5 7zM915 1079l-166 -162q-7 -7 -5 -12t12 -5h219q10 0 15 7t2 17l-51 149q-3 10 -11 12t-15 -6zM463 917l-177 157q-8 7 -16 5t-11 -12l-51 -143q-3 -10 2 -17t15 -7h231q11 0 12.5 5t-5.5 12zM500 0h-375q-10 0 -17.5 7.5t-7.5 17.5v375h400v-400zM1100 400v-375 q0 -10 -7.5 -17.5t-17.5 -7.5h-375v400h400z" />
<glyph unicode="&#xe103;" d="M1165 1190q8 3 21 -6.5t13 -17.5q-2 -178 -24.5 -323.5t-55.5 -245.5t-87 -174.5t-102.5 -118.5t-118 -68.5t-118.5 -33t-120 -4.5t-105 9.5t-90 16.5q-61 12 -78 11q-4 1 -12.5 0t-34 -14.5t-52.5 -40.5l-153 -153q-26 -24 -37 -14.5t-11 43.5q0 64 42 102q8 8 50.5 45 t66.5 58q19 17 35 47t13 61q-9 55 -10 102.5t7 111t37 130t78 129.5q39 51 80 88t89.5 63.5t94.5 45t113.5 36t129 31t157.5 37t182 47.5zM1116 1098q-8 9 -22.5 -3t-45.5 -50q-38 -47 -119 -103.5t-142 -89.5l-62 -33q-56 -30 -102 -57t-104 -68t-102.5 -80.5t-85.5 -91 t-64 -104.5q-24 -56 -31 -86t2 -32t31.5 17.5t55.5 59.5q25 30 94 75.5t125.5 77.5t147.5 81q70 37 118.5 69t102 79.5t99 111t86.5 148.5q22 50 24 60t-6 19z" />
<glyph unicode="&#xe104;" d="M653 1231q-39 -67 -54.5 -131t-10.5 -114.5t24.5 -96.5t47.5 -80t63.5 -62.5t68.5 -46.5t65 -30q-4 7 -17.5 35t-18.5 39.5t-17 39.5t-17 43t-13 42t-9.5 44.5t-2 42t4 43t13.5 39t23 38.5q96 -42 165 -107.5t105 -138t52 -156t13 -159t-19 -149.5q-13 -55 -44 -106.5 t-68 -87t-78.5 -64.5t-72.5 -45t-53 -22q-72 -22 -127 -11q-31 6 -13 19q6 3 17 7q13 5 32.5 21t41 44t38.5 63.5t21.5 81.5t-6.5 94.5t-50 107t-104 115.5q10 -104 -0.5 -189t-37 -140.5t-65 -93t-84 -52t-93.5 -11t-95 24.5q-80 36 -131.5 114t-53.5 171q-2 23 0 49.5 t4.5 52.5t13.5 56t27.5 60t46 64.5t69.5 68.5q-8 -53 -5 -102.5t17.5 -90t34 -68.5t44.5 -39t49 -2q31 13 38.5 36t-4.5 55t-29 64.5t-36 75t-26 75.5q-15 85 2 161.5t53.5 128.5t85.5 92.5t93.5 61t81.5 25.5z" />
<glyph unicode="&#xe105;" d="M600 1094q82 0 160.5 -22.5t140 -59t116.5 -82.5t94.5 -95t68 -95t42.5 -82.5t14 -57.5t-14 -57.5t-43 -82.5t-68.5 -95t-94.5 -95t-116.5 -82.5t-140 -59t-159.5 -22.5t-159.5 22.5t-140 59t-116.5 82.5t-94.5 95t-68.5 95t-43 82.5t-14 57.5t14 57.5t42.5 82.5t68 95 t94.5 95t116.5 82.5t140 59t160.5 22.5zM888 829q-15 15 -18 12t5 -22q25 -57 25 -119q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 59 23 114q8 19 4.5 22t-17.5 -12q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q22 -36 47 -71t70 -82t92.5 -81t113 -58.5t133.5 -24.5 t133.5 24t113 58.5t92.5 81.5t70 81.5t47 70.5q11 18 9 42.5t-14 41.5q-90 117 -163 189zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l35 34q14 15 12.5 33.5t-16.5 33.5q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
<glyph unicode="&#xe106;" d="M592 0h-148l31 120q-91 20 -175.5 68.5t-143.5 106.5t-103.5 119t-66.5 110t-22 76q0 21 14 57.5t42.5 82.5t68 95t94.5 95t116.5 82.5t140 59t160.5 22.5q61 0 126 -15l32 121h148zM944 770l47 181q108 -85 176.5 -192t68.5 -159q0 -26 -19.5 -71t-59.5 -102t-93 -112 t-129 -104.5t-158 -75.5l46 173q77 49 136 117t97 131q11 18 9 42.5t-14 41.5q-54 70 -107 130zM310 824q-70 -69 -160 -184q-13 -16 -15 -40.5t9 -42.5q18 -30 39 -60t57 -70.5t74 -73t90 -61t105 -41.5l41 154q-107 18 -178.5 101.5t-71.5 193.5q0 59 23 114q8 19 4.5 22 t-17.5 -12zM448 727l-35 -36q-15 -15 -19.5 -38.5t4.5 -41.5q37 -68 93 -116q16 -13 38.5 -11t36.5 17l12 11l22 86l-3 4q-44 44 -89 117q-11 18 -28 20t-32 -12z" />
<glyph unicode="&#xe107;" d="M-90 100l642 1066q20 31 48 28.5t48 -35.5l642 -1056q21 -32 7.5 -67.5t-50.5 -35.5h-1294q-37 0 -50.5 34t7.5 66zM155 200h345v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h345l-445 723zM496 700h208q20 0 32 -14.5t8 -34.5l-58 -252 q-4 -20 -21.5 -34.5t-37.5 -14.5h-54q-20 0 -37.5 14.5t-21.5 34.5l-58 252q-4 20 8 34.5t32 14.5z" />
<glyph unicode="&#xe108;" d="M650 1200q62 0 106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -93 100 -113v-64q0 -21 -13 -29t-32 1l-205 128l-205 -128q-19 -9 -32 -1t-13 29v64q0 20 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5v41 q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44z" />
<glyph unicode="&#xe109;" d="M850 1200h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-150h-1100v150q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-50h500v50q0 21 14.5 35.5t35.5 14.5zM1100 800v-750q0 -21 -14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v750h1100zM100 600v-100h100v100h-100zM300 600v-100h100v100h-100zM500 600v-100h100v100h-100zM700 600v-100h100v100h-100zM900 600v-100h100v100h-100zM100 400v-100h100v100h-100zM300 400v-100h100v100h-100zM500 400 v-100h100v100h-100zM700 400v-100h100v100h-100zM900 400v-100h100v100h-100zM100 200v-100h100v100h-100zM300 200v-100h100v100h-100zM500 200v-100h100v100h-100zM700 200v-100h100v100h-100zM900 200v-100h100v100h-100z" />
<glyph unicode="&#xe110;" d="M1135 1165l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-159l-600 -600h-291q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h209l600 600h241v150q0 21 10.5 25t24.5 -10zM522 819l-141 -141l-122 122h-209q-21 0 -35.5 14.5 t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h291zM1135 565l249 -230q15 -14 15 -35t-15 -35l-249 -230q-14 -14 -24.5 -10t-10.5 25v150h-241l-181 181l141 141l122 -122h159v150q0 21 10.5 25t24.5 -10z" />
<glyph unicode="&#xe111;" d="M100 1100h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5v600q0 41 29.5 70.5t70.5 29.5z" />
<glyph unicode="&#xe112;" d="M150 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM850 1200h200q21 0 35.5 -14.5t14.5 -35.5v-250h-300v250q0 21 14.5 35.5t35.5 14.5zM1100 800v-300q0 -41 -3 -77.5t-15 -89.5t-32 -96t-58 -89t-89 -77t-129 -51t-174 -20t-174 20 t-129 51t-89 77t-58 89t-32 96t-15 89.5t-3 77.5v300h300v-250v-27v-42.5t1.5 -41t5 -38t10 -35t16.5 -30t25.5 -24.5t35 -19t46.5 -12t60 -4t60 4.5t46.5 12.5t35 19.5t25 25.5t17 30.5t10 35t5 38t2 40.5t-0.5 42v25v250h300z" />
<glyph unicode="&#xe113;" d="M1100 411l-198 -199l-353 353l-353 -353l-197 199l551 551z" />
<glyph unicode="&#xe114;" d="M1101 789l-550 -551l-551 551l198 199l353 -353l353 353z" />
<glyph unicode="&#xe115;" d="M404 1000h746q21 0 35.5 -14.5t14.5 -35.5v-551h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v401h-381zM135 984l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-400h385l215 -200h-750q-21 0 -35.5 14.5 t-14.5 35.5v550h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
<glyph unicode="&#xe116;" d="M56 1200h94q17 0 31 -11t18 -27l38 -162h896q24 0 39 -18.5t10 -42.5l-100 -475q-5 -21 -27 -42.5t-55 -21.5h-633l48 -200h535q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-50q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-300v-50 q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v50h-31q-18 0 -32.5 10t-20.5 19l-5 10l-201 961h-54q-20 0 -35 14.5t-15 35.5t15 35.5t35 14.5z" />
<glyph unicode="&#xe117;" d="M1200 1000v-100h-1200v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500zM0 800h1200v-800h-1200v800z" />
<glyph unicode="&#xe118;" d="M200 800l-200 -400v600h200q0 41 29.5 70.5t70.5 29.5h300q42 0 71 -29.5t29 -70.5h500v-200h-1000zM1500 700l-300 -700h-1200l300 700h1200z" />
<glyph unicode="&#xe119;" d="M635 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-601h150q21 0 25 -10.5t-10 -24.5l-230 -249q-14 -15 -35 -15t-35 15l-230 249q-14 14 -10 24.5t25 10.5h150v601h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
<glyph unicode="&#xe120;" d="M936 864l249 -229q14 -15 14 -35.5t-14 -35.5l-249 -229q-15 -15 -25.5 -10.5t-10.5 24.5v151h-600v-151q0 -20 -10.5 -24.5t-25.5 10.5l-249 229q-14 15 -14 35.5t14 35.5l249 229q15 15 25.5 10.5t10.5 -25.5v-149h600v149q0 21 10.5 25.5t25.5 -10.5z" />
<glyph unicode="&#xe121;" d="M1169 400l-172 732q-5 23 -23 45.5t-38 22.5h-672q-20 0 -38 -20t-23 -41l-172 -739h1138zM1100 300h-1000q-41 0 -70.5 -29.5t-29.5 -70.5v-100q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v100q0 41 -29.5 70.5t-70.5 29.5zM800 100v100h100v-100h-100 zM1000 100v100h100v-100h-100z" />
<glyph unicode="&#xe122;" d="M1150 1100q21 0 35.5 -14.5t14.5 -35.5v-850q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v850q0 21 14.5 35.5t35.5 14.5zM1000 200l-675 200h-38l47 -276q3 -16 -5.5 -20t-29.5 -4h-7h-84q-20 0 -34.5 14t-18.5 35q-55 337 -55 351v250v6q0 16 1 23.5t6.5 14 t17.5 6.5h200l675 250v-850zM0 750v-250q-4 0 -11 0.5t-24 6t-30 15t-24 30t-11 48.5v50q0 26 10.5 46t25 30t29 16t25.5 7z" />
<glyph unicode="&#xe123;" d="M553 1200h94q20 0 29 -10.5t3 -29.5l-18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q19 0 33 -14.5t14 -35t-13 -40.5t-31 -27q-8 -4 -23 -9.5t-65 -19.5t-103 -25t-132.5 -20t-158.5 -9q-57 0 -115 5t-104 12t-88.5 15.5t-73.5 17.5t-54.5 16t-35.5 12l-11 4 q-18 8 -31 28t-13 40.5t14 35t33 14.5h17l118 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3.5 32t28.5 13zM498 110q50 -6 102 -6q53 0 102 6q-12 -49 -39.5 -79.5t-62.5 -30.5t-63 30.5t-39 79.5z" />
<glyph unicode="&#xe124;" d="M800 946l224 78l-78 -224l234 -45l-180 -155l180 -155l-234 -45l78 -224l-224 78l-45 -234l-155 180l-155 -180l-45 234l-224 -78l78 224l-234 45l180 155l-180 155l234 45l-78 224l224 -78l45 234l155 -180l155 180z" />
<glyph unicode="&#xe125;" d="M650 1200h50q40 0 70 -40.5t30 -84.5v-150l-28 -125h328q40 0 70 -40.5t30 -84.5v-100q0 -45 -29 -74l-238 -344q-16 -24 -38 -40.5t-45 -16.5h-250q-7 0 -42 25t-66 50l-31 25h-61q-45 0 -72.5 18t-27.5 57v400q0 36 20 63l145 196l96 198q13 28 37.5 48t51.5 20z M650 1100l-100 -212l-150 -213v-375h100l136 -100h214l250 375v125h-450l50 225v175h-50zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe126;" d="M600 1100h250q23 0 45 -16.5t38 -40.5l238 -344q29 -29 29 -74v-100q0 -44 -30 -84.5t-70 -40.5h-328q28 -118 28 -125v-150q0 -44 -30 -84.5t-70 -40.5h-50q-27 0 -51.5 20t-37.5 48l-96 198l-145 196q-20 27 -20 63v400q0 39 27.5 57t72.5 18h61q124 100 139 100z M50 1000h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM636 1000l-136 -100h-100v-375l150 -213l100 -212h50v175l-50 225h450v125l-250 375h-214z" />
<glyph unicode="&#xe127;" d="M356 873l363 230q31 16 53 -6l110 -112q13 -13 13.5 -32t-11.5 -34l-84 -121h302q84 0 138 -38t54 -110t-55 -111t-139 -39h-106l-131 -339q-6 -21 -19.5 -41t-28.5 -20h-342q-7 0 -90 81t-83 94v525q0 17 14 35.5t28 28.5zM400 792v-503l100 -89h293l131 339 q6 21 19.5 41t28.5 20h203q21 0 30.5 25t0.5 50t-31 25h-456h-7h-6h-5.5t-6 0.5t-5 1.5t-5 2t-4 2.5t-4 4t-2.5 4.5q-12 25 5 47l146 183l-86 83zM50 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v500 q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe128;" d="M475 1103l366 -230q2 -1 6 -3.5t14 -10.5t18 -16.5t14.5 -20t6.5 -22.5v-525q0 -13 -86 -94t-93 -81h-342q-15 0 -28.5 20t-19.5 41l-131 339h-106q-85 0 -139.5 39t-54.5 111t54 110t138 38h302l-85 121q-11 15 -10.5 34t13.5 32l110 112q22 22 53 6zM370 945l146 -183 q17 -22 5 -47q-2 -2 -3.5 -4.5t-4 -4t-4 -2.5t-5 -2t-5 -1.5t-6 -0.5h-6h-6.5h-6h-475v-100h221q15 0 29 -20t20 -41l130 -339h294l106 89v503l-342 236zM1050 800h100q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5 v500q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe129;" d="M550 1294q72 0 111 -55t39 -139v-106l339 -131q21 -6 41 -19.5t20 -28.5v-342q0 -7 -81 -90t-94 -83h-525q-17 0 -35.5 14t-28.5 28l-9 14l-230 363q-16 31 6 53l112 110q13 13 32 13.5t34 -11.5l121 -84v302q0 84 38 138t110 54zM600 972v203q0 21 -25 30.5t-50 0.5 t-25 -31v-456v-7v-6v-5.5t-0.5 -6t-1.5 -5t-2 -5t-2.5 -4t-4 -4t-4.5 -2.5q-25 -12 -47 5l-183 146l-83 -86l236 -339h503l89 100v293l-339 131q-21 6 -41 19.5t-20 28.5zM450 200h500q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-500 q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe130;" d="M350 1100h500q21 0 35.5 14.5t14.5 35.5v100q0 21 -14.5 35.5t-35.5 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100q0 -21 14.5 -35.5t35.5 -14.5zM600 306v-106q0 -84 -39 -139t-111 -55t-110 54t-38 138v302l-121 -84q-15 -12 -34 -11.5t-32 13.5l-112 110 q-22 22 -6 53l230 363q1 2 3.5 6t10.5 13.5t16.5 17t20 13.5t22.5 6h525q13 0 94 -83t81 -90v-342q0 -15 -20 -28.5t-41 -19.5zM308 900l-236 -339l83 -86l183 146q22 17 47 5q2 -1 4.5 -2.5t4 -4t2.5 -4t2 -5t1.5 -5t0.5 -6v-5.5v-6v-7v-456q0 -22 25 -31t50 0.5t25 30.5 v203q0 15 20 28.5t41 19.5l339 131v293l-89 100h-503z" />
<glyph unicode="&#xe131;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM914 632l-275 223q-16 13 -27.5 8t-11.5 -26v-137h-275 q-10 0 -17.5 -7.5t-7.5 -17.5v-150q0 -10 7.5 -17.5t17.5 -7.5h275v-137q0 -21 11.5 -26t27.5 8l275 223q16 13 16 32t-16 32z" />
<glyph unicode="&#xe132;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM561 855l-275 -223q-16 -13 -16 -32t16 -32l275 -223q16 -13 27.5 -8 t11.5 26v137h275q10 0 17.5 7.5t7.5 17.5v150q0 10 -7.5 17.5t-17.5 7.5h-275v137q0 21 -11.5 26t-27.5 -8z" />
<glyph unicode="&#xe133;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM855 639l-223 275q-13 16 -32 16t-32 -16l-223 -275q-13 -16 -8 -27.5 t26 -11.5h137v-275q0 -10 7.5 -17.5t17.5 -7.5h150q10 0 17.5 7.5t7.5 17.5v275h137q21 0 26 11.5t-8 27.5z" />
<glyph unicode="&#xe134;" d="M600 1178q118 0 225 -45.5t184.5 -123t123 -184.5t45.5 -225t-45.5 -225t-123 -184.5t-184.5 -123t-225 -45.5t-225 45.5t-184.5 123t-123 184.5t-45.5 225t45.5 225t123 184.5t184.5 123t225 45.5zM675 900h-150q-10 0 -17.5 -7.5t-7.5 -17.5v-275h-137q-21 0 -26 -11.5 t8 -27.5l223 -275q13 -16 32 -16t32 16l223 275q13 16 8 27.5t-26 11.5h-137v275q0 10 -7.5 17.5t-17.5 7.5z" />
<glyph unicode="&#xe135;" d="M600 1176q116 0 222.5 -46t184 -123.5t123.5 -184t46 -222.5t-46 -222.5t-123.5 -184t-184 -123.5t-222.5 -46t-222.5 46t-184 123.5t-123.5 184t-46 222.5t46 222.5t123.5 184t184 123.5t222.5 46zM627 1101q-15 -12 -36.5 -20.5t-35.5 -12t-43 -8t-39 -6.5 q-15 -3 -45.5 0t-45.5 -2q-20 -7 -51.5 -26.5t-34.5 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -91t-29.5 -79q-9 -34 5 -93t8 -87q0 -9 17 -44.5t16 -59.5q12 0 23 -5t23.5 -15t19.5 -14q16 -8 33 -15t40.5 -15t34.5 -12q21 -9 52.5 -32t60 -38t57.5 -11 q7 -15 -3 -34t-22.5 -40t-9.5 -38q13 -21 23 -34.5t27.5 -27.5t36.5 -18q0 -7 -3.5 -16t-3.5 -14t5 -17q104 -2 221 112q30 29 46.5 47t34.5 49t21 63q-13 8 -37 8.5t-36 7.5q-15 7 -49.5 15t-51.5 19q-18 0 -41 -0.5t-43 -1.5t-42 -6.5t-38 -16.5q-51 -35 -66 -12 q-4 1 -3.5 25.5t0.5 25.5q-6 13 -26.5 17.5t-24.5 6.5q1 15 -0.5 30.5t-7 28t-18.5 11.5t-31 -21q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q7 -12 18 -24t21.5 -20.5t20 -15t15.5 -10.5l5 -3q2 12 7.5 30.5t8 34.5t-0.5 32q-3 18 3.5 29 t18 22.5t15.5 24.5q6 14 10.5 35t8 31t15.5 22.5t34 22.5q-6 18 10 36q8 0 24 -1.5t24.5 -1.5t20 4.5t20.5 15.5q-10 23 -31 42.5t-37.5 29.5t-49 27t-43.5 23q0 1 2 8t3 11.5t1.5 10.5t-1 9.5t-4.5 4.5q31 -13 58.5 -14.5t38.5 2.5l12 5q5 28 -9.5 46t-36.5 24t-50 15 t-41 20q-18 -4 -37 0zM613 994q0 -17 8 -42t17 -45t9 -23q-8 1 -39.5 5.5t-52.5 10t-37 16.5q3 11 16 29.5t16 25.5q10 -10 19 -10t14 6t13.5 14.5t16.5 12.5z" />
<glyph unicode="&#xe136;" d="M756 1157q164 92 306 -9l-259 -138l145 -232l251 126q6 -89 -34 -156.5t-117 -110.5q-60 -34 -127 -39.5t-126 16.5l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5t15 37.5l600 599q-34 101 5.5 201.5t135.5 154.5z" />
<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M100 1196h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 1096h-200v-100h200v100zM100 796h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 696h-500v-100h500v100zM100 396h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5v100q0 41 29.5 70.5t70.5 29.5zM1100 296h-300v-100h300v100z " />
<glyph unicode="&#xe138;" d="M150 1200h900q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM700 500v-300l-200 -200v500l-350 500h900z" />
<glyph unicode="&#xe139;" d="M500 1200h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5zM500 1100v-100h200v100h-200zM1200 400v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5v200h1200z" />
<glyph unicode="&#xe140;" d="M50 1200h300q21 0 25 -10.5t-10 -24.5l-94 -94l199 -199q7 -8 7 -18t-7 -18l-106 -106q-8 -7 -18 -7t-18 7l-199 199l-94 -94q-14 -14 -24.5 -10t-10.5 25v300q0 21 14.5 35.5t35.5 14.5zM850 1200h300q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -10.5 -25t-24.5 10l-94 94 l-199 -199q-8 -7 -18 -7t-18 7l-106 106q-7 8 -7 18t7 18l199 199l-94 94q-14 14 -10 24.5t25 10.5zM364 470l106 -106q7 -8 7 -18t-7 -18l-199 -199l94 -94q14 -14 10 -24.5t-25 -10.5h-300q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 10.5 25t24.5 -10l94 -94l199 199 q8 7 18 7t18 -7zM1071 271l94 94q14 14 24.5 10t10.5 -25v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -25 10.5t10 24.5l94 94l-199 199q-7 8 -7 18t7 18l106 106q8 7 18 7t18 -7z" />
<glyph unicode="&#xe141;" d="M596 1192q121 0 231.5 -47.5t190 -127t127 -190t47.5 -231.5t-47.5 -231.5t-127 -190.5t-190 -127t-231.5 -47t-231.5 47t-190.5 127t-127 190.5t-47 231.5t47 231.5t127 190t190.5 127t231.5 47.5zM596 1010q-112 0 -207.5 -55.5t-151 -151t-55.5 -207.5t55.5 -207.5 t151 -151t207.5 -55.5t207.5 55.5t151 151t55.5 207.5t-55.5 207.5t-151 151t-207.5 55.5zM454.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38.5 -16.5t-38.5 16.5t-16 39t16 38.5t38.5 16zM754.5 905q22.5 0 38.5 -16t16 -38.5t-16 -39t-38 -16.5q-14 0 -29 10l-55 -145 q17 -23 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 23 16 39t38.5 16zM345.5 709q22.5 0 38.5 -16t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16zM854.5 709q22.5 0 38.5 -16 t16 -38.5t-16 -38.5t-38.5 -16t-38.5 16t-16 38.5t16 38.5t38.5 16z" />
<glyph unicode="&#xe142;" d="M546 173l469 470q91 91 99 192q7 98 -52 175.5t-154 94.5q-22 4 -47 4q-34 0 -66.5 -10t-56.5 -23t-55.5 -38t-48 -41.5t-48.5 -47.5q-376 -375 -391 -390q-30 -27 -45 -41.5t-37.5 -41t-32 -46.5t-16 -47.5t-1.5 -56.5q9 -62 53.5 -95t99.5 -33q74 0 125 51l548 548 q36 36 20 75q-7 16 -21.5 26t-32.5 10q-26 0 -50 -23q-13 -12 -39 -38l-341 -338q-15 -15 -35.5 -15.5t-34.5 13.5t-14 34.5t14 34.5q327 333 361 367q35 35 67.5 51.5t78.5 16.5q14 0 29 -1q44 -8 74.5 -35.5t43.5 -68.5q14 -47 2 -96.5t-47 -84.5q-12 -11 -32 -32 t-79.5 -81t-114.5 -115t-124.5 -123.5t-123 -119.5t-96.5 -89t-57 -45q-56 -27 -120 -27q-70 0 -129 32t-93 89q-48 78 -35 173t81 163l511 511q71 72 111 96q91 55 198 55q80 0 152 -33q78 -36 129.5 -103t66.5 -154q17 -93 -11 -183.5t-94 -156.5l-482 -476 q-15 -15 -36 -16t-37 14t-17.5 34t14.5 35z" />
<glyph unicode="&#xe143;" d="M649 949q48 68 109.5 104t121.5 38.5t118.5 -20t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-150 152.5t-126.5 127.5t-93.5 124.5t-33.5 117.5q0 64 28 123t73 100.5t104 64t119 20 t120.5 -38.5t104.5 -104zM896 972q-33 0 -64.5 -19t-56.5 -46t-47.5 -53.5t-43.5 -45.5t-37.5 -19t-36 19t-40 45.5t-43 53.5t-54 46t-65.5 19q-67 0 -122.5 -55.5t-55.5 -132.5q0 -23 13.5 -51t46 -65t57.5 -63t76 -75l22 -22q15 -14 44 -44t50.5 -51t46 -44t41 -35t23 -12 t23.5 12t42.5 36t46 44t52.5 52t44 43q4 4 12 13q43 41 63.5 62t52 55t46 55t26 46t11.5 44q0 79 -53 133.5t-120 54.5z" />
<glyph unicode="&#xe144;" d="M776.5 1214q93.5 0 159.5 -66l141 -141q66 -66 66 -160q0 -42 -28 -95.5t-62 -87.5l-29 -29q-31 53 -77 99l-18 18l95 95l-247 248l-389 -389l212 -212l-105 -106l-19 18l-141 141q-66 66 -66 159t66 159l283 283q65 66 158.5 66zM600 706l105 105q10 -8 19 -17l141 -141 q66 -66 66 -159t-66 -159l-283 -283q-66 -66 -159 -66t-159 66l-141 141q-66 66 -66 159.5t66 159.5l55 55q29 -55 75 -102l18 -17l-95 -95l247 -248l389 389z" />
<glyph unicode="&#xe145;" d="M603 1200q85 0 162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5v953q0 21 30 46.5t81 48t129 37.5t163 15zM300 1000v-700h600v700h-600zM600 254q-43 0 -73.5 -30.5t-30.5 -73.5t30.5 -73.5t73.5 -30.5t73.5 30.5 t30.5 73.5t-30.5 73.5t-73.5 30.5z" />
<glyph unicode="&#xe146;" d="M902 1185l283 -282q15 -15 15 -36t-14.5 -35.5t-35.5 -14.5t-35 15l-36 35l-279 -267v-300l-212 210l-308 -307l-280 -203l203 280l307 308l-210 212h300l267 279l-35 36q-15 14 -15 35t14.5 35.5t35.5 14.5t35 -15z" />
<glyph unicode="&#xe148;" d="M700 1248v-78q38 -5 72.5 -14.5t75.5 -31.5t71 -53.5t52 -84t24 -118.5h-159q-4 36 -10.5 59t-21 45t-40 35.5t-64.5 20.5v-307l64 -13q34 -7 64 -16.5t70 -32t67.5 -52.5t47.5 -80t20 -112q0 -139 -89 -224t-244 -97v-77h-100v79q-150 16 -237 103q-40 40 -52.5 93.5 t-15.5 139.5h139q5 -77 48.5 -126t117.5 -65v335l-27 8q-46 14 -79 26.5t-72 36t-63 52t-40 72.5t-16 98q0 70 25 126t67.5 92t94.5 57t110 27v77h100zM600 754v274q-29 -4 -50 -11t-42 -21.5t-31.5 -41.5t-10.5 -65q0 -29 7 -50.5t16.5 -34t28.5 -22.5t31.5 -14t37.5 -10 q9 -3 13 -4zM700 547v-310q22 2 42.5 6.5t45 15.5t41.5 27t29 42t12 59.5t-12.5 59.5t-38 44.5t-53 31t-66.5 24.5z" />
<glyph unicode="&#xe149;" d="M561 1197q84 0 160.5 -40t123.5 -109.5t47 -147.5h-153q0 40 -19.5 71.5t-49.5 48.5t-59.5 26t-55.5 9q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -26 13.5 -63t26.5 -61t37 -66q6 -9 9 -14h241v-100h-197q8 -50 -2.5 -115t-31.5 -95q-45 -62 -99 -112 q34 10 83 17.5t71 7.5q32 1 102 -16t104 -17q83 0 136 30l50 -147q-31 -19 -58 -30.5t-55 -15.5t-42 -4.5t-46 -0.5q-23 0 -76 17t-111 32.5t-96 11.5q-39 -3 -82 -16t-67 -25l-23 -11l-55 145q4 3 16 11t15.5 10.5t13 9t15.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221v100h166q-23 47 -44 104q-7 20 -12 41.5t-6 55.5t6 66.5t29.5 70.5t58.5 71q97 88 263 88z" />
<glyph unicode="&#xe150;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM935 1184l230 -249q14 -14 10 -24.5t-25 -10.5h-150v-900h-200v900h-150q-21 0 -25 10.5t10 24.5l230 249q14 15 35 15t35 -15z" />
<glyph unicode="&#xe151;" d="M1000 700h-100v100h-100v-100h-100v500h300v-500zM400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM801 1100v-200h100v200h-100zM1000 350l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150z " />
<glyph unicode="&#xe152;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 1050l-200 -250h200v-100h-300v150l200 250h-200v100h300v-150zM1000 0h-100v100h-100v-100h-100v500h300v-500zM801 400v-200h100v200h-100z " />
<glyph unicode="&#xe153;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1000 700h-100v400h-100v100h200v-500zM1100 0h-100v100h-200v400h300v-500zM901 400v-200h100v200h-100z" />
<glyph unicode="&#xe154;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1100 700h-100v100h-200v400h300v-500zM901 1100v-200h100v200h-100zM1000 0h-100v400h-100v100h200v-500z" />
<glyph unicode="&#xe155;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM900 1000h-200v200h200v-200zM1000 700h-300v200h300v-200zM1100 400h-400v200h400v-200zM1200 100h-500v200h500v-200z" />
<glyph unicode="&#xe156;" d="M400 300h150q21 0 25 -11t-10 -25l-230 -250q-14 -15 -35 -15t-35 15l-230 250q-14 14 -10 25t25 11h150v900h200v-900zM1200 1000h-500v200h500v-200zM1100 700h-400v200h400v-200zM1000 400h-300v200h300v-200zM900 100h-200v200h200v-200z" />
<glyph unicode="&#xe157;" d="M350 1100h400q162 0 256 -93.5t94 -256.5v-400q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5z" />
<glyph unicode="&#xe158;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-163 0 -256.5 92.5t-93.5 257.5v400q0 163 94 256.5t256 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM440 770l253 -190q17 -12 17 -30t-17 -30l-253 -190q-16 -12 -28 -6.5t-12 26.5v400q0 21 12 26.5t28 -6.5z" />
<glyph unicode="&#xe159;" d="M350 1100h400q163 0 256.5 -94t93.5 -256v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 163 92.5 256.5t257.5 93.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM350 700h400q21 0 26.5 -12t-6.5 -28l-190 -253q-12 -17 -30 -17t-30 17l-190 253q-12 16 -6.5 28t26.5 12z" />
<glyph unicode="&#xe160;" d="M350 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -163 -92.5 -256.5t-257.5 -93.5h-400q-163 0 -256.5 94t-93.5 256v400q0 165 92.5 257.5t257.5 92.5zM800 900h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5 v500q0 41 -29.5 70.5t-70.5 29.5zM580 693l190 -253q12 -16 6.5 -28t-26.5 -12h-400q-21 0 -26.5 12t6.5 28l190 253q12 17 30 17t30 -17z" />
<glyph unicode="&#xe161;" d="M550 1100h400q165 0 257.5 -92.5t92.5 -257.5v-400q0 -165 -92.5 -257.5t-257.5 -92.5h-400q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h450q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-450q-21 0 -35.5 14.5t-14.5 35.5v100 q0 21 14.5 35.5t35.5 14.5zM338 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
<glyph unicode="&#xe162;" d="M793 1182l9 -9q8 -10 5 -27q-3 -11 -79 -225.5t-78 -221.5l300 1q24 0 32.5 -17.5t-5.5 -35.5q-1 0 -133.5 -155t-267 -312.5t-138.5 -162.5q-12 -15 -26 -15h-9l-9 8q-9 11 -4 32q2 9 42 123.5t79 224.5l39 110h-302q-23 0 -31 19q-10 21 6 41q75 86 209.5 237.5 t228 257t98.5 111.5q9 16 25 16h9z" />
<glyph unicode="&#xe163;" d="M350 1100h400q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-450q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h450q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400 q0 165 92.5 257.5t257.5 92.5zM938 867l324 -284q16 -14 16 -33t-16 -33l-324 -284q-16 -14 -27 -9t-11 26v150h-250q-21 0 -35.5 14.5t-14.5 35.5v200q0 21 14.5 35.5t35.5 14.5h250v150q0 21 11 26t27 -9z" />
<glyph unicode="&#xe164;" d="M750 1200h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -10.5 -25t-24.5 10l-109 109l-312 -312q-15 -15 -35.5 -15t-35.5 15l-141 141q-15 15 -15 35.5t15 35.5l312 312l-109 109q-14 14 -10 24.5t25 10.5zM456 900h-156q-41 0 -70.5 -29.5t-29.5 -70.5v-500 q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v148l200 200v-298q0 -165 -93.5 -257.5t-256.5 -92.5h-400q-165 0 -257.5 92.5t-92.5 257.5v400q0 165 92.5 257.5t257.5 92.5h300z" />
<glyph unicode="&#xe165;" d="M600 1186q119 0 227.5 -46.5t187 -125t125 -187t46.5 -227.5t-46.5 -227.5t-125 -187t-187 -125t-227.5 -46.5t-227.5 46.5t-187 125t-125 187t-46.5 227.5t46.5 227.5t125 187t187 125t227.5 46.5zM600 1022q-115 0 -212 -56.5t-153.5 -153.5t-56.5 -212t56.5 -212 t153.5 -153.5t212 -56.5t212 56.5t153.5 153.5t56.5 212t-56.5 212t-153.5 153.5t-212 56.5zM600 794q80 0 137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137t57 137t137 57z" />
<glyph unicode="&#xe166;" d="M450 1200h200q21 0 35.5 -14.5t14.5 -35.5v-350h245q20 0 25 -11t-9 -26l-383 -426q-14 -15 -33.5 -15t-32.5 15l-379 426q-13 15 -8.5 26t25.5 11h250v350q0 21 14.5 35.5t35.5 14.5zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
<glyph unicode="&#xe167;" d="M583 1182l378 -435q14 -15 9 -31t-26 -16h-244v-250q0 -20 -17 -35t-39 -15h-200q-20 0 -32 14.5t-12 35.5v250h-250q-20 0 -25.5 16.5t8.5 31.5l383 431q14 16 33.5 17t33.5 -14zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5z M900 200v-50h100v50h-100z" />
<glyph unicode="&#xe168;" d="M396 723l369 369q7 7 17.5 7t17.5 -7l139 -139q7 -8 7 -18.5t-7 -17.5l-525 -525q-7 -8 -17.5 -8t-17.5 8l-292 291q-7 8 -7 18t7 18l139 139q8 7 18.5 7t17.5 -7zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50 h-100z" />
<glyph unicode="&#xe169;" d="M135 1023l142 142q14 14 35 14t35 -14l77 -77l-212 -212l-77 76q-14 15 -14 36t14 35zM655 855l210 210q14 14 24.5 10t10.5 -25l-2 -599q-1 -20 -15.5 -35t-35.5 -15l-597 -1q-21 0 -25 10.5t10 24.5l208 208l-154 155l212 212zM50 300h1000q21 0 35.5 -14.5t14.5 -35.5 v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
<glyph unicode="&#xe170;" d="M350 1200l599 -2q20 -1 35 -15.5t15 -35.5l1 -597q0 -21 -10.5 -25t-24.5 10l-208 208l-155 -154l-212 212l155 154l-210 210q-14 14 -10 24.5t25 10.5zM524 512l-76 -77q-15 -14 -36 -14t-35 14l-142 142q-14 14 -14 35t14 35l77 77zM50 300h1000q21 0 35.5 -14.5 t14.5 -35.5v-250h-1100v250q0 21 14.5 35.5t35.5 14.5zM900 200v-50h100v50h-100z" />
<glyph unicode="&#xe171;" d="M1200 103l-483 276l-314 -399v423h-399l1196 796v-1096zM483 424v-230l683 953z" />
<glyph unicode="&#xe172;" d="M1100 1000v-850q0 -21 -14.5 -35.5t-35.5 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200z" />
<glyph unicode="&#xe173;" d="M1100 1000l-2 -149l-299 -299l-95 95q-9 9 -21.5 9t-21.5 -9l-149 -147h-312v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1132 638l106 -106q7 -7 7 -17.5t-7 -17.5l-420 -421q-8 -7 -18 -7 t-18 7l-202 203q-8 7 -8 17.5t8 17.5l106 106q7 8 17.5 8t17.5 -8l79 -79l297 297q7 7 17.5 7t17.5 -7z" />
<glyph unicode="&#xe174;" d="M1100 1000v-269l-103 -103l-134 134q-15 15 -33.5 16.5t-34.5 -12.5l-266 -266h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM1202 572l70 -70q15 -15 15 -35.5t-15 -35.5l-131 -131 l131 -131q15 -15 15 -35.5t-15 -35.5l-70 -70q-15 -15 -35.5 -15t-35.5 15l-131 131l-131 -131q-15 -15 -35.5 -15t-35.5 15l-70 70q-15 15 -15 35.5t15 35.5l131 131l-131 131q-15 15 -15 35.5t15 35.5l70 70q15 15 35.5 15t35.5 -15l131 -131l131 131q15 15 35.5 15 t35.5 -15z" />
<glyph unicode="&#xe175;" d="M1100 1000v-300h-350q-21 0 -35.5 -14.5t-14.5 -35.5v-150h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM850 600h100q21 0 35.5 -14.5t14.5 -35.5v-250h150q21 0 25 -10.5t-10 -24.5 l-230 -230q-14 -14 -35 -14t-35 14l-230 230q-14 14 -10 24.5t25 10.5h150v250q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe176;" d="M1100 1000v-400l-165 165q-14 15 -35 15t-35 -15l-263 -265h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100zM700 1000h-100v200h100v-200zM935 565l230 -229q14 -15 10 -25.5t-25 -10.5h-150v-250q0 -20 -14.5 -35 t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35v250h-150q-21 0 -25 10.5t10 25.5l230 229q14 15 35 15t35 -15z" />
<glyph unicode="&#xe177;" d="M50 1100h1100q21 0 35.5 -14.5t14.5 -35.5v-150h-1200v150q0 21 14.5 35.5t35.5 14.5zM1200 800v-550q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v550h1200zM100 500v-200h400v200h-400z" />
<glyph unicode="&#xe178;" d="M935 1165l248 -230q14 -14 14 -35t-14 -35l-248 -230q-14 -14 -24.5 -10t-10.5 25v150h-400v200h400v150q0 21 10.5 25t24.5 -10zM200 800h-50q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v-200zM400 800h-100v200h100v-200zM18 435l247 230 q14 14 24.5 10t10.5 -25v-150h400v-200h-400v-150q0 -21 -10.5 -25t-24.5 10l-247 230q-15 14 -15 35t15 35zM900 300h-100v200h100v-200zM1000 500h51q20 0 34.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-34.5 -14.5h-51v200z" />
<glyph unicode="&#xe179;" d="M862 1073l276 116q25 18 43.5 8t18.5 -41v-1106q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v397q-4 1 -11 5t-24 17.5t-30 29t-24 42t-11 56.5v359q0 31 18.5 65t43.5 52zM550 1200q22 0 34.5 -12.5t14.5 -24.5l1 -13v-450q0 -28 -10.5 -59.5 t-25 -56t-29 -45t-25.5 -31.5l-10 -11v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447q-4 4 -11 11.5t-24 30.5t-30 46t-24 55t-11 60v450q0 2 0.5 5.5t4 12t8.5 15t14.5 12t22.5 5.5q20 0 32.5 -12.5t14.5 -24.5l3 -13v-350h100v350v5.5t2.5 12 t7 15t15 12t25.5 5.5q23 0 35.5 -12.5t13.5 -24.5l1 -13v-350h100v350q0 2 0.5 5.5t3 12t7 15t15 12t24.5 5.5z" />
<glyph unicode="&#xe180;" d="M1200 1100v-56q-4 0 -11 -0.5t-24 -3t-30 -7.5t-24 -15t-11 -24v-888q0 -22 25 -34.5t50 -13.5l25 -2v-56h-400v56q75 0 87.5 6.5t12.5 43.5v394h-500v-394q0 -37 12.5 -43.5t87.5 -6.5v-56h-400v56q4 0 11 0.5t24 3t30 7.5t24 15t11 24v888q0 22 -25 34.5t-50 13.5 l-25 2v56h400v-56q-75 0 -87.5 -6.5t-12.5 -43.5v-394h500v394q0 37 -12.5 43.5t-87.5 6.5v56h400z" />
<glyph unicode="&#xe181;" d="M675 1000h375q21 0 35.5 -14.5t14.5 -35.5v-150h-105l-295 -98v98l-200 200h-400l100 100h375zM100 900h300q41 0 70.5 -29.5t29.5 -70.5v-500q0 -41 -29.5 -70.5t-70.5 -29.5h-300q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5zM100 800v-200h300v200 h-300zM1100 535l-400 -133v163l400 133v-163zM100 500v-200h300v200h-300zM1100 398v-248q0 -21 -14.5 -35.5t-35.5 -14.5h-375l-100 -100h-375l-100 100h400l200 200h105z" />
<glyph unicode="&#xe182;" d="M17 1007l162 162q17 17 40 14t37 -22l139 -194q14 -20 11 -44.5t-20 -41.5l-119 -118q102 -142 228 -268t267 -227l119 118q17 17 42.5 19t44.5 -12l192 -136q19 -14 22.5 -37.5t-13.5 -40.5l-163 -162q-3 -1 -9.5 -1t-29.5 2t-47.5 6t-62.5 14.5t-77.5 26.5t-90 42.5 t-101.5 60t-111 83t-119 108.5q-74 74 -133.5 150.5t-94.5 138.5t-60 119.5t-34.5 100t-15 74.5t-4.5 48z" />
<glyph unicode="&#xe183;" d="M600 1100q92 0 175 -10.5t141.5 -27t108.5 -36.5t81.5 -40t53.5 -37t31 -27l9 -10v-200q0 -21 -14.5 -33t-34.5 -9l-202 34q-20 3 -34.5 20t-14.5 38v146q-141 24 -300 24t-300 -24v-146q0 -21 -14.5 -38t-34.5 -20l-202 -34q-20 -3 -34.5 9t-14.5 33v200q3 4 9.5 10.5 t31 26t54 37.5t80.5 39.5t109 37.5t141 26.5t175 10.5zM600 795q56 0 97 -9.5t60 -23.5t30 -28t12 -24l1 -10v-50l365 -303q14 -15 24.5 -40t10.5 -45v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v212q0 20 10.5 45t24.5 40l365 303v50 q0 4 1 10.5t12 23t30 29t60 22.5t97 10z" />
<glyph unicode="&#xe184;" d="M1100 700l-200 -200h-600l-200 200v500h200v-200h200v200h200v-200h200v200h200v-500zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5 t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe185;" d="M700 1100h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-1000h300v1000q0 41 -29.5 70.5t-70.5 29.5zM1100 800h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-700h300v700q0 41 -29.5 70.5t-70.5 29.5zM400 0h-300v400q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-400z " />
<glyph unicode="&#xe186;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
<glyph unicode="&#xe187;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 300h-100v200h-100v-200h-100v500h100v-200h100v200h100v-500zM900 700v-300l-100 -100h-200v500h200z M700 700v-300h100v300h-100z" />
<glyph unicode="&#xe188;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-300h200v-100h-300v500h300v-100zM900 700h-200v-300h200v-100h-300v500h300v-100z" />
<glyph unicode="&#xe189;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 400l-300 150l300 150v-300zM900 550l-300 -150v300z" />
<glyph unicode="&#xe190;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM900 300h-700v500h700v-500zM800 700h-130q-38 0 -66.5 -43t-28.5 -108t27 -107t68 -42h130v300zM300 700v-300 h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130z" />
<glyph unicode="&#xe191;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 700h-200v-100h200v-300h-300v100h200v100h-200v300h300v-100zM900 300h-100v400h-100v100h200v-500z M700 300h-100v100h100v-100z" />
<glyph unicode="&#xe192;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM300 700h200v-400h-300v500h100v-100zM900 300h-100v400h-100v100h200v-500zM300 600v-200h100v200h-100z M700 300h-100v100h100v-100z" />
<glyph unicode="&#xe193;" d="M200 1100h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212v500q0 124 88 212t212 88zM100 900v-700h900v700h-900zM500 500l-199 -200h-100v50l199 200v150h-200v100h300v-300zM900 300h-100v400h-100v100h200v-500zM701 300h-100 v100h100v-100z" />
<glyph unicode="&#xe194;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700h-300v-200h300v-100h-300l-100 100v200l100 100h300v-100z" />
<glyph unicode="&#xe195;" d="M600 1191q120 0 229.5 -47t188.5 -126t126 -188.5t47 -229.5t-47 -229.5t-126 -188.5t-188.5 -126t-229.5 -47t-229.5 47t-188.5 126t-126 188.5t-47 229.5t47 229.5t126 188.5t188.5 126t229.5 47zM600 1021q-114 0 -211 -56.5t-153.5 -153.5t-56.5 -211t56.5 -211 t153.5 -153.5t211 -56.5t211 56.5t153.5 153.5t56.5 211t-56.5 211t-153.5 153.5t-211 56.5zM800 700v-100l-50 -50l100 -100v-50h-100l-100 100h-150v-100h-100v400h300zM500 700v-100h200v100h-200z" />
<glyph unicode="&#xe197;" d="M503 1089q110 0 200.5 -59.5t134.5 -156.5q44 14 90 14q120 0 205 -86.5t85 -207t-85 -207t-205 -86.5h-128v250q0 21 -14.5 35.5t-35.5 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-250h-222q-80 0 -136 57.5t-56 136.5q0 69 43 122.5t108 67.5q-2 19 -2 37q0 100 49 185 t134 134t185 49zM525 500h150q10 0 17.5 -7.5t7.5 -17.5v-275h137q21 0 26 -11.5t-8 -27.5l-223 -244q-13 -16 -32 -16t-32 16l-223 244q-13 16 -8 27.5t26 11.5h137v275q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe198;" d="M502 1089q110 0 201 -59.5t135 -156.5q43 15 89 15q121 0 206 -86.5t86 -206.5q0 -99 -60 -181t-150 -110l-378 360q-13 16 -31.5 16t-31.5 -16l-381 -365h-9q-79 0 -135.5 57.5t-56.5 136.5q0 69 43 122.5t108 67.5q-2 19 -2 38q0 100 49 184.5t133.5 134t184.5 49.5z M632 467l223 -228q13 -16 8 -27.5t-26 -11.5h-137v-275q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v275h-137q-21 0 -26 11.5t8 27.5q199 204 223 228q19 19 31.5 19t32.5 -19z" />
<glyph unicode="&#xe199;" d="M700 100v100h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170l-270 -300h400v-100h-50q-21 0 -35.5 -14.5t-14.5 -35.5v-50h400v50q0 21 -14.5 35.5t-35.5 14.5h-50z" />
<glyph unicode="&#xe200;" d="M600 1179q94 0 167.5 -56.5t99.5 -145.5q89 -6 150.5 -71.5t61.5 -155.5q0 -61 -29.5 -112.5t-79.5 -82.5q9 -29 9 -55q0 -74 -52.5 -126.5t-126.5 -52.5q-55 0 -100 30v-251q21 0 35.5 -14.5t14.5 -35.5v-50h-300v50q0 21 14.5 35.5t35.5 14.5v251q-45 -30 -100 -30 q-74 0 -126.5 52.5t-52.5 126.5q0 18 4 38q-47 21 -75.5 65t-28.5 97q0 74 52.5 126.5t126.5 52.5q5 0 23 -2q0 2 -1 10t-1 13q0 116 81.5 197.5t197.5 81.5z" />
<glyph unicode="&#xe201;" d="M1010 1010q111 -111 150.5 -260.5t0 -299t-150.5 -260.5q-83 -83 -191.5 -126.5t-218.5 -43.5t-218.5 43.5t-191.5 126.5q-111 111 -150.5 260.5t0 299t150.5 260.5q83 83 191.5 126.5t218.5 43.5t218.5 -43.5t191.5 -126.5zM476 1065q-4 0 -8 -1q-121 -34 -209.5 -122.5 t-122.5 -209.5q-4 -12 2.5 -23t18.5 -14l36 -9q3 -1 7 -1q23 0 29 22q27 96 98 166q70 71 166 98q11 3 17.5 13.5t3.5 22.5l-9 35q-3 13 -14 19q-7 4 -15 4zM512 920q-4 0 -9 -2q-80 -24 -138.5 -82.5t-82.5 -138.5q-4 -13 2 -24t19 -14l34 -9q4 -1 8 -1q22 0 28 21 q18 58 58.5 98.5t97.5 58.5q12 3 18 13.5t3 21.5l-9 35q-3 12 -14 19q-7 4 -15 4zM719.5 719.5q-49.5 49.5 -119.5 49.5t-119.5 -49.5t-49.5 -119.5t49.5 -119.5t119.5 -49.5t119.5 49.5t49.5 119.5t-49.5 119.5zM855 551q-22 0 -28 -21q-18 -58 -58.5 -98.5t-98.5 -57.5 q-11 -4 -17 -14.5t-3 -21.5l9 -35q3 -12 14 -19q7 -4 15 -4q4 0 9 2q80 24 138.5 82.5t82.5 138.5q4 13 -2.5 24t-18.5 14l-34 9q-4 1 -8 1zM1000 515q-23 0 -29 -22q-27 -96 -98 -166q-70 -71 -166 -98q-11 -3 -17.5 -13.5t-3.5 -22.5l9 -35q3 -13 14 -19q7 -4 15 -4 q4 0 8 1q121 34 209.5 122.5t122.5 209.5q4 12 -2.5 23t-18.5 14l-36 9q-3 1 -7 1z" />
<glyph unicode="&#xe202;" d="M700 800h300v-380h-180v200h-340v-200h-380v755q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM700 300h162l-212 -212l-212 212h162v200h100v-200zM520 0h-395q-10 0 -17.5 7.5t-7.5 17.5v395zM1000 220v-195q0 -10 -7.5 -17.5t-17.5 -7.5h-195z" />
<glyph unicode="&#xe203;" d="M700 800h300v-520l-350 350l-550 -550v1095q0 10 7.5 17.5t17.5 7.5h575v-400zM1000 900h-200v200zM862 200h-162v-200h-100v200h-162l212 212zM480 0h-355q-10 0 -17.5 7.5t-7.5 17.5v55h380v-80zM1000 80v-55q0 -10 -7.5 -17.5t-17.5 -7.5h-155v80h180z" />
<glyph unicode="&#xe204;" d="M1162 800h-162v-200h100l100 -100h-300v300h-162l212 212zM200 800h200q27 0 40 -2t29.5 -10.5t23.5 -30t7 -57.5h300v-100h-600l-200 -350v450h100q0 36 7 57.5t23.5 30t29.5 10.5t40 2zM800 400h240l-240 -400h-800l300 500h500v-100z" />
<glyph unicode="&#xe205;" d="M650 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM1000 850v150q41 0 70.5 -29.5t29.5 -70.5v-800 q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-1 0 -20 4l246 246l-326 326v324q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM412 250l-212 -212v162h-200v100h200v162z" />
<glyph unicode="&#xe206;" d="M450 1100h100q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-300q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h50v50q0 21 14.5 35.5t35.5 14.5zM800 850v150q41 0 70.5 -29.5t29.5 -70.5v-500 h-200v-300h200q0 -36 -7 -57.5t-23.5 -30t-29.5 -10.5t-40 -2h-600q-41 0 -70.5 29.5t-29.5 70.5v800q0 41 29.5 70.5t70.5 29.5v-150q0 -62 44 -106t106 -44h300q62 0 106 44t44 106zM1212 250l-212 -212v162h-200v100h200v162z" />
<glyph unicode="&#xe209;" d="M658 1197l637 -1104q23 -38 7 -65.5t-60 -27.5h-1276q-44 0 -60 27.5t7 65.5l637 1104q22 39 54 39t54 -39zM704 800h-208q-20 0 -32 -14.5t-8 -34.5l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5zM500 300v-100h200 v100h-200z" />
<glyph unicode="&#xe210;" d="M425 1100h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM825 800h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM25 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5zM425 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 500h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5 v150q0 10 7.5 17.5t17.5 7.5zM25 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM425 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5 t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM825 200h250q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-250q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe211;" d="M700 1200h100v-200h-100v-100h350q62 0 86.5 -39.5t-3.5 -94.5l-66 -132q-41 -83 -81 -134h-772q-40 51 -81 134l-66 132q-28 55 -3.5 94.5t86.5 39.5h350v100h-100v200h100v100h200v-100zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-12l137 -100 h-950l138 100h-13q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe212;" d="M600 1300q40 0 68.5 -29.5t28.5 -70.5h-194q0 41 28.5 70.5t68.5 29.5zM443 1100h314q18 -37 18 -75q0 -8 -3 -25h328q41 0 44.5 -16.5t-30.5 -38.5l-175 -145h-678l-178 145q-34 22 -29 38.5t46 16.5h328q-3 17 -3 25q0 38 18 75zM250 700h700q21 0 35.5 -14.5 t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-150v-200l275 -200h-950l275 200v200h-150q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe213;" d="M600 1181q75 0 128 -53t53 -128t-53 -128t-128 -53t-128 53t-53 128t53 128t128 53zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13 l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe214;" d="M600 1300q47 0 92.5 -53.5t71 -123t25.5 -123.5q0 -78 -55.5 -133.5t-133.5 -55.5t-133.5 55.5t-55.5 133.5q0 62 34 143l144 -143l111 111l-163 163q34 26 63 26zM602 798h46q34 0 55.5 -28.5t21.5 -86.5q0 -76 39 -183h-324q39 107 39 183q0 58 21.5 86.5t56.5 28.5h45 zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe215;" d="M600 1200l300 -161v-139h-300q0 -57 18.5 -108t50 -91.5t63 -72t70 -67.5t57.5 -61h-530q-60 83 -90.5 177.5t-30.5 178.5t33 164.5t87.5 139.5t126 96.5t145.5 41.5v-98zM250 400h700q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-13l138 -100h-950l137 100 h-12q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5zM50 100h1100q21 0 35.5 -14.5t14.5 -35.5v-50h-1200v50q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe216;" d="M600 1300q41 0 70.5 -29.5t29.5 -70.5v-78q46 -26 73 -72t27 -100v-50h-400v50q0 54 27 100t73 72v78q0 41 29.5 70.5t70.5 29.5zM400 800h400q54 0 100 -27t72 -73h-172v-100h200v-100h-200v-100h200v-100h-200v-100h200q0 -83 -58.5 -141.5t-141.5 -58.5h-400 q-83 0 -141.5 58.5t-58.5 141.5v400q0 83 58.5 141.5t141.5 58.5z" />
<glyph unicode="&#xe218;" d="M150 1100h900q21 0 35.5 -14.5t14.5 -35.5v-500q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v500q0 21 14.5 35.5t35.5 14.5zM125 400h950q10 0 17.5 -7.5t7.5 -17.5v-50q0 -10 -7.5 -17.5t-17.5 -7.5h-283l224 -224q13 -13 13 -31.5t-13 -32 t-31.5 -13.5t-31.5 13l-88 88h-524l-87 -88q-13 -13 -32 -13t-32 13.5t-13 32t13 31.5l224 224h-289q-10 0 -17.5 7.5t-7.5 17.5v50q0 10 7.5 17.5t17.5 7.5zM541 300l-100 -100h324l-100 100h-124z" />
<glyph unicode="&#xe219;" d="M200 1100h800q83 0 141.5 -58.5t58.5 -141.5v-200h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100q0 41 -29.5 70.5t-70.5 29.5h-250q-41 0 -70.5 -29.5t-29.5 -70.5h-100v200q0 83 58.5 141.5t141.5 58.5zM100 600h1000q41 0 70.5 -29.5 t29.5 -70.5v-300h-1200v300q0 41 29.5 70.5t70.5 29.5zM300 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200zM1100 100v-50q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v50h200z" />
<glyph unicode="&#xe221;" d="M480 1165l682 -683q31 -31 31 -75.5t-31 -75.5l-131 -131h-481l-517 518q-32 31 -32 75.5t32 75.5l295 296q31 31 75.5 31t76.5 -31zM108 794l342 -342l303 304l-341 341zM250 100h800q21 0 35.5 -14.5t14.5 -35.5v-50h-900v50q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe223;" d="M1057 647l-189 506q-8 19 -27.5 33t-40.5 14h-400q-21 0 -40.5 -14t-27.5 -33l-189 -506q-8 -19 1.5 -33t30.5 -14h625v-150q0 -21 14.5 -35.5t35.5 -14.5t35.5 14.5t14.5 35.5v150h125q21 0 30.5 14t1.5 33zM897 0h-595v50q0 21 14.5 35.5t35.5 14.5h50v50 q0 21 14.5 35.5t35.5 14.5h48v300h200v-300h47q21 0 35.5 -14.5t14.5 -35.5v-50h50q21 0 35.5 -14.5t14.5 -35.5v-50z" />
<glyph unicode="&#xe224;" d="M900 800h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-375v591l-300 300v84q0 10 7.5 17.5t17.5 7.5h375v-400zM1200 900h-200v200zM400 600h300v-575q0 -10 -7.5 -17.5t-17.5 -7.5h-650q-10 0 -17.5 7.5t-7.5 17.5v950q0 10 7.5 17.5t17.5 7.5h375v-400zM700 700h-200v200z " />
<glyph unicode="&#xe225;" d="M484 1095h195q75 0 146 -32.5t124 -86t89.5 -122.5t48.5 -142q18 -14 35 -20q31 -10 64.5 6.5t43.5 48.5q10 34 -15 71q-19 27 -9 43q5 8 12.5 11t19 -1t23.5 -16q41 -44 39 -105q-3 -63 -46 -106.5t-104 -43.5h-62q-7 -55 -35 -117t-56 -100l-39 -234q-3 -20 -20 -34.5 t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l12 70q-49 -14 -91 -14h-195q-24 0 -65 8l-11 -64q-3 -20 -20 -34.5t-38 -14.5h-100q-21 0 -33 14.5t-9 34.5l26 157q-84 74 -128 175l-159 53q-19 7 -33 26t-14 40v50q0 21 14.5 35.5t35.5 14.5h124q11 87 56 166l-111 95 q-16 14 -12.5 23.5t24.5 9.5h203q116 101 250 101zM675 1000h-250q-10 0 -17.5 -7.5t-7.5 -17.5v-50q0 -10 7.5 -17.5t17.5 -7.5h250q10 0 17.5 7.5t7.5 17.5v50q0 10 -7.5 17.5t-17.5 7.5z" />
<glyph unicode="&#xe226;" d="M641 900l423 247q19 8 42 2.5t37 -21.5l32 -38q14 -15 12.5 -36t-17.5 -34l-139 -120h-390zM50 1100h106q67 0 103 -17t66 -71l102 -212h823q21 0 35.5 -14.5t14.5 -35.5v-50q0 -21 -14 -40t-33 -26l-737 -132q-23 -4 -40 6t-26 25q-42 67 -100 67h-300q-62 0 -106 44 t-44 106v200q0 62 44 106t106 44zM173 928h-80q-19 0 -28 -14t-9 -35v-56q0 -51 42 -51h134q16 0 21.5 8t5.5 24q0 11 -16 45t-27 51q-18 28 -43 28zM550 727q-32 0 -54.5 -22.5t-22.5 -54.5t22.5 -54.5t54.5 -22.5t54.5 22.5t22.5 54.5t-22.5 54.5t-54.5 22.5zM130 389 l152 130q18 19 34 24t31 -3.5t24.5 -17.5t25.5 -28q28 -35 50.5 -51t48.5 -13l63 5l48 -179q13 -61 -3.5 -97.5t-67.5 -79.5l-80 -69q-47 -40 -109 -35.5t-103 51.5l-130 151q-40 47 -35.5 109.5t51.5 102.5zM380 377l-102 -88q-31 -27 2 -65l37 -43q13 -15 27.5 -19.5 t31.5 6.5l61 53q19 16 14 49q-2 20 -12 56t-17 45q-11 12 -19 14t-23 -8z" />
<glyph unicode="&#xe227;" d="M625 1200h150q10 0 17.5 -7.5t7.5 -17.5v-109q79 -33 131 -87.5t53 -128.5q1 -46 -15 -84.5t-39 -61t-46 -38t-39 -21.5l-17 -6q6 0 15 -1.5t35 -9t50 -17.5t53 -30t50 -45t35.5 -64t14.5 -84q0 -59 -11.5 -105.5t-28.5 -76.5t-44 -51t-49.5 -31.5t-54.5 -16t-49.5 -6.5 t-43.5 -1v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-100v-75q0 -10 -7.5 -17.5t-17.5 -7.5h-150q-10 0 -17.5 7.5t-7.5 17.5v75h-175q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5h75v600h-75q-10 0 -17.5 7.5t-7.5 17.5v150 q0 10 7.5 17.5t17.5 7.5h175v75q0 10 7.5 17.5t17.5 7.5h150q10 0 17.5 -7.5t7.5 -17.5v-75h100v75q0 10 7.5 17.5t17.5 7.5zM400 900v-200h263q28 0 48.5 10.5t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-263zM400 500v-200h363q28 0 48.5 10.5 t30 25t15 29t5.5 25.5l1 10q0 4 -0.5 11t-6 24t-15 30t-30 24t-48.5 11h-363z" />
<glyph unicode="&#xe230;" d="M212 1198h780q86 0 147 -61t61 -147v-416q0 -51 -18 -142.5t-36 -157.5l-18 -66q-29 -87 -93.5 -146.5t-146.5 -59.5h-572q-82 0 -147 59t-93 147q-8 28 -20 73t-32 143.5t-20 149.5v416q0 86 61 147t147 61zM600 1045q-70 0 -132.5 -11.5t-105.5 -30.5t-78.5 -41.5 t-57 -45t-36 -41t-20.5 -30.5l-6 -12l156 -243h560l156 243q-2 5 -6 12.5t-20 29.5t-36.5 42t-57 44.5t-79 42t-105 29.5t-132.5 12zM762 703h-157l195 261z" />
<glyph unicode="&#xe231;" d="M475 1300h150q103 0 189 -86t86 -189v-500q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
<glyph unicode="&#xe232;" d="M475 1300h96q0 -150 89.5 -239.5t239.5 -89.5v-446q0 -41 -42 -83t-83 -42h-450q-41 0 -83 42t-42 83v500q0 103 86 189t189 86zM700 300v-225q0 -21 -27 -48t-48 -27h-150q-21 0 -48 27t-27 48v225h300z" />
<glyph unicode="&#xe233;" d="M1294 767l-638 -283l-378 170l-78 -60v-224l100 -150v-199l-150 148l-150 -149v200l100 150v250q0 4 -0.5 10.5t0 9.5t1 8t3 8t6.5 6l47 40l-147 65l642 283zM1000 380l-350 -166l-350 166v147l350 -165l350 165v-147z" />
<glyph unicode="&#xe234;" d="M250 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM650 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM1050 800q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
<glyph unicode="&#xe235;" d="M550 1100q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 700q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44zM550 300q62 0 106 -44t44 -106t-44 -106t-106 -44t-106 44t-44 106t44 106t106 44z" />
<glyph unicode="&#xe236;" d="M125 1100h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5zM125 700h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5 t17.5 7.5zM125 300h950q10 0 17.5 -7.5t7.5 -17.5v-150q0 -10 -7.5 -17.5t-17.5 -7.5h-950q-10 0 -17.5 7.5t-7.5 17.5v150q0 10 7.5 17.5t17.5 7.5z" />
<glyph unicode="&#xe237;" d="M350 1200h500q162 0 256 -93.5t94 -256.5v-500q0 -165 -93.5 -257.5t-256.5 -92.5h-500q-165 0 -257.5 92.5t-92.5 257.5v500q0 165 92.5 257.5t257.5 92.5zM900 1000h-600q-41 0 -70.5 -29.5t-29.5 -70.5v-600q0 -41 29.5 -70.5t70.5 -29.5h600q41 0 70.5 29.5 t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5zM350 900h500q21 0 35.5 -14.5t14.5 -35.5v-300q0 -21 -14.5 -35.5t-35.5 -14.5h-500q-21 0 -35.5 14.5t-14.5 35.5v300q0 21 14.5 35.5t35.5 14.5zM400 800v-200h400v200h-400z" />
<glyph unicode="&#xe238;" d="M150 1100h1000q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5t-35.5 -14.5h-50v-200h50q21 0 35.5 -14.5t14.5 -35.5t-14.5 -35.5 t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5h50v200h-50q-21 0 -35.5 14.5t-14.5 35.5t14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe239;" d="M650 1187q87 -67 118.5 -156t0 -178t-118.5 -155q-87 66 -118.5 155t0 178t118.5 156zM300 800q124 0 212 -88t88 -212q-124 0 -212 88t-88 212zM1000 800q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM300 500q124 0 212 -88t88 -212q-124 0 -212 88t-88 212z M1000 500q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM700 199v-144q0 -21 -14.5 -35.5t-35.5 -14.5t-35.5 14.5t-14.5 35.5v142q40 -4 43 -4q17 0 57 6z" />
<glyph unicode="&#xe240;" d="M745 878l69 19q25 6 45 -12l298 -295q11 -11 15 -26.5t-2 -30.5q-5 -14 -18 -23.5t-28 -9.5h-8q1 0 1 -13q0 -29 -2 -56t-8.5 -62t-20 -63t-33 -53t-51 -39t-72.5 -14h-146q-184 0 -184 288q0 24 10 47q-20 4 -62 4t-63 -4q11 -24 11 -47q0 -288 -184 -288h-142 q-48 0 -84.5 21t-56 51t-32 71.5t-16 75t-3.5 68.5q0 13 2 13h-7q-15 0 -27.5 9.5t-18.5 23.5q-6 15 -2 30.5t15 25.5l298 296q20 18 46 11l76 -19q20 -5 30.5 -22.5t5.5 -37.5t-22.5 -31t-37.5 -5l-51 12l-182 -193h891l-182 193l-44 -12q-20 -5 -37.5 6t-22.5 31t6 37.5 t31 22.5z" />
<glyph unicode="&#xe241;" d="M1200 900h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-200v-850q0 -22 25 -34.5t50 -13.5l25 -2v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v850h-200q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h1000v-300zM500 450h-25q0 15 -4 24.5t-9 14.5t-17 7.5t-20 3t-25 0.5h-100v-425q0 -11 12.5 -17.5t25.5 -7.5h12v-50h-200v50q50 0 50 25v425h-100q-17 0 -25 -0.5t-20 -3t-17 -7.5t-9 -14.5t-4 -24.5h-25v150h500v-150z" />
<glyph unicode="&#xe242;" d="M1000 300v50q-25 0 -55 32q-14 14 -25 31t-16 27l-4 11l-289 747h-69l-300 -754q-18 -35 -39 -56q-9 -9 -24.5 -18.5t-26.5 -14.5l-11 -5v-50h273v50q-49 0 -78.5 21.5t-11.5 67.5l69 176h293l61 -166q13 -34 -3.5 -66.5t-55.5 -32.5v-50h312zM412 691l134 342l121 -342 h-255zM1100 150v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5z" />
<glyph unicode="&#xe243;" d="M50 1200h1100q21 0 35.5 -14.5t14.5 -35.5v-1100q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-21 0 -35.5 14.5t-14.5 35.5v1100q0 21 14.5 35.5t35.5 14.5zM611 1118h-70q-13 0 -18 -12l-299 -753q-17 -32 -35 -51q-18 -18 -56 -34q-12 -5 -12 -18v-50q0 -8 5.5 -14t14.5 -6 h273q8 0 14 6t6 14v50q0 8 -6 14t-14 6q-55 0 -71 23q-10 14 0 39l63 163h266l57 -153q11 -31 -6 -55q-12 -17 -36 -17q-8 0 -14 -6t-6 -14v-50q0 -8 6 -14t14 -6h313q8 0 14 6t6 14v50q0 7 -5.5 13t-13.5 7q-17 0 -42 25q-25 27 -40 63h-1l-288 748q-5 12 -19 12zM639 611 h-197l103 264z" />
<glyph unicode="&#xe244;" d="M1200 1100h-1200v100h1200v-100zM50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 1000h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM700 900v-300h300v300h-300z" />
<glyph unicode="&#xe245;" d="M50 1200h400q21 0 35.5 -14.5t14.5 -35.5v-900q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v900q0 21 14.5 35.5t35.5 14.5zM650 700h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400 q0 21 14.5 35.5t35.5 14.5zM700 600v-300h300v300h-300zM1200 0h-1200v100h1200v-100z" />
<glyph unicode="&#xe246;" d="M50 1000h400q21 0 35.5 -14.5t14.5 -35.5v-350h100v150q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-150h100v-100h-100v-150q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v150h-100v-350q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5v800q0 21 14.5 35.5t35.5 14.5zM700 700v-300h300v300h-300z" />
<glyph unicode="&#xe247;" d="M100 0h-100v1200h100v-1200zM250 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM300 1000v-300h300v300h-300zM250 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe248;" d="M600 1100h150q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-100h450q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h350v100h-150q-21 0 -35.5 14.5 t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5h150v100h100v-100zM400 1000v-300h300v300h-300z" />
<glyph unicode="&#xe249;" d="M1200 0h-100v1200h100v-1200zM550 1100h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM600 1000v-300h300v300h-300zM50 500h900q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-900q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5z" />
<glyph unicode="&#xe250;" d="M865 565l-494 -494q-23 -23 -41 -23q-14 0 -22 13.5t-8 38.5v1000q0 25 8 38.5t22 13.5q18 0 41 -23l494 -494q14 -14 14 -35t-14 -35z" />
<glyph unicode="&#xe251;" d="M335 635l494 494q29 29 50 20.5t21 -49.5v-1000q0 -41 -21 -49.5t-50 20.5l-494 494q-14 14 -14 35t14 35z" />
<glyph unicode="&#xe252;" d="M100 900h1000q41 0 49.5 -21t-20.5 -50l-494 -494q-14 -14 -35 -14t-35 14l-494 494q-29 29 -20.5 50t49.5 21z" />
<glyph unicode="&#xe253;" d="M635 865l494 -494q29 -29 20.5 -50t-49.5 -21h-1000q-41 0 -49.5 21t20.5 50l494 494q14 14 35 14t35 -14z" />
<glyph unicode="&#xe254;" d="M700 741v-182l-692 -323v221l413 193l-413 193v221zM1200 0h-800v200h800v-200z" />
<glyph unicode="&#xe255;" d="M1200 900h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300zM0 700h50q0 21 4 37t9.5 26.5t18 17.5t22 11t28.5 5.5t31 2t37 0.5h100v-550q0 -22 -25 -34.5t-50 -13.5l-25 -2v-100h400v100q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v550h100q25 0 37 -0.5t31 -2 t28.5 -5.5t22 -11t18 -17.5t9.5 -26.5t4 -37h50v300h-800v-300z" />
<glyph unicode="&#xe256;" d="M800 700h-50q0 21 -4 37t-9.5 26.5t-18 17.5t-22 11t-28.5 5.5t-31 2t-37 0.5h-100v-550q0 -22 25 -34.5t50 -14.5l25 -1v-100h-400v100q4 0 11 0.5t24 3t30 7t24 15t11 24.5v550h-100q-25 0 -37 -0.5t-31 -2t-28.5 -5.5t-22 -11t-18 -17.5t-9.5 -26.5t-4 -37h-50v300 h800v-300zM1100 200h-200v-100h200v-100h-300v300h200v100h-200v100h300v-300z" />
<glyph unicode="&#xe257;" d="M701 1098h160q16 0 21 -11t-7 -23l-464 -464l464 -464q12 -12 7 -23t-21 -11h-160q-13 0 -23 9l-471 471q-7 8 -7 18t7 18l471 471q10 9 23 9z" />
<glyph unicode="&#xe258;" d="M339 1098h160q13 0 23 -9l471 -471q7 -8 7 -18t-7 -18l-471 -471q-10 -9 -23 -9h-160q-16 0 -21 11t7 23l464 464l-464 464q-12 12 -7 23t21 11z" />
<glyph unicode="&#xe259;" d="M1087 882q11 -5 11 -21v-160q0 -13 -9 -23l-471 -471q-8 -7 -18 -7t-18 7l-471 471q-9 10 -9 23v160q0 16 11 21t23 -7l464 -464l464 464q12 12 23 7z" />
<glyph unicode="&#xe260;" d="M618 993l471 -471q9 -10 9 -23v-160q0 -16 -11 -21t-23 7l-464 464l-464 -464q-12 -12 -23 -7t-11 21v160q0 13 9 23l471 471q8 7 18 7t18 -7z" />
<glyph unicode="&#xf8ff;" d="M1000 1200q0 -124 -88 -212t-212 -88q0 124 88 212t212 88zM450 1000h100q21 0 40 -14t26 -33l79 -194q5 1 16 3q34 6 54 9.5t60 7t65.5 1t61 -10t56.5 -23t42.5 -42t29 -64t5 -92t-19.5 -121.5q-1 -7 -3 -19.5t-11 -50t-20.5 -73t-32.5 -81.5t-46.5 -83t-64 -70 t-82.5 -50q-13 -5 -42 -5t-65.5 2.5t-47.5 2.5q-14 0 -49.5 -3.5t-63 -3.5t-43.5 7q-57 25 -104.5 78.5t-75 111.5t-46.5 112t-26 90l-7 35q-15 63 -18 115t4.5 88.5t26 64t39.5 43.5t52 25.5t58.5 13t62.5 2t59.5 -4.5t55.5 -8l-147 192q-12 18 -5.5 30t27.5 12z" />
<glyph unicode="&#x1f511;" d="M250 1200h600q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-150v-500l-255 -178q-19 -9 -32 -1t-13 29v650h-150q-21 0 -35.5 14.5t-14.5 35.5v400q0 21 14.5 35.5t35.5 14.5zM400 1100v-100h300v100h-300z" />
<glyph unicode="&#x1f6aa;" d="M250 1200h750q39 0 69.5 -40.5t30.5 -84.5v-933l-700 -117v950l600 125h-700v-1000h-100v1025q0 23 15.5 49t34.5 26zM500 525v-100l100 20v100z" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 106 KiB

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,23 @@
/*!
* IE10 viewport hack for Surface/desktop Windows 8 bug
* Copyright 2014-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/
// See the Getting Started docs for more information:
// http://getbootstrap.com/getting-started/#support-ie10-width
(function () {
'use strict';
if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
var msViewportStyle = document.createElement('style')
msViewportStyle.appendChild(
document.createTextNode(
'@-ms-viewport{width:auto!important}'
)
)
document.querySelector('head').appendChild(msViewportStyle)
}
})();

View File

@ -0,0 +1,7 @@
/*!
* headroom.js v0.11.0 - Give your page some headroom. Hide your header until you need it
* Copyright (c) 2020 Nick Williams - http://wicky.nillia.ms/headroom.js
* License: MIT
*/
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?module.exports=n():"function"==typeof define&&define.amd?define(n):(t=t||self).Headroom=n()}(this,function(){"use strict";function t(){return"undefined"!=typeof window}function d(t){return function(t){return t&&t.document&&function(t){return 9===t.nodeType}(t.document)}(t)?function(t){var n=t.document,o=n.body,s=n.documentElement;return{scrollHeight:function(){return Math.max(o.scrollHeight,s.scrollHeight,o.offsetHeight,s.offsetHeight,o.clientHeight,s.clientHeight)},height:function(){return t.innerHeight||s.clientHeight||o.clientHeight},scrollY:function(){return void 0!==t.pageYOffset?t.pageYOffset:(s||o.parentNode||o).scrollTop}}}(t):function(t){return{scrollHeight:function(){return Math.max(t.scrollHeight,t.offsetHeight,t.clientHeight)},height:function(){return Math.max(t.offsetHeight,t.clientHeight)},scrollY:function(){return t.scrollTop}}}(t)}function n(t,s,e){var n,o=function(){var n=!1;try{var t={get passive(){n=!0}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(t){n=!1}return n}(),i=!1,r=d(t),l=r.scrollY(),a={};function c(){var t=Math.round(r.scrollY()),n=r.height(),o=r.scrollHeight();a.scrollY=t,a.lastScrollY=l,a.direction=l<t?"down":"up",a.distance=Math.abs(t-l),a.isOutOfBounds=t<0||o<t+n,a.top=t<=s.offset,a.bottom=o<=t+n,a.toleranceExceeded=a.distance>s.tolerance[a.direction],e(a),l=t,i=!1}function h(){i||(i=!0,n=requestAnimationFrame(c))}var u=!!o&&{passive:!0,capture:!1};return t.addEventListener("scroll",h,u),c(),{destroy:function(){cancelAnimationFrame(n),t.removeEventListener("scroll",h,u)}}}function o(t,n){n=n||{},Object.assign(this,o.options,n),this.classes=Object.assign({},o.options.classes,n.classes),this.elem=t,this.tolerance=function(t){return t===Object(t)?t:{down:t,up:t}}(this.tolerance),this.initialised=!1,this.frozen=!1}return o.prototype={constructor:o,init:function(){return o.cutsTheMustard&&!this.initialised&&(this.addClass("initial"),this.initialised=!0,setTimeout(function(t){t.scrollTracker=n(t.scroller,{offset:t.offset,tolerance:t.tolerance},t.update.bind(t))},100,this)),this},destroy:function(){this.initialised=!1,Object.keys(this.classes).forEach(this.removeClass,this),this.scrollTracker.destroy()},unpin:function(){!this.hasClass("pinned")&&this.hasClass("unpinned")||(this.addClass("unpinned"),this.removeClass("pinned"),this.onUnpin&&this.onUnpin.call(this))},pin:function(){this.hasClass("unpinned")&&(this.addClass("pinned"),this.removeClass("unpinned"),this.onPin&&this.onPin.call(this))},freeze:function(){this.frozen=!0,this.addClass("frozen")},unfreeze:function(){this.frozen=!1,this.removeClass("frozen")},top:function(){this.hasClass("top")||(this.addClass("top"),this.removeClass("notTop"),this.onTop&&this.onTop.call(this))},notTop:function(){this.hasClass("notTop")||(this.addClass("notTop"),this.removeClass("top"),this.onNotTop&&this.onNotTop.call(this))},bottom:function(){this.hasClass("bottom")||(this.addClass("bottom"),this.removeClass("notBottom"),this.onBottom&&this.onBottom.call(this))},notBottom:function(){this.hasClass("notBottom")||(this.addClass("notBottom"),this.removeClass("bottom"),this.onNotBottom&&this.onNotBottom.call(this))},shouldUnpin:function(t){return"down"===t.direction&&!t.top&&t.toleranceExceeded},shouldPin:function(t){return"up"===t.direction&&t.toleranceExceeded||t.top},addClass:function(t){this.elem.classList.add.apply(this.elem.classList,this.classes[t].split(" "))},removeClass:function(t){this.elem.classList.remove.apply(this.elem.classList,this.classes[t].split(" "))},hasClass:function(t){return this.classes[t].split(" ").every(function(t){return this.classList.contains(t)},this.elem)},update:function(t){t.isOutOfBounds||!0!==this.frozen&&(t.top?this.top():this.notTop(),t.bottom?this.bottom():this.notBottom(),this.shouldUnpin(t)?this.unpin():this.shouldPin(t)&&this.pin())}},o.options={tolerance:{up:0,down:0},offset:0,scroller:t()?window:null,classes:{frozen:"headroom--frozen",pinned:"headroom--pinned",unpinned:"headroom--unpinned",top:"headroom--top",notTop:"headroom--not-top",bottom:"headroom--bottom",notBottom:"headroom--not-bottom",initial:"headroom"}},o.cutsTheMustard=!!(t()&&function(){}.bind&&"classList"in document.documentElement&&Object.assign&&Object.keys&&requestAnimationFrame),o});

Binary file not shown.

After

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 266 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 343 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 344 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 275 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 B

Some files were not shown because too many files have changed in this diff Show More