843 lines
68 KiB
HTML
843 lines
68 KiB
HTML
<!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 — Ren'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'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 & 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 "Force Recompile" 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">"[i]"</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">"[i]"</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">"Happy"</span> <span class="na">action</span> <span class="n">SetVariable</span><span class="p">(</span><span class="s2">"mood"</span><span class="p">,</span> <span class="s2">"happy"</span><span class="p">)</span>
|
||
<span class="k">textbutton</span> <span class="s2">"Sad"</span> <span class="na">action</span> <span class="n">SetVariable</span><span class="p">(</span><span class="s2">"mood"</span><span class="p">,</span> <span class="s2">"sad"</span><span class="p">)</span>
|
||
<span class="k">textbutton</span> <span class="s2">"Angry"</span> <span class="na">action</span> <span class="n">SetVariable</span><span class="p">(</span><span class="s2">"mood"</span><span class="p">,</span> <span class="s2">"angry"</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">"Hello, world."</span>
|
||
<span class="k">text</span> <span class="s2">"[t]"</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">"Hello, world."</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">"Hello, world."</span>
|
||
<span class="k">text</span> <span class="s2">"</span><span class="si">%s</span><span class="s2">"</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">"Your score is: [score]"</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">"Jane"</span>
|
||
<span class="k">$</span> <span class="n">t</span> <span class="o">=</span> <span class="s2">"Hello, [who]!"</span>
|
||
<span class="k">text</span> <span class="s1">'Then I told her, "[t!i]"'</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>
|
||
© 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> |