renpy/doc/changelog6.html

3917 lines
296 KiB
HTML
Raw Normal View History

2023-01-18 22:13:55 +00:00
<!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>Changelog (Ren&#39;Py 6.11 - 6.99) &#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="Incompatible Changes" href="incompatible.html" />
<link rel="prev" title="Changelog (Ren&#39;Py 7.x-)" href="changelog.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>
<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"><a class="reference internal" href="screen_optimization.html">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 class="current">
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Changelog (Ren'Py 7.x-)</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">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="#">Changelog (Ren'Py 6.11 - 6.99)</a><ul>
<li><a class="reference internal" href="#renpy-6-99-14-3">6.99.14.3</a><ul>
<li><a class="reference internal" href="#changes">Changes</a></li>
<li><a class="reference internal" href="#fixes">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-6-99-14-2">6.99.14.2</a><ul>
<li><a class="reference internal" href="#features-and-changes">Features and Changes</a></li>
<li><a class="reference internal" href="#self-voicing">Self-Voicing</a></li>
<li><a class="reference internal" href="#id3">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-6-99-14-1">6.99.14.1</a><ul>
<li><a class="reference internal" href="#image-prediction-and-caching">Image Prediction and Caching</a></li>
<li><a class="reference internal" href="#other-improvements">Other Improvements</a></li>
<li><a class="reference internal" href="#other-fixes">Other Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-14">Ren'Py 6.99.14</a><ul>
<li><a class="reference internal" href="#performance">Performance</a></li>
<li><a class="reference internal" href="#multiple-character-dialogue">Multiple Character Dialogue</a></li>
<li><a class="reference internal" href="#gui-preferences">GUI Preferences</a></li>
<li><a class="reference internal" href="#tooltips">Tooltips</a></li>
<li><a class="reference internal" href="#id5">Changes</a></li>
<li><a class="reference internal" href="#id6">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-13">Ren'Py 6.99.13</a><ul>
<li><a class="reference internal" href="#tutorial-and-the-question">Tutorial and The Question</a></li>
<li><a class="reference internal" href="#interactive-director">Interactive Director</a></li>
<li><a class="reference internal" href="#new-gui">New GUI</a></li>
<li><a class="reference internal" href="#raspberry-pi">Raspberry Pi</a></li>
<li><a class="reference internal" href="#hyperlinks">Hyperlinks</a></li>
<li><a class="reference internal" href="#say-with-arguments">Say with Arguments</a></li>
<li><a class="reference internal" href="#translations">Translations</a></li>
<li><a class="reference internal" href="#other">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-12-4">Ren'Py 6.99.12.4</a><ul>
<li><a class="reference internal" href="#console">Console</a></li>
<li><a class="reference internal" href="#id7">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-12-3">Ren'Py 6.99.12.3</a><ul>
<li><a class="reference internal" href="#gui">GUI</a></li>
<li><a class="reference internal" href="#id8">Translations</a></li>
<li><a class="reference internal" href="#id9">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-12">Ren'Py 6.99.12</a><ul>
<li><a class="reference internal" href="#macintosh-support">Macintosh Support</a></li>
<li><a class="reference internal" href="#translation-changes">Translation Changes</a></li>
<li><a class="reference internal" href="#python-changes">Python Changes</a></li>
<li><a class="reference internal" href="#other-changes-and-fixes">Other Changes and Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-11">Ren'Py 6.99.11</a><ul>
<li><a class="reference internal" href="#new-in-game-gui">New In-Game GUI</a></li>
<li><a class="reference internal" href="#improved-platform-support">Improved Platform Support</a></li>
<li><a class="reference internal" href="#style-prefix-support">Style Prefix Support</a></li>
<li><a class="reference internal" href="#style-properties">Style Properties</a></li>
<li><a class="reference internal" href="#translate-and-style-statement-order-changes">Translate and Style Statement Order Changes</a></li>
<li><a class="reference internal" href="#local-labels">Local Labels</a></li>
<li><a class="reference internal" href="#transforms">Transforms</a></li>
<li><a class="reference internal" href="#id10">Translations</a></li>
<li><a class="reference internal" href="#id11">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-10">Ren'Py 6.99.10</a><ul>
<li><a class="reference internal" href="#id12">Fixes</a></li>
<li><a class="reference internal" href="#translation">Translation</a></li>
<li><a class="reference internal" href="#other-changes">Other Changes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-9">Ren'Py 6.99.9</a><ul>
<li><a class="reference internal" href="#bug-fixes">Bug Fixes</a></li>
<li><a class="reference internal" href="#id13">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-8">Ren'Py 6.99.8</a><ul>
<li><a class="reference internal" href="#tags-layers-and-transforms">Tags, Layers, and Transforms</a></li>
<li><a class="reference internal" href="#easing-functions">Easing Functions</a></li>
<li><a class="reference internal" href="#side-images">Side Images</a></li>
<li><a class="reference internal" href="#pushmove-transitions">PushMove Transitions</a></li>
<li><a class="reference internal" href="#id14">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-7">Ren'Py 6.99.7</a><ul>
<li><a class="reference internal" href="#dynamic-images">Dynamic Images</a></li>
<li><a class="reference internal" href="#define-improvements">Define Improvements</a></li>
<li><a class="reference internal" href="#android-ios">Android/iOS</a></li>
<li><a class="reference internal" href="#id15">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-6">Ren'Py 6.99.6</a><ul>
<li><a class="reference internal" href="#highdpi-retina">HighDPI/Retina</a></li>
<li><a class="reference internal" href="#gamepad">Gamepad</a></li>
<li><a class="reference internal" href="#backups">Backups</a></li>
<li><a class="reference internal" href="#id16">Other Improvements</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-5">Ren'Py 6.99.5</a><ul>
<li><a class="reference internal" href="#startup">Startup</a></li>
<li><a class="reference internal" href="#ios">iOS</a></li>
<li><a class="reference internal" href="#id17">Other Improvements</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-4">Ren'Py 6.99.4</a><ul>
<li><a class="reference internal" href="#id18">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-99-3">Ren'Py 6.99.3</a></li>
<li><a class="reference internal" href="#ren-py-6-99-2">Ren'Py 6.99.2</a></li>
<li><a class="reference internal" href="#ren-py-6-99-1">Ren'Py 6.99.1</a></li>
<li><a class="reference internal" href="#ren-py-6-99">Ren'Py 6.99</a><ul>
<li><a class="reference internal" href="#sdl2">SDL2</a></li>
<li><a class="reference internal" href="#ios-support">iOS Support</a></li>
<li><a class="reference internal" href="#android-support">Android Support</a></li>
<li><a class="reference internal" href="#steam">Steam</a></li>
<li><a class="reference internal" href="#distribution-improvements">Distribution Improvements</a></li>
<li><a class="reference internal" href="#languages-and-translations">Languages and Translations</a></li>
<li><a class="reference internal" href="#clipboard-voicing">Clipboard Voicing</a></li>
<li><a class="reference internal" href="#custom-text-tags">Custom Text Tags</a></li>
<li><a class="reference internal" href="#id19">Other Improvements</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-18-3">Ren'Py 6.18.3</a><ul>
<li><a class="reference internal" href="#id20">Bug Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-18-2">Ren'Py 6.18.2</a></li>
<li><a class="reference internal" href="#ren-py-6-18-1">Ren'Py 6.18.1</a></li>
<li><a class="reference internal" href="#ren-py-6-18">Ren'Py 6.18</a><ul>
<li><a class="reference internal" href="#screen-language-improvements">Screen Language Improvements</a></li>
<li><a class="reference internal" href="#image-prediction">Image Prediction</a></li>
<li><a class="reference internal" href="#accessibility">Accessibility</a></li>
<li><a class="reference internal" href="#android-in-app-purchasing">Android In-App Purchasing</a></li>
<li><a class="reference internal" href="#pixel-art">Pixel Art</a></li>
<li><a class="reference internal" href="#voice-improvements">Voice Improvements</a></li>
<li><a class="reference internal" href="#os-x-bug-workaround">OS X Bug Workaround</a></li>
<li><a class="reference internal" href="#id21">Other</a></li>
<li><a class="reference internal" href="#id22">Translations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-17-7">Ren'Py 6.17.7</a></li>
<li><a class="reference internal" href="#ren-py-6-17-6">Ren'Py 6.17.6</a></li>
<li><a class="reference internal" href="#ren-py-6-17-5">Ren'Py 6.17.5</a><ul>
<li><a class="reference internal" href="#id23">Translations</a></li>
<li><a class="reference internal" href="#id24">Changes</a></li>
<li><a class="reference internal" href="#id25">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-17-4">Ren'Py 6.17.4</a><ul>
<li><a class="reference internal" href="#reloading">Reloading</a></li>
<li><a class="reference internal" href="#android">Android</a></li>
<li><a class="reference internal" href="#id26">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-17">Ren'Py 6.17</a><ul>
<li><a class="reference internal" href="#styles">Styles</a></li>
<li><a class="reference internal" href="#syntax-changes">Syntax Changes</a></li>
<li><a class="reference internal" href="#id27">Translations</a></li>
<li><a class="reference internal" href="#id28">Android</a></li>
<li><a class="reference internal" href="#new-and-changed-preferences">New and Changed Preferences</a></li>
<li><a class="reference internal" href="#id29">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-16-2">Ren'Py 6.16.2</a></li>
<li><a class="reference internal" href="#ren-py-6-16">Ren'Py 6.16</a><ul>
<li><a class="reference internal" href="#id30">Android</a></li>
<li><a class="reference internal" href="#save-load-and-persistent-improvements">Save, Load, and Persistent Improvements</a></li>
<li><a class="reference internal" href="#voice">Voice</a></li>
<li><a class="reference internal" href="#image-gallery-and-music-room">Image Gallery and Music Room</a></li>
<li><a class="reference internal" href="#text-rendering">Text Rendering</a></li>
<li><a class="reference internal" href="#japanese-language">Japanese Language</a></li>
<li><a class="reference internal" href="#documentation">Documentation</a></li>
<li><a class="reference internal" href="#id31">Other</a></li>
<li><a class="reference internal" href="#bugfixes">Bugfixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-15-6">Ren'Py 6.15.6</a></li>
<li><a class="reference internal" href="#ren-py-6-15-5">Ren'Py 6.15.5</a><ul>
<li><a class="reference internal" href="#ren-py-6-15-4">Ren'Py 6.15.4</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-15">Ren'Py 6.15</a><ul>
<li><a class="reference internal" href="#translation-framework">Translation Framework</a></li>
<li><a class="reference internal" href="#improved-japanese-support">Improved Japanese Support</a></li>
<li><a class="reference internal" href="#id32">Console</a></li>
<li><a class="reference internal" href="#screen-parameters">Screen Parameters</a></li>
<li><a class="reference internal" href="#replay-gallery">Replay Gallery</a></li>
<li><a class="reference internal" href="#id33">Voice Improvements</a></li>
<li><a class="reference internal" href="#launcher-improvements">Launcher Improvements</a></li>
<li><a class="reference internal" href="#macintosh-changes">Macintosh Changes</a></li>
<li><a class="reference internal" href="#packaging-improvements">Packaging Improvements</a></li>
<li><a class="reference internal" href="#id34">Other Changes</a></li>
<li><a class="reference internal" href="#id35">Bugfixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-14">Ren'Py 6.14</a><ul>
<li><a class="reference internal" href="#ren-py-launcher-rewrite">Ren'Py Launcher Rewrite</a></li>
<li><a class="reference internal" href="#editra-text-editing">Editra &amp; Text Editing</a></li>
<li><a class="reference internal" href="#ren-py-web-updater">Ren'Py Web Updater</a></li>
<li><a class="reference internal" href="#transform-changes">Transform Changes</a></li>
<li><a class="reference internal" href="#screen-language-displayable-and-transition-enhancements">Screen Language, Displayable, and Transition Enhancements</a></li>
<li><a class="reference internal" href="#rollback-improvements">Rollback Improvements</a></li>
<li><a class="reference internal" href="#video-improvements">Video Improvements</a></li>
<li><a class="reference internal" href="#image-load-log">Image Load Log</a></li>
<li><a class="reference internal" href="#file-actions-and-functions">File Actions and Functions</a></li>
<li><a class="reference internal" href="#multiple-store-support">Multiple Store Support</a></li>
<li><a class="reference internal" href="#platform-support-and-library-updates">Platform Support and Library Updates</a></li>
<li><a class="reference internal" href="#id36">Other Changes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-13-9">Ren'Py 6.13.9</a></li>
<li><a class="reference internal" href="#ren-py-6-13-8">Ren'Py 6.13.8</a></li>
<li><a class="reference internal" href="#ren-py-6-13">Ren'Py 6.13</a><ul>
<li><a class="reference internal" href="#text-rewrite">Text Rewrite</a></li>
<li><a class="reference internal" href="#directx-support">DirectX Support</a></li>
<li><a class="reference internal" href="#id37">Other Changes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-12-2">Ren'Py 6.12.2</a></li>
<li><a class="reference internal" href="#ren-py-6-12-1">Ren'Py 6.12.1</a><ul>
<li><a class="reference internal" href="#image-attributes">Image Attributes</a></li>
<li><a class="reference internal" href="#error-handling">Error Handling</a></li>
<li><a class="reference internal" href="#id38">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-12-0">Ren'Py 6.12.0</a><ul>
<li><a class="reference internal" href="#id39">Android Support</a></li>
<li><a class="reference internal" href="#new-widgets-and-displayables">New Widgets and Displayables</a></li>
<li><a class="reference internal" href="#id40">Image Prediction</a></li>
<li><a class="reference internal" href="#screens">Screens</a></li>
<li><a class="reference internal" href="#id41">Other Improvements</a></li>
<li><a class="reference internal" href="#id42">Bug Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-11-2">Ren'Py 6.11.2</a><ul>
<li><a class="reference internal" href="#new-features">New Features</a></li>
<li><a class="reference internal" href="#software-update">Software Update</a></li>
<li><a class="reference internal" href="#behavior-changes">Behavior Changes</a></li>
<li><a class="reference internal" href="#id43">Bug fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-11-1">Ren'Py 6.11.1</a><ul>
<li><a class="reference internal" href="#id44">New Features</a></li>
<li><a class="reference internal" href="#id45">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#ren-py-6-11-0">Ren'Py 6.11.0</a><ul>
<li><a class="reference internal" href="#opengl-support">OpenGL Support</a></li>
<li><a class="reference internal" href="#screens-and-screen-language">Screens and Screen Language</a></li>
<li><a class="reference internal" href="#id46">Transform Changes</a></li>
<li><a class="reference internal" href="#id47">Other Changes</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
<div class="col-md-9 content">
<div class="section" id="changelog-ren-py-6-11-6-99">
<span id="changelog-6"></span><h1>Changelog (Ren'Py 6.11 - 6.99)<a class="headerlink" href="#changelog-ren-py-6-11-6-99" title="Permalink to this headline"> link</a></h1>
<div class="section" id="renpy-6-99-14-3">
<span id="id1"></span><h2>6.99.14.3<a class="headerlink" href="#renpy-6-99-14-3" title="Permalink to this headline"> link</a></h2>
<div class="section" id="changes">
<h3>Changes<a class="headerlink" href="#changes" title="Permalink to this headline"> link</a></h3>
<p>The <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> displayable now places its mask inside the child
displayable, in the same way that AlphaDissolve always has. This allows
the mask to be created using ATL or other transforms.</p>
<p>Several obsolete image manipulators have been deprecated, and removed from
the documentation. These are image manipulators that have been completely
replaced by <a class="reference internal" href="trans_trans_python.html#Transform" title="Transform"><code class="xref py py-func docutils literal notranslate"><span class="pre">Transform()</span></code></a>.</p>
<p>Several functions have been renamed, to remove a pointless Live prefix.</p>
<ul class="simple">
<li>LiveComposite is now <a class="reference internal" href="displayables.html#Composite" title="Composite"><code class="xref py py-func docutils literal notranslate"><span class="pre">Composite()</span></code></a></li>
<li>LiveCrop is now <a class="reference internal" href="displayables.html#Crop" title="Crop"><code class="xref py py-func docutils literal notranslate"><span class="pre">Crop()</span></code></a></li>
<li>LiveTile is now <a class="reference internal" href="displayables.html#Tile" title="Tile"><code class="xref py py-func docutils literal notranslate"><span class="pre">Tile()</span></code></a></li>
</ul>
<p>The old names have been retained as compatibility alias.</p>
</div>
<div class="section" id="fixes">
<h3>Fixes<a class="headerlink" href="#fixes" title="Permalink to this headline"> link</a></h3>
<p>This release fixes an issue where children of for statements in screens would
not get their data propagated through screen update cycles. This manifested
in complicated ways, such as transitions repeating and slow text refusing
to work.</p>
<p>This release displays the newest save slot in the selected color, as
intended. This applies to newly created games, older projects can update
by adding to the bottom of gui.rpy:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">define</span> <span class="n">gui</span><span class="o">.</span><span class="n">slot_button_text_selected_idle_color</span> <span class="o">=</span> <span class="n">gui</span><span class="o">.</span><span class="na">selected_color</span>
<span class="k">define</span> <span class="n">gui</span><span class="o">.</span><span class="n">slot_button_text_selected_hover_color</span> <span class="o">=</span> <span class="n">gui</span><span class="o">.</span><span class="na">hover_color</span>
</pre></div>
</div>
<p>A problem introduced in 6.99.14.2 with the the default statement
not working after a rollback has been fixed. This should only ever
have affected games that were updated after a save was first
created.</p>
</div>
</div>
<div class="section" id="renpy-6-99-14-2">
<span id="id2"></span><h2>6.99.14.2<a class="headerlink" href="#renpy-6-99-14-2" title="Permalink to this headline"> link</a></h2>
<div class="section" id="features-and-changes">
<h3>Features and Changes<a class="headerlink" href="#features-and-changes" title="Permalink to this headline"> link</a></h3>
<p>The Atom text editor is now supported in Ren'Py. When it is selected, Ren'Py
will download Atom, and will create a new profile with the language-renpy,
renpy-dark-syntax, and renpy-light-syntax Atom plugins installed, along with
a few default setting to make Ren'Py programming easier.</p>
<p>It is now possible to supply a baseline to image-based fonts.</p>
<p>When a screen in the default gui scrolls, the pageup and pagedown keys will
now work to scroll it. (This only works with newly-created projects.)</p>
<p>The <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> displayable now takes a play_callback argument, which
specifies a function that is called to play a movie. This function can
do things like queue up a transition movie before queuing the usual loop,
making for smooth transitions.</p>
<p>The new <a class="reference internal" href="displaying_images.html#renpy.get_say_image_tag" title="renpy.get_say_image_tag"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_say_image_tag()</span></code></a> function makes it possible to
retrieve the name of the speaking character.</p>
<p>ATL interpolation can now interpolate from a transform with multiple
lines in it, provided none of the lines takes time to complete.</p>
<p>Adding the from statement to a call no longer changes the translation
identifier. (Which is also used by the automatic voice code.) Since this
would be a breaking change, Ren'Py also computes the old-style translation
identifier and uses that if it exists.</p>
<p>The _choose_attributes method is called when only a single displayable can
be located. This supports the AttributeImage beta (<a class="reference external" href="https://github.com/renpy/ai">https://github.com/renpy/ai</a>).</p>
<p>The new <a class="reference internal" href="gui.html#var-gui.button_image_extension"><code class="xref std std-var docutils literal notranslate"><span class="pre">gui.button_image_extension</span></code></a> variable allows button images to be
.webps without changing Ren'Py itself.</p>
</div>
<div class="section" id="self-voicing">
<h3>Self-Voicing<a class="headerlink" href="#self-voicing" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py's self-voicing mode, which provides accessibility for blind
users, has been improved:</p>
<ul class="simple">
<li>Selected buttons say the word &quot;selected&quot; after them.</li>
<li>Bars say the world &quot;bar&quot; after them.</li>
<li>Some actions have had their self-voicing information changed to better
reflect how the action is used in the new GUI.</li>
<li>Alt text built into Ren'Py can be translated.</li>
</ul>
<p>While this can change some of the self-voicing output, the changes
should not affect any translations that already exist.</p>
</div>
<div class="section" id="id3">
<h3>Fixes<a class="headerlink" href="#id3" title="Permalink to this headline"> link</a></h3>
<p>An issue where a save or auto-save could rarely cause data corruption
in the non-saved game has been fixed.</p>
<p>Python hide statements are now run in a Python function context, which
makes certain constructs (like generator expressions) compile and run
correctly.</p>
<p>Global labels now behave as described in the documentation, even when
indented.</p>
<p>A regression with custom mouse cursors that could cause the mouse to
jump around wildly has been fixed.</p>
<p>An issue with side images persisting after a menu was shown has been fixed.</p>
<p>Ren'Py no longer stores the state of displayables that are not being shown
in a screen that has been replaced. (This was an issue when the first screen
is re-show, and the displayables took their old state.)</p>
<p>The show and replace events are now always delivered to a transform in a
screen. While this behavior was always intended and could occur whenever
a screen was shown, previously caching could prevent some show events
from being delivered.</p>
<p>Characters that require the alt key can be typed. (The alt key is necessary
to type particular characters in European languages.)</p>
<p>When the Android build system fails to rename a file or directory, it will
retry for 60 seconds before giving up. This is an attempt to work around
antivirus software breaking Windows semantics.</p>
</div>
</div>
<div class="section" id="renpy-6-99-14-1">
<span id="id4"></span><h2>6.99.14.1<a class="headerlink" href="#renpy-6-99-14-1" title="Permalink to this headline"> link</a></h2>
<div class="section" id="image-prediction-and-caching">
<h3>Image Prediction and Caching<a class="headerlink" href="#image-prediction-and-caching" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now searches for the bounding box of non-transparent pixels when
converting an image into a texture. When the <a class="reference internal" href="config.html#var-config.optimize_texture_bounds"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.optimize_texture_bounds</span></code></a>
variable is true (as it is by default), only the non-transparent pixels
are stored in the image cache. This can massively reduce the in-memory
size of certain images, such as images that correspond to mostly-transparent
layers.</p>
<p>The <a class="reference internal" href="config.html#var-config.cache_surfaces"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.cache_surfaces</span></code></a> variable is now False by default. This
halves the amount of memory required for the image cache, but may slow
down multiple image manipulators applied to the same image.</p>
<p>The size of the image cache is now controlled by the
<a class="reference internal" href="config.html#var-config.image_cache_size_mb"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.image_cache_size_mb</span></code></a> variable, which defaults to 300 megabytes.
With the new default settings, each pixel inside the images non-transparent
bounding box takes up 4 bytes of memory.</p>
<p>The result of these three changes is that images take up less memory
in cache, meaning Ren'Py can store far more predicted images.</p>
<p>Ren'Py now refuses to call functions that read from disk (such as
<a class="reference internal" href="file_python.html#renpy.image_size" title="renpy.image_size"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.image_size()</span></code></a>) when predicting images and screens, rather
than risking these slow calls leading to drops in framerate.</p>
<p>The <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> and <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> displayables have
a new predict_all parameter. When True, this causes all displayables to
be predicted, not just the currently selected one. This could be used
to have Ren'Py preload all emotions of a sprite.</p>
<p>The <a class="reference internal" href="displaying_images.html#renpy.start_predict" title="renpy.start_predict"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.start_predict()</span></code></a> and <a class="reference internal" href="displaying_images.html#renpy.stop_predict" title="renpy.stop_predict"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.stop_predict()</span></code></a> functions
now take wildcard patterns. For example:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">$</span> <span class="n">renpy</span><span class="o">.</span><span class="n">start_predict</span><span class="p">(</span><span class="s2">&quot;eileen *&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>Starts predicting all images beginning with the tag eileen, while:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">$</span> <span class="n">renpy</span><span class="o">.</span><span class="n">start_predict</span><span class="p">(</span><span class="s2">&quot;* beach*&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>matches all images that include a beach attribute.</p>
<p>The F4 key now displays the image load log.</p>
</div>
<div class="section" id="other-improvements">
<h3>Other Improvements<a class="headerlink" href="#other-improvements" title="Permalink to this headline"> link</a></h3>
<p>Transforms now have a new <a class="reference internal" href="atl.html#transform-property-maxsize"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">maxsize</span></code></a> property, which scales images
down until they fit into a bounding box.</p>
<p>The Python expression cache is kept when Ren'Py is reloaded, providing a
slight increase in performance compared to unmarshalling it on each reload.</p>
<p>The traceback.txt and errors.txt files now include a date at the bottom,
making it easier to determine if a file is stale.</p>
<p>The new <a class="reference internal" href="displaying_images.html#renpy.list_images" title="renpy.list_images"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.list_images()</span></code></a> function returns a list of all the images
that have been defined.</p>
<p>Drag displayables now take the <cite>mouse_drop</cite> property. When true, this causes
the location of the mouse pointer to be used to select a drag to drop on,
rather than the drag with the maximum overlap.</p>
<p>The Spanish translation has been updated.</p>
</div>
<div class="section" id="other-fixes">
<h3>Other Fixes<a class="headerlink" href="#other-fixes" title="Permalink to this headline"> link</a></h3>
<p>Fixes a bug where the ATL &quot;on hide&quot; clause didn't work.</p>
<p>Release the GIL when waiting for a screen flip, making tasks that run in
background threads (music playback, image preloading, autosave, etc.) run
much faster.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-14">
<span id="renpy-6-99-14"></span><h2>Ren'Py 6.99.14<a class="headerlink" href="#ren-py-6-99-14" title="Permalink to this headline"> link</a></h2>
<div class="section" id="performance">
<h3>Performance<a class="headerlink" href="#performance" title="Permalink to this headline"> link</a></h3>
<p>Quite a bit of work has been done to improve performance, both absolute
performance and apparent framerate stability.</p>
<p>When connected to a device with AC power, Ren'Py will attempt to draw
the screen at a constant framerate. When the device is on battery, several
frame will be drawn before reverting to the 5fps framerate, to ensure updates
to the screen are pushed through display buffering.</p>
<p>Ren'Py has a number of options that control display performance, accessed
through the Shift+G menu. In addition to the GL performance change described
above, this allows the player to lock the framerate and accept tearing when
a frame is late. A player on a slow machine might choose to prefer 30fps
to an unstable framerate. If the developer expects many players will be on
slow devices, a default can be chosen with:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">default</span> <span class="n">preferences</span><span class="o">.</span><span class="n">gl_framerate</span> <span class="o">=</span> <span class="mi">30</span>
</pre></div>
</div>
<p>When a frame takes too long to render (say, because an unpredicted image
has to be loaded from disk), Ren'Py will attempt to use the time the frame
was presented as the base time for transitions and displayables. Effectively,
this means that if Ren'Py has to skip frames, it'll skip them before the first
frame in a sequence, rather than between the first and second frame.</p>
<p>Ren'Py itself triggers garbage collection immediately after a frame is
drawn, if enough objects have been created. Outside of this collection, the
number of objects required to trigger the garbage collector has been raised.
The thresholds are high enough that collection should not be required if
the game does not create circular object references. (That is, objects that
refer to each other in a loop.) Ren'Py has been changed to eliminate common
sources of circular object references.</p>
<p>For most games, Ren'Py managed garbage collection should reduce or even
eliminate frame drops caused by the garbage collector. However, it is
possible to revert to the previous tuning by setting <a class="reference internal" href="config.html#var-config.manage_gc"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.manage_gc</span></code></a>
to False.</p>
<p>By default, Ren'Py will remove transient screens (like say and choice)
and displayables without triggering on &quot;hide&quot; event handlers. The process of
checking for such handlers was relatively expensive, while the use of
those handlers is rare. This change can be reverted by setting
<code class="xref std std-var docutils literal notranslate"><span class="pre">config.zap_transients</span></code> to False.</p>
<p>Ren'Py will now cache compiled Python expressions the first time it
encounters them, rather than compiling an expression each time it is
encountered. This speeds up the overused ConditionSwitch displayable,
along with other parts of Ren'Py. Because of this change, a game will
open slowly the first time it's run under Ren'Py 6.99.14, as all of the
expressions need to be compiled.</p>
<p>This release both increases the speed of maintaining the information required
by rollback, and does so less often. This may be visible to players by
Ren'Py now allowing them to roll back farther than before.</p>
<p>There have also been many other performance improvements that will only be
visible by the increased speed. This release just includes the first round
of performance improvements, while a new performance profiling framework
included will allow Ren'Py developers to further improve things.</p>
</div>
<div class="section" id="multiple-character-dialogue">
<h3>Multiple Character Dialogue<a class="headerlink" href="#multiple-character-dialogue" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now includes a system that allows multiple characters to speak dialogue
at the same time. It's accessed by giving the multiple argument to consecutive
say statements. For example:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="s2">&quot;Ren&#39;Py now supports multiple character dialogue.&quot;</span> <span class="p">(</span><span class="n">multiple</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">l</span> <span class="s2">&quot;About time! I&#39;ve been wanting this for years!&quot;</span> <span class="p">(</span><span class="n">multiple</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
</pre></div>
</div>
<p>As there is more than one way to show dialogue from multiple characters
(side-by-side? top-and-bottom? one or two textboxes?), Ren'Py doesn't include
support for this out of the box yet. Please see the <a class="reference internal" href="multiple.html"><span class="doc">Multiple Character Dialogue</span></a>
section of the documentation for the styles you'll need to define.</p>
</div>
<div class="section" id="gui-preferences">
<h3>GUI Preferences<a class="headerlink" href="#gui-preferences" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py supports a new GUI preference system that replaces the old style preference
system, as it allows preferences to apply to variables in the new GUI that can
be referenced from multiple styles.</p>
<p>This makes it possible to write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">define</span> <span class="n">gui</span><span class="o">.</span><span class="na">text_font</span> <span class="o">=</span> <span class="n">gui</span><span class="o">.</span><span class="n">preference</span><span class="p">(</span><span class="s2">&quot;font&quot;</span><span class="p">,</span> <span class="s2">&quot;DejaVuSans.ttf&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>To access the preference, and:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">vbox</span><span class="p">:</span>
<span class="na">style_prefix</span> <span class="s2">&quot;radio&quot;</span>
<span class="k">label</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Font&quot;</span><span class="p">)</span>
<span class="k">textbutton</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;DejaVu&quot;</span><span class="p">)</span> <span class="na">action</span> <span class="n">gui</span><span class="o">.</span><span class="n">SetPreference</span><span class="p">(</span><span class="s2">&quot;font&quot;</span><span class="p">,</span> <span class="s2">&quot;DejaVuSans.ttf&quot;</span><span class="p">)</span>
<span class="k">textbutton</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;Dyslexic&quot;</span><span class="p">)</span> <span class="na">action</span> <span class="n">gui</span><span class="o">.</span><span class="n">SetPreference</span><span class="p">(</span><span class="s2">&quot;font&quot;</span><span class="p">,</span> <span class="s2">&quot;OpenDyslexic-Regular.otf&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>to set it. See the section on <a class="reference internal" href="gui_advanced.html#gui-preferences"><span class="std std-ref">GUI Preferences</span></a> for more details.</p>
</div>
<div class="section" id="tooltips">
<h3>Tooltips<a class="headerlink" href="#tooltips" title="Permalink to this headline"> link</a></h3>
<p>A new tooltip system has been added to Ren'Py, to replaced the one that
already existed. While in the previous system, one had to write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">default</span> <span class="n">tt</span> <span class="o">=</span> <span class="n">Tooltip</span><span class="p">(</span><span class="s2">&quot;No button selected.&quot;</span><span class="p">)</span>
<span class="k">textbutton</span> <span class="s2">&quot;One.&quot;</span><span class="p">:</span>
<span class="na">action</span> <span class="n">Return</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="na">hovered</span> <span class="n">tt</span><span class="o">.</span><span class="n">Action</span><span class="p">(</span><span class="s2">&quot;The loneliest number.&quot;</span><span class="p">)</span>
<span class="k">text</span> <span class="n">tt</span><span class="o">.</span><span class="na">value</span>
</pre></div>
</div>
<p>It's now possible to write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">textbutton</span> <span class="s2">&quot;One.&quot;</span><span class="p">:</span>
<span class="na">action</span> <span class="n">Return</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="na">tooltip</span> <span class="s2">&quot;The loneliest number.&quot;</span>
<span class="k">text</span> <span class="n">GetTooltip</span><span class="p">()</span>
</pre></div>
</div>
<p>This is intended to save boilerplate and make screens more readable. For
more information, see the <a class="reference internal" href="screen_actions.html#tooltips"><span class="std std-ref">Tooltips</span></a> section.</p>
</div>
<div class="section" id="id5">
<h3>Changes<a class="headerlink" href="#id5" title="Permalink to this headline"> link</a></h3>
<p>SSL and TLS support has been added to all platforms. This allows Ren'Py
games to make requests to secure web servers, perhaps in conjunction
with a Python library such as requests. This support is only included
in built distributions if imported at init time.</p>
<p>The new <a class="reference internal" href="im.html#im.Data" title="im.Data"><code class="xref py py-func docutils literal notranslate"><span class="pre">im.Data()</span></code></a> image manipulator creates an image from compressed
binary data, as might be downloaded from a web server.</p>
<p>The <a class="reference internal" href="config.html#var-config.loadable_callback"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.loadable_callback</span></code></a> lets scripts inform Ren'Py about
additional loadable files.</p>
<p>Ren'Py will attempt to diagnose problems with pickling objects during
a save, and report an object that caused a pickling problem. (This is
best-effort, but tends to catch common problems.)</p>
<p>When a viewport is given scrollbars, Ren'Py will now offer its child
a large amount of space in the given direction. This prevents problems
with displayables drawn at or below the visible area of a viewport.</p>
<p>Ren'Py now resolves the ambiguity between the <a class="reference internal" href="style_properties.html#style-property-xpos"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xpos</span></code></a> and <a class="reference internal" href="style_properties.html#style-property-xalign"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xalign</span></code></a>
style properties in favor of xpos, and similarly for other cases where both
more and less specific style properties are given to the same style.</p>
<p>Custom statements now take a label function that can return a custom label
for the statement. This allows the custom statements to be jumped to or
called.</p>
<p>The new config.gl_clear_color variable allows a creator to set the color
of the letterboxes and pillarboxes used when the screen is not filled.</p>
<p>Drag displayables (part of the drag and drop system) now support a bottom
method, that can be used to lower the drag to the bottom of its drg
group.</p>
<p>The <a class="reference internal" href="config.html#var-config.cache_surfaces"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.cache_surfaces</span></code></a> variable, added in the last release, has
been documented. Setting this variable to False can reduce Ren'Py's
memory consumption, at the cost of of slowing down images used by multiple
image manipulators. (Which should be a rare case in modern Ren'Py.)</p>
<p>Variable and field munging (which change the name of a variable that begins with
__ to a file-specific value) now work inside string substitutions.</p>
<p>Viewports and vpgrids now support the pagekeys property, which allows one
to use the pageup and pagedown keys to scroll the viewport. The arrowkeys
property is now documented.</p>
<p>RAPT now compiles Java code using a source and target version of 1.6, which
allows it to be built on modern JDKs.</p>
</div>
<div class="section" id="id6">
<h3>Fixes<a class="headerlink" href="#id6" title="Permalink to this headline"> link</a></h3>
<p>An issue where screens could display incorrectly when compiled at different
times has been fixed. This could only show up under certain circumstances.</p>
<ul class="simple">
<li>The project has screens in multiple files.</li>
<li>The files were compiled at different times. (This can never be the case for
a released game, since all files are recompiled at the same time when
building distributions.)</li>
</ul>
<p>After upgrading to this release, the problem can be fixed by pressing &quot;Force
Recompile&quot; in the launcher. This can be done for any game in development, but
isn't necessary for released games.</p>
<p>There have been several improvements to the interactive director, allowing
it to work in more circumstances.</p>
<p>A race condition that could cause Ren'Py to lock up (causing a blank
screen to be displayed) on Android and iOS has been fixed. This was
introduced in 6.99.13.</p>
<p>In 6.99.13, a race condition caused Ren'Py to infrequently skip movie
playback entirely.</p>
<p>Ren'Py now supports the AltGr key.</p>
<p>Ren'Py now limits the amount of console output it logs, to prevent print
statements from consuming memory if the console is never displayed.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-13">
<span id="renpy-6-99-13"></span><h2>Ren'Py 6.99.13<a class="headerlink" href="#ren-py-6-99-13" title="Permalink to this headline"> link</a></h2>
<div class="section" id="tutorial-and-the-question">
<h3>Tutorial and The Question<a class="headerlink" href="#tutorial-and-the-question" title="Permalink to this headline"> link</a></h3>
<p>This release includes updated versions of the Tutorial game and
&quot;The Question&quot;, the example game that's bundled with Ren'Py.</p>
<p>The Tutorial game has been largely rewritten, and is now structured as a pair
lectures, the first covering the creation of a basic visual novel in Ren'Py,
and the second covering in-depth topics needed to create more advanced games.
The Tutorial has also lost content that is less relevant to modern Ren'Py,
focusing in on the features that are the best practice to use in new games.</p>
<p>The Tutorial now has over 250 examples, that can now be copied out of the
tutorial and into your own projects.</p>
<p>&quot;The Question&quot; has been rewritten with a new script by Lore, one that is more
appropriate for educational use than the original. It's also been updated
with new background, and to demonstrate best practices when writing Ren'Py
scripts.</p>
<p>Both games have been modernized with high-definition widescreen graphics
and use of the new default Ren'Py GUI.</p>
<p>Right now, the old tutorial is still distributed with Ren'Py, and is used
if when a translation is present for the old tutorial but not the new
tutorial.</p>
</div>
<div class="section" id="interactive-director">
<h3>Interactive Director<a class="headerlink" href="#interactive-director" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now ships with an built in interactive director tool. This tool
makes it possible to add the scene, show, hide, with, play, queue, stop,
and voice statements to Ren'Py from inside an under-development visual
novel, without having to change to a text editor and reload the project.
The interactive director can be accessed by pressing the D key (without
Shift) inside an unreleased game.</p>
<p>The interactive director had been distributed outside of Ren'Py, with
a license that made it free for noncommercial use. It's now part of Ren'Py,
and has the same license as the rest of Ren'Py, which allows for both
commercial and noncommercial use.</p>
</div>
<div class="section" id="new-gui">
<h3>New GUI<a class="headerlink" href="#new-gui" title="Permalink to this headline"> link</a></h3>
<p>A few changes have been made to the new GUI. Buttons have been brightened and
their text shrunk. Bars have been reduced in height somewhat. The intent is
to provide more room in menus, especially for game-specific preferences
on the preferences screen.</p>
<p>For newly-generated games, it is now possible to customize the location and
look of the namebox (the frame containing a character's name) on a character
by character basis. This is done by giving properties prefixed with namebox
to the Character. For example, the namebox_background property changes the
background of a namebox.</p>
</div>
<div class="section" id="raspberry-pi">
<h3>Raspberry Pi<a class="headerlink" href="#raspberry-pi" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now comes with experimental support for the Raspberry Pi platform.</p>
<p>The Raspberry Pi port is similar to the Android and iOS ports, both in its
limitations and how it's meant to run games rather than develop them. As with
all platforms, creators developing for the Raspberry Pi need to account for
the resources available to them and design their games accordingly.</p>
<p>That being said, The Question and the new Tutorial both run on a Raspberry Pi 3
computer costing $35.</p>
</div>
<div class="section" id="hyperlinks">
<h3>Hyperlinks<a class="headerlink" href="#hyperlinks" title="Permalink to this headline"> link</a></h3>
<p>Hyperlinks created with the <code class="docutils literal notranslate"><span class="pre">{a}</span></code> text tag now support jumping and calling
labels. A tag of the form <code class="docutils literal notranslate"><span class="pre">{a=jump:label}</span></code> jumps to the label, while one of
the form <code class="docutils literal notranslate"><span class="pre">{a=call:label}</span></code> ends the current statement and calls a label. There
are also <code class="docutils literal notranslate"><span class="pre">{a=show:screen}</span></code> and <code class="docutils literal notranslate"><span class="pre">{a=showmenu:screen}</span></code>, which show screens
in-game and in a menu context, respectively.</p>
<p>The new <a class="reference internal" href="config.html#var-config.hyperlink_protocol"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.hyperlink_protocol</span></code></a> variable determines the default
protocol for a hyperlink that has none. For example, if it's &quot;jump&quot;, then
<code class="docutils literal notranslate"><span class="pre">{a=mylabel}</span></code> is equivalent to <code class="docutils literal notranslate"><span class="pre">{a=jump:mylabel}</span></code>.</p>
<p>The new <a class="reference internal" href="config.html#var-config.hyperlink_handlers"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.hyperlink_handlers</span></code></a> variable is a dictionary mapping
protocols to functions, which can be used to add creator-defined protocol
handlers.</p>
<p>The size of a hyperlink is now inherited from the size of the enclosing text.
This makes hyperlinks work within text of a non-default size.</p>
</div>
<div class="section" id="say-with-arguments">
<h3>Say with Arguments<a class="headerlink" href="#say-with-arguments" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py say statement now supports being passed arguments, which are
placed in parenthesis after the text to be spoken. For example:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="s2">&quot;Hey!&quot;</span> <span class="p">(</span><span class="n">what_size</span><span class="o">=</span><span class="mi">36</span><span class="p">,</span> <span class="n">what_color</span><span class="o">=</span><span class="s2">&quot;#ffeeee&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>These arguments are first passed to config.say_argument_callback, and then
are passed to the character. The default implemention (in <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>)
creates a new character with the passed arguments, and uses that to display
the text.</p>
<p>One place this is handy is with jump hyperlinks and the new advance
argument to Character, which prevents text from being advanced directly.
It's now possible to write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="s2">&quot;Would you like to go {a=jump:living_room}west{/a} or {a=jump:kitchen}north{/a}?&quot;</span> <span class="p">(</span><span class="n">advance</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
</pre></div>
</div>
<p>Which pauses execution until the player clicks on a hyperlink.</p>
</div>
<div class="section" id="translations">
<h3>Translations<a class="headerlink" href="#translations" title="Permalink to this headline"> link</a></h3>
<p>The launcher and default project have been translated into French, courtesy of
Alexandre Tranchant.</p>
<p>The launcher and default project have been translated into Brazilian Portugese,
courtesy of MrStalker.</p>
<p>The Indonesian and Simplified Chinese translations have been updated.</p>
</div>
<div class="section" id="other">
<h3>Other<a class="headerlink" href="#other" title="Permalink to this headline"> link</a></h3>
<p>The new <a class="reference internal" href="config.html#var-config.preload_fonts"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.preload_fonts</span></code></a> variable can take a list of TrueType or
opentype font files to preload at Ren'Py stop. This prevents Ren'Py from
pausing animations when opening a new font.</p>
<p>Ren'Py now opens audio files in a second thread of execution. This prevents
animations from pausing when an audio file is played or loops from slow or
busy disks.</p>
<p>The new <a class="reference internal" href="displaying_images.html#renpy.get_attributes" title="renpy.get_attributes"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_attributes()</span></code></a> function can be called to retrieve the
attributes associated with an image tag on a layer.</p>
<p>When a file named projects.txt is present in the projects directory, it
is expected to contain a list of full paths to directories, one per line.
Those paths are treated as projects and displayed in the launcher.</p>
<p>There is a new <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> action, that terminates the current statement
and calls a label. The Call action and the <a class="reference internal" href="statement_equivalents.html#renpy.call" title="renpy.call"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.call()</span></code></a> function take
a new <cite>from_current</cite> parameter, which causes them to return to the start
of the current statement, which could be used (very carefully) to call
an aside before returning to the main story.</p>
<p>The preference variables have been given their own page in the
documentation, one that clarifies it's better to use the default
statement to directly set the default value of a preference
variable.</p>
<p>The &quot;steam&quot; package has been renamed to &quot;market&quot;, reflecting that it will
work just as well with other markets.</p>
<p>In ATL, interpolation statement with a warper now last one frame. This means
that the <code class="docutils literal notranslate"><span class="pre">pause</span> <span class="pre">0</span></code> statement now completes after one frame, rather than
instantaneously, allowing for single-frame animations. Please do not use this
to include subliminal messages in your game.</p>
<p>The show later at statement now persists transform state, much like other
statements that involve a transform. This shouldn't change much, but opens
the possibility of layer transforms that involve randomness.</p>
<p>The {nw} text tag now waits for voice and self-voicing to complete before
allowing text to advance.</p>
<p>The grid and vpgrid displayables now support the <a class="reference internal" href="style_properties.html#style-property-xspacing"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xspacing</span></code></a> and
<a class="reference internal" href="style_properties.html#style-property-yspacing"><code class="xref std std-propref docutils literal notranslate"><span class="pre">yspacing</span></code></a> style properties, which set the spacing in the horizontal
and vertical directions independently.</p>
<p>The <a class="reference internal" href="config.html#var-config.character_id_prefixes"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.character_id_prefixes</span></code></a> variables contains a list of prefixes
that are used by a Character to style displayables. Similar to what, who, and
window, if &quot;logo&quot; is in this variable, properties like logo_xpos and logo_background
will cause the logo and background properties to be set on the displayable with
id &quot;logo&quot;.</p>
<p>Ren'Py now supports the Python print function. Output printed with the print
function will go to the log.txt file and the Ren'Py console, which can be
accessed by typing Shift+O.</p>
<p>It is now possible to customize what happens when the Ignore button is
clicked on the exception reporting screen. This is done using the <a class="reference internal" href="store_variables.html#var-_ignore_action"><code class="xref std std-var docutils literal notranslate"><span class="pre">_ignore_action</span></code></a>
variable, which can be set to a Jump action that might clean up after the player
and start a turn again.</p>
<p>The Ren'Py set type now inherits from the Python set type, rather than the
obsolete sets.Set type. Set literals are now properly wrapped so that the
set participates in rollback.</p>
<p>The list of NVL-mode text blocks is cleared when the language is changed. This
prevents Ren'Py from showing a mix of text languages, so of which may be
nonsense in the current font.</p>
<p>The &quot;text speed&quot; and &quot;auto-forward time&quot; <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> values now take
a range argument, allowing the creator to specify a range.</p>
<p>The new <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> function can be used to filter text
tags in a string. It's used to remove text tags in the history screen of the
default GUI.</p>
<p>In screen language, a block given to a use statement can now contain a
has statement.</p>
<p>When set to &quot;auto&quot;, the <a class="reference internal" href="config.html#var-config.developer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.developer</span></code></a> variable is set to True or
False during the init phase. Previously, it was always true during the init
phase, and would only change once init is over.</p>
<p>When a position property is supplied to a viewport or vpgrid with vertical, horizontal,
or both kinds of scrollbars, the position property is passed to the side
container that holds the viewport and scrollbars. This makes it possible to
position viewports and vpgrids using the same syntax as other displayables.</p>
<p>Itch.io support has been improved. A problem that prevented uploading to
itch.io from Windows has been fixed. The table of channels to upload to
has been updated, and now takes advantage of butlers's new support for
uploading Linux bz2 and Android apk files.</p>
<p>Creator-defined statements can run a function at init time, in addition
to the function run when the statement executes normally. Creator-defined
statements can take a block of Ren'Py script that is parsed and can be
jumped to.</p>
<p>The time it takes to parse Ren'Py scripts has been dramatically reduced.</p>
<p>A missing _menu variable could cause Ren'Py's init phase error handling to
not report a relevant error. This has been fixed.</p>
<p>The PlayCharacterVoice action can now mark a button as selected while the
character voice is playing.</p>
<p>The new <a class="reference internal" href="other.html#renpy.add_python_directory" title="renpy.add_python_directory"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.add_python_directory()</span></code></a> function provides a way to add
subdirectories of the game directory to the Python path.</p>
<p>The Ren'Py documentation has been edited to remove the use of the word &quot;code&quot;,
and replace it with less cryptic terminology.</p>
<p>It is now possible to support Ren'Py via Patreon. A link to a page with
sponsor information is in the launcher by default. It can be hidden in the
launcher preferences.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-12-4">
<span id="renpy-6-99-12-4"></span><h2>Ren'Py 6.99.12.4<a class="headerlink" href="#ren-py-6-99-12-4" title="Permalink to this headline"> link</a></h2>
<div class="section" id="console">
<h3>Console<a class="headerlink" href="#console" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py console has been updated to match the neutral Ren'Py style, and
to add a number of new features:</p>
<ul class="simple">
<li>The console is now available during exception handling. (As always, it
accesses the global scope.)</li>
<li>The console history is kept as part of persistent data.</li>
<li>Watched variables are stored as part of save files, which means that the
watch is restored when the game is (automatically or manually) reloaded.</li>
</ul>
</div>
<div class="section" id="id7">
<h3>Other<a class="headerlink" href="#id7" title="Permalink to this headline"> link</a></h3>
<p>A regression (bug) introduced in version 6.99.4 that prevented the default
input screen (and hence renpy.input) from working has been fixed.</p>
<p>A memory alignment issue that could result in a SIGBUS crash on ARM-based
Android devices when playing video has been fixed.</p>
<p>Hide and replace animations are removed from Ren'Py when a rollback or
load occurs. This prevents hide animations from playing when a displayable
has not been showing.</p>
<p>Auto-forward mode is disabled when self-voicing is enabled, to prevent the
game from automatically advancing and making self-voicing information
obsolete.</p>
<p>When running with Steam support enabled, Ren'Py will query the Steam overlay
and redraw the screen when Steam asks for an update. (This should increase
the FPS of the Steam overlay.)</p>
<p>Fadeouts now span looping audio by default. Previously, a fadeout would come
to a stop at the end of an audio track.</p>
<p>Right-to-left (Arabic and Hebrew) language support has been enabled on the iOS
platform.</p>
<p>A bug in render clipping has been fixed. This generally manifested as 1-pixel
overlaps or open spaces when drawing frames and bars.</p>
<p>The Arabic, Indonesian, and Russian language translations have been updated.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-12-3">
<span id="renpy-6-99-12-3"></span><h2>Ren'Py 6.99.12.3<a class="headerlink" href="#ren-py-6-99-12-3" title="Permalink to this headline"> link</a></h2>
<div class="section" id="gui">
<h3>GUI<a class="headerlink" href="#gui" title="Permalink to this headline"> link</a></h3>
<p>It is now possible to systematically customize the look of different
kinds of text in Ren'Py. For example, one can now choose different sizes
for name, dialogue, interface, label and prompt text.</p>
<p>All text properties are now available through the gui system. For example,
gui.text_outlines can be used to make text outlined by default, while
gui.name_text_bold can be used to make character names bold.</p>
<p>To allow for the above two changes, some of the gui variable names have been renamed in
a more systematic manner. For example, gui.default_font has been renamed
gui.text_font, while gui.name_font has become gui.name_text_font.</p>
<p>It is now possible to outline gui text using variables like gui.text_outlines
and gui.interface_text_outlines.</p>
<p>Due to the design of the new GUI, the changes described in this section will
only take effect when a new game is created, or a game's GUI is updated.</p>
</div>
<div class="section" id="id8">
<h3>Translations<a class="headerlink" href="#id8" title="Permalink to this headline"> link</a></h3>
<p>The Russian translation has been updated and modernized, thanks to Ria-kon
and Project Gardares.</p>
<p>The Italian translation has been updated and modernized, thanks to Gas.</p>
</div>
<div class="section" id="id9">
<h3>Other<a class="headerlink" href="#id9" title="Permalink to this headline"> link</a></h3>
<p>A crash on video playback on Android and iOS has been fixed.</p>
<p>The default encoding for non-Unicode strings in Ren'Py has been changed to
the filesystem encoding. This should address a series of encoding issues
that have occured on non-ascii systems since 6.99.12.</p>
<p>Ren'Py will no longer search for system-installed fonts when in developer
mode.</p>
<p>In some cases, Ren'Py duplicates displayables to ensure that displayable
state is not aliased. (For example, a transform is duplicated when it is
show, so that when it is shown a second time it will not retain its
state.) This copying has been optimized so it only occurs when necessary.</p>
<p>The <a class="reference internal" href="config.html#var-config.replace_text"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.replace_text</span></code></a> callback now runs even if no custom
text tags have been defined.</p>
<p>An issue where text could be clipped when it was not necessary has been
fixed.</p>
<p>Viewports are now draggable when other focusable things are on the screen.</p>
<p>This release adds more functions to support the Interactive Director,
and basic support for attribute images.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-12">
<span id="renpy-6-99-12"></span><h2>Ren'Py 6.99.12<a class="headerlink" href="#ren-py-6-99-12" title="Permalink to this headline"> link</a></h2>
<div class="section" id="macintosh-support">
<h3>Macintosh Support<a class="headerlink" href="#macintosh-support" title="Permalink to this headline"> link</a></h3>
<p>This release includes a number of changes to support macOS Sierra. These
include:</p>
<ul class="simple">
<li>The Macintosh application produced by Ren'Py is now read-only by default.
Save files will be placed in a system-global directory, while screenshots
will be written to the Desktop.</li>
<li>The organization of the Mac application has been changed to allow the
application to be code-signed.</li>
<li>When run on a Macintosh with Xcode installed and the <code class="xref std std-var docutils literal notranslate"><span class="pre">build.mac_identity</span></code>
variable set properly, Ren'Py will use the codesign tool to sign the package
before archiving it.</li>
<li>When run on a Macintosh, Ren'Py will create a .dmg file containing the
application. When Xcode is installed and <code class="xref std std-var docutils literal notranslate"><span class="pre">build.mac_identity</span></code> is set,
the package will be signed.</li>
</ul>
<p>The result of this is that, when a creator has a Macintosh computer and a
(free) Developer ID Application certificate, it is possible to create
distribute downloadable Ren'Py games that satisfy Gatekeeper and Gatekeeper
Path Randomization.</p>
<p>Since it is no longer possible to make a single distribution that runs on all
desktop platforms, the all (Windows, Mac, and Linux) package type has been
removed. It's been replace with a pc package type that supports Windows and
Linux, and the existing mac type that supports macOS. (There is a new steam
package type to help with app store bundles, but that's not recommended for
distribution to end users, since it won't work with macOS Sierra.)</p>
<p>The launcher has been modified so it can launch games created using older
versions of Ren'Py, even under Sierra. This can be done by placing the game
inside the Ren'Py directory, starting Ren'Py, choosing the game in the
launcher, and choosing &quot;Launch Project&quot;.</p>
</div>
<div class="section" id="translation-changes">
<h3>Translation Changes<a class="headerlink" href="#translation-changes" title="Permalink to this headline"> link</a></h3>
<p>Support generating projects in non-English languages has been
improved. When a new project is created, it includes translations of the
interface strings into the project's language, allowing the translation
of text presented to the player by Ren'Py.</p>
<p>There is now a single place for translating Ren'Py translating
the launcher also now translates the comments of a generated game. The process
of translating Ren'Py (the launcher and the GUI) is now documented
on the <a class="reference internal" href="translating_renpy.html"><span class="doc">Translating Ren'py</span></a> page. This page also
suggests a logical order in which strings should be translated.</p>
<p>Functions have been added for selecting an alternate font, changing defines
(such a text size), and copying files into a generated project, based on the
translation.</p>
<p>Translate python blocks are now executed before regular style statements
(translate style statements are executed after both). This change was
intended for and documented 6.99.11, but the implementation was flawed,
so a corrected implementation is used now.</p>
</div>
<div class="section" id="python-changes">
<h3>Python Changes<a class="headerlink" href="#python-changes" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py will now compile Python code as if:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">__future__</span> <span class="kn">import</span> <span class="n">absolute_imports</span><span class="p">,</span> <span class="n">print_function</span><span class="p">,</span> <span class="n">unicode_literals</span>
</pre></div>
</div>
<p>was true. If compilation fails, it will then re-compile the code without these
settings. This is intended to allow new code to be written that will be
compatible with a future Python 3-based Ren'Py.</p>
<p>This should have minimal impact to existing code. The one case where it could
be a problem is if a character string is used to encode binary data, in
which case a binary string (b&quot;string&quot;) should be explictly used.</p>
</div>
<div class="section" id="other-changes-and-fixes">
<h3>Other Changes and Fixes<a class="headerlink" href="#other-changes-and-fixes" title="Permalink to this headline"> link</a></h3>
<p>Dynamic images are now copied before a transition occurs. This makes it
possible to use dynamic variables and the with statement together, to
transition from one value of the variable to another.</p>
<p>Ren'Py now supports the WEBP image format.</p>
<p>This version of Ren'Py includes fixes to support the interactive director
tool.</p>
<p>The iOS app store is queried for the price of available in-app purchases
when the game starts. This allows the price of such purchases to be
presented without the game blocking.</p>
<p>The dialog window that is presented when accessing the iOS app store can
now be translated.</p>
<p>It is now possible to pass positional arguments to a game menu screen via
ShowMenu.</p>
<p>An issue introduced in 6.99.11 that could cause ATL Transforms to repeat has
been fixed.</p>
<p>A regression with first_fit that caused it to not work has been rectified.</p>
<p>An issue that cause ongoing sound playback to skip while a new sound sample
was loaded has been eliminated.</p>
<p>Support for the itch.io butler tool on Windows has been fixed.</p>
<p>Hiding the interface no longer stops voice playback.</p>
<p>The new <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> action can disable input values all at
once.</p>
<p>The mousewheel property of viewports and vpgrids supports a new value,
&quot;change&quot;. When this value is given, the viewport only consumes mouse events
when the event would change the viewport. The motivating use of this is a
history window that dismisses when it reaches the bottom.</p>
<p>Namespaces may now contain dots in their names.</p>
<p>The new <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> action queues a key binding event when activated.
This can be used to activate many bindings, including the new
'dismiss_unfocused' binding, which dismisses the current dialogue even
if it is not focused.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-11">
<span id="renpy-6-99-11"></span><h2>Ren'Py 6.99.11<a class="headerlink" href="#ren-py-6-99-11" title="Permalink to this headline"> link</a></h2>
<div class="section" id="new-in-game-gui">
<h3>New In-Game GUI<a class="headerlink" href="#new-in-game-gui" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py ships with a new default GUI. This system, used in-game to customize
the main menu, game menu, and in-game screens, replaces the old themes
and screens.rpy system with a new system that's intended to be an improvement
for every creator:</p>
<ul class="simple">
<li>For new creators, the new GUI is intended to look attractive (if generic)
out of the box. It is adaptable to a choice of sizes, and supports games
with light and dark backgrounds.</li>
<li>Intermediate creators will be able to more easily customize the new GUI,
without having to to work with screens and styles directly. It's now
possible to completely re-theme the GUI by changing variables in the <code class="docutils literal notranslate"><span class="pre">gui</span></code>
namespace, and editing template images.</li>
<li>Advanced creators will be able to replace the new gui entirely, either
piece by piece or wholesale. The new gui infrastructure resets all styles
to sensible defaults, making it easier to apply customization.</li>
</ul>
<p>There is also a <a class="reference internal" href="gui.html#gui"><span class="std std-ref">gui customization guide</span></a>, consisting of over 5,000
words of documentation and code, and 40 images, that explains how to
change the look of the GUI.</p>
<p>In addition, the new GUI adds support for a number of new features. These
features are generally implemented in a way that custom GUIs can take
advantage of. Highlights include:</p>
<ul class="simple">
<li>The GUI defaults to supporting 16:9 widescreen resolutions.</li>
<li>The new GUI is intended to support PCs and mobile devices in landscape
mode. Where appropriate, it conforms to iOS and Android interface
guidelines.</li>
<li>The new GUI includes native support for a history or readback
screen.</li>
<li>The new GUI includes support for assigning names to file pages,
allowing a certain amount of organization to be applied to
files.</li>
<li>The NVL and choice screens are now given lists of objects as parameters,
instead of tuples. (The objects also function as tuples, for compatibility
with old code.)</li>
<li>The yesno_prompt screen has been renamed to confirm.</li>
<li>Ren'Py supports the use of a ctc screen to display the click-to-continue
indicator.</li>
</ul>
</div>
<div class="section" id="improved-platform-support">
<h3>Improved Platform Support<a class="headerlink" href="#improved-platform-support" title="Permalink to this headline"> link</a></h3>
<p>There have been a number of fixes to Ren'Py's support for various
platforms.</p>
<p><strong>Windows</strong> HighDPI mode is detected properly when displaying the
presplash.</p>
<p><strong>Android</strong> The Android build system has undergone a rewrite, adding support
for x86, while retaining and modernizing support for ARM devices. RAPT now
included many dependencies, fixing Android build problems.</p>
<p>Ren'Py now supports immersive mode on Android's 4.4+. Immersive mode hides
the system UI, including the navigation bar, allowing Ren'Py to take up the
entire screen.</p>
<p><strong>Chrome OS</strong> Ren'Py now support ChromeOS by running the Android APKs via
the Android Runtime for Chrome tool.</p>
</div>
<div class="section" id="style-prefix-support">
<h3>Style Prefix Support<a class="headerlink" href="#style-prefix-support" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now supports the use of a prefix_ substitution with style properties.
Where previously, one was required to write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">style</span> <span class="k">button</span><span class="p">:</span>
<span class="na">insensitive_background</span> <span class="s2">&quot;insensitive_button.png&quot;</span>
<span class="na">idle_background</span> <span class="s2">&quot;idle_button.png&quot;</span>
<span class="na">hover_background</span> <span class="s2">&quot;hover_button.png&quot;</span>
<span class="na">selected_idle_background</span> <span class="s2">&quot;selected_idle_button.png&quot;</span>
<span class="na">selected_hover_background</span> <span class="s2">&quot;selected_hover_button.png&quot;</span>
</pre></div>
</div>
<p>one can now write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">style</span> <span class="k">button</span><span class="p">:</span>
<span class="na">background</span> <span class="s2">&quot;[prefix_]button.png&quot;</span>
</pre></div>
</div>
<p>This searches through prefixes in a manner similar to the way styles do.
When looking for a selected_idle_background, Ren'Py will search for
selected_idle_background.png, idle_background.png, and background.png</p>
</div>
<div class="section" id="style-properties">
<h3>Style Properties<a class="headerlink" href="#style-properties" title="Permalink to this headline"> link</a></h3>
<p>Windows and buttons can take the <a class="reference internal" href="style_properties.html#style-property-padding"><code class="xref std std-propref docutils literal notranslate"><span class="pre">padding</span></code></a> and <a class="reference internal" href="style_properties.html#style-property-margin"><code class="xref std std-propref docutils literal notranslate"><span class="pre">margin</span></code></a>
style properties. These properties can take a tuple that gives the
margin and padding on all four sides.</p>
<p>The new <a class="reference internal" href="style_properties.html#style-property-base_bar"><code class="xref std std-propref docutils literal notranslate"><span class="pre">base_bar</span></code></a> style property sets the left and right (or
top and bottom) bars to the same value. It can be to set the background
of a slider or scrollbar the uses a thumb image.</p>
<p>The <a class="reference internal" href="style_properties.html#style-property-xfit"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xfit</span></code></a> and <a class="reference internal" href="style_properties.html#style-property-yfit"><code class="xref std std-propref docutils literal notranslate"><span class="pre">yfit</span></code></a> style properties can be given to
the <a class="reference internal" href="screens.html#sl-fixed"><span class="std std-ref">fixed</span></a> screen language statement and <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>
displayable. When a fit property is true, the fixed shrinks in the given
axis to fit all child displayables.</p>
<p>Buttons and Windows now fully respect the <a class="reference internal" href="style_properties.html#style-property-xmaximum"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xmaximum</span></code></a> and
<a class="reference internal" href="style_properties.html#style-property-ymaximum"><code class="xref std std-propref docutils literal notranslate"><span class="pre">ymaximum</span></code></a> style properties.</p>
<p>There is now a <a class="reference internal" href="style_properties.html#style-property-offset"><code class="xref std std-propref docutils literal notranslate"><span class="pre">offset</span></code></a> style property, which sets the
<a class="reference internal" href="style_properties.html#style-property-xoffset"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xoffset</span></code></a> and <a class="reference internal" href="style_properties.html#style-property-yoffset"><code class="xref std std-propref docutils literal notranslate"><span class="pre">yoffset</span></code></a> properties to the first and
second components of a tuple.</p>
</div>
<div class="section" id="translate-and-style-statement-order-changes">
<h3>Translate and Style Statement Order Changes<a class="headerlink" href="#translate-and-style-statement-order-changes" title="Permalink to this headline"> link</a></h3>
<p>The <a class="reference internal" href="config.html#var-config.defer_styles"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.defer_styles</span></code></a> variable has been added to determine if
style execution should be deferred, as described below. If
config.defer_styles is true when style evaluation would have
occurred, that style is put on a deferred list. The <a class="reference internal" href="gui_advanced.html#gui.init" title="gui.init"><code class="xref py py-func docutils literal notranslate"><span class="pre">gui.init()</span></code></a>
function called by the new GUI sets this variable to true.</p>
<p>To facilitate translations customizing the fonts of the new GUI, the order of
execution of <code class="docutils literal notranslate"><span class="pre">translate</span> <span class="pre">python</span></code>, <code class="docutils literal notranslate"><span class="pre">style</span></code> and <code class="docutils literal notranslate"><span class="pre">translate</span> <span class="pre">style</span></code>
statements has been changed. When the game starts (after all statements
have run), or when the language changes, the following steps occur.</p>
<ol class="arabic simple">
<li>The <code class="docutils literal notranslate"><span class="pre">gui</span></code> named store is cleaned to its state at the end if init.
(This is the store that all variables defined with gui.`name` live in.)</li>
<li>All <code class="docutils literal notranslate"><span class="pre">translate</span></code> <cite>language</cite> <code class="docutils literal notranslate"><span class="pre">python</span></code> statements are run, where <cite>language</cite>
is the current language.</li>
<li>All deferred <code class="docutils literal notranslate"><span class="pre">style</span></code> statements are run.</li>
<li>All <code class="docutils literal notranslate"><span class="pre">translate</span></code> <cite>language</cite> <code class="docutils literal notranslate"><span class="pre">style</span></code> statement are run, where <cite>language</cite>
is the current language. (If not None.)</li>
<li>The callbacks in <code class="xref std std-var docutils literal notranslate"><span class="pre">config.change_language_callbacks</span></code> are called.</li>
</ol>
<p>Ren'Py can be made to return to the old behavior (in which only <code class="docutils literal notranslate"><span class="pre">translate</span></code>
<cite>language</cite> <code class="docutils literal notranslate"><span class="pre">style</span></code>, <code class="docutils literal notranslate"><span class="pre">translate</span></code> <cite>language</cite> <code class="docutils literal notranslate"><span class="pre">python</span></code>, and callbacks
are executed) by setting <a class="reference internal" href="config.html#var-config.new_translate_order"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.new_translate_order</span></code></a> to False.</p>
</div>
<div class="section" id="local-labels">
<h3>Local Labels<a class="headerlink" href="#local-labels" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now supports labels scoped to inside another label. It's possible to
write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">label</span> <span class="n">day1</span><span class="p">:</span>
<span class="k">menu</span><span class="p">:</span>
<span class="s2">&quot;Should I sleep in?&quot;</span>
<span class="s2">&quot;Yes&quot;</span><span class="p">:</span>
<span class="k">jump</span> <span class="o">.</span><span class="n">afternoon</span>
<span class="s2">&quot;No&quot;</span><span class="p">:</span>
<span class="k">jump</span> <span class="o">.</span><span class="n">morning</span>
<span class="k">label</span> <span class="o">.</span><span class="n">morning</span><span class="p">:</span>
<span class="s2">&quot;It&#39;s the morning.&quot;</span>
<span class="k">label</span> <span class="o">.</span><span class="n">afternoon</span><span class="p">:</span>
<span class="s2">&quot;It&#39;s the afternoon.&quot;</span>
</pre></div>
</div>
<p>In this code, the .morning and .afternoon labels can be jumped to directly
from code that is immediately after the day1 label, or by jumping to
day1.morning or day1.afternoon from other code.</p>
</div>
<div class="section" id="transforms">
<h3>Transforms<a class="headerlink" href="#transforms" title="Permalink to this headline"> link</a></h3>
<p>Transforms now support <a class="reference internal" href="atl.html#transform-property-xtile"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">xtile</span></code></a> and <a class="reference internal" href="atl.html#transform-property-ytile"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">ytile</span></code></a> transform
properties. These properties allow the underlying displayable to
be tiled multiple times.</p>
<p>Transforms now support <a class="reference internal" href="atl.html#transform-property-xpan"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">xpan</span></code></a> and <a class="reference internal" href="atl.html#transform-property-ypan"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">ypan</span></code></a> transform
properties. These properties take an angle (between 0 and 360 degrees,
but angles outside that are clamped to that range). The angle is used to
pan the image horizontally or vertically by that amount. This makes it
possible to simulate a 360 degree panoramic image.</p>
</div>
<div class="section" id="id10">
<h3>Translations<a class="headerlink" href="#id10" title="Permalink to this headline"> link</a></h3>
<p>When generating a new project, all of the strings in the new game are
translated using translations taken from the launcher project.</p>
<p>A Vietnamese translation of the launcher and tutorial have been added
to Ren'Py. Thanks to Thuong Nguyen Huu for contributing it.</p>
<p>A Indonesian translation of the launcher and default project has been
added to Ren'Py. Thanks to Pratomo Asta Nugraha for contributing it.</p>
<p>Ren'Py can now automatically generate a piglatin translation for test
purposes.</p>
</div>
<div class="section" id="id11">
<h3>Other<a class="headerlink" href="#id11" title="Permalink to this headline"> link</a></h3>
<p>The new nvl_narrator character can be used to as the narrator
while in NVL-mode.</p>
<p>The define statement can be used to define variables that are also
Ren'Py keywords. For example, &quot;define menu = nvl_menu&quot; now works.</p>
<p>A <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> can now be given a <a class="reference internal" href="displayables.html#Borders" title="Borders"><code class="xref py py-func docutils literal notranslate"><span class="pre">Borders()</span></code></a> object, that
encapsulates the borders of a Frame into a single object. Borders
objects also have a padding field that can be passed into the new
<a class="reference internal" href="style_properties.html#style-property-padding"><code class="xref std std-propref docutils literal notranslate"><span class="pre">padding</span></code></a> style property.</p>
<p>Buttons, textbuttons, imagebuttons, and hotspots now take
<cite>selected</cite> and <cite>sensitive</cite> properties that directly control if the
button is selected or sensitive.</p>
<p>Buttons, textbuttons, imagebuttons, and hotspots take <cite>keysym</cite> and
<cite>alternate_keysym</cite> bindings, that make it possible to assign keys to the
buttons. When the given key is pressed, the action or alternate
action is run.</p>
<p>Ren'Py now supports extracting string translations from one project and
applying them to another project. The translations can also be applied in
reverse order, turning an English -&gt; Russian interface translation into
a Russian -&gt; English translation.</p>
<p>Viewports and vpgrids now support an arrowkeys property, that makes the
viewport scrollable using arrow keys and a controller d-pad.</p>
<p>Viewports and vpgrids now support horizontal scrolling via the mouse
wheel, by setting their <cite>mousewheel</cite> parameter to &quot;horizontal&quot;.</p>
<p>InputValues now take a returnable property, that causes their value to be
returned when enter is pressed.</p>
<p>Ren'Py support a <a class="reference internal" href="other.html#renpy.get_refresh_rate" title="renpy.get_refresh_rate"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_refresh_rate()</span></code></a> function, which returns the
referesh rate of the primary screen. This allows games using nearest neighbor
mode to move at a whole-pixel rate just like a Commodore 64 did.</p>
<p>Ren'Py can now automatically upload your game to itch.io, if
<a class="reference internal" href="build.html#var-build.itch_project"><code class="xref std std-var docutils literal notranslate"><span class="pre">build.itch_project</span></code></a> is set.</p>
<p>The <a class="reference internal" href="config.html#var-config.after_load_callbacks"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.after_load_callbacks</span></code></a> can be given callback functions
to run once a load has been completed.</p>
<p>The <a class="reference internal" href="config.html#var-config.tts_voice"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.tts_voice</span></code></a> variable has been added, to allow for a
platform-specific choice of text-to-speech voice to use.</p>
<p><a class="reference internal" href="config.html#var-config.quit_action"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.quit_action</span></code></a> now defaults to <code class="docutils literal notranslate"><span class="pre">Quit()</span></code>, which will display
the quit prompt over the in-game interface.</p>
<p>The <a class="reference internal" href="config.html#var-config.afm_voice_delay"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.afm_voice_delay</span></code></a> has been added, and allows a pause to
occur after the voice finishes in auto-forward mode, before advancing the
text.</p>
<p>The new &quot;video sprites&quot; <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> makes it possible to disable
video sprites (and use fallback images) on hardware too slow to support
them.</p>
<p>The progress indicator now can be accessed using the F2 key, in addition to
the Shift+Alt+P binding. The latter binding has been fixed to work reliably
on PC platforms.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-10">
<h2>Ren'Py 6.99.10<a class="headerlink" href="#ren-py-6-99-10" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id12">
<h3>Fixes<a class="headerlink" href="#id12" title="Permalink to this headline"> link</a></h3>
<p>This release contains multiple fixes to regressions that affected some, but not
all, players and creators. Upgrading from Ren'Py 6.99.9 is strongly recommended.</p>
<ul class="simple">
<li>Problems opening a DirectInput gamepad or joystick in exclusive mode could
prevent Ren'Py from starting.</li>
<li>A failure to preload a library prevented Ren'Py from starting on some
Android devices.</li>
</ul>
</div>
<div class="section" id="translation">
<h3>Translation<a class="headerlink" href="#translation" title="Permalink to this headline"> link</a></h3>
<p>This release features a new Greek translation of the launcher, contributed by
George Economidis.</p>
</div>
<div class="section" id="other-changes">
<h3>Other Changes<a class="headerlink" href="#other-changes" title="Permalink to this headline"> link</a></h3>
<p>The <a class="reference internal" href="screens.html#sl-input"><span class="std std-ref">input</span></a> widget now accepts
<a class="reference internal" href="screen_actions.html#input-values"><span class="std std-ref">input values</span></a> Input values allow an input to
directly update a variable, field, or dict, and also make it possible
to have multiple inputs displayed at the same time.</p>
<p>The new <code class="xref std std-propref docutils literal notranslate"><span class="pre">key_event</span></code> style property controls when events are
passed to the children of a button. This may need to be set to true
when a button controls the focus of an input value.</p>
<p>The new <a class="reference internal" href="screens.html#sl-vpgrid"><span class="std std-ref">vpgrid</span></a> widget combines aspects of a viewport
and a grid with more efficient rendering. Given the requirement that all
elements of the grid are the same size, only elements that are visible to
the player will be rendered.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">yesno_prompt</span></code> screen has been renamed to <code class="docutils literal notranslate"><span class="pre">confirm</span></code>, with the old
name being retained as an alias when a <a class="reference internal" href="screen_special.html#confirm-screen"><span class="std std-ref">confirm screen</span></a>
is not present.</p>
<p>A screen named <code class="docutils literal notranslate"><span class="pre">help</span></code> will now be used by the <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> action if
it exists.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">audio</span></code> channel has been changed to play only one sound at a time
while skipping through the game, to prevent a cacophony of sound while
the player skips.</p>
<p>The new <a class="reference internal" href="python.html#init-offset-statement"><span class="std std-ref">init offset</span></a> statement makes it
possible to apply a priority offset to statements that run at init
time, including <code class="docutils literal notranslate"><span class="pre">init</span></code>, <code class="docutils literal notranslate"><span class="pre">init</span> <span class="pre">python</span></code>, <code class="docutils literal notranslate"><span class="pre">define</span></code>, <code class="docutils literal notranslate"><span class="pre">default</span></code>,
<code class="docutils literal notranslate"><span class="pre">style</span></code>, and <code class="docutils literal notranslate"><span class="pre">transform</span></code>.</p>
<p>The default init priority of <code class="docutils literal notranslate"><span class="pre">image</span></code> statements has been changed from 990
to 500, so that larger offsets can be used with <a class="reference internal" href="python.html#init-offset-statement"><span class="std std-ref">init offset</span></a>
without sending their init priority out of the range -999 to 999.</p>
<p>The <cite>style_group</cite> ui property has been renamed to <cite>style_prefix</cite>, to make
its function more apparent. (The old name still works, for compatibility with
older code.) A new <cite>style_suffix</cite> ui property has been added, allowing
the same screen code to be reused with multiple style prefixes.</p>
<p>The <cite>style_prefix</cite> ui property may now be applied to transcluded blocks.</p>
<p>The new <a class="reference internal" href="screen_actions.html#GamepadExists" title="GamepadExists"><code class="xref py py-func docutils literal notranslate"><span class="pre">GamepadExists()</span></code></a> function and <a class="reference internal" href="screen_actions.html#GamepadCalibrate" title="GamepadCalibrate"><code class="xref py py-func docutils literal notranslate"><span class="pre">GamepadCalibrate()</span></code></a>
action expose gamepad detection and calibration to screen language.</p>
<p>The time required to take a screenshot has been reduced by decreasing the
compression level used.</p>
<p>The Android SDK downloaded by Ren'Py has been updated to r24.4.1.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-9">
<h2>Ren'Py 6.99.9<a class="headerlink" href="#ren-py-6-99-9" title="Permalink to this headline"> link</a></h2>
<p>Ren'Py's audio and movie playback support has been completely rewritten,
allowing for the addition of many features that would not have been possible
without this rewrite. These include:</p>
<ul class="simple">
<li><a class="reference internal" href="audio.html#partial-playback"><span class="std std-ref">Partial playback</span></a> of audio files, using a concise
notation. This allows the creator to specify start and end points, and
a loop point at which playback continues on the second and later
iterations. A similar notation can be used to queue silence.</li>
<li>A new default channel named <code class="docutils literal notranslate"><span class="pre">audio</span></code> has been added. Unlike the <code class="docutils literal notranslate"><span class="pre">sound</span></code>
channel, the audio channel supports playing back multiple audio files
simultaneously (limited by system performance).</li>
<li>The new <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> action can pause and unpause audio playback
as required.</li>
<li>The new <a class="reference internal" href="audio.html#renpy.music.get_pos" title="renpy.music.get_pos"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.music.get_pos()</span></code></a> and <a class="reference internal" href="audio.html#renpy.music.get_duration" title="renpy.music.get_duration"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.music.get_duration()</span></code></a>
functions return the curent playback position and total duration of
an audio channel, respectively. <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> can be
used to display these as the value of an animated bar.</li>
<li><a class="reference internal" href="movie.html#movie"><span class="std std-ref">Movie</span></a> playback now supports playing multiple movies at the
same time, provided all movies share the same framreate, and limited
by system performance.</li>
<li>Movies now loop seamlessly at the end of playback.</li>
<li>Ren'Py now supports movie sprites, which are sprites backed by two movies,
one containing color information and the other containing the alpha channel.
Movie sprites are a superior alternative to animated gifs, as modern movie
formats provided greater color depth and far superior compression. Movie
sprites are supported on all platforms, including mobile platforms,
subject to system performance.</li>
<li>Movies are no longer required to contain an audio track for synchonization.</li>
<li>It is now possible to play back a movie file on an audio channel, in which
case only the audio track is played.</li>
</ul>
<p>The <code class="docutils literal notranslate"><span class="pre">play</span></code> and <code class="docutils literal notranslate"><span class="pre">queue</span></code> statements now evaluate filename expressions
in the <a class="reference internal" href="audio.html#audio-namespace"><span class="std std-ref">audio namespace</span></a>, which makes it possible
to alias a short name to an audio file.</p>
<p>The default audio sample rate has been increased to 48 kilohertz,
which should produce a slight increase in audio quality.</p>
<p>Audio and movie playback support now uses ffmpeg 3.0, and support
for the VP9 video and Opus audio codecs has been added to the default
distributions. The Opus codec can automatically adjust to speech and music,
and should be considered by all creators.</p>
<div class="section" id="bug-fixes">
<h3>Bug Fixes<a class="headerlink" href="#bug-fixes" title="Permalink to this headline"> link</a></h3>
<p>A bug has been fixed that caused fullscreen windows to be displayed at
the wrong side on the Microsoft Windows platform when system-wide DPI
scaling is enabled.</p>
<p>The Drag.snap animation has been fixed.</p>
</div>
<div class="section" id="id13">
<h3>Other<a class="headerlink" href="#id13" title="Permalink to this headline"> link</a></h3>
<p>The new <a class="reference internal" href="config.html#var-config.speaking_attribute"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.speaking_attribute</span></code></a> variable can be used to
automatically apply an attribute to an image when a character
starts speaking, and to remove that attribute when the</p>
<p>Say statements with image attributes now respect <a class="reference internal" href="config.html#var-config.tag_layer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.tag_layer</span></code></a>.</p>
<p>This release includes experimental support for having an Android
package be converted into a Chrome application using the ARC welder
tool.</p>
<p>Unarchived directories are now a documented format that can be used
when building <a class="reference internal" href="build.html#packages"><span class="std std-ref">packages</span></a>.</p>
<p>Edgescrolling stops when the mouse leaves a viewport.</p>
<p>It is now possible to translate the prompts that occur when self-voicing
is enabled. A self-voicing debug mode can be accessed by typing
Shift+Alt+D.</p>
<p>The <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> action can now adjust the volume of non-standard
mixers.</p>
<p>There is now a new {alpha} text tag, which can control the alpha channel
of text on a character-by-character basis.</p>
<p>Images that are included using the {image} text tag are now aligned
using the usual placement rules. (That is, ypos, yoffset, and yanchor
now work if given when defining the image.)</p>
<p>The <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> action now takes a <cite>confirm</cite> argument, which asks
the player if they want to end the replay.</p>
<p>The new <a class="reference internal" href="screen_python.html#renpy.run" title="renpy.run"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.run()</span></code></a> function provides a documented way to run an
action or list of actions.</p>
<p>The sharpness of vertically-oriented text has been improved.</p>
<p>The <a class="reference internal" href="style_properties.html#style-property-adjust_spacing"><code class="xref std std-propref docutils literal notranslate"><span class="pre">adjust_spacing</span></code></a> style property is now avialable through
screen language.</p>
<p>The <cite>confirm</cite> argument of the <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> action now defaults to None,
which prompts the player to confirm a quit if and only if the player is
not at the main menu.</p>
<p>A new &quot;rollback side&quot; <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> allows Ren'Py to roll back when
the user touches a side of the screen. By default, this is the left side
on mobile platforms, and disabled on the dektop.</p>
<p>The <a class="reference internal" href="config.html#var-config.developer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.developer</span></code></a> now defaults to &quot;auto&quot;. When set to auto,
config.developer will be true during development, and false once the game
is being distributed.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-8">
<h2>Ren'Py 6.99.8<a class="headerlink" href="#ren-py-6-99-8" title="Permalink to this headline"> link</a></h2>
<div class="section" id="tags-layers-and-transforms">
<h3>Tags, Layers, and Transforms<a class="headerlink" href="#tags-layers-and-transforms" title="Permalink to this headline"> link</a></h3>
<p>The new <a class="reference internal" href="config.html#var-config.tag_layer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.tag_layer</span></code></a> variable makes it possible to specify the
default layer used by an image on a per image tag basis. This makes it
possible to place an image on its own layer without having to use onlayer.
The new <a class="reference internal" href="config.html#var-config.default_tag_layer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.default_tag_layer</span></code></a> variable specifies the default layer
for unknown tags.</p>
<p>The new <a class="reference internal" href="other.html#renpy.add_layer" title="renpy.add_layer"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.add_layer()</span></code></a> function provides as way to add a new
layer above or below the existing layers, if and only if the layer
does not already exist.</p>
<p>The new <a class="reference internal" href="config.html#var-config.tag_transform"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.tag_transform</span></code></a> variable makes it possible to specify a
default transform (or list of transforms) to use when a transform is not
provided as part of a show or scene statement.</p>
<p>The new <a class="reference internal" href="config.html#var-config.tag_zorder"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.tag_zorder</span></code></a> makes it possible to specify a default
zorder that's used for a tag when no other zorder is used.</p>
</div>
<div class="section" id="easing-functions">
<h3>Easing Functions<a class="headerlink" href="#easing-functions" title="Permalink to this headline"> link</a></h3>
<p>Thanks to Nyaatrap, Ren'Py now supports Robert Penner's easing functions
in ATL. These functions speed up and slow down interpolations (and in some
cases, can cause interpolations to overshoot their targets), in order to
provide more pleasing and natural motion.</p>
<p>The new easing functions are documented in the <a class="reference internal" href="atl.html#warpers"><span class="std std-ref">Warpers</span></a> section.</p>
</div>
<div class="section" id="side-images">
<h3>Side Images<a class="headerlink" href="#side-images" title="Permalink to this headline"> link</a></h3>
<p>New-style side image functionality (using images with the side tag) has been
overhauled. It's now possible to apply an ATL transform, and hence a transition,
whenever the side image changes. Different transforms can be used
in the case where the character changes and the case where it stays the same.</p>
<p>See the <a class="reference internal" href="side_image.html"><span class="doc">Side Images</span></a> section for complete documentation.</p>
</div>
<div class="section" id="pushmove-transitions">
<h3>PushMove Transitions<a class="headerlink" href="#pushmove-transitions" title="Permalink to this headline"> link</a></h3>
<p>A new type of transition - <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> - has been added to Ren'Py, along
with the <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> (or pushleft, pushtop, pushbottom)</p>
</div>
<div class="section" id="id14">
<h3>Other<a class="headerlink" href="#id14" title="Permalink to this headline"> link</a></h3>
<p>Fixed a major bug where Ren'Py would put an extra space at the end of each
text block. This could change the layout of text (and hence other portions of
the interface.) The fix reverts the change that added the space, causing it
to be smaller than in 6.99.7 (but the same size as 6.99.6 and before.)</p>
<p>Ren'Py now supports HighDPI (&quot;retina&quot;) displays on the Windows platform,
displaying text at the native screen resolution.</p>
<p>Ren'Py properly maximizes on most desktop platforms. (Everything Windows 7
and below, which have a start orb that can overlap the Ren'Py window.)</p>
<p>Added the <a class="reference internal" href="other.html#renpy.is_start_interact" title="renpy.is_start_interact"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.is_start_interact()</span></code></a>, which can be called in a
per_interact method to determine if this is the first pass through an
interaction (as opposed to a restarted interaction).</p>
<p>The new <a class="reference internal" href="other.html#renpy.maximum_framerate" title="renpy.maximum_framerate"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.maximum_framerate()</span></code></a> function increases the framerate
Ren'Py draws at for a given period of time. Ren'Py's Steam support
uses this to ensure the Steam overlay animates smoothly.</p>
<p>It's now possible to use the <a class="reference internal" href="preferences.html#var-config.default_music_volume"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.default_music_volume</span></code></a>,
<a class="reference internal" href="preferences.html#var-config.default_sfx_volume"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.default_sfx_volume</span></code></a>, and <a class="reference internal" href="preferences.html#var-config.default_voice_volume"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.default_voice_volume</span></code></a>
variables to set the default values of the various mixers.</p>
<p>The new <a class="reference internal" href="config.html#var-config.overlay_screens"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.overlay_screens</span></code></a> variable takes a list of screens
that are displayed whenever a pre-screens overlay would be displayed,
and hidden otherwise. This makes it easy to have a screen as a permanent
part of the in-game interface, even if the game can be entered from
multiple places (like a Replay).</p>
<p>Ren'Py now clears focus (causing unhover events to trigger) when the mouse
leaves the game window.</p>
<p>The hbox and vbox displayables now support the <a class="reference internal" href="style_properties.html#style-property-xminimum"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xminimum</span></code></a> and
<a class="reference internal" href="style_properties.html#style-property-yminimum"><code class="xref std std-propref docutils literal notranslate"><span class="pre">yminimum</span></code></a> style properties (and hence, <a class="reference internal" href="style_properties.html#style-property-xsize"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xsize</span></code></a>,
<a class="reference internal" href="style_properties.html#style-property-ysize"><code class="xref std std-propref docutils literal notranslate"><span class="pre">ysize</span></code></a>, <a class="reference internal" href="style_properties.html#style-property-xysize"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xysize</span></code></a>, and <a class="reference internal" href="style_properties.html#style-property-area"><code class="xref std std-propref docutils literal notranslate"><span class="pre">area</span></code></a> properties.)</p>
<p>The new <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> action makes it possible to play
a sample of a character's voice at that character's voice volume level.</p>
<p>The Extract Dialogue screen now includes a number of additional options.</p>
<p>The Traditional Chinese translation has been updated.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-7">
<h2>Ren'Py 6.99.7<a class="headerlink" href="#ren-py-6-99-7" title="Permalink to this headline"> link</a></h2>
<div class="section" id="dynamic-images">
<h3>Dynamic Images<a class="headerlink" href="#dynamic-images" title="Permalink to this headline"> link</a></h3>
<p>Dynamic images have been added to Ren'Py. It's now possible to write
code like:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">image</span> <span class="n">eileen</span> <span class="n">happy</span> <span class="o">=</span> <span class="s2">&quot;eileen [outfit] happy&quot;</span>
</pre></div>
</div>
<p>This code creates a displayable that interpolates the value of the
<code class="docutils literal notranslate"><span class="pre">output</span></code> variable at least once per interaction. The interpolated
string is then used to find another displayable to use.</p>
<p>Dynamic images can be used anywhere a displayable is expected, and the
string can be an string that resolves to a displayable. One possible use
might be to replace boring and repetitive condition switches in dress-up
games with code like:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">image</span> <span class="n">eileen</span> <span class="n">dressup</span> <span class="o">=</span> <span class="n">LiveComposite</span><span class="p">(</span>
<span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">600</span><span class="p">),</span>
<span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="s2">&quot;eileen_base.png&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="s2">&quot;eileen_top_[top].png&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="s2">&quot;eileen_bottom_[bottom].png&quot;</span><span class="p">,</span>
<span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="s2">&quot;eileen_accessory_[accessory].png&quot;</span><span class="p">,</span>
<span class="p">)</span>
</pre></div>
</div>
<p>Dynamic image can be used in a screen language add statement:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">item</span> <span class="k">in</span> <span class="n">inventory</span><span class="p">:</span>
<span class="k">add</span> <span class="s2">&quot;store_[item].png&quot;</span>
</pre></div>
</div>
<p>When so used, the variables are looked up in both the screen and global
scopes.</p>
</div>
<div class="section" id="define-improvements">
<h3>Define Improvements<a class="headerlink" href="#define-improvements" title="Permalink to this headline"> link</a></h3>
<p>The define statement can now be used to define config and persistent
variables. The code:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">define</span> <span class="n">config</span><span class="o">.</span><span class="n">screen_width</span> <span class="o">=</span> <span class="mi">1280</span>
<span class="k">define</span> <span class="n">config</span><span class="o">.</span><span class="n">screen_height</span> <span class="o">=</span> <span class="mi">720</span>
</pre></div>
</div>
<p>Now works as expected. Persistent variables work in an idiosyncratic way,
as the code:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">define</span> <span class="n">persistent</span><span class="o">.</span><span class="n">unlocked_endings</span> <span class="o">=</span> <span class="p">[</span> <span class="p">]</span>
</pre></div>
</div>
<p>Will only set the unlocked_endings variable if it has not already been
set.</p>
</div>
<div class="section" id="android-ios">
<h3>Android/iOS<a class="headerlink" href="#android-ios" title="Permalink to this headline"> link</a></h3>
<p>The android SELECT key present on remote controls is now supported
for advancing text and selecting buttons, bars, etc. This means most
TV-based android consoles should be supported.</p>
<p>Direct support for the OUYA console has been dropped. The console should
still be supported as a general TV-based android console.</p>
<p>The new <a class="reference internal" href="config.html#var-config.save_on_mobile_background"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.save_on_mobile_background</span></code></a> and <a class="reference internal" href="config.html#var-config.quit_on_mobile_background"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.quit_on_mobile_background</span></code></a>
make it possible to adopt various strategies to deal with an Android or
iOS app losing focus.</p>
<p>To help apps comply with an Apple policy on the purchase of money cheats,
consumable in-app purchases have been added for iOS only.</p>
</div>
<div class="section" id="id15">
<h3>Other<a class="headerlink" href="#id15" title="Permalink to this headline"> link</a></h3>
<p>Unknown gamepads can be calibrated from the Shift+G menu.</p>
<p>The new <a class="reference internal" href="config.html#var-config.replace_text"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.replace_text</span></code></a> callback makes it possible to replace
text with other text. For example, one can replace multiple dashes with
en-dash or em-dash characters.</p>
<p>If a screen named <code class="docutils literal notranslate"><span class="pre">skip_indicator</span></code> is present, it will be displayed
instead of the default skip indicator.</p>
<p>In the launcher, pressing F5 will launch the current project.</p>
<p>Skipping is now disabled when leaving a Replay.</p>
<p>Creator-defined statements can now return statements to be predicted.</p>
<p>The Finnish and Traditional Chinese translations have been updated.</p>
<p>The new <a class="reference internal" href="style_properties.html#style-property-adjust_spacing"><code class="xref std std-propref docutils literal notranslate"><span class="pre">adjust_spacing</span></code></a> style property has been added. It
controls if the spacing of drawable-resolution text is adjusted to match
the spacing of viewable-resolution text. Setting this to False can prevent
kerning from changing after extend, but requires the GUI be designed
to adjust to the changing text size. To prevent obvious artifacts, this
is set to False for input text.</p>
<p>The following bugs have been fixed:</p>
<ul class="simple">
<li>A problem with script backups when the user has a non-ASCII username.</li>
<li>If a screen was predicted with multiple arguments, that screen would only
be predicted once for the purpose of image prediction.</li>
<li>On Mac OS X, if the Ren'Py window was covered or offscreen, VSYNC would
fail and CPU usage would rise to 100%. (Ren'Py now detects failed VSYNC
and limits its own framerate.)</li>
<li>Subsurfacing a clipped surface would not work, manifesting in incorrect
rendering of scrollbars in several of the default themes.</li>
<li>It was hard to pick a theme in the launcher.</li>
<li>When a window was scaled, hyperlinks would react to the mouse in incorrect
positions.</li>
<li>Window show now used narrator to render the empty window. It also had problems
with characters defined in the character namespace.</li>
<li>Newlines surrounding certain text tags would not be rendered.</li>
<li>Underlines could have small spaces in them when the window was scaled.</li>
<li>Problems with the software renderer on various hardware.</li>
<li>A problem where lint would not recognize an image name with reordered
attributes in the scene statement.</li>
<li>A crash when merging achievements from multiple instances of a game.</li>
<li>Having multiple text blocks, all with at least one hyperlink,
could cause hyperlinks to be higlighted incorrectly.</li>
<li>Various documentation problems.</li>
</ul>
</div>
</div>
<div class="section" id="ren-py-6-99-6">
<h2>Ren'Py 6.99.6<a class="headerlink" href="#ren-py-6-99-6" title="Permalink to this headline"> link</a></h2>
<div class="section" id="highdpi-retina">
<h3>HighDPI/Retina<a class="headerlink" href="#highdpi-retina" title="Permalink to this headline"> link</a></h3>
<p>Support for HighDPI/Retina displays has been added to Ren'Py. This support
is automatically used when running on iOS or Mac OS X systems that have a
retina display.</p>
<p>On all platforms, Ren'Py now renders text at the display resolution, rather
than the resolution the game was set to. The result is that text remains
sharp even when upscaled significantly. Creators should be aware that due
to variability in character size and kerning, this can cause changes in
text layout and word wrap as the window is scaled.</p>
<p>To get the greatest benefit from these changes, the included copy of
DejaVuSans has been updated to version 2.35, and the DejaVuSans-Bold
font has been added. The bold font will automatically be used when
a bold version of DejaVuSans.ttf is requested.</p>
</div>
<div class="section" id="gamepad">
<h3>Gamepad<a class="headerlink" href="#gamepad" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now uses the SDL2 controller API to support gamepads. This API
provides a standardized mapping of controller buttons to something
similar to an Xbox controller.</p>
</div>
<div class="section" id="backups">
<h3>Backups<a class="headerlink" href="#backups" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py will now automatically back up .rpy files that are part of
changed games. These backups will be placed in the same system-specific
location that save files are placed.</p>
</div>
<div class="section" id="id16">
<h3>Other Improvements<a class="headerlink" href="#id16" title="Permalink to this headline"> link</a></h3>
<p>A new <a class="reference internal" href="achievement.html#achievement.sync" title="achievement.sync"><code class="xref py py-func docutils literal notranslate"><span class="pre">achievement.sync()</span></code></a> function and <a class="reference internal" href="achievement.html#achievement.Sync" title="achievement.Sync"><code class="xref py py-class docutils literal notranslate"><span class="pre">achievement.Sync</span></code></a> action
have been added to Ren'Py. These synchronize achivements between local
storage and other backends, such as Steam.</p>
<p>A major bug in scanning archive files has been fixed. This bug often
manifested as an archived images/ directory not being scanned some,
but potentially not all, of the time. We strongly recommend upgrading from
6.99.5 if your game uses and archives the images/ directory.</p>
<p>If a file is not found in the game directory, Ren'Py will search the
images/ directory for that file. This behavior is controlled by
the <code class="xref std std-var docutils literal notranslate"><span class="pre">config.search_path</span></code> variable.</p>
<p>Screens now take the <cite>style_group</cite> property, which was previously only
allowed on displayable statements.</p>
<p>Screen language statements now take <cite>arguments</cite> and <cite>properties</cite> properties,
which allows statement to be passed a list of additional positional arguments and
a dict of additional properties, respectively.</p>
<p>The new <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> class allows conversion between color spaces and other
color-theory operations.</p>
<p>Ren'Py now supports a game/python-packages directory, which can be used
with pure-python packages installed via pip. See the new <a class="reference internal" href="python.html#python-modules"><span class="std std-ref">First and Third-Party Python Modules and Packages</span></a>
documentation for more details.</p>
<p>Renios now supports compiling for 32-bit simulators (for the iPhone 4 and 5).</p>
<p>The Korean and Russian translations have been improved.</p>
<p>A pause will now automatically end when auto-forward mode is enabled.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-5">
<h2>Ren'Py 6.99.5<a class="headerlink" href="#ren-py-6-99-5" title="Permalink to this headline"> link</a></h2>
<div class="section" id="startup">
<h3>Startup<a class="headerlink" href="#startup" title="Permalink to this headline"> link</a></h3>
<p>Much work has been done to reduce Ren'Py's startup time, especially on mobile
platforms such as Android and iOS. This was largely accomplished by caching the
results of transforms, analyses, and code compilation so less work is done
when the game is unchanged. To take full advantage of this, perform a
'Full Recompile' of your project from the front screen of the Ren'Py
launcher.</p>
<p>The desktop presplash code has been rewritten to use pygame_sdl2, and is now
also faster.</p>
<p>A new <a class="reference internal" href="config.html#var-config.minimum_presplash_time"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.minimum_presplash_time</span></code></a> has been added. This ensures that
the desktop presplash, android presplash, and iOS launchscreen are displayed
for at least a certain amount of time, making them more useful for branding
purposes.</p>
<p>As part of this work, script_version.rpy and script_version.rpyc will no
longer be added to packages. Instead, script_version.txt will be added.
(This ensures that the script does not change as part of packaging.)
In addition, bytecode.rpyb has been moved to the game/cache directory,
where addditional cache files now join it.</p>
</div>
<div class="section" id="ios">
<h3>iOS<a class="headerlink" href="#ios" title="Permalink to this headline"> link</a></h3>
<p>There have been a number of improvements to renios, some necessary to get
Ren'Py games accepted on the Apple App Store. Nightly builds of 6.99.5 have
been used to get multiple games accepted.</p>
<p>Renios has been upgraded to use SDL 2.0.4 rc1. This improves compatibility
with iOS 8, and makes it possible to keep the launchscreen displayed until
Ren'Py fully starts. As a result, support for the ios-presplash image is no
longer necessary, and has been dropped.</p>
</div>
<div class="section" id="id17">
<h3>Other Improvements<a class="headerlink" href="#id17" title="Permalink to this headline"> link</a></h3>
<p>A Simplified Chinese translation of the template game has been added, and
the Korean and Arabic translations have been updated.</p>
<p>ATL has had an update event added. This event is called in rare (but possible)
cases when a screen is re-created from scratch, such as after a load or when
styles or translations are changed.</p>
<p><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> and <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> actions have been added, along with
a new &quot;all mute&quot; <code class="xref py py-func docutils literal notranslate"><span class="pre">Preferences()</span></code> that mutes all mixers.</p>
<p>Font hinting is now controllable using the <a class="reference internal" href="style_properties.html#style-property-hinting"><code class="xref std std-propref docutils literal notranslate"><span class="pre">hinting</span></code></a> style property.</p>
<p>The <a class="reference internal" href="config.html#var-config.nearest_neighbor"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.nearest_neighbor</span></code></a> variable configures Ren'Py to draw all
images using nearest-neighbor interpolation by default, helping ensure that
pixel art stays sharp when scaled up.</p>
<p>The new <a class="reference internal" href="other.html#renpy.predicting" title="renpy.predicting"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.predicting()</span></code></a> function returns true if Ren'Py is running
a screen for prediction purposes.</p>
<p>The new <a class="reference internal" href="statement_equivalents.html#renpy.return_statement" title="renpy.return_statement"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.return_statement()</span></code></a> function is a Python equivalent to
the Ren'Py return statement.</p>
<p>The new <a class="reference internal" href="store_variables.html#var-_dismiss_pause"><code class="xref std std-var docutils literal notranslate"><span class="pre">_dismiss_pause</span></code></a> and <a class="reference internal" href="store_variables.html#var-_skipping"><code class="xref std std-var docutils literal notranslate"><span class="pre">_skipping</span></code></a> variables make it possible to
control pauses and skipping on a line-by-line basis.</p>
<p>Canvas objects (returned by the Render.canvas() method) now have a
get_surface() method that returns a pygame_sdl2 Surface that is in a format
that can be used by Ren'Py. This surface can be manipulated by Pygame
drawing operations.</p>
<p>The new <a class="reference internal" href="voice.html#_get_voice_info" title="_get_voice_info"><code class="xref py py-func docutils literal notranslate"><span class="pre">_get_voice_info()</span></code></a> function returns an object that contains information
about the voicing associated with the currently-running say statement.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-4">
<h2>Ren'Py 6.99.4<a class="headerlink" href="#ren-py-6-99-4" title="Permalink to this headline"> link</a></h2>
<p>The Ren'Py script language now includes a new <a class="reference internal" href="python.html#default-statement"><span class="std std-ref">default statement</span></a>.
This statement sets a variable to a value a default value at game start or load,
if a default statement has not set the value of the variable in the current
game. This makes it possible to initialize saved variables near the relevant
code, rather than all at once at label start.</p>
<p>Lint will now warn if a <code class="docutils literal notranslate"><span class="pre">define</span></code> or <code class="docutils literal notranslate"><span class="pre">default</span></code> statement redefines a
Ren'Py or Python built-in name.</p>
<p>The screen language <a class="reference internal" href="screens.html#sl-use"><span class="std std-ref">use statement</span></a> now takes a block, which
can be transcluded into a screen using the <code class="docutils literal notranslate"><span class="pre">transclude</span></code> statement. This makes
it possible to use statements to &quot;wrap&quot; a block of screen language code.</p>
<p>The screen language also supports <a class="reference internal" href="screen_python.html#creator-defined-sl"><span class="std std-ref">creator-defined statements</span></a>,
which are transformed into use statements. These make it possible to extend the
screen language syntax.</p>
<p>The new Render.place() is available for use in <a class="reference internal" href="cdd.html#cdd"><span class="std std-ref">creator-defined displayables</span></a>.
This method renders a displayable, then applies Ren'Py's layout algorthing to place
that displayable within a containing rectangle.</p>
<p>Ren'Py now logs errors importing the steam module to log.txt.</p>
<p>Ren'Py now logs the duration of various parts of the init process to log.txt.</p>
<p>On mobile, Ren'Py will wait until the start of the first interaction
before creating the main window. This prevents a black screen from being
displayed for some time as Ren'Py starts.</p>
<p>There are a number of improvements to iOS support, to support passing Apple's
package verification process.</p>
<p>The launcher now includes a button to retrieve logcat information from an
Android device.</p>
<p>The launcher now checks that the version of rapt and renios match the version
of Ren'Py proper.</p>
<div class="section" id="id18">
<h3>Fixes<a class="headerlink" href="#id18" title="Permalink to this headline"> link</a></h3>
<p>Fixed a performance problem caused by failing to release the Global Interpreter
Lock while waiting for event input. This could cause problems running various
background threads, like the image preloader and autosave.</p>
<p>Ensured that screens are only analyzed once as the game starts. Previously,
screens could be analyzed multiple times as the styles and languages were
set, leading to excessive startup times, especially on mobile platforms.</p>
<p>The volume curve has been changed to be more correct and perceptually
accurate. The previous curve had serveral problems, most notably that
is sharply jumped from 0 to 10%. This may require players to adjust their
volume settings.</p>
<p>The gallery slideshow timer now repeats through multiple images.</p>
<p>Text blits are now expanded to include an outline on a descender on the
bottom row of text.</p>
<p>Drags outside of a draggroup can now be snapped into place.</p>
<p>The Gallery now properly advances through locked and unlocked images.
Previously, this advancing was reversed, so next_unlocked would advance
through locked and unlocked images.</p>
<p>Text accounts for the size of outlines when allocating textures, preventing
the bottom line of outlines from being cut off.</p>
<p>Position information (xpos, ypos, etc.) are now passed from an inner transform
to an outer transform during as single frame. Previously, this information
would lag by a single frame, which could lead to nested transforms lagging
or failing to complete.</p>
</div>
</div>
<div class="section" id="ren-py-6-99-3">
<h2>Ren'Py 6.99.3<a class="headerlink" href="#ren-py-6-99-3" title="Permalink to this headline"> link</a></h2>
<p>Removed debugging code that could cause problems by writing an unnecessary
zipfile.txt file.</p>
</div>
<div class="section" id="ren-py-6-99-2">
<h2>Ren'Py 6.99.2<a class="headerlink" href="#ren-py-6-99-2" title="Permalink to this headline"> link</a></h2>
<p>Ren'Py now supports an images directory underneath the game directory.
Images found inside this directory or in subdirectories of this directory will
be automatically defined as images in Ren'Py. This will likely render the use of
the image statement obsolete in simple games.</p>
<p>The new <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> displayable allows one displayable to be masked by the alpha
channel of another.</p>
<p>The android and iOS emulators now emulate the onscreen keyboard.</p>
<p>The achievement API has been changed somewhat, but only with respect for
progress functions. (Which were broken in the previous releases.)</p>
<p>Actions that care about the current screen (like SetScreenVariable) now work
when used with the hovered and unhovered properties.</p>
<p>The updater has improved. If an incremental download fails, Ren'Py will try
downloading the complete file before giving up.</p>
<p>When building for Android, Ren'Py will copy the apk files in to the dists
directory used by the desktop platforms.</p>
<p>Added the <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> action.</p>
<p>Added the <a class="reference internal" href="other.html#renpy.reset_physical_size" title="renpy.reset_physical_size"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.reset_physical_size()</span></code></a> and <code class="xref py py-func docutils literal notranslate"><span class="pre">ui.screen_id()</span></code> functions.</p>
<p>Allowed the screen language key statement to take the activate_sound style
property. This makes it easier to play a sound when a key is pressed.</p>
<p>Documented <a class="reference internal" href="screen_python.html#ui.interact" title="ui.interact"><code class="xref py py-func docutils literal notranslate"><span class="pre">ui.interact()</span></code></a>.</p>
<p>Updated the Simplified Chinese and Korean translations, and the Italian template.</p>
</div>
<div class="section" id="ren-py-6-99-1">
<h2>Ren'Py 6.99.1<a class="headerlink" href="#ren-py-6-99-1" title="Permalink to this headline"> link</a></h2>
<p>Added the <a class="reference internal" href="cdd.html#renpy.load_image" title="renpy.load_image"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.load_image()</span></code></a>, <a class="reference internal" href="cdd.html#renpy.load_surface" title="renpy.load_surface"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.load_surface()</span></code></a>, and
<a class="reference internal" href="displaying_images.html#renpy.get_showing_tags" title="renpy.get_showing_tags"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_showing_tags()</span></code></a> functions.</p>
</div>
<div class="section" id="ren-py-6-99">
<h2>Ren'Py 6.99<a class="headerlink" href="#ren-py-6-99" title="Permalink to this headline"> link</a></h2>
<div class="section" id="sdl2">
<h3>SDL2<a class="headerlink" href="#sdl2" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py is now based on Pygame_SDL2, a reimplementation of the Pygame API
based on the SDL2 library. One of the largest changes in Ren'Py's history,
switching to SDL2 lays the groundwork for many improvements, in this
and future releases.</p>
</div>
<div class="section" id="ios-support">
<h3>iOS Support<a class="headerlink" href="#ios-support" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now supports the iOS platform. To develop for iOS, you will need a
Macintosh computer, Xcode, and a paid membership in the iOS developer
program. (An iPad or iPhone to test with is highly recommended.)</p>
<p>Ren'Py's iOS support includes the ability to create Xcode projects, and
to update those projects with the latest version of a Ren'Py game. Xcode
can be used to change project settings, and to create debug and release
builds.</p>
<p>The iOS port supports iOS 7 and higher. Almost all of Ren'Py is supported,
with the exception being that video playback is limited to fullscreen video
in formats the iOS device supports.</p>
<p>For now, the default set of Ren'Py screens are not particularly compatible
with iOS. You will need to customize your game to make it touch friendly and
compliant with Apple's guidelines before submitting it to the iOS app store.</p>
<p>Please see the iOS documentation for more information and a copyright
notice you must include as part of your app description on iOS.</p>
</div>
<div class="section" id="android-support">
<h3>Android Support<a class="headerlink" href="#android-support" title="Permalink to this headline"> link</a></h3>
<p>Android support has been rewritten, and is now based in SDL2. This release
brings Android support to parity with desktop platforms. Improvements
include:</p>
<ul class="simple">
<li>Support for rotating the screen to match the user's preferred orientation.</li>
<li>Improved in-app purchase support, with the ability to retrieve prices and
create a single .apk that supports the Google and Amazon stores.</li>
<li>Android audio playback is now based on the same code that's used on
the desktop and iOS platforms. This enables support for features like
panning and fading volume. It also means the same sound files can be
used on Android, iOS, and desktop platforms.</li>
<li>Keyboard input is now supported on Android.</li>
<li>Languages requiring bidirectional text (like Arabic and Hebrew) are supported
on Android.</li>
</ul>
<p>A number of issues with Android support have been fixed, including one that
prevented Ren'Py from unzipping the android SDK automatically when the path
to the Ren'Py install was too long.</p>
<p>Please see the Android documentation for more information and a copyright
notice that should be included as part of your app description.</p>
</div>
<div class="section" id="steam">
<h3>Steam<a class="headerlink" href="#steam" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now ships with Python bindings for the steam API. These bindings
are built as part of the Ren'Py build process, which means they will be
maintained alongside Ren'Py going forwards.</p>
<p>For an explanation of how to use the Steam API, please contact the Ren'Py
developers directly. The bindings make available:</p>
<ul class="simple">
<li>Initialization.</li>
<li>User statistics and achievements.</li>
<li>Retrieving other apps by the same developer that have been installed.</li>
<li>DLC support.</li>
<li>The in-game overlay, including the ability to launch a purchase flow.</li>
<li>Session tickets.</li>
</ul>
<p>The steam bindings will be integrated with Ren'Py as appropriate. For now,
this integration consists of binding the steam achievement system to the new
Ren'Py achievement API.</p>
</div>
<div class="section" id="distribution-improvements">
<h3>Distribution Improvements<a class="headerlink" href="#distribution-improvements" title="Permalink to this headline"> link</a></h3>
<p>The launcher now has the ability to add from clauses to call statements,
automatically turning:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">call</span> <span class="n">dayplanner</span>
</pre></div>
</div>
<p>into:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">call</span> <span class="n">dayplanner</span> <span class="kn">from</span> <span class="nn">__call_dayplanner</span>
</pre></div>
</div>
<p>From clauses, which are really labels, help Ren'Py to find the return
site to use when a game is changed. This should help fix problem with games
that may change greatly between releases.</p>
<p>When asked to package a game that is more than about 2GB in size, Ren'Py
will produce a ZIP64-format archive. These archives may be less compatible
that smaller zip files.</p>
</div>
<div class="section" id="languages-and-translations">
<h3>Languages and Translations<a class="headerlink" href="#languages-and-translations" title="Permalink to this headline"> link</a></h3>
<p>There is now a Russian translation of the tutorial game, and a Finnish
translation of the launcher.</p>
<p>Ren'Py supports input methods (IMEs) on platforms where SDL2 makes that
support available. (All platforms except for Linux.) Input methods make
it possible to input complex non-ASCII text, such as Chinese, Japanese,
and Korean.</p>
</div>
<div class="section" id="clipboard-voicing">
<h3>Clipboard Voicing<a class="headerlink" href="#clipboard-voicing" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now supports clipboard voicing, which is accessed by Shift+C.</p>
<p>Clipboard voicing is a form of self-voicing that works by copying the
text to the clipboard, where a screenreader program is likely to read
it using settings preferred by the player.</p>
</div>
<div class="section" id="custom-text-tags">
<h3>Custom Text Tags<a class="headerlink" href="#custom-text-tags" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py snow supports a new form of <a class="reference internal" href="custom_text_tags.html"><span class="doc">custom text tags</span></a>.</p>
<p>Custom text tags are applied after the text has been tokenized into tags and
text. This makes it easier to write a custom text tag that manipulates text
or applies multiple existing text tags to text.</p>
<p>The previously-existing form of custom text tag has been renamed to
style text tag, and is still supported.</p>
</div>
<div class="section" id="id19">
<h3>Other Improvements<a class="headerlink" href="#id19" title="Permalink to this headline"> link</a></h3>
<p>A high-level achievement API has been added to Ren'Py.</p>
<p>Ren'Py now includes support for recognizing touch gestures on Android and
iOS.</p>
<p>It is possible to hide the editing buttons in the launcher, so they can't
be used to open an absurd number of editor windows.</p>
<p>The developer can choose if strings should be empty when generating
translations.</p>
<p>Three new set manipulation actions <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>, <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>,
and <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> manipulate sets and lists-as-sets. (Such
as inventory lists.)</p>
<p>Drags (as in, drag-and-drop) now supports the <a class="reference internal" href="style_properties.html#style-property-focus_mask"><code class="xref std std-propref docutils literal notranslate"><span class="pre">focus_mask</span></code></a> style property.</p>
<p>The complexity of the style system has been reduced, decreasing memory
usage and startup time.</p>
<p>The new <a class="reference internal" href="save_load_rollback.html#renpy.suspend_rollback" title="renpy.suspend_rollback"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.suspend_rollback()</span></code></a> suspends the recording of rollback
checkpoints, while still allowing rollback to occur.</p>
<p>The RENPY_GL_CHECK_ERRORS controlls the logging of OpenGL/ANGLE function
calls and errors.</p>
<p>A completion progress indicator can be toggled by typing Shift+Alt+P or
swiping up-down-left-right-left-right.</p>
<p>As of this release, dictionary and set comprehensions are wrapped to
support rollback.</p>
</div>
</div>
<div class="section" id="ren-py-6-18-3">
<h2>Ren'Py 6.18.3<a class="headerlink" href="#ren-py-6-18-3" title="Permalink to this headline"> link</a></h2>
<p>This release adds the <a class="reference internal" href="screens.html#sl-showif"><span class="std std-ref">showif statement</span></a> to screen language.
The showif statement shows and hides its children based on a condition. When
its children are ATL transforms, showif delivers ATL events to manage the
show and hide process.</p>
<p>Ren'Py's image prediction mechanism now models the return stack, and can
predict images through a call and return pair. Previously, a call followed
by a return would block image prediction.</p>
<p>Ren'Py now predicts that the start label will be called from the main menu.
This will help to avoid unpredicted image loads at the very start of a game.</p>
<p>The ATL on statement now can take a comma-separated list of event names.</p>
<p>The new <a class="reference internal" href="updater.html#updater.UpdateVersion" title="updater.UpdateVersion"><code class="xref py py-func docutils literal notranslate"><span class="pre">updater.UpdateVersion()</span></code></a> function contacts an update server and
determines if an update is available.</p>
<p>The new <a class="reference internal" href="other.html#renpy.invoke_in_thread" title="renpy.invoke_in_thread"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.invoke_in_thread()</span></code></a> function runs a function in a background
thread, and restarts the interaction when that thread finishes.</p>
<p>While in self-voicing mode, the {w} and {p} tags are ignored.</p>
<p>The Traditional Chinese and Russian translations have been updated.</p>
<div class="section" id="id20">
<h3>Bug Fixes<a class="headerlink" href="#id20" title="Permalink to this headline"> link</a></h3>
<p>Fixed a regression that could cause hiding transforms to skip time.</p>
<p>Fixed a bug that would cause the screen language if statement to show
children from blocks with a false condition, if those child blocks were
run during prediction.</p>
<p>Fixed an issue where SetScreenVariable and ToggleScreenVariable were
declared as pure functions, but weren't. They now have been reimplemented
as pure functions.</p>
<p>Fixed an issue where a grab could fail to transfer between interactions,
leaving Ren'Py unresponsive.</p>
</div>
</div>
<div class="section" id="ren-py-6-18-2">
<h2>Ren'Py 6.18.2<a class="headerlink" href="#ren-py-6-18-2" title="Permalink to this headline"> link</a></h2>
<p>The define statement can now take a store name, and the say statement
will search the <code class="docutils literal notranslate"><span class="pre">character</span></code> store before searching the default store.
This means that if one uses:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">define</span> <span class="n">character</span><span class="o">.</span><span class="n">e</span> <span class="o">=</span> <span class="n">Character</span><span class="p">(</span><span class="s2">&quot;Eileen&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>Say statements like:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="s2">&quot;Hello, world.&quot;</span>
</pre></div>
</div>
<p>will continue to work, even though <code class="docutils literal notranslate"><span class="pre">e</span></code> has been freed up for other
purposes.</p>
<p>The default image cache size (set in <a class="reference internal" href="config.html#var-config.image_cache_size"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.image_cache_size</span></code></a>) has
been increased from 8 to 16 screens worth of images.</p>
<p>When set to True, the new <a class="reference internal" href="atl.html#transform-property-crop_relative"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">crop_relative</span></code></a> transform property tells
a Transform to interpret float components of its <a class="reference internal" href="atl.html#transform-property-crop"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">crop</span></code></a> property
relative to the width or height of its transformed child, as appropriate.
For example, (0.5, 0.0, 0.5, 1.0) will cropout the lower-right quadrant
of the child.</p>
<p>When set to false, the new <a class="reference internal" href="style_properties.html#style-property-keyboard_focus"><code class="xref std std-propref docutils literal notranslate"><span class="pre">keyboard_focus</span></code></a> style property hides
buttons, bars, and imagemap hotspots from the keyboard focus mechanism.</p>
<p>The <a class="reference internal" href="screens.html#mousearea"><span class="std std-ref">Mousearea</span></a> screen language statement now respects the
<a class="reference internal" href="style_properties.html#style-property-focus_mask"><code class="xref std std-propref docutils literal notranslate"><span class="pre">focus_mask</span></code></a> style property, making it possible to have
non-rectangular mouseareas.</p>
<p>Ren'Py now includes functions that can be used to profile
the memory consumption of a game, including the memory consumption of
Ren'Py itself. These functions are <a class="reference internal" href="other.html#renpy.profile_memory" title="renpy.profile_memory"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.profile_memory()</span></code></a> and
<a class="reference internal" href="other.html#renpy.diff_memory" title="renpy.diff_memory"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.diff_memory()</span></code></a>. The new <a class="reference internal" href="other.html#renpy.profile_rollback" title="renpy.profile_rollback"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.profile_rollback()</span></code></a>
lets one more specifically see the memory consumption of the internal
rollback log.</p>
<p>When self-voicing mode is enabled, Ren'Py displays a notification that
explains how to disable self-voicing mode.</p>
<p>This release fixes a subtle bug caused by incorrect analysis of for
loops in screen language screens, when the iteration variable is a
constant. (For example, when the iteration variable is <code class="docutils literal notranslate"><span class="pre">define</span></code>ed
somewhere else in the game.)</p>
<p>This release adds Traditional Chinese translations of the launcher and
template game, contributed by Civalin.</p>
</div>
<div class="section" id="ren-py-6-18-1">
<h2>Ren'Py 6.18.1<a class="headerlink" href="#ren-py-6-18-1" title="Permalink to this headline"> link</a></h2>
<p>This release includes a new <a class="reference internal" href="displayables.html#Placeholder" title="Placeholder"><code class="xref py py-func docutils literal notranslate"><span class="pre">Placeholder()</span></code></a> displayable, which can be
used to display placeholder characters. Placeholders are now used when
displaying images that are not defined.</p>
<p>The new <code class="xref std std-var docutils literal notranslate"><span class="pre">sv</span></code> Character-like object can be used when self-voicing is
enabled to display (and hence speak) descriptive text.</p>
<p>ATL transforms in screens now begin executing when first shown. Previously, ATL transforms
began executing when the screen containing the ATL transform was first shown,
which meant that if the transform changed over the course of screen display,
a portion of the new transform would be skipped.</p>
<p>This release includes a German template contributed by NoJoker.</p>
</div>
<div class="section" id="ren-py-6-18">
<h2>Ren'Py 6.18<a class="headerlink" href="#ren-py-6-18" title="Permalink to this headline"> link</a></h2>
<div class="section" id="screen-language-improvements">
<h3>Screen Language Improvements<a class="headerlink" href="#screen-language-improvements" title="Permalink to this headline"> link</a></h3>
<p>This release includes a new implementation of screen language that has the
potential to be much faster than the original implementation of screen language.
Where the original screen language evaluated screens from scratch at the start
of each interaction, this new implementation can incrementally reuse large
portions of a screen between interactions. Please see the new
<a class="reference internal" href="screen_optimization.html"><span class="doc">Screen Language Optimization</span></a> documentation for
information on how to maximize screen language performance.</p>
<p>Of special note is that screens now perform better when defined with a parameter
list. Screens that do not expect parameters should be defined with an empty
parameter list.</p>
<p>To support improved optimization, when the screen language use statement
calls a screen with a parameter list, only variables in that parameter list
are updated. (This is a change in previously-undocumented behavior.)</p>
<p>Screens now support passing properties to a displayable from within an if
statement, provided the if statement is the first thing inside the
displayable. For example:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">text</span> <span class="s2">&quot;Eileen&quot;</span><span class="p">:</span>
<span class="k">if</span> <span class="n">eileen_mad</span><span class="p">:</span>
<span class="na">color</span> <span class="s2">&quot;#fcc&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="na">color</span> <span class="s2">&quot;#cfc&quot;</span>
</pre></div>
</div>
<p>now works.</p>
<p>As there is now a larger benefit from predicting screens, screen prediction
has been improved in several ways:</p>
<ul class="simple">
<li>By default, Ren'Py will now use the arguments supplied to a screen in
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 to predict the
screen. This is potentially dangers, as it means that if either statement
has side effects, those side effects will occur as part of screen prediction.
To mitigate this problem, both statements now take a <code class="docutils literal notranslate"><span class="pre">nopredict</span></code> clause
that prevents screen prediction.</li>
<li>Ren'Py will now attempt to predict images inside if clauses that would
not be taken, and will ignore errors that occur during statement prediction.</li>
<li>A pair of functions, <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> and
<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> allows for manual prediction of time
images that will be used by screens, including parameterized screens.</li>
</ul>
<p>Ren'Py now supports profiling of screens, via the <a class="reference internal" href="screen_optimization.html#renpy.profile_screen" title="renpy.profile_screen"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.profile_screen()</span></code></a>
function.</p>
<p>Ren'Py has been changed to make a copy of the screens being displayed before
a transition occurs. This makes it possible to use a transition to show
screen updates. For example, one could increase the value displayed
by a bar, and then use the dissolve transition to dissolve in the new
segment of bar.</p>
</div>
<div class="section" id="image-prediction">
<h3>Image Prediction<a class="headerlink" href="#image-prediction" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now has a supported mechanism for manually predicting images in
cases where automatic image prediction fails. This mechanism consists
of two functions: <a class="reference internal" href="displaying_images.html#renpy.start_predict" title="renpy.start_predict"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.start_predict()</span></code></a> starts prediction of images,
while <a class="reference internal" href="displaying_images.html#renpy.stop_predict" title="renpy.stop_predict"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.stop_predict()</span></code></a> stops prediction.</p>
</div>
<div class="section" id="accessibility">
<h3>Accessibility<a class="headerlink" href="#accessibility" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now includes support for self-voicing, a mode in which Ren'Py will
read on-screen text to vision impaired players. To activate self-voicing,
press the <code class="docutils literal notranslate"><span class="pre">v</span></code> key. For more information, please read the <a class="reference internal" href="self_voicing.html"><span class="doc">self-voicing</span></a>
documentation.</p>
<p>The new <a class="reference internal" href="style_properties.html#style-property-alt"><code class="xref std std-propref docutils literal notranslate"><span class="pre">alt</span></code></a> style property allows one to supply alternative
text that allows Ren'Py to voice imagemap components and buttons with
incomplete names.</p>
<p>The Ren'Py launcher now includes a large-text mode that can be accessed from
the preferences page. This mode increases text size and contrast.</p>
</div>
<div class="section" id="android-in-app-purchasing">
<h3>Android In-App Purchasing<a class="headerlink" href="#android-in-app-purchasing" title="Permalink to this headline"> link</a></h3>
<p>This version of Ren'Py includes a high-level interface that supports
in-app purchasing on the Android platform. This interface currently
support Google Play and the Amazon App Store.</p>
</div>
<div class="section" id="pixel-art">
<h3>Pixel Art<a class="headerlink" href="#pixel-art" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py supports nearest-neighbor filtering of images. This ensures that
screen pixels correspond to a single texture pixel, which is the scaling
mode preferred for use with pixel art. Nearest-neighbor mode is enabled
with the new <a class="reference internal" href="atl.html#transform-property-nearest"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">nearest</span></code></a> transform property.</p>
<p>The new <code class="xref py py-func docutils literal notranslate"><span class="pre">config.adjust_view_size()</span></code> callback makes it possible to
set the size of the Ren'Py viewport to something other than the size of
the window (or screen, in fullscreen mode). For example, a game can use
this callback to limit its viewport size to integer multiples of its
native size.</p>
</div>
<div class="section" id="voice-improvements">
<h3>Voice Improvements<a class="headerlink" href="#voice-improvements" title="Permalink to this headline"> link</a></h3>
<p>Voice volume is now adjustable on a per-character basis, using the
voice_tag argument to <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> and the new <code class="xref py py-func docutils literal notranslate"><span class="pre">VoiceVolume()</span></code>
value.</p>
<p>Using the new <a class="reference internal" href="config.html#var-config.emphasize_audio_channels"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.emphasize_audio_channels</span></code></a> variable, Ren'Py
can emphasize audio on some channels. This is doen by lowering the
volume of non-emphasized channels when a emphasized channel is playing,
and returning the volumes to normal when no emphasized chanels are
playing. By setting this variable to <code class="docutils literal notranslate"><span class="pre">[</span> <span class="pre">'voice'</span> <span class="pre">]</span></code>, the voice
channel can be emphasized over music and other sounds,</p>
</div>
<div class="section" id="os-x-bug-workaround">
<h3>OS X Bug Workaround<a class="headerlink" href="#os-x-bug-workaround" title="Permalink to this headline"> link</a></h3>
<p>To workaround a bug in Mac OS X 10.9, Ren'Py will now always open on the
the primary monitor of a Macintosh.</p>
</div>
<div class="section" id="id21">
<h3>Other<a class="headerlink" href="#id21" title="Permalink to this headline"> link</a></h3>
<p>With some limitations, non-ASCII characters can now be used as character
names. Since Python code does not allow non-ASCII identifiers, such character
names must be defined by the define statement, and used outside Python code.</p>
<p>The <cite>auto</cite> property of imagebuttons and imagemaps now can take image names
as well as image filenames.</p>
<p>The new <code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.image_exists()</span></code> function returns true if an image has
been defined.</p>
<p>Gallery navigation can now be customized by customizing the <code class="docutils literal notranslate"><span class="pre">gallery_nav</span></code>
screen.</p>
<p>The new <a class="reference internal" href="other.html#renpy.count_dialogue_blocks" title="renpy.count_dialogue_blocks"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.count_dialogue_blocks()</span></code></a> and <a class="reference internal" href="other.html#renpy.count_seen_dialogue_blocks" title="renpy.count_seen_dialogue_blocks"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.count_seen_dialogue_blocks()</span></code></a>
return the total number of dialogue blocks and the number of dialogue blocks that have
been seen by the current user in any game. With some caveats, these can provide an
indication of how much of the game the user has seen.</p>
<p>The <a class="reference internal" href="config.html#var-config.autosave_on_choice"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.autosave_on_choice</span></code></a> variable determines if Ren'Py will
autosave on choice, while the <a class="reference internal" href="config.html#var-config.autosave_on_quit"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.autosave_on_quit</span></code></a> variable
determines if Ren'Py will autosave when the game is about to end (by quit,
return, or loading a save slot).</p>
<p>The new <a class="reference internal" href="atl.html#transform-property-events"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">events</span></code></a> transform property determines if events are
passed to a transform's children. This is useful for ATL transforms,
when some children should not receive events.</p>
<p>Save dumps (enabled by <a class="reference internal" href="config.html#var-config.save_dump"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.save_dump</span></code></a>) are performed before the
save occurs, making them far more useful for debugging pickling problems.</p>
<p>When show_ arguments are past to an <code class="xref py py-func docutils literal notranslate"><span class="pre">NVLCharacter()</span></code>, the show_ prefix
is stripped and those arguments are passed to the <code class="docutils literal notranslate"><span class="pre">nvl</span></code> screen.</p>
</div>
<div class="section" id="id22">
<h3>Translations<a class="headerlink" href="#id22" title="Permalink to this headline"> link</a></h3>
<p>This release add an Italian translation of the launcher and template game,
contributed by Oshi-Shinobu.</p>
<p>This release adds a Portuguese translation of the template game, contributed
by Mrstalker.</p>
<p>This release adds a Simplified Chinese translation of the launcher, contributed by
Huanxuantian.</p>
</div>
</div>
<div class="section" id="ren-py-6-17-7">
<h2>Ren'Py 6.17.7<a class="headerlink" href="#ren-py-6-17-7" title="Permalink to this headline"> link</a></h2>
<p>This release includes a number of Android changes:</p>
<ul class="simple">
<li>RAPT has been updated to use the latest version of the SDK. Please install
the SDK again if you have build problems.</li>
<li>RAPT no longer includes a copy of Ren'Py. Instead, Ren'Py includes a copy of
itself into the built game that RAPT uses. This makes it possible to include
fixes to Ren'Py in an Android package.</li>
<li>A low-level In-App Purchase implementation, contributed
by Emmanuel Marty and Winter Wolves. The low-level IAP code supports Google
Play and the Amazon App Store. This code is not currently documented, as it
will be wrapped in a higher-level implementation.</li>
</ul>
<p>This release includes a fix to an audio-video sync issue that affected the
Windows, Mac OS X, and Linux platforms.</p>
</div>
<div class="section" id="ren-py-6-17-6">
<h2>Ren'Py 6.17.6<a class="headerlink" href="#ren-py-6-17-6" title="Permalink to this headline"> link</a></h2>
<p>This release adds a German translation of the launcher, contributed by
Marcel.</p>
<p>This release adds a Korean translation of the launcher and template game,
contributed by Baekansi.</p>
<p>This release includes a workaround for an issue that could prevent the
launcher from starting on certain Mac OS X computers.</p>
</div>
<div class="section" id="ren-py-6-17-5">
<h2>Ren'Py 6.17.5<a class="headerlink" href="#ren-py-6-17-5" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id23">
<h3>Translations<a class="headerlink" href="#id23" title="Permalink to this headline"> link</a></h3>
<p>This release features an Arabic translation of the launcher and template
game, contributed by Renoa.</p>
<p>The Japanese and Spanish translations have been updated.</p>
</div>
<div class="section" id="id24">
<h3>Changes<a class="headerlink" href="#id24" title="Permalink to this headline"> link</a></h3>
<p>The traceback system has been changed to generally report script statements,
rather than the functions Ren'Py uses to implement those statements.</p>
<p>The <a class="reference internal" href="statement_equivalents.html#renpy.pause" title="renpy.pause"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.pause()</span></code></a> function now only sets a checkpoint (allowing rollback)
if the delay time is 0. This prevents rollback from being blocked by short
pauses.</p>
<p>The new <a class="reference internal" href="other.html#renpy.queue_event" title="renpy.queue_event"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.queue_event()</span></code></a> function provides a way to queue Ren'Py
events from user-written interface code. (For example, it could be used to
listen to commands on a serial port that's connected to a custom
controller.)</p>
<p>If set, RENPY_SKIP_MAIN_MENU and RENPY_SKIP_SPLASHSCREEN environment
variables cause Ren'Py to skip the main menu and splashscreen, respectively.</p>
<p>The RENPY_TIMEWARP environment variable makes it possible to speedup and
slow down time.</p>
<p>An experimental new autoreload system can be accessed by setting
<a class="reference internal" href="config.html#var-config.autoreload"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.autoreload</span></code></a> to True, then pressing Shift+R to toggle
automatic reloading.</p>
</div>
<div class="section" id="id25">
<h3>Fixes<a class="headerlink" href="#id25" title="Permalink to this headline"> link</a></h3>
<p>A regression in 6.17.4 caused a major memory leak on Shift+R. This has
been fixed. Several other problems with Shift+R have also been fixed.</p>
<p>An issue preventing transitions from working properly inside a restarted
ATL transform has been fixed.</p>
<p>The --warp was documented incorrectly, and had stopped working. It's been
repaired, and its documentation has been improved.</p>
</div>
</div>
<div class="section" id="ren-py-6-17-4">
<h2>Ren'Py 6.17.4<a class="headerlink" href="#ren-py-6-17-4" title="Permalink to this headline"> link</a></h2>
<div class="section" id="reloading">
<h3>Reloading<a class="headerlink" href="#reloading" title="Permalink to this headline"> link</a></h3>
<p>This release contains a complete rewrite of Shift+R reloading.</p>
<p>The rewrite was necessary to eliminate several major memory leaks that
were triggered by reloading.</p>
</div>
<div class="section" id="android">
<h3>Android<a class="headerlink" href="#android" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py has been updated to use the newest (at the time of release) versions
of the Android SDK and Ant. This should fix build problems caused by the
use of older versions.</p>
<p>Ren'Py now recognizes and supports the Amazon Fire TV device. When a Fire TV
is detected, the &quot;firetv&quot; screen variant is selected. To support pushing games
to this device, Ren'Py now supports connecting to Android devices via the
Remote ADB protocol.</p>
</div>
<div class="section" id="id26">
<h3>Other<a class="headerlink" href="#id26" title="Permalink to this headline"> link</a></h3>
<p>Fixed a problem that occurred when an interaction containing a MoveTransition
was restarted.</p>
<p>Added support for imagemaps that are larger than the screen. This allows an
imagemap to be placed inside a viewport.</p>
<p>It is now possible to select the layer used by the say, choice, and nvl
choice screen. Please see <a class="reference internal" href="config.html#var-config.say_layer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.say_layer</span></code></a>, <a class="reference internal" href="config.html#var-config.choice_layer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.choice_layer</span></code></a>,
and <a class="reference internal" href="nvl_mode.html#var-config.nvl_layer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.nvl_layer</span></code></a> statements.</p>
<p>The prediction of window and bar images has been improved.</p>
</div>
</div>
<div class="section" id="ren-py-6-17">
<h2>Ren'Py 6.17<a class="headerlink" href="#ren-py-6-17" title="Permalink to this headline"> link</a></h2>
<div class="section" id="styles">
<h3>Styles<a class="headerlink" href="#styles" title="Permalink to this headline"> link</a></h3>
<p>The style system, which makes it possible to configure the look of
displayables, has been rewritten from scratch. The new code reduces
the amount of time it takes to create a new style to a small fraction
of the previous time. Since every displayable creates an associated
style, this has the potential to lead to a substantial performance
improvement.</p>
<p>This release also introduced a new style statement that can be used
to define styles, in place of Python code. (Of course, the older form
remains fully supported.) Lengthy and redundant code like:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">init</span> <span class="k">python</span><span class="p">:</span>
<span class="k">style</span><span class="o">.</span><span class="n">quick_button_text</span><span class="o">.</span><span class="n">set_parent</span><span class="p">(</span><span class="s1">&#39;default&#39;</span><span class="p">)</span>
<span class="k">style</span><span class="o">.</span><span class="n">quick_button_text</span><span class="o">.</span><span class="na">size</span> <span class="o">=</span> <span class="mi">12</span>
<span class="k">style</span><span class="o">.</span><span class="n">quick_button_text</span><span class="o">.</span><span class="na">idle_color</span> <span class="o">=</span> <span class="s2">&quot;#8888&quot;</span>
<span class="k">style</span><span class="o">.</span><span class="n">quick_button_text</span><span class="o">.</span><span class="na">hover_color</span> <span class="o">=</span> <span class="s2">&quot;#ccc&quot;</span>
</pre></div>
</div>
<p>can be replaced with:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">style</span> <span class="n">quick_button_text</span> <span class="k">is</span> <span class="k">default</span><span class="p">:</span>
<span class="na">size</span> <span class="mi">12</span>
<span class="na">idle_color</span> <span class="s2">&quot;#8888&quot;</span>
<span class="na">hover_color</span> <span class="s2">&quot;#ccc&quot;</span>
</pre></div>
</div>
<p>Finally, the style inspector (accessed through Shift+I) has been
rewritten.</p>
</div>
<div class="section" id="syntax-changes">
<h3>Syntax Changes<a class="headerlink" href="#syntax-changes" title="Permalink to this headline"> link</a></h3>
<p>In addition to the new style statement, there are four other syntax
changes:</p>
<ul>
<li><p class="first">The definition of a simple expression has been expanded. Simple expressions
(which are used in ATL and the screen language, among other places) now
encompass all Python expressions that do not include lambda or the
ternary (... if ... else ...) operator.</p>
<p>This means that code like:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">show</span> <span class="n">logo</span><span class="p">:</span>
<span class="na">xpos</span> <span class="mi">800</span> <span class="o">/</span> <span class="mi">2</span>
</pre></div>
</div>
<p>is now legal. Previously, the expression had to be parenthesized.</p>
</li>
<li><p class="first">The new <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">layer</span></code> statement allows one to apply a transform
or ATL transform to an entire layer, using syntax like:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">show</span> <span class="na">layer</span> <span class="n">master</span> <span class="k">at</span> <span class="n">flip</span>
</pre></div>
</div>
<p>or:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">show</span> <span class="na">layer</span> <span class="n">master</span><span class="p">:</span>
<span class="na">xalign</span> <span class="mf">0.5</span> <span class="na">yalign</span> <span class="mf">0.5</span> <span class="na">rotate</span> <span class="mi">180</span>
</pre></div>
</div>
</li>
<li><p class="first">The new <code class="docutils literal notranslate"><span class="pre">window</span> <span class="pre">auto</span></code> statement makes it possible for Ren'Py to
automatically show and hide the dialogue window. By default, it is
shown before <code class="docutils literal notranslate"><span class="pre">say</span></code> statements, and hidden before <code class="docutils literal notranslate"><span class="pre">scene</span></code> statements,
but this can be customized.</p>
</li>
<li><p class="first">The init statement has been extended so it can be combined with
other statements. It's now possible to write &quot;init 1 image = ...&quot;,
&quot;init -2 define name = ...&quot; and so on.</p>
</li>
</ul>
</div>
<div class="section" id="id27">
<h3>Translations<a class="headerlink" href="#id27" title="Permalink to this headline"> link</a></h3>
<p>This release adds French and Russian template games and translations
of the launcher.</p>
</div>
<div class="section" id="id28">
<h3>Android<a class="headerlink" href="#id28" title="Permalink to this headline"> link</a></h3>
<p>It is no longer necessary to download RAPT (the Ren'Py Android Packaging Tool)
separately from Ren'Py. As of this release, RAPT will be downloaded by the
Ren'Py launcher when an Android build is requested, and will be updated
by the Ren'Py updater.</p>
<p>Buttons may now have an alternate action that is triggered by longpress
on Android and right-click on desktop computers.</p>
<p>This release fixes a bug in which Ren'Py would not save persistent data
(including preferences) before being terminated by the Android system, and
a regression that broke compatibility with some Android 2.3 systems.</p>
</div>
<div class="section" id="new-and-changed-preferences">
<h3>New and Changed Preferences<a class="headerlink" href="#new-and-changed-preferences" title="Permalink to this headline"> link</a></h3>
<p>There are two new preferences accessible through the <code class="xref py py-func docutils literal notranslate"><span class="pre">Preferences()</span></code>
function:</p>
<ul class="simple">
<li>&quot;auto-forward after click&quot; controls if auto-forward mode is stopped
by a click.</li>
<li>&quot;show empty window&quot; determines is if the &quot;window show&quot; and &quot;window auto&quot;
statements will cause an empty window to be shown.</li>
</ul>
<p>Neither of these is exposed as part of the default preferences screen, but
both can be added by interested developers.</p>
<p>There is one changed preference:</p>
<ul class="simple">
<li>&quot;display&quot; now has an &quot;any window&quot; option, which restores a fullscreen
Ren'Py to its prior windowed size.</li>
</ul>
</div>
<div class="section" id="id29">
<h3>Other<a class="headerlink" href="#id29" title="Permalink to this headline"> link</a></h3>
<p><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> can now pass arguments to the screen it displays.</p>
<p>The input displayable now takes a pixel_width property, that limits
the size of the input field it a certain number of pixels.</p>
<p>The <a class="reference internal" href="screen_actions.html#FileCurrentScreenshot" title="FileCurrentScreenshot"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileCurrentScreenshot()</span></code></a> function</p>
<p>The new <a class="reference internal" href="style_properties.html#style-property-xsize"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xsize</span></code></a>, <a class="reference internal" href="style_properties.html#style-property-ysize"><code class="xref std std-propref docutils literal notranslate"><span class="pre">ysize</span></code></a>, and <a class="reference internal" href="style_properties.html#style-property-xysize"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xysize</span></code></a> style
properties make it possible to directly set the size of a displayable.</p>
<p>The <a class="reference internal" href="style_properties.html#style-property-focus_mask"><code class="xref std std-propref docutils literal notranslate"><span class="pre">focus_mask</span></code></a> style property can now take as an argument a callable
that returns true when a displayable should be focused. If such a callable
can be written, it may be much faster than the current method of determining
pixel opacity.</p>
<p>Viewport now respects the xfill and yfill properties. The default viewport
style sets these to true. Setting them to False will cause the viewport to
shrink to fit its contents when those contents do not fill the entire
viewport.</p>
<p>The new <a class="reference internal" href="displaying_images.html#renpy.get_image_bounds" title="renpy.get_image_bounds"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_image_bounds()</span></code></a> function retrieves the bounding box
of an image that is being displayed, after all Transforms have been applied
to it.</p>
<p>The new <a class="reference internal" href="save_load_rollback.html#renpy.retain_after_load" title="renpy.retain_after_load"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.retain_after_load()</span></code></a> can be used to retain data updated
by a screen after the game is loaded.</p>
<p>The new <a class="reference internal" href="style_properties.html#style-property-xsize"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xsize</span></code></a>, <a class="reference internal" href="style_properties.html#style-property-ysize"><code class="xref std std-propref docutils literal notranslate"><span class="pre">ysize</span></code></a>, and <a class="reference internal" href="style_properties.html#style-property-xysize"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xysize</span></code></a> style
properties make it possible to directly set the size of resizable
displayables.</p>
<p>Prediction of images with partial attributes and side images used in
dialogue has been improved. Prediction of creator-defined statements
now works as documented.</p>
</div>
</div>
<div class="section" id="ren-py-6-16-2">
<h2>Ren'Py 6.16.2<a class="headerlink" href="#ren-py-6-16-2" title="Permalink to this headline"> link</a></h2>
<p>This release adds a Spanish translation of the launcher and the template game.</p>
<p>This release adds the new <a class="reference internal" href="other.html#renpy.get_mouse_pos" title="renpy.get_mouse_pos"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_mouse_pos()</span></code></a> function, which
retrieves the mouse position if a mouse is supported.</p>
</div>
<div class="section" id="ren-py-6-16">
<h2>Ren'Py 6.16<a class="headerlink" href="#ren-py-6-16" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id30">
<h3>Android<a class="headerlink" href="#id30" title="Permalink to this headline"> link</a></h3>
<p>Android support has now been integrated into the Ren'Py launcher. While
for size reasons RAPT is still a separate download, once RAPT has been
placed inside the Ren'Py directory, the launcher will allow you to:</p>
<ul class="simple">
<li>Install the Android SDK.</li>
<li>Configure a project as an Android application.</li>
<li>Build and Install the Android application.</li>
</ul>
<p>The launcher can now launch Ren'Py in modes that simulate Android phones,
tablets, and television-based consoles.</p>
<p>Ren'Py includes support for television-based Android consoles, such as the
OUYA. It includes support for detecting the OUYA specifically, and choosing
a variant as appropriate.</p>
<p>This release adds some video playback support to the Android port. While
limited to full-screen video and codecs that the Android platform supports
(which unfortunately have little overlap with desktop Ren'Py), this may
be enough to enable cutscene movies.</p>
<p>Ren'Py now includes a new set of screen variants, with &quot;large&quot;, &quot;medium&quot;, and
&quot;small&quot; reflecting the visual size of devices (televisions are considered to
be small because they're far away), while &quot;touch&quot;, &quot;tv&quot;, and &quot;pc&quot; reflect
the input devices involved.</p>
<p>Android now supports displaying vertical text.</p>
</div>
<div class="section" id="save-load-and-persistent-improvements">
<h3>Save, Load, and Persistent Improvements<a class="headerlink" href="#save-load-and-persistent-improvements" title="Permalink to this headline"> link</a></h3>
<p>The low-level load/save API has been overhauled. It's now possible to
access save slot information directly, instead of having to scan all save
slots to find the one you want. New functions include <a class="reference internal" href="save_load_rollback.html#renpy.list_slots" title="renpy.list_slots"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.list_slots()</span></code></a>,
<a class="reference internal" href="save_load_rollback.html#renpy.newest_slot" title="renpy.newest_slot"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.newest_slot()</span></code></a>, <a class="reference internal" href="save_load_rollback.html#renpy.slot_mtime" title="renpy.slot_mtime"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.slot_mtime()</span></code></a>,
<a class="reference internal" href="save_load_rollback.html#renpy.slot_json" title="renpy.slot_json"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.slot_json()</span></code></a>, and <a class="reference internal" href="save_load_rollback.html#renpy.slot_screenshot" title="renpy.slot_screenshot"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.slot_screenshot()</span></code></a>.</p>
<p>At a higher level, there is a new <a class="reference internal" href="screen_actions.html#FileNewest" title="FileNewest"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileNewest()</span></code></a> function that's
true for the newest save slot. <a class="reference internal" href="screen_actions.html#FilePageNext" title="FilePageNext"><code class="xref py py-func docutils literal notranslate"><span class="pre">FilePageNext()</span></code></a> and
<a class="reference internal" href="screen_actions.html#FilePagePrevious" title="FilePagePrevious"><code class="xref py py-func docutils literal notranslate"><span class="pre">FilePagePrevious()</span></code></a> now support a wrap argument that causes them
to wrap around a defined number of screens.</p>
<p>There is now support for adding arbitrary JSON information to save
files. This allows per-save information (like the path you're on
in a VN, date and amount of money in a sim, or party composition
in an RPG) to be accessed from the save and load screens.</p>
<p>JSON information is created by <a class="reference internal" href="config.html#var-config.save_json_callbacks"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.save_json_callbacks</span></code></a>,
and can be accessed through the low-level <a class="reference internal" href="save_load_rollback.html#renpy.slot_json" title="renpy.slot_json"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.slot_json()</span></code></a> or
high-level <a class="reference internal" href="screen_actions.html#FileJson" title="FileJson"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileJson()</span></code></a> functions.</p>
<p>When possible, Ren'Py now stores save files with the game, as well as in
a user-global save directory. This means that if a Ren'Py game is placed
on a USB drive or shared on a network, the saves will be available on
multiple computers. (When save files are available in both places, the
newest file wins.)</p>
<p>When a save file on a network share is updated, Ren'Py will automatically
rescan the contents of that file, and restart the current interaction. (This
will update the save and load screens, making the file available to be
loaded.)</p>
<p>Ren'Py will no longer auto-save while at the main menu.</p>
<p>Persistent data is also stored in both locations. When the persistent
data is not identical, it will be merged. By default, the most recently
updated value for each field will be used. In some cases (for example, a set
of endings the player has reached), this is not the correct behavior. The
new <a class="reference internal" href="persistent.html#renpy.register_persistent" title="renpy.register_persistent"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.register_persistent()</span></code></a> can be used to register different
merge behavior.</p>
</div>
<div class="section" id="voice">
<h3>Voice<a class="headerlink" href="#voice" title="Permalink to this headline"> link</a></h3>
<p>This release adds support for playing voice without having to fill
the script with voice statements. This support consists of two
new pieces of functionality:</p>
<ul class="simple">
<li>The launcher contains a new &quot;Extract Dialogue&quot; function. This extracts
the dialogue into a tab-delimited file. Each record includes the character,
the dialogue text, the filename and line number, and a unique identifier
for that line.</li>
<li>The <a class="reference internal" href="config.html#var-config.auto_voice"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.auto_voice</span></code></a> variable is used to give a filename pattern
that is formatted with the unique identifier. If a file with that filename
exists, and no other voice file is being played, that file is used as the
voice.</li>
</ul>
<p>There are also several new voice-related preferences. The &quot;voice sustain&quot;
preference determines if voice is sustained through multiple interactions.
The &quot;wait for voice&quot; preference determines if auto-forward mode waits for
the voice to finish before advancing.</p>
</div>
<div class="section" id="image-gallery-and-music-room">
<h3>Image Gallery and Music Room<a class="headerlink" href="#image-gallery-and-music-room" title="Permalink to this headline"> link</a></h3>
<p>The image gallery now can display a navigation overlay with next, previous,
slide show, and return buttons. The creator can choose if these buttons
display the images associated with a single button, or advance between
multiple buttons.</p>
<p>The Music Room includes the ability to play a random track, and to determine
if the tracks are shuffled, looped, or if play is confined to a single
selected track.</p>
</div>
<div class="section" id="text-rendering">
<h3>Text Rendering<a class="headerlink" href="#text-rendering" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now renders portions of font characters that leave the character
bounding box. This prevents text (especially hinted and anti-aliased text)
from being cut off, but may lead to apparent placement problems for fonts
with very inaccurate bounding boxes.</p>
</div>
<div class="section" id="japanese-language">
<h3>Japanese Language<a class="headerlink" href="#japanese-language" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py launcher has been translated into Japanese. The language
used by the launcher can be switched from the preferences screen.</p>
<p>There is now a Japanese language template game, which defaults to
a Japanese font and has a translated interface.</p>
<p>Much of the documentation has been translated
to Japanese. The Japanese translation can be found at:</p>
<blockquote>
<div><a class="reference external" href="http://ja.renpy.org/doc/html/">http://ja.renpy.org/doc/html/</a></div></blockquote>
</div>
<div class="section" id="documentation">
<h3>Documentation<a class="headerlink" href="#documentation" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py documentation has been improved. The following pages have been
added or migrated from the old wiki-based documentation.</p>
<ul class="simple">
<li><a class="reference internal" href="label.html"><span class="doc">Labels &amp; Control Flow</span></a></li>
<li><a class="reference internal" href="python.html"><span class="doc">Python Statements</span></a></li>
<li><a class="reference internal" href="conditional.html"><span class="doc">Conditional Statements</span></a></li>
<li><a class="reference internal" href="audio.html"><span class="doc">Audio</span></a></li>
<li><a class="reference internal" href="movie.html"><span class="doc">Movie</span></a></li>
<li><a class="reference internal" href="persistent.html"><span class="doc">Persistent Data</span></a></li>
<li><a class="reference internal" href="cds.html"><span class="doc">Creator-Defined Statements</span></a></li>
<li><a class="reference internal" href="character_callbacks.html"><span class="doc">Character Callbacks</span></a></li>
<li><a class="reference internal" href="file_python.html"><span class="doc">File Access</span></a></li>
<li><a class="reference internal" href="environment_variables.html"><span class="doc">Environment Variables</span></a></li>
<li><a class="reference internal" href="reserved.html"><span class="doc">Reserved Names</span></a></li>
</ul>
<p>Many other documentation pages have been improved and edited.</p>
</div>
<div class="section" id="id31">
<h3>Other<a class="headerlink" href="#id31" title="Permalink to this headline"> link</a></h3>
<p>The default quick menu now includes rollback and fast skip
functionality. (This functionality is contained in the template screens.rpy,
and may need to be copied into your game.)</p>
<p>The default yes_no screen now answers no when the user right-clicks. (This
functionality is contained in the template screens.rpy, and may need to be
copied into your game.)</p>
<p>The fast skipping function now stops when it visits seen text.</p>
<p>The <a class="reference internal" href="build.html#var-build.destination"><code class="xref std std-var docutils literal notranslate"><span class="pre">build.destination</span></code></a> variable can be used to select the directory
in which Ren'Py places files when building a distribution.</p>
<p>There is a new NullAction that can be used when one wants a button
to be sensitive to hover and unhover, but not performing a useful
action on click.</p>
<p>ConditionSwitch is now much faster.</p>
<p>Ren'Py will deal with files with insane timestamps by giving them the
current time.</p>
</div>
<div class="section" id="bugfixes">
<h3>Bugfixes<a class="headerlink" href="#bugfixes" title="Permalink to this headline"> link</a></h3>
<p>This release includes many bugfixes. Some of the more important are:</p>
<ul class="simple">
<li>A fix to a problem that would cause Ren'Py to restart the display when
starting up on Windows. This could cause Ren'Py to spuriously detect a
slow video card, and present the user with the appropriate error message.</li>
<li>A fix to a problem where Ren'Py would fail to display the proper error
message when Python code containing non-ASCII characters fails to compile.</li>
</ul>
</div>
</div>
<div class="section" id="ren-py-6-15-6">
<h2>Ren'Py 6.15.6<a class="headerlink" href="#ren-py-6-15-6" title="Permalink to this headline"> link</a></h2>
<p>This release includes improvements for the Android platform:</p>
<ul class="simple">
<li>Assets are now read exclusively from the APK and expansion file.</li>
<li>Logs and tracebacks are placed on external storage.</li>
<li>Saves are placed on external storage, except when saves from
older versions of Ren'Py exist.</li>
</ul>
<p>The GL2 shaders Ren'Py uses have been simplified in the (usual) case
where no clipping is occurring. This leads to a noticeable speed
improvement on Android, and potentially other platforms as well.</p>
<p>An issue with Drag-and-drop has been fixed. Thanks go to Kinsman
for contributing this fixe.</p>
<p>The <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> action now triggers the skip indicator. It also
supports a new fast parameter, which causes skipping to the
next menu.</p>
<p>This release includes various minor changes to improve compatibility
with very old Ren'Py games. (It now runs the Ren'Py 5 demo.)</p>
</div>
<div class="section" id="ren-py-6-15-5">
<h2>Ren'Py 6.15.5<a class="headerlink" href="#ren-py-6-15-5" title="Permalink to this headline"> link</a></h2>
<p>This release adds two new features:</p>
<ul class="simple">
<li>The GL renderer now supports additive blending. This is enabled using the
<a class="reference internal" href="atl.html#transform-property-additive"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">additive</span></code></a> transform property in an ATL transform or use of the
<a class="reference internal" href="trans_trans_python.html#Transform" title="Transform"><code class="xref py py-func docutils literal notranslate"><span class="pre">Transform()</span></code></a> class. Additive blending will not work if the software
renderer is in use, and it's up to creators to deal with that issue.</li>
<li>The new <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> displayable combines multiple textures into
a single texture. This can be used to prevent incorrect behavior
when a displayable containing multiple overlapping textures (like a
<code class="xref py py-func docutils literal notranslate"><span class="pre">LiveComposite()</span></code> is shown with an <a class="reference internal" href="atl.html#transform-property-alpha"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">alpha</span></code></a> between 0 and 1.</li>
</ul>
<p>It also fixes the following issues:</p>
<ul class="simple">
<li>Whitespace is now skipped before default arguments, which previously
caused parse errors in some cases.</li>
<li>Ren'Py now sets the unix mode of files and directories in zip and tar
files to 644 and 755 as appropriate. Prior versions of Ren'Py used
666 and 777 as the permissions, which lead to a security problem
when the file was unpacked by a tool that didn't respect the user's
umask. (Info-zip had this problem.)</li>
<li>Auto-hinting for fonts is now enabled by default. This restores font
rendering compatibility with prior releases.</li>
<li>Ren'Py now builds with and requires the current version of libav. It
should also work with current versions of ffmpeg when libav is
available.</li>
<li>The version of SDL distributed with Ren'Py has been patched to
prevent multiple windows from showing up in the Window menu
when entering and leaving fullscreen mode.</li>
</ul>
<div class="section" id="ren-py-6-15-4">
<h3>Ren'Py 6.15.4<a class="headerlink" href="#ren-py-6-15-4" title="Permalink to this headline"> link</a></h3>
<p>This release fixes a compile problem that prevented Ren'Py 6.14.x and Ren'Py
6.15.0-3 from running on most 64-bit Linux systems.</p>
<p>Image prediction has become more fine-grained, and can take place while the
screen is animating.</p>
<p>The new <a class="reference internal" href="build.html#var-build.exclude_empty_directories"><code class="xref std std-var docutils literal notranslate"><span class="pre">build.exclude_empty_directories</span></code></a> determines if empty directories
are include or excluded from the distribution. It defaults to true,
previously the default was platform-dependant.</p>
</div>
</div>
<div class="section" id="ren-py-6-15">
<h2>Ren'Py 6.15<a class="headerlink" href="#ren-py-6-15" title="Permalink to this headline"> link</a></h2>
<div class="section" id="translation-framework">
<h3>Translation Framework<a class="headerlink" href="#translation-framework" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now includes a comprehensive
<a class="reference internal" href="translation.html#translation"><span class="std std-ref">translation framework</span></a>. This framework includes support
for using a single language selection to change dialogue, menus and other
interface text, images and files, styles and styles.</p>
<p>The dialogue translation support allows lines of dialogue to be split and
combined at the translator's discretion. As most Ren'Py statements are
allowed inside the new translation blocks, it's possible to use logic (like
conditions) to tailor the translations to your language.</p>
<p>The launcher includes a new &quot;Generate Translations&quot; button, which as part of
a sanctioned translation where the full script is present will generate
empty translation files for a new language.</p>
</div>
<div class="section" id="improved-japanese-support">
<h3>Improved Japanese Support<a class="headerlink" href="#improved-japanese-support" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py 6.15 includes multiple changes to better support the Japanese language.</p>
<ul>
<li><p class="first">The tutorial game has been translated to Japanese, with the language being
selectable from the preferences menu.</p>
<p>The tutorial was translated by Koichi Akabe.</p>
</li>
<li><p class="first">Support for vertical writing has been added to Ren'Py. Consisting of the
<a class="reference internal" href="style_properties.html#style-property-vertical"><code class="xref std std-propref docutils literal notranslate"><span class="pre">vertical</span></code></a> style property for text, and the new
<a class="reference internal" href="style_properties.html#style-property-box_reverse"><code class="xref std std-propref docutils literal notranslate"><span class="pre">box_reverse</span></code></a> property on hboxes, this support makes it possible
to display dialogue, menus, and other text in a vertical orientation.</p>
<p>Vertical text support was written by Koichi Akabe.</p>
</li>
<li><p class="first">The line-breaking algorithm has been updated to match Unicode 6.2. In
addition, three new &quot;languages&quot; have been added. The new &quot;japanese-strict&quot;,
&quot;japanese-normal&quot;, and &quot;japanese-loose&quot; languages (based on the line-break
options in the CSS3 Text module) allow greater control of how Ren'Py breaks
lines with small kana and other special characters.</p>
<p>Linebreaking can be further tailored using the new
<a class="reference internal" href="other.html#renpy.language_tailor" title="renpy.language_tailor"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.language_tailor()</span></code></a> function, which can change the linebreaking
class of a character.</p>
</li>
</ul>
</div>
<div class="section" id="id32">
<h3>Console<a class="headerlink" href="#id32" title="Permalink to this headline"> link</a></h3>
<p>The new debug console makes it possible to interactively run Ren'Py script and
Python statements, and immediately see the results. The console is available
in developer mode or when <code class="xref std std-var docutils literal notranslate"><span class="pre">config.console</span></code> is True, and can be accessed
by pressing Shift+O.</p>
<p>The console can be used to:</p>
<ul class="simple">
<li>Jump to a label.</li>
<li>Interactively try out Ren'Py script statements.</li>
<li>Evaluate a Python expression or statement to see the result.</li>
<li>Trace Python expressions as the game progresses.</li>
</ul>
<p>The console was originally written by Shiz, C, and delta.</p>
</div>
<div class="section" id="screen-parameters">
<h3>Screen Parameters<a class="headerlink" href="#screen-parameters" title="Permalink to this headline"> link</a></h3>
<p>Screens now take named parameters, similar to the way that labels and
transforms take named parameters. It's now possible to write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">screen</span> <span class="n">top_text</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="na">size</span><span class="o">=</span><span class="mi">36</span><span class="p">):</span>
<span class="k">text</span> <span class="n">s</span> <span class="na">xalign</span> <span class="mf">0.5</span> <span class="na">size</span> <span class="na">size</span>
</pre></div>
</div>
<p>and:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">show</span> <span class="k">screen</span> <span class="n">top_text</span><span class="p">(</span><span class="s2">&quot;It works!&quot;</span><span class="p">)</span>
</pre></div>
</div>
</div>
<div class="section" id="replay-gallery">
<h3>Replay Gallery<a class="headerlink" href="#replay-gallery" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now includes support for <a class="reference internal" href="rooms.html#replay"><span class="std std-ref">replaying</span></a> scenes. A scene
replay can be invoked from anywhere in Ren'Py (for example, from a main menu
or game menus screen, even when the game has started). When the replay ends,
Ren'Py will return to the location the replay was invoked from, even if that
location is in a screen or in Python code. Rollback works inside a replay,
but saving and loading is disabled.</p>
<p>The <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> action begins a replay. The <a class="reference internal" href="rooms.html#renpy.end_replay" title="renpy.end_replay"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.end_replay()</span></code></a> ends a
replay if one is in progress, and is ignored otherwise.</p>
</div>
<div class="section" id="id33">
<h3>Voice Improvements<a class="headerlink" href="#id33" title="Permalink to this headline"> link</a></h3>
<p>There have been several improvements to the voice playback system. The new
<a class="reference internal" href="config.html#var-config.voice_filename_format"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.voice_filename_format</span></code></a> variable makes it possible to use only
part of the filename in a voice statement. The new voice_tag parameter to
<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>, in conjunction with the <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> and
<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> actions, makes it possible to selectively mute
particular characters' voices. The new <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> action makes it
possible to replay the current voice.</p>
</div>
<div class="section" id="launcher-improvements">
<h3>Launcher Improvements<a class="headerlink" href="#launcher-improvements" title="Permalink to this headline"> link</a></h3>
<p>There were a few launcher improvements in this release.</p>
<ul class="simple">
<li>The files pane of the navigation page has a new button that allows the
user to create a new script file.</li>
<li>The launcher can generate translation templates, and can be translated
using the translation framework.</li>
<li>The Ren'Py launcher now has a small amount of support for skins. While the
basic layout of the launcher remains fixed, skins allow the background
images and colors to be changed. See the <a class="reference internal" href="skins.html"><span class="doc">skin documentation</span></a>
for more details.</li>
</ul>
</div>
<div class="section" id="macintosh-changes">
<h3>Macintosh Changes<a class="headerlink" href="#macintosh-changes" title="Permalink to this headline"> link</a></h3>
<p>The Macintosh version of Ren'Py now requires a 64-bit capable processor, and
Mac OS X 10.6 or newer.</p>
</div>
<div class="section" id="packaging-improvements">
<h3>Packaging Improvements<a class="headerlink" href="#packaging-improvements" title="Permalink to this headline"> link</a></h3>
<p>The file layout of Ren'Py games has been somewhat altered. With the exception
of small launcher programs, all platform-dependent binaries are under the
lib/ directory. Ren'Py itself has now been placed in the renpy/ directory.
The common/ directory has been moved to renpy/common/, as it's considered an
integral part of Ren'Py.</p>
<p>Ren'Py now uses renamed but otherwise unmodified Python binaries on all
desktop platforms. (Previously, it used platform-specific binaries.) Portions
of the library are shared between the desktop builds.</p>
<p>A running Ren'Py process on Linux will now be named after the game, rather
than having python as a name.</p>
</div>
<div class="section" id="id34">
<h3>Other Changes<a class="headerlink" href="#id34" title="Permalink to this headline"> link</a></h3>
<ul class="simple">
<li><a class="reference internal" href="screens.html#sl-viewport"><span class="std std-ref">Viewports</span></a> now support edge scrolling, which scrolls
the viewport when the mouse is within a a configurable distance of the
viewport edge.</li>
<li>Most keyboard keys now automatically repeat. The repeat rate is controlled
by <code class="xref std std-var docutils literal notranslate"><span class="pre">config.key_repeat</span></code>.</li>
<li>Side images can now be used with menus.</li>
<li>The <a class="reference internal" href="config.html#var-config.enter_yesno_transition"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.enter_yesno_transition</span></code></a> and
<a class="reference internal" href="config.html#var-config.exit_yesno_transition"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.exit_yesno_transition</span></code></a> variables make it possible to define a
transition that is run when yes/no prompts appear and disappear,
respectively.</li>
<li>The <a class="reference internal" href="screens.html#sl-viewport"><span class="std std-ref">viewport statement</span></a> now supports edge scrolling -
automatic scrolling when the mouse approaches the sides of the viewport.</li>
<li>The new <a class="reference internal" href="atl.html#transform-property-transform_anchor"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">transform_anchor</span></code></a> transform property makes the anchor the
point around which a transform is scaled and rotated. (For example, it's
now possible to rotate around the bottom-right corner of an image, rather
than just its center.)</li>
<li>The common directory has been moved to renpy/common, as it's part of
Ren'Py. The giant 00screens.rpy file has been broken up into a large number
of smaller files.</li>
<li>The new <a class="reference internal" href="style_properties.html#style-property-box_reverse"><code class="xref std std-propref docutils literal notranslate"><span class="pre">box_reverse</span></code></a> and <a class="reference internal" href="style_properties.html#style-property-order_reverse"><code class="xref std std-propref docutils literal notranslate"><span class="pre">order_reverse</span></code></a> style
properties allow the user to control the order in which children of vbox
and hboxes are placed and drawn, respectively.</li>
<li>The xoffset and yoffset transform properties now take floating point
numbers, allowing more precise positioning if subpixel is true.</li>
<li>The <a class="reference internal" href="style_properties.html#style-property-child"><code class="xref std std-propref docutils literal notranslate"><span class="pre">child</span></code></a> style property of buttons is now exposed to the
screen language.</li>
<li>The new <a class="reference internal" href="config.html#var-config.enter_yesno_transition"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.enter_yesno_transition</span></code></a> and
<a class="reference internal" href="config.html#var-config.exit_yesno_transition"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.exit_yesno_transition</span></code></a> variables allow a creator to supply
transitions that are used upon entering and exiting yes/no prompts.</li>
<li>The Python decimal module is now included in the default builds of Ren'Py.</li>
</ul>
</div>
<div class="section" id="id35">
<h3>Bugfixes<a class="headerlink" href="#id35" title="Permalink to this headline"> link</a></h3>
<p>Among others, the following bugs were fixed:</p>
<ul class="simple">
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/37">github bug37</a>: A crash with LiveTile when sizes were not integers.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/41">github bug41</a>: <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> failed to search for files inside
android packages.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/42">github bug42</a>: The launcher can now run a game that's in a read-only
directory.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/45">github bug45</a>: Ren'Py would fail when the hiding of a screen caused a screen
beneath it to be hidden.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/46">github bug46</a>: A bug that prevented Ren'Py from evicting images from an
over-full image cache, that manifested as a runaway memory leak.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/50">github bug50</a>: Vertical bars would scroll with the left and right arrow
keys; and bars would remain grabbed even if they were grabbed while leaving
the screen, preventing further input.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/51">github bug51</a>: The slow_done callback was not called after a rollback.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/56">github bug56</a>, <a class="reference external" href="https://github.com/renpy/renpy/issues/57">github bug57</a>: <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> now works with Android
assets.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/60">github bug60</a>: Fixed a bug that prevented {p} and {w} from working properly
when followed immediately by a text tag.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/61">github bug61</a>: Ren'Py no longer crashes when an end_game_transition is set
and a screen uses a variable that is no longer defined when the game
restarts.</li>
<li><a class="reference external" href="https://github.com/renpy/renpy/issues/65">github bug65</a>: Multiplying a rollback list by a number now always produces a
rollback list.</li>
<li>Editra should work better on Windows.</li>
<li>It's now possible to <a class="reference internal" href="statement_equivalents.html#renpy.call" title="renpy.call"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.call()</span></code></a> a label that doesn't take
parameters.</li>
<li>Fixed an error handling failure when a style used by error handling was
not buildable.</li>
<li>Fixed an error handling failure when a python early block contained a
syntax error.</li>
</ul>
</div>
</div>
<div class="section" id="ren-py-6-14">
<h2>Ren'Py 6.14<a class="headerlink" href="#ren-py-6-14" title="Permalink to this headline"> link</a></h2>
<div class="section" id="ren-py-launcher-rewrite">
<h3>Ren'Py Launcher Rewrite<a class="headerlink" href="#ren-py-launcher-rewrite" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py launcher has been rewritten. Some of the improvements are:</p>
<ul>
<li><p class="first">A new visual design by Doomfest of the Dischan visual novel team.</p>
</li>
<li><p class="first">The launcher now includes direct access to open the script and game
directories, and common script files.</p>
</li>
<li><p class="first">The launcher includes Script Navigation support. Clicking the name of a
label, define, transform, screen, or callable will open the editor to the
location where that name is defined.</p>
<p>Script navigation also provides access to individual script files.</p>
</li>
<li><p class="first">The launcher now supports one-click project building. Instead of using
multiple steps to build a project, a single click will now cause the
launcher to:</p>
<ul class="simple">
<li>Read the build process configuration from the game script.</li>
<li>Build the archives needed.</li>
<li>Generate the archive and update files.</li>
</ul>
</li>
<li><p class="first">The launcher can now use the Ren'Py updater to update Ren'Py, and to
download editors.</p>
</li>
</ul>
</div>
<div class="section" id="editra-text-editing">
<h3>Editra &amp; Text Editing<a class="headerlink" href="#editra-text-editing" title="Permalink to this headline"> link</a></h3>
<p>For most users, Ren'Py recommends the use of the Editra editor. We have
developed an Editra plugin that communicates with the Ren'Py launcher and
supports the editing of Ren'Py script.</p>
<p>While still in beta, Editra is a fast and light editor with good code editing
support. Editra also includes a spell-checker that can be enabled, and
applies to dialogue and other strings.</p>
<p>If Editra is selected by the user, and it is not installed, Ren'Py will
automatically download it.</p>
<p>The jEdit editor remains supported, and is preferred for use with languages
(like Chinese, Japanese, and Korean) that Editra doesn't support fully. If
selected, Ren'Py will download jEdit automatically.</p>
<p>Ren'Py also supports editing files through system-specific file associations.
(This support will not send the cursor to the correct line, however.)</p>
</div>
<div class="section" id="ren-py-web-updater">
<h3>Ren'Py Web Updater<a class="headerlink" href="#ren-py-web-updater" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py includes an updater that can update Ren'Py and individual Ren'Py games
by downloading changes from a properly-configured web server with a small
number of update files uploaded to it.</p>
<p>The updater uses zsync to download the minimal set of changes between the
local files on disk and the files stored on the server. A single set of files
on the server supports updating from all prior versions of a project.</p>
<p>Ren'Py includes a default updater interface that can be further configured by
interested users.</p>
</div>
<div class="section" id="transform-changes">
<h3>Transform Changes<a class="headerlink" href="#transform-changes" title="Permalink to this headline"> link</a></h3>
<p>This release changes the behavior of transforms to make them more correct and
easier to use.</p>
<p>The xzoom and yzoom properties are now applied before, rotation. This means
that the shape of the image will remain consistent as the image is rotated.
Previously, the image to change shape as it was rotated.</p>
<p>The xzoom and yzoom properties may now be negative, with negative zoom values
causing the images to be flipped. The positioning code now takes this into
account, and positions a flipped image properly.</p>
<p>Thanks to Edwin for contributing these changes.</p>
</div>
<div class="section" id="screen-language-displayable-and-transition-enhancements">
<h3>Screen Language, Displayable, and Transition Enhancements<a class="headerlink" href="#screen-language-displayable-and-transition-enhancements" title="Permalink to this headline"> link</a></h3>
<ul class="simple">
<li>The <a class="reference internal" href="screens.html#sl-textbutton"><span class="std std-ref">Textbutton</span></a> and <a class="reference internal" href="screens.html#sl-label"><span class="std std-ref">Label</span></a> screen language statements
now take properties prefixed with <code class="docutils literal notranslate"><span class="pre">text\_</span></code>. These properties have the
text_ prefix stripped, and are then passed to the internal text displayable.</li>
<li>The <a class="reference internal" href="screens.html#sl-viewport"><span class="std std-ref">Viewport</span></a> screen language statement now takes a <cite>scrollbars</cite>
parameter. If given, scrollbars that manipulate the viewport are created.</li>
<li>The <a class="reference internal" href="screens.html#sl-viewport"><span class="std std-ref">Viewport</span></a> screen language statement now takes <cite>xinitial</cite> and
<cite>yinitial</cite> parameters. If given, these control the initial positioning of
the viewport.</li>
<li>A screen language block may now contain multiple has statements. Screen
language widgets that take single children can now take a has statement.</li>
<li>The input displayable now supports the use of the left and right arrow
keys within the text. (Thanks to Edwin for this feature.)</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> has been rewritten. The new version now uses
transforms to control the positioning of entering and leaving images, and
can interpolate between the locations of moving images.</li>
</ul>
</div>
<div class="section" id="rollback-improvements">
<h3>Rollback Improvements<a class="headerlink" href="#rollback-improvements" title="Permalink to this headline"> link</a></h3>
<ul>
<li><p class="first">The new <a class="reference internal" href="save_load_rollback.html#renpy.fix_rollback" title="renpy.fix_rollback"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.fix_rollback()</span></code></a> function allows the game to fix
choices, even if they are made in rollback mode. The user can roll back and
roll forward, but is restricted to making the choices he made the first
time through the game.</p>
<p>Thanks to Edwin for contributing fix_rollback.</p>
</li>
<li><p class="first">Rolling forward now works through a jump out of a <code class="docutils literal notranslate"><span class="pre">call</span> <span class="pre">screen</span></code>
statement.</p>
</li>
</ul>
</div>
<div class="section" id="video-improvements">
<h3>Video Improvements<a class="headerlink" href="#video-improvements" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py's video playback support has been partially rewritten to improve
robustness, speed, and framerate stability. These improvements should reduce
the number of frame drops Ren'Py performs, and should also prevent Ren'Py
from locking up if too many frames are dropped.</p>
<p>Ren'Py now supports the WebM video format.</p>
</div>
<div class="section" id="image-load-log">
<h3>Image Load Log<a class="headerlink" href="#image-load-log" title="Permalink to this headline"> link</a></h3>
<p>When <a class="reference internal" href="config.html#var-config.developer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.developer</span></code></a> is true, Ren'Py keeps an internal log of image
loads.</p>
<p>This log can be access by showing the _image_load_log screen. This screen
displays the name of an image file for a few seconds after that image has
been loaded. The name is in white if the image was loaded by the image
predictor, and pink if Ren'Py was unable to predict the image.</p>
</div>
<div class="section" id="file-actions-and-functions">
<h3>File Actions and Functions<a class="headerlink" href="#file-actions-and-functions" title="Permalink to this headline"> link</a></h3>
<p>Two screen functions have been added, and two screen actions have been changed:</p>
<ul class="simple">
<li>The new <a class="reference internal" href="screen_actions.html#FileUsedSlots" title="FileUsedSlots"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileUsedSlots()</span></code></a> function returns a list of used file slots
on the current page.</li>
<li>The new <a class="reference internal" href="screen_actions.html#FileCurrentPage" title="FileCurrentPage"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileCurrentPage()</span></code></a> function returns the name of the current
page.</li>
<li>The <a class="reference internal" href="screen_actions.html#FileSave" title="FileSave"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileSave()</span></code></a> and <a class="reference internal" href="screen_actions.html#FileAction" title="FileAction"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileAction()</span></code></a> actions have been modified so
that if the slot name is None, an unused slot based on the current time is
used.</li>
</ul>
<p>Taken together, these changes make it possible to create a list of save slots
where the user is able to add new slots to the list.</p>
</div>
<div class="section" id="multiple-store-support">
<h3>Multiple Store Support<a class="headerlink" href="#multiple-store-support" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now supports multiple stores multiple namespaces in which Python code
can be run. Variables in these stores are saved, loaded, and rolled-back in
the same way that variables in the default store are.</p>
<p>Stores are accessed by supplying an in-clause to a python block. For example:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">init</span> <span class="k">python</span> <span class="k">in</span> <span class="n">stats</span><span class="p">:</span>
<span class="k">def</span> <span class="nf">reset</span><span class="p">():</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Code to reset the statistics.</span>
<span class="sd"> &quot;&quot;&quot;</span>
</pre></div>
</div>
<p>User-created stores are placed into the &quot;store&quot; package, with the default
store being the package itself. Names can be imported between packages.:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">init</span> <span class="k">python</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">store.stats</span> <span class="kn">import</span> <span class="n">reset</span>
<span class="k">init</span> <span class="k">python</span> <span class="k">in</span> <span class="n">stats</span><span class="p">:</span>
<span class="kn">from</span> <span class="nn">store</span> <span class="kn">import</span> <span class="n">ToggleField</span>
</pre></div>
</div>
<p>Note that stores do not affect the order in which init python blocks are run.
A name must be defined in a block before the one that imports that name.</p>
</div>
<div class="section" id="platform-support-and-library-updates">
<h3>Platform Support and Library Updates<a class="headerlink" href="#platform-support-and-library-updates" title="Permalink to this headline"> link</a></h3>
<p>Linux support has been changed.</p>
<ul class="simple">
<li>The Linux platform supports the x86_64 CPU architecture in addition to the
x86 architecture. The Ren'Py shell script will automatically determine the
platform it is running on when it is launched.</li>
<li>The Linux version is now linked against the libraries from the 2009-era
Ubuntu 10.04 Lucid. (Previously, Ren'Py had been linked against 2006's
Dapper.) Older versions of Linux are no longer supported.</li>
</ul>
<p>Many libraries that Ren'Py depends on have been updated. Some of the changes
that have occurred are:</p>
<ul class="simple">
<li>Python has been updated to version 2.7.3.</li>
<li>Pygame has been updated to version 1.9.1.</li>
<li>GLEW has been updated to version 1.7.0. This may fix OpenGL problems on
some Linux systems.</li>
<li>LibAV has been updated to version 0.7.6, and has been compiled with CPU
detection enabled.</li>
</ul>
</div>
<div class="section" id="id36">
<h3>Other Changes<a class="headerlink" href="#id36" title="Permalink to this headline"> link</a></h3>
<ul>
<li><p class="first">The <a class="reference internal" href="statement_equivalents.html#renpy.call" title="renpy.call"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.call()</span></code></a> function allows with major and important caveats
a call to a Ren'Py label to begin from inside Python code. Such a call
immediately terminates the current statement.</p>
</li>
<li><p class="first">When an action is expected, nested lists of actions can be given. The
lists are flattened and the action executed.</p>
</li>
<li><p class="first">Added the <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> action, which opens a URL in a web browser.</p>
</li>
<li><p class="first">Added the <a class="reference internal" href="config.html#var-config.gl_resize"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.gl_resize</span></code></a> variable, which determines if the user
can resize OpenGL windows.</p>
</li>
<li><p class="first">Ren'Py's handling of command line arguments has been rewritten. Most
notably, lint is now invoked with the:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">renpy</span><span class="o">.</span><span class="n">sh</span> <span class="o">&lt;</span><span class="n">gamename</span><span class="o">&gt;</span> <span class="n">lint</span>
</pre></div>
</div>
<p>command. (Which also works with renpy.exe.)</p>
</li>
<li><p class="first">Ren'Py can now dump information about the game to a json file when
starting up. The information dumped can assist other tools in providing
launcher-like code navigation.</p>
</li>
<li><p class="first">The little-used remote control feature has been removed from Ren'Py.</p>
</li>
<li><p class="first">The <a class="reference internal" href="config.html#var-config.gl_resize"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.gl_resize</span></code></a> variable now controls resizing of a game
running in GL mode.</p>
</li>
<li><p class="first">Documentation fixes (by SleepKirby and others).</p>
</li>
<li><p class="first">The NVL-Mode tutorial has been ported to Sphinx (by Apricotorange).</p>
</li>
<li><p class="first">Ren'Py now defaults to reporting errors with sound and music files when
config.developer is True.</p>
</li>
</ul>
</div>
</div>
<div class="section" id="ren-py-6-13-9">
<h2>Ren'Py 6.13.9<a class="headerlink" href="#ren-py-6-13-9" title="Permalink to this headline"> link</a></h2>
<p>The new RAPT tool makes it far easier to package a Ren'Py game for Android. It
can semi-automatically set up an Android build environment on your system,
build a package, and install that package on your Android device.</p>
<p>To fix some editor-related problems, backported the 6.14 editor system. This
changes how editors are configured. Please see <a class="reference internal" href="editor.html"><span class="doc">Text Editor Integration</span></a>
for a description of the new system.</p>
<p>The new <a class="reference internal" href="config.html#var-config.save_dump"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.save_dump</span></code></a> variable causes Ren'Py to write out
save_dump.txt each time it saves. This file describes the contents of the
save, making it possible to figure out what's causing an overly large save
file.</p>
<p>Worked around a bug in Mesa that can cause crashes on certain Linux systems.</p>
<p>Fixed the following bugs in Ren'Py.</p>
<ul class="simple">
<li>The (default) texwrap layout represents character widths as floating-point
numbers. This fixes a bug where non-integer kerning would lead to text
overflowing its bounding box.</li>
<li>Menu choices are logged correctly.</li>
<li>All file access is now done in Unicode, rather than the system's native
encoding. This prevents crashes that occurred when Ren'Py was placed in a
directory that had non-ASCII characters in it.</li>
<li>Fixed focus_mask on the ANGLE renderer.</li>
<li>Displayables can now have fractional-pixel sizes. This allows a zooming
image to remain precisely centered on the screen.</li>
<li>Fixed a problem where Ren'Py would save unnecessary trees of displayables
each time it saved a screen. This would lead to overly large save files and
slow save performance.</li>
<li>Ren'Py would not attempt an alternate rendering method if the texture test
failed, leading a &quot;Textures are not rendering properly.&quot; exception.</li>
<li>A crash in Render.fill.</li>
</ul>
</div>
<div class="section" id="ren-py-6-13-8">
<h2>Ren'Py 6.13.8<a class="headerlink" href="#ren-py-6-13-8" title="Permalink to this headline"> link</a></h2>
<p>Side images can now be limited to showing a single character, or only showing
characters that are not on the screen. See <a class="reference internal" href="side_image.html#var-config.side_image_tag"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.side_image_tag</span></code></a> and
<a class="reference internal" href="side_image.html#var-config.side_image_only_not_showing"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.side_image_only_not_showing</span></code></a>.</p>
<p>Added <a class="reference internal" href="config.html#var-config.python_callbacks"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.python_callbacks</span></code></a>, a list of Python functions that are
called at the end of each python block.</p>
<p>Ren'Py now tests the video card it is running on for functionality. If it
can't draw textured rectangles to the screen, it will proceed to a different
renderer.</p>
<p>Old-style string interpolation is now enabled by default, alongside new-style
string interpolation.</p>
<p>Ren'Py is now compatible with libpng 1.5. Thanks to James Broadhead for the
patch.</p>
<p>Fixed the following bugs:</p>
<ul class="simple">
<li>A crash when dealing with certain invalid fonts.</li>
<li>Pausing too long when typing out text.</li>
<li>Cutting one pixel off a block of text when fractional kerning was used.</li>
<li>Crashing when the time was set in the far future or past.</li>
<li>Immediately exiting when rolling forward at the quit prompt.</li>
<li>Crashing when a non-existing directory is added to the search path. (This
prevented Katawa Shoujo from starting in the latest version.)</li>
<li>Save-file size was overly large due to screens being included in save
files.</li>
</ul>
</div>
<div class="section" id="ren-py-6-13">
<h2>Ren'Py 6.13<a class="headerlink" href="#ren-py-6-13" title="Permalink to this headline"> link</a></h2>
<div class="section" id="text-rewrite">
<h3>Text Rewrite<a class="headerlink" href="#text-rewrite" title="Permalink to this headline"> link</a></h3>
<p><a class="reference internal" href="text.html"><span class="doc">Text display</span></a> has been rewritten from scratch. In addition to
supporting many new features, the new implementation of Text is much faster
at text layout and display, and contains much cleaner code.</p>
<p>Some of the new features that are now supported by the text display system are:</p>
<ul>
<li><p class="first">Interpolation of variables enclosed in square brackets. It's now possible
to write code like:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="s2">&quot;You scored [score] out of a possible [max_score] points.&quot;</span>
</pre></div>
</div>
<p>The new string interpolation takes place on all text that is displayed,
rather than just say and menu statements. When used as part of a screen,
interpolation has access to screen-local variables.</p>
<p>PEP 3101-style string formatting is supported, which means that this
syntax can be used to display fields and items, as well as variables.</p>
</li>
<li><p class="first">Kerning support was added, both as the <a class="reference internal" href="style_properties.html#style-property-kerning"><code class="xref std std-propref docutils literal notranslate"><span class="pre">kerning</span></code></a> style property
and the <a class="reference internal" href="text.html#text-tag-k"><code class="xref std std-tt docutils literal notranslate"><span class="pre">k</span></code></a> text tag.</p>
</li>
<li><p class="first">Support for ruby text (also known as furigana), via the <a class="reference internal" href="text.html#text-tag-rt"><code class="xref std std-tt docutils literal notranslate"><span class="pre">rt</span></code></a> and
<a class="reference internal" href="text.html#text-tag-rb"><code class="xref std std-tt docutils literal notranslate"><span class="pre">rb</span></code></a> text tags, and the <a class="reference internal" href="style_properties.html#style-property-ruby_style"><code class="xref std std-propref docutils literal notranslate"><span class="pre">ruby_style</span></code></a> style property.</p>
</li>
<li><p class="first">The new <a class="reference internal" href="text.html#text-tag-space"><code class="xref std std-tt docutils literal notranslate"><span class="pre">space</span></code></a> and <a class="reference internal" href="text.html#text-tag-vspace"><code class="xref std std-tt docutils literal notranslate"><span class="pre">vspace</span></code></a> text tags make it easy to whitespace
into the text.</p>
</li>
<li><p class="first">The new <a class="reference internal" href="text.html#text-tag-cps"><code class="xref std std-tt docutils literal notranslate"><span class="pre">cps</span></code></a> text tag controls the speed of text display.</p>
</li>
<li><p class="first">By default, Ren'Py uses the Unicode linebreaking algorithm to find points
at which a line can be broken. This algorithm should correctly break lines
that contain a mix of western and eastern languages. Since that algorithm
is incorrect on some Korean texts, Ren'Py also implements a
korean-with-spaces variant, that only breaks runs of Korean text at
whitespace. These algorithms can be selected by the <a class="reference internal" href="style_properties.html#style-property-language"><code class="xref std std-propref docutils literal notranslate"><span class="pre">language</span></code></a>
style property.</p>
</li>
<li><p class="first">Ren'Py now uses the Knuth-Plass linebreaking algorithm to choose the
points at which it actually splits lines. This algorithm attempts to
minimize the unevenness of all lines except the last. Ren'Py also supports
a nobreak mode, which allows one to create a Text larger than the screen
without it being automatically wrapped. These can be selected using the
<a class="reference internal" href="style_properties.html#style-property-layout"><code class="xref std std-propref docutils literal notranslate"><span class="pre">layout</span></code></a> style property.</p>
</li>
<li><p class="first">The new <a class="reference internal" href="style_properties.html#style-property-newline_indent"><code class="xref std std-propref docutils literal notranslate"><span class="pre">newline_indent</span></code></a> style property determines if Ren'Py adds
indentation after a newline in text.</p>
</li>
<li><p class="first">The new <a class="reference internal" href="style_properties.html#style-property-line_leading"><code class="xref std std-propref docutils literal notranslate"><span class="pre">line_leading</span></code></a> style property inserts space above a line
of text. (Ruby text can be placed into this space.)</p>
</li>
<li><p class="first">Text can be automatically translated before it is displayed. (This support
will be improved in a future major release.)</p>
</li>
</ul>
</div>
<div class="section" id="directx-support">
<h3>DirectX Support<a class="headerlink" href="#directx-support" title="Permalink to this headline"> link</a></h3>
<p>On Windows systems that have the February 2010 DirectX update installed,
Ren'Py will use DirectX via the ANGLE adaptation layer, if OpenGL 2.0 or
later is not found. The ANGLE layer is used by popular web browsers such as
Firefox and Google Chrome. This allows hardware rendering to be used on
netbooks, where drivers often support DirectX far better than OpenGL.</p>
<p>At startup, Ren'Py will test the graphics capabilities of the computer it is
running on. If the software render is being used, or the game renders at an
unacceptably slow speed, Ren'Py will display a warning message to the user.
The warning message includes a link to a page on renpy.org that explains how
to update the graphics drivers.</p>
<p>This version of Ren'Py will only use the software renderer if both DirectX and
OpenGL are incapable of rendering Ren'Py games. Screen-scaling in the
software renderer has been replaced by a simpler but slower version.</p>
</div>
<div class="section" id="id37">
<h3>Other Changes<a class="headerlink" href="#id37" title="Permalink to this headline"> link</a></h3>
<ul>
<li><p class="first">Ren'Py now includes a <a class="reference internal" href="style.html#style-preferences"><span class="std std-ref">style preference</span></a> system.
This system allows styles to be changed after the init phase has finished.
These changes are saved with the persistent data. Among other things, style
preferences allow a game to offer the user the option to change the font,
size, and color of dialogue text.</p>
</li>
<li><p class="first">Support has been added for screen-based
<a class="reference internal" href="rooms.html#image-gallery"><span class="std std-ref">image galleries</span></a> and <a class="reference internal" href="rooms.html#music-room"><span class="std std-ref">music rooms</span></a>.
This support consists of a classes that provides actions that make it easy
to present the user with graphics and music. The creator is responsible for
creating screens that use the supplied actions.</p>
</li>
<li><p class="first">The default screens.rpy file, used when a new game is created, contains
support for a &quot;quick menu&quot;. This menu adds buttons to screens that allow
the user to quick save, quick load, save, toggle skipping, toggle
auto-forward mode, and access the preferences menu.</p>
</li>
<li><p class="first">Ren'Py includes 5 new themes, and a number of new color schemes.</p>
</li>
<li><p class="first">Several new actions have been added. The <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> action allows
the creator to control if a button is displayed in the selected state. The
<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> action allows a mixer to be set to a specific value. The
<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> and <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> actions allow the creator to bind
rollback to buttons.</p>
</li>
<li><p class="first">The behavior of the xfill and yfill style properties was accidentally
changed in the 6.12 series. It has been returned to the historical behavior.</p>
</li>
<li><p class="first">The <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> and <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> transitions now take a
time_warp parameter.</p>
</li>
<li><p class="first">The <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> displayable now allows the user to specify the left,
top, right, and bottom borders independently.</p>
</li>
<li><p class="first">The <a class="reference internal" href="style_properties.html#style-property-caret"><code class="xref std std-propref docutils literal notranslate"><span class="pre">caret</span></code></a> style property allows the user to customize the caret
of an input widget.</p>
</li>
<li><p class="first">The <a class="reference internal" href="cdd.html#renpy.displayable" title="renpy.displayable"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.displayable()</span></code></a> function has been exposed to the user.</p>
</li>
<li><p class="first">Timers can now take a list of actions, rather than just a single callable.</p>
</li>
<li><p class="first">Three transforms were added to the default library: <a class="reference internal" href="transforms.html#var-top"><code class="xref std std-var docutils literal notranslate"><span class="pre">top</span></code></a>,
<a class="reference internal" href="transforms.html#var-topleft"><code class="xref std std-var docutils literal notranslate"><span class="pre">topleft</span></code></a>, and <a class="reference internal" href="transforms.html#var-topright"><code class="xref std std-var docutils literal notranslate"><span class="pre">topright</span></code></a>.</p>
</li>
<li><p class="first">Ren'Py can now load files (including images, music, and fonts) from an
Android package.</p>
</li>
<li><p class="first">User-defined statements can now take a block, which the statement is
responsible for parsing.</p>
</li>
<li><p class="first">Wrote documentation for:</p>
<ul class="simple">
<li><a class="reference internal" href="menus.html#menus"><span class="std std-ref">Menus</span></a></li>
<li><a class="reference internal" href="transforms.html#transforms"><span class="std std-ref">Transforms</span></a></li>
<li><a class="reference internal" href="cdd.html#cdd"><span class="std std-ref">Creator-Defined Displayables</span></a></li>
</ul>
<p>Several indexes were added to the documentation, and the style was updated.</p>
</li>
<li><p class="first">Ren'Py now uses the libjpeg-turbo library, for faster jpeg loading. Ren'Py
now uses libav 0.7.1, for improved compatibility with movie formats.</p>
</li>
<li><p class="first">Removed support for the iLiad platform.</p>
</li>
<li><p class="first">PowerPC support has been removed from the main Ren'Py distribution. It's
available as a download from the Ren'Py web site.</p>
</li>
</ul>
<p>Thanks to Aleema for contributing the new themes and color schemes.</p>
</div>
</div>
<div class="section" id="ren-py-6-12-2">
<h2>Ren'Py 6.12.2<a class="headerlink" href="#ren-py-6-12-2" title="Permalink to this headline"> link</a></h2>
<p>This release contains the following changes:</p>
<ul class="simple">
<li>ATL Transforms with parameters compile correctly.</li>
<li>MultipleTransition works in conjunction with pauses.</li>
<li>The mouse is shown when a quit action is run while a movie is playing.</li>
<li>A fix for a lockup that occurred when the user entered the game menu while
a transition was running.</li>
<li>RENPY_SCALE_FAST works again.</li>
<li>Ren'Py compiles with newer versions of ffmpeg.</li>
<li>Skipping ends when the game restarts.</li>
<li>Fixed a problem with texture upload that made games noticeably slower.</li>
<li>Choose a better default size for windows on small monitors, like netbooks.</li>
<li>xfill and yfill now work for vbox and hbox, respectively.</li>
<li>Click-to-continue fixes.</li>
<li>Side image fixes.</li>
<li>Documentation fixes.</li>
</ul>
<p>Thanks to David Gowers and zhangning for contributing patches to this release.</p>
</div>
<div class="section" id="ren-py-6-12-1">
<h2>Ren'Py 6.12.1<a class="headerlink" href="#ren-py-6-12-1" title="Permalink to this headline"> link</a></h2>
<div class="section" id="image-attributes">
<h3>Image Attributes<a class="headerlink" href="#image-attributes" title="Permalink to this headline"> link</a></h3>
<p>The process of showing images is now attribute-based. Image names now consist
of a tag, and zero or more attributes. When showing an image, the order of
attributes is no longer important it's now possible to define an image
using one set of attributes, and show it using those attributes in a
different order.</p>
<p>Attributes are also &quot;sticky&quot;. This means that we attempt to preserve as many
attributes as possible when showing a new image.</p>
<p>For example, say we had the following images:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">image</span> <span class="n">eileen</span> <span class="n">beach</span> <span class="n">happy</span> <span class="o">=</span> <span class="s2">&quot;eileen_beach_happy.png&quot;</span>
<span class="k">image</span> <span class="n">eileen</span> <span class="n">beach</span> <span class="n">woozy</span> <span class="o">=</span> <span class="s2">&quot;eileen_beach_woozy.png&quot;</span>
</pre></div>
</div>
<p>We can now show the first image using the command:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">show</span> <span class="n">eileen</span> <span class="n">happy</span> <span class="n">beach</span>
</pre></div>
</div>
<p>Since the order of attributes no longer matters, this will show the &quot;eileen
beach happy&quot; image. If we follow this with the show statement:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">show</span> <span class="n">eileen</span> <span class="n">woozy</span>
</pre></div>
</div>
<p>the image &quot;eileen beach woozy&quot; will be shown. (Assuming no other images exist.
If the image &quot;eileen happy woozy&quot; existed, an ambiguity error would occur.)</p>
<p>When an image tag is shown without any attributes, then the current attributes
are retained. Now, one can write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">show</span> <span class="n">eileen</span> <span class="k">at</span> <span class="n">right</span>
</pre></div>
</div>
<p>to display Eileen on the right side of the screen, without changing the
attributes supplied to an image.</p>
<p><strong>Say Attributes.</strong> Image attributes can be updated as part of a say
statement. A character can be given an <cite>image</cite> argument, giving the name of
an image that character is linked to. As part of the say statement, image
attributes can be given before the dialogue string. These attributes are
given to the linked image.</p>
<p>For example, if we define a character using the code:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">define</span> <span class="n">e</span> <span class="o">=</span> <span class="n">Character</span><span class="p">(</span><span class="s1">&#39;Eileen&#39;</span><span class="p">,</span> <span class="k">image</span><span class="o">=</span><span class="s2">&quot;eileen&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>the code:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="n">woozy</span> <span class="s2">&quot;I think I&#39;m getting too much sun.&quot;</span>
</pre></div>
</div>
<p>is equivalent to:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">show</span> <span class="n">eileen</span> <span class="n">woozy</span>
<span class="n">e</span> <span class="s2">&quot;I think I&#39;m getting too much sun.&quot;</span>
</pre></div>
</div>
<p>whenever an image with the tag eileen is being shown.</p>
<p><strong>Side Image.</strong> This release features a new implementation of
<a class="reference internal" href="side_image.html"><span class="doc">Side Images</span></a>, which allows side images to be defined like other images,
and allows side images to be integrated with screens easily.</p>
<p><strong>Sticky Transforms.</strong> Finally, showing an image without providing a transform
or ATL block will now continue the previous transform that an image with that
tag was using. Previously, it caused those transforms to stop.</p>
</div>
<div class="section" id="error-handling">
<h3>Error Handling<a class="headerlink" href="#error-handling" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now has a new exception handing framework. Instead of always crashing
when an error occurs, Ren'Py will now display the error message on the
screen, and give the user the following choices, as appropriate to the
situation:</p>
<ul class="simple">
<li>Rollback</li>
<li>Reload</li>
<li>Ignore</li>
<li>Open Traceback</li>
<li>Quit</li>
</ul>
<p>When an editor is defined, Ren'Py will allow the user to click on a filename
and line number to open that line in the editor.</p>
<p>The framework is used to handle exceptions and parse errors.</p>
</div>
<div class="section" id="id38">
<h3>Other<a class="headerlink" href="#id38" title="Permalink to this headline"> link</a></h3>
<p>When in OpenGL mode, Ren'Py now remembers the window size between sessions.
(This can be disabled using <a class="reference internal" href="config.html#var-config.save_physical_size"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.save_physical_size</span></code></a>, and it may
make sense to do so if your game is using the pre-screen preferences system.)
Choosing the &quot;Window&quot; display preference now resizes the window to 100% of
normal size.</p>
<p>Added the <a class="reference internal" href="style_properties.html#style-property-xcenter"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xcenter</span></code></a> and <a class="reference internal" href="style_properties.html#style-property-ycenter"><code class="xref std std-propref docutils literal notranslate"><span class="pre">ycenter</span></code></a> position and transform
properties. These set the position of the center of a displayable.</p>
<p>The <a class="reference internal" href="other.html#renpy.vibrate" title="renpy.vibrate"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.vibrate()</span></code></a> function allows Ren'Py to ask Android devices to
vibrate.</p>
<p>The hyperlink style, callback, and focus functions have now been moved to the
<a class="reference internal" href="style_properties.html#style-property-hyperlink_functions"><code class="xref std std-propref docutils literal notranslate"><span class="pre">hyperlink_functions</span></code></a> style property. This allows the functions to
be changed on a per-style basis.</p>
<p>Indentation errors are now reported on the indented line, and not the line
preceding the erroneous indentation.</p>
<p>Added the <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> and <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> actions.
These allow screen-local variables to be changed.</p>
<p>Ren'Py now attempts to elide personal information from filenames. Where
possible, filenames are reported relative to the base or Ren'Py base
directories, rather than the root of the filesystem.</p>
<p>The new <a class="reference internal" href="style_properties.html#style-property-box_wrap"><code class="xref std std-propref docutils literal notranslate"><span class="pre">box_wrap</span></code></a> style property allows hboxes and vboxes to
automatically wrap when they reach the edge of their enclosing area.</p>
<p>Actions now can have an <a class="reference internal" href="screen_python.html#Action.unhovered" title="Action.unhovered"><code class="xref py py-func docutils literal notranslate"><span class="pre">Action.unhovered()</span></code></a> method. This method is called
when an action supplied as a <cite>hovered</cite> parameter loses focus.</p>
<p>Added the <a class="reference internal" href="screen_actions.html#Tooltip" title="Tooltip"><code class="xref py py-class docutils literal notranslate"><span class="pre">Tooltip</span></code></a> class, which makes it easier to define tooltips as
part of a screen.</p>
<p>Added <a class="reference internal" href="config.html#var-config.debug_text_overflow"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.debug_text_overflow</span></code></a>, which controls the logging of cases
where text exceeds its allocated area.</p>
<p>Ren'Py no longer attempts to adjust the system level mixer controls, which
means that it's no longer possible to raise the volume from within Ren'Py.
Controlling the system volume exhibited bugs on all three platforms,
including hard-to-predict volume changes that affect other applications.</p>
<p>Along with the new features, transitions have been documented in the new
manual.</p>
<p>Archives are now automatically detected in asciibetical order. See the
documentation for <a class="reference internal" href="config.html#var-config.archives"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.archives</span></code></a> for more details.</p>
<p>Bug fixes:</p>
<ul class="simple">
<li><a class="reference external" href="https://bugs.launchpad.net/renpy/+bug/734137">launchpad bug 734137</a> - Timers do not participate in rollback.</li>
<li><a class="reference external" href="https://bugs.launchpad.net/renpy/+bug/735187">launchpad bug 735187</a> - Ren'Py get stuck when using {nw}. (Thanks to Franck_v
for tracking this down.)</li>
</ul>
</div>
</div>
<div class="section" id="ren-py-6-12-0">
<h2>Ren'Py 6.12.0<a class="headerlink" href="#ren-py-6-12-0" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id39">
<h3>Android Support<a class="headerlink" href="#id39" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now supports the Android platform. This includes support for a large
fraction of Ren'Py's functionality, although we were unable to add support
for imagedissolves and movie playback. It should be possible to package a
Ren'Py game and distribute it through the Android market.</p>
<p>Android support required several changes in Ren'Py:</p>
<ul class="simple">
<li>The OpenGL renderer has been extended to support OpenGL ES.</li>
<li>For performance reasons, much of the display system has been rewritten in
the Cython language. This also should improve performance on other
platforms.</li>
<li>Support was added for the Android lifecycle. Ren'Py automatically saves
when the android device suspends, and reloads (if necessary) upon resume.</li>
<li>We added the concept of <a class="reference internal" href="screens.html#screen-variants"><span class="std std-ref">Screen Variants</span></a>. This allows a single game
to have multiple interfaces such a mouse interface for computer
platforms, and a touch interface for Android-based smartphones and tablets.</li>
<li>We built a system that allows one to package a game separately from
Ren'Py. This allows one to build packages without having to set up the
Android NDK (you'll still need the Android SDK, Java, Python, Ant, and a
lot of patience).</li>
</ul>
</div>
<div class="section" id="new-widgets-and-displayables">
<h3>New Widgets and Displayables<a class="headerlink" href="#new-widgets-and-displayables" title="Permalink to this headline"> link</a></h3>
<p>Added the <a class="reference internal" href="sprites.html#sprites"><span class="std std-ref">SpriteManager</span></a> displayable. This provides a
high-performance way of drawing many similar sprites to the screen. This can
scale to hundreds of particles, provided those particles are mostly similar
to each other.</p>
<p>Added the <a class="reference internal" href="screens.html#mousearea"><span class="std std-ref">Mousearea</span></a> widget. A mousearea allows hovered and unhovered
callbacks to occur when the mouse enters and leaves an area of the screen.
Since it doesn't participate in the focus system, a mousearea can include
buttons and bars.</p>
<p>Added <a class="reference internal" href="drag_drop.html"><span class="doc">Drag and Drop</span></a> widgets and displayables. The drag and drop system
can support:</p>
<ul class="simple">
<li>Windows being repositioned by the user.</li>
<li>Card games.</li>
<li>Inventory systems.</li>
<li>Drag-to-reorder systems.</li>
</ul>
</div>
<div class="section" id="id40">
<h3>Image Prediction<a class="headerlink" href="#id40" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py is now better at predicting image usage. Along with predicting images
used by normal gameplay, it now attempts to predict images that are used by
screens one click away from the user. For example, during normal gameplay, it
will predict images on the first screen of the game menu. While at the game
menu, it will predict the other screens of the game menu, and also the images
the user will see when returning to the main menu. This prediction is
automatic, but only occurs when using screens.</p>
<p>Screens may be invoked at any time, in order to allow for image prediction,
unless they have a predict property of False. This means that displaying a
screen should not have side effects. (Most screens only have side effects
when a button is clicked or a bar changed that's still fine.)</p>
<p>Ren'Py now supports hotspot caching for screen language imagemaps. When
<a class="reference internal" href="config.html#var-config.developer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.developer</span></code></a> is true, Ren'Py will write a PNG file in the
game/cache/ directory containing image data for each of the hotspots in the
imagemap. If the cache file exists (regardless of the config.developer
setting) it will be loaded instead of loading the hotspot images. As the
cache file is often much smaller than the size of the hotspot images, it will
load faster and reduce image cache pressure, improving game performance. This
behavior only applies to screen language imagemaps, and can be disabled with
<code class="xref std std-var docutils literal notranslate"><span class="pre">config.imagemap_cache</span></code>.</p>
<p>This should remove most of the need for <code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.cache_pin()</span></code>. While not an
error, the use of cache pinning can cause unnecessary memory usage when the
wrong image is loaded.</p>
</div>
<div class="section" id="screens">
<h3>Screens<a class="headerlink" href="#screens" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now ships with a default set of screens, which are used by the demo and
installed by default when a new game is created. You can find them in
template/game/screens.rpy, and they can be used by copying that file into
your project. These screens are not 100% compatible with the previous layout
system for example, some styles have changed. That's why games must opt-in
to them.</p>
<p>The definition of the <cite>items</cite> parameter of the <a class="reference internal" href="screen_special.html#choice-screen"><span class="std std-ref">Choice</span></a> and
<a class="reference internal" href="screen_special.html#nvl-screen"><span class="std std-ref">NVL</span></a> screens has changed, and games will need to be updated to
work with the new version.</p>
<p>Character arguments beginning with <code class="docutils literal notranslate"><span class="pre">show_</span></code> are passed to the
<a class="reference internal" href="screen_special.html#say-screen"><span class="std std-ref">Say</span></a> screen. This allows things like show_side_image and
show_two_window to work with screens. The screens we ship support these
options.</p>
<p>The new <a class="reference internal" href="config.html#var-config.imagemap_auto_function"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.imagemap_auto_function</span></code></a> variable allows the game-maker to
control the interpretation of the <code class="docutils literal notranslate"><span class="pre">auto</span></code> property of imagemaps and
imagebuttons.</p>
<p>The imagemap caching behavior described above applies only to screens.</p>
<p>The <a class="reference internal" href="screen_actions.html#FilePageName" title="FilePageName"><code class="xref py py-func docutils literal notranslate"><span class="pre">FilePageName()</span></code></a> and <a class="reference internal" href="screen_actions.html#FileSlotName" title="FileSlotName"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileSlotName()</span></code></a> functions make it easier to
name slots</p>
</div>
<div class="section" id="id41">
<h3>Other Improvements<a class="headerlink" href="#id41" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py 6.12 includes a number of other improvements:</p>
<ul class="simple">
<li>We've continued writing the new manual. Notably, we have rewritten the
documentation for displayables.</li>
<li>When taking a screenshot, <a class="reference internal" href="config.html#var-config.screenshot_callback"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.screenshot_callback</span></code></a> is called. The
default implementation of this function notifies the user of the location
of the screenshot.</li>
<li>The <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> and <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> displayables are now tiny and no
longer take up (much) space in the image cache.</li>
<li>We now create a log.txt file, which replaces the old opengl.txt, and can
log other subsystems.</li>
<li>Several missing properties have been added to the screen language.</li>
<li>Ren'Py now treats filenames as if they were case-insensitive. This means
that filename mismatches on Linux should no longer be a problem.</li>
</ul>
</div>
<div class="section" id="id42">
<h3>Bug Fixes<a class="headerlink" href="#id42" title="Permalink to this headline"> link</a></h3>
<ul class="simple">
<li><a class="reference external" href="https://bugs.launchpad.net/renpy/+bug/680266">launchpad bug 680266</a> - Ensures that dynamic displayables update before
Transforms that use them.</li>
<li><a class="reference external" href="https://bugs.launchpad.net/renpy/+bug/683412">launchpad bug 683412</a> - Do not crash if a shader fails to compile.</li>
<li>Fixed a bug that caused Ren'Py to crash when the system volume was lowered
to 0, but not muted.</li>
<li>Fixed a bug that prevented <code class="xref py py-func docutils literal notranslate"><span class="pre">Render.canvas()</span></code> from working with the
OpenGL renderer.</li>
</ul>
</div>
</div>
<div class="section" id="ren-py-6-11-2">
<h2>Ren'Py 6.11.2<a class="headerlink" href="#ren-py-6-11-2" title="Permalink to this headline"> link</a></h2>
<div class="section" id="new-features">
<h3>New Features<a class="headerlink" href="#new-features" title="Permalink to this headline"> link</a></h3>
<p>This release includes four new themes, generously contributed by Aleema. You
can see and change to these new themes by clicking the &quot;Choose Theme&quot; button
in the launcher.</p>
</div>
<div class="section" id="software-update">
<h3>Software Update<a class="headerlink" href="#software-update" title="Permalink to this headline"> link</a></h3>
<p>The jEdit text editor included with Ren'Py has been updated to version 4.3.2,
a supported version that should be able to run most plugins.</p>
</div>
<div class="section" id="behavior-changes">
<h3>Behavior Changes<a class="headerlink" href="#behavior-changes" title="Permalink to this headline"> link</a></h3>
<p>The maximum default physical size of the Ren'Py window is now 102 pixels
smaller than the height of the screen. This should prevent Ren'Py from
creating windows that can't be resized since they are much bigger than the
screen.</p>
<p>Buttons now only pass key events to their children when they are focused. This
allows a screen language key statement to be used as the child of a button,
and only activate when the button is focused.</p>
<p>MoveTransition was rewritten to correctly deal with cases in which images
changed their order. This may lead to differences in behavior from the old
version, where the ordering was undefined.</p>
</div>
<div class="section" id="id43">
<h3>Bug fixes<a class="headerlink" href="#id43" title="Permalink to this headline"> link</a></h3>
<p>Fixed <a class="reference external" href="https://bugs.launchpad.net/renpy/+bug/647686">launchpad bug 647686</a>, a regression that prevented sounds from looping
properly.</p>
<p>Fixed <a class="reference external" href="https://bugs.launchpad.net/renpy/+bug/661983">launchpad bug 661983</a>, which caused insensitive hotspots to default to the
idle, rather than ground, image when no insensitive image was supplied.</p>
<p>Fixed <a class="reference external" href="https://bugs.launchpad.net/renpy/+bug/647324">launchpad bug 647324</a>, where ImageDissolves are rendered as if specified with
alpha=True whether or not alpha=True was set.</p>
<p>Fixed a problem that caused the game to start when picking &quot;No&quot; after clicking
the (window-level) quit button.</p>
<p>Fixed a problem that prevented AnimatedValue from functioning properly when
delay was not 1.0. Thanks to Scout for the fix.</p>
<p>Fixed a problem that caused movies to display incorrectly when the screen was
scaled using OpenGL scaling.</p>
</div>
</div>
<div class="section" id="ren-py-6-11-1">
<h2>Ren'Py 6.11.1<a class="headerlink" href="#ren-py-6-11-1" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id44">
<h3>New Features<a class="headerlink" href="#id44" title="Permalink to this headline"> link</a></h3>
<p>Add the <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> displayable and the <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>
transition. These take two displayables, and use the alpha channel of a third
displayable to blend them together. (The third displayable is often an
animation, allowing the effect to change over time.)</p>
<p>The new <a class="reference internal" href="modes.html"><span class="doc">Modes</span></a> system allows one to invoke callbacks when switching from
one type of interaction to another. This can be used, for example, to
automatically hide the window before transitions.</p>
<p>Imagemaps created using the screen language now only have a size equal to that
of their ground image. (Previously, they took up the entire screen.) This
change makes it easier to position an imagemap at a different location on
screen, such as the bottom.</p>
<p>Imagemaps now take an alpha argument. If true (the default), hotspots are only
focused if the mouse is over a non-transparent part of the idle or hover
image. If set to false, the hotspot is focused whenever the mouse is within
its boundaries.</p>
<p>Added the <a class="reference internal" href="other.html#renpy.focus_coordinates" title="renpy.focus_coordinates"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.focus_coordinates()</span></code></a> function, which returns the
coordinates of the currently focused displayable, when possible.</p>
<p>The new <a class="reference internal" href="other.html#renpy.notify" title="renpy.notify"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.notify()</span></code></a> function and <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> action make it simple
to flash small status messages on the screen, such as might be used to notify
the user of a completed quicksave or screenshot.</p>
<p>The new <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> action allows the interface to temporarily be
hidden, as a screen language action.</p>
<p>The developer menu now includes a command that will list all the files in the
game directory.</p>
<p>The urllib and urllib2 modules from the Python standard library are now
distributed as part of Ren'Py. These modules allow data to be retrieved from
web servers.</p>
<p>The launcher now includes an experimental updater, that makes it easier to
update to the latest pre-release. Hitting Shift+U at the launcher's main
screen will cause Ren'Py to be updated.</p>
</div>
<div class="section" id="id45">
<h3>Fixes<a class="headerlink" href="#id45" title="Permalink to this headline"> link</a></h3>
<p><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> now respects the xoffset and yoffset parameters.</p>
<p>Fixed several bugs with screen-language imagemaps.</p>
<p>Fixed a bug (#626303) that was caused by an incorrect texture unit check.
Thanks to tmrwiz for the fix.</p>
<p>Transforms no longer cause a divide by zero exception when the zoom, xzoom, or
yzoom properties are 0.</p>
<p>Clockwise and counterclockwise revolution in transforms now works.</p>
<p>Fixed a bug with scaling, that occurred when switching between the scaled
software and GL renderers.</p>
<p>Hidden screens are no longer considered when assigning default focus.</p>
<p>FieldValues with max_is_zero set to True now work properly. Thanks to
SleepKirby for the fix.</p>
</div>
</div>
<div class="section" id="ren-py-6-11-0">
<h2>Ren'Py 6.11.0<a class="headerlink" href="#ren-py-6-11-0" title="Permalink to this headline"> link</a></h2>
<div class="section" id="opengl-support">
<h3>OpenGL Support<a class="headerlink" href="#opengl-support" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py will now take advantage of a computer's OpenGL hardware acceleration,
if supported. This OpenGL support has several user-visible changes:</p>
<ul class="simple">
<li>The window containing a Ren'Py game can be resized or maximized, using
standard window controls. When the window's aspect ratio does not match the
game's aspect ratio, black bars will be added.</li>
<li>Displaying in full-screen mode should not change the monitor's resolution.
This will prevent the game from being distorted when displayed on a monitor
with a different aspect ratio.</li>
<li>Unless disabled in the video driver configuration, Ren'Py will use
vertical blank synchronization, eliminating image tearing.</li>
<li>GPU rendering is used, which should make drawing the screen faster in most
circumstances.</li>
</ul>
<p>Software rendering is still supported, and Ren'Py will automatically fall back
to software rendering if it detects an improperly configured video card.</p>
<p>You can test that Ren'Py is in OpenGL mode by attempting to resize the window.
If it's resizable, it's OpenGL, otherwise, software rendering is being used.</p>
</div>
<div class="section" id="screens-and-screen-language">
<h3>Screens and Screen Language<a class="headerlink" href="#screens-and-screen-language" title="Permalink to this headline"> link</a></h3>
<p>This release introduces a new screen system, which allows one to use the new
screen language to declaratively specify portions of the user interface. The
screen language supersedes layouts, overlay functions, imagemaps, and most
other means of customizing the out-of-game menus and the in-game screens.</p>
<p>The previous way of customizing the behavior of the game menu, the layout
system, had problems, especially when using imagemap layouts. Screens were
single-purpose, and it would be difficult to (for example) load a quick-save
game from the main menu, without extensive Python code.</p>
<p>The screen system addresses this by providing a pool of functionality, in the
form of Actions and BarValues. This makes it possible to pick and choose
functionality, and add it to screens as is deemed necessary.</p>
</div>
<div class="section" id="id46">
<h3>Transform Changes<a class="headerlink" href="#id46" title="Permalink to this headline"> link</a></h3>
<ul>
<li><p class="first">If a transform does not define one of the position properties
<a class="reference internal" href="style_properties.html#style-property-xpos"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xpos</span></code></a>, <a class="reference internal" href="style_properties.html#style-property-ypos"><code class="xref std std-propref docutils literal notranslate"><span class="pre">ypos</span></code></a>, <a class="reference internal" href="style_properties.html#style-property-xanchor"><code class="xref std std-propref docutils literal notranslate"><span class="pre">xanchor</span></code></a>, or
<a class="reference internal" href="style_properties.html#style-property-yanchor"><code class="xref std std-propref docutils literal notranslate"><span class="pre">yanchor</span></code></a>, that property will be taken from the transform's child,
if the defines that property.</p>
<p>This makes it possible to have one transform control a displayable's
vertical motion, and the other control the horizontal. But this is
incompatible with previous behavior, and so can be disabled with the
<a class="reference internal" href="config.html#var-config.transform_uses_child_position"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.transform_uses_child_position</span></code></a> variable.</p>
</li>
<li><p class="first">The new config.default_transform variable allows a transform to specify
the initial transform properties of an image that does not have a more
specific transform applied to it. Its default value is center, a transform
that shows the image at the center-bottom of the screen.</p>
<p>This can lead to a behavior change. When an image is shown, and then shown
transforms, the transform will be initialized to the bottom center of the
screen, not the top-left. The reset transform can be used to reset the
position to the top-left.</p>
</li>
<li><p class="first">Transform (and ui.transform) have been changed so that their arguments can
now be prefixed with a style prefix. One can write
ui.transform(idle_rotate=30, hover_rotate=90) and have it work.</p>
</li>
<li><p class="first">Added the rotate_pad transform property, which controls how Transform pads
rotated displayables. When set to False, _not_ the default, it's now
possible to rotate a (100, 50) displayable by 90 degrees, and have the
result be (50, 100) in size.</p>
</li>
</ul>
</div>
<div class="section" id="id47">
<h3>Other Changes<a class="headerlink" href="#id47" title="Permalink to this headline"> link</a></h3>
<ul>
<li><p class="first">The Ren'Py documentation is in the process of being rewritten. This
changelog is now being maintained as part of the Ren'Py documentation.</p>
</li>
<li><p class="first">Added support for composite style properties, that allow several style
properties to be set using a single parameter. The new composite style
properties are:</p>
<ul class="simple">
<li>pos - takes a pair, and uses it to set xpos and ypos.</li>
<li>anchor - takes a pair, and uses it to set xanchor and yanchor.</li>
<li>align - takes a pair, and uses it to set xalign and yalign. (And hence
xpos, ypos, xanchor, and yanchor.)</li>
<li>area - take (x, y, height, width) pair, and tries to set properties
such that the displayable will be placed inside the rectangle. This sets
the xpos, ypos, xanchor, yanchor, xfill, yfill, xminimum, yminimum,
xmaximum, and ymaximum properties.</li>
</ul>
</li>
<li><p class="first">ui.add can now take transform properties as keyword arguments. If at least
one transform property is present, ui.add will create a transform that
wraps the displayable it's adding to the screen.</p>
</li>
<li><p class="first">The new <code class="xref py py-func docutils literal notranslate"><span class="pre">LiveTile()</span></code> displayable tiles its child, without consuming a
large amount of memory to do so.</p>
</li>
<li><p class="first"><a class="reference internal" href="config.html#var-config.quit_action"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.quit_action</span></code></a> allows one to specify an action that is run when
the quit button (in the corner of the window) is pressed.
config.game_menu_action allows one to specify an action that is run when
entering the game menu.</p>
</li>
<li><p class="first">The <a class="reference internal" href="config.html#var-config.screenshot_crop"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.screenshot_crop</span></code></a> configuration variable controls the area
of the screen that it stored when the user presses the screenshot key.</p>
</li>
<li><p class="first">The <a class="reference internal" href="audio.html#renpy.music.register_channel" title="renpy.music.register_channel"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.music.register_channel()</span></code></a> method now has two additional
parameters, file_prefix and file_suffix. These are prepended and appended
to filenames provided to the registered channel, respectively.</p>
</li>
<li><p class="first">The new <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> method returns a list of files in the
game directory and archives. This can be used to write your own automatic
image loading method, among other things.</p>
</li>
<li><p class="first">The interaction between Character and Text has been rewritten to ensure
that text is only tokenized once. This required changing a few of the
methods on ADVCharacter and NVLCharacter, so code that inherits from those
classes should be checked.</p>
</li>
<li><p class="first">The distribution code has been moved into launcher/distribute.py. This
file can be run from the command line to build distributions in shell
scripts and other automated processes.</p>
</li>
<li><p class="first">When there are transparent areas on the screen, and
<a class="reference internal" href="config.html#var-config.developer"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.developer</span></code></a> is true, the transparent areas are filled with a
checkerboard pattern.</p>
</li>
<li><p class="first">The new <code class="docutils literal notranslate"><span class="pre">input</span></code>, <code class="docutils literal notranslate"><span class="pre">side</span></code>, <code class="docutils literal notranslate"><span class="pre">grid</span></code>, and <code class="docutils literal notranslate"><span class="pre">fixed</span></code> styles were created,
and the corresponding displayables use them by default.</p>
</li>
<li><p class="first">When a style is accessed at init time, and doesn't exist, we divide it
into two parts at the first underscore. If the second part corresponds to
an existing style, we create a new style instead of causing an error.</p>
</li>
<li><p class="first">The Python compiler has been rewritten to use the Python ast module. This
should both improve performance, and improve error handling for Python
syntax.</p>
<p>Because of this change, Ren'Py now ships with and requires Python 2.6.</p>
</li>
<li><p class="first">The following numbered bugs were fixed:</p>
<ul class="simple">
<li>520276 - ctc does not appear when cps interrupted</li>
<li>526297 - im.Rotozoom()s crash when Ren'Py is scaled down. (Thanks to
Spiky Caterpillar for the bug report and fix.)</li>
<li>543785 - Launcher bug on select Projects Directory</li>
<li>583112 - rollback while a movie displayable is shown leaves a video
frame onscreen</li>
<li>595532 - Wrong text in tutorial game. (Thanks to Viliam Búr.)</li>
</ul>
</li>
<li><p class="first">The following other bugs were fixed:</p>
<ul class="simple">
<li>Renamed the internal show and hide methods of Displayable, so those
names can once again be used by user-defined displayables.</li>
<li>Rewrote MultipleTransition (which is used by Fade) to fix some
problems it was exhibiting.</li>
<li>Take the condition parameter to Character into account when
determining if an nvl clear occurs before the next interaction.</li>
</ul>
</li>
</ul>
</div>
</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>