renpy/doc/screen_optimization.html
2023-01-18 23:13:55 +01:00

843 lines
68 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 xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Screen Language Optimization &#8212; Ren&#39;Py Documentation</title>
<link rel="stylesheet" href="_static/renpydoc.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-3.3.6/css/bootstrap.min.css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-3.3.6/css/bootstrap-theme.min.css" />
<link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="_static/js/jquery-fix.js"></script>
<script type="text/javascript" src="_static/bootstrap-3.3.6/js/bootstrap.min.js"></script>
<script type="text/javascript" src="_static/bootstrap-sphinx.js"></script>
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
<link rel="next" title="Configuration Variables" href="config.html" />
<link rel="prev" title="Special Screen Names" href="screen_special.html" />
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
<meta name="apple-mobile-web-app-capable" content="yes">
</head><body>
<div id="navbar" class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<!-- .btn-navbar is used as the toggle for collapsed navbar content -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="index.html">
Ren&#39;Py Documentation</a>
<span class="navbar-text navbar-version pull-left"><b>7.5.3</b></span>
</div>
<div class="collapse navbar-collapse nav-collapse">
<ul class="nav navbar-nav">
<li><a href="https://www.renpy.org">Home Page</a></li>
<li><a href="https://www.renpy.org/doc/html/">Online Documentation</a></li>
<li class="dropdown globaltoc-container">
<a role="button"
id="dLabelGlobalToc"
data-toggle="dropdown"
data-target="#"
href="index.html">Site <b class="caret"></b></a>
<ul class="dropdown-menu globaltoc"
role="menu"
aria-labelledby="dLabelGlobalToc"><ul>
<li class="toctree-l1"><a class="reference internal" href="quickstart.html">Quickstart</a></li>
<li class="toctree-l1"><a class="reference internal" href="gui.html">GUI Customization Guide</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="language_basics.html">Language Basics</a></li>
<li class="toctree-l1"><a class="reference internal" href="label.html">Labels &amp; Control Flow</a></li>
<li class="toctree-l1"><a class="reference internal" href="dialogue.html">Dialogue and Narration</a></li>
<li class="toctree-l1"><a class="reference internal" href="displaying_images.html">Displaying Images</a></li>
<li class="toctree-l1"><a class="reference internal" href="menus.html">In-Game Menus</a></li>
<li class="toctree-l1"><a class="reference internal" href="python.html">Python Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="conditional.html">Conditional Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="audio.html">Audio</a></li>
<li class="toctree-l1"><a class="reference internal" href="movie.html">Movie</a></li>
<li class="toctree-l1"><a class="reference internal" href="voice.html">Voice</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="text.html">Text</a></li>
<li class="toctree-l1"><a class="reference internal" href="translation.html">Translation</a></li>
<li class="toctree-l1"><a class="reference internal" href="displayables.html">Displayables</a></li>
<li class="toctree-l1"><a class="reference internal" href="transforms.html">Transforms</a></li>
<li class="toctree-l1"><a class="reference internal" href="transitions.html">Transitions</a></li>
<li class="toctree-l1"><a class="reference internal" href="atl.html">Animation and Transformation Language</a></li>
<li class="toctree-l1"><a class="reference internal" href="matrixcolor.html">Matrixcolor</a></li>
<li class="toctree-l1"><a class="reference internal" href="layeredimage.html">Layered Images</a></li>
<li class="toctree-l1"><a class="reference internal" href="3dstage.html">3D Stage</a></li>
<li class="toctree-l1"><a class="reference internal" href="live2d.html">Live2D Cubism</a></li>
</ul>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="style.html">Styles</a></li>
<li class="toctree-l1"><a class="reference internal" href="style_properties.html">Style Properties</a></li>
<li class="toctree-l1"><a class="reference internal" href="screens.html">Screens and Screen Language</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_actions.html">Screen Actions, Values, and Functions</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_special.html">Special Screen Names</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">Screen Language Optimization</a></li>
<li class="toctree-l1"><a class="reference internal" href="config.html">Configuration Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="preferences.html">Preference Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="store_variables.html">Store Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="mouse.html">Custom Mouse Cursors</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="launcher.html">Launcher</a></li>
<li class="toctree-l1"><a class="reference internal" href="developer_tools.html">Developer Tools</a></li>
<li class="toctree-l1"><a class="reference internal" href="director.html">Interactive Director</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="nvl_mode.html">NVL-Mode Tutorial</a></li>
<li class="toctree-l1"><a class="reference internal" href="input.html">Text Input</a></li>
<li class="toctree-l1"><a class="reference internal" href="side_image.html">Side Images</a></li>
<li class="toctree-l1"><a class="reference internal" href="rooms.html">Image Gallery, Music Room, and Replay Actions</a></li>
<li class="toctree-l1"><a class="reference internal" href="drag_drop.html">Drag and Drop</a></li>
<li class="toctree-l1"><a class="reference internal" href="sprites.html">Sprites</a></li>
<li class="toctree-l1"><a class="reference internal" href="keymap.html">Customizing the Keymap</a></li>
<li class="toctree-l1"><a class="reference internal" href="achievement.html">Achievements</a></li>
<li class="toctree-l1"><a class="reference internal" href="history.html">Dialogue History</a></li>
<li class="toctree-l1"><a class="reference internal" href="multiple.html">Multiple Character Dialogue</a></li>
<li class="toctree-l1"><a class="reference internal" href="splashscreen_presplash.html">Splashscreen and Presplash</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="statement_equivalents.html">Statement Equivalents</a></li>
<li class="toctree-l1"><a class="reference internal" href="save_load_rollback.html">Saving, Loading, and Rollback</a></li>
<li class="toctree-l1"><a class="reference internal" href="persistent.html">Persistent Data</a></li>
<li class="toctree-l1"><a class="reference internal" href="trans_trans_python.html">Transforms and Transitions in Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="gui_advanced.html">Advanced GUI</a></li>
<li class="toctree-l1"><a class="reference internal" href="screen_python.html">Screens and Python</a></li>
<li class="toctree-l1"><a class="reference internal" href="modes.html">Modes</a></li>
<li class="toctree-l1"><a class="reference internal" href="cdd.html">Creator-Defined Displayables</a></li>
<li class="toctree-l1"><a class="reference internal" href="cds.html">Creator-Defined Statements</a></li>
<li class="toctree-l1"><a class="reference internal" href="custom_text_tags.html">Custom Text Tags</a></li>
<li class="toctree-l1"><a class="reference internal" href="character_callbacks.html">Character Callbacks</a></li>
<li class="toctree-l1"><a class="reference internal" href="file_python.html">File Access</a></li>
<li class="toctree-l1"><a class="reference internal" href="color_class.html">Color Class</a></li>
<li class="toctree-l1"><a class="reference internal" href="matrix.html">Matrix</a></li>
<li class="toctree-l1"><a class="reference internal" href="model.html">Model-Based Rendering</a></li>
<li class="toctree-l1"><a class="reference internal" href="other.html">Other Functions and Variables</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="build.html">Building Distributions</a></li>
<li class="toctree-l1"><a class="reference internal" href="updater.html">Web Updater</a></li>
<li class="toctree-l1"><a class="reference internal" href="android.html">Android</a></li>
<li class="toctree-l1"><a class="reference internal" href="chromeos.html">Chrome OS/Chromebook</a></li>
<li class="toctree-l1"><a class="reference internal" href="ios.html">iOS</a></li>
<li class="toctree-l1"><a class="reference internal" href="iap.html">In-App Purchasing</a></li>
<li class="toctree-l1"><a class="reference internal" href="gesture.html">Gestures</a></li>
<li class="toctree-l1"><a class="reference internal" href="raspi.html">Raspberry Pi</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="security.html">Security</a></li>
<li class="toctree-l1"><a class="reference internal" href="problems.html">Dealing with Problems</a></li>
<li class="toctree-l1"><a class="reference internal" href="environment_variables.html">Environment Variables</a></li>
<li class="toctree-l1"><a class="reference internal" href="self_voicing.html">Self-Voicing</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="editor.html">Text Editor Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="skins.html">Skins</a></li>
<li class="toctree-l1"><a class="reference internal" href="translating_renpy.html">Translating Ren'Py</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog (Ren'Py 7.x-)</a></li>
<li class="toctree-l1"><a class="reference internal" href="changelog6.html">Changelog (Ren'Py 6.11 - 6.99)</a></li>
<li class="toctree-l1"><a class="reference internal" href="incompatible.html">Incompatible Changes</a></li>
<li class="toctree-l1"><a class="reference internal" href="distributor.html">Distributor Notes</a></li>
<li class="toctree-l1"><a class="reference internal" href="license.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="credits.html">Credits</a></li>
<li class="toctree-l1"><a class="reference internal" href="sponsors.html">Ren'Py Development Sponsors</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="thequestion.html">Script of The Question</a></li>
<li class="toctree-l1"><a class="reference internal" href="thequestion_nvl.html">NVL-mode script for The Question</a></li>
</ul>
</ul>
</li>
</ul>
<form class="navbar-form navbar-right" action="search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3">
<div id="sidebar" class="bs-sidenav" role="complementary"><ul>
<li><a class="reference internal" href="#">Screen Language Optimization</a><ul>
<li><a class="reference internal" href="#parameter-list">Parameter List</a></li>
<li><a class="reference internal" href="#prediction">Prediction</a></li>
<li><a class="reference internal" href="#displayable-reuse">Displayable Reuse</a></li>
<li><a class="reference internal" href="#const-expressions-and-pure-functions">Const Expressions and Pure Functions</a><ul>
<li><a class="reference internal" href="#definitions">Definitions</a></li>
<li><a class="reference internal" href="#how-const-optimizes-screen-language">How Const Optimizes Screen Language</a></li>
<li><a class="reference internal" href="#const-text">Const Text</a></li>
<li><a class="reference internal" href="#const-functions">Const Functions</a></li>
</ul>
</li>
<li><a class="reference internal" href="#profiling">Profiling</a></li>
<li><a class="reference internal" href="#const-names">Const Names</a></li>
<li><a class="reference internal" href="#pure-names">Pure Names</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="col-md-9 content">
<div class="section" id="screen-language-optimization">
<h1>Screen Language Optimization<a class="headerlink" href="#screen-language-optimization" title="Permalink to this headline"> link</a></h1>
<p>Ren'Py uses a number of techniques to optimize screen language speed. When
using Ren'Py to create complex interfaces, such as those used by simulation
games, it may help to understand how screen language works so you can
achieve maximal performance.</p>
<p>This guide is applicable to the second implementation of screen language,
which was added to Ren'Py 6.18. If your game was created in Ren'Py 6.17
or earlier, it may be necessary to chose the &quot;Force Recompile&quot; option
in the launcher to ensure its screens are upgraded to the latest version.</p>
<p>This guide isn't a substitute for good programming practice. If a screen
uses nested loops to do a lot of unproductive work, it will be slower than
a screen that avoids such looping. While understanding the techniques in
this guide is important, avoiding work entirely is always better than
letting Ren'Py optimize the work for you.</p>
<div class="section" id="parameter-list">
<h2>Parameter List<a class="headerlink" href="#parameter-list" title="Permalink to this headline"> link</a></h2>
<p>For best performance, all screens should be defined with a parameter list.
When a screen doesn't take parameters, it should be defined with an empty
parameter list. The screen:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">screen</span> <span class="n">test</span><span class="p">():</span>
<span class="k">vbox</span><span class="p">:</span>
<span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="na">range</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
<span class="k">text</span> <span class="s2">&quot;[i]&quot;</span>
</pre></div>
</div>
<p>is faster than:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">screen</span> <span class="n">test</span><span class="p">:</span>
<span class="k">vbox</span><span class="p">:</span>
<span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="na">range</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
<span class="k">text</span> <span class="s2">&quot;[i]&quot;</span>
</pre></div>
</div>
<p>When a screen is defined without a parameter list, any name used in that
screen can be redefined when the screen is shown. This requires Ren'Py to be
more conservative when analyzing the screen, which can limit the optimization
it performs.</p>
</div>
<div class="section" id="prediction">
<h2>Prediction<a class="headerlink" href="#prediction" title="Permalink to this headline"> link</a></h2>
<p>Screens perform better when they're predicted in advance. That's because
Ren'Py will execute the screen during prediction time, and load in images
that are used by the screen.</p>
<p>There are two ways Ren'Py automatically predicts screens:</p>
<ul class="simple">
<li>Ren'Py will predict screens shown by the <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">screen</span></code> and <code class="docutils literal notranslate"><span class="pre">call</span> <span class="pre">screen</span></code>
statements.</li>
<li>Ren'Py will predict screens that will be shown by the <a class="reference internal" href="screen_actions.html#Show" title="Show"><code class="xref py py-func docutils literal notranslate"><span class="pre">Show()</span></code></a> and <a class="reference internal" href="screen_actions.html#ShowMenu" title="ShowMenu"><code class="xref py py-func docutils literal notranslate"><span class="pre">ShowMenu()</span></code></a>
actions.</li>
</ul>
<p>If screens are shown from Python, it's a good idea to start predicting
the screen before it is shown. To start predicting a screen, use the
<a class="reference internal" href="screen_python.html#renpy.start_predict_screen" title="renpy.start_predict_screen"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.start_predict_screen()</span></code></a> function. To stop predicting a screen,
use the <a class="reference internal" href="screen_python.html#renpy.stop_predict_screen" title="renpy.stop_predict_screen"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.stop_predict_screen()</span></code></a> function.</p>
</div>
<div class="section" id="displayable-reuse">
<h2>Displayable Reuse<a class="headerlink" href="#displayable-reuse" title="Permalink to this headline"> link</a></h2>
<p>When evaluating a screen language statement that creates a displayable, Ren'Py
will check to see if the positional arguments and properties given to that
displayable are equal to the positional arguments and properties given the
last time that statement was evaluated. If they are, instead of making a new
displayable, Ren'Py will reuse the existing displayable.</p>
<p>Displayable reuse has a number of performance implications. It saves the cost
of creating a new displayable, which may be significant for displayables that
contain a lot of internal state. More importantly, reusing a displayable means
that in many cases, Ren'Py will not need to re-render the displayable before
showing it to the user, which can lead to another significant speedup.</p>
<p>To compare positional arguments and properties, Ren'Py uses the notion of
equality embodied by Python's == operator. We've extended this notion of
equality to actions by deciding two actions should be equal when they are
indistinguishable from each other when it doesn't matter which action
is invoked, or which action is queried to determine sensitivity or
selectedness.</p>
<p>All actions provided with Ren'Py conform to this definition. When defining
your own actions, it makes sense to provide them with this notion of
equality. This can be done by supplying an appropriate <code class="docutils literal notranslate"><span class="pre">__eq__</span></code> method.
For example:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">TargetShip</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ship</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ship</span> <span class="o">=</span> <span class="n">ship</span>
<span class="k">def</span> <span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="k">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">TargetShip</span><span class="p">):</span>
<span class="k">return</span> <span class="kc">False</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">ship</span> <span class="k">is</span> <span class="n">other</span><span class="o">.</span><span class="n">ship</span>
<span class="k">def</span> <span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">global</span> <span class="n">target</span>
<span class="n">target</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">ship</span>
</pre></div>
</div>
<p>It's important to define the <code class="docutils literal notranslate"><span class="pre">__eq__</span></code> function carefully, making sure it
compares all fields, and uses equality (==) and identity (is) comparison
as appropriate.</p>
</div>
<div class="section" id="const-expressions-and-pure-functions">
<h2>Const Expressions and Pure Functions<a class="headerlink" href="#const-expressions-and-pure-functions" title="Permalink to this headline"> link</a></h2>
<p>Ren'Py can exploit the properties of const variables and pure functions
to improve the speed of screen evaluation, and to entirely avoid the
evaluation of some parts of screens.</p>
<div class="section" id="definitions">
<h3>Definitions<a class="headerlink" href="#definitions" title="Permalink to this headline"> link</a></h3>
<p>An expression is <strong>const</strong> (short for constant) if it always represents the
same value when it is evaluated. For Ren'Py's purposes, an expression is
const if and only if the following expressions always evaluate to the same
const value or are undefined:</p>
<ul class="simple">
<li>Applying any unary, binary, or ternary operator to the expression, provided
the other operands are also const.</li>
<li>Accessing a field on the expression.</li>
<li>Indexing the expression, either using a number or an object.</li>
</ul>
<p>Python numbers and strings are const, as are list, tuple, set, and dict
literals for which all components are const. Ren'Py marks
variables defined using the <code class="docutils literal notranslate"><span class="pre">define</span></code> statement as const.
The <a class="reference internal" href="#renpy.const" title="renpy.const"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.const()</span></code></a> and <a class="reference internal" href="#renpy.not_const" title="renpy.not_const"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.not_const()</span></code></a> functions
can be used to further control what Ren'Py considers to be const. The
default list of const names is given in the <a class="reference internal" href="#const-names"><span class="std std-ref">Const Names</span></a>
section below.</p>
<p>If you have a variable that will never change, it makes sense to use <code class="docutils literal notranslate"><span class="pre">define</span></code>
to both define it and declare it const. For example:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">define</span> <span class="n">GRID_WIDTH</span> <span class="o">=</span> <span class="mi">20</span>
<span class="k">define</span> <span class="n">GRID_HEIGHT</span> <span class="o">=</span> <span class="mi">10</span>
</pre></div>
</div>
<p>A callable function, class, or action is <strong>pure</strong> if, when all of its arguments
are const values, it always gives the same const value. Alternatively, an
expression that invokes a pure function with const expression is also a
const expression.</p>
<p>A large number of default functions, classes, and actions are marked as
pure. These functions are listed in the <a class="reference internal" href="#pure-names"><span class="std std-ref">Pure Names</span></a>
section below.</p>
<p>Functions are declared pure using the <a class="reference internal" href="#renpy.pure" title="renpy.pure"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.pure()</span></code></a> function, which
can be used as a decorator for functions declared in the default store.</p>
<p>Const expressions and pure functions do not need to retain the same value
across the following events:</p>
<ul class="simple">
<li>The end of the init phase.</li>
<li>A change of the language.</li>
<li>A style rebuild.</li>
</ul>
</div>
<div class="section" id="how-const-optimizes-screen-language">
<h3>How Const Optimizes Screen Language<a class="headerlink" href="#how-const-optimizes-screen-language" title="Permalink to this headline"> link</a></h3>
<p>There are three advantages to ensuring that screen language arguments and
properties are const.</p>
<p>The first is that const arguments and properties are evaluated when
screens are prepared, which is at the end of the init phase, when the
language is changed, or when styles are rebuilt. After that, it is no
longer necessary to spend time evaluating const arguments and properties.</p>
<p>The second is that const works well with displayable reuse. When all of
the arguments and properties of a displayable are const, the displayable
can always be reused, which gains all the benefits of displayable reuse.</p>
<p>Lastly, when Ren'Py encounters a tree of displayables such that all
arguments, properties, and expressions affecting control flow are
also const, Ren'Py will reuse the entire tree without evaluating
expressions or creating displayables. This can yield a significant
performance boost.</p>
<p>For example, the following screen does not execute any Python or create
any displayables after the first time it is predicted or shown:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">screen</span> <span class="n">mood_picker</span><span class="p">():</span>
<span class="k">hbox</span><span class="p">:</span>
<span class="na">xalign</span> <span class="mf">1.0</span>
<span class="na">yalign</span> <span class="mf">0.0</span>
<span class="k">textbutton</span> <span class="s2">&quot;Happy&quot;</span> <span class="na">action</span> <span class="n">SetVariable</span><span class="p">(</span><span class="s2">&quot;mood&quot;</span><span class="p">,</span> <span class="s2">&quot;happy&quot;</span><span class="p">)</span>
<span class="k">textbutton</span> <span class="s2">&quot;Sad&quot;</span> <span class="na">action</span> <span class="n">SetVariable</span><span class="p">(</span><span class="s2">&quot;mood&quot;</span><span class="p">,</span> <span class="s2">&quot;sad&quot;</span><span class="p">)</span>
<span class="k">textbutton</span> <span class="s2">&quot;Angry&quot;</span> <span class="na">action</span> <span class="n">SetVariable</span><span class="p">(</span><span class="s2">&quot;mood&quot;</span><span class="p">,</span> <span class="s2">&quot;angry&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="const-text">
<span id="id1"></span><h3>Const Text<a class="headerlink" href="#const-text" title="Permalink to this headline"> link</a></h3>
<p>When defining text, please note that strings containing new-style text
substitutions are const:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">$</span> <span class="n">t</span> <span class="o">=</span> <span class="s2">&quot;Hello, world.&quot;</span>
<span class="k">text</span> <span class="s2">&quot;[t]&quot;</span>
</pre></div>
</div>
<p>Supplying a variable containing the text directly is generally not const:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">$</span> <span class="n">t</span> <span class="o">=</span> <span class="s2">&quot;Hello, world.&quot;</span>
<span class="k">text</span> <span class="n">t</span>
</pre></div>
</div>
<p>Neither is using percent-substitution:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">$</span> <span class="n">t</span> <span class="o">=</span> <span class="s2">&quot;Hello, world.&quot;</span>
<span class="k">text</span> <span class="s2">&quot;</span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">t</span>
</pre></div>
</div>
<p>Lastly, note that the _ text translation function is pure, so if it contains
a string, the entire expression is const:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">text</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Your score is: [score]&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>If a variable containing the text contains substitution, it's necessary to use
the <code class="docutils literal notranslate"><span class="pre">!i</span></code> conversion flag:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">$</span> <span class="n">who</span> <span class="o">=</span> <span class="s2">&quot;Jane&quot;</span>
<span class="k">$</span> <span class="n">t</span> <span class="o">=</span> <span class="s2">&quot;Hello, [who]!&quot;</span>
<span class="k">text</span> <span class="s1">&#39;Then I told her, &quot;[t!i]&quot;&#39;</span>
</pre></div>
</div>
</div>
<div class="section" id="const-functions">
<h3>Const Functions<a class="headerlink" href="#const-functions" title="Permalink to this headline"> link</a></h3>
<dl class="function">
<dt id="renpy.const">
<code class="descclassname">renpy.</code><code class="descname">const</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.const" title="Permalink to this definition"> link</a></dt>
<dd><p>Declares a variable in the store to be constant.</p>
<p>A variable is constant if nothing can change its value, or any value
reached by indexing it or accessing its attributes. Variables must
remain constant out of define, init, and translate python blocks.</p>
<dl class="docutils">
<dt><cite>name</cite></dt>
<dd>A string giving the name of the variable to declare constant.</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="renpy.not_const">
<code class="descclassname">renpy.</code><code class="descname">not_const</code><span class="sig-paren">(</span><em>name</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.not_const" title="Permalink to this definition"> link</a></dt>
<dd><p>Declares a name in the store to be not constant.</p>
<p>This undoes the effect of calls to <a class="reference internal" href="#renpy.const" title="renpy.const"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.const()</span></code></a> and
<a class="reference internal" href="#renpy.pure" title="renpy.pure"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.pure()</span></code></a>.</p>
<dl class="docutils">
<dt><cite>name</cite></dt>
<dd>The name to declare not constant.</dd>
</dl>
</dd></dl>
<dl class="function">
<dt id="renpy.pure">
<code class="descclassname">renpy.</code><code class="descname">pure</code><span class="sig-paren">(</span><em>fn</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.pure" title="Permalink to this definition"> link</a></dt>
<dd><p>Declares a function as pure. A pure function must always return the
same value when it is called with the same arguments, outside of
define, init, and translate python blocks.</p>
<dl class="docutils">
<dt><cite>fn</cite></dt>
<dd>The name of the function to declare pure. This may either be a string
containing the name of the function, or the function itself.
If a string is passed and the function is inside the module,
this string should contain the module name with the dot.</dd>
</dl>
<p>Returns <cite>fn</cite>, allowing this function to be used as a decorator.</p>
</dd></dl>
</div>
</div>
<div class="section" id="profiling">
<h2>Profiling<a class="headerlink" href="#profiling" title="Permalink to this headline"> link</a></h2>
<p>Ren'Py supports profiling screen execution through the <code class="docutils literal notranslate"><span class="pre">renpy.profile_screen</span></code>
function:</p>
<dl class="function">
<dt id="renpy.profile_screen">
<code class="descclassname">renpy.</code><code class="descname">profile_screen</code><span class="sig-paren">(</span><em>name</em>, <em>predict=False</em>, <em>show=False</em>, <em>update=False</em>, <em>request=False</em>, <em>time=False</em>, <em>debug=False</em>, <em>const=False</em><span class="sig-paren">)</span><a class="headerlink" href="#renpy.profile_screen" title="Permalink to this definition"> link</a></dt>
<dd><p>Requests screen profiling for the screen named <cite>name</cite>, which
must be a string.</p>
<p>Apart from <cite>name</cite>, all arguments must be supplied as keyword
arguments. This function takes three groups of arguments.</p>
<p>The first group of arguments determines when profiling occurs.</p>
<dl class="docutils">
<dt><cite>predict</cite></dt>
<dd>If true, profiling occurs when the screen is being predicted.</dd>
<dt><cite>show</cite></dt>
<dd>If true, profiling occurs when the screen is first shown.</dd>
<dt><cite>update</cite></dt>
<dd>If true, profiling occurs when the screen is updated.</dd>
<dt><cite>request</cite></dt>
<dd>If true, profiling occurs when requested by pressing F8.</dd>
</dl>
<p>The second group of arguments controls what profiling output is
produced when profiling occurs.</p>
<dl class="docutils">
<dt><cite>time</cite></dt>
<dd>If true, Ren'Py will log the amount of time it takes to evaluate
the screen.</dd>
<dt><cite>debug</cite></dt>
<dd><p class="first">If true, Ren'Py will log information as to how screens are
evaluated, including:</p>
<ul class="simple">
<li>Which displayables Ren'Py considers constant.</li>
<li>Which arguments, if any, needed to be evaluated.</li>
<li>Which displayables were reused.</li>
</ul>
<p class="last">Producing and saving this debug information takes a noticeable
amount of time, and so the <cite>time</cite> output should not be considered
reliable if <cite>debug</cite> is set.</p>
</dd>
</dl>
<p>The last group of arguments controls what output is produced once
per Ren'Py run.</p>
<dl class="docutils">
<dt><cite>const</cite></dt>
<dd>Displays the variables in the screen that are marked as const and
not-const.</dd>
</dl>
<p>All profiling output will be logged to profile_screen.txt in the game
directory.</p>
</dd></dl>
</div>
<div class="section" id="const-names">
<span id="id2"></span><h2>Const Names<a class="headerlink" href="#const-names" title="Permalink to this headline"> link</a></h2>
<p>The following names are const by default.</p>
<ul class="simple">
<li>False</li>
<li>None</li>
<li>True</li>
<li>config</li>
<li>style</li>
</ul>
</div>
<div class="section" id="pure-names">
<span id="id3"></span><h2>Pure Names<a class="headerlink" href="#pure-names" title="Permalink to this headline"> link</a></h2>
<p>The following names are both pure and const by default.</p>
<ul class="simple">
<li>ADVCharacter</li>
<li>ADVSpeaker</li>
<li><a class="reference internal" href="screen_actions.html#AddToSet" title="AddToSet"><code class="xref py py-func docutils literal notranslate"><span class="pre">AddToSet()</span></code></a></li>
<li>Alpha</li>
<li><a class="reference internal" href="displayables.html#AlphaBlend" title="AlphaBlend"><code class="xref py py-func docutils literal notranslate"><span class="pre">AlphaBlend()</span></code></a></li>
<li><a class="reference internal" href="transitions.html#AlphaDissolve" title="AlphaDissolve"><code class="xref py py-func docutils literal notranslate"><span class="pre">AlphaDissolve()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#AlphaMask" title="AlphaMask"><code class="xref py py-func docutils literal notranslate"><span class="pre">AlphaMask()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#AnimatedValue" title="AnimatedValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">AnimatedValue()</span></code></a></li>
<li>Animation</li>
<li><a class="reference internal" href="displayables.html#At" title="At"><code class="xref py py-func docutils literal notranslate"><span class="pre">At()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#AudioPositionValue" title="AudioPositionValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">AudioPositionValue()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Call" title="Call"><code class="xref py py-func docutils literal notranslate"><span class="pre">Call()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#CaptureFocus" title="CaptureFocus"><code class="xref py py-func docutils literal notranslate"><span class="pre">CaptureFocus()</span></code></a></li>
<li><a class="reference internal" href="dialogue.html#Character" title="Character"><code class="xref py py-func docutils literal notranslate"><span class="pre">Character()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ClearFocus" title="ClearFocus"><code class="xref py py-func docutils literal notranslate"><span class="pre">ClearFocus()</span></code></a></li>
<li><a class="reference internal" href="color_class.html#Color" title="Color"><code class="xref py py-class docutils literal notranslate"><span class="pre">Color</span></code></a></li>
<li><a class="reference internal" href="transitions.html#ComposeTransition" title="ComposeTransition"><code class="xref py py-func docutils literal notranslate"><span class="pre">ComposeTransition()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#ConditionSwitch" title="ConditionSwitch"><code class="xref py py-func docutils literal notranslate"><span class="pre">ConditionSwitch()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Confirm" title="Confirm"><code class="xref py py-func docutils literal notranslate"><span class="pre">Confirm()</span></code></a></li>
<li><a class="reference internal" href="transitions.html#CropMove" title="CropMove"><code class="xref py py-func docutils literal notranslate"><span class="pre">CropMove()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#DictInputValue" title="DictInputValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">DictInputValue()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#DictValue" title="DictValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">DictValue()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#DisableAllInputValues" title="DisableAllInputValues"><code class="xref py py-func docutils literal notranslate"><span class="pre">DisableAllInputValues()</span></code></a></li>
<li><a class="reference internal" href="transitions.html#Dissolve" title="Dissolve"><code class="xref py py-func docutils literal notranslate"><span class="pre">Dissolve()</span></code></a></li>
<li><a class="reference internal" href="drag_drop.html#Drag" title="Drag"><code class="xref py py-class docutils literal notranslate"><span class="pre">Drag</span></code></a></li>
<li>DynamicCharacter</li>
<li><a class="reference internal" href="displayables.html#DynamicDisplayable" title="DynamicDisplayable"><code class="xref py py-func docutils literal notranslate"><span class="pre">DynamicDisplayable()</span></code></a></li>
<li><a class="reference internal" href="rooms.html#EndReplay" title="EndReplay"><code class="xref py py-func docutils literal notranslate"><span class="pre">EndReplay()</span></code></a></li>
<li>FactorZoom</li>
<li><a class="reference internal" href="transitions.html#Fade" title="Fade"><code class="xref py py-func docutils literal notranslate"><span class="pre">Fade()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#FieldInputValue" title="FieldInputValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">FieldInputValue()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#FieldValue" title="FieldValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">FieldValue()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#FileDelete" title="FileDelete"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileDelete()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#FilePage" title="FilePage"><code class="xref py py-func docutils literal notranslate"><span class="pre">FilePage()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#FilePageNameInputValue" title="FilePageNameInputValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">FilePageNameInputValue()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#FileTakeScreenshot" title="FileTakeScreenshot"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileTakeScreenshot()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#Fixed" title="Fixed"><code class="xref py py-func docutils literal notranslate"><span class="pre">Fixed()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#Flatten" title="Flatten"><code class="xref py py-func docutils literal notranslate"><span class="pre">Flatten()</span></code></a></li>
<li><a class="reference internal" href="text.html#FontGroup" title="FontGroup"><code class="xref py py-func docutils literal notranslate"><span class="pre">FontGroup()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#Frame" title="Frame"><code class="xref py py-func docutils literal notranslate"><span class="pre">Frame()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Function" title="Function"><code class="xref py py-func docutils literal notranslate"><span class="pre">Function()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#Grid" title="Grid"><code class="xref py py-func docutils literal notranslate"><span class="pre">Grid()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#HBox" title="HBox"><code class="xref py py-func docutils literal notranslate"><span class="pre">HBox()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Help" title="Help"><code class="xref py py-func docutils literal notranslate"><span class="pre">Help()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Hide" title="Hide"><code class="xref py py-func docutils literal notranslate"><span class="pre">Hide()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#HideInterface" title="HideInterface"><code class="xref py py-func docutils literal notranslate"><span class="pre">HideInterface()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#If" title="If"><code class="xref py py-func docutils literal notranslate"><span class="pre">If()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#Image" title="Image"><code class="xref py py-func docutils literal notranslate"><span class="pre">Image()</span></code></a></li>
<li><a class="reference internal" href="transitions.html#ImageDissolve" title="ImageDissolve"><code class="xref py py-func docutils literal notranslate"><span class="pre">ImageDissolve()</span></code></a></li>
<li>ImageReference</li>
<li><a class="reference internal" href="screen_python.html#InputValue" title="InputValue"><code class="xref py py-class docutils literal notranslate"><span class="pre">InputValue</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#InvertSelected" title="InvertSelected"><code class="xref py py-func docutils literal notranslate"><span class="pre">InvertSelected()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Jump" title="Jump"><code class="xref py py-func docutils literal notranslate"><span class="pre">Jump()</span></code></a></li>
<li><a class="reference internal" href="translation.html#Language" title="Language"><code class="xref py py-func docutils literal notranslate"><span class="pre">Language()</span></code></a></li>
<li>LiveComposite</li>
<li>LiveCrop</li>
<li>LiveTile</li>
<li><a class="reference internal" href="screen_actions.html#MainMenu" title="MainMenu"><code class="xref py py-func docutils literal notranslate"><span class="pre">MainMenu()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#MixerValue" title="MixerValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">MixerValue()</span></code></a></li>
<li>Motion</li>
<li><a class="reference internal" href="screen_actions.html#MouseMove" title="MouseMove"><code class="xref py py-func docutils literal notranslate"><span class="pre">MouseMove()</span></code></a></li>
<li>Move</li>
<li>MoveFactory</li>
<li>MoveIn</li>
<li>MoveOut</li>
<li><a class="reference internal" href="transitions.html#MoveTransition" title="MoveTransition"><code class="xref py py-func docutils literal notranslate"><span class="pre">MoveTransition()</span></code></a></li>
<li><a class="reference internal" href="movie.html#Movie" title="Movie"><code class="xref py py-func docutils literal notranslate"><span class="pre">Movie()</span></code></a></li>
<li><a class="reference internal" href="transitions.html#MultipleTransition" title="MultipleTransition"><code class="xref py py-func docutils literal notranslate"><span class="pre">MultipleTransition()</span></code></a></li>
<li>NVLCharacter</li>
<li><a class="reference internal" href="screen_actions.html#Notify" title="Notify"><code class="xref py py-func docutils literal notranslate"><span class="pre">Notify()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#Null" title="Null"><code class="xref py py-func docutils literal notranslate"><span class="pre">Null()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#NullAction" title="NullAction"><code class="xref py py-func docutils literal notranslate"><span class="pre">NullAction()</span></code></a></li>
<li>OldMoveTransition</li>
<li><a class="reference internal" href="screen_actions.html#OpenDirectory" title="OpenDirectory"><code class="xref py py-func docutils literal notranslate"><span class="pre">OpenDirectory()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#OpenURL" title="OpenURL"><code class="xref py py-func docutils literal notranslate"><span class="pre">OpenURL()</span></code></a></li>
<li>Pan</li>
<li><a class="reference internal" href="text.html#ParameterizedText" title="ParameterizedText"><code class="xref py py-func docutils literal notranslate"><span class="pre">ParameterizedText()</span></code></a></li>
<li>Particles</li>
<li><a class="reference internal" href="transitions.html#Pause" title="Pause"><code class="xref py py-func docutils literal notranslate"><span class="pre">Pause()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#PauseAudio" title="PauseAudio"><code class="xref py py-func docutils literal notranslate"><span class="pre">PauseAudio()</span></code></a></li>
<li><a class="reference internal" href="transitions.html#Pixellate" title="Pixellate"><code class="xref py py-func docutils literal notranslate"><span class="pre">Pixellate()</span></code></a></li>
<li>Play</li>
<li><a class="reference internal" href="voice.html#PlayCharacterVoice" title="PlayCharacterVoice"><code class="xref py py-func docutils literal notranslate"><span class="pre">PlayCharacterVoice()</span></code></a></li>
<li>Position</li>
<li><a class="reference internal" href="screen_actions.html#Preference" title="Preference"><code class="xref py py-func docutils literal notranslate"><span class="pre">Preference()</span></code></a></li>
<li><a class="reference internal" href="transitions.html#PushMove" title="PushMove"><code class="xref py py-func docutils literal notranslate"><span class="pre">PushMove()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Queue" title="Queue"><code class="xref py py-func docutils literal notranslate"><span class="pre">Queue()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#QueueEvent" title="QueueEvent"><code class="xref py py-func docutils literal notranslate"><span class="pre">QueueEvent()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#QuickLoad" title="QuickLoad"><code class="xref py py-func docutils literal notranslate"><span class="pre">QuickLoad()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#QuickSave" title="QuickSave"><code class="xref py py-func docutils literal notranslate"><span class="pre">QuickSave()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Quit" title="Quit"><code class="xref py py-func docutils literal notranslate"><span class="pre">Quit()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#RemoveFromSet" title="RemoveFromSet"><code class="xref py py-func docutils literal notranslate"><span class="pre">RemoveFromSet()</span></code></a></li>
<li><a class="reference internal" href="rooms.html#Replay" title="Replay"><code class="xref py py-func docutils literal notranslate"><span class="pre">Replay()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#RestartStatement" title="RestartStatement"><code class="xref py py-func docutils literal notranslate"><span class="pre">RestartStatement()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Return" title="Return"><code class="xref py py-func docutils literal notranslate"><span class="pre">Return()</span></code></a></li>
<li>Revolve</li>
<li>RevolveInOut</li>
<li><a class="reference internal" href="screen_actions.html#RollForward" title="RollForward"><code class="xref py py-func docutils literal notranslate"><span class="pre">RollForward()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Rollback" title="Rollback"><code class="xref py py-func docutils literal notranslate"><span class="pre">Rollback()</span></code></a></li>
<li>RotoZoom</li>
<li><a class="reference internal" href="screen_actions.html#ScreenVariableValue" title="ScreenVariableValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">ScreenVariableValue()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Screenshot" title="Screenshot"><code class="xref py py-func docutils literal notranslate"><span class="pre">Screenshot()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Scroll" title="Scroll"><code class="xref py py-func docutils literal notranslate"><span class="pre">Scroll()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#SelectedIf" title="SelectedIf"><code class="xref py py-func docutils literal notranslate"><span class="pre">SelectedIf()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#SensitiveIf" title="SensitiveIf"><code class="xref py py-func docutils literal notranslate"><span class="pre">SensitiveIf()</span></code></a></li>
<li><a class="reference internal" href="voice.html#SetCharacterVolume" title="SetCharacterVolume"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetCharacterVolume()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#SetDict" title="SetDict"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetDict()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#SetField" title="SetField"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetField()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#SetMixer" title="SetMixer"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetMixer()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#SetMute" title="SetMute"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetMute()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#SetScreenVariable" title="SetScreenVariable"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetScreenVariable()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#SetVariable" title="SetVariable"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetVariable()</span></code></a></li>
<li><a class="reference internal" href="voice.html#SetVoiceMute" title="SetVoiceMute"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetVoiceMute()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#Show" title="Show"><code class="xref py py-func docutils literal notranslate"><span class="pre">Show()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ShowMenu" title="ShowMenu"><code class="xref py py-func docutils literal notranslate"><span class="pre">ShowMenu()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ShowTransient" title="ShowTransient"><code class="xref py py-func docutils literal notranslate"><span class="pre">ShowTransient()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#ShowingSwitch" title="ShowingSwitch"><code class="xref py py-func docutils literal notranslate"><span class="pre">ShowingSwitch()</span></code></a></li>
<li>SizeZoom</li>
<li><a class="reference internal" href="screen_actions.html#Skip" title="Skip"><code class="xref py py-func docutils literal notranslate"><span class="pre">Skip()</span></code></a></li>
<li><a class="reference internal" href="sprites.html#SnowBlossom" title="SnowBlossom"><code class="xref py py-func docutils literal notranslate"><span class="pre">SnowBlossom()</span></code></a></li>
<li><a class="reference internal" href="displayables.html#Solid" title="Solid"><code class="xref py py-func docutils literal notranslate"><span class="pre">Solid()</span></code></a></li>
<li>Speaker</li>
<li><a class="reference internal" href="screen_actions.html#Start" title="Start"><code class="xref py py-func docutils literal notranslate"><span class="pre">Start()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#StaticValue" title="StaticValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">StaticValue()</span></code></a></li>
<li>Stop</li>
<li><a class="reference internal" href="style.html#StylePreference" title="StylePreference"><code class="xref py py-func docutils literal notranslate"><span class="pre">StylePreference()</span></code></a></li>
<li>SubTransition</li>
<li><a class="reference internal" href="transitions.html#Swing" title="Swing"><code class="xref py py-func docutils literal notranslate"><span class="pre">Swing()</span></code></a></li>
<li><a class="reference internal" href="text.html#Text" title="Text"><code class="xref py py-func docutils literal notranslate"><span class="pre">Text()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ToggleDict" title="ToggleDict"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleDict()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ToggleField" title="ToggleField"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleField()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ToggleFocus" title="ToggleFocus"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleFocus()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ToggleMute" title="ToggleMute"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleMute()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ToggleScreen" title="ToggleScreen"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleScreen()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ToggleScreenVariable" title="ToggleScreenVariable"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleScreenVariable()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ToggleSetMembership" title="ToggleSetMembership"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleSetMembership()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#ToggleVariable" title="ToggleVariable"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleVariable()</span></code></a></li>
<li><a class="reference internal" href="voice.html#ToggleVoiceMute" title="ToggleVoiceMute"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleVoiceMute()</span></code></a></li>
<li><a class="reference internal" href="trans_trans_python.html#Transform" title="Transform"><code class="xref py py-class docutils literal notranslate"><span class="pre">Transform</span></code></a></li>
<li><a class="reference internal" href="displayables.html#VBox" title="VBox"><code class="xref py py-func docutils literal notranslate"><span class="pre">VBox()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#VariableInputValue" title="VariableInputValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">VariableInputValue()</span></code></a></li>
<li><a class="reference internal" href="screen_actions.html#VariableValue" title="VariableValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">VariableValue()</span></code></a></li>
<li>Viewport</li>
<li><a class="reference internal" href="voice.html#VoiceReplay" title="VoiceReplay"><code class="xref py py-func docutils literal notranslate"><span class="pre">VoiceReplay()</span></code></a></li>
<li>Window</li>
<li>Zoom</li>
<li>ZoomInOut</li>
<li><a class="reference internal" href="translation.html#_" title="_"><code class="xref py py-func docutils literal notranslate"><span class="pre">_()</span></code></a></li>
<li>_DisplayReset</li>
<li>_InputValueAction</li>
<li>_TouchKeyboardBackspace</li>
<li>_TouchKeyboardReturn</li>
<li>_TouchKeyboardTextInput</li>
<li>__renpy__dict__</li>
<li>__renpy__list__</li>
<li>__renpy__set__</li>
<li>_m1_00gallery__GalleryAction</li>
<li>_m1_00gallery__GalleryToggleSlideshow</li>
<li>_m1_00musicroom__MusicRoomPlay</li>
<li>_m1_00musicroom__MusicRoomRandomPlay</li>
<li>_m1_00musicroom__MusicRoomStop</li>
<li>_m1_00musicroom__MusicRoomTogglePause</li>
<li>_m1_00musicroom__MusicRoomTogglePlay</li>
<li>_m1_00preferences__DisplayAction</li>
<li>_movebottom</li>
<li>_moveleft</li>
<li>_moveright</li>
<li>_movetop</li>
<li>_notify_transform</li>
<li><a class="reference internal" href="translation.html#_p" title="_p"><code class="xref py py-func docutils literal notranslate"><span class="pre">_p()</span></code></a></li>
<li>_touch_keyboard</li>
<li>abs</li>
<li>absolute</li>
<li>all</li>
<li>any</li>
<li>apply</li>
<li>bin</li>
<li><a class="reference internal" href="transitions.html#var-blinds"><code class="xref std std-var docutils literal notranslate"><span class="pre">blinds</span></code></a></li>
<li>bool</li>
<li>bytes</li>
<li>callable</li>
<li>chr</li>
<li>cmp</li>
<li>color</li>
<li>dict</li>
<li><a class="reference internal" href="transitions.html#var-dissolve"><code class="xref std std-var docutils literal notranslate"><span class="pre">dissolve</span></code></a></li>
<li>divmod</li>
<li><a class="reference internal" href="transitions.html#var-fade"><code class="xref std std-var docutils literal notranslate"><span class="pre">fade</span></code></a></li>
<li>filter</li>
<li>float</li>
<li>frozenset</li>
<li>getattr</li>
<li>globals</li>
<li><a class="reference internal" href="gui_advanced.html#gui.SetPreference" title="gui.SetPreference"><code class="xref py py-func docutils literal notranslate"><span class="pre">gui.SetPreference()</span></code></a></li>
<li><a class="reference internal" href="gui_advanced.html#gui.TogglePreference" title="gui.TogglePreference"><code class="xref py py-func docutils literal notranslate"><span class="pre">gui.TogglePreference()</span></code></a></li>
<li><a class="reference internal" href="gui_advanced.html#gui.preference" title="gui.preference"><code class="xref py py-func docutils literal notranslate"><span class="pre">gui.preference()</span></code></a></li>
<li>hasattr</li>
<li>hash</li>
<li>hex</li>
<li><a class="reference internal" href="transitions.html#var-hpunch"><code class="xref std std-var docutils literal notranslate"><span class="pre">hpunch</span></code></a></li>
<li>int</li>
<li><a class="reference internal" href="transitions.html#var-irisin"><code class="xref std std-var docutils literal notranslate"><span class="pre">irisin</span></code></a></li>
<li>irisout</li>
<li>isinstance</li>
<li>len</li>
<li>list</li>
<li>long</li>
<li>map</li>
<li>max</li>
<li>min</li>
<li>oct</li>
<li>ord</li>
<li><a class="reference internal" href="transitions.html#var-pixellate"><code class="xref std std-var docutils literal notranslate"><span class="pre">pixellate</span></code></a></li>
<li>pow</li>
<li>pushdown</li>
<li>pushleft</li>
<li><a class="reference internal" href="transitions.html#var-pushright"><code class="xref std std-var docutils literal notranslate"><span class="pre">pushright</span></code></a></li>
<li>pushup</li>
<li>range</li>
<li>reduce</li>
<li>renpy.Keymap</li>
<li>renpy.ParameterizedText</li>
<li><a class="reference internal" href="cds.html#renpy.check_text_tags" title="renpy.check_text_tags"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.check_text_tags()</span></code></a></li>
<li>renpy.curried_call_in_new_context</li>
<li>renpy.curried_invoke_in_new_context</li>
<li>renpy.curry</li>
<li>renpy.easy_displayable</li>
<li><a class="reference internal" href="file_python.html#renpy.exists" title="renpy.exists"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.exists()</span></code></a></li>
<li><a class="reference internal" href="text.html#renpy.filter_text_tags" title="renpy.filter_text_tags"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.filter_text_tags()</span></code></a></li>
<li><a class="reference internal" href="file_python.html#renpy.fsdecode" title="renpy.fsdecode"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.fsdecode()</span></code></a></li>
<li><a class="reference internal" href="file_python.html#renpy.fsencode" title="renpy.fsencode"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.fsencode()</span></code></a></li>
<li><a class="reference internal" href="label.html#renpy.get_all_labels" title="renpy.get_all_labels"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_all_labels()</span></code></a></li>
<li><a class="reference internal" href="label.html#renpy.has_label" title="renpy.has_label"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.has_label()</span></code></a></li>
<li>renpy.has_screen</li>
<li>renpy.image_exists</li>
<li><a class="reference internal" href="translation.html#renpy.known_languages" title="renpy.known_languages"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.known_languages()</span></code></a></li>
<li><a class="reference internal" href="other.html#var-renpy.license"><code class="xref std std-var docutils literal notranslate"><span class="pre">renpy.license</span></code></a></li>
<li><a class="reference internal" href="file_python.html#renpy.list_files" title="renpy.list_files"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.list_files()</span></code></a></li>
<li><a class="reference internal" href="file_python.html#renpy.loadable" title="renpy.loadable"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.loadable()</span></code></a></li>
<li>renpy.munged_filename</li>
<li>renpy.partial</li>
<li>renpy.unelide_filename</li>
<li><a class="reference internal" href="screen_python.html#renpy.variant" title="renpy.variant"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.variant()</span></code></a></li>
<li><a class="reference internal" href="other.html#renpy.version" title="renpy.version"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.version()</span></code></a></li>
<li><a class="reference internal" href="other.html#var-renpy.version_name"><code class="xref std std-var docutils literal notranslate"><span class="pre">renpy.version_name</span></code></a></li>
<li><a class="reference internal" href="other.html#var-renpy.version_only"><code class="xref std std-var docutils literal notranslate"><span class="pre">renpy.version_only</span></code></a></li>
<li><a class="reference internal" href="other.html#var-renpy.version_string"><code class="xref std std-var docutils literal notranslate"><span class="pre">renpy.version_string</span></code></a></li>
<li><a class="reference internal" href="other.html#var-renpy.version_tuple"><code class="xref std std-var docutils literal notranslate"><span class="pre">renpy.version_tuple</span></code></a></li>
<li>repr</li>
<li>round</li>
<li>set</li>
<li>slideawaydown</li>
<li><a class="reference internal" href="transitions.html#var-slideawayleft"><code class="xref std std-var docutils literal notranslate"><span class="pre">slideawayleft</span></code></a></li>
<li>slideawayright</li>
<li>slideawayup</li>
<li>slidedown</li>
<li><a class="reference internal" href="transitions.html#var-slideleft"><code class="xref std std-var docutils literal notranslate"><span class="pre">slideleft</span></code></a></li>
<li>slideright</li>
<li>slideup</li>
<li>sorted</li>
<li><a class="reference internal" href="transitions.html#var-squares"><code class="xref std std-var docutils literal notranslate"><span class="pre">squares</span></code></a></li>
<li>str</li>
<li>sum</li>
<li>tuple</li>
<li>ui.callsinnewcontext</li>
<li>ui.gamemenus</li>
<li>ui.invokesinnewcontext</li>
<li>ui.jumps</li>
<li>ui.jumpsoutofcontext</li>
<li>ui.returns</li>
<li>unichr</li>
<li>unicode</li>
<li><a class="reference internal" href="updater.html#updater.Update" title="updater.Update"><code class="xref py py-func docutils literal notranslate"><span class="pre">updater.Update()</span></code></a></li>
<li>vars</li>
<li><a class="reference internal" href="transitions.html#var-vpunch"><code class="xref std std-var docutils literal notranslate"><span class="pre">vpunch</span></code></a></li>
<li>wipedown</li>
<li><a class="reference internal" href="transitions.html#var-wipeleft"><code class="xref std std-var docutils literal notranslate"><span class="pre">wipeleft</span></code></a></li>
<li>wiperight</li>
<li>wipeup</li>
<li>zip</li>
<li><a class="reference internal" href="transitions.html#var-zoomin"><code class="xref std std-var docutils literal notranslate"><span class="pre">zoomin</span></code></a></li>
<li><a class="reference internal" href="transitions.html#var-zoominout"><code class="xref std std-var docutils literal notranslate"><span class="pre">zoominout</span></code></a></li>
<li><a class="reference internal" href="transitions.html#var-zoomout"><code class="xref std std-var docutils literal notranslate"><span class="pre">zoomout</span></code></a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="pull-right">
<a href="#">Back to top</a>
</p>
<p>
&copy; Copyright 2012-2022, Tom Rothamel.<br/>
Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.8.6.<br/>
</p>
</div>
</footer>
</body>
</html>