fceux/web/help/taseditor/Ideas.html

761 lines
108 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="generator" content="HelpNDoc Personal Edition 7.0.0.199">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="icon" href="favicon.ico"/>
<title>Ideas</title>
<meta name="description" content="" />
<meta name="keywords" content="">
<!-- Twitter Card data -->
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Ideas">
<meta name="twitter:description" content="">
<!-- Open Graph data -->
<meta property="og:title" content="Ideas" />
<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>
<body class="md-nav-expanded">
<div id="skip-link">
<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-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="Ideas"
data-hnd-context="22"
data-hnd-title="Ideas"
>
<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="TASEditorInside.html" title="TAS Editor Inside" role="button"><span class="glyphicon glyphicon-menu-left" aria-hidden="true"></span></a><a class="btn btn-default" href="Implementation.html" title="Implementation" role="button"><span class="glyphicon glyphicon-menu-right" aria-hidden="true"></span></a></div>
</div>
</div>
<a id="main-content"></a>
<h2>Ideas</h2>
<div class="main-content">
<p></p>
<p class="rvps2"><span class="rvts18">Ideas</span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps2"><span class="rvts6"><br/></span></p>
<p class="rvps7"><span class="rvts20">Taseditor combines multiple experimental ideas into single system. Many of these ideas appeared long ago (see topics on the forum, like "</span><a class="rvts24" href="http://tasvideos.org/forum/viewtopic.php?t=4559" target="_blank">dream tool</a><span class="rvts20">", etc.), but it took a long time to implement them in terms of a consistent system.</span></p>
<p class="rvps7"><span class="rvts20">The underlying idea of Taseditor is the Piano Roll interface that allows user to interact with the movie in a very intuitive from. The first mention of the need for a Piano Roll-based TAS tool sounded back in </span><a class="rvts24" href="http://tasvideos.org/forum/viewtopic.php?p=38496#38496" target="_blank">2005</a><span class="rvts20">, perhaps even earlier. A prototype called TASEdit was made in 2008. The final vision of Taseditor was formed in September 2011 and was improved during the course of development until the summer of 2012. In addition to the ideas implemented at that time, many promising but minor or hard-to-implement ideas were invented and postponed for the future.</span></p>
<p class="rvps13"><span class="rvts20"><br/></span></p>
<div class="rvps13">
<table width="700" border="1" cellpadding="0" cellspacing="0" style="border-color: #000000; border-style: solid; border-spacing: 0px; margin: 0px auto;">
<tr valign="top">
<td width="50%" style="border-color: #000000; border-style: solid; padding: 0px; background-color: #0000ff;">
<p class="rvps3"><a class="rvts65" href="Ideas.html#ImplementedIdeas">Implemented in 1.0</a></p>
</td>
<td width="50%" style="border-color: #000000; border-style: solid; padding: 0px; background-color: #0000ff;">
<p class="rvps3"><a class="rvts65" href="Ideas.html#PlannedIdeas">Planned for 2.0</a></p>
</td>
</tr>
<tr valign="top">
<td width="50%" style="border-color: #000000; border-style: solid; padding: 0px;">
<p class="rvps3"><a class="rvts43" href="Ideas.html#PianoRoll">Piano Roll</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Selection">Selection</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Markers">Markers</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#HotChanges">Hot Changes</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Greenzone">Greenzone</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Playback">Playback</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#GreenArrow">Green arrow</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#AutoRestoring">Auto-restore last position</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Recorder">Multitrack Recorder</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Lua">Lua automation</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#BookmarksBranches">Bookmarks and branches</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#PopupWindows">Pop-up windows</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#HistoryLog">History Log</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#RerecordsCounter">Rerecord counter</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Modifiers">Modifier keys system</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Patterns">Patterns</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#CrossingGaps">Crossing gaps</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#SaveCompact">Compact saving</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Autosave">Autosave</a></p>
</td>
<td width="50%" style="border-color: #000000; border-style: solid; padding: 0px;">
<p class="rvps3"><a class="rvts43" href="Ideas.html#OutputLog">Output Log</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Minimap">Minimap</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#VirtualJoypad">Virtual Joypad</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#BetterSelection">Selection improvement</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#BetterColumns">Columns tweaking</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#RerecordsHeatmap">Rerecords heatmap</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#Etc">Other stuff</a></p>
<p class="rvps3"><a class="rvts43" href="Ideas.html#OtherPlatforms">Supporting platforms other than NES</a></p>
</td>
</tr>
</table>
</div>
<p class="rvps13"><span class="rvts20"><br/></span></p>
<hr style="height: 1px; color : #000000; background-color : #000000; border-width : 0px;">
<p class="rvps2"><a name="ImplementedIdeas"></a><span class="rvts31"><br/></span></p>
<p class="rvps7"><span class="rvts18">Implemented ideas</span></p>
<p class="rvps7"><a name="PianoRoll"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Piano Roll</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">The basis of Taseditor, all other ideas were developed around this one.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">It is a significantly redesigned List (ListView) or Table (GridView) component. Columns of the List correspond to Input buttons, rows of the List correspond to movie frames. The number of rows (lines) in the List is regularly updated automatically to match the number of frames in the current movie. The lines are numbered from top to bottom, starting from zero. The line number is equal to the number of frame associated with this line. The number of columns depends on the movie type (on the number of joypads and the number of buttons).</span></li>
<li class="rvps7"><span class="rvts20">To the left from the Input columns there are two additional columns in the List. The first column (width ~17 pixels) is responsible for displaying icons and controlling the Playback cursor. Current Playback cursor position is displayed with a light-blue arrow icon. When you left-click on that column, the Playback cursor is sent to the appropriate frame, and then you can drag the cursor by moving the mouse, until you release the left button.</span></li>
<li class="rvps7"><span class="rvts20">The second column (75 pixels wide) is responsible for displaying frame numbers and Markers, and for controlling the Selection and Markers. A single left-click on the column changes the Selection (and then you can stretch it by dragging). A double-click on a frame number puts a Marker there and starts dragging this Marker until you release the left mouse button.</span></li>
<li class="rvps7"><span class="rvts20">The List Header displays names of the columns. The first column (icons column) does not have a name, the second column is called "Frame #" (frame number), the remaining columns are named with corresponding joypad button symbols. The same symbol appears in the cells of the column on the rows where the button is pressed. The user can click any cell of the List Header in order to change the appropriate button Input in the selected frames. Click the "Frame #" to change Markers in the selected frames.</span></li>
<li class="rvps7"><span class="rvts20">In addition, the Header serves as an indicator of the pressed joypad buttons. And during Input Recording, the recorded symbols flash in the Header.</span></li>
<li class="rvps7"><span class="rvts20">Input columns show the state of every joypad button for each frame of the movie. To see the state of the button of interest, you need to visually find the point of intersection of the frame row and the button column. If this cell contains a button symbol, then the button is pressed in this frame. If that cell is empty or has a dash, then the button is released. By left-clicking on any Input cell you can invert the state of the corresponding button. Also, if you hold the left mouse button, you can draw or erase Input in neighboring frames by moving your mouse up or down.</span></li>
<li class="rvps7"><span class="rvts20">Piano Roll lines are colored with different pastel colors, so the frame numbers (black symbols) and the buttonpress symbols (dark-colored symbols) are always clearly visible on the pastel background. By the color of a Piano Roll line you can immediately determine if this movie frame is inside the Greenzone, whether there is lag in that frame, whether the given frame is currently displayed in the emulator window, and is the frame selected or not. Also, additional colors can focus the user's attention on specific frames, for example, on the target frame of seeking (flashing light-blue line) or the undo keyframe (purple line). In addition, by the background color of the frame numbers the user can see if there is Marker on the frame (yellow color).</span></li>
<li class="rvps7"><span class="rvts20">The coloring of the Piano Roll cells also depends on the column (although to a lesser extent). Icon column always appears in white. Frame numbers column is displayed with pale shade of the current line color. The columns of the 1st (and 3rd) joypad buttons appear in normal shade of the current line color (green, red, blue, etc.), and the columns of the 2nd (and 4th) joypad buttons are displayed in a slightly tinted shade of this line color.</span></li>
<li class="rvps7"><span class="rvts20">The visible area of the Piano Roll can be scrolled with the mouse wheel or by using the scrollbar, or a variety of other </span><a class="rvts24" href="Navigation.html#scrolling-piano-roll">navigation methods</a><span class="rvts20">. Such multitude of methods is meant to speed up the navigation to any desired segment of the movie, since only a limited number of lines can be displayed on screen at any given moment. This number depends on the current Piano Roll height in pixels, which depends on the current TAS Editor window height.</span></li>
</ul>
<p class="rvps7"><a name="Selection"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Selection</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">As in any other editor, in Taseditor the Selection is used to apply an operation to multiple frames at once. But in addition, here the Selection also serves as a pointer (cursor) to the last edited Input location.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">The Selection is stored as a list of numbers of frames that are considered selected.</span></li>
<li class="rvps7"><span class="rvts20">Taseditor also stores the Selections Log in memory, as an array of lists. The array size is equal to the the History Log size. You can return to the previous selections with </span><span class="rvts27">Ctrl + Q</span><span class="rvts20"> and </span><span class="rvts27">Ctrl + W</span><span class="rvts20">. This is useful for tracking the recent history of clicks on the Piano Roll.</span></li>
<li class="rvps7"><span class="rvts20">The Piano Roll column of frame numbers is used to control the Selection. If you hold the left button after you click on the frame number, you can stretch the Selection to adjacent frames. If you hold down the </span><span class="rvts27">Ctrl</span><span class="rvts20"> key before clicking on a frame number, the previously selected frames remain highlighted, but if you make a simple click on a frame number or on Input, the current selection disappears (moves into the Selection history), and a new selection is created instead, consisting of one frame (which was clicked). If you hold down </span><span class="rvts27">Shift </span><span class="rvts20">before clicking on a frame number, you will select all the frames starting from the old Selection to the clicked frame. If you hold down </span><span class="rvts27">Alt </span><span class="rvts20">before clicking on a frame number, a pattern-based Selection will appear. Selection also changes when you click on Input cells, but only if the modifier keys are not held.</span></li>
<li class="rvps7"><span class="rvts20">The topmost selected frame is called Selection cursor. If currently not a single frame is selected, it is implied that the Selection cursor points to the frame -1. This is necessary in some situations, for example, when there's no Selection, the bottom edit field displays the Note of the zeroth Marker.</span></li>
<li class="rvps7"><span class="rvts20">The Selection Log (including the current Selection) is saved and loaded from the project file. When you change the "max undo levels" setting, it will change both the size of the History Log and the Selection Log.</span></li>
<li class="rvps7"><span class="rvts20">While inserting and removing frames, the current Selection is automatically shifted up or down by a corresponding number of lines, in order to remain in the same position (relative to Input).</span></li>
<li class="rvps7"><span class="rvts20">Current Selection can be moved (</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><span class="rvts20">). If some part of the Selection goes beyond Piano Roll, this part disappears. That is, the user can not select any frame beyond the current movie.</span></li>
<li class="rvps7"><span class="rvts20">The Selection cursor can jump on Markers (</span><span class="rvts27">Ctrl + Page Up</span><span class="rvts20"> / </span><span class="rvts27">Ctrl + Page Down</span><span class="rvts20">), with each jump the current Selection goes to History and a newly selected frame appears at the next Marker.</span></li>
<li class="rvps7"><span class="rvts20">The visible area of the Piano Roll always follows the Selection. If the selection does not fit the screen, Piano Roll scrolls in such a way that the Selection cursor is in the middle, but if the selection fits, the Piano Roll shows all selected frames.</span></li>
<li class="rvps7"><span class="rvts20">The bottom text edit field displays the Note of the nearest Marker above the Selection cursor. This text is updated every time the Selection changes or you change Markers.</span></li>
<li class="rvps7"><span class="rvts20">When you press </span><span class="rvts27">Ctrl + A</span><span class="rvts20">, the current Selection goes to History, and instead it selects the frames starting with the nearest Marker above the Selection cursor and ending with the next Marker (not including that Marker). This way you can select the whole segment. At the second </span><span class="rvts27">Ctrl + A</span><span class="rvts20"> press, the Selection changes to a set of frames between the Markers, not including the upper and lower Markers. On the third </span><span class="rvts27">Ctrl + A</span><span class="rvts20"> press, the Selection will change to a set of frames between the Markers, excluding the upper but including the lower Marker. Finally, the fourth </span><span class="rvts27">Ctrl + A</span><span class="rvts20"> pressing modifies the Selection into a set of frames between the Markers, including both Markers. All the next </span><span class="rvts27">Ctrl + A</span><span class="rvts20"> presses will repeat these four versions of the selection.</span></li>
</ul>
<p class="rvps7"><a name="Markers"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Markers</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">When editing large movies, the user may need to set some marks on the Piano Roll lines, in order to distinct these lines visually from their neighbors. After a series of improvements, that simple idea evolved into a versatile feature.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Any frame of the movie can be marked. If necessary, the user can even mark all movie frames. Also, you can leave a mark, say, on a frame 1200, and then truncate the Input after frame 1000, leaving the Input-detached Marker outside the movie boundary. This Marker will remain in the project. To see it, you would need to emulate the game up to frame 1200 again, so the Piano Roll displays the marked line.</span></li>
<li class="rvps7"><span class="rvts20">Unmarked Piano Roll lines are displayed in normal colors, but in the marked lines the frame number cell is colored yellow. This color is chosen because Markers are intended to attract user's attention. Also the numbers of marked frames are written using special font, so that the Marker presence can be guessed even when the yellow background is covered by the blue Selection color.</span></li>
<li class="rvps7"><span class="rvts20">Markers can be attached to the Input (then they are displayed by pale yellow), or can be detached (displayed by more saturated yellow). When the Markers are attached, they are affected by all operations that move Input up/down, and affected by Input truncation.</span></li>
<li class="rvps7"><span class="rvts20">A Marker can be set by double-clicking (with the left mouse button) on the desired frame number. If you double-click on an already existing Marker, you will start dragging it until you release the left button. So you can move the Marker to another frame, or remove a Marker by throwing it away from the Piano Roll. When you drag it, a Marker image is hanging under the mouse cursor, looking like a yellow rectangle with the number of the frame it was taken from. To cancel the dragging, either drop the Marker on the same cell, or drop it on any Input cell.</span></li>
<li class="rvps7"><span class="rvts20">Markers can also be created and removed using the context menu or by clicking on the "Frame#" caption.</span></li>
<li class="rvps7"><span class="rvts20">Usually Markers are placed far from each other, so there are intervals of unmarked frames between them. Therefore, Markers can be used not only as color highlighting for special frames, but also as border marks for movie segments. The following terminology is used: each Marker corresponds to the movie segment that starts with the marked frame and ends with the last unmarked frame. For example, if Markers are set at the frames 10 and 20, we are calling the range of frames 10-19 as a "segment of the first Marker", and the segment of the second Marker consists of all the frames from the frame 20 to the last movie frame.</span></li>
<li class="rvps7"><span class="rvts20">The intervals between the Markers can be crossed by jumping from the current Marker to the next one (or previous). This allows to speed up the navigation through the movie in some cases.</span></li>
<li class="rvps7"><span class="rvts20">With the </span><span class="rvts22">Select between Markers</span><span class="rvts20"> function (</span><span class="rvts27">Ctrl + A</span><span class="rvts20">) the user can quickly select all frames in the current Marker segment. Thus Markers can accelerate not only navigation, but also editing.</span></li>
<li class="rvps7"><span class="rvts20">Each Marker has a text Note. After Marker creation it is empty. The user can view and edit the Note using any of the two text edit fields. In the upper edit field you can see the Note of the Marker above the current Playback cursor. The lower edit field displays the Note of the Marker above the Selection cursor. So, to edit the desired Note, you must first put one of the two cursors below desired Marker or right into the Marker. In theory it sounds awkward, but in Taseditor the general workflow ensures that one of the cursors is usually located under the needed Marker.</span></li>
<li class="rvps7"><span class="rvts20">The Note size is limited by one hundred of characters, because Notes are not intended to store long texts, they are for short comments, tags and similar kinds of napkin notes. In an extreme case you can always place multiple Markers in a row and break the long text into several adjacent Notes.</span></li>
<li class="rvps7"><span class="rvts20">You can make a regular search through Notes text (Find Note) or fuzzy search (Similar/More). See more in </span><a class="rvts24" href="AdvancedFeatures.html#UsingMarkers">Advanced Features</a><span class="rvts20">.</span></li>
<li class="rvps7"><span class="rvts20">Markers are saved and restored from the Bookmark branches along with Input. Each Marker operation is recorded to History Log the same way as Input operations. Also, the current state of Markers is saved into the project file, right after saving the Input data.</span></li>
</ul>
<p class="rvps7"><a name="HotChanges"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Hot Changes</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">Taseditor paints text symbols in the Input cells by different colors, depending on the time of editing the cell. For details, see </span><a class="rvts24" href="PianoRoll.html#HotChanges">Program Interface</a><span class="rvts20"> and </span><a class="rvts24" href="ProgramCustomization.html#EnableHotChanges">Program Customization</a><span class="rvts20">.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Taseditor stores the hotness value for all the Input cells, despite the fact that majority of them has zero hotness. It is necessary for the rare occasions when almost all movie cells become mass-changed (e.g, </span><a class="rvts24" href="Operations.html#Import">Import </a><span class="rvts20">or </span><a class="rvts24" href="Operations.html#Paste">Paste</a><span class="rvts20"> operations). Thus the array of Hot Changes takes a lot of memory, but it is well compressed and takes little space on the disk.</span></li>
<li class="rvps7"><span class="rvts20">Using 16 shades of color, so that one byte can fit the data about hotness of 2 cells. Also, it makes no sense to add more grades, since the human eye will hardly distinguish them, while the value of the Hot Changes is in the ability to quickly estimate Input without long deliberation.</span></li>
<li class="rvps7"><span class="rvts20">The state of the current Hot Changes map changes only when a new item is added to the History Log (and during History undos).</span></li>
</ul>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">when changing Input, all old cells lose one level of hotness, and changed cells gain maximum level</span></li>
<li class="rvps7"><span class="rvts20">when removing frames, old cells lose one hotness level</span></li>
<li class="rvps7"><span class="rvts20">when inserting frames, old cells lose one hotness level, and all the inserted frames cells appear with maximum level</span></li>
<li class="rvps7"><span class="rvts20">when editing Markers or Bookmarks, and when truncating the movie, Hot Changes do not change</span></li>
<li class="rvps7"><span class="rvts20">when loading a Bookmark, the current Hot Changes are replaced by the Hot Changes from the Bookmark branch</span></li>
<li class="rvps7"><span class="rvts20">when importing Input, the old cells are reset to zero hotness, and changed cells gain maximum level</span></li>
</ul>
<p class="rvps7"><a name="Greenzone"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Greenzone</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">Since the Piano Roll interface provides the user with almost instant editing of the Input of any frame, it is also desirable to provide the ability to instantly view the game state at any given frame. This is accomplished by caching the data on all emulated game states.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">The Greenzone is an array of data about the Output of the game, retrieved at the beginning of each frame. That is, the item #0 stores the game state before any emulation started, the item #1 stores the game state before emulating the second frame (the frame with number 000001), and so on. Besides the savestates the Greenzone stores the Lag Log that corresponds to the Input of the current movie. It's also theoretically possible to store other information.</span></li>
<li class="rvps7"><span class="rvts20">The Greenzone starts with zeroth frame and has a lower boundary (head) the frame number after which the Greenzone has no information about future game states (however, there may still be some information about the Lag of those frames).</span></li>
<li class="rvps7"><span class="rvts20">The game data is collected into the Greenzone at the beginning of each frame (before emulation) in the following way: if the Greenzone array item with the number equal to the current frame is empty, or the position of the Greenzone head is smaller than the current frame number, then the array item is filled with information about the current game state (from emulator), and the Greenzone head moves forward if necessary.</span></li>
<li class="rvps7"><span class="rvts20">To save some memory, the Greenzone is rarefied periodically, removing the savestates (but not the Lag Log data) of some early frames that are left too far from the Playback cursor. For details, see </span><a class="rvts24" href="ProgramCustomization.html#SetGreenzonecapacity">Program Customization</a><span class="rvts20">.</span></li>
<li class="rvps7"><span class="rvts20">All the Greenzone data together with the Lag Log is saved and loaded from the project file. After loading the project, Taseditor restores the Playback cursor state using the Greenzone.</span></li>
<li class="rvps7"><span class="rvts20">Any change of the current movie Input forces the Greenzone remove the savestates of all frames after the first edited frame, not including the frame. This is accomplished by reducing the position of the Greenzone head and removing the outdated information from an array of savestates (but without freeing the memory, because the place of the old savestates will soon be taken by the new data of about the same size).</span></li>
<li class="rvps7"><span class="rvts20">The Playback cursor must always be is inside the Greenzone, in order to avoid displaying the irrelevant game states on the FCEUX screen. So the Greenzone truncation may also move the Playback cursor.</span></li>
<li class="rvps7"><span class="rvts20">When creating a Bookmark, the savestate of the bookmarked frame and the whole Lag Log are copied into it. When loading this Bookmark, the Greenzone is first truncated (because of the Input change), but then the bookmarked savestate and the relevant part of the bookmarked Lag Log are restored, and the Greenzone head position is moved, if necessary.</span></li>
<li class="rvps7"><span class="rvts20">The Greenzone data is used for coloring the Piano Roll lines and the Bookmarks List items. The Lag Log stores information independently from savestates stored in the Greenzone. Every item of the Lag Log can have one of the three possible values: LAG=YES, LAG=NO, LAG=DONTKNOW.</span></li>
<li class="rvps7"><span class="rvts20">The lag information for the Lag Log is collected at the same time when collecting the current game state to the Greenzone. That is, before emulating the current frame. At this point the emulator has knowledge about the previous frame lag, so at the frame 000020 we can store the lag data to the cell 19. Also, during this time the </span><a class="rvts24" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts20"> operation can fire off and shift the entire following Input up or down. The Input is shifted up, if in the previous frame the Lag Log has LAG=YES, and the emulator says there was no lag in previous frame. The Input moves down if the Lag Log has LAG=NO in the previous frame, and the emulator says there was lag. Together with the Input this operation shifts all subsequent items of the Lag Log get, so that the red lines of the Piano Roll are still consistent with the shifted Input gaps.</span></li>
</ul>
<p class="rvps7"><a name="Playback"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Playback</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">The Playback is a meeting of all functions used for watching the game Output (the game state).</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">The main attribute of the Playback is the "currently played movie frame", the frame whose screenshot is displayed at the emulator window at the moment. This frame corresponds to the light-blue line in the Piano Roll, which is called Playback cursor. Since the Playback cursor is tied to the state of the emulated game, you can use it not only as an indicator, but as a control too. E.g. to see the frame of interest on the FCEUX screen, you need to put the Playback cursor to the line with that frame number. There are </span><a class="rvts24" href="Navigation.html#playback-cursor">many ways</a><span class="rvts20"> to do this.</span></li>
<li class="rvps7"><span class="rvts20">When the user sends the Playback cursor on a frame contained in the Greenzone, the emulated game state is recovered from the corresponding savestate. Since there was no emulation in this case, Taseditor has to simulate the events "frame boundary" and "frame begin"/"frame end", so that the respective Lua functions could fire off.</span></li>
<li class="rvps7"><span class="rvts20">When the user sends the Playback cursor on a frame outside the Greenzone, Taseditor restores the game state from the nearest preceding frame that has the Greenzone savestate, and then starts seeking to the desired frame. "Seeking" is the emulation which automatically stops when the target frame is reached. When the Playback is seeking, a copy of the light-blue cursor flashes at the target frame in the Piano Roll.</span></li>
<li class="rvps7"><span class="rvts20">Seeking is based on the following assumption. Since the emulator provides determinism, the game state for any frame is guaranteed to be obtained by using the initial game state (the movie beginning state) and the Input of the movie. Moreover, you can get the required state using the state for any previous frame (any Greenzone savestate) and the Input of the movie.</span></li>
<li class="rvps7"><span class="rvts20">The seeking process is indicated by the progressbar, in order to let the user estimate the waiting time if seeking takes too long. When there is no seeking, the progressbar is full during pause and empty during emulation.</span></li>
<li class="rvps7"><span class="rvts20">The seeking can be done at the highest possible emulation speed. In this case the seeking will be finished instantly (for relatively small segments).</span></li>
<li class="rvps7"><span class="rvts20">In many cases it is useful to automatically stop emulation at the last frame of the movie Input. The </span><a class="rvts24" href="ProgramCustomization.html#AutopauseattheendofMovie">Autopause at the end of Movie</a><span class="rvts20"> option serves for this. When the emulator is paused, if the Playback cursor is not on the last movie frame, the Playback sets the "automatic stop" flag. And if the user releases the pause, the Playback automatically stops when it reaches the last movie frame. Thanks to it, the Playback cursor will not run away when the pause is released.</span></li>
<li class="rvps7"><span class="rvts20">In most cases the user does not want to automatically scroll the Piano Roll after the Playback cursor when the cursor moves itself. But for the cases when it is needed, there is the "Follow cursor" checkbox.</span></li>
</ul>
<p class="rvps7"><a name="GreenArrow"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Green arrow</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">When making speedruns, TASer is trying to beat his record on each segment. In most cases the optimality criterion is </span><span class="rvts31">the number of frame where the target event of the segment occurs</span><span class="rvts20">. To detect the frame, TASer moves the Playback cursor while watching the FCEUX screen, and stops this manual search when he detects the beginning of the event of interest. Then the Playback cursor is usually left at this frame, and the TASer starts to change the Input on the segment (above the Playback cursor), hoping to improve the old approach and get the same event at an earlier frame.</span></p>
<p class="rvps7"><span class="rvts20">While changing Input, the Greenzone becomes truncated and the Playback cursor jumps up. When the TASer believes that the Input was changed enough, he starts checking the game Output in order to determine at which frame the target event occurs now. For this, he moves the Playback cursor again while watching the FCEUX screen.</span></p>
<p class="rvps7"><span class="rvts20">To conclude an improvement, the TASer needs to compare the old frame number (detected last time) and the new number, detected just recently. Taseditor visualizes this data to the user, so that he doesn't need to keep the numbers in mind. The new number is indicated by the Playback cursor, the old number is shown by the green arrow.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Thus the actual name of the green arrow is "last position of the Playback cursor".</span></li>
<li class="rvps7"><span class="rvts20">The more universal replacement of the green arrow would be Bookmarks and Markers that can be set manually.</span></li>
<li class="rvps7"><span class="rvts20">The icon of the green arrow appears in the icons column of the Piano Roll. When drawing icons in Piano Roll, the green arrow has priority over the blue arrow (the Playback cursor icon), since the position of the blue cursor can be defined by the other columns.</span></li>
<li class="rvps7"><span class="rvts20">The green arrow appears on the frame of the Playback cursor at the moment of Greenzone truncation. And it remains on that frame until the user performs the following sequence of actions:</span></li>
</ul>
<ol style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: decimal;">
<li value="1" class="rvps7"><span class="rvts20">emulate at least one frame (the user started viewing the segment)</span></li>
<li value="2" class="rvps7"><span class="rvts20">truncate the Greenzone and jump up with the Playback cursor again</span></li>
</ol>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Thus the green arrow will not change its position when the Greenzone is truncated twice in a row without an emulation between (e. g. the TASer changed Input on the frame 90 and then on the frame 80, but the green arrow remains on the frame 100).</span></li>
<li class="rvps7"><span class="rvts20">Also, the green arrow does not change its position when the Greenzone is truncated during seeking, granted that the emulator is unpaused at the moment.</span></li>
<li class="rvps7"><span class="rvts20">The green arrow does not change its position during operations </span><a class="rvts24" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts20">, </span><a class="rvts24" href="Operations.html#Branch">Branch</a><span class="rvts20">, </span><a class="rvts24" href="Operations.html#Record">Record</a><span class="rvts20">.</span></li>
<li class="rvps7"><span class="rvts20">When you press the middle mouse button, the Playback starts seeking to the green arrow, if the arrow is outside the Greenzone. But if the arrow is inside the Greenzone, it means the current segment has been already watched, and the automatic pause on the green arrow is not needed anymore.</span></li>
</ul>
<p class="rvps7"><a name="AutoRestoring"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Auto-restore last position</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">When making any TAS, the optimality criterion may be either </span><span class="rvts31">the game state on a certain frame</span><span class="rvts20">, or </span><span class="rvts31">the sequence of events on the segment</span><span class="rvts20">. TASer watches the segment and leaves the Playback cursor on the last frame of the segment, then he changes the segment Input and watches the segment again, stopping the Playback cursor on the same frame as last time. TASer makes the conclusion about the improvement either while watching the segment events, or after stopping the emulation and evaluating the properties of the final frame.</span></p>
<p class="rvps7"><span class="rvts20">That process can be automated by auto-starting the seeking to the green arrow after every Greenzone truncation. The "Auto-restore last position" checkbox serves for this purpose.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">When the checkbox is enabled, the Playback starts seeking to the green arrow right after the Greenzone truncation.</span></li>
<li class="rvps7"><span class="rvts20">If the Greenzone was truncated during seeking, the original seeking will be resumed without changing the target frame. But if the seeking was paused at the moment of the Greenzone truncation, the original seeking is canceled and a new seeking will start, targeting the green arrow. The implication is that if TASer did not wait for the finish of seeking, and instead he paused the emulator and started to change the Input on the current segment, then TASer has focused on a subsegment, so the further auto-restore should run only for this subsegment.</span></li>
<li class="rvps7"><span class="rvts20">Auto-restoring does not start during operations </span><a class="rvts24" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts20">, </span><a class="rvts24" href="Operations.html#Branch">Branch</a><span class="rvts20">, </span><a class="rvts24" href="Operations.html#Record">Record</a><span class="rvts20">. When the </span><a class="rvts24" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts20"> operation fires off, the movie playing is not affected.</span></li>
</ul>
<p class="rvps7"><a name="Recorder"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Multitrack Recorder</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">The Recorder is a meeting of all functions for editing Input on the frame pointed by the Playback cursor. The Recorder provides TASer with the second way to edit Input by recording.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Multitracking allows TASer to change the data of only one selected joypad in Recording mode, leaving the other joypads data on the same frames intact. For details, see </span><a class="rvts24" href="Toolbox.html#multitracking">Toolbox</a><span class="rvts20">.</span></li>
<li class="rvps7"><span class="rvts20">When Recording mode is on, at the beginning of every frame the emulator polls virtual joypads and writes the data to the current movie. Then it immediately passes control to the Recorder.</span></li>
<li class="rvps7"><span class="rvts20">Recorder:</span></li>
</ul>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">uses the data from the movie (from the frame under the Playback cursor) as newly recorded data, or (if recording the pattern, and "no presses" need to be recorded now) uses nil as the newly recorded data</span></li>
<li class="rvps7"><span class="rvts20">compares the newly recorded data to the old data stored in the History Log</span></li>
<li class="rvps7"><span class="rvts20">imposes the filter over the changes, according to the currently selected multitracking mode</span></li>
<li class="rvps7"><span class="rvts20">selectively combines old and new data, according to the "Superimpose" checkbox</span></li>
<li class="rvps7"><span class="rvts20">saves the resultant changes to the current movie</span></li>
<li class="rvps7"><span class="rvts20">calls the History Log to let it create a new item and then truncates the Greenzone</span></li>
<li class="rvps7"><span class="rvts20">returns control to the emulator</span></li>
</ul>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Emulator returns the current movie data (from the frame under the Playback cursor) to virtual joypads, in order to use the data for the frame emulation. Also, at this moment the emulator executes the recorded commands (reset, etc.).</span></li>
<li class="rvps7"><span class="rvts20">Each frame, the Recorder gets information from the emulator about the currently pressed buttons of virtual joypads and prepares certain information for the Piano Roll, the information about which columns in the Piano Roll Header should glow green. For example, if you have selected the "2P" radiobutton and checked the "</span><a class="rvts24" href="ProgramCustomization.html#Use1PkeysforallsingleRecordings">Use 1P keys for all single Recordings</a><span class="rvts20">", that means when you press </span><span class="rvts26">A</span><span class="rvts20"> on the first joypad, the Piano Roll Header will highlight the "A" symbol of the second joypad. And if the </span><span class="rvts26">A</span><span class="rvts20"> button wasn't held in previous frame, the Recorder considers this in accordance with the "</span><a class="rvts24" href="ProgramCustomization.html#UseInputkeysforColumnSet">Use Input keys for Column Set"</a><span class="rvts20"> checkbox.</span></li>
</ul>
<p class="rvps7"><a name="Lua"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Lua automation</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">Lua allows the user to expand Taseditor capabilities, in particular, it provides the TASer with the third way to edit Input by automatic generation.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Lua interpreter calls the appropriate Taseditor function not directly but through Taseditor's gateway (taseditor_lua).</span></li>
<li class="rvps7"><span class="rvts20">When some function from the "taseditor" library fires off, Lua interpreter takes the arguments data from the stack, converts it to a format accepted by Taseditor's gateway, and sends it to the appropriate function of the Lua gateway of Taseditor.</span></li>
<li class="rvps7"><span class="rvts20">The gateway calls the appropriate functions of Taseditor and sends the result back to the Lua interpreter.</span></li>
<li class="rvps7"><span class="rvts20">Lua interpreter puts the returned data to the stack, converting the data to a format accepted by Lua code if necessary.</span></li>
<li class="rvps7"><span class="rvts20">The functions </span><span class="rvts61">submitinputchange()</span><span class="rvts20">, &nbsp;</span><span class="rvts61">submitinsertframes()</span><span class="rvts20"> and </span><span class="rvts61">submitdeleteframes()</span><span class="rvts20"> do not cause immediate change of the movie data, but only create an entry in the array of the postponed jobs, stored in Taseditor's Lua gateway. All the postponed jobs are executed when the </span><span class="rvts61">applyinputchanges()</span><span class="rvts20"> function is called. Thanks to this, a Lua script can apply many changes to the movie at once, creating only one item in the History Log.</span></li>
</ul>
<p class="rvps7"><a name="BookmarksBranches"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Bookmarks and branches</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">Bookmarks are a specialized alternative to Markers. And branches are needed to store several movies in a single project. So, to simplify the creation and navigation through branches, they are assigned to Bookmarks, by analogy with the traditional savestates.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">A project can store up to 10 Bookmarks. This limitation is due to the number of the numeric keys on the keyboard. Also, such a restriction allows Taseditor to display basic information about all the Bookmarks at once, with no need for scrolling. In addition, the long-term experience of traditional TASing confirms that this number of slots for Bookmarks is enough for productive TASing.</span></li>
<li class="rvps7"><span class="rvts20">A Bookmark can be set at any frame of the movie. Bookmarks will not disappear even when the movie is truncated. For example, if you set a Bookmark to the frame 1200 and then truncate the Input after frame 1000, a Bookmark will remain beyond the movie boundary, and if you jump to the Bookmark, the movie will expand to frame 1200.</span></li>
<li class="rvps7"><span class="rvts20">Bookmarks are displayed in the Piano Roll as icons with corresponding digits (slot numbers). A Bookmark that corresponds the current movie branch is shown by the blue-colored digit, other Bookmarks are displayed by green digits.</span></li>
<li class="rvps7"><span class="rvts20">A Bookmark can be set by pressing the corresponding hotkey (each slot has a dedicated hotkey for saving) or by right-click on the Bookmark slot. The Bookmark is set to the frame where the Playback cursor currently is. This frame number is stored in the Bookmark, and in the future you can always send the Playback cursor on that frame by clicking with the left mouse button over the Bookmark slot, or pressing the hotkey (each slot has a dedicated hotkey for jumping). "Jump to Bookmark" is not an operation, because no change is made to the movie.</span></li>
<li class="rvps7"><span class="rvts20">When setting a Bookmark, Taseditor checks whether the newly saved data differs from the data already contained in this Bookmark slot. If there's no difference, the </span><a class="rvts24" href="Operations.html#Bookmark">Bookmark</a><span class="rvts20"> operation is not performed.</span></li>
<li class="rvps7"><span class="rvts20">In addition to storing the frame number, all movie data is also stored in the Bookmark slot (Input type, Input, Hot Changes, Markers). In future, the current movie may be changed many times, but you can always return back to the state of the movie stored in this Bookmark.</span></li>
<li class="rvps7"><span class="rvts20">In addition, each Bookmark also stores the screenshot of the FCEUX screen at the time of bookmarking, allowing you to quickly see the contents of the Bookmark without loading it. Also it stores a copy of one savestate from the Greenzone (on the bookmarked frame), allowing to immediately put the Playback cursor on the Bookmark frame after loading the branch.</span></li>
<li class="rvps7"><span class="rvts20">After setting a Bookmark, the Bookmark becomes current (shown with a blue-colored digit), because its branch is closer to the current movie than the other branches.</span></li>
<li class="rvps7"><span class="rvts20">Whenever the current movie is changed to a bookmarked branch, the Input change occurs, so the Greenzone is truncated after the first different frame. But thanks to the savestate stored inside the Bookmark, one savestate returns back to the Greenzone on the bookmarked frame. Therefore, when loading a Bookmark you always immediately move the Playback cursor to the bookmarked frame, while jumping to a Bookmark (without changing the movie) may require seeking.</span></li>
<li class="rvps7"><span class="rvts20">All Bookmark operations (setting, jumping, loading) are executed only after the emulation of the current frame, even if the signal from the user comes in the middle of the frame.</span></li>
<li class="rvps7"><span class="rvts20">To display the basic Bookmark data, Taseditor uses the Listview with disabled scrolling. The List contains 10 rows and 3 columns. When creating a new project, all 10 Bookmarks are empty, so the 2nd and the 3rd columns in the Bookmark List are empty.</span></li>
<li class="rvps7"><span class="rvts20">The 1st column of the Bookmarks List displays the slot number that corresponds to the given line. The number is displayed the same way it is displayed in the Piano Roll i.e. with digit icons of green or blue color. The numbering of slots goes in this order: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0. This order is necessary, so that user doesn't lose the association with the numeric keys on the keyboard.</span></li>
<li class="rvps7"><span class="rvts20">The 2nd column of the Bookmarks List displays the bookmarked frame number.</span></li>
<li class="rvps7"><span class="rvts20">The 3rd column of the Bookmarks List displays the real time when the Bookmark was created.</span></li>
<li class="rvps7"><span class="rvts20">The Bookmarks List is divided in half with a vertical bar. The left side (which contains the 1st and the 2nd column of the List) is associated with bookmarking functionality of the Bookmarks. The right side (the 3rd column) is associated with branching functionality of the Bookmarks. The left side is displayed in a lighter shade, the right one in the darker. Left-clicking on the left side means a jump to the Bookmark, and left-click on the right side is loading the branch of the Bookmark.</span></li>
<li class="rvps7"><span class="rvts20">Bookmarks List lines are painted in colors, matching the bookmarked Piano Roll lines. For example, if the Bookmark is set on the frame 1000, and the Playback cursor is currently on that frame, this line will be drawn in light-blue color in the the Bookmarks List. This feature gives the user some additional information about the Bookmarks location in the movie.</span></li>
<li class="rvps7"><span class="rvts20">Instead of constant viewing of the Bookmarks List, the user can switch to the Branches Tree. Switching is done by clicking on the caption above the Bookmarks List.</span></li>
<li class="rvps7"><span class="rvts20">Branches Tree is a graphical representation of the relationship between the branches of all Bookmarks in the project. Bookmarks are usually set during the movie creation, so the later Bookmarks contain the branch the initial part of which coincides with earlier Bookmarks branches. For each Bookmark you can find the "parent" Bookmark, whose movie likely gave birth to this Bookmark movie. As a result, Bookmarks can be arranged in a hierarchical structure, the beginning of which is the root (shown as a cloudlet), that is a parent for Bookmarks that have no parent. Searching for Bookmarks parents re-occurs after every change in Bookmarks. The search is guided by numbers of the bookmarked frames, so the beginning of the hierarchy will contain the Bookmarks with the lowest frame number.</span></li>
<li class="rvps7"><span class="rvts20">Markers contained in the Bookmarks do not affect the algorithm of searching for parents. The parent is found by comparing the Input.</span></li>
<li class="rvps7"><span class="rvts20">When you set a Bookmark, it becomes current, and its contents are no different from the current movie. But after some editing of the movie it will become different from the current Bookmark, so the Branches Tree will show the fireball to report the difference. The fireball symbolizes the current movie, and the current Bookmark is always considered to be its parent. There's no real search for the best parent of the fireball, because such search would need to be done after every movie modification, and it would require comparing the current movie to the Input of each Bookmark, that is too resource-intensive.</span></li>
<li class="rvps7"><span class="rvts20">Bookmarks in the Branches tree are displayed as digit icons (like in the Piano Roll). Current Bookmark is displayed as a blue-colored digit. Bookmarks relation is shown in thin lines. For the current Bookmark there is a sequence of the red lines that connect all the Bookmarks which will not change the current movie Input if you load the Bookmark (because at least up to the bookmarked frame the loaded Input will be the same as the Input stored in the current Bookmark). These red lines go from the cloudlet to the current Bookmark or even further to the heirs of the current Bookmark (if the current Bookmark contains the same Input as these successors).</span></li>
<li class="rvps7"><span class="rvts20">Due to how the Bookmarks are located in ascending order of bookmarked frame numbers, the sequence of the red lines can be interpreted as a timeline of the current movie. The cloudlet is the beginning of this timeline, by clicking on it the Playback cursor is sent to the beginning of the movie. The Bookmarks sitting on the red thread are the intermediate stages of that timeline, by clicking on them the Playback cursor is sent to the bookmarked frames. The fireball (if exists) is considered to be the end of the timeline, and when you click on it the Playback cursor is sent to the end of the movie.</span></li>
<li class="rvps7"><span class="rvts20">Thus, any position of the Playback cursor can be projected onto this timeline by finding the two Bookmarks which contain the Playback cursor in between, and then converting the distance from frames to pixels. As a result, the current Playback cursor position is always displayed in the Branches Tree as a small blue triangle (similar to the Playback cursor icon in Piano Roll).</span></li>
<li class="rvps7"><span class="rvts20">If you need to see the alternative timeline of any Bookmark. hover the mouse cursor over it (the timeline will be displayed by blue lines).</span></li>
<li class="rvps7"><span class="rvts20">All Bookmarks data is saved and loaded from the project file. As for the Branches Tree, Taseditor only saves the cached data about the number of the first frame of difference in the Input for each pair of Bookmarks. Based on this data, Taseditor easily restores the hierarchy of parent relation between the Bookmarks. And if this data is not available, Taseditor will have to redo the comparison of Input.</span></li>
</ul>
<p class="rvps7"><a name="PopupWindows"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Pop-up windows</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">They are used to display the context-sensitive information that is needed only at certain moments of time.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">TAS Editor 1.0 has only two types of pop-ups: screenshots for Bookmarks and text descriptions for Bookmarks. Both windows pop up when the user is hovering the mouse cursor either over the right side of the Bookmarks List or over any Bookmark icon in the Branches Tree.</span></li>
<li class="rvps7"><span class="rvts20">Both windows appear (with translucency) within about half a second after the mouse cursor was pointed to an active element. They disappear in the similar fashion after moving the cursor off the item.</span></li>
<li class="rvps7"><span class="rvts20">You can turn off one or the other type of pop-ups in the </span><a class="rvts24" href="ProgramCustomization.html#DisplayBranchScreenshots">settings</a><span class="rvts20">.</span></li>
<li class="rvps7"><span class="rvts20">The </span><span class="rvts22">screenshot</span><span class="rvts20"> pop-up window displays a copy of the FCEUX screen made at the time of bookmarking. Depending on the </span><a class="rvts24" href="ProgramCustomization.html#HUDinBranchscreenshots">HUD in Branch screenshots</a><span class="rvts20"> option, the image will be either raw emulated console screen or the console screen with the superimposed emulator on-screen display. Screenshots are used to quickly check the Bookmarks contents and to compare alternative strategies.</span></li>
<li class="rvps7"><span class="rvts20">The </span><span class="rvts22">description</span><span class="rvts20"> pop-up window displays a text field with the width equal to the width of the upper and lower edit fields. That text field shows the Marker Note text taken from the pointed Bookmark branch. The Marker is determined by the bookmarked frame number.</span></li>
<li class="rvps7"><span class="rvts20">The screenshot window is displayed to the left from the Bookmarks section, the description window appears under the screenshot window.</span></li>
<li class="rvps7"><span class="rvts20">When you drag the TAS Editor window, the pop-ups move along with it.</span></li>
<li class="rvps7"><span class="rvts20">If the contents of the displayed Bookmark change while pop-up windows still display the old contents, the pop-up windows will be instantly updated.</span></li>
</ul>
<p class="rvps7"><a name="HistoryLog"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">History Log</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">The logging of all significant changes of the project serves mainly for undo, as well as for visual tracking of the history.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Each item of the History Log stores a full copy of current Input, Lag and Markers at the time of the item creation. Also, any item can store a backup copy of a Bookmark, if the item was created because of the </span><a class="rvts24" href="Operations.html#Bookmark">Bookmark</a><span class="rvts20"> operation.</span></li>
<li class="rvps7"><span class="rvts20">The data of each item is stored in memory in both compressed and uncompressed state. Uncompressed data is used during work, and its compressed version is saved in fm3 file. When creating a new item in History Log, the data of the item is only stored in an uncompressed form, but every half-second Taseditor goes through the History Log and creates a compressed version of the first found item without a compressed version. Thus, at the time of saving the project to disk, almost all History items already have compressed versions, and those that don't have it will be compressed during saving (which slows down the process of saving). When loading an fm3 file, the History Log is loaded in a compressed form, and is decompressed.</span></li>
<li class="rvps7"><span class="rvts20">Using the History Log, Taseditor implements searching for the first changed frame after which the Greenzone should be truncated. Most </span><a class="rvts24" href="Operations.html">operations</a><span class="rvts20"> work as follows:</span></li>
</ul>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Edit the current movie data.</span></li>
<li class="rvps7"><span class="rvts20">Remember the minimum and maximum number of changed frame.</span></li>
<li class="rvps7"><span class="rvts20">Call the History to register changes, passing the minimum and maximum frame as parameters, together with the operation code and other parameters.</span></li>
</ul>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 70px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">The History compares the contents of the current movie with the contents of the last item of the History Log. If the minimum frame is provided, the search begins from that frame, ignoring the previous movie contents (in order to speed up the work). Otherwise everything from the movie beginning is checked. If the maximum frame is set, then the search ends on that frame (but most operations do not pass the maximum frame, since, for example, an insertion of a blank frame shifts all subsequent Input, and we need to check everything up to the end of the movie).</span></li>
<li class="rvps7"><span class="rvts20">Once the History detects the first difference between the Input/Markers of the current movie and the Input/Markers of the previous movie snapshot, it creates a new new item in the History Log and fills all its attributes.</span></li>
<li class="rvps7"><span class="rvts20">If the differences were not found, it is believed that the operation did not affect the movie, and no change in the project is registered. For example, if you record the same buttonpresses over existing ones, the </span><a class="rvts24" href="Operations.html#Record">Record</a><span class="rvts20"> operation will not be registered.</span></li>
<li class="rvps7"><span class="rvts20">Even if an operation didn't change Input/Markers, it could still shift Lag, so the History also compares Lag Logs and returns the first frame of difference.</span></li>
<li class="rvps7"><span class="rvts20">For the </span><a class="rvts24" href="Operations.html#Record">Record</a><span class="rvts20"> operation, the History registers not only the frame number of the changed Input, but also the number of the joypad whose buttons were changed.</span></li>
<li class="rvps7"><span class="rvts20">Consecutively added items for operations </span><a class="rvts24" href="Operations.html#AdjustLag">AdjustLag</a><span class="rvts20">, </span><a class="rvts24" href="Operations.html#Record">Record</a><span class="rvts20">, </span><a class="rvts24" href="Operations.html#Set">Set</a><span class="rvts20"> or </span><a class="rvts24" href="Operations.html#Unset">Unset</a><span class="rvts20"> can be combined into one item of the History Log, to make it easier to roll back when necessary. The combining is done when the History is filling the attributes of the new History Log item. Instead of appending the item to the end of the Log, it replaces the last item by the new one.</span></li>
<li class="rvps7"><span class="rvts20">After the registration of a new item, the History sends a signal to the Branches Tree (to spawn the fireball) and to the project manager (to add an asterisk to the window caption), and then exits, returning the number of the frame of the first difference found. If no difference was found, it returns -1.</span></li>
</ul>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 40px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Truncate the Greenzone after the first different frame. This number can be greater than the minimum number of the frame of the changes made by the operation. For example, if you set buttonpresses in all selected frames, the minimum frame will be the first selected frame, but the Greenzone will be truncated only after the frame where the button wasn't pressed before.</span></li>
</ul>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">The History can be rolled back by jumping from the current History Log item to the previous one. It's possible to directly jump to any item of the History Log. Current movie and current Markers are recovered from the data contained in this item, and the item becomes current.</span></li>
<li class="rvps7"><span class="rvts20">One of the attributes of each History item is the "key frame number". For most operations it's the frame number of the first difference. But for operations that shift Input it will be the number of the minimum frame.</span></li>
<li class="rvps7"><span class="rvts20">When jumping through History Items, a purple pointer appears in the Piano Roll for half a second, focusing the user's attention on the keyframe. When you roll back (undo), the purple cursor points to the keyframe of the next item in History (relative to the current), when you redo, this cursor points to the keyframe of the current History item.</span></li>
</ul>
<p class="rvps7"><a name="RerecordsCounter"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Rerecord counter</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">By tradition, all TAS emulators keep track of rerecords used during the creation of a TAS. This number can be used to estimate the labor.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">The Rerecord counter is stored in the movie (and hence in an fm3 project file too). When creating a new movie (or a new project in Taseditor) the counter is reset to 0.</span></li>
<li class="rvps7"><span class="rvts31">When TASing outside of Taseditor:</span><span class="rvts20"> the counter increments every time the TASer loads a savestate in the Recording mode, since he wants to change the Input on the previously watched segment of the movie. The counter does not increase when the TASer records Input for frames whose events he does not know.</span></li>
<li class="rvps7"><span class="rvts31">When TASing in Taseditor:</span><span class="rvts20"> the counter increments every time the TASer changes the Input of a previously greenzoned segment of the movie. The counter does not increase when the TASer changes Input for frames that are beyond the Greenzone head.</span></li>
<li class="rvps7"><span class="rvts20">Thus in both cases the emulator keeps track of </span><span class="rvts31">how many times the TASer changed the known future</span><span class="rvts20">. The counter does not increase when the TASer changes the future blindly, i.e. before watching the game events occurring at the frames he edits.</span></li>
<li class="rvps7"><span class="rvts20">In old emulators the counter increases immediately when loading the savestate in the Recording mode, even before the TASer changes Input. Because of this, it is possible that the user repeatedly presses a load savestate hotkey (e.g. </span><span class="rvts23">F1</span><span class="rvts20">), and each time the counter will increase. In Taseditor the counter increments only when truncating the Greenzone, regardless of the navigation method. Therefore, at the first press of the </span><span class="rvts23">F1</span><span class="rvts20"> the counter will increase only if the branch of this Bookmark is different from the current movie, and the difference begins from a greenzoned frame. And the second press of the </span><span class="rvts23">F1</span><span class="rvts20"> will not increase the counter, because now the Bookmark branch does not differ from the current movie, and no Input change is happening.</span></li>
</ul>
<p class="rvps7"><a name="Modifiers"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Modifier keys system</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">For a more intuitive keyboard control, Taseditor enforces a strict separation of modifier keys functions:</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts27">Shift</span><span class="rvts20"> is associated with the movie </span><a class="rvts24" href="Glossary.html#Output">Output</a><span class="rvts20">, and specifically with the Playback cursor. Key combinations involving this key usually control the Playback cursor. If you quickly press </span><span class="rvts27">Shift</span><span class="rvts20"> twice, the Piano Roll will automatically scroll to the Playback cursor.</span></li>
<li class="rvps7"><span class="rvts27">Ctrl</span><span class="rvts20"> is associated with the movie </span><a class="rvts24" href="Glossary.html#Input">Input</a><span class="rvts20">, and specifically with the Selection cursor. Key combinations involving this key usually control the Selection. If you quickly press </span><span class="rvts27">Ctrl</span><span class="rvts20"> twice, the Piano Roll will automatically scroll to the Selection cursor.</span></li>
<li class="rvps7"><span class="rvts27">Alt</span><span class="rvts20"> is associated with patterns and alternating sequences, in particular, with gaps in these sequences.</span></li>
</ul>
<p class="rvps7"><a name="Patterns"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Patterns</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">Prepared sequence of button states for a single button. See more in </span><a class="rvts24" href="AdvancedFeatures.html#UsingPatterns">Advanced Features</a><span class="rvts20">.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Patterns are stored in an external text file in a format that can be edited in Notepad. The file format should be described in the file itself.</span></li>
<li class="rvps7"><span class="rvts20">Each pattern must have its name, which will appear in the list of patterns.</span></li>
<li class="rvps7"><span class="rvts20">Patterns are loaded from the file at the time of launching the TAS Editor.</span></li>
<li class="rvps7"><span class="rvts20">TAS Editor 1.0 has no built-in Pattern editing, as the format is very simple and that feature is not too much in demand.</span></li>
<li class="rvps7"><span class="rvts20">Input, Markers and even Selection can be set by pattern.</span></li>
<li class="rvps7"><span class="rvts20">When you set a pattern, the current lag log can be taken into account or disregarded. More: </span><a class="rvts24" href="ProgramCustomization.html#AutofirePatternskipsLag">Program Customization</a><span class="rvts20">.</span></li>
</ul>
<p class="rvps7"><a name="CrossingGaps"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Crossing gaps</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">This is an additional method of quick navigation through the Piano Roll contents. It helps to visually track long sequences of a single button or Markers. Also it allows to move from a Bookmark to another Bookmark.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Crossing gaps is the process of scrolling the Piano Roll vertically, triggered by rolling the mouse wheel while holding down </span><span class="rvts27">Alt</span><span class="rvts20">. The speed of rolling the wheel is irrelevant here, because the actual amount of scrolling is calculated individually based on the state of the Piano Roll cell near the mouse cursor. So only the direction of the wheel rolling is relevant (up or down).</span></li>
<li class="rvps7"><span class="rvts20">Crossing gaps implies that the user wants to find the cell at a distance of more than one frame from the cell under the mouse cursor (otherwise there is no reason to use this feature, because you could simply move your mouse right above).</span></li>
<li class="rvps7"><span class="rvts20">Thus, when the mouse wheel is scrolled up, this feature memorizes the value of the cell above the cell under the mouse cursor. Then it searches for a cell whose value is not equal to a given value. Search goes upwards from the cell above the cell under the mouse. If such a cell is successfully found, the Piano Roll scrolls up so that the mouse cursor is now pointing to the found cell. If the search reached the movie beginning, and the cell was not found, the Piano Roll does not scroll.</span></li>
<li class="rvps7"><span class="rvts20">Similarly, when the mouse wheel is rolled down, this feature memorizes the value of the cell following the cell under the mouse. Then it searches for a cell whose value is not equal to the value. Search goes down from the cell following the cell under the mouse.</span></li>
<li class="rvps7"><span class="rvts20">The memorized value is of a boolean type. E.g. the search considers all icons to have the same value (true), and all empty cells also have the same value (false).</span></li>
</ul>
<p class="rvps7"><a name="SaveCompact"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Compact saving</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">The Taseditor project file is primarily designed to save the exact snapshot of the workflow.</span></p>
<p class="rvps7"><span class="rvts20">In order to use the same format for file sharing, the user should be able to selectively save data to the file. When you open such an fm3 file, the missing data is be replaced with default data.</span></p>
<p class="rvps7"><span class="rvts20">For details, see </span><a class="rvts24" href="AdvancedFeatures.html#ProjectsSharing">Advanced Features</a><span class="rvts20"> and </span><a class="rvts24" href="FM3format.html">FM3 Format</a><span class="rvts20">.</span></p>
<p class="rvps7"><a name="Autosave"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Autosave</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">As any office document, Taseditor project should to be saved to disk from time to time, even if you do not plan to exit the program. However, TASers are not accustomed to such habits, so it makes sense to save the project automatically, allowing the user to customize or disable this feature.</span></p>
<p class="rvps7"><span class="rvts20">For details, see </span><a class="rvts24" href="ProgramCustomization.html#Projectfilesavingoptions">Program Customization</a><span class="rvts20">.</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"><a name="PlannedIdeas"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts18">Planned ideas</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><a name="OutputLog"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Output Log</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">This is the next stage of evolution of the Memory Watch tool. It's intended to watch the game data in a dynamic way, not just static. Similarly to the Lag Log, this feature will make analyzing the game Output &nbsp;easier and more accurate.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">It is a significantly redesigned ListView, whose vertical scrolling is synchronized with the Piano Roll scrolling. Its height is equal to the height of the Piano Roll, and the number of rows is always equal to the number of Piano Roll lines. The number of columns depends on the needs of the user.</span></li>
<li class="rvps7"><span class="rvts20">The user can flexibly change the width of the List by dragging the narrow border between it and the Piano Roll, thus changing the Piano Roll width as well, so their total width is always the same. You can also swap the List and the Piano Roll, or even completely disable the display of the Output Log. When you disable the Log display, the Piano Roll extends to take up the free up space, just as in TAS Editor 1.0. Note that hiding the Log does not disable logging of data.</span></li>
<li class="rvps7"><span class="rvts20">The List Header displays the names of logged cells. You can add and remove columns, change names, change places and change the columns width. When you create a new project, the Output Log has no columns, and, accordingly, nothing is logged.</span></li>
<li class="rvps7"><span class="rvts20">The rows of the List display the values of the cells. The values are saved from the game state on the appropriate movie frame. The List lines are painted with the same colors as the corresponding Piano Roll lines. When you select a line in the Piano Roll, the respective Log lines are selected too.</span></li>
<li class="rvps7"><span class="rvts20">In addition to the RAM cells, it's necessary to implement Lua variables logging. For example, to provide Lua-scripts with a read/write-access to a dozen of Taseditor's int-variables and allow the user to log any variable from the dozen.</span></li>
<li class="rvps7"><span class="rvts20">In addition, in the future a column with screenshots of the game (or selected rectangular area of the game screen) should be added. The displayed size of the screenshots will depend on the current width of the screenshots column, and as a result, the screenshots will not appear on each line of the Log, but on every few lines, even though the screenshot capturing is done every frame.</span></li>
<li class="rvps7"><span class="rvts20">All logged data is stored in the Greenzone, along with the Lag Log. When adding a RAM cell, an automatic filling of the entire column is possible (Taseditor runs through all Greenzone savestates, unpacks them and takes the value of the saved copy of RAM). When you add a Lua variable, the cell values are unknown (blank cells in the list), and to fill them you need to re-emulate the movie with the Lua-script running.</span></li>
<li class="rvps7"><span class="rvts20">When truncating the Greenzone, the old data that has become outdated will not be removed, but will appear in less bright color, until the new data takes its place. Also, when savestates are removed from the Greenzone tail, the Log data remains intact and is shown in the normal color.</span></li>
<li class="rvps7"><span class="rvts20">It should allow flexible coloring of cells, for example, highlighting the same values in the Selection, highlighting the desired values, automatic color change when the value changes, automatic indication when certain value is hit, etc.</span></li>
<li class="rvps7"><span class="rvts20">Lua scripts may read any Greenzone data using Taseditor API.</span></li>
<li class="rvps7"><span class="rvts20">The accelerators </span><span class="rvts27">Shift + Right</span><span class="rvts20"> / </span><span class="rvts27">Shift + Left</span><span class="rvts20"> will now scroll horizontally not the Piano Roll, but the Output Log. Scrolling is done by whole columns.</span></li>
<li class="rvps7"><span class="rvts20">It is also necessary to implement the new methods of navigation through the movie, depending on the cells values. For example, by using the </span><span class="rvts27">Alt</span><span class="rvts20"> key and the wheel you can cross gaps in the List to find the nearest unequal or equal value.</span></li>
</ul>
<p class="rvps7"><a name="Minimap"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Minimap</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">Graphically displays the entire movie in TAS Editor window Greenzone, Lag, Playback cursor, Selection, Markers, Bookmarks, Hot Changes, highlighted Output Log values, etc. Provides the user with an instant image of the current project, which lacks details but completely fits on the screen. Also improves navigation.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">The Minimap is a rectangular bitmap canvas, whose height is equal to the height of the Piano Roll, and the width is 30 pixels (plus 10px for Bookmark icons). Can be positioned to the left or right from the Piano Roll and the Output Log.</span></li>
<li class="rvps7"><span class="rvts20">The "View" menu item allows the user to customize the elements displayed on Minimap (set a tick near the desired items). You can also entirely disable the display of Minimap.</span></li>
<li class="rvps7"><span class="rvts20">The Minimap does not store any data of the project. It is automatically redrawn in the specified interval of time (by default, once per second).</span></li>
<li class="rvps7"><span class="rvts20">Markers are displayed as horizontal yellow lines on the left half of the Minimap. Each Marker line has the height of at least one pixel, so the Markers are not lost even on a small-scale Minimap (when the movie has a lot more frames than the height of the Minimap in pixels). The line width is 9px.</span></li>
<li class="rvps7"><span class="rvts20">Hot Changes are displayed as horizontal lines of the corresponding color on the right side of the Minimap. Each line has the height of at least one pixel. The line width is 9px.</span></li>
<li class="rvps7"><span class="rvts20">Bookmarks are displayed by corresponding icons to the left from the Minimap, and they take additional 10px. You can click these icons with left or right mouse button, the effect will be similar to clicking on the icon in the Branches Tree.</span></li>
<li class="rvps7"><span class="rvts20">When the mouse cursor hovers over the Minimap, it displays the rectangular magnifying glass.</span></li>
<li class="rvps7"><span class="rvts20">Left-click on the Minimap = instant scrolling of visible area of the Piano Roll to that place. You can then drag the visible area up/down by holding the right button.</span></li>
<li class="rvps7"><span class="rvts27">Shift</span><span class="rvts20"> + left-click, or just right-click on the Minimap = Playback cursor navigation. You can then drag the Playback cursor by holding the right button.</span></li>
</ul>
<p class="rvps7"><a name="VirtualJoypad"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Virtual Joypad</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">An alternative way to enter Input. Very similar to modifying Input by clicking the Piano Roll Header, but is more visual and intuitive.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">The Virtual Joypad is a non-modal pop-up resizable window. Contents of the window are automatically resized when the window is resized.</span></li>
<li class="rvps7"><span class="rvts20">The Virtual Joypad window appears under the mouse cursor when you right-click in the Piano Roll on the selected Input or on Input under the Playback cursor. In the settings you can disable the appearance of the Virtual Joypad under the cursor when you right click. Then you can leave the window in a convenient place on the desktop and move the mouse cursor back and forth from the Piano Roll to the Virtual Joypad.</span></li>
<li class="rvps7"><span class="rvts20">By the window background color you can determine whether the Virtual Joypad currently displays the Input state in the Selection (dark blue), or under the Playback cursor (light-blue).</span></li>
<li class="rvps7"><span class="rvts20">When the mouse cursor is moved out of the Virtual Joypad window, this window is either hidden automatically (if the "Hide on mouse leave" is checked) or left in place.</span></li>
<li class="rvps7"><span class="rvts20">When you press the left mouse button over the inactive area of the window, the window dragging starts.</span></li>
<li class="rvps7"><span class="rvts20">When you right-click anywhere in the window, it hides.</span></li>
<li class="rvps7"><span class="rvts20">Various controls can be located inside the window e.g. the buttons that correspond to the real joypad buttons. The buttons layout corresponds to the real prototype. By the buttons look you can determine whether the corresponding button in the Selection is pressed, released or partially pressed (this is for cases when more than one frame is Selected).</span></li>
<li class="rvps7"><span class="rvts20">The window contents are automatically updated every time the Input is changed, or Selection is changed and the Virtual Joypad shows the Input in the Selection.</span></li>
<li class="rvps7"><span class="rvts20">The Virtual Joypad reflects only the state of the single controller the current controller, selected by a radiobutton in the Recorder section.</span></li>
<li class="rvps7"><span class="rvts20">When you click on a button, it changes the Input of the current joypad. Pressed button becomes released, and released or partially pressed becomes pressed. The Input of all the selected frames or the frame under the Playback cursor changes accordingly.</span></li>
<li class="rvps7"><span class="rvts20">In addition to the normal Input buttons, the Virtual Joypad may contain several macro-buttons. A click on a macro button will be similar to a few clicks on different normal buttons. This will allow to change the Input in the Selection even faster than before, for example, instead of three clicks on </span><span class="rvts26">Up</span><span class="rvts20">, </span><span class="rvts26">Right</span><span class="rvts20">, and </span><span class="rvts26">B</span><span class="rvts20"> buttons, you can do one click on </span><span class="rvts64">Macro1</span><span class="rvts20">.</span></li>
<li class="rvps7"><span class="rvts20">If you hold down </span><span class="rvts27">Alt</span><span class="rvts20"> before clicking a Virtual Joypad button or a macro button, the Input will be set by pattern.</span></li>
<li class="rvps7"><span class="rvts20">After implementing the Virtual Joypad we can change the principle of clicking on the Piano Roll Header. Instead of changing the Input, the click on the Header will select the appropriate columns in the Piano Roll.</span></li>
</ul>
<p class="rvps7"><a name="BetterSelection"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Selection improvement</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">TAS Editor 1.0 architecture is not designed to support the selection of Piano Roll columns, but in some situations it may be useful in TASing. For example, to clear the Input of the first joypad without clearing the second joypad Input. Or to shift the Input for one buttons without moving the rest buttons.</span></p>
<p class="rvps7"><span class="rvts20">Besides, it's necessary to improve the process of painting the Selection, so that users will see the Piano Roll line color under the translucent Selection.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Selecting columns should be done like selecting rows when you left-click on the Header of the corresponding Piano Roll column, the column is selected, and all other columns are deselected. If you hold down </span><span class="rvts27">Ctrl</span><span class="rvts20"> before clicking the button, Selection of the rest columns will not disappear. If you hold down </span><span class="rvts27">Shift</span><span class="rvts20">, you will select the range of columns from the previous click place. If you hold down </span><span class="rvts27">Alt</span><span class="rvts20">, the columns selection will be set by pattern. And of course after clicking you can hold the left mouse button and stretch the selection horizontally.</span></li>
<li class="rvps7"><span class="rvts20">Only Input columns can be selected. The Markers depend on the "Bind Markers to Input" setting.</span></li>
<li class="rvps7"><span class="rvts20">Selected columns are colored in the Header by blue background in the appropriate cells.</span></li>
<li class="rvps7"><span class="rvts20">The absence of selected columns is equivalent of "all columns are selected".</span></li>
<li class="rvps7"><span class="rvts20">When the selected lines are displayed, the Input cells of unselected columns are drawn with alpha ~0.4, whereas the cells of the selected columns have alpha ~0.7.</span></li>
<li class="rvps7"><span class="rvts20">In the column of frame numbers, the selected lines have alpha ~0.4, when the Markers are detached, and ~0.7, when the Markers are attached.</span></li>
<li class="rvps7"><span class="rvts20">Splicer section displays not only the number of the selected lines (rows), but the number of selected columns (columns).</span></li>
<li class="rvps7"><span class="rvts20">When you Copy, only the Input from the selected columns is copied to the Clipboard, and it appears there as a rectangular table with no gaps between columns. This allows the user to change the selected columns and insert some buttons in place of the other buttons.</span></li>
<li class="rvps7"><span class="rvts20">When the SELECTION object is initialized (i.e. at Taseditor startup or project creation), Selection is reset to "no selection of columns".</span></li>
<li class="rvps7"><span class="rvts20">If you change the order of columns or hide/disclose them, the Selection is reset to "no selection of columns".</span></li>
<li class="rvps7"><span class="rvts20">When recording, the Input is filtered to match columns selection. Unselected columns will not change, even if the user records a different button state for the column.</span></li>
<li class="rvps7"><span class="rvts20">Columns selection is also saved in the project file.</span></li>
<li class="rvps7"><span class="rvts20">This innovation does not affect the Selection History. Changing the Selection of columns is not saved in the Selection History, because there's no need to navigate through column selections history.</span></li>
</ul>
<p class="rvps7"><a name="BetterColumns"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Columns tweaking</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">In TAS Editor 1.0 the Piano Roll columns have fixed width. The number and order of the columns are also fixed. There's also no columns dedicated to hardware commands (reset, insert disk, etc.), because these commands are rarely used. However, porting Taseditor to another emulator will increase the number of columns (e.g. PSX needs to display columns for 14 buttons), so it's necessary to give the user the ability to customize them.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Since this setting is typically done only once (when you start using the program), it does not have to be done directly in the Piano Roll, it should be configured in a separate window called from the "Config" menu.</span></li>
<li class="rvps7"><span class="rvts20">The ability to display any Input columns, including the command columns.</span></li>
<li class="rvps7"><span class="rvts20">Ability to hide any columns. However, each joypad must be represented by at least one button column (but if the user has configured project to 1P mode, the second joypad columns in any case will not be displayed).</span></li>
<li class="rvps7"><span class="rvts20">The ability to change the order of the columns.</span></li>
<li class="rvps7"><span class="rvts20">When you Copy to the Clipboard, only the abstract values like true/false are copied. So if after copying you reorder the columns and insert the Input from the Clipboard to the same place, the real movie Input may change (because button columns are swapped).</span></li>
<li class="rvps7"><span class="rvts20">The ability to change the width of columns. For platforms with many buttons (like PC) it's useful to shrink the width of columns down to a few pixels, so that a lot of columns can fit the screen.</span></li>
<li class="rvps7"><span class="rvts20">The possibility to restore the default settings (those recommended by the author) by one click.</span></li>
<li class="rvps7"><span class="rvts20">All settings are saved in config.</span></li>
<li class="rvps7"><span class="rvts20">Все настройки сохраняются при выходе.</span></li>
</ul>
<p class="rvps7"><a name="RerecordsHeatmap"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Rerecords heatmap</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">Stores and displays the statistics about "changes done after watching" (rerecords). It may be useful to identify the difficult places in the movie.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Stores an array of int, one entry for each movie frame (including the frames beyond the current Input). The value corresponds to the number of Greenzone truncations at the frame.</span></li>
<li class="rvps7"><span class="rvts20">Saves and loads the data from the project file.</span></li>
<li class="rvps7"><span class="rvts20">As a canvas for displaying the Heatmap we can use the Minimap canvas. There's no point to constantly see the Heatmap during TASing, so you can just occasionally (e.g. at the end of every day) toggle the Minimap to the Heatmap display mode and evaluate the work.</span></li>
<li class="rvps7"><span class="rvts20">Since this feature is not as much operational as aesthetic, we'll need to think over the Heatmap drawing algorithm, so that it is not only informative but also beautiful.</span></li>
</ul>
<p class="rvps7"><a name="Etc"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Other stuff</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Separate History Log for the </span><a class="rvts24" href="Operations.html#Bookmark">Bookmark Set</a><span class="rvts20"> operations (</span><span class="rvts27">Alt + Z</span><span class="rvts20"> and </span><span class="rvts27">Alt + Y</span><span class="rvts20">), so the user will be able to undo the Input/Markers changes without undoing Bookmarks and vice versa.</span></li>
<li class="rvps7"><span class="rvts20">Work with movies starting from savestate.</span></li>
<li class="rvps7"><span class="rvts20">Work with multiple emulated games simultaneously (for Multi-TAS projects).</span></li>
<li class="rvps7"><span class="rvts20">Lua API improvements.</span></li>
<li class="rvps7"><span class="rvts20">Support for multi-touch controls.</span></li>
<li class="rvps7"><span class="rvts20">Think out the concept of the background greenzoning (how exactly it corresponds to TASing specifics).</span></li>
</ul>
<p class="rvps7"><a name="OtherPlatforms"></a><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts21">Supporting platforms other than NES</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20">If Taseditor gains popularity among TASers, its availability needs to be expanded to all emulated platforms.</span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<ul style="text-indent: 30px; padding: 0; margin: 0 0 0 0px; list-style-position: inside; list-style-type: disc;">
<li class="rvps7"><span class="rvts20">Think about the ways to display and change an analog Input using the Piano Roll. The Virtual Joypad partially solves this problem, but the user should also be able to quickly and easily create an analog Input with the mouse. For example, set the "stick tilt" value for one frame and then stretch it to many frames. Also, remember the value of the newly cleared cell and offer it when drawing by mouse. The cells should be able to display not only a single character, but a fixed-point number from -1.0 to +1.0. By double-clicking on a cell you can type the exact value of this number with the keyboard. While holding </span><span class="rvts27">Ctrl</span><span class="rvts20">, you can stretch the value of the cell by holding the left button and moving the mouse left/right or up/down. A single column can correlate to only single coordinate axis (thus the analog stick requires two columns in Piano Roll).</span></li>
<li class="rvps7"><span class="rvts20">The Virtual Joypad should provide the ability to draw an envelope for a frame range. It is also necessary to remake the format of patterns file, so that they can represent the sequence of "voltage levels", including relative values (for example, increase in a parabola, where the initial and final values are taken from the initial and final frame of the selected range).</span></li>
<li class="rvps7"><span class="rvts20">Transition to a 64-bit platform is highly desirable, because the Greenzone size is going to increase dramatically when storing savestates for more advanced consoles. 2GB of RAM will not be enough for Taseditor 2.0.</span></li>
</ul>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20"><br/></span></p>
<p class="rvps7"><span class="rvts20"><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/help-authoring-tool">Free help authoring environment</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>