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

2962 lines
228 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

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

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=Edge" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Changelog (Ren&#39;Py 7.x-) &#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="Changelog (Ren&#39;Py 6.11 - 6.99)" href="changelog6.html" />
<link rel="prev" title="Translating Ren&#39;Py" href="translating_renpy.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 current"><a class="current reference internal" href="#">Changelog (Ren'Py 7.x-)</a></li>
<li class="toctree-l1"><a class="reference internal" href="changelog6.html">Changelog (Ren'Py 6.11 - 6.99)</a></li>
<li class="toctree-l1"><a class="reference internal" href="incompatible.html">Incompatible Changes</a></li>
<li class="toctree-l1"><a class="reference internal" href="distributor.html">Distributor Notes</a></li>
<li class="toctree-l1"><a class="reference internal" href="license.html">License</a></li>
<li class="toctree-l1"><a class="reference internal" href="credits.html">Credits</a></li>
<li class="toctree-l1"><a class="reference internal" href="sponsors.html">Ren'Py Development Sponsors</a></li>
</ul>
<ul>
<li class="toctree-l1"><a class="reference internal" href="thequestion.html">Script of The Question</a></li>
<li class="toctree-l1"><a class="reference internal" href="thequestion_nvl.html">NVL-mode script for The Question</a></li>
</ul>
</ul>
</li>
</ul>
<form class="navbar-form navbar-right" action="search.html" method="get">
<div class="form-group">
<input type="text" name="q" class="form-control" placeholder="Search" />
</div>
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-3">
<div id="sidebar" class="bs-sidenav" role="complementary"><ul>
<li><a class="reference internal" href="#">Changelog (Ren'Py 7.x-)</a><ul>
<li><a class="reference internal" href="#renpy-8-0-3">8.0.3 / 7.5.3</a><ul>
<li><a class="reference internal" href="#security">Security</a></li>
<li><a class="reference internal" href="#modal-screen-pauses-and-timers">Modal Screen, Pauses, and Timers</a></li>
<li><a class="reference internal" href="#changes-and-fixes">Changes and Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-8-0-2">8.0.2 / 7.5.2</a><ul>
<li><a class="reference internal" href="#fixes">Fixes</a></li>
<li><a class="reference internal" href="#default-focus-changes">Default Focus Changes</a></li>
<li><a class="reference internal" href="#other-improvements">Other Improvements</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-8-0-1">8.0.1 / 7.5.1</a><ul>
<li><a class="reference internal" href="#improvements">Improvements</a></li>
<li><a class="reference internal" href="#id4">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-8-0-0">8.0 / 7.5</a><ul>
<li><a class="reference internal" href="#python-3-support-ren-py-8-0">Python 3 Support (Ren'Py 8.0)</a></li>
<li><a class="reference internal" href="#continued-python-2-7-support-ren-py-7-5">Continued Python 2.7 Support (Ren'Py 7.5)</a></li>
<li><a class="reference internal" href="#platform-support-changes">Platform Support Changes</a></li>
<li><a class="reference internal" href="#web-and-chromeos">Web and ChromeOS</a></li>
<li><a class="reference internal" href="#android-and-ios">Android and iOS</a></li>
<li><a class="reference internal" href="#steam-steam-deck-and-epic-games-store">Steam, Steam Deck, and Epic Games Store</a></li>
<li><a class="reference internal" href="#visual-studio-code">Visual Studio Code</a></li>
<li><a class="reference internal" href="#dismiss-nearrect-and-focus-rectangles">Dismiss, Nearrect, and Focus Rectangles</a></li>
<li><a class="reference internal" href="#atl-and-transforms">ATL and Transforms</a></li>
<li><a class="reference internal" href="#image-gallery">Image Gallery</a></li>
<li><a class="reference internal" href="#boxes-grids-and-vpgrids">Boxes, Grids and Vpgrids</a></li>
<li><a class="reference internal" href="#call-screen-and-roll-forward">Call Screen and Roll Forward</a></li>
<li><a class="reference internal" href="#new-features">New Features</a></li>
<li><a class="reference internal" href="#other-changes">Other Changes</a></li>
<li><a class="reference internal" href="#versioning">Versioning</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-11">7.4.11</a><ul>
<li><a class="reference internal" href="#the-gui-variant-decorator">The gui.variant Decorator</a></li>
<li><a class="reference internal" href="#id7">Fixes</a></li>
<li><a class="reference internal" href="#translations">Translations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-10">7.4.10</a><ul>
<li><a class="reference internal" href="#id9">Fixes</a></li>
<li><a class="reference internal" href="#id10">Translations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-9">7.4.9</a><ul>
<li><a class="reference internal" href="#android">Android</a></li>
<li><a class="reference internal" href="#ios">iOS</a></li>
<li><a class="reference internal" href="#updater">Updater</a></li>
<li><a class="reference internal" href="#camera-perspective-improvements">Camera/Perspective Improvements</a></li>
<li><a class="reference internal" href="#accessibility">Accessibility</a></li>
<li><a class="reference internal" href="#transform-properties">Transform Properties</a></li>
<li><a class="reference internal" href="#other">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-8">7.4.8</a><ul>
<li><a class="reference internal" href="#id13">Fixes</a></li>
<li><a class="reference internal" href="#features">Features</a></li>
<li><a class="reference internal" href="#changes">Changes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-7">7.4.7</a><ul>
<li><a class="reference internal" href="#web-and-web-audio">Web and Web Audio</a></li>
<li><a class="reference internal" href="#id15">iOS</a></li>
<li><a class="reference internal" href="#input">Input</a></li>
<li><a class="reference internal" href="#id16">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-6">7.4.6</a><ul>
<li><a class="reference internal" href="#camera-statement">Camera Statement</a></li>
<li><a class="reference internal" href="#model-displayable">Model Displayable</a></li>
<li><a class="reference internal" href="#id18">Other Improvements</a></li>
<li><a class="reference internal" href="#id19">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-5">7.4.5</a><ul>
<li><a class="reference internal" href="#model-based-renderer">Model-Based Renderer</a></li>
<li><a class="reference internal" href="#mouse">Mouse</a></li>
<li><a class="reference internal" href="#id21">Features</a></li>
<li><a class="reference internal" href="#id22">Android</a></li>
<li><a class="reference internal" href="#other-platforms">Other Platforms</a></li>
<li><a class="reference internal" href="#other-fixes">Other Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-4">7.4.4</a><ul>
<li><a class="reference internal" href="#the-old-game-directory">The old-game directory</a></li>
<li><a class="reference internal" href="#id24">Fixes</a></li>
<li><a class="reference internal" href="#id25">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-3">7.4.3</a><ul>
<li><a class="reference internal" href="#windows">Windows</a></li>
<li><a class="reference internal" href="#id27">Android</a></li>
<li><a class="reference internal" href="#id28">Features</a></li>
<li><a class="reference internal" href="#old-features">Old Features</a></li>
<li><a class="reference internal" href="#id29">Other Fixes</a></li>
<li><a class="reference internal" href="#id30">Translations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-2">7.4.2</a><ul>
<li><a class="reference internal" href="#fixes-and-changes">Fixes and Changes</a></li>
<li><a class="reference internal" href="#id32">Android</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4-1">7.4.1</a><ul>
<li><a class="reference internal" href="#pause-statement-changes">Pause Statement Changes</a></li>
<li><a class="reference internal" href="#say-statement-id-clause">Say Statement Id Clause</a></li>
<li><a class="reference internal" href="#live2d">Live2D</a></li>
<li><a class="reference internal" href="#controller-blocklist">Controller Blocklist</a></li>
<li><a class="reference internal" href="#macos">macOS</a></li>
<li><a class="reference internal" href="#id34">Android</a></li>
<li><a class="reference internal" href="#id35">Translations</a></li>
<li><a class="reference internal" href="#id36">Other Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-4">7.4.0</a><ul>
<li><a class="reference internal" href="#id38">Model-Based Renderer</a></li>
<li><a class="reference internal" href="#id39">Live2D</a></li>
<li><a class="reference internal" href="#matrixcolor-and-blur">Matrixcolor and Blur</a></li>
<li><a class="reference internal" href="#python-2-python-3-compatibility-mode">Python 2/Python 3 Compatibility Mode</a></li>
<li><a class="reference internal" href="#upgraded-libraries-and-platform-support">Upgraded Libraries and Platform Support</a></li>
<li><a class="reference internal" href="#web">Web</a></li>
<li><a class="reference internal" href="#steam">Steam</a></li>
<li><a class="reference internal" href="#id40">Translations</a></li>
<li><a class="reference internal" href="#depreciations-and-removals">Depreciations and Removals</a></li>
<li><a class="reference internal" href="#miscellaneous">Miscellaneous</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-3-5">7.3.5</a><ul>
<li><a class="reference internal" href="#id42">Fixes</a></li>
<li><a class="reference internal" href="#id43">Other Changes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-3-4">7.3.4</a><ul>
<li><a class="reference internal" href="#id45">Fixes</a></li>
<li><a class="reference internal" href="#id46">Other Changes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-3-3">7.3.3</a><ul>
<li><a class="reference internal" href="#audio">Audio</a></li>
<li><a class="reference internal" href="#platforms">Platforms</a></li>
<li><a class="reference internal" href="#id48">Other Changes</a></li>
<li><a class="reference internal" href="#id49">Translations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-3-2">7.3.2</a><ul>
<li><a class="reference internal" href="#id51">Fixes</a></li>
<li><a class="reference internal" href="#id52">Translations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-3-1">7.3.1</a><ul>
<li><a class="reference internal" href="#id54">Changes</a></li>
<li><a class="reference internal" href="#id55">Fixes</a></li>
<li><a class="reference internal" href="#id56">Translations</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-3-0">7.3.0</a><ul>
<li><a class="reference internal" href="#renpyweb">Renpyweb</a></li>
<li><a class="reference internal" href="#creator-defined-statements">Creator-Defined Statements</a></li>
<li><a class="reference internal" href="#screen-language-improvements">Screen Language Improvements</a></li>
<li><a class="reference internal" href="#text-improvements">Text Improvements</a></li>
<li><a class="reference internal" href="#android-and-ios-improvements">Android and iOS Improvements</a></li>
<li><a class="reference internal" href="#id58">Translations</a></li>
<li><a class="reference internal" href="#id59">Other Improvements</a></li>
<li><a class="reference internal" href="#id60">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-2-2">7.2.2</a></li>
<li><a class="reference internal" href="#renpy-7-2-1">7.2.1</a><ul>
<li><a class="reference internal" href="#ios-improvements">iOS Improvements</a></li>
<li><a class="reference internal" href="#id63">Other Improvements</a></li>
<li><a class="reference internal" href="#id64">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-1-4">7.2.0</a><ul>
<li><a class="reference internal" href="#menu-arguments">Menu Arguments</a></li>
<li><a class="reference internal" href="#temporary-say-attributes">Temporary Say Attributes</a></li>
<li><a class="reference internal" href="#text">Text</a></li>
<li><a class="reference internal" href="#statements">Statements</a></li>
<li><a class="reference internal" href="#id66">Changes</a></li>
<li><a class="reference internal" href="#android-changes">Android Changes</a></li>
<li><a class="reference internal" href="#id67">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-1-3">7.1.3</a></li>
<li><a class="reference internal" href="#renpy-7-1-2">7.1.2</a><ul>
<li><a class="reference internal" href="#id70">Improvements</a></li>
<li><a class="reference internal" href="#id71">Translations</a></li>
<li><a class="reference internal" href="#id72">Fixes</a></li>
<li><a class="reference internal" href="#android-fixes">Android Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-1-1">7.1.1</a><ul>
<li><a class="reference internal" href="#history-fix">History Fix</a></li>
<li><a class="reference internal" href="#android-improvements">Android Improvements</a></li>
<li><a class="reference internal" href="#id74">Other Improvements</a></li>
<li><a class="reference internal" href="#id75">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-1">7.1</a><ul>
<li><a class="reference internal" href="#id77">Android</a></li>
<li><a class="reference internal" href="#monologue-mode">Monologue Mode</a></li>
<li><a class="reference internal" href="#say-with-attribute-change">Say-With-Attribute Change</a></li>
<li><a class="reference internal" href="#updater-changes">Updater Changes</a></li>
<li><a class="reference internal" href="#id78">Translations</a></li>
<li><a class="reference internal" href="#id79">Other</a></li>
</ul>
</li>
<li><a class="reference internal" href="#renpy-7-0">7.0</a><ul>
<li><a class="reference internal" href="#layered-images">Layered Images</a></li>
<li><a class="reference internal" href="#dict-transitions">Dict Transitions</a></li>
<li><a class="reference internal" href="#id81">Changes</a></li>
<li><a class="reference internal" href="#id82">Translations</a></li>
<li><a class="reference internal" href="#id83">Fixes</a></li>
</ul>
</li>
<li><a class="reference internal" href="#older-changelogs">Older Changelogs</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div class="col-md-9 content">
<div class="section" id="changelog-ren-py-7-x">
<h1>Changelog (Ren'Py 7.x-)<a class="headerlink" href="#changelog-ren-py-7-x" title="Permalink to this headline"> link</a></h1>
<div class="section" id="renpy-8-0-3">
<span id="renpy-7-5-3"></span><span id="id1"></span><h2>8.0.3 / 7.5.3<a class="headerlink" href="#renpy-8-0-3" title="Permalink to this headline"> link</a></h2>
<div class="section" id="security">
<h3>Security<a class="headerlink" href="#security" title="Permalink to this headline"> link</a></h3>
<p>There is now a new <a class="reference internal" href="security.html"><span class="doc">Security</span></a> page in the documentation, intended to help
players understand the security implications of mods and sharing save files.</p>
</div>
<div class="section" id="modal-screen-pauses-and-timers">
<h3>Modal Screen, Pauses, and Timers<a class="headerlink" href="#modal-screen-pauses-and-timers" title="Permalink to this headline"> link</a></h3>
<p>Based on feedback from creators, the changes to how modal screens interact
with pauses and timers have been redone. As of this version, pauses will
not end when a modal screen is shown, while timers will trigger while
a modal screen is shown above the timer.</p>
<p>There are some cases where this behavior may not be wanted. To deal with
those cases, the <a class="reference internal" href="screens.html#sl-timer"><span class="std std-ref">timer displayable</span></a> and <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>
have a new <cite>modal</cite> property/parameter. If <cite>modal</cite> is True, pauses will
end and timers will respect the modal screen, and will not trigger until
the screen disappears. If false, the modal screen will not be respected,
causing pauses to end and timers to trigger while the modal screen is
still displayed.</p>
</div>
<div class="section" id="changes-and-fixes">
<h3>Changes and Fixes<a class="headerlink" href="#changes-and-fixes" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py has been updated to target Android API level 33, corresponding to Android 13,
allowing new games to be added to the Google Play store. The Play Billing library
has been updated to version 5.</p>
<p>Init statements inside a module loaded with <a class="reference internal" href="other.html#renpy.load_module" title="renpy.load_module"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.load_module()</span></code></a> are now
run in init-priority order.</p>
<p>Lint now respects <a class="reference internal" href="config.html#var-config.adjust_attributes"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.adjust_attributes</span></code></a>.</p>
<p>A case where blurs could become transparent has been addressed.</p>
<p>When the translation language changes during a menu that is using dialogue as a
caption, Ren'Py will jump the game back to the start of the say statement that
added that dialogue, allowing it to be re-translated.</p>
<p>When a game is being developed, Ren'Py will now produce an error if the first
use of <a class="reference internal" href="gui_advanced.html#gui.preference" title="gui.preference"><code class="xref py py-func docutils literal notranslate"><span class="pre">gui.preference()</span></code></a> has not been given a default. This makes an error
that could happen at runtime in that case more explicit.</p>
<p>There have been many documentation improvements.</p>
<p>This release fixes a problem with Matrix equality that could prevent
transform properties that use Matrixes from being animated correctly.</p>
<p>Ren'Py now properly analyzes variables that are bound by lambdas.</p>
<p>The Tutorial and The Question have been translated into Ukrainian, and the
Ukrainian translation of the launcher has been updated.</p>
</div>
</div>
<div class="section" id="renpy-8-0-2">
<span id="renpy-7-5-2"></span><span id="id2"></span><h2>8.0.2 / 7.5.2<a class="headerlink" href="#renpy-8-0-2" title="Permalink to this headline"> link</a></h2>
<div class="section" id="fixes">
<h3>Fixes<a class="headerlink" href="#fixes" title="Permalink to this headline"> link</a></h3>
<p>There have been a number of changes to the way autoreload (shift+R) works, to
try to prevent Ren'Py from creating an invalid save file when an autoreload after
an error happens, and Ren'Py is in an invalid state. The goal of these changes
is to preserve the save file from before the change, and reuse that.</p>
<p>Ren'Py is now able to perform audio fadeins and fadeouts of less than 0.68
seconds. Previously such short fadeins and fadeouts would be result in an
underflow and no fading. In this release, the precise duration of a fadein
and fadeout is not strictly guaranteed.</p>
<p>Several functions in achievement.steam (or _renpysteam) had regressions when
reimplmented in terms of achievement.steamapi. These regressions have been
fixed.</p>
<p>An issue that prevented built distributions from launching on aarch64 has
been fixed.</p>
<p>An issue that could cause excessive CPU and memory usage when a store had
large number of variables in it has been fixed.</p>
<p>Loading a save slot that was saved with a different language than is currently set will no
longer prevent <a class="reference internal" href="config.html#var-config.after_load_transition"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.after_load_transition</span></code></a> from occurring.</p>
<p>Several problems that preventing In-App Purchases (IAP) from working on Ren'Py
8 have been fixed.</p>
<p>An issue with examples in the tutorial game not working in a non-English languages
has been fixed.</p>
<p>Tinydialogs is now included in the source code distribution of Ren'Py.</p>
</div>
<div class="section" id="default-focus-changes">
<h3>Default Focus Changes<a class="headerlink" href="#default-focus-changes" title="Permalink to this headline"> link</a></h3>
<p>There have been several changes to the <cite>default_focus</cite> property of focusable
displayables like buttons and bars. This property allows Ren'Py to select a
displayable to gain default focus when displayables are added to removed.</p>
<p>The new rules are:</p>
<ul class="simple">
<li>When the mouse is used, focus follows the mouse and <cite>default_focus</cite> is ignored.</li>
<li>When a displayable with a higher <cite>default_focus</cite> than any other displayable
is shown, it is given focus.</li>
<li>When the displayable with the highest <cite>default_focus</cite> is hidden, the displayable
with the next highest non-zero <cite>default_focus</cite> is given focus.</li>
</ul>
<p>The goal is to support common keyboard and controller navigation patterns,
while not getting in the way of mouse users.</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>There have been many copyedits and other improvements to Ren'Py's documentation.</p>
<p>The console has been improved to display more Python 3 types.</p>
<p><a class="reference internal" href="mouse.html#MouseDisplayable" title="MouseDisplayable"><code class="xref py py-func docutils literal notranslate"><span class="pre">MouseDisplayable()</span></code></a> now respects <a class="reference internal" href="store_variables.html#var-default_mouse"><code class="xref std std-var docutils literal notranslate"><span class="pre">default_mouse</span></code></a>, if set.</p>
<p>In Ren'Py 8, Python blocks are now compiled as if the <code class="docutils literal notranslate"><span class="pre">from</span> <span class="pre">__future__</span> <span class="pre">import</span> <span class="pre">annotations</span></code>
statement was present.</p>
<p>A modal screen or dismiss statement now blocks the <code class="docutils literal notranslate"><span class="pre">pause</span></code> statement and <code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.pause`()</span></code>
from ending. Previously, what happened in this case was undefined and varied between
versions.</p>
<p>On macOS, Ren'Py will now properly adjust when the game window is moved between
displays with different scaling.</p>
<p>Command-C and Command-V now work for copy and paste on macOS.</p>
<p>The default input screen in screens.rpy has now been changed to prevent a
conflict between the <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> and <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> of the vbox.
The fix was to change the use of xalign to <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>.</p>
<p>Ren'Py will now start if a sound card is not present, even in developer mode.
Errors with audio hardware are now written to log.txt.</p>
<p>The Japanese translation has been updated.</p>
<p>New games created with Ren'Py no longer filter out ruby/furigana text tags.</p>
</div>
</div>
<div class="section" id="renpy-8-0-1">
<span id="renpy-7-5-1"></span><span id="id3"></span><h2>8.0.1 / 7.5.1<a class="headerlink" href="#renpy-8-0-1" title="Permalink to this headline"> link</a></h2>
<div class="section" id="improvements">
<h3>Improvements<a class="headerlink" href="#improvements" title="Permalink to this headline"> link</a></h3>
<p>The launcher now has a Ukrainian translation, courtesy of Matias B.</p>
<p>The web port will now reuse audio data when an audio file loops, reducing
the memory usage.</p>
<p>ATL transforms used inside a <a class="reference internal" href="mouse.html#MouseDisplayable" title="MouseDisplayable"><code class="xref py py-func docutils literal notranslate"><span class="pre">MouseDisplayable()</span></code></a> are now reset each
time the mouse is changed. Previously, this behavior was undefined.</p>
<p>The trace screen used by the console is now updated once per frame.</p>
<p>There have been a large number of documentation improvements.</p>
</div>
<div class="section" id="id4">
<h3>Fixes<a class="headerlink" href="#id4" title="Permalink to this headline"> link</a></h3>
<p>Alt text is now played in first-to-last order. A change to 8.0 caused
the order alt text was played in to be reversed.</p>
<p>A rounding error that would cause the CropMove transitions to work
incorrectly was fixed.</p>
<p>An issue preventing the zoomin and zoomout transitions from working
was fixed.</p>
<p>The Movie displayable can once again take a list of movie files to
play, rather than only a single filename.</p>
<p>An issue with building on Android has been fixed.</p>
<p>Object identity is used to compared the arguments of <a class="reference internal" href="screen_actions.html#Function" title="Function"><code class="xref py py-func docutils literal notranslate"><span class="pre">Function()</span></code></a>
actions. This prevents an issue where an action could be incorrectly
reused if the action's arguments where equal, but not the same (for
example, two empty lists).</p>
<p>Problems with getting and setting Steam statistics have been fixed.</p>
<p>The <a class="reference internal" href="screens.html#sl-dismiss"><span class="std std-ref">dismiss</span></a> is now correctly modal.</p>
</div>
</div>
<div class="section" id="renpy-8-0-0">
<span id="renpy-7-5-0"></span><span id="id5"></span><h2>8.0 / 7.5<a class="headerlink" href="#renpy-8-0-0" title="Permalink to this headline"> link</a></h2>
<div class="section" id="python-3-support-ren-py-8-0">
<h3>Python 3 Support (Ren'Py 8.0)<a class="headerlink" href="#python-3-support-ren-py-8-0" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py 8.0 runs under Python 3, the latest major version of the Python
language.</p>
<p>If your game uses minimal Python (for example, just storing character
names and flags), it should work the same as it did before. Otherwise,
please read on.</p>
<p>The move to Python 3 makes over a decade of Python language and
library improvements available to the Ren'Py developer, as described
in the <a class="reference external" href="https://docs.python.org/3.9/whatsnew/index.html">What's new in Python</a>
documentation. There are far too many changes in Python 3 to include here,
so please check that and other Python websites for descriptions.</p>
<p>That being said, a few things made available to the Python in your Ren'Py
games are:</p>
<ul class="simple">
<li>Functions can have keyword-only parameters. (These are also supported
in parameter lists for labels, transforms, and screens.)</li>
<li>The ability to annotate functions arguments and return values with type
information. (This is only supported in Python.)</li>
<li>Formatted string literals can now be used. These
are strings like <code class="docutils literal notranslate"><span class="pre">f&quot;characters/{character}.chr&quot;</span></code>, where the text in
braces is replaced by a formatted Python variable, similarly to the
way that interpolation works in Ren'Py dialogue. This is only available
in Python, however, and not in most purely Ren'Py statements.</li>
</ul>
<p>There are a huge number of other improvements in the ten major releases of
Python between 2.7 and 3.9, so be sure to read the above and other Python
documentation to find out everything that's improved.</p>
<p>One of the greatest advantages is that this moves Ren'Py off Python 2.7,
which is no longer supported by the Python Software Foundation, and so
the move to Ren'Py 8.0 helps secure Ren'Py's future.</p>
<p>There are a few things that may need to be converted if you used advanced
Python.</p>
<ul class="simple">
<li>In Python 3, division always returns a float, rather than an integer.
(for example, <code class="docutils literal notranslate"><span class="pre">3</span> <span class="pre">/</span> <span class="pre">2</span></code> is now 1.5 rather than 1). The <code class="docutils literal notranslate"><span class="pre">//</span></code> operator
divides as an integer. This change can affect Ren'Py positioning,
where floats are treated differently from integers.</li>
<li>In Python 3, the keys, items, and values methods of dictionaries now
return views, not lists. The iterkeys, iteritems, and itervalues
methods are not supported. The xrange method is gone, and range
no longer returns a list.</li>
<li>Except clauses now must be written like <code class="docutils literal notranslate"><span class="pre">except</span> <span class="pre">Exception</span> <span class="pre">as</span> <span class="pre">e:</span></code>,
as the old syntax, <code class="docutils literal notranslate"><span class="pre">except</span> <span class="pre">Exception,</span> <span class="pre">e:</span></code> is not supported.</li>
<li>All strings are now unicode by default (Ren'Py has been forcing this
for several years), and files are opened in text mode by default.
(However, <a class="reference internal" href="file_python.html#renpy.file" title="renpy.file"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.file()</span></code></a> opens files in binary mode. It's been
renamed to <a class="reference internal" href="file_python.html#renpy.open_file" title="renpy.open_file"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.open_file()</span></code></a> and can take a default encoding.)</li>
<li>Many Python modules have been renamed.</li>
</ul>
<p>This is not an exhaustive list.</p>
<p>Ren'Py ships with a cut-down version of the Python Standard library, so
not every Python module is available in Ren'Py. Please let us know if there
is something missing you have a good use for, especially if that module
does not require a library dependency. While <code class="docutils literal notranslate"><span class="pre">async</span></code> and <code class="docutils literal notranslate"><span class="pre">await</span></code>
are available, Ren'Py doesn't directly support coroutines.</p>
<p>Ren'Py 8.0 ships with Python 3.9.10, and is available on the Windows,
macOS, Linux, Android, and iOS platforms. The web platform will
be supported in a future release.</p>
<p>When running under Ren'Py 8, Ren'Py now runs without the equivalent of the
Python <code class="docutils literal notranslate"><span class="pre">-O</span></code> flag. This means that docstrings and assert statements are
available.</p>
<p>Our experience is that many games run unchanged under Python 3, especially
games that use Python primarily through the Ren'Py API, to manage
game state. Ren'Py 8 has been used to run unmodified Ren'Py games
going back to the year 2006.</p>
</div>
<div class="section" id="continued-python-2-7-support-ren-py-7-5">
<h3>Continued Python 2.7 Support (Ren'Py 7.5)<a class="headerlink" href="#continued-python-2-7-support-ren-py-7-5" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py 7.5 is being released at the same time as Ren'Py 8.0, to continue
to provide a version of Ren'Py that runs on Python 2.7, as a way of
supporting games in development (or being maintained after release)
that still require Python 2.7.</p>
<p>In this release, Ren'Py 7.5 also supports the web platform, which
Ren'Py 8.0 does not yet support.</p>
<p>For this release, Ren'Py 7.5 and Ren'Py 8.0 should support the same
set of of features.</p>
<p>We plan to continue to support Ren'Py 7.x until we see that the community
has moved to Ren'Py 8.x, or until changes to the Python ecosystem mean
that supporting Ren'Py on Python 2 is no longer tenable.</p>
<p>Please test your games on Ren'Py 8 - for many games, few to no changes
will be needed. If for some reason you can't port your game to Ren'Py
8, please let us know what is holding you back.</p>
</div>
<div class="section" id="platform-support-changes">
<h3>Platform Support Changes<a class="headerlink" href="#platform-support-changes" title="Permalink to this headline"> link</a></h3>
<p>This release adds support for the 64-bit ARM Linux (linux-aarch64)
platform. While based on Ubuntu 20.04, this has been tested on Chromebooks,
and should also work on the 64-bit ARM platform.</p>
<p>The intended way to run Ren'Py games on ARM Linux would be to download
the new ARM Linux SDK package, place the game in the projects directory,
and use that to launch the game. If the files from the ARM Linux SDK are
present when a Linux distribution is made, they will be included, creating
a game that can be launched on ARM, but this is not the default, for
size reasons.</p>
<p>With the move to Ren'Py 8, we are removing support for the
following platforms:</p>
<ul class="simple">
<li>32-bit x86 Windows (i686)</li>
<li>32-bit x86 Linux (i686)</li>
</ul>
<p>This reflects the obsolescence of 32-bit x86 computing. These platforms remain
supported by Ren'Py 7.5, but will not be supported by Ren'Py 8.</p>
</div>
<div class="section" id="web-and-chromeos">
<h3>Web and ChromeOS<a class="headerlink" href="#web-and-chromeos" title="Permalink to this headline"> link</a></h3>
<p>The web platform is currently only supported on Ren'Py 7.5.</p>
<p>Changes to the Safari and Chrome web browsers increased the memory Ren'Py
used by about 50 times, causing RangeErrors when the web browser ran out
of stack memory. Ren'Py 7.5 includes changes to reduces the amount of
memory used inside web browsers. As a result, Ren'Py now runs again
inside Chrome and Safari, including on iOS devices.</p>
<p>The new <a class="reference internal" href="config.html#var-config.webaudio_required_types"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.webaudio_required_types</span></code></a> variable can be given a list of
mime types of audio files used by the game. Ren'Py will only use the web
browser's Web Audio system for playback if all of the mime types are supported
in the browser. If not, webasm is used for playback, which is more likely to
cause skipping if the computer is slow.</p>
<p>The config.webaudio_required_types variable is intended to allow games using ogg
or opus audio to run on Safari, and can be changed if a game only uses mp3 audio.</p>
<p>When importing save files into a web distribution, Ren'Py will now refresh
the list of save files without a restart.</p>
<p>When running as an Android application on a ChromeOS device, the &quot;chromeos&quot;
variant will be selected.</p>
<p>The Ren'Py SDK can be run on ARM Chromebooks.</p>
</div>
<div class="section" id="android-and-ios">
<h3>Android and iOS<a class="headerlink" href="#android-and-ios" title="Permalink to this headline"> link</a></h3>
<p>The Android configuration once again prompts as to which store to use
for in app purchases. When no store is selected, libraries to support
purchasing are not included in the project. These libraries would include
the billing permission, which would flag the game as supporting in-app
purchases even if no purchases were used.</p>
<p>Due to issues in underlying libraries, the <a class="reference internal" href="input.html#renpy.input" title="renpy.input"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.input()</span></code></a> function
and <code class="docutils literal notranslate"><span class="pre">input</span></code> displayable are now documented as not supporting IME-based
(non-alphabetic) input on Android.</p>
<p>On iOS, OpenGL ES calls are translated to the native Metal graphics system.
Doing this should improve compatibility with recent Apple devices, and
fixes problems running applications under the iOS simulator on Apple
Silicon-based devices.</p>
</div>
<div class="section" id="steam-steam-deck-and-epic-games-store">
<h3>Steam, Steam Deck, and Epic Games Store<a class="headerlink" href="#steam-steam-deck-and-epic-games-store" title="Permalink to this headline"> link</a></h3>
<p>This release includes rewritten Steam support, provided by a new
ctypes-based binding that gives access to the entire Steamworks API,
including callbacks. While the Steam support available through the
<a class="reference internal" href="achievement.html"><span class="doc">achievement module</span></a> remains unchanged, this
gives advanced Python programmers access to more Steam functionality.</p>
<p>When Steam is active, Ren'Py will now enable the &quot;steam&quot; variant.</p>
<p>This release includes built-in support for the Steam Deck hardware.
The support includes the ability to automatically display the
on-screen keyboard when <a class="reference internal" href="input.html#renpy.input" title="renpy.input"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.input()</span></code></a> is called.
The steam deck also causes Ren'Py to enable the &quot;steam_deck&quot;,
&quot;steam&quot;, &quot;medium&quot;, and &quot;touch&quot; variants.</p>
<p>We have a <a class="reference external" href="https://github.com/renpy/steam-deck-guide">Ren'Py on Steam Deck Guide</a>
to help you get your game certified on that platform. Thanks go to Valve for
supplying a Steam Deck to test on.</p>
<p>The &quot;Windows, Mac, and Linux for Markets&quot; distribution has been changed to
no longer prefix the contents of the zip file created with the directory
name and version number, meaning it's no longer required to update launch
configurations with each release to Steam. This may require a one-time
update to the launch configuration.</p>
<p>Ren'Py now includes support for being launched by the Epic Games Store,
by ignoring various command line arguments supplied by EGS.</p>
</div>
<div class="section" id="visual-studio-code">
<h3>Visual Studio Code<a class="headerlink" href="#visual-studio-code" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now includes support for downloading and using Visual Studio Code,
including downloading the <a class="reference external" href="https://marketplace.visualstudio.com/items?itemName=LuqueDaniel.languague-renpy">Ren'Py Language</a>
extension.</p>
<p>The Ren'Py Language extension provides rich support for Ren'Py, including
syntax highlighting, snippets, completion, color previews, documentation,
go to definition, function signatures, error diagnostics, outlining,
and more.</p>
<p>Visual Studio Code also has a large system of extensions, including
spell-checkers, that can be used with with the Ren'Py Language extension.</p>
<p>Visual Studio Code can be activated by going to the editor preferences
and choosing to download it. It's also possible to configure Ren'Py
to use a system install of Ren'Py with extensions that you choose.</p>
</div>
<div class="section" id="dismiss-nearrect-and-focus-rectangles">
<h3>Dismiss, Nearrect, and Focus Rectangles<a class="headerlink" href="#dismiss-nearrect-and-focus-rectangles" title="Permalink to this headline"> link</a></h3>
<p>Two new displayables have been added to Ren'Py to help use cases like
drop-down menus, pulldown menus, and tooltips.</p>
<p>The <a class="reference internal" href="screens.html#sl-dismiss"><span class="std std-ref">dismiss</span></a> displayable is generally used behind a
modal frame, and causes an action to run when it is activated. This allows,
among other things, a behavior where if the player clicks outside the frame,
the frame gets hidden.</p>
<p>The <a class="reference internal" href="screens.html#sl-nearrect"><span class="std std-ref">nearrect</span></a> displayable lays out a displayable either
above or below a rectangle on the screen. This can be used to display a
tooltip above a button, or a drop-down menu below it. (An example of
a drop-down menu is documented with nearrect, and an example of tooltip
usage is with <a class="reference internal" href="screen_actions.html#tooltips"><span class="std std-ref">tooltips</span></a>.</p>
<p>The rectangles aside of which the nearrect places things can be captured by
the new <a class="reference internal" href="screen_actions.html#CaptureFocus" title="CaptureFocus"><code class="xref py py-func docutils literal notranslate"><span class="pre">CaptureFocus()</span></code></a> action, which captures the location of the current
button on the screen. After being captured, the <a class="reference internal" href="screen_actions.html#GetFocusRect" title="GetFocusRect"><code class="xref py py-func docutils literal notranslate"><span class="pre">GetFocusRect()</span></code></a> function
can get the focus rectangle, and the <a class="reference internal" href="screen_actions.html#ClearFocus" title="ClearFocus"><code class="xref py py-func docutils literal notranslate"><span class="pre">ClearFocus()</span></code></a> can clear the
captured focus, and the <a class="reference internal" href="screen_actions.html#ToggleFocus" title="ToggleFocus"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleFocus()</span></code></a> action
captures and clears focus based on the current focus state.</p>
</div>
<div class="section" id="atl-and-transforms">
<h3>ATL and Transforms<a class="headerlink" href="#atl-and-transforms" title="Permalink to this headline"> link</a></h3>
<p>It's now possible to include a block as part of an ATL interpolation.
This means that:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">linear</span> <span class="mf">2.0</span><span class="p">:</span>
<span class="na">xalign</span> <span class="mf">1.0</span>
<span class="na">yalign</span> <span class="mf">1.0</span>
</pre></div>
</div>
<p>is now allowed, and equivalent to:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">linear</span> <span class="mf">2.0</span> <span class="na">xalign</span> <span class="mf">1.0</span> <span class="na">yalign</span> <span class="mf">1.0</span>
</pre></div>
</div>
<p>Information about <a class="reference internal" href="atl.html#atl-transitions"><span class="std std-ref">ATL Transitions</span></a> and <a class="reference internal" href="atl.html#atl-keyword-parameters"><span class="std std-ref">Special ATL Keyword Parameters</span></a>
has been added to the documentation.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">pause</span> <span class="pre">0</span></code> statement has been special-cased to always display one frame,
and is the only way to guarantee at least one frame is displayed. Since 6.99.13,
Ren'Py has been trying various methods to guarantee single frame display, and
many of which led to visual glitches.</p>
<p>When an ATL image is used as one of the children of an image button, its
shown time begins each time it is shown.</p>
<p>The default for the <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 has been changed to
True.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">function</span></code> statement will now block execution only if producing a delay,
which allows transforms using it to behave more naturally when catching up with
an inherited timebase.</p>
</div>
<div class="section" id="image-gallery">
<h3>Image Gallery<a class="headerlink" href="#image-gallery" title="Permalink to this headline"> link</a></h3>
<p>The <a class="reference internal" href="rooms.html#Gallery" title="Gallery"><code class="xref py py-class docutils literal notranslate"><span class="pre">Gallery</span></code></a> class now has a new field, <cite>image_screen</cite>, that can be
used to customize how gallery image are displayed.</p>
<p>The <a class="reference internal" href="rooms.html#Gallery.image" title="Gallery.image"><code class="xref py py-func docutils literal notranslate"><span class="pre">Gallery.image()</span></code></a> and <a class="reference internal" href="rooms.html#Gallery.unlock_image" title="Gallery.unlock_image"><code class="xref py py-func docutils literal notranslate"><span class="pre">Gallery.unlock_image()</span></code></a> methods now
take keyword arguments beginning with <cite>show_</cite>. These arguments have the
<cite>show_</cite> prefix stripped, and are then passed to the Gallery.image_screen
as additional keyword arguments. This can be used to include additional
information with the images in the gallery.</p>
</div>
<div class="section" id="boxes-grids-and-vpgrids">
<h3>Boxes, Grids and Vpgrids<a class="headerlink" href="#boxes-grids-and-vpgrids" title="Permalink to this headline"> link</a></h3>
<p>Displayables that take up no space (like <a class="reference internal" href="screens.html#sl-key"><span class="std std-ref">key</span></a>, <a class="reference internal" href="screens.html#sl-timer"><span class="std std-ref">timer</span></a>
or a false <a class="reference internal" href="screens.html#sl-showif"><span class="std std-ref">showif</span></a>) inside a <a class="reference internal" href="screens.html#sl-vbox"><span class="std std-ref">vbox</span></a> or <a class="reference internal" href="screens.html#sl-hbox"><span class="std std-ref">hbox</span></a>
will not be surrounded with <a class="reference internal" href="style_properties.html#style-property-spacing"><code class="xref std std-propref docutils literal notranslate"><span class="pre">spacing</span></code></a>. These displayables still take
up space in other layouts, such as grids.</p>
<p>Having an overfull vpgrid - when both <code class="docutils literal notranslate"><span class="pre">rows</span></code> and <code class="docutils literal notranslate"><span class="pre">cols</span></code> are specified - is now
disallowed.</p>
<p>Having an underfull vpgrid now raises an error unless the warning is opted-out using
either the <code class="docutils literal notranslate"><span class="pre">allow_underfull</span></code> property or <a class="reference internal" href="config.html#var-config.allow_underfull_grids"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.allow_underfull_grids</span></code></a>, the
former taking precedence on the latter.</p>
<p>A vpgrid with both cols and rows specified is underfull if and when it has less than
rows * cols children. A vpgrid with either cols or rows specified is underfull if and when its number of
children is not a multiple of the specified value.</p>
</div>
<div class="section" id="call-screen-and-roll-forward">
<span id="call-screen-roll-forward"></span><h3>Call Screen and Roll Forward<a class="headerlink" href="#call-screen-and-roll-forward" title="Permalink to this headline"> link</a></h3>
<p>The roll forward feature has been disabled by default in the <code class="docutils literal notranslate"><span class="pre">call</span> <span class="pre">screen</span></code>
statement, as it's unsafe and confusing in the general case. The problem is
that the only side-effect of a screen that roll-forward preserves is the return
value of the screen, or the jump location if a screen jumps. Actions with other
side effects, like changing variables or playing music, were not preserved
through a roll forwards.</p>
<p>Roll forward may be safe for a particular screen, and so can be enabled
on a per-screen basis by enabling the new <cite>roll_forward</cite> property on the
screen. If all screens in your game support roll forward, it can be enabled
with the new <a class="reference internal" href="config.html#var-config.call_screen_roll_forward"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.call_screen_roll_forward</span></code></a> variable.</p>
</div>
<div class="section" id="new-features">
<h3>New Features<a class="headerlink" href="#new-features" title="Permalink to this headline"> link</a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">screen</span></code>, <code class="docutils literal notranslate"><span class="pre">hide</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 now
take an <code class="docutils literal notranslate"><span class="pre">expression</span></code> modifier, which allows a Python expression to supply
the name of the screen.</p>
<p>There is a new &quot;main&quot; volume that can be accessed through <code class="xref py py-func docutils literal notranslate"><span class="pre">Preferences()</span></code>.
The main volume is multiplied with all the other volumes to globally reduce
the volume of the game.</p>
<p>The new <a class="reference internal" href="config.html#var-config.preserve_volume_when_muted"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.preserve_volume_when_muted</span></code></a> variable causes
Ren'Py to show the current volume when channels are muted.</p>
<p>A button to clean the Ren'Py temporary directory has been added
to the preferences screen of the launcher. This can remove these
files to reduce the space Ren'Py requires.</p>
<p>The new <a class="reference internal" href="config.html#var-config.choice_empty_window"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.choice_empty_window</span></code></a> variable can customize
the empty window that is shown when a choice menu is displayed. The intended
use is:</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">choice_empty_window</span> <span class="o">=</span> <span class="n">extend</span>
</pre></div>
</div>
<p>Which repeats the last line of dialogue as the caption of the
choice menu.</p>
<p>The <a class="reference internal" href="screens.html#sl-key"><span class="std std-ref">key</span></a> displayable now supports a <cite>capture</cite>
property, which controls if the pressed key is handled further
it does not end an interaction.</p>
<p>The new &quot;anywhere&quot; value of 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
allows Ren'Py to break anywhere in a string, for when keeping to
a fixed width is the most important aspect of breaking.</p>
<p>The new <cite>predict</cite> argument to <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> makes it possible to pause
until image prediction is finished, including prediction caused by
<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="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>.</p>
<p>It is now possible to select a language other than the default when
extracting dialogue.</p>
<p>The screen language <code class="docutils literal notranslate"><span class="pre">add</span></code> statement now takes an <cite>alt</cite> property,
making it possible to write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">screen</span> <span class="n">test</span><span class="p">():</span>
<span class="k">add</span> <span class="s2">&quot;icon.png&quot;</span> <span class="na">alt</span> <span class="s2">&quot;The Icon&quot;</span>
</pre></div>
</div>
<p>The <a class="reference internal" href="screen_actions.html#Hide" title="Hide"><code class="xref py py-func docutils literal notranslate"><span class="pre">Hide()</span></code></a> action now takes None for the screen name, to hide
the current screen.</p>
<p><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> now takes a <cite>text</cite> argument, that overrides the
automatically determined text with something the creator specifies.</p>
<p>The <a class="reference internal" href="other.html#renpy.dynamic" title="renpy.dynamic"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.dynamic()</span></code></a> function can now make variables in namespaces
dynamic.</p>
<p>The new <a class="reference internal" href="config.html#var-config.always_shown_screens"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.always_shown_screens</span></code></a> variable allows one to define
screens that are always shown (even in the main and game menus). See also
the existing <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>.</p>
<p>The location and size of the OpenGL viewport is made available to shaders as
u_viewport.</p>
<p>The new RENPY_PATH_TO_SAVES environment variable makes it possible to control
where Ren'Py places system-level saves. The RENPY_MULTIPERSISTENT variable has
been documented, and controls the same thing with multipersistent data.</p>
<p>The new <a class="reference internal" href="config.html#var-config.at_exit_callbacks"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.at_exit_callbacks</span></code></a> functions are called when the game
quits. This is intended to allow the game to save additional data created
by the developer.</p>
<p>The <a class="reference internal" href="config.html#var-config.default_attribute_callbacks"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.default_attribute_callbacks</span></code></a> variable allows a game to
specify default attributes for a tag that are used when other attributes
do not conflict.</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>It is now possible to copy from <a class="reference internal" href="input.html#renpy.input" title="renpy.input"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.input()</span></code></a> with ctrl-C, and paste
with ctrl-V. When text input is displayed, ctrl will no longer cause skipping
to happen.</p>
<p>The <a class="reference internal" href="file_python.html#renpy.file" title="renpy.file"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.file()</span></code></a> function has been renamed to <a class="reference internal" href="file_python.html#renpy.open_file" title="renpy.open_file"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.open_file()</span></code></a>,
with the old named retained. It has also gained an <cite>encoding</cite> parameter to
open the file with an encoding.</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 now defaults to None for drag displayables.
This improves performance, but means that the displayable can be dragged by
transparent pixels.</p>
<p>When adding files to the audio namespace, Ren'Py now scans for flac
files.</p>
<p>Say statements used as menu captions can now take permanent and temporary
image attributes, just like say statements elsewhere.</p>
<p>All position properties can now be supplied as gui variables to buttons.
For example:</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">navigation_button_text_hover_yoffset</span> <span class="o">=</span> <span class="o">-</span><span class="mi">3</span>
</pre></div>
</div>
<p>now works.</p>
<p>The behavior of modal <a class="reference internal" href="screens.html#sl-frame"><span class="std std-ref">frames</span></a> has been changed. A modal
frame now blocks mouse events when inside the frame, and blocks focus from
being transferred to displayables fully behind the frame, while allowing focus
to be given to other displayables.</p>
<p>The new <a class="reference internal" href="config.html#var-config.main_menu_stop_channels"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.main_menu_stop_channels</span></code></a> variable controls the
channels that are stopped when entering the main menu.</p>
<p>Layered images are now offered the the full size of the screen whenever
rendered. Previously, when a layered image was used inside a layout (like
hbox, vbox, side, and others), the space offered to the layered image
could change, and relative positions could also change. (This is unlikely,
but happened at least once.) The new <cite>offer_screen</cite> property of layered images
controls this behavior.</p>
<p>A <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> defined with <cite>interact</cite> false, or otherwise used in a
non-interactive way will now cause an automatic voice line to play, if the
relevant file exists.</p>
<p>When <code class="docutils literal notranslate"><span class="pre">window</span> <span class="pre">auto</span></code> displays the window before a say or menu-with-caption
statement, Ren'Py will automatically determine if the character to speak
uses NVL or ADV, and will display the correct window. Previously, the last
character in a say statement was used.</p>
<p>The <a class="reference internal" href="style_properties.html#style-property-activate_sound"><code class="xref std std-propref docutils literal notranslate"><span class="pre">activate_sound</span></code></a> plays when activating a drag displayable.</p>
<p>The <a class="reference internal" href="screen_actions.html#VariableValue" title="VariableValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">VariableValue()</span></code></a>, <a class="reference internal" href="screen_actions.html#FieldValue" title="FieldValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">FieldValue()</span></code></a>, and <a class="reference internal" href="screen_actions.html#DictValue" title="DictValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">DictValue()</span></code></a> Bar Values
can now call <a class="reference internal" href="screen_actions.html#Return" title="Return"><code class="xref py py-func docutils literal notranslate"><span class="pre">Return()</span></code></a>, to cause the interaction to return a specific value.</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> property is now set to False for dialogue and
narration in new games. This might cause the spacing of text to change, when
the game is resized, in exchange for keeping it stable when extend is used.</p>
<p>Playing or stopping music on a channel now unpauses that channel.</p>
<p>The new <a class="reference internal" href="preferences.html#var-preferences.audio_when_minimized"><code class="xref std std-var docutils literal notranslate"><span class="pre">preferences.audio_when_minimized</span></code></a> preference now enables the
audio of the game to be paused when the window is minimized.</p>
<p>The default for <a class="reference internal" href="style_properties.html#style-property-outline_scaling"><code class="xref std std-propref docutils literal notranslate"><span class="pre">outline_scaling</span></code></a> is now &quot;linear&quot;.</p>
<p>The version of SDL used by Ren'Py has been upgraded to 2.0.20 on non-web
platforms.</p>
<p>Many translations have been updated.</p>
<p>The jEdit editor has been removed, as the Ren'Py integration was largely
obsolete. However, if the version from 7.4.0 is unpacked, it should be
selectable in the launcher.</p>
</div>
<div class="section" id="versioning">
<h3>Versioning<a class="headerlink" href="#versioning" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py's full version numbers are now of the form major.minor.patch.YYMMDDCCnu,
where:</p>
<ul class="simple">
<li>YY is the two digit year of the latest commit.</li>
<li>MM is the month of the commit.</li>
<li>DD is the day of the commit</li>
<li>CC is the commit number on that day</li>
<li>n is present if this is a nightly build.</li>
<li>u is present if this is an unofficial build.</li>
</ul>
</div>
</div>
<div class="section" id="renpy-7-4-11">
<span id="id6"></span><h2>7.4.11<a class="headerlink" href="#renpy-7-4-11" title="Permalink to this headline"> link</a></h2>
<div class="section" id="the-gui-variant-decorator">
<h3>The gui.variant Decorator<a class="headerlink" href="#the-gui-variant-decorator" title="Permalink to this headline"> link</a></h3>
<p>A new gui.variant decorator has been added to Ren'Py. This should be used
to decorate a function with the name of a variant, and causes that function
to be run, if the variant is active, when the game is first started, and then
each time the gui is rebuilt (which happens when <a class="reference internal" href="gui_advanced.html#gui.rebuild" title="gui.rebuild"><code class="xref py py-func docutils literal notranslate"><span class="pre">gui.rebuild()</span></code></a> is called,
when a gui preference is changed, or when the translation changes.)</p>
<p>This is expected to be used 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="nd">@gui</span><span class="o">.</span><span class="na">variant</span>
<span class="k">def</span> <span class="nf">small</span><span class="p">():</span>
<span class="c1">## Font sizes.</span>
<span class="n">gui</span><span class="o">.</span><span class="na">text_size</span> <span class="o">=</span> <span class="n">gui</span><span class="o">.</span><span class="n">scale</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span>
<span class="n">gui</span><span class="o">.</span><span class="n">name_text_size</span> <span class="o">=</span> <span class="n">gui</span><span class="o">.</span><span class="n">scale</span><span class="p">(</span><span class="mi">36</span><span class="p">)</span>
<span class="c1"># ...</span>
</pre></div>
</div>
<p>as a replacement for:</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">if</span> <span class="n">renpy</span><span class="o">.</span><span class="na">variant</span><span class="p">(</span><span class="s2">&quot;small&quot;</span><span class="p">):</span>
<span class="c1">## Font sizes.</span>
<span class="n">gui</span><span class="o">.</span><span class="na">text_size</span> <span class="o">=</span> <span class="n">gui</span><span class="o">.</span><span class="n">scale</span><span class="p">(</span><span class="mi">30</span><span class="p">)</span>
<span class="n">gui</span><span class="o">.</span><span class="n">name_text_size</span> <span class="o">=</span> <span class="n">gui</span><span class="o">.</span><span class="n">scale</span><span class="p">(</span><span class="mi">36</span><span class="p">)</span>
<span class="c1"># ...</span>
</pre></div>
</div>
<p>Which only runs once, and lost the changes if the gui was ever rebuilt.</p>
</div>
<div class="section" id="id7">
<h3>Fixes<a class="headerlink" href="#id7" title="Permalink to this headline"> link</a></h3>
<p>The new <a class="reference internal" href="config.html#var-config.mouse_focus_clickthrough"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.mouse_focus_clickthrough</span></code></a> variable determines if clicks that
cause the game window to be focused will be processed normally.</p>
<p>The launcher now runs with <a class="reference internal" href="config.html#var-config.mouse_focus_clickthrough"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.mouse_focus_clickthrough</span></code></a> true, which
means that it will only take a single click to launch the game.</p>
<p>The <cite>caret_blink</cite> property of Input is now exposed through screen language.</p>
<p>When a Live2D motion contains a curve with a shorter duration then the motion
it is part of, the last value of the curve is retained to the end of the
motion.</p>
<p>Rare issues with a displayable being replaced by a displayable of a different
type are now guarded against. This should only occur when a game is updated
between saves.</p>
<p>Modal displayables now prevent pauses from ending.</p>
<p>An issue that could cause images to not display in some cases (when a displayable
was invalidated) has been fixed.</p>
<p>Starting a movie no longer causes paused sounds to unpause.</p>
<p>AudioData objects are no longer stored in the persistent data. Such objects
are removed when persistent data is loaded, if present.</p>
<p>Platform variables like renpy.android and renpy.ios are now set to follow
the emulated platform, when Ren'Py is emulating ios or android.</p>
<p>When in the iOS and Android emulator, the mobile rollback side is used.</p>
<p>Ren'Py will now always run an <cite>unhovered</cite> action when a displayable (or its
replacement) remains shown, and the focus changes. Previously, the unhovered
action would not run when the loss of focus was caused by showing a second
screen.</p>
<p>When <a class="reference internal" href="config.html#var-config.log"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.log</span></code></a> is true, the selected choice is now logged properly.</p>
<p>The new <a class="reference internal" href="gui_advanced.html#gui.variant" title="gui.variant"><code class="xref py py-func docutils literal notranslate"><span class="pre">gui.variant()</span></code></a> function makes it possible to work around
an issue in the standard gui where the calling <a class="reference internal" href="gui_advanced.html#gui.rebuild" title="gui.rebuild"><code class="xref py py-func docutils literal notranslate"><span class="pre">gui.rebuild()</span></code></a> would cause
gui variants to reset.</p>
<p>The web browser now checks for progressively downloaded images once per
frame, allowing images to be loaded into the middle of an animation.</p>
<p>Live2D now uses saturation arithmetic to combine motion fadeins and fadeouts,
such that if the fadein contributes 80% of a parameter value, and the
fadeout contributes 20% of the value, 100% of the value comes from
the two motions. (Previously, the fadein and fadeout were applied
independently, such that together, the fadein and fadeout would
contribute 84% of the value, with the remaining 16% taken from
the default.)</p>
<p>When fading from one sequence of Live2D motions to another, the original
sequence ends when a motion fades out.</p>
<p>When preserving screens in the old state for a transition, the later_at_list
and camera lists are taken from the old state, preventing unexpected changes.</p>
<p>The <code class="xref std std-tpref docutils literal notranslate"><span class="pre">gl_depth</span></code> property now causes Ren'Py to use GL_LEQUALS,
which more closely matches Ren'Py's semantics.</p>
<p>The 4-component constructor for matrices has been fixed.</p>
<p>Ren'Py now cleans out the android build directories when producing a Android
App Bundle (AAB) file, preventing problems that might be caused when packaging
multiple games, or a single game where files are deleted.</p>
<p>Live2d now properly handles seamless animation when the same motion is repeated
in a displayable. (For example, <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">eileen</span> <span class="pre">m1</span> <span class="pre">m1</span> <span class="pre">m2</span></code> where <code class="docutils literal notranslate"><span class="pre">m1</span></code> is seamless.)</p>
<p>Mouse motion is now tracked on Chrome OS devices. This prevents the mouse cursor
from being hidden between clicks.</p>
<p>An issue with windows partially rendering on ChromeOS has been resolved.</p>
<p>An issue with transcludes in screens has been fixed.</p>
<p>An issue that could prevent a transform with both <a class="reference internal" href="3dstage.html#transform-property-perspective"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">perspective</span></code></a> and
<a class="reference internal" href="model.html#transform-property-mesh"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">mesh</span></code></a> true from displaying has been fixed.</p>
<p>Buttons now only propagate transform state to direct children, not to
children accessed through ImageReferences.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">repeat_</span></code> modifier can now be applied to gamepad events.</p>
<p>A new <a class="reference internal" href="config.html#var-config.debug_prediction"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.debug_prediction</span></code></a> variable has been split out of
<a class="reference internal" href="config.html#var-config.debug_image_cache"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.debug_image_cache</span></code></a>. This controls the logging of
prediction errors to the console and log.txt, making the latter
variable act as documented.</p>
</div>
<div class="section" id="translations">
<h3>Translations<a class="headerlink" href="#translations" title="Permalink to this headline"> link</a></h3>
<p>The German, Indonesian, Polish, and Russian translations have been updated.</p>
</div>
</div>
<div class="section" id="renpy-7-4-10">
<span id="id8"></span><h2>7.4.10<a class="headerlink" href="#renpy-7-4-10" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id9">
<h3>Fixes<a class="headerlink" href="#id9" title="Permalink to this headline"> link</a></h3>
<p>This released fixes an issue that prevented large images (larger than
maximum texture size, 4096x4069 on most platforms) from being displayed
by the gl2 renderer.</p>
<p>Dialogue lines that end with the {nw} tag now do not wait for voice to
finish.</p>
<p>Dialogue lines that contain {fast} (including those created
with the <code class="docutils literal notranslate"><span class="pre">extend</span></code> character) sustain the voice from the previous
statement.</p>
<p>These supplement a change introduced in 7.4.9 (that missed the changelog),
where timed {w} and {p} text tags will no longer wait for voice to stop
playing before advancing.</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> property can be slow, but several changes to
have been included to fix pathological cases of slowness. While it's best
to avoid it if possible (the default will change to None for drags, where
it's True now, in 7.5), this should allow for some speedups where it is
True.</p>
<p>Live2D support no longer logs to log.txt by default. That logging can be
restored with <a class="reference internal" href="live2d.html#var-config.log_live2d_loading"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.log_live2d_loading</span></code></a>.</p>
<p>A problem with automatically determining the Android store has been fixed.</p>
</div>
<div class="section" id="id10">
<h3>Translations<a class="headerlink" href="#id10" title="Permalink to this headline"> link</a></h3>
<p>The Indonesian and Polish translations were updated.</p>
</div>
</div>
<div class="section" id="renpy-7-4-9">
<span id="id11"></span><h2>7.4.9<a class="headerlink" href="#renpy-7-4-9" title="Permalink to this headline"> link</a></h2>
<div class="section" id="android">
<h3>Android<a class="headerlink" href="#android" title="Permalink to this headline"> link</a></h3>
<p>This release features major changes to Ren'Py's Android support, starting
with support for the Android App Bundle format, now required for your game
to be uploaded to Google Play.</p>
<p>As bundles use different signing keys than APKs, it will be necessary to
uninstall and reinstall the game when switching from APKs to Bundles
for testing.</p>
<p>When run on Google Play, Ren'Py will use Play Asset Delivery to deliver
the game data to the player's device. This should have the same 2 GB limit
of previous versions of Ren'Py, with each file in your game automatically
assigned to one of four 500 MB asset packs. If the games is started before
all of the asset packs have been delivered, Ren'Py will wait for delivery
to finish before starting.</p>
<p>A new android-downloading.jpg file is used in place of android-presplash.jpg
when Play Asset Delivery is downloading the game's assets. This screen is
overlayed with a progress bar.</p>
<p>Ren'Py still supports building 2GB APKs that can be sideloaded onto devices,
and supplied to other app stores.</p>
<p>Ren'Py now builds against version 30 of the Android SDK.</p>
<p>Ren'Py supports wireless debugging on Android 11 devices.</p>
<p>A number of questions have been removed from the Android configuration
process, simplifying the process. Most notably, Ren'Py now automatically
manages the numeric version of the package, so it's no longer required to
increment that version with each build.</p>
<p>Ren'Py will now look for archives in the external files directory, and
automatically use the archives if found. This makes it possible to
distribute patches, updates, and additional asset to users.</p>
<p>The inclusion of <span class="xref std std-ref">Pyjnius</span>, a library for calling
the Android API, is now documented.</p>
<p>The new <a class="reference internal" href="android.html#var-build.android_permissions"><code class="xref std std-var docutils literal notranslate"><span class="pre">build.android_permissions</span></code></a> variable, <code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.check_permission()</span></code>
function, and <code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.request_permission()</span></code> function provide a way to
request permissions on Android beyond those that Ren'Py users itself.</p>
<p>When creating Android keys, Ren'Py will back them up to the same place it
backs up script files. This isn't a substitute for making your own backups.</p>
<p>An issue that could cause black screenshots on Android and other platforms has
been (hopefully) fixed.</p>
<p>The permissions of saves and log.txt are now explicitly managed on Android
to make these files group-readable, ensuring the player can access logs and
files.</p>
</div>
<div class="section" id="ios">
<h3>iOS<a class="headerlink" href="#ios" title="Permalink to this headline"> link</a></h3>
<p>The iOS build process has been updated create a project that is more complete
after the initial generation, with the launch screen set up and no unused
schemas.</p>
<p>As always, it's necessary to create a new iOS project each time Ren'Py is
updated.</p>
<p>The inclusion of <span class="xref std std-ref">Pyobjus</span> with Ren'Py is now documented. The
Pyobjus library allows games to call APIs on iOS and macOS.</p>
</div>
<div class="section" id="updater">
<h3>Updater<a class="headerlink" href="#updater" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py updater has been improved. It is now possible to download
updates over https, though doing so is less efficient, as the entire
update file will need to be download rather than just the required
changes.</p>
<p>It is possible to opt into a daily check for updates in the launcher
preferences. This will cause Ren'Py to check once a day for updates,
and highlight the update button if one exists.</p>
</div>
<div class="section" id="camera-perspective-improvements">
<h3>Camera/Perspective Improvements<a class="headerlink" href="#camera-perspective-improvements" title="Permalink to this headline"> link</a></h3>
<p>Using the <code class="docutils literal notranslate"><span class="pre">camera</span></code> statement in non-trival manners, such as to apply
perspective, could cause problems with several transitions, most notably
the move transitions. This has been fixed, and so these transions should
work.</p>
<p>Operations that required the taking of a subsurface (for
example, the slide and wipe transitions, or the use of viewports) didn't
work when applied to a perspective transform. This has been fixed, but
it does require a render to texture operation to work, leaving it up
to the creator to decide if the performance penalty is desirable.</p>
</div>
<div class="section" id="accessibility">
<h3>Accessibility<a class="headerlink" href="#accessibility" title="Permalink to this headline"> link</a></h3>
<p>The shift+A Accessibility menu now supports enabling high contrast text, which
converts all text to light-on-black. This is intended to assist player who
need higher contrast to experience a game.</p>
<p>Descriptive text (the <a class="reference internal" href="self_voicing.html#var-alt"><code class="xref std std-var docutils literal notranslate"><span class="pre">alt</span></code></a> character) no longer causes the dialogue
window to fade in if the descriptive text is disabled.</p>
<p>The order in which self-voicing reads out layers, screens, and displayables
directly on a layer has changed, such that the screen and displayables that
are drawn last (closest to the player) are read out first. This does not
apply to displayables within a screen or layout displayable, which are
still read first to last.</p>
<p>Modal screens cause self-voicing to stop after the contents of the screen
has been read.</p>
</div>
<div class="section" id="transform-properties">
<h3>Transform Properties<a class="headerlink" href="#transform-properties" title="Permalink to this headline"> link</a></h3>
<p>The <a class="reference internal" href="atl.html#transform-property-xsize"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">xsize</span></code></a> and <a class="reference internal" href="atl.html#transform-property-ysize"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">ysize</span></code></a> transform properties have slightly changed
in behavior, to match the corresponding style properties. While they used to
accept only numbers of pixels, they now take &quot;position&quot; values, which means
either a number of pixels expressed as an <code class="docutils literal notranslate"><span class="pre">int</span></code> or <code class="docutils literal notranslate"><span class="pre">absolute</span></code>, or a fraction
of the available room expressed as a <code class="docutils literal notranslate"><span class="pre">float</span></code>. The old wrapper, <a class="reference internal" href="atl.html#transform-property-size"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">size</span></code></a>,
is deprecated, and the new wrapper, <a class="reference internal" href="atl.html#transform-property-xysize"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">xysize</span></code></a>, should be used instead.</p>
</div>
<div class="section" id="other">
<h3>Other<a class="headerlink" href="#other" title="Permalink to this headline"> link</a></h3>
<p>The <a class="reference internal" href="screens.html#sl-bar"><span class="std std-ref">bar</span></a> screen language statement now has a new property,
<cite>released</cite>, that gives an action to perform when the bar is released.</p>
<p>It's now documented that the <a class="reference internal" href="screens.html#sl-key"><span class="std std-ref">key</span></a> screen language statement
can take a list of keysyms.</p>
<p>On Linux, if Ren'Py detects the &quot;C&quot; locale, it will enable support for
UTF-8 filesystems. This is intended to provide better compatibility with
Steam Linux, which uses this locale.</p>
<p>A new Polish translation of the launcher has been added.</p>
<p>The music room has been updated to include a TogglePause button,
that pauses and unpauses music.</p>
<p>There is now a --safe-mode flag, that starts Ren'Py in safe mode.</p>
<p>Mute now mutes movies.</p>
<p>An issue that caused analysis files to grow unconstrained, slowing down
Ren'Py startup, has been fixed. The analysis file will be reduced in size
when the game scripts are recompiled.</p>
<p>The <a class="reference internal" href="style_properties.html#style-property-hover_sound"><code class="xref std std-propref docutils literal notranslate"><span class="pre">hover_sound</span></code></a> and <a class="reference internal" href="style_properties.html#style-property-activate_sound"><code class="xref std std-propref docutils literal notranslate"><span class="pre">activate_sound</span></code></a> properties now
apply to bars.</p>
<p>When dispatching events in ATL, if an event with a <code class="docutils literal notranslate"><span class="pre">selected_</span></code> prefix is not
handled, the prefix is stripped and the event is matched again. This means
that a <code class="docutils literal notranslate"><span class="pre">hover</span></code> handler will handle the <code class="docutils literal notranslate"><span class="pre">selected_hover</span></code> even if the
<code class="docutils literal notranslate"><span class="pre">selected_hover</span></code> handler does not exist, and same thing with <code class="docutils literal notranslate"><span class="pre">selected_idle</span></code></p>
<p>Ren'Py versions can now include an optional letter at the end. The <code class="docutils literal notranslate"><span class="pre">n</span></code> suffix
is applied to nightly builds of Ren'Py, while the <code class="docutils literal notranslate"><span class="pre">u</span></code> suffix is applied to
unofficial builds.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">default</span></code> statement is applied after each rollback.</p>
<p>A regression that could prevent text in buttons from changing has been fixed.</p>
</div>
</div>
<div class="section" id="renpy-7-4-8">
<span id="id12"></span><h2>7.4.8<a class="headerlink" href="#renpy-7-4-8" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id13">
<h3>Fixes<a class="headerlink" href="#id13" title="Permalink to this headline"> link</a></h3>
<p>This fixes a major problem that could cause rollback to corrupt lists,
dictionaries, sets, and objects. Everyone that uses 7.4.7 is recommended
to upgrade.</p>
<p>A crash that could be caused by non-integer outlines has been fixed.</p>
<p>The correct size of a viewport is used for edge and mouse wheel scrolling.</p>
<p>Game controller detection has been fixed.</p>
</div>
<div class="section" id="features">
<h3>Features<a class="headerlink" href="#features" title="Permalink to this headline"> link</a></h3>
<p>It is now possible, using <code class="xref py py-func docutils literal notranslate"><span class="pre">PauseAction()</span></code> or <a class="reference internal" href="audio.html#renpy.music.set_pause" title="renpy.music.set_pause"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.music.set_pause()</span></code></a>,
to pause a channel that's playing video.</p>
<p>The default channel for movies can now be set with <a class="reference internal" href="config.html#var-config.single_movie_channel"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.single_movie_channel</span></code></a>.</p>
</div>
<div class="section" id="changes">
<h3>Changes<a class="headerlink" href="#changes" title="Permalink to this headline"> link</a></h3>
<p>When in developer mode, errors parameterizing an image will be reported to
the developer, rather than causing a placeholder (the gray ghost girl) to
appear.</p>
<p>The text window will not be shown before being hidden by the <code class="docutils literal notranslate"><span class="pre">centered</span></code>
and <code class="docutils literal notranslate"><span class="pre">vcentered</span></code> characters.</p>
<p>Rolling back to a place where the shift+O console caused a change in the
state of the game will not cause the effects of the console to be reverted.
Rolling back one step further will.</p>
</div>
</div>
<div class="section" id="renpy-7-4-7">
<span id="id14"></span><h2>7.4.7<a class="headerlink" href="#renpy-7-4-7" title="Permalink to this headline"> link</a></h2>
<div class="section" id="web-and-web-audio">
<h3>Web and Web Audio<a class="headerlink" href="#web-and-web-audio" title="Permalink to this headline"> link</a></h3>
<p>The way that the web platform plays audio has been rewritten. Instead of
using ffmpeg as Ren'Py does on other platform, the web version of Ren'Py
will hand sound files off to the browser's builtin audio player. This
is often multithreaded, and so prevents the skipping and crackling that
had been occurring with the web port.</p>
<p>The file formats that are supported on the web platform are now the
formats supported in browsers. This is Opus, Ogg, and MP3 in modern
web browsers, and just MP3 in Safari. (But see the Safari issues
below.)</p>
<p>The new <a class="reference internal" href="config.html#var-config.audio_filename_callback"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.audio_filename_callback</span></code></a> makes it possible to
adjust audio filenames on play, on the web and on other platforms.</p>
<p>Self-voicing, with the 'v' key, now works on the web platform if the
browser supports it.</p>
<p>Support for Ren'Py is limited on webkit-based browsers, due to
<a class="reference external" href="https://bugs.webkit.org/show_bug.cgi?id=227421">https://bugs.webkit.org/show_bug.cgi?id=227421</a> . This seems to affect
Safari on macOS, especially the M1, as well all web browsers on iOS. As there
is no way to fix this issue in Ren'Py, the web shell has been modified to
report the issue.</p>
</div>
<div class="section" id="id15">
<h3>iOS<a class="headerlink" href="#id15" title="Permalink to this headline"> link</a></h3>
<p>The iOS build is now compiled with a more modern version of Clang, allowing
it to run on the 12th generation iPhone and 2nd generation iPhone SE without
the pillarboxing (or worse, both pillarboxing and letterboxing) that
would otherwise be required.</p>
<p>Ren'Py can compile for the iOS simulator on M1 macs, but the simulator itself
may cause runtime issues.</p>
</div>
<div class="section" id="input">
<h3>Input<a class="headerlink" href="#input" title="Permalink to this headline"> link</a></h3>
<p>The input displayable now supports a number of new quality of life
features. Specifically, the following new features now work:</p>
<ul class="simple">
<li>Jumping a word to the left. (Ctrl-Left, Alt-Left on Macintosh.)</li>
<li>Jumping a word to the right. (Ctrl-Right, Alt-Right on Macintosh.)</li>
<li>Deleting a word. (Ctrl-Backspace, Alt-Backspace on Macintosh.)</li>
<li>Deleting the line. (Windows-Backspace, Command-Backspace on Macintosh.)</li>
</ul>
<p>In addition, Command-Left and Command-Right on Macintosh now navigate to
the start and end of the line, in addition to the usual Home and End keys.</p>
<p>The input caret now blinks to draw attention. The blink rate is
controlled by the <a class="reference internal" href="config.html#var-config.input_caret_blink"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.input_caret_blink</span></code></a> variable.</p>
</div>
<div class="section" id="id16">
<h3>Other<a class="headerlink" href="#id16" title="Permalink to this headline"> link</a></h3>
<p>The <code class="xref py py-func docutils literal notranslate"><span class="pre">Preferences()</span></code> function can now return actions that allow
access to the renderer and accessibility menus.</p>
<p>The new <a class="reference internal" href="screen_python.html#renpy.set_focus" title="renpy.set_focus"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.set_focus()</span></code></a> function makes it possible to set
the focused displayable, though mouse motions might immediately
change the focus.</p>
<p>In layered images, transform properties given to attributes now take
precedence to those given in groups. Previously, it was possible for
the attributes to conflict, such as when <a class="reference internal" href="atl.html#transform-property-align"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">align</span></code></a> was given to the group
and <a class="reference internal" href="atl.html#transform-property-xalign"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">xalign</span></code></a> was given to the attribute.</p>
<p>It is now possible to roll back past variables set in the console.</p>
<p>The new <code class="xref py py-func docutils literal notranslate"><span class="pre">mark_label_seen()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">mark_label_unseen()</span></code> make it
possible to manipulate the set of seen labels.</p>
<p>The new <code class="xref py py-func docutils literal notranslate"><span class="pre">mark_audio_seen()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">mark_audio_unseen()</span></code> make it
possible to manipulate the set of seen audio files.</p>
<p>The new <code class="xref py py-func docutils literal notranslate"><span class="pre">mark_image_seen()</span></code> and <code class="xref py py-func docutils literal notranslate"><span class="pre">mark_image_unseen()</span></code> make it
possible to manipulate the set of seen images.</p>
<p>ATL transforms in screens now start when first shown, rather than when the
screen containing the transform is first shown.</p>
<p>The new <a class="reference internal" href="config.html#var-config.autosave_on_input"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.autosave_on_input</span></code></a> variabel controls if autosaving
occurs on input.</p>
<p>Ren'Py will now report an error when a positional argument follows a
keyword argument.</p>
<p>It is now possible to use floating point numbers for <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> and
<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 have the result be correct. Previously, the floating
point numbers would be applied twice, so a <code class="xref py py-func docutils literal notranslate"><span class="pre">xsize()</span></code> of .5 would
represent 1/4 of the available width, rather than the correct 1/2 as it
does now.</p>
<p>The <a class="reference internal" href="persistent.html#persistent._clear" title="persistent._clear"><code class="xref py py-func docutils literal notranslate"><span class="pre">persistent._clear()</span></code></a> method, which clears persistent data, is now
documented.</p>
<p>The Spanish translation has been updated.</p>
<p>Atom has been updated.</p>
</div>
</div>
<div class="section" id="renpy-7-4-6">
<span id="id17"></span><h2>7.4.6<a class="headerlink" href="#renpy-7-4-6" title="Permalink to this headline"> link</a></h2>
<div class="section" id="camera-statement">
<h3>Camera Statement<a class="headerlink" href="#camera-statement" title="Permalink to this headline"> link</a></h3>
<p>There is a new <code class="docutils literal notranslate"><span class="pre">camera</span></code> statement, intended for use with the 3D Stage system.
This statement is similar to the <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">layer</span></code> statement, except that the layer
name is not required, and it is not cleared when a <code class="docutils literal notranslate"><span class="pre">scene</span></code> statement is run.</p>
<p>This statement lets you write:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">camera</span><span class="p">:</span>
<span class="na">perspective</span> <span class="kc">True</span>
</pre></div>
</div>
<p>to enable the 3D State system.</p>
<p>As part of this, the <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">layer</span></code> and <code class="docutils literal notranslate"><span class="pre">scene</span></code> statements have been reverted
to their behavior in 7.4.4 and earlier, where the <code class="docutils literal notranslate"><span class="pre">scene</span></code> statement clears
the list of transforms.</p>
</div>
<div class="section" id="model-displayable">
<h3>Model Displayable<a class="headerlink" href="#model-displayable" title="Permalink to this headline"> link</a></h3>
<p>The new <a class="reference internal" href="model.html#Model" title="Model"><code class="xref py py-class docutils literal notranslate"><span class="pre">Model</span></code></a> displayable serves as a way to create models for
use with the model-based renderer. Right now, the class is able to
create 2D models with multiple textures, making it possible to create
custom transforms that work like some of the built-in transforms do.</p>
<p>This displayable doesn't support 3D, yet, but that's expected in the future.</p>
</div>
<div class="section" id="id18">
<h3>Other Improvements<a class="headerlink" href="#id18" title="Permalink to this headline"> link</a></h3>
<p>The Atom text editor has been updated, and the language-renpy plugin assoicated
with it has been updated to support the new keywords introduced in recent
versions of Ren'Py.</p>
<p>Using a controller immediately hides the mouse cursor.</p>
</div>
<div class="section" id="id19">
<h3>Fixes<a class="headerlink" href="#id19" title="Permalink to this headline"> link</a></h3>
<p>A mistake in the build process meant that a change to fix compilation
on iOS that had been in the nightly didn't make it into the Ren'Py
release.</p>
<p>An issue where a modal screen would not block time events when the Ren'Py
window lost focus has been fixed.</p>
<p>The number of iterations of the blur shader has been limited, which ensures
that Ren'Py is compatible with more webgl devices.</p>
<p>Ren'Py will re-compile the Python files in the renpy/ directory, when the
Force Recompile option is checked. This ensures that if those files are
recompiled for some reason, the path to Ren'Py on the creator's system
will not be included.</p>
<p>ATL will now skip to the first frame to be displayed when using the animation
timebase.</p>
<p>Ren'Py will no longer pauses without timeouts after a rollback.</p>
</div>
</div>
<div class="section" id="renpy-7-4-5">
<span id="id20"></span><h2>7.4.5<a class="headerlink" href="#renpy-7-4-5" title="Permalink to this headline"> link</a></h2>
<div class="section" id="model-based-renderer">
<h3>Model-Based Renderer<a class="headerlink" href="#model-based-renderer" title="Permalink to this headline"> link</a></h3>
<p>The model-based renderer is now the default for games that are released
with Ren'Py 7.4.5. To disable it for your game, please set <a class="reference internal" href="model.html#var-config.gl2"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.gl2</span></code></a>
to False.</p>
<p>When the model-based renderer is being used, Ren'Py now supports a &quot;3D Stage&quot;.
This adds a third dimension to shown images, allowing for perspective correct
zooming and motion, the rotation and translation of displayables in 3D,
and many other new effects. Please see the <a class="reference internal" href="3dstage.html"><span class="doc">3D Stage</span></a>
documentation for more information.</p>
<p>To facilitate the 3D Stage, the <code class="docutils literal notranslate"><span class="pre">scene</span></code> statement no longer clears
transforms applied to a layer as a whole with <code class="docutils literal notranslate"><span class="pre">show</span> <span class="pre">layer</span></code> or
<code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.layer_at_list()</span></code>.</p>
<p>The new <a class="reference internal" href="transitions.html#Swing" title="Swing"><code class="xref py py-func docutils literal notranslate"><span class="pre">Swing()</span></code></a> transition is usable when the model-based renderer
is enabled. This causes the scene to rotate around the vertical or horizontal
axis, in three dimensions, and to be replaced with a previous scene.</p>
<p>The new <a class="reference internal" href="model.html#transform-property-blend"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">blend</span></code></a> transform property allows the blend function to be
specified. The blend function controls how a pixel being drawn is combined
to the pixel it is being drawn to.In addition to the &quot;normal&quot; and &quot;add&quot; blend
functions that Ren'Py already supported, new &quot;multiply&quot;, &quot;min&quot;, and &quot;max&quot; functions
have been added.</p>
</div>
<div class="section" id="mouse">
<h3>Mouse<a class="headerlink" href="#mouse" title="Permalink to this headline"> link</a></h3>
<p>There have been a number of changes and improvements to the hardware mouse
support, and it's now documented that GPUs have limits to the size of the
hardware mouse that can be supported.</p>
<p>A new variable <a class="reference internal" href="config.html#var-config.mouse_displayable"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.mouse_displayable</span></code></a> and displayable,
<a class="reference internal" href="mouse.html#MouseDisplayable" title="MouseDisplayable"><code class="xref py py-func docutils literal notranslate"><span class="pre">MouseDisplayable()</span></code></a>, now can be used to replace the hardware mouse
with a software one, similar to the way it was done in Ren'Py 7.3 and
earlier.</p>
</div>
<div class="section" id="id21">
<h3>Features<a class="headerlink" href="#id21" title="Permalink to this headline"> link</a></h3>
<p>A new function, <a class="reference internal" href="other.html#renpy.screenshot_to_bytes" title="renpy.screenshot_to_bytes"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.screenshot_to_bytes()</span></code></a>, takes a screenshot
and stores it in a bytes object that can be passed to <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>.
While these objects are large, it is possible to store them in regular
and persistent saves.</p>
<p>The new <a class="reference internal" href="audio.html#renpy.music.get_loop" title="renpy.music.get_loop"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.music.get_loop()</span></code></a> function returns a list of sound
files that are set to be looped on a channel, making it possible to
store and replay them.</p>
<p>The <a class="reference internal" href="input.html#renpy.input" title="renpy.input"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.input()</span></code></a> function and the input displayable take a new
<cite>mask</cite> parameter, that specifies a string that masks out characters
that would be shown to the player. This can be used to hide the text
of a password.</p>
<p>There is now a dark theme for the launcher.</p>
<p>The new <a class="reference internal" href="config.html#var-config.adjust_attributes"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.adjust_attributes</span></code></a> callback allows you to intercept
image attributes when show, and replace them with a list of your own.
For example, it's possible to use this to rewrite <code class="docutils literal notranslate"><span class="pre">eileen</span> <span class="pre">happy</span></code>
to <code class="docutils literal notranslate"><span class="pre">eileen</span> <span class="pre">happy_eyes</span> <span class="pre">happy_mouth</span></code>, which interacts well with
LayeredImage.</p>
<p>When running lint from the command line, the <code class="docutils literal notranslate"><span class="pre">--error-code</span></code> option can
be given to cause Ren'Py to return with an error code if lint fails.</p>
<p>Layer transitions can now persist past the end of an interaction.</p>
<p>Ren'Py avoids pausing right after a rollback, so that the rollback tries
to finish at a more interactive statement.</p>
<p>When playing a sound, it is possible to sync the start time of an audio
file in one channel with the time of the audio file in another channel.</p>
</div>
<div class="section" id="id22">
<h3>Android<a class="headerlink" href="#id22" title="Permalink to this headline"> link</a></h3>
<p>Several packages that are required to build on Android are now included
as part of Ren'Py. This fixes errors that are related to Bintray being
shut down, that prevented new installs of Ren'Py 7.4.4 from being able
to build for Android.</p>
<p>The way Ren'Py displays the presplash screen on Android has been
changed. The presplash is now displayed by the Java bootstrap, in
a new layer on top of the OpenGL layer. This is a new approach
compared to Ren'Py 7.4, where the presplash was displayed using SDL's
2D rendering. This change appears to improve compatibility with Android
devices, and prevent instances of black screens on start.</p>
<p>As part of this change, the way Ren'Py scales the presplash image has
been changed. Ren'Py will now scale-to-fit the presplash image inside
the available area.</p>
<p>An issue that prevented blur from working properly on certain Android
devices has been fixed.</p>
<p>An issue playing some less-used video and audio file formats on Android
has been fixed.</p>
<p>The Android fixes will require you to regenerate your Android project,
by answering the Android Configuration question &quot;Do you want to automatically
update the Java source code?&quot; with &quot;Yes.&quot;</p>
</div>
<div class="section" id="other-platforms">
<h3>Other Platforms<a class="headerlink" href="#other-platforms" title="Permalink to this headline"> link</a></h3>
<p>The Web Platform beta has been updated.</p>
<p>A regression in Mobile Safari for iOS 14.5.1 and later prevents Ren'Py from
starting on that platform. As the issue is with Mobile Safari, no workaround
is possible, and a message is displayed prompting the player to contact
Apple. This regression affects other iOS browsers that are shells for Mobile
Safari, like Chrome and Firefox.</p>
<p>Building for iOS has been fixed.</p>
<p>Support for Steam on macOS has been fixed.</p>
<p>Signing and Notarizing macOS applications has been fixed.</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>The default level-of-detail bias has been set to -0.5, and can be changed
with <a class="reference internal" href="config.html#var-config.gl_lod_bias"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.gl_lod_bias</span></code></a>. This is used to bias Ren'Py into scaling
down, rather than scaling up, but the previous bias would cause Ren'Py
to create jagged edges on images.</p>
<p>There have been a number of improvements to the way Ren'Py handles
modal screens.</p>
</div>
</div>
<div class="section" id="renpy-7-4-4">
<span id="id23"></span><h2>7.4.4<a class="headerlink" href="#renpy-7-4-4" title="Permalink to this headline"> link</a></h2>
<div class="section" id="the-old-game-directory">
<h3>The old-game directory<a class="headerlink" href="#the-old-game-directory" title="Permalink to this headline"> link</a></h3>
<p>To help creators that make multiple releases of their games (as with
early access or Patreon releases), Ren'Py now supports an old-game directory,
which can be a copy of the game directory from the previous release. Ren'Py
will use the information found in the .rpyc files in this directory when it
generates .rpyc files. As the .rpyc files are used when loading games,
this will tend to help Ren'Py load games created by multiple
developers.</p>
<p>For more information, see the <a class="reference internal" href="build.html#old-game"><span class="std std-ref">documentation</span></a>.</p>
</div>
<div class="section" id="id24">
<h3>Fixes<a class="headerlink" href="#id24" title="Permalink to this headline"> link</a></h3>
<p>A crash that could occur with gestures or controllers has been fixed.</p>
<p>A crash that occurred when generating web distributions on windows has
been fixed.</p>
<p>The persistent backend for achievements now supports the clearing of
progress.</p>
<p>Live2D now resets opacities with other parameters.</p>
<p>Ren'Py does not change the size of a maximized window when reloading.</p>
</div>
<div class="section" id="id25">
<h3>Other<a class="headerlink" href="#id25" title="Permalink to this headline"> link</a></h3>
<p>There is a new GL property, <code class="docutils literal notranslate"><span class="pre">blend_func</span></code> that is supported by the
model-based renderer. This allows the customization of the GL blend
function, allowing Ren'Py to start to support new blend modes.</p>
<p>Live2D now supports the additive and multiply blend modes.</p>
<p>Using default or define with the <code class="docutils literal notranslate"><span class="pre">renpy</span></code> namespace will now produce an
error.</p>
<p>A number of previously-undocumented methods on the <a class="reference internal" href="preferences.html"><span class="doc">preferences object</span></a>
have been documented. These methods make it possible to get or set the current value
of the volume and the current value of mute.</p>
</div>
</div>
<div class="section" id="renpy-7-4-3">
<span id="id26"></span><h2>7.4.3<a class="headerlink" href="#renpy-7-4-3" title="Permalink to this headline"> link</a></h2>
<div class="section" id="windows">
<h3>Windows<a class="headerlink" href="#windows" title="Permalink to this headline"> link</a></h3>
<p>The code for changing icons has been rewritten, to produce executables that
do not include any extraneous data other than the software and the icons
being added. This should prevent some antivirus programs from producing
false positives.</p>
<p>Ren'Py is now linked against the Universal C Runtime on Windows. This
may raise the version of Windows that Ren'Py runs on to Windows Vista
with certain hotfixes. This both modernizes Ren'Py, and should prevent
some antivirus programs from producing false positives.</p>
<p>Ren'Py will now disable Threaded Optimization on Nvidia GPUs. Threaded
Optimization interacted poorly with Ren'Py, causing pauses in places where
Ren'Py did not expect pauses to occur. This could manifest as audio glitches
that this change fixes.</p>
<p>Ren'Py will automatically use the ANGLE library to emulate OpenGL ES using
DirectX, if DirectX is available and OpenGL is not. This had not worked
properly in Ren'Py 7.4. The window may appear and disappear multiple times
as Ren'Py tries different video systems, this is expected.</p>
</div>
<div class="section" id="id27">
<h3>Android<a class="headerlink" href="#id27" title="Permalink to this headline"> link</a></h3>
<p>The non-model-based renderer now properly deallocates textures when Android
causes a render context to change. This prevents visual glitches that would
randomly occur, often during Dissolves.</p>
<p>Ren'Py now checks that it has focus when the game actually starts. This
fixes an issue where, if the player switched out of the application before
the game could fully start. Now, if Ren'Py has lost focus at game start,
it will save and quit, then re-launch when the player returns to the game.</p>
<p>In general, compatibility with Android devices has been improved.</p>
</div>
<div class="section" id="id28">
<h3>Features<a class="headerlink" href="#id28" title="Permalink to this headline"> link</a></h3>
<p>Added <a class="reference internal" href="config.html#var-config.main_menu_music_fadein"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.main_menu_music_fadein</span></code></a>, a way of fading in the main
menu music.</p>
<p>The new <a class="reference internal" href="displaying_images.html#renpy.get_zorder_list" title="renpy.get_zorder_list"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_zorder_list()</span></code></a> and <a class="reference internal" href="displaying_images.html#renpy.change_zorder" title="renpy.change_zorder"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.change_zorder()</span></code></a> allow
the zorder of images and screens to be manipulated after being shown.</p>
<p>Windows and frames can now take the <a class="reference internal" href="style_properties.html#style-property-modal"><code class="xref std std-propref docutils literal notranslate"><span class="pre">modal</span></code></a> style property. This is
similar to the modal property of screens, but only applies when the mouse
is within the boundaries of the window or frame. This can be used to ensure
the player can't click a button behind the window, while allowing buttons
that are not obstructed to be used.</p>
<p>The <a class="reference internal" href="live2d.html#Live2D" title="Live2D"><code class="xref py py-func docutils literal notranslate"><span class="pre">Live2D()</span></code></a> displayable now takes an <cite>update_function</cite> parameter,
which makes it possible to update parameters directly.</p>
<p>Ren'Py now supports the display of Emoji and other characters from outside
the Basic Multilingual Plane, if the fonts in use support the characters.
Right now, the emoji are displayed using the font rendering system, which
produces monochrome glyphs.</p>
<p>The <a class="reference internal" href="text.html#FontGroup" title="FontGroup"><code class="xref py py-class docutils literal notranslate"><span class="pre">FontGroup</span></code></a> class can now be used to remap characters inside
a font.</p>
<p>Displayables in the mask portion of a <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> are now focusable,
allowing new effects.</p>
<p>The player can now choose to ingore image files that cannot be loaded.</p>
<p>The new <a class="reference internal" href="other.html#renpy.get_sdl_dll" title="renpy.get_sdl_dll"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_sdl_dll()</span></code></a> and <a class="reference internal" href="other.html#renpy.get_sdl_window_pointer" title="renpy.get_sdl_window_pointer"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_sdl_window_pointer()</span></code></a>
functions make it possible to access the SDL DLL using ctypes. This may
make it possible to implement funcitonality that is in SDL, but Ren'Py
does not provide access to.</p>
<p>Clicking now ends a transition introduced with <a class="reference internal" href="other.html#renpy.transition" title="renpy.transition"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.transition()</span></code></a>,
or statements that have a <code class="docutils literal notranslate"><span class="pre">with</span></code> clause.</p>
<p><a class="reference internal" href="translation.html#renpy.translate_string" title="renpy.translate_string"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.translate_string()</span></code></a> is now a documented function that provides
the ability to translate a string to a selected language.</p>
<p>It is now possible to create a <code class="docutils literal notranslate"><span class="pre">hide_windows</span></code> label, that provides a way
to customize the hiding of windows that occurs when middle-clicking or
pressing the h key.</p>
<p>New properties, like the <a class="reference internal" href="model.html#transform-property-mesh_pad"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">mesh_pad</span></code></a> transform property
and the <code class="docutils literal notranslate"><span class="pre">gl_pixel_perfect</span></code> gl property, make it possible to
perform pixel perfect rendering after applying a shader to text.</p>
<p>The <a class="reference internal" href="input.html#renpy.input" title="renpy.input"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.input()</span></code></a> function now takes properties beginning with
<code class="docutils literal notranslate"><span class="pre">show_</span></code>, that are passed to the <code class="docutils literal notranslate"><span class="pre">input</span></code> screen.</p>
<p>The <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 now has an rgba property, that returns an
rgba tuple.</p>
</div>
<div class="section" id="old-features">
<h3>Old Features<a class="headerlink" href="#old-features" title="Permalink to this headline"> link</a></h3>
<p>The <a class="reference internal" href="store_variables.html#var-default_mouse"><code class="xref std std-var docutils literal notranslate"><span class="pre">default_mouse</span></code></a> variable was introduced in Ren'Py 7.4, as a way
to allow the mouse cursor to be changed without changing <a class="reference internal" href="config.html#var-config.mouse"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.mouse</span></code></a>
at runtime, as changing config variables at runtime isn't supported.</p>
</div>
<div class="section" id="id29">
<h3>Other Fixes<a class="headerlink" href="#id29" title="Permalink to this headline"> link</a></h3>
<p>An issue that prevented multiple modal screens from being processed correctly
has been fixed. This would manifest as focus problems.</p>
<p>Lint now produces files with Windows-style newlines, on Windows.</p>
<p>SDL error messages are decoded using the system encoding on Windows, making
them more readable.</p>
<p>Issues with quoting unicode characters in Python have been fixed.</p>
<p>Values of the <a class="reference internal" href="atl.html#transform-property-blur"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">blur</span></code></a> transform property between 0 and 1 now work properly.</p>
<p>The {done} text tag now works as defined.</p>
<p>Ren'Py is better at checking for GL load failuires and falling back to older
libraries.</p>
<p>Apps built for macOS should enable HighDPI mode.</p>
</div>
<div class="section" id="id30">
<h3>Translations<a class="headerlink" href="#id30" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py documentation has been translated into both Simplified and
Traditional Chinese, courtesy of 被诅咒的章鱼 and 逆转咸鱼.</p>
<p>The French translations have been updated.</p>
</div>
</div>
<div class="section" id="renpy-7-4-2">
<span id="id31"></span><h2>7.4.2<a class="headerlink" href="#renpy-7-4-2" title="Permalink to this headline"> link</a></h2>
<div class="section" id="fixes-and-changes">
<h3>Fixes and Changes<a class="headerlink" href="#fixes-and-changes" title="Permalink to this headline"> link</a></h3>
<p>The new <a class="reference internal" href="config.html#var-config.context_fadeout_music"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.context_fadeout_music</span></code></a> and <a class="reference internal" href="config.html#var-config.context_fadein_music"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.context_fadein_music</span></code></a>
variables make it possible to fade out and in music when a game is loaded or
other context changes cause the music to change.</p>
<p>Ren'Py now searches for Live2D motion and expression files using the
extensions (.motion3.json and .exp3.json), rather than using
directory names.</p>
<p>The new <a class="reference internal" href="build.html#var-build.include_i686"><code class="xref std std-var docutils literal notranslate"><span class="pre">build.include_i686</span></code></a> variable determines if the 32-bit
versions of Ren'Py are included in the build. Not including 32-bit
binaries can reduced download size and prevent overzealous antivirus
programs from incorrectly reporting distributions as infected.</p>
<p>The new <a class="reference internal" href="build.html#var-build.change_icon_i686"><code class="xref std std-var docutils literal notranslate"><span class="pre">build.change_icon_i686</span></code></a> will prevent the icon for the
i686 version from being changed. This may prevent antivirus programs
from incorrect detections.</p>
<p>Ren'Py will no longer disable the screen saver or prevent the
system from going to sleep when a game is running.</p>
<p>A macOS issue with the operating system's fullscreen (invoked using the gree
button) disabling resizing, and hence preventing the window from being
restored to it's normal size, has been resolved.</p>
<p>A crash on raspberry pi displaying a webp image has been fixed.</p>
<p>This release fixes missing files caused by a mistake in the build process:</p>
<ul class="simple">
<li>The say.vbs file was missing, preventing self-voicing from working on
Windows.</li>
<li>Various files required to support ANGLE were missing, which prevented
DirectX rendering from working.</li>
</ul>
</div>
<div class="section" id="id32">
<h3>Android<a class="headerlink" href="#id32" title="Permalink to this headline"> link</a></h3>
<p>There is a known issue with Samsung devices with the magnification shortcut
enabled, where the game may become unresponsive. I'm working on a fix, but
didn't want to delay the release for this.</p>
<p>The detection of the JVM on macOS is more robust, and less likely to
be confused by a browser plug-in.</p>
<p>Ren'Py now recommends the use of AdoptOpenJDK as a source for the
JVM.</p>
</div>
</div>
<div class="section" id="renpy-7-4-1">
<span id="id33"></span><h2>7.4.1<a class="headerlink" href="#renpy-7-4-1" title="Permalink to this headline"> link</a></h2>
<div class="section" id="pause-statement-changes">
<h3>Pause Statement Changes<a class="headerlink" href="#pause-statement-changes" title="Permalink to this headline"> link</a></h3>
<p>The behavior of the <code class="docutils literal notranslate"><span class="pre">pause</span></code> statement with a time has changed, so that:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">pause</span> <span class="mf">1.0</span>
</pre></div>
</div>
<p>is now equivalent to:</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="k">pause</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span>
</pre></div>
</div>
<p>and not:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">with</span> <span class="n">Pause</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span>
</pre></div>
</div>
<p>This means that other features that expect a real pause will work during the
pause statement.</p>
<p>Modal screens no longer block the <code class="docutils literal notranslate"><span class="pre">pause</span></code> statement, or <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>.
this means that a pause can end even if a modal screen is displayed above it.</p>
</div>
<div class="section" id="say-statement-id-clause">
<h3>Say Statement Id Clause<a class="headerlink" href="#say-statement-id-clause" title="Permalink to this headline"> link</a></h3>
<p>The say statement has now grown an <code class="docutils literal notranslate"><span class="pre">id</span></code> clause, that lets you specify the
old say statement id. This is useful for changing a say statement in the
original language, such as to fix an obvious typo, without needing to
update all the translations.</p>
<p>To use it, just add <code class="docutils literal notranslate"><span class="pre">id</span></code> to the say statement, followed by the
statement id:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="s2">&quot;This used to have a typo.&quot;</span> <span class="na">id</span> <span class="n">start_61b861a2</span>
</pre></div>
</div>
</div>
<div class="section" id="live2d">
<h3>Live2D<a class="headerlink" href="#live2d" title="Permalink to this headline"> link</a></h3>
<p>Live2D support has has a <cite>default_fade</cite> argument added, which can change the
default duration of fades at the start and end of motions and expressions.</p>
<p>An issue with Live2D that manifested as a tuple error has been fixed.</p>
</div>
<div class="section" id="controller-blocklist">
<h3>Controller Blocklist<a class="headerlink" href="#controller-blocklist" title="Permalink to this headline"> link</a></h3>
<p>The Nintendo Switch Pro Controller, when connected to a computer by
USB, requires an initialization sequence to be sent to cause it to
act as a Joystick, and not return incorrect data.</p>
<p>Ren'Py 7.4.0 attempted to send this sequence, but doing so required
directly accessing the USB bus, which was causing crashes and long
pauses on some computer. We've decided that this functionality is too
prone to compatibility problems to include in Ren'Py.</p>
<p>As a result, the Switch Pro Controller has been added to a new
controller blocklist, and will not function in Ren'Py.</p>
</div>
<div class="section" id="macos">
<h3>macOS<a class="headerlink" href="#macos" title="Permalink to this headline"> link</a></h3>
<p>The minimum supported version of macOS is now 10.10 (Yosemite). Ren'Py
7.4 did not run on this version, so this represents a restoration of
support for this version.</p>
<p>Choosing the projects directory was broken on macOS 11.0 (Big Sur).
This has been fixed.</p>
<p>Pyobjus is now part of the macOS build of Ren'Py, in addition to
the iOS build. This library makes it possible to access Cocoa APIs.</p>
</div>
<div class="section" id="id34">
<h3>Android<a class="headerlink" href="#id34" title="Permalink to this headline"> link</a></h3>
<p>There have been reports that prereleases of Ren'Py 7.4.1 will not run
properly on older Android devices, like the Samsung Galaxy S5. We
are attempting to acquire an example of a device exhibiting the
problem, and will make a new release as required.</p>
</div>
<div class="section" id="id35">
<h3>Translations<a class="headerlink" href="#id35" title="Permalink to this headline"> link</a></h3>
<p>The Spanish translation has been updated.</p>
</div>
<div class="section" id="id36">
<h3>Other Fixes<a class="headerlink" href="#id36" title="Permalink to this headline"> link</a></h3>
<p>An issue that could cause crashes on movies of certain sizes when
Ren'Py was run on a computer that supports SSE3 has been fixed.</p>
<p>Movie playback now uses multiple cores for video decoding, as it
did in previous versions of Ren'Py.</p>
<p>An issue that could cause the size of the Ren'Py window to increase
when run on Windows with a non-100% DPI has been fixed.</p>
<p>Ren'Py will no longer give a performance warning when an unsupported
renderer is selected, such as when using the GL or ANGLE renderer on
a game that requires gl2.</p>
<p>An issue that would, in some cases, prevent say attributes from being
shown has been fixed.</p>
<p>An issue preventing MultiPersistent files from working on computers that
do not use UTF-8 at the default file encoding has been fixed.</p>
<p>The flags for compiling Python when <code class="docutils literal notranslate"><span class="pre">rpy</span> <span class="pre">python</span> <span class="pre">3</span></code> is enabled have been
improved.</p>
<p>An issue that prevented triple-quoted strings (like the strings used for
gui.about) from being evaluated correctly has been fixed.</p>
<p>Ren'Py now detects its path during certain reloads.</p>
<p>Ren'Py will determine of all functions a renderer requires can be
dynamically loaded, and will try different renderers if this is not
the case.</p>
<p>Timers that are created after the start of a statement now properly
participate in the rollback system, and will fire if the game rolls
back to a point where the timer has not fired.</p>
<p>Ren'Py now allows the screensaver to activate while a Ren'Py game is
running.</p>
<p>A problem with dynamic variables not remaining dynamic during a rollback
has been fixed.</p>
<p>When given a size, the hbox and vbox displayables now position children
in the same way those children were positioned in Ren'Py 7.4.</p>
<p>The new <a class="reference internal" href="style_properties.html#style-property-mipmap"><code class="xref std std-propref docutils literal notranslate"><span class="pre">mipmap</span></code></a> style property applies to 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>, <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>,
and <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> transitions, 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>, <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>, and <a class="reference internal" href="text.html#Text" title="Text"><code class="xref py py-func docutils literal notranslate"><span class="pre">Text()</span></code></a>
displayables, and text in general. This property controls if mipmaps are
generated for the textures created by these displayables. Avoiding creating
mipmaps may improve rendering performance on slower computers, but
can lead to artifacts when scaling down. When not specified, this property
defaults to <a class="reference internal" href="config.html#var-config.mipmap_dissolves"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.mipmap_dissolves</span></code></a>, <a class="reference internal" href="config.html#var-config.mipmap_movies"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.mipmap_movies</span></code></a>, or
<a class="reference internal" href="config.html#var-config.mipmap_text"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.mipmap_text</span></code></a>, as appropriate.</p>
<p>The toggle version of self-voicing preferences have been changed to
provide a better selected state.</p>
<p>Lint now once again reports statistics by translation.</p>
</div>
</div>
<div class="section" id="renpy-7-4">
<span id="id37"></span><h2>7.4.0<a class="headerlink" href="#renpy-7-4" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id38">
<h3>Model-Based Renderer<a class="headerlink" href="#id38" title="Permalink to this headline"> link</a></h3>
<p>This release includes a new model-based renderer, the component of Ren'Py that
is responsible for drawing text and images to the user's display, supplementing
(with the intent of eventually replacing) the original OpenGL renderer added
in Ren'Py 6.10. This renderer takes better advantage of the hardware present
in modern GPUS (both dedicated graphics cards and GPUs integrated into
processors) to improve performance and increase capability. This renderer
supports desktop computers that support either OpenGL 2.2 or DirectX 9.0c or
11, and mobile devices and embedded systems that support OpenGL ES 3.</p>
<p>The biggest change in the model-based renderer is that Ren'Py is no longer
limited to drawing rectangular images in a 2-dimensional plane. Instead,
Ren'Py has been converted to use meshes made up of triangles in a
three-dimensional space. While existing rectangular sprites are
displayed in the same way, this opens up Ren'Py to non-rectangular
meshes, and eventually full three dimensional geometry.</p>
<p>In addition to mesh geometry, model-based renderering supports shaders,
both shaders included with Ren'Py, and shaders specified by creators as
part of their game. Shaders are small programs that run on the GPU, that
can process geometry and pixel data, to allow for all sorts of graphical
effects.</p>
<p>The model-based renderer implements a new fast texture loading system,
which moves an expensive part of texture loading, alpha
premultiplication, from the CPU to the GPU.</p>
<p>The model-based renderer also creates mipmaps for each texture that is loaded
into the GPU. A mipmap is a series of smaller versions of the texture,
stored on the GPU. By creating and utilizing mipmaps, Ren'Py is now able
to shrink images below 50% of the original size, without the appearance
of the aliasing artifacts. This is especially relevant when assets meant
for 4K monitors are used on 1080P and smaller displays.</p>
<p>For this release, the Model-Based Renderer is opt in, with that opt-in
controlled by the <a class="reference internal" href="model.html#var-config.gl2"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.gl2</span></code></a> variable. As we gain more experience
with it, it is indended to be come the default Ren'Py renderer.</p>
</div>
<div class="section" id="id39">
<h3>Live2D<a class="headerlink" href="#id39" title="Permalink to this headline"> link</a></h3>
<p>One of the features enabled by the model-based renderer is support for
displaying sprites made in Live2D. Ren'Py requires you to download Live2D
Cubism separately, as you'll need to execute a contract with Live2D, Inc.
before distributing a game that uses their technology.</p>
<p>Ren'Py supports the display of Live2D models, complete with the ability to
change expression and to queue up one or more motions. This is integrated
into Ren'Py's image attribute system. Ren'Py also supports fading from
one motion to another when an attribute changes.</p>
</div>
<div class="section" id="matrixcolor-and-blur">
<h3>Matrixcolor and Blur<a class="headerlink" href="#matrixcolor-and-blur" title="Permalink to this headline"> link</a></h3>
<p>The model-based renderer enables new functionality in transforms, such as
matrixcolor and blur.</p>
<p>Transforms (including ATL Transforms) now support a new <a class="reference internal" href="atl.html#transform-property-matrixcolor"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">matrixcolor</span></code></a>
property, which either a matrix or an object that creates a matrix that
changes in time, and uses it to recolor everything that is a child of the
transform.</p>
<p>While previous versions of Ren'Py supported the <a class="reference internal" href="im.html#im.MatrixColor" title="im.MatrixColor"><code class="xref py py-func docutils literal notranslate"><span class="pre">im.MatrixColor()</span></code></a> image
manipulator, the new property is much improved. The image manipulator would
often take a large fraction of a second, making it too slow for real-time use,
and was limited to single images. The new transform property is fast enough
that it can be changed every frame if necessary, and can be applied to
any displayable. It's now possible to apply a Transform using matrixcolor
to a layer, to recolor the entire layer - making it possible to push your
game into sepia or black-and-white without needing a separate set of
images.</p>
<p>There are a few difference between the image manipulator and the the
transform property versions of matrixcolor, as the new version uses
4x4 matrices and premultiplied alpha color, so the new property can't
use the same matrices. Instead, there are number of new <a class="reference internal" href="matrixcolor.html#colormatrix"><span class="std std-ref">ColorMatrix</span></a>
objects that need to be used.</p>
<p>Transforms also support a new <a class="reference internal" href="atl.html#transform-property-blur"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">blur</span></code></a> property, which blurs the child
of the displayable by the given number of pixels.</p>
</div>
<div class="section" id="python-2-python-3-compatibility-mode">
<h3>Python 2/Python 3 Compatibility Mode<a class="headerlink" href="#python-2-python-3-compatibility-mode" title="Permalink to this headline"> link</a></h3>
<p>While Ren'Py is not yet supported on Python 3, this release of Ren'Py
includes several features to allow you to begin writing scripts that will
work on both Python 2 and Python 3.</p>
<p>First, Ren'Py now uses <a class="reference external" href="https://python-future.org/">future</a> to provide
standard library compatibility. It's now possible to import modules using
their Python 3 names, when a renaming has occured.</p>
<p>When a .rpyc file begins with the new <code class="docutils literal notranslate"><span class="pre">rpy</span> <span class="pre">python</span> <span class="pre">3</span></code>, the file is compiled
in a Python 3 compatibility mode. The two changes this causes are:</p>
<ul class="simple">
<li>Ren'Py will compile the file in a mode that attempts to emulate Python 3
semantics, including the change to division. In Python 3, <code class="docutils literal notranslate"><span class="pre">1/2</span></code> is equal
to .5, and not 0. Since this changes the type of the expression,
this can change the position of displayables. <code class="docutils literal notranslate"><span class="pre">1//2</span></code> keeps the original
semantics.</li>
<li>Ren'Py will change the behavior of dict so that the <code class="docutils literal notranslate"><span class="pre">items</span></code>, <code class="docutils literal notranslate"><span class="pre">keys</span></code>, and
<code class="docutils literal notranslate"><span class="pre">values</span></code> methods return views, rather than lists, when called directly
from that .rpy file. These match the Python 3 semantics for these methods,
but need to be explicitly turned into a list before being saved or participating
in rollback.</li>
</ul>
</div>
<div class="section" id="upgraded-libraries-and-platform-support">
<h3>Upgraded Libraries and Platform Support<a class="headerlink" href="#upgraded-libraries-and-platform-support" title="Permalink to this headline"> link</a></h3>
<p>For Ren'Py 7.4, the build system was redone, replacing the multiple build
systems needed to build Ren'Py with a single build platform that handles
every platform except for webasm. The change in build system also involved
updating all of the libraries that Ren'Py uses to newer versions.</p>
<p>As a result of this, the list of platforms that Ren'Py offically supports
has changed slightly. Here's the latest list of what is supported:</p>
<table border="1" class="docutils">
<colgroup>
<col width="33%" />
<col width="33%" />
<col width="33%" />
</colgroup>
<thead valign="bottom">
<tr class="row-odd"><th class="head">Platform</th>
<th class="head">CPU</th>
<th class="head">Note</th>
</tr>
</thead>
<tbody valign="top">
<tr class="row-even"><td>Linux</td>
<td>x86_64</td>
<td>Raised minimum version to Ubuntu 16.04</td>
</tr>
<tr class="row-odd"><td>Linux</td>
<td>i686</td>
<td>Raised minimum version to Ubuntu 16.04</td>
</tr>
<tr class="row-even"><td>Linux</td>
<td>i686</td>
<td>Raised minimum version to Ubuntu 16.04</td>
</tr>
<tr class="row-odd"><td>Linux</td>
<td>armv7l</td>
<td>Intended to support Raspberry Pi, uses Raspian Buster</td>
</tr>
<tr class="row-even"><td>Windows</td>
<td>x86_64</td>
<td>A new port to 64-bit Windows Vista and later.</td>
</tr>
<tr class="row-odd"><td>Windows</td>
<td>i686</td>
<td>Raised minimum version to Windows Vista.</td>
</tr>
<tr class="row-even"><td>macOS</td>
<td>x86_64</td>
<td>macOS 10.10+</td>
</tr>
<tr class="row-odd"><td>Android</td>
<td>armv7a</td>
<td>Android 4.4 KitKat</td>
</tr>
<tr class="row-even"><td>Android</td>
<td>arm64</td>
<td>Android 5.0 Lollipop</td>
</tr>
<tr class="row-odd"><td>Android</td>
<td>x86_64</td>
<td>Android 5.0 Lollipop</td>
</tr>
<tr class="row-even"><td>iOS</td>
<td>arm64</td>
<td>All 64-bit iOS devices, iOS 11.0+</td>
</tr>
<tr class="row-odd"><td>iOS</td>
<td>x86_64</td>
<td>The 64-bit iOS simulator, iOS 11.0+</td>
</tr>
<tr class="row-even"><td>Web</td>
<td>webasm</td>
<td>Modern web browsers</td>
</tr>
</tbody>
</table>
<p>The biggest new platform that Ren'Py supports is the 64-bit Windows
platform, which means that Ren'Py is available in 64-bits on all major
desktop and mobile platforms. The new <code class="xref std std-var docutils literal notranslate"><span class="pre">renpy.bits</span></code> variable can
be used to determine if Ren'Py is running on a 32 or 64-bit platform,
if necessary. (For example, to set <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> appropriately.)</p>
<p>The one platform that loses support in this release is 32-bit (armv7l) iOS
devices. These devices are no longer supported by Apple, and do not support
the level of OpenGL ES that Ren'Py requires.</p>
</div>
<div class="section" id="web">
<h3>Web<a class="headerlink" href="#web" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now runs significantly faster in the browser, thanks to new
compilation techniques.</p>
<p>A game built for the web platform can now download image and audio
files from the web server as the game is played. The download begins
when the image or sound is predicted. This can reduce the initial time
it takes before the game begins running, as well as memory usage.</p>
<p>When running inside a web browser on a touch-screen device, Ren'Py
will display a touch-based keyboard, to compensate for web browsers
having difficulty displaying keyboard entry for wasm-based games.</p>
<p>The splash screen displayed while loading can use the WebP format,
including animated WebP.</p>
<p>More Python modules are provided, making the Python environment closer
to native Ren'Py ports.</p>
<p>Support for iOS browsers was improved.</p>
</div>
<div class="section" id="steam">
<h3>Steam<a class="headerlink" href="#steam" title="Permalink to this headline"> link</a></h3>
<p>It is now possible to install Steam support from the Ren'Py launcher, by
choosing &quot;preferences&quot;, &quot;Install libraries&quot;, &quot;Install Steam Support&quot;.</p>
<p>The new <a class="reference internal" href="achievement.html#var-config.steam_appid"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.steam_appid</span></code></a> variable automatically creates the
steam_appid.txt file for you. This needs to be set by a <code class="docutils literal notranslate"><span class="pre">define</span></code> statement,
or in a python early block.</p>
</div>
<div class="section" id="id40">
<h3>Translations<a class="headerlink" href="#id40" title="Permalink to this headline"> link</a></h3>
<p>The Simplified Chinese, Japanese, and Korean translations have been updated, and now
use a unified font.</p>
<p>There is a new Simplified Chinese translation of the tutorial game, courtesy of
Neoteus.</p>
</div>
<div class="section" id="depreciations-and-removals">
<h3>Depreciations and Removals<a class="headerlink" href="#depreciations-and-removals" title="Permalink to this headline"> link</a></h3>
<p>As described above, Ren'Py no longer support Windows XP.</p>
<p>As described above, Ren'Py no longer supports 32-bit iOS devices.</p>
<p>The choice of downloading the Editra text editor has been removed from Ren'Py.
Editra hadn't been updated in over 5 years, and the website it was originally
distributed from has disappeared.</p>
<p>While not completely removed, the software renderer has been simplified and
removed as an option for gameplay. Its purposes is now limited to informing
players about issues that prevent display of graphics with a GPU-based
renderer.</p>
</div>
<div class="section" id="miscellaneous">
<h3>Miscellaneous<a class="headerlink" href="#miscellaneous" title="Permalink to this headline"> link</a></h3>
<p>Support for controllers has been improved. Repeat is now supported
on controllers, and the libraries that Ren'Py uses have been compiled
to support many of the more popular game controllers.</p>
<p>Ren'Py now uses software playback of movies on Android and iOS devices,
meaning the same files can be used on all platforms that support video
playback.</p>
<p>Defining a mouse cursor using <a class="reference internal" href="config.html#var-config.mouse"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.mouse</span></code></a> now uses SDL2's color cursor
API, which generally results in hardware acceleration and reduced mouse movement
lag.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">define</span></code> statement can now be used to set a key in a dictionary.</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="c1"># Ren&#39;Py was started in 2004.</span>
<span class="k">define</span> <span class="n">age</span><span class="p">[</span><span class="s2">&quot;eileen&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2020</span> <span class="o">-</span> <span class="mi">2004</span>
</pre></div>
</div>
<p>The <code class="docutils literal notranslate"><span class="pre">define</span></code> statement can take += and |=, to apply the appropriate
update operators.</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">keymap</span><span class="p">[</span><span class="s1">&#39;dismiss&#39;</span><span class="p">]</span> <span class="o">+=</span> <span class="p">[</span> <span class="s1">&#39;K_KP_PLUS&#39;</span> <span class="p">]</span>
<span class="c1"># This assumes endings is a set.</span>
<span class="k">define</span> <span class="n">endings</span> <span class="o">|=</span> <span class="p">{</span> <span class="s2">&quot;best&quot;</span> <span class="p">}</span>
</pre></div>
</div>
<p>It is now possible to specify a relative audio channel whenever an
audio is file is played, using the new <code class="docutils literal notranslate"><span class="pre">volume</span></code> clause to <code class="docutils literal notranslate"><span class="pre">play</span></code> and
<code class="docutils literal notranslate"><span class="pre">queue</span></code>.</p>
<p>The new <a class="reference internal" href="atl.html#transform-property-fit"><code class="xref std std-tpref docutils literal notranslate"><span class="pre">fit</span></code></a> property of transforms provides for different ways
of making an image fit size with a different aspect ratio. For example,
it can be scaled to be contained fully within the given size, or to make sure that
it completely covers the given size.</p>
<p>The <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 no longer double
the size of the displayable they are applied to, making them easier to combine
with positioning transform properties.</p>
<p>The <a class="reference internal" href="input.html#renpy.input" title="renpy.input"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.input()</span></code></a> function can now take regular expressions when determining
what is and is not allowed.</p>
<p>Grids now take <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, that is applied outside the
grid, and inside a containing viewport.</p>
<p>Ren'Py support an {alt} text tag, that causes the text to be spoken during
self-voicing, but not displayed. It also supports a {noalt} text tag that does
the opposite.</p>
<p>The launcher window can now be resized if necessary. A button has been added to
the launcher preferences to restore the default size.</p>
<p>The new <a class="reference internal" href="build.html#var-build.mac_info_plist"><code class="xref std std-var docutils literal notranslate"><span class="pre">build.mac_info_plist</span></code></a> variable makes it easier to customize
the mac app.</p>
<p>The <a class="reference external" href="https://requests.readthedocs.io/en/master/">requests</a> library, is
bundled with Ren'Py, making accessing the web much easier.</p>
<p>Pressing PAUSE on your keyboard brings the player to the game menu, finally
giving that key a function.</p>
</div>
</div>
<div class="section" id="renpy-7-3-5">
<span id="id41"></span><h2>7.3.5<a class="headerlink" href="#renpy-7-3-5" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id42">
<h3>Fixes<a class="headerlink" href="#id42" title="Permalink to this headline"> link</a></h3>
<p>On desktop platforms, the presplash screen has been reworked so that it
will not cause the window to become nonresponsive if clicked.</p>
<p>The iOS port has been updated to include modules that have been newly
added to Ren'Py, allowing the compilation of iOS apps.</p>
</div>
<div class="section" id="id43">
<h3>Other Changes<a class="headerlink" href="#id43" title="Permalink to this headline"> link</a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">audio</span></code> directory, which automatically defines
names in the <a class="reference internal" href="audio.html#audio-namespace"><span class="std std-ref">audio namespace</span></a>, has been made
visible in the launcher, and is added to newly-createrd projects.</p>
<p>The new <a class="reference internal" href="config.html#var-config.exception_handler"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.exception_handler</span></code></a> callback allows an application to
replace Ren'Py's exception handling system in its entirety.</p>
</div>
</div>
<div class="section" id="renpy-7-3-4">
<span id="id44"></span><h2>7.3.4<a class="headerlink" href="#renpy-7-3-4" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id45">
<h3>Fixes<a class="headerlink" href="#id45" title="Permalink to this headline"> link</a></h3>
<p>This release fixes major graphics glitches that were introduced in 7.3.3.</p>
<ul class="simple">
<li>On Windows, textures would fail to be reloaded when switching from fullscreen
to windowed mode or vice-versa. This would cause the wrong texture to be
displayed.</li>
<li>On all platforms, graphical glitches could occur when <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>
was used.</li>
</ul>
</div>
<div class="section" id="id46">
<h3>Other Changes<a class="headerlink" href="#id46" title="Permalink to this headline"> link</a></h3>
<p>Dynamic images can now include &quot;[prefix_]&quot; everywhere, and especially when
<code class="docutils literal notranslate"><span class="pre">add</span></code> has been used to add a dynamic image to buttons, drags, and similar
focusable objects.</p>
<p>Creator-defined screen language statements may now take <code class="docutils literal notranslate"><span class="pre">if</span></code>
statements as children.</p>
<p>The drag and drop system has been improved to better interact with updated
screens.</p>
</div>
</div>
<div class="section" id="renpy-7-3-3">
<span id="id47"></span><h2>7.3.3<a class="headerlink" href="#renpy-7-3-3" title="Permalink to this headline"> link</a></h2>
<div class="section" id="audio">
<h3>Audio<a class="headerlink" href="#audio" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now supports an <code class="docutils literal notranslate"><span class="pre">audio</span></code> directory, which automatically defines
names in the <a class="reference internal" href="audio.html#audio-namespace"><span class="std std-ref">audio namespace</span></a>. This makes it
possible to have a file named <code class="docutils literal notranslate"><span class="pre">game/audio/overture.ogg</span></code>, and play
it using:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">play</span> <span class="k">music</span> <span class="n">overture</span>
</pre></div>
</div>
<p>The new <a class="reference internal" href="audio.html#AudioData" title="AudioData"><code class="xref py py-func docutils literal notranslate"><span class="pre">AudioData()</span></code></a> class allows you to provide compressed
audio data to Ren'Py, either generated programatically or taken
from a source other than a file. To support this, the Python wave
and sunau modules are now packaged with Ren'Py.</p>
<p>An issue with enabling the mixing of mono sound files has been fixed.
This issue caused many WAV files not to play. (We still don't recommend
the use of WAV files.)</p>
</div>
<div class="section" id="platforms">
<h3>Platforms<a class="headerlink" href="#platforms" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py is now distributed as a signed and notarized binary on the
Mac. As this process takes a very long time to accomplish, the
ability to sign macOS binaries has been removed from Ren'Py itself,
in favor of external scripts that take care of the signing and
notarization process.</p>
<p>The minimum version supported by the Android port has been lowered
to Android 19 (Android 4.4 KitKat).</p>
<p>The web port of Ren'Py has seen a number of changes:</p>
<ul class="simple">
<li><a class="reference internal" href="screens.html#screen-variants"><span class="std std-ref">Screen variants</span></a> are now detected and set.</li>
<li>Fullscreen support has been improved, though the user may need to click to enable fullscren.</li>
<li>Leaving the web page is detected, so persistent data may be saved.</li>
<li>'game.zip' can now be renamed. 'DEFAULT_GAME_FILENAME' in index.html controls this.</li>
<li>Portable HTTP requests (native+renpyweb): see <a class="reference external" href="https://github.com/renpy/renpyweb/blob/master/utils/asyncrequest.rpy">https://github.com/renpy/renpyweb/blob/master/utils/asyncrequest.rpy</a></li>
<li>Enable networking in Python web port for testing WebSockets, transparently available through the Python 'socket' module</li>
<li>HTTP Cache-Control allows for smoother game updates.</li>
<li>The pygame.draw module is now included, allowing Canvas support.</li>
<li>WebGL compatibility has been improved.</li>
</ul>
</div>
<div class="section" id="id48">
<h3>Other Changes<a class="headerlink" href="#id48" title="Permalink to this headline"> link</a></h3>
<p>During profiling conducted for the GL Rewrite project, it became
clear that the switch to framebuffer objects in 7.3.0 was the
cause of certain performance regressions. By changing how FBOs
are used, Ren'Py performance has been improved.</p>
<p>The <a class="reference internal" href="input.html#renpy.input" title="renpy.input"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.input()</span></code></a> function can now be given the name of a screen
that is used to prompt the user for input.</p>
<p>The creation of list, dicts, and sets inside of screen language is now
analyzed correctly. This will allow more displayables to be analyzed
as constant, improving screen performance.</p>
<p>The notify screen is now hidden on rollback.</p>
<p>The NVL mode screen indicates that it shows the window, which prevents
problems when <code class="docutils literal notranslate"><span class="pre">window</span> <span class="pre">show</span></code> is in effect.</p>
<p>When a <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> with <cite>from_current</cite> set to true occurs during a
multi-part statement (like a menu with dialogue), control is restored
to the first part of that multi-part statement (thus causing the dialouge
to be displayed).</p>
<p>More functions now use a tag's default layer.</p>
<p>The <a class="reference internal" href="other.html#renpy.is_init_phase" title="renpy.is_init_phase"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.is_init_phase()</span></code></a> function has been added.</p>
<p>Automatic voice now works for dialogue that is part of a menu
statement.</p>
<p>Support for GLES1 has been dropped. (It hadn't been used for years.)</p>
<p>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> and <a class="reference internal" href="screen_actions.html#SensitiveIf" title="SensitiveIf"><code class="xref py py-func docutils literal notranslate"><span class="pre">SensitiveIf()</span></code></a> actions can now take
other actions as arguments.</p>
<p>Many BarValues now take a <cite>force_step</cite> argument, which forces changes to
the bar to be rounded to the nearest step value.</p>
<p><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> now allows the tile argument to be the string &quot;integer&quot;,
which tiles the contents of the frame an integer number of times.</p>
<p><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> now allows the <cite>name</cite> argument to be a function or
callable object when <cite>dynamic</cite> is true.</p>
</div>
<div class="section" id="id49">
<h3>Translations<a class="headerlink" href="#id49" title="Permalink to this headline"> link</a></h3>
<p>The Korean and Spanish translations have been updated.</p>
</div>
</div>
<div class="section" id="renpy-7-3-2">
<span id="id50"></span><h2>7.3.2<a class="headerlink" href="#renpy-7-3-2" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id51">
<h3>Fixes<a class="headerlink" href="#id51" title="Permalink to this headline"> link</a></h3>
<p>Fix a regression in the platform variables, caused by the previous
release.</p>
</div>
<div class="section" id="id52">
<h3>Translations<a class="headerlink" href="#id52" title="Permalink to this headline"> link</a></h3>
<p>Update the spanish translation.</p>
</div>
</div>
<div class="section" id="renpy-7-3-1">
<span id="id53"></span><h2>7.3.1<a class="headerlink" href="#renpy-7-3-1" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id54">
<h3>Changes<a class="headerlink" href="#id54" title="Permalink to this headline"> link</a></h3>
<p>Descriptive text (text that is intended to be show when self-voicing is
enabled, so that scenes can be described to the vision impared) has been
updated. Descriptive text is now accessed using the <code class="docutils literal notranslate"><span class="pre">alt</span></code> character
(the old <code class="docutils literal notranslate"><span class="pre">sv</span></code> character has been retained as an alias.) It's also now
possible to display descriptive text using a custom character, rather than
the narrator.</p>
<p>Ren'Py now always initializes the media playback system, so that a movie
can be played even if no audio will be played.</p>
<p>The <cite>default</cite> property of most displayables, which is used to choose a
displayable to be focused by default, has been renamed to <cite>default_focus</cite>
so that it does not conflict with the <code class="docutils literal notranslate"><span class="pre">default</span></code> statement. It also now
takes an integer, with the displayable with the highest focus number
getting focus.</p>
<p>The <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 now passes positions from the child.</p>
<p>Seeded random number generators created with renpy.random.Random now
support rollback.</p>
<p>When emulating Android or iOS, the platform variables (like renpy.android,
renpy.ios, renpy.windows, and renpy.mobile) are set properly.</p>
<p>Renpyweb now stores the date and time that a save file was created.</p>
</div>
<div class="section" id="id55">
<h3>Fixes<a class="headerlink" href="#id55" title="Permalink to this headline"> link</a></h3>
<p>This release fixes a fairly major issue that could cause screens that
interpolate text to not update, or update improperly.</p>
<p>This release properly runs the image prediction routine from the
image prediction thread.</p>
<p>A problem with the {clear} text tag has been fixed.</p>
<p>The <a class="reference internal" href="config.html#var-config.end_game_transition"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.end_game_transition</span></code></a>, which was not working properly
in most circumstances, has been fixed.</p>
</div>
<div class="section" id="id56">
<h3>Translations<a class="headerlink" href="#id56" title="Permalink to this headline"> link</a></h3>
<p>The Russian, Korean, and Spanish translations were updated.</p>
</div>
</div>
<div class="section" id="renpy-7-3-0">
<span id="id57"></span><h2>7.3.0<a class="headerlink" href="#renpy-7-3-0" title="Permalink to this headline"> link</a></h2>
<div class="section" id="renpyweb">
<h3>Renpyweb<a class="headerlink" href="#renpyweb" title="Permalink to this headline"> link</a></h3>
<p>Courtesy of Sylvain Beucler, Ren'Py now can generate distributions for
the the HTML5 web platforms, capable of running on modern web browsers
that support the Web Assembly standard. This is intended for small games
and demonstrations of larger games, as right now the implementation
downloads the full game to the web browser before running any of it.</p>
<p>Web support is marked as beta, as there are cases where problem with the
web platform (most notably, a lack of threading) cause problems such as
sound glitches if an image takes too long to load. As a result, it is
possible to have a Ren'Py game that works well on all other platforms,
but not in the web browser. As web browsers themselves improve, we will
improve our implementation and eventually remove the beta tag.</p>
<p>Building a web distribution can be done from the new &quot;Web&quot; button
on the Ren'Py launcher. The launcher now includes a small web server,
that can be used to launch the game in a creator's web browser for test
purposes.</p>
</div>
<div class="section" id="creator-defined-statements">
<h3>Creator-Defined Statements<a class="headerlink" href="#creator-defined-statements" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py's creator-defined statements, and the Lexer objects that are
used by them, have been extended to improve the functionality in
many ways. With respect to the Lexer:</p>
<ul class="simple">
<li>It is now possible to ask the Lexer object to parse a single
line as a Ren'Py statement, or all the lines remaining in the
block as Ren'Py statements.</li>
<li>It is now possible to ask the lexer to catch errors, so as to
limit the scope of errors to a part of a creator-defined statement
rather than the whole statement.</li>
</ul>
<p>The <a class="reference internal" href="cds.html#renpy.register_statement" title="renpy.register_statement"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.register_statement()</span></code></a> function has new arguments to enable
new functionality.</p>
<ul class="simple">
<li>Statement prediction can be controlled by the <cite>predict_all</cite> and <cite>predict_next</cite>
arguments, which predict all possible next statements or take a function
that determines what will run next, respectively.</li>
<li>The new <cite>post_execute</cite> argument lets one specify an execute function that is
run as the next statement - the one after the creator-defined statement.
This allows a pattern where a statement runs, executes the block inside it,
and then runs something after the block to clean it up. (For example, an event
that serves as a label, and then jumps back to a dispatcher when it is done.)</li>
<li>The new <cite>post_label</cite> argument lets one specify a function to supply the
a label that goes after the creator-defined statement, which can function
like the <code class="docutils literal notranslate"><span class="pre">from</span></code> clause to the call statement.</li>
</ul>
<p>Ren'Py now stores the result of parsing a creator-defined statement in the
.rpyc files. While this allows for more complex syntax and faster startup,
it means that it may be necessary to force a recompile if you change a
creator-defined statement's parse function</p>
</div>
<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>It is now possible to supply an <code class="docutils literal notranslate"><span class="pre">as</span></code> clause to a screen
language displayable. This is especially useful with drags,
as it lets the screen capture the drag object and call methods
on it as necessary.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">on</span></code> statement can now take a list of events.</p>
<p>A screen now takes a <cite>sensitive</cite> property, which determines if it is
possible to interact with the screen at all.</p>
<p>Ren'Py will now produce an error when a non-constant property follows
a Python statement, inside screen language. (This was very rare, and
almost always a mistake.)</p>
</div>
<div class="section" id="text-improvements">
<h3>Text Improvements<a class="headerlink" href="#text-improvements" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now includes support for self-closing custom text tags, which
are <a class="reference internal" href="custom_text_tags.html"><span class="doc">custom text tags</span></a> that do not require as
closing text tag.</p>
<p>Ren'Py now supports three new flags that can be applied when formatting
text:</p>
<ul class="simple">
<li>&quot;[varname!u]&quot; forces the text to upper-case.</li>
<li>&quot;[varname!l]&quot; forces the text to lower-case.</li>
<li>&quot;[varname!c]&quot; forces the first letter of the text to upper-case, capitalizing it.</li>
</ul>
</div>
<div class="section" id="android-and-ios-improvements">
<h3>Android and iOS Improvements<a class="headerlink" href="#android-and-ios-improvements" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now uses Framebuffer Objects on any device that claims to
support it. As a result <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> now works on Android
and iOS.</p>
<p>Ren'Py now produces 64-bit arm binaries for Android. These will be
required by the Google Play store later this year.</p>
<p>Text input on Android was rewritten again, to fix problems where the user
was unable to advance. Completion was eliminated, as it was the source
of the problems. While languages that require input methods will need
a larger rewrite to function, Ren'Py should now properly handle all direct
input keyboards.</p>
</div>
<div class="section" id="id58">
<h3>Translations<a class="headerlink" href="#id58" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py launcher and sample project have been translated into Turkish
by Arda Güler.</p>
<p>The Ren'Py tutorial game has been translated into Spanish by Moshibit.</p>
<p>French, Japanese, Korean, Russian and Spanish translations have been updated for
this release.</p>
</div>
<div class="section" id="id59">
<h3>Other Improvements<a class="headerlink" href="#id59" title="Permalink to this headline"> link</a></h3>
<p>The <code class="docutils literal notranslate"><span class="pre">side</span></code> displayable now renders its children in the order
they are provided in the control string.</p>
<p>The <code class="docutils literal notranslate"><span class="pre">say</span></code> statement, <code class="docutils literal notranslate"><span class="pre">menu</span></code> statement, and <code class="docutils literal notranslate"><span class="pre">renpy.call_screen</span></code>
statements now take a <cite>_mode</cite> argument, which specifies the <a class="reference internal" href="modes.html"><span class="doc">mode</span></a>
Ren'Py goes into when these statements occur.</p>
<p>The <a class="reference internal" href="screen_python.html#renpy.show_screen" title="renpy.show_screen"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.show_screen()</span></code></a> and <a class="reference internal" href="screen_python.html#renpy.call_screen" title="renpy.call_screen"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.call_screen()</span></code></a> functions now
take a zorder argument.</p>
<p>Ren'Py will now play a mono sound file with the same volume as a stereo
sound file, rather than sending half the energy to each ear.</p>
<p>The new <a class="reference internal" href="config.html#var-config.load_failed_label"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.load_failed_label</span></code></a> specifies a label that is jumped
to when a load fails because Ren'Py can no longer find the current statement.
This makes it possible to a game to implement its own recovery mechanism.</p>
<p>The new <a class="reference internal" href="config.html#var-config.notify"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.notify</span></code></a> variable makes it possible to intercept the
notification system and do your own thing.</p>
<p>The interface of <a class="reference internal" href="config.html#var-config.say_attribute_transition_callback"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.say_attribute_transition_callback</span></code></a> has been
changed in an incompatible way, to allow sets of old and new tags to be
given.</p>
<p><a class="reference internal" href="screen_python.html#Action" title="Action"><code class="xref py py-class docutils literal notranslate"><span class="pre">Action</span></code></a> and <a class="reference internal" href="screen_python.html#BarValue" title="BarValue"><code class="xref py py-class docutils literal notranslate"><span class="pre">BarValue</span></code></a> now support a get_tooltip method,
which allows the object to supply a default tooltip.</p>
</div>
<div class="section" id="id60">
<h3>Fixes<a class="headerlink" href="#id60" title="Permalink to this headline"> link</a></h3>
<p>A problem that could cause Ren'Py to drop certain characters, especially
accent markers in Arabic, has been fixed.</p>
<p>The filename of the internal copy of OpenDyslexic has been changed so as
not to cause problems with copies distributed with games.</p>
</div>
</div>
<div class="section" id="renpy-7-2-2">
<span id="id61"></span><h2>7.2.2<a class="headerlink" href="#renpy-7-2-2" title="Permalink to this headline"> link</a></h2>
<p>Ren'Py now supports a new Accessibility menu, which can be accessed
by pressing the &quot;a&quot; key. This menu, which is intended to be used by
players, let's the player override the game font, change the scaling
and spacing of text, and enable self-voicing.</p>
<p>Ren'Py will now allow files in the public game directory
(/mnt/sdcard/Android/<cite>package</cite>/files/game) to override those included with the
game proper. This has been listed as a feature in 7.2.0, but didn't work
right.</p>
<p>Ren'Py will now include temporary image attributes in the say statements
generated as part of the translation process.</p>
<p>When uploading to itch.io, Ren'Py now downloads butler itself. This means
there is no longer a dependence on the location or structure of the Itch
app, as there was before.</p>
<p>The bar values <a class="reference internal" href="screen_actions.html#DictValue" title="DictValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">DictValue()</span></code></a>, <a class="reference internal" href="screen_actions.html#FieldValue" title="FieldValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">FieldValue()</span></code></a>, <a class="reference internal" href="screen_actions.html#VariableValue" title="VariableValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">VariableValue()</span></code></a>,
and <a class="reference internal" href="screen_actions.html#ScreenVariableValue" title="ScreenVariableValue"><code class="xref py py-func docutils literal notranslate"><span class="pre">ScreenVariableValue()</span></code></a> all take a new <cite>action</cite> parameter, which
gives an action that is performed each time the value changes.</p>
<p>The rollback system has been optimized to reduce the amount of garbage
that needs to be collected.</p>
</div>
<div class="section" id="renpy-7-2-1">
<span id="id62"></span><h2>7.2.1<a class="headerlink" href="#renpy-7-2-1" title="Permalink to this headline"> link</a></h2>
<div class="section" id="ios-improvements">
<h3>iOS Improvements<a class="headerlink" href="#ios-improvements" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py will now set the version field for the iOS application when generating
a project.</p>
<p>Ren'Py will now look for the files ios-icon.png and ios-launchimage.png,
and use them to generate the icon and launch image in the sizes required
for iOS.</p>
</div>
<div class="section" id="id63">
<h3>Other Improvements<a class="headerlink" href="#id63" title="Permalink to this headline"> link</a></h3>
<p>The <a class="reference internal" href="save_load_rollback.html#renpy.in_rollback" title="renpy.in_rollback"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.in_rollback()</span></code></a> function returns True when in the rollback that
occurs immediately after a load. This makes it possible to use:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">python</span><span class="p">:</span>
<span class="k">if</span> <span class="k">not</span> <span class="n">renpy</span><span class="o">.</span><span class="n">in_rollback</span><span class="p">():</span>
<span class="n">renpy</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">ShowMenu</span><span class="p">(</span><span class="s1">&#39;save&#39;</span><span class="p">))</span>
</pre></div>
</div>
<p>To display a save menu during an initial playthough, but not during loading
or rollback.</p>
<p><a class="reference internal" href="config.html#var-config.say_attribute_transition_callback"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.say_attribute_transition_callback</span></code></a> now exists, making it possible
to select the transition to use on a per-say-statement basis.</p>
<p>The new <code class="docutils literal notranslate"><span class="pre">RENPY_SEARCHPATH</span></code> environment variable makes it possible to
override <a class="reference internal" href="config.html#var-config.searchpath"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.searchpath</span></code></a> on launch.</p>
</div>
<div class="section" id="id64">
<h3>Fixes<a class="headerlink" href="#id64" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py has been audited to make sure that the semantics of == and != match,
whenever == was redefined.</p>
<p>There was a fix to problems that might occur when a transform is added
to a screen using the <code class="docutils literal notranslate"><span class="pre">add</span></code> statement.</p>
<p>The way <code class="docutils literal notranslate"><span class="pre">extend</span></code> processes arguments was changed to ensure that newer
arguments take priority over arguments given to the statement being
extended.</p>
<p>Ren'Py now properly considers the scope when comparing dynamic images for
equality. This fixes an issue that prevented some dynamic images from
updating when part of a screen.</p>
<p>A crash when <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> is true on macOS has been fixed.</p>
<p>A crash when <a class="reference internal" href="config.html#var-config.profile"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.profile</span></code></a> is true has been fixed.</p>
<p>Ren'Py now explicitly asks for text (as opposed to email, password, phone number
etc) input on Android when the keyboard is displayed.</p>
<p>An issue has been fixed that prevented roll-forward from working through a
menu statement.</p>
<p>Fixes a bug that prevents roll-forward through a menu.</p>
</div>
</div>
<div class="section" id="renpy-7-1-4">
<span id="renpy-7-2"></span><span id="renpy-7-2-0"></span><span id="id65"></span><h2>7.2.0<a class="headerlink" href="#renpy-7-1-4" title="Permalink to this headline"> link</a></h2>
<div class="section" id="menu-arguments">
<h3>Menu Arguments<a class="headerlink" href="#menu-arguments" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now has support for <a class="reference internal" href="menus.html#menu-arguments"><span class="std std-ref">menu arguments</span></a>. Arguments
can be passed to a choice menu as a whole, or to the individual choices within
the menu, using the syntax:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">menu</span> <span class="p">(</span><span class="s2">&quot;jfk&quot;</span><span class="p">,</span> <span class="k">screen</span><span class="o">=</span><span class="s2">&quot;airport&quot;</span><span class="p">):</span>
<span class="s2">&quot;Chicago, IL&quot;</span> <span class="p">(</span><span class="mi">200</span><span class="p">):</span>
<span class="k">jump</span> <span class="n">chicago_trip</span>
<span class="s2">&quot;Dallas, TX&quot;</span> <span class="p">(</span><span class="mi">150</span><span class="p">,</span> <span class="n">sale</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">jump</span> <span class="n">dallas_trip</span>
<span class="s2">&quot;Hot Springs, AR&quot;</span> <span class="p">(</span><span class="mi">300</span><span class="p">)</span> <span class="k">if</span> <span class="n">secret_unlocked</span><span class="p">:</span>
<span class="k">jump</span> <span class="n">hot_springs_trip</span>
</pre></div>
</div>
<p>Menu arguments passed to the menu itself become arguments to the screen,
except the <cite>screen</cite> argument which selects the screen, and the <cite>nvl</cite>
argument, which - if present - selects the NVL-mode menu. The arguments to
the choices become arguments to the items passed to the menu screen.</p>
</div>
<div class="section" id="temporary-say-attributes">
<h3>Temporary Say Attributes<a class="headerlink" href="#temporary-say-attributes" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now supports temporary say attributes. Just like regular say
attributes, these are included as part of the say statement. However,
these temporary say attributes are reverted once the dialogue has
finished. For example, in the script:</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">e</span> <span class="s2">&quot;I&#39;m happy.&quot;</span>
<span class="n">e</span> <span class="o">@</span> <span class="n">vhappy</span> <span class="s2">&quot;I&#39;m really happy!&quot;</span>
<span class="n">e</span> <span class="s2">&quot;I&#39;m still happy.&quot;</span>
</pre></div>
</div>
<p>In the first line and last line of dialogues, Eileen is using her happy
emotion. The vhappy emotion is shown before the second line of dialogue,
and replaced with the previous emotion (happy in this case), before it.</p>
</div>
<div class="section" id="text">
<h3>Text<a class="headerlink" href="#text" title="Permalink to this headline"> link</a></h3>
<p>There have been a number of text changes that affect text when a window
is scaled to a non-default size:</p>
<ul class="simple">
<li>The text is now aligned on its baseline, rather than at the top of
the text. This is relevant when an absolute outline offset is
used.</li>
<li>It is now possible to choose how the outline scales when the window
is scaled. This is done with the <a class="reference internal" href="style_properties.html#style-property-outline_scaling"><code class="xref std std-propref docutils literal notranslate"><span class="pre">outline_scaling</span></code></a> style
property.</li>
</ul>
<p>When positioning a Text object, the <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> property can be
renpy.BASELINE. When it is, the anchor is set to the baseline of the
first line of the text.</p>
</div>
<div class="section" id="statements">
<h3>Statements<a class="headerlink" href="#statements" title="Permalink to this headline"> link</a></h3>
<p>The new <code class="docutils literal notranslate"><span class="pre">window</span> <span class="pre">auto</span> <span class="pre">show</span></code> and <code class="docutils literal notranslate"><span class="pre">window</span> <span class="pre">auto</span> <span class="pre">hide</span></code> statements
allow <a class="reference internal" href="dialogue.html#dialogue-window-management"><span class="std std-ref">automatic dialogue window management</span></a>
to continue while showing or hiding the dialogue window.</p>
<p>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">hide</span> <span class="pre">screen</span></code> statements now take a with
clause, that works the same way it does with <code class="docutils literal notranslate"><span class="pre">show</span></code> and <code class="docutils literal notranslate"><span class="pre">hide</span></code>.</p>
<p>The screen language <code class="docutils literal notranslate"><span class="pre">use</span></code> statement now can take an <code class="docutils literal notranslate"><span class="pre">expression</span></code>
clause, that makes it take an expression rather than a literal screen
name. This allows a variable to be used when selecting the screen that
is included. See <a class="reference internal" href="screens.html#sl-use"><span class="std std-ref">Use</span></a> for more details.</p>
</div>
<div class="section" id="id66">
<h3>Changes<a class="headerlink" href="#id66" title="Permalink to this headline"> link</a></h3>
<p>The new <a class="reference internal" href="other.html#renpy.is_skipping" title="renpy.is_skipping"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.is_skipping()</span></code></a> function reports if Ren'Py is currently
skipping.</p>
<p>The <a class="reference internal" href="screens.html#sl-input"><span class="std std-ref">input</span></a> displayable now takes a new <cite>copypaste</cite>
property, which when true allows copying with ctrl+C and pasting with
ctrl+V. This is enabled in the console and launcher.</p>
<p><code class="docutils literal notranslate"><span class="pre">Preference(&quot;display&quot;,</span> <span class="pre">&quot;window&quot;)</span></code> now avoids creating a window bigger
than the screen, and will be selected if the current window size is the
maximum window size, if the size selected with <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> is bigger
than the maximum window size.</p>
<p><a class="reference internal" href="cds.html"><span class="doc">Creator defined statements</span></a> now have a few more lexer methods available,
making it possible to to parse arguments, image name components, labels, and
delimited python.</p>
<p>The <a class="reference internal" href="other.html#renpy.force_autosave" title="renpy.force_autosave"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.force_autosave()</span></code></a> function takes a new argument, that causes
the autosave to block until it completes.</p>
<p>The <a class="reference internal" href="screen_special.html#ctc-screen"><span class="std std-ref">ctc screen</span></a> now takes a number of new parameters,
if required.</p>
<p>The new <a class="reference internal" href="im.html#im.Blur" title="im.Blur"><code class="xref py py-func docutils literal notranslate"><span class="pre">im.Blur()</span></code></a> image manipulator can blur an image. Thanks to
Mal Graty for contributing it.</p>
<p>LayeredImage groups now support a <code class="docutils literal notranslate"><span class="pre">multiple</span></code> property, which allows
multiple attributes in the same group to be displayed at the same time.
This is useful because it allows the auto-definition function of a group
to be applied to non-conflicting images.</p>
<p>Ren'Py will remain fullscreen when the mouse changes desktops, and will avoid
shrinking a maximized window during a reload.</p>
<p>The <code class="xref std std-var docutils literal notranslate"><span class="pre">config.allow_duplicate_labels</span></code> variable can be defined or set in an
init python block to allow duplicate labels to be defined in a game.</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 can now be told not to loop, and displays the
associated static image when it stops looping. It also can take an image
that is displayed before the movie proper starts.</p>
</div>
<div class="section" id="android-changes">
<h3>Android Changes<a class="headerlink" href="#android-changes" title="Permalink to this headline"> link</a></h3>
<p>The downloading of the Android SDK has been updated to fix a change in the
provided tools that prevented things from downloading.</p>
<p>An explicit action is now given to the keyboard, to make sure the enter
key works.</p>
<p>Ren'Py now uses the Amazon payment APIs when sideloaded onto a device
made by Amazon, allowing their payment system to be tested on a dual-store
APK.</p>
<p>Ren'Py will now allow files in the public game directory (/mnt/sdcard/Android/<cite>package</cite>/files/game)
to override those included with the game proper.</p>
</div>
<div class="section" id="id67">
<h3>Fixes<a class="headerlink" href="#id67" title="Permalink to this headline"> link</a></h3>
<p>A bug preventing Ren'Py from displaying zero or negative-width
characters (such as certain diacritics) has been fixed.</p>
<p>An issue that prevented Ren'Py from updating a displayable that was
added to a screen with transform properties has been fixed.</p>
<p>The order of drags within a drag group is now preserved when an
interaction restart occurs.</p>
<p>Size-changing properties like <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> now apply to a Drag and not
the space it can move around in.</p>
<p>A bug that could cause a transparent, black, or gray line to appear on
the bottom line of a screen during a dissolve has been fixed.</p>
<p>A regression in support for imagefonts has been fixed.</p>
<p>Creating a new file from the navigation menu of the launcher now works.</p>
<p>Menu sets now work again.</p>
<p>Ren'Py will no longer crash if an incomparable type is given to <a class="reference internal" href="screen_actions.html#Function" title="Function"><code class="xref py py-func docutils literal notranslate"><span class="pre">Function()</span></code></a>
and other actions.</p>
<p>A case where rolling forward would fail is now fixed.</p>
<p>A problem that prevented the Steam overlay from showing up on macOS was fixed.</p>
</div>
</div>
<div class="section" id="renpy-7-1-3">
<span id="id68"></span><h2>7.1.3<a class="headerlink" href="#renpy-7-1-3" title="Permalink to this headline"> link</a></h2>
<p>This was a quick re-release of 7.1.2 in order to fix a single bug, which
was that a test change had been left in causing <code class="xref std std-var docutils literal notranslate"><span class="pre">config.default_language</span></code>
to be set on initial startup.</p>
</div>
<div class="section" id="renpy-7-1-2">
<span id="id69"></span><h2>7.1.2<a class="headerlink" href="#renpy-7-1-2" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id70">
<h3>Improvements<a class="headerlink" href="#id70" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py's screen language now support the inclusion of anonymous ATL
transforms. 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">hello_title</span><span class="p">():</span>
<span class="k">text</span> <span class="s2">&quot;Hello.&quot;</span><span class="p">:</span>
<span class="k">at</span> <span class="k">transform</span><span class="p">:</span>
<span class="na">align</span> <span class="p">(</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">)</span> <span class="na">alpha</span> <span class="mf">0.0</span>
<span class="n">linear</span> <span class="mf">0.5</span> <span class="na">alpha</span> <span class="mf">1.0</span>
</pre></div>
</div>
<p>The new <a class="reference internal" href="screen_actions.html#SetLocalVariable" title="SetLocalVariable"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetLocalVariable()</span></code></a> and <a class="reference internal" href="screen_actions.html#ToggleLocalVariable" title="ToggleLocalVariable"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleLocalVariable()</span></code></a> actions
make it possible to set variables inside used screens.</p>
<p>The new <a class="reference internal" href="config.html#var-config.menu_include_disabled"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.menu_include_disabled</span></code></a> variable determines if menus
should include entries disabled by an if clause.</p>
<p>Shift-keybindings (like Shift+I and Shift+R) now work in the Android
emulation mode.</p>
<p>Ren'Py now better reports errors in text tags that require a value but are
not given one.</p>
<p>The new <a class="reference internal" href="store_variables.html#var-_version"><code class="xref std std-var docutils literal notranslate"><span class="pre">_version</span></code></a> variable indicates the version of the game itself
that was used when a new game is first created. This only stores the version
at game creation - after that, it's up to the creator to keep it updated.</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 supports a new mode the color data and
alpha mask data are placed side-by-side in the same file. This prevents
issues where a main and mask movie could go out of sync.</p>
<p>The <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> functions now take
arguments that control if the they can bring the player to the auto or
quick save pages.</p>
<p>The new <a class="reference internal" href="config.html#var-config.skip_sounds"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.skip_sounds</span></code></a> variables determines if Ren'Py will skip
non-looping audio files that are played while Ren'Py is skipping.</p>
</div>
<div class="section" id="id71">
<h3>Translations<a class="headerlink" href="#id71" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now has the ability to automatically detect the locale of the user's
system, and use it to set the language. Please see
<a class="reference internal" href="config.html#var-config.enable_language_autodetect"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.enable_language_autodetect</span></code></a> and the <a class="reference internal" href="translation.html#translation"><span class="std std-ref">Translation</span></a>
documentation for how this works.</p>
<p>The French, German, Korean, Russian, and Simplifed Chinese translations
have been updated.</p>
</div>
<div class="section" id="id72">
<h3>Fixes<a class="headerlink" href="#id72" title="Permalink to this headline"> link</a></h3>
<p>A Windows-specific bug that caused RTL (the support for languages like
Arabic and Hebrew) to corrupt the second half of text strings has been
fixed. This should prevent garbage characters from being displayed when
rendering those languages.</p>
<p>Ren'Py will now report an error if a game accesses an image that does not
exist, but has as a prefix an image that does exist. Before this change,
if <code class="docutils literal notranslate"><span class="pre">eileen</span> <span class="pre">happy</span></code> exists and <code class="docutils literal notranslate"><span class="pre">eileen</span> <span class="pre">happy</span> <span class="pre">unknown</span></code> was shown, the
additional attribute would be ignored.</p>
<p>Lint has been improved to deal with images that take attributes that are
not in the image name, like layered images.</p>
<p>Ren'Py generates choice menu images that are suitable for use on the phone.</p>
</div>
<div class="section" id="android-fixes">
<h3>Android Fixes<a class="headerlink" href="#android-fixes" title="Permalink to this headline"> link</a></h3>
<p>As Ren'Py's new Android support only worked well on a 64-bit version of
Java 8, we make that 64-bit requirement explicit.</p>
</div>
</div>
<div class="section" id="renpy-7-1-1">
<span id="id73"></span><h2>7.1.1<a class="headerlink" href="#renpy-7-1-1" title="Permalink to this headline"> link</a></h2>
<div class="section" id="history-fix">
<span id="history-7-1-1"></span><h3>History Fix<a class="headerlink" href="#history-fix" title="Permalink to this headline"> link</a></h3>
<p>This release fixes an issue with Ren'Py's history screen. The problem occurred
when a line of dialogue contained a quoted square bracket, so something like:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="s2">&quot;I [[think] I&#39;m having a problem.&quot;</span>
</pre></div>
</div>
<p>When this occurs, the string &quot;I [think] I'm having a problem.&quot; is added to
the history. Ren'Py would then display that in history, substitute the
<code class="docutils literal notranslate"><span class="pre">think</span></code> variable, and crash.</p>
<p>This is fixed by adding <code class="docutils literal notranslate"><span class="pre">substitute</span> <span class="pre">False</span></code> to the history screen. This
is done to new projects, but for existing ones you'll need to make the fix
yourself. Here's the new history screen:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">screen</span> <span class="n">history</span><span class="p">():</span>
<span class="k">tag</span> <span class="k">menu</span>
<span class="c1">## Avoid predicting this screen, as it can be very large.</span>
<span class="na">predict</span> <span class="kc">False</span>
<span class="k">use</span> <span class="n">game_menu</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;History&quot;</span><span class="p">),</span> <span class="n">scroll</span><span class="o">=</span><span class="p">(</span><span class="s2">&quot;vpgrid&quot;</span> <span class="k">if</span> <span class="n">gui</span><span class="o">.</span><span class="n">history_height</span> <span class="k">else</span> <span class="s2">&quot;viewport&quot;</span><span class="p">),</span> <span class="na">yinitial</span><span class="o">=</span><span class="mf">1.0</span><span class="p">):</span>
<span class="na">style_prefix</span> <span class="s2">&quot;history&quot;</span>
<span class="k">for</span> <span class="n">h</span> <span class="k">in</span> <span class="n">_history_list</span><span class="p">:</span>
<span class="k">window</span><span class="p">:</span>
<span class="c1">## This lays things out properly if history_height is None.</span>
<span class="k">has</span> <span class="k">fixed</span><span class="p">:</span>
<span class="na">yfit</span> <span class="kc">True</span>
<span class="k">if</span> <span class="n">h</span><span class="o">.</span><span class="n">who</span><span class="p">:</span>
<span class="k">label</span> <span class="n">h</span><span class="o">.</span><span class="n">who</span><span class="p">:</span>
<span class="k">style</span> <span class="s2">&quot;history_name&quot;</span>
<span class="na">substitute</span> <span class="kc">False</span>
<span class="c1">## Take the color of the who text from the Character, if set.</span>
<span class="k">if</span> <span class="s2">&quot;color&quot;</span> <span class="k">in</span> <span class="n">h</span><span class="o">.</span><span class="n">who_args</span><span class="p">:</span>
<span class="na">text_color</span> <span class="n">h</span><span class="o">.</span><span class="n">who_args</span><span class="p">[</span><span class="s2">&quot;color&quot;</span><span class="p">]</span>
<span class="k">$</span> <span class="n">what</span> <span class="o">=</span> <span class="n">renpy</span><span class="o">.</span><span class="n">filter_text_tags</span><span class="p">(</span><span class="n">h</span><span class="o">.</span><span class="n">what</span><span class="p">,</span> <span class="na">allow</span><span class="o">=</span><span class="n">gui</span><span class="o">.</span><span class="n">history_allow_tags</span><span class="p">)</span>
<span class="k">text</span> <span class="n">what</span> <span class="na">substitute</span> <span class="kc">False</span>
<span class="k">if</span> <span class="k">not</span> <span class="n">_history_list</span><span class="p">:</span>
<span class="k">label</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;The dialogue history is empty.&quot;</span><span class="p">)</span>
</pre></div>
</div>
<p>The new lines are the ones with <code class="docutils literal notranslate"><span class="pre">substitute</span> <span class="pre">False</span></code> on them. You'll want to make
this change to your history screen to prevent his problem from happening.</p>
</div>
<div class="section" id="android-improvements">
<h3>Android Improvements<a class="headerlink" href="#android-improvements" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now sets the amount of memory used by the Android build tool to
the Google-set default of 1536 megabytes. To change this, edit
rapt/project/gradle.properties. To make sure you're capable of building
larger games, please make sure your computer has a 64-bit version of Java 8.</p>
<p>Ren'Py explicitly tells Android to pass the Enter key to an input.</p>
<p>Ren'Py now crops and sizes the icon correctly for versions of Android below
Android 8 (Oreo).</p>
<p>Ren'Py gives a different numeric version number to the x86_64 apk. This will
allow both x86_64 and armeabi-v7a builds to be uploaded to Google Play and
other stores, rather than having to first created one build and then the other,
manually changing the version numbers between.</p>
</div>
<div class="section" id="id74">
<h3>Other Improvements<a class="headerlink" href="#id74" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py now handles the (lack of) drawing of zero width characters itself, preventing
such characters from appearing as squares in text if the font does not support
the zero width character.</p>
<p>Ren'Py supports the use of non-breaking space and zero-width non-breaking space
characters to prevent images in text from being wrapped.</p>
<p>Ren'Py supports the a new &quot;nestled-close&quot; value for the <cite>ctc_position</cite> parameter
of <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>. This value prevents there from being a break between the
click-to-continue indicator and the other lines.</p>
<p>Drags (in drag-and-drop) now support alternate clicks. (Right clicks on desktop
and long-clicks on touch platforms.)</p>
</div>
<div class="section" id="id75">
<h3>Fixes<a class="headerlink" href="#id75" title="Permalink to this headline"> link</a></h3>
<p>The <a class="reference internal" href="screen_actions.html#SetVariable" title="SetVariable"><code class="xref py py-func docutils literal notranslate"><span class="pre">SetVariable()</span></code></a> and <a class="reference internal" href="screen_actions.html#ToggleVariable" title="ToggleVariable"><code class="xref py py-func docutils literal notranslate"><span class="pre">ToggleVariable()</span></code></a> functions have been extended
to accept namespaces and fields. So it's now possible to have actions like
<code class="docutils literal notranslate"><span class="pre">SetVariable(&quot;hero.strength&quot;,</span> <span class="pre">hero.strength</span> <span class="pre">+</span> <span class="pre">1)</span></code> or
<code class="docutils literal notranslate"><span class="pre">ToggleVariable(&quot;persistent.alternate_perspective&quot;)</span></code>.</p>
<p>Automatic management of the dialogue window (as enabled by the <code class="docutils literal notranslate"><span class="pre">window</span> <span class="pre">auto</span></code>
statement) now considers if an in-game menu has a dialogue or caption associated
with it, and handles that appropriately.</p>
<p>The source code to the embedded version of fribidi that Ren'Py is expected
to build with is now included in the -source archive.</p>
<p>There have been a number of fixes to the voice sustain preference to make
it work better with history and the voice replay action.</p>
</div>
</div>
<div class="section" id="renpy-7-1">
<span id="id76"></span><h2>7.1<a class="headerlink" href="#renpy-7-1" title="Permalink to this headline"> link</a></h2>
<div class="section" id="id77">
<h3>Android<a class="headerlink" href="#id77" title="Permalink to this headline"> link</a></h3>
<p>This release sees a major rewrite of Ren'Py's support for Android to
modernize it. This is required so Ren'Py games can be uploaded to the
Google Play store. Some of these changes may require you to update
a game's files. Most notably, the format of icons has changed, so the
icons will need to be redone.</p>
<p>The minimum version of Android that Ren'Py will run on has been raised
to Android 19 (aka 4.4 KitKat), while it targets Android 28 (aka 9 Pie).</p>
<p>The x86_64 architecture has been added, while x86 has been dropped. (Some x86
devices may be able to run the arm platform version through binary translation
layers.)</p>
</div>
<div class="section" id="monologue-mode">
<h3>Monologue Mode<a class="headerlink" href="#monologue-mode" title="Permalink to this headline"> link</a></h3>
<p>It's now possible to write multiple blocks of dialogue or narration at
once, using triple-quoted strings. For example:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="n">e</span> <span class="s2">&quot;&quot;&quot;</span>
<span class="s2">This is one block of dialogue.</span>
<span class="s2">And this is a second block.</span>
<span class="s2">&quot;&quot;&quot;</span>
</pre></div>
</div>
<p>will create two blocks of dialogue. See <a class="reference internal" href="dialogue.html#monologue-mode"><span class="std std-ref">Monologue Mode</span></a> for more
info.</p>
<p>There is also a new {clear} text tag that works with monologue. When
the {clear} tag is part of a line by itself, it is the equivalent of
the <code class="docutils literal notranslate"><span class="pre">nvl</span> <span class="pre">clear</span></code> statement. See <a class="reference internal" href="nvl_mode.html#nvl-monologue-mode"><span class="std std-ref">NVL Monlologue Mode</span></a> for more
about this.</p>
</div>
<div class="section" id="say-with-attribute-change">
<h3>Say-With-Attribute Change<a class="headerlink" href="#say-with-attribute-change" title="Permalink to this headline"> link</a></h3>
<p>There has been a change to the way a say-with-attributes is handled
when there is not an image with the tag displaying. Previously, Ren'Py
would use the attributes given in the most recent say-with-attributes statement
to selected the side image to show.</p>
<p>Now, Ren'Py will use the provided attributes and existing attributes to resolve
the side image. This makes a say-with-attributes that occurs when an image
is not showing work the same way as when it is. When the attributes do not
select a single side image, Ren'Py will select the image with all of the given
attributes, and the most possible of the existing attributes.</p>
<p>The rationale for this change is to help with side images that are defined
as layered images, where providing only the attributes that change makes
sense.</p>
</div>
<div class="section" id="updater-changes">
<h3>Updater Changes<a class="headerlink" href="#updater-changes" title="Permalink to this headline"> link</a></h3>
<p>The updater for Ren'Py itself now asks you to select the update channel
each time you go to update. The purpose of this is to make it clear
which channel you're updating to each time you update, so you don't
accidentally update to a prerelease or nightly version after a
release comes out.</p>
<p>As part of this, you might see the Prerelease channel missing for some
updates. That's normal unlike in previous versions, the channel only
appears when there are prereleases available.</p>
</div>
<div class="section" id="id78">
<h3>Translations<a class="headerlink" href="#id78" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py launcher, template game, and The Question have been translated
into the Latin script of Malay by Muhammad Nur Hidayat Yasuyoshi.</p>
<p>The Korean translation has been significantly updated.</p>
<p>It is now possible to translate the strings used by RAPT into non-English
languages.</p>
</div>
<div class="section" id="id79">
<h3>Other<a class="headerlink" href="#id79" title="Permalink to this headline"> link</a></h3>
<p>Ren'Py can now automatically save the game upon quit, in a reliable
fashion. (As compared to the previous autosave, which could fail or
be cycled out.) This is controlled by the <a class="reference internal" href="store_variables.html#var-_quit_slot"><code class="xref std std-var docutils literal notranslate"><span class="pre">_quit_slot</span></code></a> variable.</p>
<p>File actions (like <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>, <a class="reference internal" href="screen_actions.html#FileLoad" title="FileLoad"><code class="xref py py-func docutils literal notranslate"><span class="pre">FileLoad()</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>)
can now take a slot=True argument. When this is given, the action loads
a named slot, without involving the page.</p>
<p>The developer menu (accessed through Shift+D) can now display a screen
that shows the attributes associated with displayed and hidden images.</p>
<p>Added <a class="reference internal" href="text.html#renpy.transform_text" title="renpy.transform_text"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.transform_text()</span></code></a>, a function to transform text without
touching text tags or interpolation.</p>
<p>Buttons created using the <code class="docutils literal notranslate"><span class="pre">make_buttons</span></code> method of a Gallery object now
inherit from the empty style, and not button. This prevents properties from
the button style from causing problems.</p>
<p>The code to finish displaying text is now called from the event method,
as if the mouse button was clicked. This helps prevent interaction ends
when menus are up.</p>
<p>Displayable prefixes are supported when evaluating auto images in imagebuttons
and image maps.</p>
<p>A bug that caused an error in an NVL-mode statement if the next statement
was an NVL-mode statement with an undefined character name has been fixed.</p>
<p>When two ATL transforms are nested, the state from both is propagated, not
just the outermost.</p>
<p>Ren'Py now updates dynamic images that are used in windows, bars, and
frames. (And derived displayables, like buttons and imagemaps.)</p>
<p>An issue that caused Ren'Py to consume 100% of a core when modal True was
given has been fixed.</p>
<p>Ren'Py now includes a copy of fribidi, rather than requiring an OS-installed
version.</p>
<p>The new <a class="reference internal" href="style_properties.html#style-property-box_wrap_spacing"><code class="xref std std-propref docutils literal notranslate"><span class="pre">box_wrap_spacing</span></code></a> allows control of the spacing between
rows or columns introduced by <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>.</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 can now take &quot;horizontal&quot; and
&quot;vertical&quot; as values, causing text spacing to be adjusted in only the
specified direction.</p>
<p>LayerdImageProxy can now take an interpolated string.</p>
<p>The new <a class="reference internal" href="config.html#var-config.context_callback"><code class="xref std std-var docutils literal notranslate"><span class="pre">config.context_callback</span></code></a> is called when starting the game or
entering a new context, like a menu context. It can be used to stop voice
or sounds from playing when entering that context.</p>
<p>The <a class="reference internal" href="drag_drop.html#Drag" title="Drag"><code class="xref py py-func docutils literal notranslate"><span class="pre">Drag()</span></code></a> displayable (and the screen language equivalent, <code class="docutils literal notranslate"><span class="pre">drag</span></code>)
have grown a new <cite>activated</cite> property. This is callback that is called when
the user first clicks the mouse on a drag. (Before it starts moving.)</p>
</div>
</div>
<div class="section" id="renpy-7-0">
<span id="id80"></span><h2>7.0<a class="headerlink" href="#renpy-7-0" title="Permalink to this headline"> link</a></h2>
<p>Ren'Py 7.0 marks the completion of over a decade of development since
Ren'Py 6 that brought features like ATL, Screen Language, OpenGL and DirectX
acceleration, support for the Android and iOS platforms, Translation,
Accessibility, and so much more.</p>
<p>For releases between 6.0 and 7.0, see the other entries in this changelog,
and the older changelog on the Ren'Py website. The rest of this entry
contains the differences between 7.0 and 6.99.14.3.</p>
<div class="section" id="layered-images">
<h3>Layered Images<a class="headerlink" href="#layered-images" title="Permalink to this headline"> link</a></h3>
<p>A <a class="reference internal" href="layeredimage.html"><span class="doc">layered image</span></a> is a new way of defining images
for use in Ren'Py. It's intended to be used with a sprite that has been
created in Photoshop or some other program as a series of layers.
The layered image system can use the attributes the image was displayed
with and Python conditions to determine what layers to display.</p>
<p>Layered images are intended to be a replacement for the use of <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>
and <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> to define layered images. It includes a language
that makes defining such images simpler, and Ren'Py can generate portions
of the definitions from appropriately named files. It also integrates better
with the rest of Ren'Py, as attributes can be predicted in ways that a
ConditionSwitch cannot, and layered images work with the interactive director.</p>
</div>
<div class="section" id="dict-transitions">
<h3>Dict Transitions<a class="headerlink" href="#dict-transitions" title="Permalink to this headline"> link</a></h3>
<p><a class="reference internal" href="transitions.html#dict-transitions"><span class="std std-ref">Dict Transitions</span></a> makes it
possible to use the with statement and certain other functions to apply
transitions to one or more layers. Ren'Py will not pause for these
transitions to occur. Dict transitions make it possible and even
convenient to have a transition apply to the sprites alone while dialogue is
being displayed.</p>
</div>
<div class="section" id="id81">
<h3>Changes<a class="headerlink" href="#id81" title="Permalink to this headline"> link</a></h3>
<p>The old tutorial and old templates are no longer included with Ren'Py.
They can still be used with new version of Ren'Py if copied into
this or later versions.</p>
<p>The new <a class="reference internal" href="screen_actions.html#Scroll" title="Scroll"><code class="xref py py-func docutils literal notranslate"><span class="pre">Scroll()</span></code></a> action makes it possible to have buttons that
change the position of a viewport or the value of a bar.</p>
<p>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>, <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>, and <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>
transitions now respect the alpha channels of their source displayables, as
if given the <code class="docutils literal notranslate"><span class="pre">alpha=True</span></code> argument. As omitting the alpha channel is no
longer an optimization, this change allows the same transitions to be
used in more places.</p>
<p>Automatic image definitions now take place at init level 0, rather than
an init level of greater than 999. This allows <a class="reference internal" href="displaying_images.html#renpy.has_image" title="renpy.has_image"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.has_image()</span></code></a> to
be used in <code class="docutils literal notranslate"><span class="pre">init</span></code> blocks.</p>
<p>The interactive director now has a button that allows you to choose if it
is displayed at the top or the bottom of the screen.</p>
<p>The <a class="reference internal" href="screens.html#sl-for"><span class="std std-ref">screen language for</span></a> statement now takes an index clause:</p>
<div class="highlight-renpy notranslate"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">i</span> <span class="k">index</span> <span class="n">i</span><span class="o">.</span><span class="n">name</span> <span class="k">in</span> <span class="n">party</span><span class="p">:</span>
<span class="o">...</span>
</pre></div>
</div>
<p>When provided, it should return a unique value that can map information like
button and transform state to the object it originates from.</p>
<p>There is now alternate ruby text, allowing two kinds of ruby text
to be displayed at once (such as a translation and pronunciation guide).</p>
<p>The new <a class="reference internal" href="displayables.html#displayable-prefix"><span class="std std-ref">displayable prefix</span></a> system make it possible to define your
own displayables that can be accessed using strings, the same way that
images, image files, and solids have a string form.</p>
<p>Ren'Py now supports creating .zip files that have single files (such as
.rpa files) that are larger than 2GB. As this requires the use of the
Zip64 standard, unpacking such files may not be supported on some platforms,
most notably Windows XP.</p>
<p>The new <a class="reference internal" href="displaying_images.html#renpy.get_hidden_tags" title="renpy.get_hidden_tags"><code class="xref py py-func docutils literal notranslate"><span class="pre">renpy.get_hidden_tags()</span></code></a> function returns the set of tags that
have attributes but or otherwise hidden, while the <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>
function can return a list of tags in sorted order.</p>
<p>Showing a movie sprite a second time will now replay the movie from the start,
for consistency with ATL and other animations.</p>
<p>The documentation has received an editing pass, courtesy of Craig P. Donson.</p>
</div>
<div class="section" id="id82">
<h3>Translations<a class="headerlink" href="#id82" title="Permalink to this headline"> link</a></h3>
<p>The Ren'Py tutorial and The Question now have French translations, thanks
to Alexandre Tranchant.</p>
<p>The Japanese and Russian translations have been updated.</p>
</div>
<div class="section" id="id83">
<h3>Fixes<a class="headerlink" href="#id83" title="Permalink to this headline"> link</a></h3>
<p>This fixes a regression that prevented screens from handling the hide or
replaced events when the screen was not being shown. (This might be the
case when the player is skipping through the game.)</p>
<p>An issue that caused the interactive director to be translated into
Russian when the default (English) language was being used has been
fixed.</p>
<p>The <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>, <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> and <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> displayables are now
actually available under their new names.</p>
<p>An issue that could cause Ren'Py to roll back to an incorrect place when
accessing the console has been fixed. This could cause the console to
display incorrect data, while in the console itself.</p>
</div>
</div>
<div class="section" id="older-changelogs">
<h2>Older Changelogs<a class="headerlink" href="#older-changelogs" title="Permalink to this headline"> link</a></h2>
<p>The changelogs for some Ren'Py 6 versions can be found <a class="reference internal" href="changelog6.html#changelog-6"><span class="std std-ref">here</span></a>,
with older changelogs being found at:</p>
<blockquote>
<div><a class="reference external" href="https://www.renpy.org/dl/6.10.2/CHANGELOG.txt">https://www.renpy.org/dl/6.10.2/CHANGELOG.txt</a></div></blockquote>
</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>