Compare commits
47 Commits
7.1.2.978
...
7.1.2.1024
| Author | SHA1 | Date | |
|---|---|---|---|
| ddaf9f3de3 | |||
| 8900d6f3df | |||
| 2e2f2ea460 | |||
| adb928e234 | |||
| 53261a7a52 | |||
| 2e6f61e673 | |||
| 1392cd9dad | |||
| c2be31d5de | |||
| e419711493 | |||
| c734c5cda1 | |||
| bde048b359 | |||
| 9878ccec4b | |||
| 30d8911abf | |||
| d9ab291a68 | |||
| 1bc29461d1 | |||
| f2e62c571c | |||
| 0208328307 | |||
| 3ee71e9b0d | |||
| d83788fa23 | |||
| 3c2cebacef | |||
| 834b9fa1d1 | |||
| 9dd55e7b66 | |||
| 857a8a65a2 | |||
| dc58e6e8c8 | |||
| 7f8101e2ee | |||
| f7b389a5bc | |||
| c2895f465c | |||
| 075ba4bc49 | |||
| c6dd267772 | |||
| 06443a5f2e | |||
| ed564397d2 | |||
| 66ef5ba2cf | |||
| fed3430d76 | |||
| cca4bf016c | |||
| 432ba06a48 | |||
| 92fb4098b2 | |||
| a4340f7798 | |||
| 80ec5ad31e | |||
| df4d653b86 | |||
| bcfa6d126b | |||
| d521e79b46 | |||
| 1789b5a2ca | |||
| bc121ac0cc | |||
| a2e8a536b4 | |||
| 715899ade4 | |||
| d829d1ab2f | |||
| 2069612eff |
+10
-13
@@ -1421,16 +1421,18 @@ screen quick_menu():
|
||||
|
||||
zorder 100
|
||||
|
||||
hbox:
|
||||
style_prefix "quick"
|
||||
if quick_menu:
|
||||
|
||||
xalign 0.5
|
||||
yalign 1.0
|
||||
hbox:
|
||||
style_prefix "quick"
|
||||
|
||||
textbutton _("Back") action Rollback()
|
||||
textbutton _("Skip") action Skip() alternate Skip(fast=True, confirm=True)
|
||||
textbutton _("Auto") action Preference("auto-forward", "toggle")
|
||||
textbutton _("Menu") action ShowMenu()
|
||||
xalign 0.5
|
||||
yalign 1.0
|
||||
|
||||
textbutton _("Back") action Rollback()
|
||||
textbutton _("Skip") action Skip() alternate Skip(fast=True, confirm=True)
|
||||
textbutton _("Auto") action Preference("auto-forward", "toggle")
|
||||
textbutton _("Menu") action ShowMenu()
|
||||
|
||||
|
||||
style window:
|
||||
@@ -1512,8 +1514,3 @@ style slider_pref_vbox:
|
||||
style slider_pref_slider:
|
||||
variant "small"
|
||||
xsize gui.scale(600)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+23
-16
@@ -23,24 +23,32 @@ label add_file:
|
||||
|
||||
python hide:
|
||||
import os
|
||||
import codecs
|
||||
filename = ""
|
||||
while True:
|
||||
filename = interface.input(
|
||||
_("FILENAME"),
|
||||
_("Enter the name of the script file to create."),
|
||||
allow=interface.FILENAME_LETTERS,
|
||||
cancel=Jump("navigation"),
|
||||
default=filename,
|
||||
)
|
||||
filename = filename.strip()
|
||||
if not filename:
|
||||
interface.error(_("The file name may not be empty."), label=None)
|
||||
continue
|
||||
|
||||
filename = interface.input(_("FILENAME"), _("Enter the name of the script file to create."), filename="withslash", cancel=Jump("navigation"))
|
||||
if "." in filename and not filename.endswith(".rpy"):
|
||||
interface.error(_("The filename must have the .rpy extension."), label=None)
|
||||
continue
|
||||
elif "." not in filename:
|
||||
filename += ".rpy"
|
||||
|
||||
if "." in filename and not filename.endswith(".rpy"):
|
||||
interface.error(_("The filename must have the .rpy extension."), label="navigation")
|
||||
elif "." not in filename:
|
||||
filename += ".rpy"
|
||||
path = os.path.join(project.current.gamedir, filename)
|
||||
dir = os.path.dirname(path)
|
||||
|
||||
path = os.path.join(project.current.gamedir, filename)
|
||||
dir = os.path.dirname(path)
|
||||
|
||||
if os.path.exists(path):
|
||||
interface.error(_("The file already exists."), label="navigation")
|
||||
|
||||
contents = u"\uFEFF"
|
||||
contents += _("# Ren'Py automatically loads all script files ending with .rpy. To use this\n# file, define a label and jump to it from another file.\n")
|
||||
contents += "\n"
|
||||
if os.path.exists(path):
|
||||
interface.error(_("The file already exists."), label=None)
|
||||
continue
|
||||
|
||||
try:
|
||||
os.makedirs(dir)
|
||||
@@ -54,4 +62,3 @@ label add_file:
|
||||
f.write(contents.encode("utf-8"))
|
||||
|
||||
jump navigation_refresh
|
||||
|
||||
|
||||
+28
-30
@@ -327,25 +327,6 @@ label new_gui_project:
|
||||
|
||||
python:
|
||||
gui_new = True
|
||||
|
||||
project_name = interface.input(
|
||||
_("PROJECT NAME"),
|
||||
_("Please enter the name of your project:"),
|
||||
filename=True,
|
||||
cancel=Jump("front_page"))
|
||||
|
||||
project_name = project_name.strip()
|
||||
if not project_name:
|
||||
interface.error(_("The project name may not be empty."))
|
||||
|
||||
project_dir = os.path.join(persistent.projects_directory, project_name)
|
||||
|
||||
if project.manager.get(project_name) is not None:
|
||||
interface.error(_("[project_name!q] already exists. Please choose a different project name."), project_name=project_name)
|
||||
|
||||
if os.path.exists(project_dir):
|
||||
interface.error(_("[project_dir!q] already exists. Please choose a different project name."), project_dir=project_dir)
|
||||
|
||||
gui_replace_images = True
|
||||
gui_replace_code = True
|
||||
gui_update_code = True
|
||||
@@ -369,20 +350,37 @@ label gui_project_size:
|
||||
|
||||
if gui_size == "custom":
|
||||
|
||||
gui_width = ""
|
||||
while True:
|
||||
gui_width = interface.input(
|
||||
_("WIDTH"),
|
||||
_("Please enter the width of your game, in pixels."),
|
||||
cancel=Jump("front_page"),
|
||||
allow=interface.DIGITS_LETTERS,
|
||||
)
|
||||
|
||||
gui_width = interface.input(_("WIDTH"), _("Please enter the width of your game, in pixels."), cancel=Jump("front_page"))
|
||||
try:
|
||||
gui_width = int(gui_width)
|
||||
except:
|
||||
interface.error(_("The width must be a number."), label=None)
|
||||
continue
|
||||
break
|
||||
|
||||
try:
|
||||
gui_width = int(gui_width)
|
||||
except:
|
||||
interface.error(_("The width must be a number."))
|
||||
gui_height = ""
|
||||
while True:
|
||||
gui_height = interface.input(
|
||||
_("HEIGHT"),
|
||||
_("Please enter the height of your game, in pixels."),
|
||||
cancel=Jump("front_page"),
|
||||
allow=interface.DIGITS_LETTERS,
|
||||
)
|
||||
|
||||
gui_height = interface.input(_("HEIGHT"), _("Please enter the height of your game, in pixels."), cancel=Jump("front_page"))
|
||||
|
||||
try:
|
||||
gui_height = int(gui_height)
|
||||
except:
|
||||
interface.error(_("The height must be a number."))
|
||||
try:
|
||||
gui_height = int(gui_height)
|
||||
except:
|
||||
interface.error(_("The height must be a number."), label=None)
|
||||
continue
|
||||
break
|
||||
|
||||
gui_size = (gui_width, gui_height)
|
||||
|
||||
|
||||
@@ -251,7 +251,12 @@ screen launcher_input:
|
||||
|
||||
add SPACER
|
||||
|
||||
input style "l_default" value ScreenVariableInputValue("value", returnable=True) size 24 xalign 0.5 color INPUT_COLOR
|
||||
input style "l_default":
|
||||
value ScreenVariableInputValue("value", returnable=True)
|
||||
size 24
|
||||
xalign 0.5
|
||||
color INPUT_COLOR
|
||||
allow allow
|
||||
|
||||
if filename:
|
||||
add SPACER
|
||||
@@ -384,7 +389,13 @@ init python in interface:
|
||||
yield
|
||||
store._ignore_action = Jump("front_page")
|
||||
|
||||
def input(title, message, filename=False, sanitize=True, cancel=None, default=""):
|
||||
import string
|
||||
DIGITS_LETTERS = string.digits
|
||||
PROJECT_LETTERS = DIGITS_LETTERS + string.ascii_letters + " _"
|
||||
FILENAME_LETTERS = PROJECT_LETTERS + "\\/"
|
||||
TRANSLATE_LETTERS = string.ascii_letters + "_"
|
||||
|
||||
def input(title, message, filename=False, sanitize=True, cancel=None, allow=None, default=""):
|
||||
"""
|
||||
Requests typewritten input from the user.
|
||||
"""
|
||||
@@ -393,7 +404,15 @@ init python in interface:
|
||||
|
||||
while True:
|
||||
|
||||
rv = renpy.call_screen("launcher_input", title=title, message=message, filename=filename, cancel=cancel, default=rv)
|
||||
rv = renpy.call_screen(
|
||||
"launcher_input",
|
||||
title=title,
|
||||
message=message,
|
||||
filename=filename or (allow in [PROJECT_LETTERS, FILENAME_LETTERS]),
|
||||
allow=allow,
|
||||
cancel=cancel,
|
||||
default=rv
|
||||
)
|
||||
|
||||
if sanitize:
|
||||
if ("[" in rv) or ("{" in rv):
|
||||
@@ -507,6 +526,3 @@ init python in interface:
|
||||
"""
|
||||
|
||||
return common(_("CHOICE"), store.QUESTION_COLOR, message, choices=choices, selected=selected, **kwargs)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -62,28 +62,52 @@ label new_project:
|
||||
if persistent.projects_directory is None:
|
||||
$ interface.error(_("The projects directory could not be set. Giving up."))
|
||||
|
||||
if not persistent.legacy:
|
||||
python:
|
||||
if persistent.legacy:
|
||||
|
||||
python:
|
||||
check_language_support()
|
||||
|
||||
gui_kind = interface.choice(
|
||||
_("Which interface would you like to use? The new GUI has a modern look, supports wide screens and mobile devices, and is easier to customize. Legacy themes might be necessary to work with older example code.\n\n[language_support!t]\n\nIf in doubt, choose the new GUI, then click Continue on the bottom-right."),
|
||||
[ ( 'new_gui_project', _("New GUI Interface") ), ( 'new_theme_project', _("Legacy Theme Interface")) ],
|
||||
"new_gui_project",
|
||||
cancel=Jump("front_page"),
|
||||
)
|
||||
else:
|
||||
new_project_language = (_preferences.language or "english").title()
|
||||
gui_kind = "new_gui_project"
|
||||
|
||||
# When translating this, feel free to replace [new_project_language] with the translation of your language.
|
||||
$ interface.info(_("You will be creating an [new_project_language] language project. Change the launcher language in preferences to create a project in another language."))
|
||||
|
||||
jump new_gui_project
|
||||
# When translating this, feel free to replace [new_project_language] with the translation of your language.
|
||||
interface.info(_("You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."))
|
||||
|
||||
python:
|
||||
|
||||
check_language_support()
|
||||
|
||||
gui_kind = interface.choice(
|
||||
_("Which interface would you like to use? The new GUI has a modern look, supports wide screens and mobile devices, and is easier to customize. Legacy themes might be necessary to work with older example code.\n\n[language_support!t]\n\nIf in doubt, choose the new GUI, then click Continue on the bottom-right."),
|
||||
[ ( 'new_gui_project', _("New GUI Interface") ), ( 'new_theme_project', _("Legacy Theme Interface")) ],
|
||||
"new_gui_project",
|
||||
cancel=Jump("front_page"),
|
||||
project_name = ""
|
||||
while True:
|
||||
project_name = interface.input(
|
||||
_("PROJECT NAME"),
|
||||
_("Please enter the name of your project:"),
|
||||
allow=interface.PROJECT_LETTERS,
|
||||
cancel=Jump("front_page"),
|
||||
default=project_name,
|
||||
)
|
||||
|
||||
renpy.jump(gui_kind)
|
||||
project_name = project_name.strip()
|
||||
if not project_name:
|
||||
interface.error(_("The project name may not be empty."), label=None)
|
||||
continue
|
||||
|
||||
project_dir = os.path.join(persistent.projects_directory, project_name)
|
||||
|
||||
if project.manager.get(project_name) is not None:
|
||||
interface.error(_("[project_name!q] already exists. Please choose a different project name."), project_name=project_name, label=None)
|
||||
continue
|
||||
|
||||
if os.path.exists(project_dir):
|
||||
interface.error(_("[project_dir!q] already exists. Please choose a different project name."), project_dir=project_dir, label=None)
|
||||
continue
|
||||
break
|
||||
|
||||
jump expression gui_kind
|
||||
|
||||
screen select_template:
|
||||
|
||||
@@ -125,25 +149,6 @@ screen select_template:
|
||||
label new_theme_project:
|
||||
|
||||
python hide:
|
||||
|
||||
project_name = interface.input(
|
||||
_("PROJECT NAME"),
|
||||
_("Please enter the name of your project:"),
|
||||
filename=True,
|
||||
cancel=Jump("front_page"))
|
||||
|
||||
project_name = project_name.strip()
|
||||
if not project_name:
|
||||
interface.error(_("The project name may not be empty."))
|
||||
|
||||
project_dir = os.path.join(persistent.projects_directory, project_name)
|
||||
|
||||
if project.manager.get(project_name) is not None:
|
||||
interface.error(_("[project_name!q] already exists. Please choose a different project name."), project_name=project_name)
|
||||
|
||||
if os.path.exists(project_dir):
|
||||
interface.error(_("[project_dir!q] already exists. Please choose a different project name."), project_dir=project_dir)
|
||||
|
||||
if len(project.manager.templates) == 1:
|
||||
template = project.manager.templates[0]
|
||||
else:
|
||||
|
||||
@@ -1253,7 +1253,7 @@ translate indonesian strings:
|
||||
new "Navigasi: [project.current.display_name!q]"
|
||||
|
||||
# new_project.rpy:71
|
||||
old "You will be creating an [new_project_language] language project. Change the launcher language in preferences to create a project in another language."
|
||||
old "You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."
|
||||
new "Kamu akan membuat bahasa proyek : [new_project_language]. Ganti bahasa launcher di pengaturan untuk membuat proyek dalam bahasa lain."
|
||||
|
||||
# preferences.rpy:187
|
||||
@@ -1271,4 +1271,3 @@ translate indonesian strings:
|
||||
# translations.rpy:343
|
||||
old "Extract Dialogue: [project.current.display_name!q]"
|
||||
new "Extrak Dialog: [project.current.display_name!q]"
|
||||
|
||||
|
||||
@@ -1221,7 +1221,7 @@ translate japanese strings:
|
||||
new "ナビゲーション: [project.current.display_name!q]"
|
||||
|
||||
# new_project.rpy:71
|
||||
old "You will be creating an [new_project_language] language project. Change the launcher language in preferences to create a project in another language."
|
||||
old "You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."
|
||||
new "日本語のプロジェクトを作成します。別の言語のプロジェクトを作成するには、設定でランチャーの言語を変更してください。"
|
||||
|
||||
# preferences.rpy:187
|
||||
@@ -1321,4 +1321,3 @@ translate japanese strings:
|
||||
# front_page.rpy:221
|
||||
old "Actions"
|
||||
new "アクション"
|
||||
|
||||
|
||||
@@ -913,7 +913,7 @@
|
||||
new "Direktori projek tidak boleh ditetapkan. Putus asa."
|
||||
|
||||
# new_project.rpy:71
|
||||
old "You will be creating an [new_project_language] language project. Change the launcher language in preferences to create a project in another language."
|
||||
old "You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."
|
||||
new "Anda akan mencipta projek bahasa [new_project_language]. Tukar bahasa pelancar dalam menu keutamaan untuk mencipta projek dalam bahasa yang lain."
|
||||
|
||||
# new_project.rpy:79
|
||||
@@ -1263,4 +1263,3 @@
|
||||
# updater.rpy:201
|
||||
old "Proceed"
|
||||
new "Teruskan"
|
||||
|
||||
|
||||
@@ -1130,7 +1130,7 @@ translate piglatin strings:
|
||||
new "Hetay rojectspay irectoryday ouldcay otnay ebay etsay. Ivinggay upay."
|
||||
|
||||
# new_project.rpy:71
|
||||
old "You will be creating an [new_project_language] language project. Change the launcher language in preferences to create a project in another language."
|
||||
old "You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."
|
||||
new "Ouyay illway ebay reatingcay anay [new_project_language] anguagelay rojectpay. Hangecay hetay auncherlay anguagelay inay referencespay otay reatecay aay rojectpay inay anotheray anguagelay."
|
||||
|
||||
# new_project.rpy:79
|
||||
@@ -1484,4 +1484,3 @@ translate piglatin strings:
|
||||
# updater.rpy:188
|
||||
old "Fetching the list of update channels"
|
||||
new "Etchingfay hetay istlay ofay updateay annelschay"
|
||||
|
||||
|
||||
@@ -813,3 +813,10 @@ translate russian strings:
|
||||
old "return"
|
||||
new "вернуться"
|
||||
|
||||
# _developer\developer.rpym:154
|
||||
old "Hide deleted"
|
||||
new "Скрыть удалённые"
|
||||
|
||||
# _developer\developer.rpym:154
|
||||
old "Show deleted"
|
||||
new "Показать удалённые"
|
||||
|
||||
@@ -21,6 +21,10 @@ translate russian strings:
|
||||
old "The filename must have the .rpy extension."
|
||||
new "Имя должно иметь расширение .rpy."
|
||||
|
||||
# add_file.rpy:37
|
||||
old "The file name may not be empty."
|
||||
new "Имя файла не может быть пустым."
|
||||
|
||||
# add_file.rpy:39
|
||||
old "The file already exists."
|
||||
new "Файл уже существует."
|
||||
@@ -31,11 +35,11 @@ translate russian strings:
|
||||
|
||||
# android.rpy:30
|
||||
old "To build Android packages, please download RAPT, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher."
|
||||
new "Чтобы построить Android-пакет, пожалуйста, загрузите RAPT, разархивируйте его и поместить в директорию Ren'Py. Затем перезагрузите лаунчер Ren'Py."
|
||||
new "Чтобы построить Android-пакет, пожалуйста, загрузите RAPT, разархивируйте его, и поместите в директорию Ren'Py. Затем перезагрузите лаунчер Ren'Py."
|
||||
|
||||
# android.rpy:31
|
||||
old "A Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
|
||||
new "Чтобы построить Android-пакеты на Windows требуется инструментарий разработки Java 8. JDK отличен от JRE, и возможно, у вас есть Java без JDK.\n\nПожалуйста, {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}загрузите и установите JDK{/a}, и перезапустите лаунчер Ren'Py."
|
||||
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
|
||||
new "Чтобы построить Android-пакеты на Windows требуется 64-битный инструментарий разработки Java 8. JDK отличен от JRE, и возможно, у вас есть Java без JDK.\n\nПожалуйста, {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}загрузите и установите JDK{/a}, и перезапустите лаунчер Ren'Py."
|
||||
|
||||
# android.rpy:32
|
||||
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
|
||||
@@ -215,7 +219,7 @@ translate russian strings:
|
||||
|
||||
# androidstrings.rpy:17
|
||||
old "The build seems to have failed."
|
||||
new "Ой, ошибка со сборкой приключилась..."
|
||||
new "Похоже, сборка провалилась."
|
||||
|
||||
# androidstrings.rpy:18
|
||||
old "Launching app."
|
||||
@@ -225,6 +229,10 @@ translate russian strings:
|
||||
old "The build seems to have succeeded."
|
||||
new "Кажется, сборка прошла успешно!"
|
||||
|
||||
# androidstrings.rpy:20
|
||||
old "The armeabi-v7a version works on most phones on tablets, while the x86_64 version works on the simulator and chromebooks."
|
||||
new "Версия armeabi-v7a работает на большинстве смартфонов и планшетов, а версия x86_64 требуется для симуляторов и хромбуков."
|
||||
|
||||
# androidstrings.rpy:20
|
||||
old "What is the full name of your application? This name will appear in the list of installed applications."
|
||||
new "Каким будет полное имя вашего приложения? Это имя будет представлено в списке установленных приложений."
|
||||
@@ -367,7 +375,7 @@ translate russian strings:
|
||||
|
||||
# androidstrings.rpy:55
|
||||
old "Do you accept the Android SDK Terms and Conditions?"
|
||||
new "Вы принимаете условияя и положения пользования Android SDK?"
|
||||
new "Вы принимаете условия и положения пользования Android SDK?"
|
||||
|
||||
# androidstrings.rpy:56
|
||||
old "I'm downloading the Android SDK. This might take a while."
|
||||
@@ -1146,8 +1154,8 @@ translate russian strings:
|
||||
new "Директория проектов не может быть установлена. Сдаюсь."
|
||||
|
||||
# new_project.rpy:71
|
||||
old "You will be creating an [new_project_language] language project. Change the launcher language in preferences to create a project in another language."
|
||||
new "Вы создаёте проект на языке [new_project_language]. Чтобы создать проект на другом языке, измените язык лаунчера."
|
||||
old "You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."
|
||||
new "Вы создаёте проект на русском языке. Чтобы создать проект на другом языке, измените язык лаунчера."
|
||||
|
||||
# new_project.rpy:79
|
||||
old "Which interface would you like to use? The new GUI has a modern look, supports wide screens and mobile devices, and is easier to customize. Legacy themes might be necessary to work with older example code.\n\n[language_support!t]\n\nIf in doubt, choose the new GUI, then click Continue on the bottom-right."
|
||||
|
||||
@@ -898,7 +898,7 @@ translate simplified_chinese strings:
|
||||
new "传统主题界面"
|
||||
|
||||
# new_project.rpy:71
|
||||
old "You will be creating an [new_project_language] language project. Change the launcher language in preferences to create a project in another language."
|
||||
old "You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."
|
||||
new "您将创建一个 [new_project_language] 语言的工程。要创建其他语言的工程,请在设置里更改启动器语言。"
|
||||
|
||||
# new_project.rpy:90
|
||||
@@ -1248,4 +1248,3 @@ translate simplified_chinese strings:
|
||||
# dmgcheck.rpy:50
|
||||
old "This is probably because Ren'Py is running directly from a Macintosh drive image. To fix this, quit this launcher, copy the entire %s folder somewhere else on your computer, and run Ren'Py again."
|
||||
new "这可能是由于 Ren'Py 直接从 Macintosh 磁盘镜像中运行导致的。要修复此问题,退出启动器,复制整个 %s 文件夹到您计算机的其他任意位置,并重新运行 Ren'Py。"
|
||||
|
||||
|
||||
@@ -914,7 +914,7 @@ translate spanish strings:
|
||||
new "No se puede establecer el directorio de proyectos. Abandonando."
|
||||
|
||||
# new_project.rpy:71
|
||||
old "You will be creating an [new_project_language] language project. Change the launcher language in preferences to create a project in another language."
|
||||
old "You will be creating an [new_project_language]{#this substitution may be localized} language project. Change the launcher language in preferences to create a project in another language."
|
||||
new "Vas a crear un proyecto en idioma [new_project_language]. Cambia el idioma del lanzador en preferencias para crear un proyecto en otro idioma."
|
||||
|
||||
# new_project.rpy:79
|
||||
|
||||
@@ -116,7 +116,7 @@ screen translate:
|
||||
value FieldInputValue(persistent, "translate_language")
|
||||
size 24
|
||||
color INPUT_COLOR
|
||||
|
||||
allow interface.TRANSLATE_LETTERS
|
||||
# Left side.
|
||||
frame:
|
||||
style "l_indent"
|
||||
|
||||
@@ -335,7 +335,7 @@ class Channel(object):
|
||||
"""
|
||||
|
||||
# Update the channel volume.
|
||||
vol = self.chan_volume * renpy.game.preferences.volumes[self.mixer]
|
||||
vol = self.chan_volume * renpy.game.preferences.volumes.get(self.mixer, 1.0)
|
||||
|
||||
if vol != self.actual_volume:
|
||||
renpysound.set_volume(self.number, vol)
|
||||
@@ -343,7 +343,7 @@ class Channel(object):
|
||||
|
||||
# This should be set from something that checks to see if our
|
||||
# mixer is muted.
|
||||
force_stop = self.context.force_stop or (renpy.game.preferences.mute[self.mixer] and self.stop_on_mute)
|
||||
force_stop = self.context.force_stop or (renpy.game.preferences.mute.get(self.mixer, False) and self.stop_on_mute)
|
||||
|
||||
if self.playing and force_stop:
|
||||
renpysound.stop(self.number)
|
||||
|
||||
@@ -58,8 +58,8 @@ set_mixer = renpy.audio.music.set_mixer
|
||||
set_queue_empty_callback = renpy.audio.music.set_queue_empty_callback
|
||||
|
||||
|
||||
def set_volume(volume, channel="sound"):
|
||||
renpy.audio.music.set_volume(volume, 0, channel=channel)
|
||||
def set_volume(volume, delay=0, channel="sound"):
|
||||
renpy.audio.music.set_volume(volume, delay, channel=channel)
|
||||
|
||||
|
||||
def set_pan(pan, delay, channel="sound"):
|
||||
|
||||
@@ -748,26 +748,35 @@ init -1500 python:
|
||||
|
||||
class FilePageNext(Action, DictEquality):
|
||||
"""
|
||||
:doc: file_action
|
||||
:doc: file_action
|
||||
|
||||
Goes to the next file page.
|
||||
Goes to the next file page.
|
||||
|
||||
`max`
|
||||
If set, this should be an integer that gives the number of
|
||||
the maximum file page we can go to.
|
||||
`max`
|
||||
If set, this should be an integer that gives the number of
|
||||
the maximum file page we can go to.
|
||||
|
||||
`wrap`
|
||||
If true, we can go to the first page when on the last file page if max is set.
|
||||
"""
|
||||
`wrap`
|
||||
If true, we can go to the first page when on the
|
||||
last file page if `max` is set.
|
||||
|
||||
`auto`
|
||||
If true and wrap is set, this can bring the player to
|
||||
the page of automatic saves.
|
||||
|
||||
`quick`
|
||||
If true and wrap is set, this can bring the player to
|
||||
the page of automatic saves.
|
||||
"""
|
||||
|
||||
alt = _("Next file page.")
|
||||
|
||||
def __init__(self, max=None, wrap=False):
|
||||
def __init__(self, max=None, wrap=False, auto=True, quick=True):
|
||||
|
||||
page = persistent._file_page
|
||||
|
||||
if page == "auto":
|
||||
if config.has_quicksave:
|
||||
if config.has_quicksave and quick:
|
||||
page = "quick"
|
||||
else:
|
||||
page = "1"
|
||||
@@ -781,9 +790,9 @@ init -1500 python:
|
||||
if max is not None:
|
||||
if page > max:
|
||||
if wrap:
|
||||
if config.has_autosave:
|
||||
if config.has_autosave and auto:
|
||||
page = "auto"
|
||||
elif config.has_quicksave:
|
||||
elif config.has_quicksave and quick:
|
||||
page = "quick"
|
||||
else:
|
||||
page = "1"
|
||||
@@ -815,40 +824,48 @@ init -1500 python:
|
||||
|
||||
Goes to the previous file page, if possible.
|
||||
|
||||
`max`
|
||||
If set, this should be an integer that gives the number of
|
||||
the maximum file page we can go to. This is required to enable
|
||||
wrap.
|
||||
`max`
|
||||
If set, this should be an integer that gives the number of
|
||||
the maximum file page we can go to. This is required to enable
|
||||
wrap.
|
||||
|
||||
`wrap`
|
||||
If true, we can go to the last page when on the first file page if max is set.
|
||||
|
||||
`auto`
|
||||
If true, this can bring the player to
|
||||
the page of automatic saves.
|
||||
|
||||
`quick`
|
||||
If true, this can bring the player to
|
||||
the page of automatic saves.
|
||||
|
||||
`wrap`
|
||||
If true, we can go to the last page when on the first file page if max is set.
|
||||
"""
|
||||
|
||||
alt = _("Previous file page.")
|
||||
|
||||
def __init__(self, max=None, wrap=False):
|
||||
def __init__(self, max=None, wrap=False, auto=True, quick=True):
|
||||
|
||||
if wrap and max is not None:
|
||||
max = str(max)
|
||||
else:
|
||||
max = None
|
||||
|
||||
|
||||
page = persistent._file_page
|
||||
|
||||
if page == "auto":
|
||||
page = max
|
||||
|
||||
elif page == "quick":
|
||||
if config.has_autosave:
|
||||
if config.has_autosave and auto:
|
||||
page = "auto"
|
||||
else:
|
||||
page = max
|
||||
|
||||
elif page == "1":
|
||||
if config.has_quicksave:
|
||||
if config.has_quicksave and quick:
|
||||
page = "quick"
|
||||
elif config.has_autosave:
|
||||
elif config.has_autosave and auto:
|
||||
page = "auto"
|
||||
else:
|
||||
page = max
|
||||
|
||||
@@ -221,3 +221,6 @@ init -1500 python:
|
||||
init -1500:
|
||||
image text = renpy.ParameterizedText(style="centered_text")
|
||||
image vtext = renpy.ParameterizedText(style="centered_vtext")
|
||||
|
||||
# Set _version to the version when the game was first started.
|
||||
default _version = config.version
|
||||
|
||||
@@ -352,7 +352,7 @@ init -1400:
|
||||
|
||||
define irisout = CropMove(1.0, "irisout")
|
||||
define irisin = CropMove(1.0, "irisin")
|
||||
|
||||
|
||||
# Various uses of PushMove.
|
||||
define pushright = PushMove(1.0, "pushright")
|
||||
define pushleft = PushMove(1.0, "pushleft")
|
||||
@@ -375,6 +375,8 @@ init -1400:
|
||||
|
||||
# The default narrator.
|
||||
define _narrator = Character(None, kind=adv, what_style='say_thought')
|
||||
define centered = Character(None, what_style="centered_text", window_style="centered_window")
|
||||
define vcentered = Character(None, what_style="centered_vtext", window_style="centered_window")
|
||||
|
||||
init 1400 python:
|
||||
if not hasattr(store, 'narrator'):
|
||||
@@ -383,14 +385,6 @@ init 1400 python:
|
||||
renpy.pure('narrator')
|
||||
renpy.pure('name_only')
|
||||
|
||||
if not hasattr(store, 'centered'):
|
||||
centered = Character(None, what_style="centered_text", window_style="centered_window")
|
||||
if not hasattr(store, 'vcentered'):
|
||||
vcentered = Character(None, what_style="centered_vtext", window_style="centered_window")
|
||||
|
||||
renpy.pure('centered')
|
||||
renpy.pure('vcentered')
|
||||
|
||||
# This is necessary to ensure that config.default_transform works.
|
||||
if config.default_transform:
|
||||
config.default_transform._show()
|
||||
|
||||
@@ -79,8 +79,10 @@ init 1600:
|
||||
|
||||
else:
|
||||
for i, m in enumerate(mixers):
|
||||
|
||||
renpy.sound.set_mixer(i, m, default=True)
|
||||
if m == 'music':
|
||||
|
||||
if i >= 3:
|
||||
renpy.music.set_music(i, True, default=True)
|
||||
else:
|
||||
renpy.music.set_music(i, False, default=True)
|
||||
|
||||
@@ -30,7 +30,7 @@ screen _developer:
|
||||
modal True
|
||||
|
||||
frame:
|
||||
style_group ""
|
||||
style_prefix ""
|
||||
|
||||
has side "t c b":
|
||||
spacing gui._scale(10)
|
||||
@@ -74,7 +74,7 @@ screen _developer:
|
||||
screen _image_attributes():
|
||||
|
||||
frame:
|
||||
style_group ""
|
||||
style_prefix ""
|
||||
right_padding 0
|
||||
|
||||
has side "c b":
|
||||
@@ -110,13 +110,19 @@ label _image_attributes:
|
||||
|
||||
return
|
||||
|
||||
screen _variable_viewer(entries):
|
||||
screen _variable_viewer(all_entries, deleted_entries):
|
||||
|
||||
zorder 1010
|
||||
modal True
|
||||
default show_deleted = True
|
||||
python:
|
||||
if show_deleted:
|
||||
entries = all_entries
|
||||
else:
|
||||
entries = [(n, v) for n, v in all_entries if n not in deleted_entries]
|
||||
|
||||
frame:
|
||||
style_group ""
|
||||
style_prefix ""
|
||||
right_padding 0
|
||||
|
||||
has side "t c b":
|
||||
@@ -144,6 +150,9 @@ screen _variable_viewer(entries):
|
||||
|
||||
textbutton _(u"Return"):
|
||||
action Return(True)
|
||||
if all_entries and deleted_entries:
|
||||
textbutton (_(u"Hide deleted") if show_deleted else _(u"Show deleted")):
|
||||
action ToggleScreenVariable("show_deleted")
|
||||
|
||||
|
||||
label _debugger_screen:
|
||||
@@ -157,6 +166,7 @@ label _debugger_screen:
|
||||
aRepr.maxstring = 120
|
||||
|
||||
entries = [ ]
|
||||
deleted_entries = set()
|
||||
|
||||
for sn, d in renpy.python.store_dicts.items():
|
||||
|
||||
@@ -181,11 +191,14 @@ label _debugger_screen:
|
||||
|
||||
name = (sn + "." + vn)[6:]
|
||||
|
||||
if vn not in d:
|
||||
deleted_entries.add(name)
|
||||
|
||||
entries.append((name, value))
|
||||
|
||||
entries.sort(key=lambda e : e[0])
|
||||
|
||||
renpy.call_screen("_variable_viewer", entries=entries)
|
||||
renpy.call_screen("_variable_viewer", all_entries=entries, deleted_entries=deleted_entries)
|
||||
|
||||
return
|
||||
|
||||
@@ -477,7 +490,7 @@ screen _image_location_picker(image_files):
|
||||
default filter = ""
|
||||
|
||||
frame:
|
||||
style_group ""
|
||||
style_prefix ""
|
||||
|
||||
has side "t c b":
|
||||
spacing gui._scale(10)
|
||||
@@ -651,4 +664,3 @@ init python:
|
||||
config.underlay.append(renpy.Keymap(
|
||||
image_load_log = ToggleScreen("_image_load_log")
|
||||
))
|
||||
|
||||
|
||||
@@ -219,8 +219,6 @@ BarValue = renpy.ui.BarValue
|
||||
|
||||
Style = renpy.style.Style # @UndefinedVariable
|
||||
|
||||
absolute = renpy.display.core.absolute
|
||||
|
||||
NoRollback = renpy.python.NoRollback
|
||||
|
||||
|
||||
|
||||
@@ -47,10 +47,11 @@ def default_drag_group():
|
||||
|
||||
return rv
|
||||
|
||||
|
||||
def default_drag_joined(drag):
|
||||
return [ (drag, 0, 0) ]
|
||||
|
||||
def default_drop_allowable(drop, drags):
|
||||
return True
|
||||
|
||||
class Drag(renpy.display.core.Displayable, renpy.python.RevertableObject):
|
||||
"""
|
||||
@@ -168,6 +169,12 @@ class Drag(renpy.display.core.Displayable, renpy.python.RevertableObject):
|
||||
If false, the default, the drag is dropped onto the droppable with
|
||||
the largest degree of overlap.
|
||||
|
||||
`drop_allowable`
|
||||
A callback that is called to determine whether this drop allow
|
||||
the current drags dropped onto. It is called with two arguments.
|
||||
The first is the Drag which determines its sensitivity.
|
||||
The second is a list of Drags that are being dragged.
|
||||
|
||||
Except for `d`, all of the parameters are available as fields (with
|
||||
the same name) on the Drag object. In addition, after the drag has
|
||||
been rendered, the following fields become available:
|
||||
@@ -177,7 +184,7 @@ class Drag(renpy.display.core.Displayable, renpy.python.RevertableObject):
|
||||
|
||||
`w`, `h`
|
||||
The width and height of the Drag's child, in pixels.
|
||||
"""
|
||||
"""
|
||||
|
||||
focusable = True
|
||||
|
||||
@@ -198,6 +205,7 @@ class Drag(renpy.display.core.Displayable, renpy.python.RevertableObject):
|
||||
drag_raise=True,
|
||||
dragged=None,
|
||||
dropped=None,
|
||||
drop_allowable=default_drop_allowable,
|
||||
drag_handle=(0.0, 0.0, 1.0, 1.0),
|
||||
drag_joined=default_drag_joined,
|
||||
clicked=None,
|
||||
@@ -219,6 +227,7 @@ class Drag(renpy.display.core.Displayable, renpy.python.RevertableObject):
|
||||
self.drag_raise = drag_raise
|
||||
self.dragged = dragged
|
||||
self.dropped = dropped
|
||||
self.drop_allowable = drop_allowable
|
||||
self.drag_handle = drag_handle
|
||||
self.drag_joined = drag_joined
|
||||
self.clicked = clicked
|
||||
@@ -740,6 +749,11 @@ class DragGroup(renpy.display.layout.MultiBox):
|
||||
|
||||
All positional parameters to the DragGroup constructor should be
|
||||
Drags, that are added to the DragGroup.
|
||||
|
||||
|
||||
`min_overlap`
|
||||
An integer which means the minimum number of pixels at the
|
||||
overlap so that drop will be allow.
|
||||
"""
|
||||
|
||||
_list_type = renpy.python.RevertableList
|
||||
@@ -753,6 +767,9 @@ class DragGroup(renpy.display.layout.MultiBox):
|
||||
|
||||
replaces = properties.pop("replaces", None)
|
||||
|
||||
min_overlap = properties.pop("min_overlap", 0)
|
||||
self.min_overlap = min_overlap
|
||||
|
||||
super(DragGroup, self).__init__(**properties)
|
||||
|
||||
if replaces is not None:
|
||||
@@ -873,7 +890,11 @@ class DragGroup(renpy.display.layout.MultiBox):
|
||||
|
||||
overlap = rect_overlap_area(r1, r2)
|
||||
|
||||
if overlap >= max_overlap:
|
||||
if (
|
||||
overlap >= max_overlap and
|
||||
overlap >= self.min_overlap and
|
||||
c.drop_allowable(c, joined)
|
||||
):
|
||||
rv = c
|
||||
max_overlap = overlap
|
||||
|
||||
@@ -898,8 +919,11 @@ class DragGroup(renpy.display.layout.MultiBox):
|
||||
if c.x is None:
|
||||
continue
|
||||
|
||||
if (x >= c.x and y >= c.y and
|
||||
x < (c.x+c.w) and y < (c.y+c.h)):
|
||||
if (
|
||||
x >= c.x and y >= c.y and
|
||||
x < (c.x + c.w) and y < (c.y + c.h) and
|
||||
c.drop_allowable(c, joined)
|
||||
):
|
||||
return c
|
||||
|
||||
def get_children(self):
|
||||
|
||||
+35
-6
@@ -137,7 +137,7 @@ def interact():
|
||||
return fullscreen
|
||||
|
||||
|
||||
def get_movie_texture(channel, mask_channel=None):
|
||||
def get_movie_texture(channel, mask_channel=None, side_mask=False):
|
||||
|
||||
if not renpy.audio.music.get_playing(channel):
|
||||
return None, False
|
||||
@@ -145,16 +145,29 @@ def get_movie_texture(channel, mask_channel=None):
|
||||
c = renpy.audio.music.get_channel(channel)
|
||||
surf = c.read_video()
|
||||
|
||||
if mask_channel:
|
||||
if side_mask:
|
||||
|
||||
if surf is not None:
|
||||
|
||||
w, h = surf.get_size()
|
||||
w //= 2
|
||||
|
||||
mask_surf = surf.subsurface((w, 0, w, h))
|
||||
surf = surf.subsurface((0, 0, w, h))
|
||||
|
||||
else:
|
||||
mask_surf = None
|
||||
|
||||
elif mask_channel:
|
||||
mc = renpy.audio.music.get_channel(mask_channel)
|
||||
mask_surf = mc.read_video()
|
||||
else:
|
||||
mask_surf = None
|
||||
|
||||
if mask_channel:
|
||||
if mask_surf is not None:
|
||||
|
||||
# Something went wrong with the mask video.
|
||||
if surf and mask_surf:
|
||||
if surf:
|
||||
renpy.display.module.alpha_munge(mask_surf, surf, renpy.display.im.identity)
|
||||
else:
|
||||
surf = None
|
||||
@@ -228,6 +241,16 @@ class Movie(renpy.display.core.Displayable):
|
||||
file will be automatically played on `channel` when the Movie is
|
||||
shown, and automatically stopped when the movie is hidden.
|
||||
|
||||
`side_mask`
|
||||
If true, this tells Ren'Py to use the side-by-side mask mode for
|
||||
the Movie. In this case, the movie is divided in half. The left
|
||||
half is used for color information, while the right half is used
|
||||
for alpha information. The width of the displayable is half the
|
||||
width of the movie file.
|
||||
|
||||
Where possible, `side_mask` should be used over `mask` as it has
|
||||
no chance of frames going out of sync.
|
||||
|
||||
`mask`
|
||||
If given, this should be the path to a movie file that is used as
|
||||
the alpha channel of this displayable. The movie file will be
|
||||
@@ -282,6 +305,7 @@ class Movie(renpy.display.core.Displayable):
|
||||
|
||||
mask = None
|
||||
mask_channel = None
|
||||
side_mask = False
|
||||
|
||||
image = None
|
||||
|
||||
@@ -302,7 +326,7 @@ class Movie(renpy.display.core.Displayable):
|
||||
|
||||
renpy.audio.music.register_channel(name, renpy.config.movie_mixer, loop=True, stop_on_mute=False, movie=True, framedrop=framedrop)
|
||||
|
||||
def __init__(self, fps=24, size=None, channel="movie", play=None, mask=None, mask_channel=None, image=None, play_callback=None, **properties):
|
||||
def __init__(self, fps=24, size=None, channel="movie", play=None, mask=None, mask_channel=None, image=None, play_callback=None, side_mask=False, **properties):
|
||||
super(Movie, self).__init__(**properties)
|
||||
|
||||
global auto_channel_serial
|
||||
@@ -314,6 +338,9 @@ class Movie(renpy.display.core.Displayable):
|
||||
self.channel = channel
|
||||
self._play = play
|
||||
|
||||
if side_mask:
|
||||
mask = None
|
||||
|
||||
self.mask = mask
|
||||
|
||||
if mask is None:
|
||||
@@ -323,6 +350,8 @@ class Movie(renpy.display.core.Displayable):
|
||||
else:
|
||||
self.mask_channel = mask_channel
|
||||
|
||||
self.side_mask = side_mask
|
||||
|
||||
self.ensure_channel(self.channel)
|
||||
self.ensure_channel(self.mask_channel)
|
||||
|
||||
@@ -357,7 +386,7 @@ class Movie(renpy.display.core.Displayable):
|
||||
|
||||
if self.size is None:
|
||||
|
||||
tex, _ = get_movie_texture(self.channel, self.mask_channel)
|
||||
tex, _ = get_movie_texture(self.channel, self.mask_channel, self.side_mask)
|
||||
|
||||
if playing and (tex is not None):
|
||||
width, height = tex.get_size()
|
||||
|
||||
+1
-1
@@ -425,7 +425,7 @@ def save(slotname, extra_info='', mutate_flag=False):
|
||||
|
||||
screenshot = renpy.game.interface.get_screenshot()
|
||||
|
||||
json = { "_save_name" : extra_info, "_renpy_version" : list(renpy.version_tuple) }
|
||||
json = { "_save_name" : extra_info, "_renpy_version" : list(renpy.version_tuple), "_version" : renpy.config.version }
|
||||
|
||||
for i in renpy.config.save_json_callbacks:
|
||||
i(json)
|
||||
|
||||
@@ -49,6 +49,8 @@ from renpy.translation import translate_string as __ # @UnusedImport
|
||||
|
||||
from renpy.python import store_eval as eval
|
||||
|
||||
from renpy.display.core import absolute
|
||||
|
||||
|
||||
def _(s):
|
||||
"""
|
||||
|
||||
@@ -93,6 +93,8 @@ def analyze():
|
||||
return
|
||||
|
||||
s = "\n"
|
||||
s = s.encode("utf-8")
|
||||
|
||||
renpy.log.real_stdout.write(s)
|
||||
renpy.display.log.write(s)
|
||||
|
||||
@@ -108,6 +110,7 @@ def analyze():
|
||||
dt[3],
|
||||
event.format(*args),
|
||||
)
|
||||
s = s.encode("utf-8")
|
||||
|
||||
renpy.log.real_stdout.write(s)
|
||||
renpy.display.log.write(s)
|
||||
|
||||
@@ -52,6 +52,7 @@ pure_functions = {
|
||||
# minstore.py
|
||||
"_",
|
||||
"_p",
|
||||
"absolute",
|
||||
|
||||
# defaultstore.py
|
||||
"ImageReference", "Image", "Frame", "Solid", "LiveComposite", "LiveCrop",
|
||||
|
||||
@@ -882,6 +882,7 @@ Keyword("droppable")
|
||||
Keyword("drag_raise")
|
||||
Keyword("dragged")
|
||||
Keyword("dropped")
|
||||
Keyword("drop_allowable")
|
||||
Keyword("drag_handle")
|
||||
Keyword("drag_joined")
|
||||
Keyword("clicked")
|
||||
@@ -893,6 +894,7 @@ add(ui_properties)
|
||||
add(position_properties)
|
||||
|
||||
FunctionStatementParser("draggroup", "ui.draggroup", many)
|
||||
Keyword("min_overlap")
|
||||
add(ui_properties)
|
||||
add(position_properties)
|
||||
|
||||
|
||||
@@ -461,6 +461,7 @@ Keyword("droppable")
|
||||
Keyword("drag_raise")
|
||||
Keyword("dragged")
|
||||
Keyword("dropped")
|
||||
Keyword("drop_allowable")
|
||||
Keyword("drag_handle")
|
||||
Keyword("drag_joined")
|
||||
Keyword("drag_offscreen")
|
||||
@@ -473,6 +474,7 @@ Keyword("alternate")
|
||||
Style("child")
|
||||
|
||||
DisplayableParser("draggroup", renpy.display.dragdrop.DragGroup, None, many, replaces=True)
|
||||
Keyword("min_overlap")
|
||||
|
||||
DisplayableParser("mousearea", renpy.display.behavior.MouseArea, 0, replaces=True)
|
||||
Keyword("hovered")
|
||||
|
||||
+43
-19
@@ -32,7 +32,22 @@ registry = { }
|
||||
parsers = renpy.parser.ParseTrie()
|
||||
|
||||
|
||||
def register(name, parse=None, lint=None, execute=None, predict=None, next=None, scry=None, block=False, init=False, translatable=False, execute_init=None, label=None, warp=None): # @ReservedAssignment
|
||||
def register(
|
||||
name,
|
||||
parse=None,
|
||||
lint=None,
|
||||
execute=None,
|
||||
predict=None,
|
||||
next=None,
|
||||
scry=None,
|
||||
block=False,
|
||||
init=False,
|
||||
translatable=False,
|
||||
execute_init=None,
|
||||
init_priority=0,
|
||||
label=None,
|
||||
warp=None,
|
||||
):
|
||||
"""
|
||||
:doc: statement_register
|
||||
:name: renpy.register_statement
|
||||
@@ -48,7 +63,8 @@ def register(name, parse=None, lint=None, execute=None, predict=None, next=None,
|
||||
When this is False, the statement does not expect a block. When True, it
|
||||
expects a block, but leaves it up to the lexer to parse that block. If the
|
||||
string "script", the block is interpreted as containing one or more
|
||||
Ren'Py script language statements.
|
||||
Ren'Py script language statements. If the string "possible", the
|
||||
block expect condition is determined by the parse function.
|
||||
|
||||
`parse`
|
||||
This is a function that takes a Lexer object. This function should parse the
|
||||
@@ -99,21 +115,29 @@ def register(name, parse=None, lint=None, execute=None, predict=None, next=None,
|
||||
`init`
|
||||
True if this statement should be run at init-time. (If the statement
|
||||
is not already inside an init block, it's automatically placed inside
|
||||
an init 0 block.) This calls the execute function, in addition to the
|
||||
an init block.) This calls the execute function, in addition to the
|
||||
execute_init function.
|
||||
|
||||
`init_priority`
|
||||
An integer that determines the priority of initialisation of init block.
|
||||
|
||||
"""
|
||||
name = tuple(name.split())
|
||||
|
||||
registry[name] = dict(parse=parse,
|
||||
lint=lint,
|
||||
execute=execute,
|
||||
execute_init=execute_init,
|
||||
predict=predict,
|
||||
next=next,
|
||||
scry=scry,
|
||||
label=label,
|
||||
warp=warp)
|
||||
registry[name] = dict(
|
||||
parse=parse,
|
||||
lint=lint,
|
||||
execute=execute,
|
||||
execute_init=execute_init,
|
||||
predict=predict,
|
||||
next=next,
|
||||
scry=scry,
|
||||
label=label,
|
||||
warp=warp,
|
||||
)
|
||||
|
||||
if block not in [True, False, "script", "possible"]:
|
||||
raise Exception("Unknown \"block\" argument value: {}".format(block))
|
||||
|
||||
# The function that is called to create an ast.UserStatement.
|
||||
def parse_user_statement(l, loc):
|
||||
@@ -123,21 +147,21 @@ def register(name, parse=None, lint=None, execute=None, predict=None, next=None,
|
||||
rv = renpy.ast.UserStatement(loc, l.text, l.subblock)
|
||||
rv.translatable = translatable
|
||||
|
||||
if not block:
|
||||
if block is False:
|
||||
l.expect_noblock(" ".join(name) + " statement")
|
||||
l.advance()
|
||||
elif block is True:
|
||||
l.expect_block(" ".join(name) + " statement")
|
||||
elif block == "script":
|
||||
l.expect_block(" ".join(name) + " statement")
|
||||
rv.code_block = renpy.parser.parse_block(l.subblock_lexer())
|
||||
l.advance()
|
||||
else:
|
||||
l.expect_block(" ".join(name) + " statement")
|
||||
l.advance()
|
||||
|
||||
l.advance()
|
||||
|
||||
finally:
|
||||
renpy.exports.pop_error_handler()
|
||||
|
||||
if init and not l.init:
|
||||
rv = renpy.ast.Init(loc, [ rv ], 0)
|
||||
rv = renpy.ast.Init(loc, [rv], init_priority + l.init_offset)
|
||||
|
||||
return rv
|
||||
|
||||
|
||||
@@ -31,6 +31,18 @@ emulation mode.
|
||||
Ren'Py now better reports errors in text tags that require a value but are
|
||||
not given one.
|
||||
|
||||
The new :var:`_version` 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.
|
||||
|
||||
The :func:`Movie` 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.
|
||||
|
||||
The :func:`FilePageNext` and :func:`FilePagePrevious` functions now take
|
||||
arguments that control if the they can bring the player to the auto or
|
||||
quick save pages.
|
||||
|
||||
Translations
|
||||
------------
|
||||
|
||||
@@ -39,6 +51,8 @@ system, and use it to set the language. Please see
|
||||
:var:`config.enable_language_autodetect` and the :ref:`Translation <translation>`
|
||||
documentation for how this works.
|
||||
|
||||
The French, German, Korean, and Russian translations have been updated.
|
||||
|
||||
Fixes
|
||||
-----
|
||||
|
||||
@@ -53,10 +67,16 @@ if ``eileen happy`` exists and ``eileen happy unknown`` was shown, the
|
||||
additional attribute would be ignored.
|
||||
|
||||
Lint has been improved to deal with images that take attributes that are
|
||||
not in the image name, like layerd images.
|
||||
not in the image name, like layered images.
|
||||
|
||||
Ren'Py generates choice menu images that are suitable for use on the phone.
|
||||
|
||||
Android Fixes
|
||||
-------------
|
||||
|
||||
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.
|
||||
|
||||
|
||||
.. _renpy-7.1.1:
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1408,16 +1408,18 @@ screen quick_menu():
|
||||
|
||||
zorder 100
|
||||
|
||||
hbox:
|
||||
style_prefix "quick"
|
||||
if quick_menu:
|
||||
|
||||
xalign 0.5
|
||||
yalign 1.0
|
||||
hbox:
|
||||
style_prefix "quick"
|
||||
|
||||
textbutton _("Back") action Rollback()
|
||||
textbutton _("Skip") action Skip() alternate Skip(fast=True, confirm=True)
|
||||
textbutton _("Auto") action Preference("auto-forward", "toggle")
|
||||
textbutton _("Menu") action ShowMenu()
|
||||
xalign 0.5
|
||||
yalign 1.0
|
||||
|
||||
textbutton _("Back") action Rollback()
|
||||
textbutton _("Skip") action Skip() alternate Skip(fast=True, confirm=True)
|
||||
textbutton _("Auto") action Preference("auto-forward", "toggle")
|
||||
textbutton _("Menu") action ShowMenu()
|
||||
|
||||
|
||||
style window:
|
||||
@@ -1455,7 +1457,3 @@ style slider_pref_vbox:
|
||||
style slider_pref_slider:
|
||||
variant "small"
|
||||
xsize 900
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1823,16 +1823,11 @@ Screen Statements
|
||||
In addition to the screen statement, there are three Ren'Py script
|
||||
language statements that involve screens.
|
||||
|
||||
Two of these statements take a keyword argument list. This is a Python
|
||||
argument list, in parentheses, consisting of only keyword
|
||||
arguments. Positional arguments, extra positional arguments (*), and
|
||||
extra keyword arguments (**) are not allowed.
|
||||
|
||||
Show Screen
|
||||
-----------
|
||||
|
||||
The ``show screen`` statement causes a screen to be shown. It takes an
|
||||
screen name, and an optional argument list. If present, the arguments
|
||||
screen name, and an optional Python argument list. If present, the arguments
|
||||
are used to initialize the scope of the screen.
|
||||
|
||||
The show screen statement takes an optional ``nopredict`` keyword, that
|
||||
|
||||
+148
-148
@@ -1,187 +1,187 @@
|
||||
<ul class='sponsors'>
|
||||
<li> __skwrl__ (6.99.14.3–7.1.1)
|
||||
<li> Adia Alderson (6.99.13–7.1.1)
|
||||
<li> Aleema (6.99.13–7.1.1)
|
||||
<li> <a href="http://alexdodge.net/" rel="nofollow">Alex Dodge</a> (6.99.14–7.1.1)
|
||||
<li> <a href="https://rabidb.com/" rel="nofollow">AlexSSZ</a> (6.99.13–7.1.1)
|
||||
<li> <a href="https://alic-szecsei.com" rel="nofollow">Alic Szecsei</a> (6.99.14.3–7.1.1)
|
||||
<li> Anne Camlin (7.0–7.1.1)
|
||||
<li> __skwrl__ (6.99.14.3–7.1.2)
|
||||
<li> Adia Alderson (6.99.13–7.1.2)
|
||||
<li> Aleema (6.99.13–7.1.2)
|
||||
<li> <a href="http://alexdodge.net/" rel="nofollow">Alex Dodge</a> (6.99.14–7.1.2)
|
||||
<li> <a href="https://rabidb.com/" rel="nofollow">AlexSSZ</a> (6.99.13–7.1.2)
|
||||
<li> <a href="https://alic-szecsei.com" rel="nofollow">Alic Szecsei</a> (6.99.14.3–7.1.2)
|
||||
<li> Anne Camlin (7.0–7.1.2)
|
||||
<li> <a href="https://lemmasoft.renai.us/forums/viewtopic.php?f=51&t=34131" rel="nofollow">AR09FQF-AQ09FRF</a> (6.99.14.1–7.0)
|
||||
<li> Asatiir (6.99.13–7.0)
|
||||
<li> <a href="https://www.atwistedspirit.com/" rel="nofollow">ATwistedSpirit</a> (7.1–7.1.1)
|
||||
<li> <a href="https://www.atwistedspirit.com/" rel="nofollow">ATwistedSpirit</a> (7.1–7.1.2)
|
||||
<li> <a href="https://patchworkprincess.moe/" rel="nofollow">Azura (Vanessa Parker)</a> (7.0–7.1)
|
||||
<li> <a href="https://www.youtube.com/channel/UC3Xm0sk-rRCtD-yVp64WPWQ" rel="nofollow">BadGamer</a> (6.99.14.3–7.1.1)
|
||||
<li> <a href="https://www.youtube.com/channel/UC3Xm0sk-rRCtD-yVp64WPWQ" rel="nofollow">BadGamer</a> (6.99.14.3–7.1.2)
|
||||
<li> Belfort and Bastion (6.99.13–7.1)
|
||||
<li> Biotikos Development (6.99.13–7.1.1)
|
||||
<li> Biotikos Development (6.99.13–7.1.2)
|
||||
<li> Bob (6.99.13–7.0)
|
||||
<li> <a href="https://bobcgames.tumblr.com" rel="nofollow">Bob Conway</a> (6.99.14.1–7.1.1)
|
||||
<li> Bob Reus (7.1–7.1.1)
|
||||
<li> Booom313's tinker corner (6.99.14–7.1.1)
|
||||
<li> Boreas Bear (6.99.13–7.1.1)
|
||||
<li> <a href="http://boyslaughplus.moe" rel="nofollow">Boys Laugh +</a> (6.99.13–7.1.1)
|
||||
<li> <a href="https://bobcgames.tumblr.com" rel="nofollow">Bob Conway</a> (6.99.14.1–7.1.2)
|
||||
<li> Bob Reus (7.1–7.1.2)
|
||||
<li> Booom313's tinker corner (6.99.14–7.1.2)
|
||||
<li> Boreas Bear (6.99.13–7.1.2)
|
||||
<li> <a href="http://boyslaughplus.moe" rel="nofollow">Boys Laugh +</a> (6.99.13–7.1.2)
|
||||
<li> Brett Douglas (6.99.14–6.99.14.3)
|
||||
<li> Brimney (6.99.13–7.1.1)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.brunimultimedia.com" rel="nofollow">Bruni Multimedia</a> (6.99.14–7.1.1)
|
||||
<li> Brimney (6.99.13–7.1.2)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.brunimultimedia.com" rel="nofollow">Bruni Multimedia</a> (6.99.14–7.1.2)
|
||||
<li> <a href="http://www.bura.cl" rel="nofollow">BURA</a> (6.99.13)
|
||||
<li> Cameron Woodard (6.99.14.3–7.1.1)
|
||||
<li> Cara Hillstock (6.99.13–7.1.1)
|
||||
<li> <a href="https://www.celebrityhunter.com.br" rel="nofollow">Celebrity Hunter</a> (7.1–7.1.1)
|
||||
<li> Charlene Gilbert (6.99.13–7.1.1)
|
||||
<li> <a href="http://charliethegoldfish.com" rel="nofollow">Charlie Francis Cassidy</a> (6.99.13–7.1.1)
|
||||
<li> Chekhov's Ghost (7.1–7.1.1)
|
||||
<li> Cherry Kiss Games (6.99.14.1–7.1.1)
|
||||
<li> Chrysoula Tzavelas (6.99.13–7.1.1)
|
||||
<li> <a href="https://cloverfirefly.itch.io" rel="nofollow">cloverfirefly</a> (6.99.13–7.1.1)
|
||||
<li> CobaltCore (7.1.1)
|
||||
<li> CobraPL (7.1–7.1.1)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://obscurasoft.com/" rel="nofollow">Coming Out On Top</a> (6.99.13–7.1.1)
|
||||
<li> <a href="http://www.computerart.club/" rel="nofollow">computerart.club</a> (6.99.14–7.1.1)
|
||||
<li> CookieNomNom (7.1.1)
|
||||
<li> Crazy Cactus (6.99.14.3–7.1.1)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=http://cricketbat.me" rel="nofollow">cricketbat_</a> (7.0–7.1.1)
|
||||
<li> Cameron Woodard (6.99.14.3–7.1.2)
|
||||
<li> Cara Hillstock (6.99.13–7.1.2)
|
||||
<li> <a href="https://www.celebrityhunter.com.br" rel="nofollow">Celebrity Hunter</a> (7.1–7.1.2)
|
||||
<li> Charlene Gilbert (6.99.13–7.1.2)
|
||||
<li> <a href="http://charliethegoldfish.com" rel="nofollow">Charlie Francis Cassidy</a> (6.99.13–7.1.2)
|
||||
<li> Chekhov's Ghost (7.1–7.1.2)
|
||||
<li> Cherry Kiss Games (6.99.14.1–7.1.2)
|
||||
<li> Chrysoula Tzavelas (6.99.13–7.1.2)
|
||||
<li> <a href="https://cloverfirefly.itch.io" rel="nofollow">cloverfirefly</a> (6.99.13–7.1.2)
|
||||
<li> CobaltCore (7.1.1–7.1.2)
|
||||
<li> CobraPL (7.1–7.1.2)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://obscurasoft.com/" rel="nofollow">Coming Out On Top</a> (6.99.13–7.1.2)
|
||||
<li> <a href="http://www.computerart.club/" rel="nofollow">computerart.club</a> (6.99.14–7.1.2)
|
||||
<li> CookieNomNom (7.1.1–7.1.2)
|
||||
<li> Crazy Cactus (6.99.14.3–7.1.2)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=http://cricketbat.me" rel="nofollow">cricketbat_</a> (7.0–7.1.2)
|
||||
<li> <a href="http://cultofape.com" rel="nofollow">CultOfApe</a> (6.99.14–7.0)
|
||||
<li> Culture4Jam (6.99.13–7.1.1)
|
||||
<li> Daniel Burns (7.1–7.1.1)
|
||||
<li> Culture4Jam (6.99.13–7.1.2)
|
||||
<li> Daniel Burns (7.1–7.1.2)
|
||||
<li> <a href="http://dark-aii.net" rel="nofollow">Dark-Aii</a> (6.99.14.1–6.99.14.3)
|
||||
<li> <a href="http://www.darksirengames.com" rel="nofollow">DarkSirenGames</a> (6.99.13–7.1.1)
|
||||
<li> Darryl Taylor (7.0–7.1.1)
|
||||
<li> David Koster (6.99.14–7.1.1)
|
||||
<li> David Yingling (6.99.14.1–7.1.1)
|
||||
<li> Dee (7.1–7.1.1)
|
||||
<li> Denny Cheng (6.99.14.2–7.1.1)
|
||||
<li> Dharker Studios Ltd (6.99.13–6.99.14, 7.1.1)
|
||||
<li> <a href="http://coriginate.com" rel="nofollow">Ds110</a> (6.99.13–7.1.1)
|
||||
<li> DuoDevelopers (7.1.1)
|
||||
<li> E. William Brown (6.99.13–7.1.1)
|
||||
<li> <a href="https://twitter.com/WC_EchoFrost" rel="nofollow">EchoFrost (Watercress)</a> (6.99.14.2–7.1.1)
|
||||
<li> <a href="https://www.youtube.com/c/ElaineDoesCoding" rel="nofollow">ElaineDoesCoding</a> (7.0–7.1.1)
|
||||
<li> eric chi hung ng (7.0–7.1.1)
|
||||
<li> Euan 'Xolf' Robertson (6.99.13–7.1.1)
|
||||
<li> <a href="http://www.darksirengames.com" rel="nofollow">DarkSirenGames</a> (6.99.13–7.1.2)
|
||||
<li> Darryl Taylor (7.0–7.1.2)
|
||||
<li> David Koster (6.99.14–7.1.2)
|
||||
<li> David Yingling (6.99.14.1–7.1.2)
|
||||
<li> Dee (7.1–7.1.2)
|
||||
<li> Denny Cheng (6.99.14.2–7.1.2)
|
||||
<li> Dharker Studios Ltd (6.99.13–6.99.14, 7.1.1–7.1.2)
|
||||
<li> <a href="http://coriginate.com" rel="nofollow">Ds110</a> (6.99.13–7.1.2)
|
||||
<li> DuoDevelopers (7.1.1–7.1.2)
|
||||
<li> E. William Brown (6.99.13–7.1.2)
|
||||
<li> <a href="https://twitter.com/WC_EchoFrost" rel="nofollow">EchoFrost (Watercress)</a> (6.99.14.2–7.1.2)
|
||||
<li> <a href="https://www.youtube.com/c/ElaineDoesCoding" rel="nofollow">ElaineDoesCoding</a> (7.0–7.1.2)
|
||||
<li> eric chi hung ng (7.0–7.1.2)
|
||||
<li> Euan 'Xolf' Robertson (6.99.13–7.1.2)
|
||||
<li> Eve Hallows (6.99.13–6.99.14)
|
||||
<li> Exiscoming (6.99.14–7.1.1)
|
||||
<li> <a href="https://moonlitworks.com/" rel="nofollow">Eyzi</a> (7.0–7.1.1)
|
||||
<li> Fuseblower (7.0–7.1.1)
|
||||
<li> George (7.1–7.1.1)
|
||||
<li> <a href="http://www.gtbono.com" rel="nofollow">Giovanni Tempobono</a> (7.1–7.1.1)
|
||||
<li> <a href="https://goldengamebarn.com/" rel="nofollow">Golden Game Barn</a> (6.99.13–7.1.1)
|
||||
<li> <a href="https://twitter.com/goodtalesvn" rel="nofollow">Good Tales</a> (7.1–7.1.1)
|
||||
<li> Great Chicken Studio (6.99.14–7.1.1)
|
||||
<li> Grimiku (7.0–7.1.1)
|
||||
<li> Gunso (6.99.13–7.1.1)
|
||||
<li> HAG Productions (7.1.1)
|
||||
<li> <a href="http://hanb.jp" rel="nofollow">HanbitGaram (MOEWORK Entertainment)</a> (7.1–7.1.1)
|
||||
<li> Exiscoming (6.99.14–7.1.2)
|
||||
<li> <a href="https://moonlitworks.com/" rel="nofollow">Eyzi</a> (7.0–7.1.2)
|
||||
<li> Fuseblower (7.0–7.1.2)
|
||||
<li> George (7.1–7.1.2)
|
||||
<li> <a href="http://www.gtbono.com" rel="nofollow">Giovanni Tempobono</a> (7.1–7.1.2)
|
||||
<li> <a href="https://goldengamebarn.com/" rel="nofollow">Golden Game Barn</a> (6.99.13–7.1.2)
|
||||
<li> <a href="https://twitter.com/goodtalesvn" rel="nofollow">Good Tales</a> (7.1–7.1.2)
|
||||
<li> Great Chicken Studio (6.99.14–7.1.2)
|
||||
<li> Grimiku (7.0–7.1.2)
|
||||
<li> Gunso (6.99.13–7.1.2)
|
||||
<li> HAG Productions (7.1.1–7.1.2)
|
||||
<li> <a href="http://hanb.jp" rel="nofollow">HanbitGaram (MOEWORK Entertainment)</a> (7.1–7.1.2)
|
||||
<li> Happimochi (6.99.13–6.99.14)
|
||||
<li> HopesGaming (7.1.1)
|
||||
<li> HopesGaming (7.1.1–7.1.2)
|
||||
<li> <a href="https://ijemin.com" rel="nofollow">I_Jemin</a> (6.99.13–7.0)
|
||||
<li> <a href="https://irredeemable.net/" rel="nofollow">Irredeemable Games</a> (6.99.14–7.1.1)
|
||||
<li> J. C. Holder (6.99.13–7.1.1)
|
||||
<li> <a href="https://irredeemable.net/" rel="nofollow">Irredeemable Games</a> (6.99.14–7.1.2)
|
||||
<li> J. C. Holder (6.99.13–7.1.2)
|
||||
<li> James Tyner (6.99.13–7.1)
|
||||
<li> JeongPyo Lee (6.99.13–7.1.1)
|
||||
<li> Joanna B (6.99.13–7.1.1)
|
||||
<li> JoeBanks (7.1–7.1.1)
|
||||
<li> Jonas Kyratzes (7.1.1)
|
||||
<li> jonnymelabo (6.99.13–7.1.1)
|
||||
<li> JeongPyo Lee (6.99.13–7.1.2)
|
||||
<li> Joanna B (6.99.13–7.1.2)
|
||||
<li> JoeBanks (7.1–7.1.2)
|
||||
<li> Jonas Kyratzes (7.1.1–7.1.2)
|
||||
<li> jonnymelabo (6.99.13–7.1.2)
|
||||
<li> Josh Kaplan (6.99.13–6.99.14.2)
|
||||
<li> K. Starbuck (6.99.13–6.99.14)
|
||||
<li> Kampmichi (7.1.1)
|
||||
<li> Kayde Initials (6.99.13–7.1.1)
|
||||
<li> <a href="http://kexboy.com" rel="nofollow">KEXBOY</a> (6.99.13–7.1.1)
|
||||
<li> Kikai Digital (7.0–7.1.1)
|
||||
<li> <a href="http://www.gamesbykinmoku.com" rel="nofollow">Kinmoku</a> (6.99.13–7.1.1)
|
||||
<li> <a href="http://krsm94.web.fc2.com/" rel="nofollow">Klast Halc (crAsm)</a> (6.99.14.2–7.1.1)
|
||||
<li> Kosmos Games (6.99.14–7.1.1)
|
||||
<li> <a href="https://de.koubaibu.tech/" rel="nofollow">Koubaibu Technology Group</a> (7.1–7.1.1)
|
||||
<li> lain105/EckoMars (6.99.13–7.1.1)
|
||||
<li> LateWhiteRabbit (6.99.14–7.1.1)
|
||||
<li> <a href="https://lernakow.itch.io" rel="nofollow">Lernakow</a> (6.99.14.3–7.1.1)
|
||||
<li> LewdKitty (7.0–7.1.1)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.lewdlab.com/" rel="nofollow">Lewdlab</a> (6.99.14.1–7.1.1)
|
||||
<li> <a href="https://lemmasoft.renai.us/forums/viewtopic.php?f=66&t=48011&p=482643" rel="nofollow">Lezalith</a> (7.1–7.1.1)
|
||||
<li> Lictor (6.99.14.2–7.1.1)
|
||||
<li> Little Napoleon (7.1–7.1.1)
|
||||
<li> <a href="http://trash.moe/" rel="nofollow">Lore</a> (6.99.13–7.1.1)
|
||||
<li> Luke Jackson (6.99.13–7.1.1)
|
||||
<li> <a href="http://luscious-spirit-studios.tumblr.com/" rel="nofollow">Luscious Spirit Studios</a> (6.99.13–7.1.1)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.patreon.com/Luxee" rel="nofollow">Luxee</a> (6.99.14.3–7.1.1)
|
||||
<li> Maeve Bandruid (6.99.13–7.1.1)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.patreon.com/manitu" rel="nofollow">MANITU Games CO.</a> (6.99.13–7.1.1)
|
||||
<li> <a href="https://manorstories.fr" rel="nofollow">ManorStories</a> (6.99.14–7.1.1)
|
||||
<li> <a href="http://www.marionettecode.com/" rel="nofollow">Marionette</a> (6.99.14–7.1.1)
|
||||
<li> Kampmichi (7.1.1–7.1.2)
|
||||
<li> Kayde Initials (6.99.13–7.1.2)
|
||||
<li> <a href="http://kexboy.com" rel="nofollow">KEXBOY</a> (6.99.13–7.1.2)
|
||||
<li> Kikai Digital (7.0–7.1.2)
|
||||
<li> <a href="http://www.gamesbykinmoku.com" rel="nofollow">Kinmoku</a> (6.99.13–7.1.2)
|
||||
<li> <a href="http://krsm94.web.fc2.com/" rel="nofollow">Klast Halc (crAsm)</a> (6.99.14.2–7.1.2)
|
||||
<li> Kosmos Games (6.99.14–7.1.2)
|
||||
<li> <a href="https://de.koubaibu.tech/" rel="nofollow">Koubaibu Technology Group</a> (7.1–7.1.2)
|
||||
<li> lain105/EckoMars (6.99.13–7.1.2)
|
||||
<li> LateWhiteRabbit (6.99.14–7.1.2)
|
||||
<li> <a href="https://lernakow.itch.io" rel="nofollow">Lernakow</a> (6.99.14.3–7.1.2)
|
||||
<li> LewdKitty (7.0–7.1.2)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.lewdlab.com/" rel="nofollow">Lewdlab</a> (6.99.14.1–7.1.2)
|
||||
<li> <a href="https://lemmasoft.renai.us/forums/viewtopic.php?f=66&t=48011&p=482643" rel="nofollow">Lezalith</a> (7.1–7.1.2)
|
||||
<li> Lictor (6.99.14.2–7.1.2)
|
||||
<li> Little Napoleon (7.1–7.1.2)
|
||||
<li> <a href="http://trash.moe/" rel="nofollow">Lore</a> (6.99.13–7.1.2)
|
||||
<li> Luke Jackson (6.99.13–7.1.2)
|
||||
<li> <a href="http://luscious-spirit-studios.tumblr.com/" rel="nofollow">Luscious Spirit Studios</a> (6.99.13–7.1.2)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.patreon.com/Luxee" rel="nofollow">Luxee</a> (6.99.14.3–7.1.2)
|
||||
<li> Maeve Bandruid (6.99.13–7.1.2)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.patreon.com/manitu" rel="nofollow">MANITU Games CO.</a> (6.99.13–7.1.2)
|
||||
<li> <a href="https://manorstories.fr" rel="nofollow">ManorStories</a> (6.99.14–7.1.2)
|
||||
<li> <a href="http://www.marionettecode.com/" rel="nofollow">Marionette</a> (6.99.14–7.1.2)
|
||||
<li> MAW.3D.Art (6.99.13)
|
||||
<li> Max J Sher (6.99.13–7.1.1)
|
||||
<li> MCatter Dev (7.1–7.1.1)
|
||||
<li> <a href="https://meagantrott.com" rel="nofollow">Meagan Trott</a> (6.99.13–7.1.1)
|
||||
<li> <a href="http://metasepia.icecavern.net" rel="nofollow">Metasepia Games</a> (6.99.13–7.1.1)
|
||||
<li> <a href="http://www.meyaoi.com" rel="nofollow">Meyaoi Games</a> (6.99.13–6.99.14, 6.99.14.3–7.1.1)
|
||||
<li> Meyvol (6.99.14.1–7.1.1)
|
||||
<li> Michael Simon (7.1.1)
|
||||
<li> Michaela Laws (6.99.13–7.1.1)
|
||||
<li> Max J Sher (6.99.13–7.1.2)
|
||||
<li> MCatter Dev (7.1–7.1.2)
|
||||
<li> <a href="https://meagantrott.com" rel="nofollow">Meagan Trott</a> (6.99.13–7.1.2)
|
||||
<li> <a href="http://metasepia.icecavern.net" rel="nofollow">Metasepia Games</a> (6.99.13–7.1.2)
|
||||
<li> <a href="http://www.meyaoi.com" rel="nofollow">Meyaoi Games</a> (6.99.13–6.99.14, 6.99.14.3–7.1.2)
|
||||
<li> Meyvol (6.99.14.1–7.1.2)
|
||||
<li> Michael Simon (7.1.1–7.1.2)
|
||||
<li> Michaela Laws (6.99.13–7.1.2)
|
||||
<li> <a href="http://www.milkteestudios.com" rel="nofollow">Milktee Studios</a> (7.0–7.1)
|
||||
<li> Miss Skizzors (7.0–7.1.1)
|
||||
<li> Montse Latre (7.1.1)
|
||||
<li> <a href="https://mrvaldez.ph/" rel="nofollow">MrValdez</a> (7.0–7.1.1)
|
||||
<li> Miss Skizzors (7.0–7.1.2)
|
||||
<li> Montse Latre (7.1.1–7.1.2)
|
||||
<li> <a href="https://mrvaldez.ph/" rel="nofollow">MrValdez</a> (7.0–7.1.2)
|
||||
<li> <a href="https://ms45.itch.io" rel="nofollow">Ms .45</a> (6.99.13)
|
||||
<li> nasredin (6.99.14.3–7.1.1)
|
||||
<li> Natalie Van Sistine (7.0–7.1.1)
|
||||
<li> <a href="https://cafe.naver.com/vmo.cafe" rel="nofollow">Naver cafe VMO</a> (7.1–7.1.1)
|
||||
<li> nasredin (6.99.14.3–7.1.2)
|
||||
<li> Natalie Van Sistine (7.0–7.1.2)
|
||||
<li> <a href="https://cafe.naver.com/vmo.cafe" rel="nofollow">Naver cafe VMO</a> (7.1–7.1.2)
|
||||
<li> <a href="http://cafe.naver.com/vmo" rel="nofollow">NaverCafe VMO</a> (6.99.13–7.1)
|
||||
<li> Neigan (7.0)
|
||||
<li> Nicholas Swenson (6.99.14–7.1.1)
|
||||
<li> <a href="https://www.patreon.com/nikraria" rel="nofollow">nikraria</a> (6.99.13–7.1.1)
|
||||
<li> Nova Alamak (6.99.14.3–7.1.1)
|
||||
<li> Nicholas Swenson (6.99.14–7.1.2)
|
||||
<li> <a href="https://www.patreon.com/nikraria" rel="nofollow">nikraria</a> (6.99.13–7.1.2)
|
||||
<li> Nova Alamak (6.99.14.3–7.1.2)
|
||||
<li> <a href="http://devety.com" rel="nofollow">Oleksii olety Kyrylchuk</a> (6.99.14.1–6.99.14.2)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.patreon.com/palantogames" rel="nofollow">Palanto Games</a> (7.0–7.1.1)
|
||||
<li> Panthera Morag (6.99.13–7.1.1)
|
||||
<li> Patchwork Princess (7.1–7.1.1)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=https://www.patreon.com/palantogames" rel="nofollow">Palanto Games</a> (7.0–7.1.2)
|
||||
<li> Panthera Morag (6.99.13–7.1.2)
|
||||
<li> Patchwork Princess (7.1–7.1.2)
|
||||
<li> Patricia (6.99.13–7.1.1)
|
||||
<li> <a href="http://peachpattch.com/" rel="nofollow">peachpattch</a> (6.99.14–7.1.1)
|
||||
<li> philat (6.99.14.1–7.1.1)
|
||||
<li> plasterbrain (6.99.13–7.1.1)
|
||||
<li> <a href="http://peachpattch.com/" rel="nofollow">peachpattch</a> (6.99.14–7.1.2)
|
||||
<li> philat (6.99.14.1–7.1.2)
|
||||
<li> plasterbrain (6.99.13–7.1.2)
|
||||
<li> Ploppertje (6.99.13–6.99.14.3)
|
||||
<li> Podge (6.99.13–7.1.1)
|
||||
<li> Podge (6.99.13–7.1.2)
|
||||
<li> Puriwit Sesupaponphong (6.99.13)
|
||||
<li> Puriwit Sesupaponphong (6.99.13–7.1)
|
||||
<li> Pólyí Konrád (7.1–7.1.1)
|
||||
<li> <a href="http://www.cottoncandycyanide.com/" rel="nofollow">Quantum Suicide</a> (7.1–7.1.1)
|
||||
<li> <a href="http://razzartvisual.com/" rel="nofollow">Razz</a> (6.99.13–7.1.1)
|
||||
<li> <a href="http://www.cottoncandycyanide.com/" rel="nofollow">Quantum Suicide</a> (7.1–7.1.2)
|
||||
<li> <a href="http://razzartvisual.com/" rel="nofollow">Razz</a> (6.99.13–7.1.2)
|
||||
<li> <a href="https://twitter.com/ragnarhomsar" rel="nofollow">Realga</a> (7.0–7.1)
|
||||
<li> René Dudfield (6.99.13–7.1.1)
|
||||
<li> Richard (6.99.14–7.1.1)
|
||||
<li> <a href="http://impqueen.com/" rel="nofollow">Rinmaru</a> (6.99.13–7.1.1)
|
||||
<li> Rizia Praja (6.99.14.1–7.1.1)
|
||||
<li> René Dudfield (6.99.13–7.1.2)
|
||||
<li> Richard (6.99.14–7.1.2)
|
||||
<li> <a href="http://impqueen.com/" rel="nofollow">Rinmaru</a> (6.99.13–7.1.2)
|
||||
<li> Rizia Praja (6.99.14.1–7.1.2)
|
||||
<li> Robyn Rosenfeld (7.1)
|
||||
<li> <a href="http://sunkoiwish.com/" rel="nofollow">Royce A Xaiyeon</a> (6.99.13–7.1.1)
|
||||
<li> Ryan Balgos (6.99.14–7.1.1)
|
||||
<li> <a href="http://sunkoiwish.com/" rel="nofollow">Royce A Xaiyeon</a> (6.99.13–7.1.2)
|
||||
<li> Ryan Balgos (6.99.14–7.1.2)
|
||||
<li> Ryan Whited (6.99.14–7.1)
|
||||
<li> <a href="https://saiffyros.wordpress.com/" rel="nofollow">Saiffyros</a> (6.99.14–7.1.1)
|
||||
<li> Sam Yang (6.99.13–7.1.1)
|
||||
<li> Simply Aria (6.99.14–7.1.1)
|
||||
<li> <a href="http://sleepyagents.co.uk" rel="nofollow">Sleepy Agents</a> (6.99.13–7.1.1)
|
||||
<li> Snowlocke (7.0–7.1.1)
|
||||
<li> <a href="https://saiffyros.wordpress.com/" rel="nofollow">Saiffyros</a> (6.99.14–7.1.2)
|
||||
<li> Sam Yang (6.99.13–7.1.2)
|
||||
<li> Simply Aria (6.99.14–7.1.2)
|
||||
<li> <a href="http://sleepyagents.co.uk" rel="nofollow">Sleepy Agents</a> (6.99.13–7.1.2)
|
||||
<li> Snowlocke (7.0–7.1.2)
|
||||
<li> <a href="http://store.steampowered.com/app/570350/Sorry_Entschuldigung__A_Psychological_Horror_Visual_Novel/" rel="nofollow">Sorry. (Entschuldigung)</a> (6.99.14.2–7.1)
|
||||
<li> Spyros Panagiotopoulos (6.99.14–7.1)
|
||||
<li> Steamlynx (6.99.14.1–7.1.1)
|
||||
<li> Stefan Gagne (6.99.13–7.1.1)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=http://www.patreon.com/errilhl" rel="nofollow">Studio Errilhl</a> (6.99.14.3–7.1.1)
|
||||
<li> Taosym (6.99.13–7.1.1)
|
||||
<li> Steamlynx (6.99.14.1–7.1.2)
|
||||
<li> Stefan Gagne (6.99.13–7.1.2)
|
||||
<li> <a href="https://www.renpy.org/agegate?url=http://www.patreon.com/errilhl" rel="nofollow">Studio Errilhl</a> (6.99.14.3–7.1.2)
|
||||
<li> Taosym (6.99.13–7.1.2)
|
||||
<li> Teofilo Hurtado (6.99.14–7.1.1)
|
||||
<li> Thomas Charlie (6.99.13–7.1.1)
|
||||
<li> Timothy Landreth (6.99.13–7.1.1)
|
||||
<li> Timothy Young (6.99.14.1–7.1.1)
|
||||
<li> TJ Huckabee (6.99.13–7.1.1)
|
||||
<li> Thomas Charlie (6.99.13–7.1.2)
|
||||
<li> Timothy Landreth (6.99.13–7.1.2)
|
||||
<li> Timothy Young (6.99.14.1–7.1.2)
|
||||
<li> TJ Huckabee (6.99.13–7.1.2)
|
||||
<li> ToastCrust (6.99.13–6.99.14)
|
||||
<li> Tobias Wüthrich (6.99.13–6.99.14.3)
|
||||
<li> <a href="http://tremmigames.tk/" rel="nofollow">tremmiGames</a> (7.0–7.1.1)
|
||||
<li> trooper6 (6.99.13–7.1.1)
|
||||
<li> <a href="https://www.youtube.com/tryinmorning" rel="nofollow">tryinmorning</a> (6.99.13–7.1.1)
|
||||
<li> <a href="https://studiomugenjohncel.wordpress.com/" rel="nofollow">Uncle Mugen (Mugenjohncel</a> (6.99.14.2–7.1.1)
|
||||
<li> <a href="http://www.visualsaga.com/" rel="nofollow">Visual Saga</a> (6.99.13–7.1.1)
|
||||
<li> <a href="http://tremmigames.tk/" rel="nofollow">tremmiGames</a> (7.0–7.1.2)
|
||||
<li> trooper6 (6.99.13–7.1.2)
|
||||
<li> <a href="https://www.youtube.com/tryinmorning" rel="nofollow">tryinmorning</a> (6.99.13–7.1.2)
|
||||
<li> <a href="https://studiomugenjohncel.wordpress.com/" rel="nofollow">Uncle Mugen (Mugenjohncel</a> (6.99.14.2–7.1.2)
|
||||
<li> <a href="http://www.visualsaga.com/" rel="nofollow">Visual Saga</a> (6.99.13–7.1.2)
|
||||
<li> Vollschauer (6.99.13–6.99.14)
|
||||
<li> <a href="http://vxlloyd.com" rel="nofollow">VX Lloyd</a> (6.99.14.3–7.0)
|
||||
<li> Wayne Wollesen (6.99.14.3–7.1.1)
|
||||
<li> <a href="https://www.facebook.com/weeabooriot" rel="nofollow">Weeabooriot Cosplay</a> (6.99.13–7.1.1)
|
||||
<li> <a href="https://arcaniinteractive.com/" rel="nofollow">William Lucht</a> (7.0–7.1.1)
|
||||
<li> William Tumeo (6.99.13–7.1.1)
|
||||
<li> <a href="http://winterwolves.com/ambersmagicshop.htm" rel="nofollow">Winter Wolves</a> (6.99.13–7.1.1)
|
||||
<li> <a href="http://astralore.com/" rel="nofollow">Yakmala!</a> (6.99.13–7.1.1)
|
||||
<li> <a href="https://www.facebook.com/weeabooriot" rel="nofollow">Weeabooriot Cosplay</a> (6.99.13–7.1.2)
|
||||
<li> <a href="https://arcaniinteractive.com/" rel="nofollow">William Lucht</a> (7.0–7.1.2)
|
||||
<li> William Tumeo (6.99.13–7.1.2)
|
||||
<li> <a href="http://winterwolves.com/ambersmagicshop.htm" rel="nofollow">Winter Wolves</a> (6.99.13–7.1.2)
|
||||
<li> <a href="http://astralore.com/" rel="nofollow">Yakmala!</a> (6.99.13–7.1.2)
|
||||
</ul>
|
||||
|
||||
@@ -127,6 +127,15 @@ and rolled-back when rollback occurs.
|
||||
|
||||
Controls of if skipping is allowed.
|
||||
|
||||
.. var:: _version = ...
|
||||
|
||||
This is set to :var:`config.version` when a new game is started. It can be
|
||||
use by the ``after_load`` label or :var:`config.after_load_callbacks` to
|
||||
determine which upgrades need to be done.
|
||||
|
||||
This is only set once, upon the initial start. After that, the game is
|
||||
responsible for updating _version as necessary.
|
||||
|
||||
.. var:: _window = False
|
||||
|
||||
This set by the ``window show`` and ``window hide`` statements, and indirectly
|
||||
|
||||
@@ -799,10 +799,10 @@ screen preferences():
|
||||
style_prefix "radio"
|
||||
label _("Language")
|
||||
|
||||
textbutton "English" text_font "DejaVuSans.ttf"action Language(None)
|
||||
textbutton "Français" text_font "DejaVuSans.ttf"action Language("french")
|
||||
textbutton "English" text_font "DejaVuSans.ttf" action Language(None)
|
||||
textbutton "Français" text_font "DejaVuSans.ttf" action Language("french")
|
||||
textbutton "Русский" text_font "DejaVuSans.ttf" action Language("russian")
|
||||
textbutton "Bahasa Melayu" text_font "DejaVuSans.ttf"action Language("malay")
|
||||
textbutton "Bahasa Melayu" text_font "DejaVuSans.ttf" action Language("malay")
|
||||
|
||||
#end language_picker
|
||||
|
||||
|
||||
@@ -187,7 +187,7 @@ translate french strings:
|
||||
|
||||
# screens.rpy:782
|
||||
old "Rollback Side"
|
||||
new "Rollback"
|
||||
new "Rembobinage côté"
|
||||
|
||||
# screens.rpy:783
|
||||
#old "Disable"
|
||||
@@ -215,7 +215,7 @@ translate french strings:
|
||||
|
||||
# screens.rpy:800
|
||||
old "Language"
|
||||
new "Langage"
|
||||
new "Langue"
|
||||
|
||||
# screens.rpy:815
|
||||
old "Text Speed"
|
||||
@@ -351,7 +351,7 @@ translate french strings:
|
||||
|
||||
# screens.rpy:1111
|
||||
old "Mouse Wheel Up\nClick Rollback Side"
|
||||
new "Molette de souris vers le haut\nClic dans le sens Rollback"
|
||||
new "Molette de souris vers le haut\nClic du côté rembobinage"
|
||||
|
||||
# screens.rpy:1115
|
||||
old "Mouse Wheel Down"
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user