Compare commits
96 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 48d19bb038 | |||
| 79bda8a568 | |||
| 1fefbeba52 | |||
| 1336b5cfb8 | |||
| 6d0b674c30 | |||
| 935a25490a | |||
| 5f73d6f1b2 | |||
| e42c774cd4 | |||
| 595e4d45bd | |||
| b46eabc2af | |||
| c42667b197 | |||
| 2c6e08247f | |||
| 32ab62f5dd | |||
| 003ac717d8 | |||
| e4089d2dce | |||
| 4076bc8ae9 | |||
| 00750cb5d5 | |||
| 13831d4c39 | |||
| 33552beb80 | |||
| 0da702db49 | |||
| 9d8329c766 | |||
| efc671e647 | |||
| 5f42c6bff9 | |||
| b2456f5a16 | |||
| 2ad7cebd7a | |||
| e6e11dab9f | |||
| 6351d60213 | |||
| 2928e5495c | |||
| 72a6d5d347 | |||
| ffd5eddaf9 | |||
| c34b2da03b | |||
| bd943f16a1 | |||
| 27b4c46013 | |||
| 26046d3b15 | |||
| 9ebe782866 | |||
| 327f6a32d5 | |||
| c8da44781d | |||
| a78af4ad86 | |||
| 495d980277 | |||
| 07ab2c9e52 | |||
| c48e102658 | |||
| a40d302500 | |||
| 53f2d81f88 | |||
| 14ed5f4f76 | |||
| a53b06834d | |||
| e5d8581a7e | |||
| 325a349092 | |||
| bb0a201e2a | |||
| 8ad44080ae | |||
| c41b740ae6 | |||
| 67e508c979 | |||
| ba48755589 | |||
| d6cf8b37ab | |||
| a7e9d39c1d | |||
| 0e0ae03baa | |||
| 921ddb07f7 | |||
| 5d59d32634 | |||
| 06366a8f8f | |||
| b2b222f23e | |||
| be8f94443f | |||
| 61e1e025ce | |||
| 3837df39be | |||
| 850fc555e2 | |||
| af202584db | |||
| dacbf5515e | |||
| 147e46dbee | |||
| 1ce2f2b2ce | |||
| 4242ff838e | |||
| 4133172fab | |||
| f69768bad9 | |||
| f39d53cbac | |||
| d38dbc79b2 | |||
| c275244741 | |||
| 3b1161c2a4 | |||
| 5573b3c2dc | |||
| d6ca5e6992 | |||
| 15c6fdf8c1 | |||
| 5e02e88ec0 | |||
| 3337049968 | |||
| 2565157a5a | |||
| 952e29e737 | |||
| 276e4b1808 | |||
| 4f4dcc1927 | |||
| 0fecd1f70a | |||
| 46c80bfae6 | |||
| 5d5954b150 | |||
| 7e1643b734 | |||
| bf9d78ce17 | |||
| b07b4db4cc | |||
| d104db85a0 | |||
| fcadb205db | |||
| 961277a751 | |||
| c4e6cb8a06 | |||
| 83e05fca2e | |||
| b2b80bbfc3 | |||
| 52fba62616 |
Vendored
+6
@@ -186,6 +186,12 @@
|
||||
"foreground": "#ffffff"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "renpy.meta.color.#f00",
|
||||
"settings": {
|
||||
"foreground": "#f00"
|
||||
}
|
||||
},
|
||||
{
|
||||
"scope": "text.notes.info",
|
||||
"settings": {
|
||||
|
||||
+9
-1
@@ -53,4 +53,12 @@ The quality is not perfect, but it should make sense to any developer
|
||||
fluent in Finnish but not English. Adjustments will be made if better
|
||||
translations are suggested.
|
||||
|
||||
* Lari Liuhamo (Diapolo10) <lari.liuhamo+github116504@gmail.com>
|
||||
* Lari Liuhamo (Diapolo10) <lari.liuhamo+github116504@gmail.com>
|
||||
|
||||
Ukrainian
|
||||
---------
|
||||
|
||||
Translation to Ukrainian language. Most of translations provided by Veydzher.
|
||||
Feel free to report me any mistakes, fixes or improvements.
|
||||
|
||||
* Veydzher <veydzherdgswift008@gmail.com>
|
||||
|
||||
@@ -8,13 +8,15 @@ import sys
|
||||
|
||||
from renpy import version_tuple # @UnresolvedImport
|
||||
|
||||
branch = os.popen("git branch --show-current").read().strip()
|
||||
|
||||
SOURCE = [
|
||||
"/home/tom/ab/renpy",
|
||||
"/home/tom/ab/renpy-build",
|
||||
"/home/tom/ab/renpy-build-" + branch,
|
||||
"/home/tom/ab/pygame_sdl2",
|
||||
"/home/tom/ab/renpy-build/renpyweb",
|
||||
]
|
||||
|
||||
|
||||
from renpy.versions import generate_vc_version
|
||||
|
||||
version = generate_vc_version()["version"]
|
||||
@@ -22,6 +24,9 @@ short_version = version.rpartition(".")[0]
|
||||
major = version.partition(".")[0]
|
||||
print("Version", version)
|
||||
|
||||
if major == '7':
|
||||
SOURCE.append("/home/tom/ab/renpy-build-fix/renpyweb")
|
||||
|
||||
ap = argparse.ArgumentParser()
|
||||
|
||||
ap.add_argument("--release", action="store_true")
|
||||
|
||||
@@ -216,7 +216,7 @@ screen front_page_project:
|
||||
|
||||
textbutton _("Android") action Jump("android")
|
||||
textbutton _("iOS") action Jump("ios")
|
||||
textbutton _("Web") + " " + _("(Beta)") action Jump("web")
|
||||
textbutton _("Web") action Jump("web")
|
||||
textbutton _("Generate Translations") action Jump("translate")
|
||||
textbutton _("Extract Dialogue") action Jump("extract_dialogue")
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ init python in project:
|
||||
|
||||
try:
|
||||
with open(os.path.join(self.path, "project.json"), "w") as f:
|
||||
json.dump(self.data, f)
|
||||
json.dump(self.data, f, indent=2)
|
||||
except Exception:
|
||||
self.load_data()
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# 00action_file.rpy:26
|
||||
@@ -155,7 +155,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00action_file.rpy:240
|
||||
old "%b %d, %H:%M"
|
||||
new "%b %d, %H:%M"
|
||||
new "%d %b, %H:%M"
|
||||
|
||||
# 00action_file.rpy:353
|
||||
old "Save slot %s: [text]"
|
||||
@@ -207,7 +207,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00director.rpy:708
|
||||
old "The interactive director is not enabled here."
|
||||
new "Інтерактивний режисер тут не ввімкнений."
|
||||
new "Інтерактивний режисер тут не ввімкнено."
|
||||
|
||||
# 00director.rpy:1481
|
||||
old "⬆"
|
||||
@@ -223,7 +223,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00director.rpy:1561
|
||||
old "(statement)"
|
||||
new "(функція)"
|
||||
new "(оператор)"
|
||||
|
||||
# 00director.rpy:1562
|
||||
old "(tag)"
|
||||
@@ -235,7 +235,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00director.rpy:1564
|
||||
old "(transform)"
|
||||
new "(трансформація)"
|
||||
new "(перетворення)"
|
||||
|
||||
# 00director.rpy:1589
|
||||
old "(transition)"
|
||||
@@ -247,7 +247,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00director.rpy:1602
|
||||
old "(filename)"
|
||||
new "(ім’я файла)"
|
||||
new "(назва файлу)"
|
||||
|
||||
# 00director.rpy:1631
|
||||
old "Change"
|
||||
@@ -267,7 +267,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00director.rpy:1674
|
||||
old "Statement:"
|
||||
new "Функція:"
|
||||
new "Оператор:"
|
||||
|
||||
# 00director.rpy:1695
|
||||
old "Tag:"
|
||||
@@ -279,7 +279,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00director.rpy:1729
|
||||
old "Transforms:"
|
||||
new "Трансформації:"
|
||||
new "Перетворення:"
|
||||
|
||||
# 00director.rpy:1748
|
||||
old "Behind:"
|
||||
@@ -295,7 +295,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00director.rpy:1803
|
||||
old "Audio Filename:"
|
||||
new "Ім’я аудіофайлу::"
|
||||
new "Назва аудіофайлу:"
|
||||
|
||||
# 00gui.rpy:370
|
||||
old "Are you sure?"
|
||||
@@ -311,7 +311,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00gui.rpy:373
|
||||
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
|
||||
new "Завантаження гри приведе до втрати незбереженого прогресу.\nВи дійсно бажаєте це зробити?"
|
||||
new "Завантаження призведе до втрати незбереженого поступу.\nВи дійсно бажаєте продовжити?"
|
||||
|
||||
# 00gui.rpy:374
|
||||
old "Are you sure you want to quit?"
|
||||
@@ -319,7 +319,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00gui.rpy:375
|
||||
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
|
||||
new "Ви дійсно бажаєте повернутися до головного меню?\nЦе призведе до втрати незбереженого прогресу."
|
||||
new "Ви дійсно бажаєте повернутися до головного меню?\nЦя дія призведе до втрати незбереженого поступу."
|
||||
|
||||
# 00gui.rpy:376
|
||||
old "Are you sure you want to end the replay?"
|
||||
@@ -331,7 +331,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00gui.rpy:378
|
||||
old "Are you sure you want to skip to the next choice?"
|
||||
new "Ви дійсно бажаєте пропустити все до наступного вибору?"
|
||||
new "Ви дійсно бажаєте пропускати до наступного вибору?"
|
||||
|
||||
# 00gui.rpy:379
|
||||
old "Are you sure you want to skip unseen dialogue to the next choice?"
|
||||
@@ -351,7 +351,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00library.rpy:147
|
||||
old "Clipboard voicing enabled. "
|
||||
new "Озвучення буфера обміну увімкнено."
|
||||
new "Озвучення буфера обміну ввімкнено."
|
||||
|
||||
# 00library.rpy:148
|
||||
old "Self-voicing enabled. "
|
||||
@@ -371,11 +371,11 @@ translate ukrainian strings:
|
||||
|
||||
# 00library.rpy:153
|
||||
old "horizontal scroll"
|
||||
new "горизонтальне прокручування"
|
||||
new "горизонтальна прокрутка"
|
||||
|
||||
# 00library.rpy:154
|
||||
old "vertical scroll"
|
||||
new "вертикальне прокручування"
|
||||
new "вертикальна прокрутка"
|
||||
|
||||
# 00library.rpy:155
|
||||
old "activate"
|
||||
@@ -411,7 +411,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:228
|
||||
old "skip transitions"
|
||||
new "пропустити переходи"
|
||||
new "пропускати переходи"
|
||||
|
||||
# 00preferences.rpy:230
|
||||
old "video sprites"
|
||||
@@ -423,7 +423,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:248
|
||||
old "text speed"
|
||||
new "швидкість тексту"
|
||||
new "швидкість друку тексту"
|
||||
|
||||
# 00preferences.rpy:256
|
||||
old "joystick"
|
||||
@@ -435,19 +435,19 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:263
|
||||
old "skip"
|
||||
new "пропустити"
|
||||
new "пропускати"
|
||||
|
||||
# 00preferences.rpy:266
|
||||
old "skip unseen [text]"
|
||||
new "пропустити весь [text]"
|
||||
new "пропускати весь [text]"
|
||||
|
||||
# 00preferences.rpy:271
|
||||
old "skip unseen text"
|
||||
new "пропускати увесь текст"
|
||||
new "пропускати весь текст"
|
||||
|
||||
# 00preferences.rpy:273
|
||||
old "begin skipping"
|
||||
new "почати пропускати"
|
||||
new "почати пропуск"
|
||||
|
||||
# 00preferences.rpy:277
|
||||
old "after choices"
|
||||
@@ -471,7 +471,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:310
|
||||
old "auto-forward after click"
|
||||
new "перемотка після дотику"
|
||||
new "перемотка після клацу"
|
||||
|
||||
# 00preferences.rpy:319
|
||||
old "automatic move"
|
||||
@@ -479,7 +479,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:328
|
||||
old "wait for voice"
|
||||
new "чекати голос"
|
||||
new "чекати на голос"
|
||||
|
||||
# 00preferences.rpy:337
|
||||
old "voice sustain"
|
||||
@@ -495,7 +495,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:364
|
||||
old "debug voicing"
|
||||
new "режим налагодження синтезу мови"
|
||||
new "налагоджувальне озвучення"
|
||||
|
||||
# 00preferences.rpy:373
|
||||
old "emphasize audio"
|
||||
@@ -507,7 +507,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:392
|
||||
old "gl powersave"
|
||||
new "економія енергії"
|
||||
new "енергозбереження"
|
||||
|
||||
# 00preferences.rpy:398
|
||||
old "gl framerate"
|
||||
@@ -523,7 +523,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:414
|
||||
old "sound volume"
|
||||
new "гучність звук. ефектів"
|
||||
new "гучність звукових ефектів"
|
||||
|
||||
# 00preferences.rpy:415
|
||||
old "voice volume"
|
||||
@@ -535,7 +535,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:417
|
||||
old "mute sound"
|
||||
new "без звук. ефектів"
|
||||
new "без звукових ефектів"
|
||||
|
||||
# 00preferences.rpy:418
|
||||
old "mute voice"
|
||||
@@ -547,19 +547,19 @@ translate ukrainian strings:
|
||||
|
||||
# 00preferences.rpy:500
|
||||
old "Clipboard voicing enabled. Press 'shift+C' to disable."
|
||||
new "Озвучення буфера обміну увімкнено. Натисніть 'shift+C', щоб вимкнути."
|
||||
new "Озвучення буфера обміну ввімкнено. Натисніть «Shift+C», щоб вимкнути."
|
||||
|
||||
# 00preferences.rpy:502
|
||||
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
|
||||
new "Синтез мовлення має сказати \"[renpy.display.tts.last]\". Натисніть 'alt+shift+V', щоб вимкнути."
|
||||
new "Синтез мовлення сказав би «[renpy.display.tts.last]». Натисніть «Alt+Shift+V», щоб вимкнути."
|
||||
|
||||
# 00preferences.rpy:504
|
||||
old "Self-voicing enabled. Press 'v' to disable."
|
||||
new "Синтез мовлення увімкнено. Натисніть 'v', щоб вимкнути його."
|
||||
new "Синтез мовлення увімкнено. Натисніть «V», щоб вимкнути."
|
||||
|
||||
# _compat\gamemenu.rpym:198
|
||||
old "Empty Slot."
|
||||
new "Порожній комірка."
|
||||
new "Порожня комірка."
|
||||
|
||||
# _compat\gamemenu.rpym:355
|
||||
old "Previous"
|
||||
@@ -595,7 +595,7 @@ translate ukrainian strings:
|
||||
|
||||
# _developer\developer.rpym:51
|
||||
old "Image Location Picker"
|
||||
new "Вибір розташування зображень"
|
||||
new "Вибирач розташування зображень"
|
||||
|
||||
# _developer\developer.rpym:53
|
||||
old "Filename List"
|
||||
@@ -603,15 +603,15 @@ translate ukrainian strings:
|
||||
|
||||
# _developer\developer.rpym:57
|
||||
old "Show Image Load Log (F4)"
|
||||
new "Показати журнал завант. зображень (F4)"
|
||||
new "Показати панель завантаження зображень (F4)"
|
||||
|
||||
# _developer\developer.rpym:60
|
||||
old "Hide Image Load Log (F4)"
|
||||
new "Сховати журнал завант. зображень (F4)"
|
||||
new "Сховати панель завантаження зображень (F4)"
|
||||
|
||||
# _developer\developer.rpym:63
|
||||
old "Image Attributes"
|
||||
new "Атрибути зображення"
|
||||
new "Атрибути зображень"
|
||||
|
||||
# _developer\developer.rpym:90
|
||||
old "[name] [attributes] (hidden)"
|
||||
@@ -639,7 +639,7 @@ translate ukrainian strings:
|
||||
|
||||
# _developer\developer.rpym:435
|
||||
old "Right-click or escape to quit."
|
||||
new "Натисніть ПКМ або Escape, щоб вийти."
|
||||
new "Натисніть ПКМ або ESC, щоб вийти."
|
||||
|
||||
# _developer\developer.rpym:467
|
||||
old "Rectangle copied to clipboard."
|
||||
@@ -655,11 +655,11 @@ translate ukrainian strings:
|
||||
|
||||
# _developer\developer.rpym:617
|
||||
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
|
||||
new "Текстури: [tex_count] ([tex_size_mb:.1f] Мб)"
|
||||
new "Текстури: [tex_count] ([tex_size_mb:.1f] МБ)"
|
||||
|
||||
# _developer\developer.rpym:621
|
||||
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
|
||||
new "Кеш зображень: [cache_pct:.1f]% ([cache_size_mb:.1f] Мб)"
|
||||
new "Кеш зображень: [cache_pct:.1f]% ([cache_size_mb:.1f] МБ)"
|
||||
|
||||
# _developer\developer.rpym:631
|
||||
old "✔ "
|
||||
@@ -671,7 +671,7 @@ translate ukrainian strings:
|
||||
|
||||
# _developer\developer.rpym:639
|
||||
old "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
|
||||
new "\n{color=#cfc}✔ передбачене зображення (добре){/color}\n{color=#fcc}✘ раптове зображення (погано){/color}\n{color=#fff}Перетягніть, щоб перемістити.{/color}"
|
||||
new "\n{color=#cfc}✔ передбачене зображення (добре){/color}\n{color=#fcc}✘ непередбачене зображення (погано){/color}\n{color=#fff}Перетягніть для пересування.{/color}"
|
||||
|
||||
# _developer\inspector.rpym:38
|
||||
old "Displayable Inspector"
|
||||
@@ -699,7 +699,7 @@ translate ukrainian strings:
|
||||
|
||||
# _developer\inspector.rpym:145
|
||||
old " (no properties affect the displayable)"
|
||||
new " (на об’єкт не впливають жодні параметри)"
|
||||
new " (на об’єкт не впливають жодні властивості)"
|
||||
|
||||
# _developer\inspector.rpym:147
|
||||
old " (default properties omitted)"
|
||||
@@ -767,7 +767,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00updater.rpy:1452
|
||||
old "[u.version] is available. Do you want to install it?"
|
||||
new "[u.version] доступно. Бажаєте її встановити?"
|
||||
new "[u.version] доступно. Бажаєте її установити?"
|
||||
|
||||
# 00updater.rpy:1454
|
||||
old "Preparing to download the updates."
|
||||
@@ -783,7 +783,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00updater.rpy:1462
|
||||
old "The updates have been installed. The program will restart."
|
||||
new "Оновлення встановлено. Програма буде перезапущена."
|
||||
new "Оновлення було встановлено. Програму буде перезапущено."
|
||||
|
||||
# 00updater.rpy:1464
|
||||
old "The updates have been installed."
|
||||
@@ -823,11 +823,11 @@ translate ukrainian strings:
|
||||
|
||||
# 00accessibility.rpy:76
|
||||
old "Font Override"
|
||||
new "Замінити шрифт"
|
||||
new "Перевизначення шрифту"
|
||||
|
||||
# 00accessibility.rpy:80
|
||||
old "Default"
|
||||
new "Стандратний"
|
||||
new "Стандартний"
|
||||
|
||||
# 00accessibility.rpy:84
|
||||
old "DejaVu Sans"
|
||||
@@ -859,7 +859,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00accessibility.rpy:125
|
||||
old "Text-to-speech"
|
||||
new "Перетворення тексту в мовлення"
|
||||
new "Текст-у-мовлення"
|
||||
|
||||
# 00accessibility.rpy:129
|
||||
old "Clipboard"
|
||||
@@ -879,7 +879,7 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00accessibility.rpy:191
|
||||
old "The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was."
|
||||
new "Параметри цього меню призначені для покращення доступності. Вони можуть працювати не з усіма іграми, а деякі комбінації параметрів можуть зробити гру неможливою для гри. Це не є проблемою гри або рушія. Для досягнення найкращих результатів при зміні шрифтів намагайтеся зберігати розмір тексту таким, яким він був спочатку."
|
||||
new "Параметри цього меню призначені для покращення доступності. Вони можуть працювати не з усіма іграми, а деякі комбінації параметрів можуть зробити гру неможливою для гри. Це не є проблемою гри або рушія. Для отримання кращих результатів при зміні шрифтів намагайтеся зберігати розмір тексту таким, яким він був спочатку."
|
||||
|
||||
# renpy/common/00accessibility.rpy:193
|
||||
old "Self-Voicing Volume Drop"
|
||||
@@ -919,7 +919,7 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00preferences.rpy:535
|
||||
old "mute main"
|
||||
new "без основи"
|
||||
new "без основної гучності"
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
@@ -941,11 +941,11 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00director.rpy:1768
|
||||
old "Click to set transform, right click to add to transform list."
|
||||
new "Натисніть, щоб встановити трансформацію, натисніть ПКМ, щоб додати до списку трансформацій."
|
||||
new "Натисніть, щоб установити перетворення, клацніть ПКМ, щоб додати до списку перетворень."
|
||||
|
||||
# renpy/common/00director.rpy:1789
|
||||
old "Click to set, right click to add to behind list."
|
||||
new "Натисніть, щоб встановити, натисніть ПКМ, щоб додати до списку."
|
||||
new "Натисніть, щоб установити, клацніть ПКМ, щоб додати до списку."
|
||||
|
||||
# renpy/common/00gui.rpy:456
|
||||
old "This save was created on a different device. Maliciously constructed save files can harm your computer. Do you trust this save's creator and everyone who could have changed the file?"
|
||||
@@ -953,7 +953,7 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00gui.rpy:457
|
||||
old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user."
|
||||
new "Чи довіряєте ви пристрою, на якому було створено збереження? Ви повинні вибрати «Так», тільки якщо ви є єдиним користувачем пристрою."
|
||||
new "Чи довіряєте ви пристрою, на якому було створено збереження? Ви повинні натиснути «Так», лише якщо ви є єдиним користувачем пристрою."
|
||||
|
||||
# renpy/common/00preferences.rpy:528
|
||||
old "audio when unfocused"
|
||||
@@ -961,7 +961,7 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00preferences.rpy:537
|
||||
old "web cache preload"
|
||||
new "попер. завантаження вебкешу"
|
||||
new "попереднє завантаження вебкешу"
|
||||
|
||||
# renpy/common/00preferences.rpy:552
|
||||
old "voice after game menu"
|
||||
@@ -973,7 +973,7 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00speechbubble.rpy:349
|
||||
old "(hide)"
|
||||
new "(приховати)"
|
||||
new "(сховати)"
|
||||
|
||||
# renpy/common/00sync.rpy:70
|
||||
old "Sync downloaded."
|
||||
@@ -985,7 +985,7 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00sync.rpy:192
|
||||
old "The Ren'Py Sync server timed out."
|
||||
new "Сервер Ren'Py Sync вийшов з ладу."
|
||||
new "Час під’єднання до Ren'Py Sync закінчився."
|
||||
|
||||
# renpy/common/00sync.rpy:194
|
||||
old "An unknown error occurred while connecting to the Ren'Py Sync server."
|
||||
@@ -993,11 +993,11 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00sync.rpy:267
|
||||
old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out."
|
||||
new "Сервер Ren'Py Sync не має копії цієї синхронізації. Ідентифікатор синхронізації може бути недійсним або його термін дії закінчився."
|
||||
new "Сервер Ren'Py Sync не має копії цієї синхронізації. Ідентифікатор синхронізації може бути недійсним або термін його дії закінчився."
|
||||
|
||||
# renpy/common/00sync.rpy:409
|
||||
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
|
||||
new "Будь ласка, введіть згенерований вами ідентифікатор синхронізації.\nНіколи не вводьте ідентифікатор синхронізації, який ви не створювали."
|
||||
new "Введіть згенерований вами ідентифікатор синхронізації.\nНіколи не вводьте не створений вами ідентифікатор синхронізації."
|
||||
|
||||
# renpy/common/00sync.rpy:428
|
||||
old "The sync ID is not in the correct format."
|
||||
@@ -1013,19 +1013,19 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00sync.rpy:476
|
||||
old "The sync contains a file with an invalid name."
|
||||
new "Синхронізація містить файл з невірною назвою."
|
||||
new "Синхронізація містить файл з недійсною назвою."
|
||||
|
||||
# renpy/common/00sync.rpy:529
|
||||
old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?"
|
||||
new "Це завантажить ваші збереження на {a=https://sync.renpy.org}сервер Ren'Py Sync{/a}.\nБажаєте продовжити?"
|
||||
new "Ця дія вивантажить ваші збереження на {a=https://sync.renpy.org}сервер Ren'Py Sync{/a}.\nБажаєте продовжити?"
|
||||
|
||||
# renpy/common/00sync.rpy:558
|
||||
old "Enter Sync ID"
|
||||
new "Уведіть ідентифікатор синхронізації"
|
||||
new "Введіть ідентифікатор синхронізації"
|
||||
|
||||
# renpy/common/00sync.rpy:569
|
||||
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
|
||||
new "Зв’язок зі {a=https://sync.renpy.org}сервером Ren'Py Sync{/a}."
|
||||
new "Ця дія зв’яжеться зі {a=https://sync.renpy.org}сервером Ren'Py Sync{/a}."
|
||||
|
||||
# renpy/common/00sync.rpy:596
|
||||
old "Sync Success"
|
||||
@@ -1043,3 +1043,114 @@ translate ukrainian strings:
|
||||
old "Sync Error"
|
||||
new "Помилка синхронізації"
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# renpy/common/00accessibility.rpy:120
|
||||
old "Accessibility Menu. Use up and down arrows to navigate, and enter to activate buttons and bars."
|
||||
new "Меню доступності. Використовуйте стрілки вгору та вниз для навігації, а клавішу Enter для взаємодії між кнопками та смуг."
|
||||
|
||||
# renpy/common/00accessibility.rpy:197
|
||||
old "Self-voicing support is limited when using a touch screen."
|
||||
new "Підтримка синтезу мовлення обмежена при використанні сенсорного екрана."
|
||||
|
||||
# renpy/common/00director.rpy:1776
|
||||
old "Customize director.transforms to add more transforms."
|
||||
new "Налаштуйте «director.transforms», щоб додати більше перетворень."
|
||||
|
||||
# renpy/common/00director.rpy:1821
|
||||
old "Click to set."
|
||||
new "Клацніть, щоб установити."
|
||||
|
||||
# renpy/common/00director.rpy:1822
|
||||
old "Customize director.transitions to add more transitions."
|
||||
new "Налаштуйте «director.transitions», щоб додати більше переходів."
|
||||
|
||||
# renpy/common/00director.rpy:1845
|
||||
old "Customize director.audio_channels to add more channels."
|
||||
new "Налаштуйте «director.audio_channels», щоб додати більше каналів."
|
||||
|
||||
# renpy/common/00gui.rpy:454
|
||||
old "Are you sure you want to continue where you left off?"
|
||||
new "Ви дійсно бажаєте продовжити з того місця, на якому зупинилися?"
|
||||
|
||||
# renpy/common/00preferences.rpy:438
|
||||
old "self voicing enable"
|
||||
new "увімкнути синтез мовлення"
|
||||
|
||||
# renpy/common/00preferences.rpy:440
|
||||
old "self voicing disable"
|
||||
new "вимкнути синтез мовлення"
|
||||
|
||||
# renpy/common/00preferences.rpy:455
|
||||
old "clipboard voicing enable"
|
||||
new "увімкнути озвучення буфера обміну"
|
||||
|
||||
# renpy/common/00preferences.rpy:457
|
||||
old "clipboard voicing disable"
|
||||
new "вимкнути озвучення буфера обміну"
|
||||
|
||||
# renpy/common/00preferences.rpy:464
|
||||
old "debug voicing enable"
|
||||
new "увімкнути налагоджувальне озвучення"
|
||||
|
||||
# renpy/common/00preferences.rpy:466
|
||||
old "debug voicing disable"
|
||||
new "вимкнути налагоджувальне озвучення"
|
||||
|
||||
# renpy/common/00preferences.rpy:586
|
||||
old "restore window position"
|
||||
new "відновити положення вікна"
|
||||
|
||||
# renpy/common/00preferences.rpy:595
|
||||
old "reset"
|
||||
new "скинути"
|
||||
|
||||
# renpy/common/00speechbubble.rpy:408
|
||||
old "(clear retained bubbles)"
|
||||
new "(очистити залишкові бульбашки)"
|
||||
|
||||
# renpy/common/00updater.rpy:505
|
||||
old "No update methods found."
|
||||
new "Методів оновлення не знайдено."
|
||||
|
||||
# renpy/common/00updater.rpy:552
|
||||
old "Could not download file list: "
|
||||
new "Не вдалося завантажити список файлів: "
|
||||
|
||||
# renpy/common/00updater.rpy:555
|
||||
old "File list digest does not match."
|
||||
new "Дайджест списку файлів не збігається."
|
||||
|
||||
# renpy/common/00updater.rpy:2072
|
||||
old "Preparing to download the game data."
|
||||
new "Підготовка до завантаження даних гри."
|
||||
|
||||
# renpy/common/00updater.rpy:2074
|
||||
old "Downloading the game data."
|
||||
new "Завантаження даних гри."
|
||||
|
||||
# renpy/common/00updater.rpy:2076
|
||||
old "The game data has been downloaded."
|
||||
new "Дані гри було завантажено."
|
||||
|
||||
# renpy/common/00updater.rpy:2078
|
||||
old "An error occured when trying to download game data:"
|
||||
new "Виникла помилка при спробі завантажити дані гри:"
|
||||
|
||||
# renpy/common/00updater.rpy:2083
|
||||
old "This game cannot be run until the game data has been downloaded."
|
||||
new "Цю гру не можна буде запустити, доки не будуть завантажені дані гри."
|
||||
|
||||
# renpy/common/00updater.rpy:2090
|
||||
old "Retry"
|
||||
new "Повторити"
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# renpy/common/00translation.rpy:63
|
||||
old "Translation identifier: [identifier]"
|
||||
new "Ідентифікатор перекладу: [identifier]"
|
||||
|
||||
# renpy/common/00translation.rpy:84
|
||||
old " translates [tl.filename]:[tl.linenumber]"
|
||||
new " перекладає [tl.filename]:[tl.linenumber]"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# 00console.rpy:255
|
||||
@@ -89,8 +89,6 @@ translate ukrainian strings:
|
||||
old "stack: print the return stack"
|
||||
new "stack: вивести стек повернення"
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# renpy/common/_developer/developer.rpym:51
|
||||
old "Persistent Viewer"
|
||||
new "Переглядач даних"
|
||||
@@ -99,11 +97,62 @@ translate ukrainian strings:
|
||||
old "Speech Bubble Editor (Shift+B)"
|
||||
new "Редактор мовних бульбашок (Shift+B)"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:70
|
||||
old "Show Translation Info"
|
||||
new "Показати відомості про переклад"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:73
|
||||
old "Hide Translation Info"
|
||||
new "Сховати відомості про переклад"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:69
|
||||
old "Show Translation Identifiers"
|
||||
new "Показати ідентифікатори перекладу"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:72
|
||||
old "Hide Translation Identifiers"
|
||||
new "Сховати ідентифікатори перекладу"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:81
|
||||
old "Show Filename and Line"
|
||||
new "Показати назву файлу та рядок"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:84
|
||||
old "Hide Filename and Line"
|
||||
new "Сховати назву файлу та рядок"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:127
|
||||
old "Layer [l]:"
|
||||
new "Шар [l]:"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:131
|
||||
old " [name] [attributes] (hidden)"
|
||||
new " [name] [attributes] (приховано)"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:135
|
||||
old " [name] [attributes]"
|
||||
new " [name] [attributes]"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:606
|
||||
old "\n{color=#fff}Copied to clipboard.{/color}"
|
||||
new "\n{color=#fff}Скопійовано до буфера обміну.{/color}"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:612
|
||||
old "\n{color=#fff}Click to copy.\nDrag to move.{/color}"
|
||||
new "\n{color=#fff}Клацніть для копіювання.\nПеретягніть для пересування.{/color}"
|
||||
|
||||
# renpy/common/_developer/developer.rpym:657
|
||||
old "Click to open in editor."
|
||||
new "Клацніть, щоб відкрити в редакторі."
|
||||
|
||||
# renpy/common/00console.rpy:725
|
||||
old "The console is using short representations. To disable this, type 'long', and to re-enable, type 'short'"
|
||||
new "Консоль використовує короткі представлення. Щоб вимкнути це, введіть 'long', а щоб увімкнути, введіть 'short'"
|
||||
|
||||
# renpy/common/00console.rpy:789
|
||||
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
|
||||
new "help: показує цю довідку\n help <вираз>: показує підпис та документацію <виразу>"
|
||||
|
||||
# renpy/common/00console.rpy:813
|
||||
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
|
||||
new "У довідці можуть відображатися недокументовані функції. Будь ласка, перевірте, чи функцію або\nклас, який бажаєте використати, задокументовано.\n\n"
|
||||
|
||||
new "У довідці можуть бути недокументовані функції. Будь ласка, перевірте, чи бажана функція або\nклас задокументовано.\n\n"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# 00gltest.rpy:70
|
||||
@@ -59,7 +59,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00gltest.rpy:213
|
||||
old "Performance Warning"
|
||||
new "Попередження про продуктивність"
|
||||
new "Попередження про швидкодію"
|
||||
|
||||
# 00gltest.rpy:218
|
||||
old "This computer is using software rendering."
|
||||
@@ -67,7 +67,7 @@ translate ukrainian strings:
|
||||
|
||||
# 00gltest.rpy:220
|
||||
old "This computer is not using shaders."
|
||||
new "Цей пристрій не використовує шейдерів."
|
||||
new "Цей пристрій не використовує шейдери."
|
||||
|
||||
# 00gltest.rpy:222
|
||||
old "This computer is displaying graphics slowly."
|
||||
@@ -103,15 +103,15 @@ translate ukrainian strings:
|
||||
|
||||
# 00gltest.rpy:268
|
||||
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
|
||||
new "Запущено вебналаштування DirectX. Вона може згорнутися на панелі завдань. Будь ласка, дотримуйтесь підказок для встановлення DirectX."
|
||||
new "Запущено вебналаштування DirectX. Вона може згорнутися на панелі завдань. Будь ласка, дотримуйтесь вказівок для встановлення DirectX."
|
||||
|
||||
# 00gltest.rpy:272
|
||||
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
|
||||
new "{b}Нотатка:{/b} Програма вебналаштування DirectX від Microsoft за стандартом встановлює панель інструментів Bing. Якщо вам не потрібна ця панель, зніміть позначку у відповідному полі."
|
||||
new "{b}Примітка:{/b} застосунок вебналаштування DirectX від Microsoft за стандартом установлює панель інструментів Bing. Якщо вам не потрібна вона, зніміть позначку у відповідному полі."
|
||||
|
||||
# 00gltest.rpy:276
|
||||
old "When setup finishes, please click below to restart this program."
|
||||
new "Після завершення налаштування, натисніть нижче, щоб перезапустити програму."
|
||||
new "Після завершення установлення, натисніть нижче для перезапуску програми."
|
||||
|
||||
# 00gltest.rpy:278
|
||||
old "Restart"
|
||||
@@ -155,7 +155,7 @@ translate ukrainian strings:
|
||||
|
||||
# _errorhandling.rpym:535
|
||||
old "Copies the traceback.txt file to the clipboard."
|
||||
new "Копіює файл traceback.txt у буфер обміну."
|
||||
new "Копіює вміст файлу traceback.txt у буфер обміну."
|
||||
|
||||
# _errorhandling.rpym:562
|
||||
old "An exception has occurred."
|
||||
@@ -167,7 +167,7 @@ translate ukrainian strings:
|
||||
|
||||
# _errorhandling.rpym:584
|
||||
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
|
||||
new "Спроба відкату до попереднього часу, що дозволяє зберегти або вибрати інший варіант."
|
||||
new "Спробує відкатити до попереднього часу, дозволяючи вам зберегтися або вибрати інший варіант."
|
||||
|
||||
# _errorhandling.rpym:587
|
||||
old "Ignore"
|
||||
@@ -175,11 +175,11 @@ translate ukrainian strings:
|
||||
|
||||
# _errorhandling.rpym:591
|
||||
old "Ignores the exception, allowing you to continue."
|
||||
new "Ігнорує цей виняток, дозволяючи вам продовжити."
|
||||
new "Ігнорує виняток, дозволяючи вам продовжити."
|
||||
|
||||
# _errorhandling.rpym:593
|
||||
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
|
||||
new "Ігнорує цей виняток, дозволяючи вам продовжити. Найчастіше це призводить до додаткових помилок."
|
||||
new "Ігнорує виняток, дозволяючи вам продовжити. Найчастіше призводить до додаткових помилок."
|
||||
|
||||
# _errorhandling.rpym:597
|
||||
old "Reload"
|
||||
@@ -199,11 +199,11 @@ translate ukrainian strings:
|
||||
|
||||
# _errorhandling.rpym:614
|
||||
old "Quits the game."
|
||||
new "Виходить із гри."
|
||||
new "Виходить з гри."
|
||||
|
||||
# _errorhandling.rpym:638
|
||||
old "Parsing the script failed."
|
||||
new "Розбір скрипта не вдався."
|
||||
new "Помилка розбіру скрипта."
|
||||
|
||||
# _errorhandling.rpym:664
|
||||
old "Opens the errors.txt file in a text editor."
|
||||
@@ -211,7 +211,7 @@ translate ukrainian strings:
|
||||
|
||||
# _errorhandling.rpym:668
|
||||
old "Copies the errors.txt file to the clipboard."
|
||||
new "Копіює файл errors.txt у буфер обміну."
|
||||
new "Копіює вміст файлу errors.txt у буфер обміну."
|
||||
|
||||
# _errorhandling.rpym:542
|
||||
old "Copy BBCode"
|
||||
@@ -219,7 +219,7 @@ translate ukrainian strings:
|
||||
|
||||
# _errorhandling.rpym:544
|
||||
old "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/."
|
||||
new "Копіює файл traceback.txt у буфер обміну як BBCode для форумів як https://lemmasoft.renai.us/."
|
||||
new "Копіює вміст файлу traceback.txt у буфер обміну як BBCode для форумів як https://lemmasoft.renai.us/."
|
||||
|
||||
# _errorhandling.rpym:546
|
||||
old "Copy Markdown"
|
||||
@@ -227,15 +227,15 @@ translate ukrainian strings:
|
||||
|
||||
# _errorhandling.rpym:548
|
||||
old "Copies the traceback.txt file to the clipboard as Markdown for Discord."
|
||||
new "Копіює файл traceback.txt у буфер обміну як Markdown для Discord."
|
||||
new "Копіює вміст файлу traceback.txt у буфер обміну як Markdown для Discord."
|
||||
|
||||
# _errorhandling.rpym:683
|
||||
old "Copies the errors.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/."
|
||||
new "Копіює файл errors.txt у буфер обміну як BBCode для форумів як https://lemmasoft.renai.us/."
|
||||
new "Копіює вміст файлу errors.txt у буфер обміну як BBCode для форумів як https://lemmasoft.renai.us/."
|
||||
|
||||
# _errorhandling.rpym:687
|
||||
old "Copies the errors.txt file to the clipboard as Markdown for Discord."
|
||||
new "Копіює файл errors.txt у буфер обміну як Markdown для Discord."
|
||||
new "Копіює вміст файлу errors.txt у буфер обміну як Markdown для Discord."
|
||||
|
||||
# renpy/common/00gltest.rpy:100
|
||||
old "Force GL Renderer"
|
||||
@@ -267,11 +267,11 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00gltest.rpy:256
|
||||
old "More details on how to fix this can be found in the {a=[url]}documentation{/a}."
|
||||
new "Більше інформації про те, як це може бути виправлено, дивіться в {a=[url]}документації{/a}."
|
||||
new "Детальніше про те, як це можна виправити, дивіться у {a=[url]}документації{/a}."
|
||||
|
||||
# renpy/common/00gltest.rpy:273
|
||||
old "Change render options"
|
||||
new "Змінити параметри візцалізації"
|
||||
new "Змінити параметри візуалізації"
|
||||
|
||||
# renpy/common/00gamepad.rpy:58
|
||||
old "Press or move the '[control!s]' [kind]."
|
||||
@@ -279,7 +279,7 @@ translate ukrainian strings:
|
||||
|
||||
# renpy/common/00gltest.rpy:136
|
||||
old "Enable (No Blocklist)"
|
||||
new "Увімкнути (без списку блокування)"
|
||||
new "Увімкнути (без списку блоку)"
|
||||
|
||||
# renpy/common/00gltest.rpy:259
|
||||
old "The {a=edit:1:log.txt}log.txt{/a} file may contain information to help you determine what is wrong with your computer."
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:2
|
||||
@@ -13,6 +13,10 @@ translate ukrainian strings:
|
||||
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
|
||||
new "## Виклик gui.init скидає стилі до розумних значень за замовчуванням і встановлює ширину та висоту гри."
|
||||
|
||||
# gui/game/gui.rpy:14
|
||||
old "## Enable checks for invalid or unstable properties in screens or transforms"
|
||||
new "## Увімкнути перевірку недійсних або нестабільних властивостей в екранах або перетвореннях"
|
||||
|
||||
# gui/game/gui.rpy:17
|
||||
old "## GUI Configuration Variables"
|
||||
new "## Змінні конфігурації GUI"
|
||||
@@ -27,11 +31,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:25
|
||||
old "## An accent color used throughout the interface to label and highlight text."
|
||||
new "## Колір акценту, який використовується в інтерфейсі для позначення та виділення тексту."
|
||||
new "## Акцентований колір, який використовується в інтерфейсі для позначення та виділення тексту."
|
||||
|
||||
# gui/game/gui.rpy:29
|
||||
old "## The color used for a text button when it is neither selected nor hovered."
|
||||
new "## Колір, який використовується для текстової кнопки, коли вона не вибрана і не наведена."
|
||||
new "## Колір, який використовується для кнопки з текстом, коли її не вибрано або не наведено вказівником."
|
||||
|
||||
# gui/game/gui.rpy:32
|
||||
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
|
||||
@@ -39,23 +43,23 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:36
|
||||
old "## The color that is used for buttons and bars that are hovered."
|
||||
new "## Колір, який використовується для кнопок і смуг, на які наводяться."
|
||||
new "## Колір, який використовується для кнопок і смуг, на які наводяться вказівником."
|
||||
|
||||
# gui/game/gui.rpy:39
|
||||
old "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
|
||||
new "## Колір, який використовується для текстової кнопки, коли вона вибрана, але не в фокусі. Кнопку вибрано, якщо це поточний екран або значення параметра."
|
||||
new "## Колір, який використовується для кнопки з текстом, коли її вибрано, але користувач не в програмі. Кнопку вибрано, якщо це поточний екран або значення параметра."
|
||||
|
||||
# gui/game/gui.rpy:43
|
||||
old "## The color used for a text button when it cannot be selected."
|
||||
new "## Колір текстової кнопки, якщо її неможливо вибрати."
|
||||
new "## Колір кнопки з текстом, коли її неможливо вибрати."
|
||||
|
||||
# gui/game/gui.rpy:46
|
||||
old "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
|
||||
new "## Кольори, що використовуються для незаповнених частин стовпчиків. Вони не використовуються безпосередньо, а використовуються під час повторного створення файлів зображень стовпчика."
|
||||
new "## Кольори, що використовуються для незаповнених частин смуг. Вони не використовуються безпосередньо, а використовуються під час повторного створення файлів зображень смуги."
|
||||
|
||||
# gui/game/gui.rpy:51
|
||||
old "## The colors used for dialogue and menu choice text."
|
||||
new "## Кольори, які використовуються для тексту діалогу та вибору меню."
|
||||
new "## Кольори, які використовуються для тексту діалогу та меню вибору."
|
||||
|
||||
# gui/game/gui.rpy:56
|
||||
old "## Fonts and Font Sizes"
|
||||
@@ -67,7 +71,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:61
|
||||
old "## The font used for character names."
|
||||
new "## Шрифт, який використовується для імен символів."
|
||||
new "## Шрифт, який використовується для імен персонажів."
|
||||
|
||||
# gui/game/gui.rpy:64
|
||||
old "## The font used for out-of-game text."
|
||||
@@ -83,11 +87,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:73
|
||||
old "## The size of text in the game's user interface."
|
||||
new "## Розмір тексту в інтерфейсі користувача гри."
|
||||
new "## Розмір тексту в інтерфейсі гри."
|
||||
|
||||
# gui/game/gui.rpy:76
|
||||
old "## The size of labels in the game's user interface."
|
||||
new "## Розмір міток в інтерфейсі користувача гри."
|
||||
new "## Розмір міток в інтерфейсі гри."
|
||||
|
||||
# gui/game/gui.rpy:79
|
||||
old "## The size of text on the notify screen."
|
||||
@@ -123,7 +127,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:106
|
||||
old "## The placement of the speaking character's name, relative to the textbox. These can be a whole number of pixels from the left or top, or 0.5 to center."
|
||||
new "## Розташування імені персонажа, що говорить, відносно текстового поля. Це може бути ціла кількість пікселів зліва чи зверху або 0,5 до центру."
|
||||
new "## Розташування імені персонажа, відносно текстового поля. Це може бути ціла кількість пікселів зліва чи зверху або 0,5 до центру."
|
||||
|
||||
# gui/game/gui.rpy:111
|
||||
old "## The horizontal alignment of the character's name. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
|
||||
@@ -135,11 +139,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:120
|
||||
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
|
||||
new "## Межі поля, що містять ім'я персонажа, у порядку зліва, зверху, справа, знизу."
|
||||
new "## Межі поля, що містять імʼя персонажа, у порядку зліва, зверху, справа, знизу."
|
||||
|
||||
# gui/game/gui.rpy:124
|
||||
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
|
||||
new "## Якщо True, фон поля імен буде мозаїкою, якщо False, фон вікна імен буде масштабовано."
|
||||
new "## Якщо встановлено «True», тло поля імен буде мозаїкою, якщо «False», тло поля імен буде масштабовано."
|
||||
|
||||
# gui/game/gui.rpy:129
|
||||
old "## The placement of dialogue relative to the textbox. These can be a whole number of pixels relative to the left or top side of the textbox, or 0.5 to center."
|
||||
@@ -159,11 +163,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:145
|
||||
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
|
||||
new "## Ці змінні разом із файлами зображень у gui/button контролюють аспекти відображення кнопок."
|
||||
new "## Ці змінні разом із файлами зображень у gui/button контролюють аспекти показу кнопок."
|
||||
|
||||
# gui/game/gui.rpy:148
|
||||
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
|
||||
new "## Ширина та висота кнопки в пікселях. Якщо немає, Ren'Py обчислює розмір."
|
||||
new "## Ширина та висота кнопки в пікселях. Якщо встановлено «None», Ren'Py обчислить розмір."
|
||||
|
||||
# gui/game/gui.rpy:152
|
||||
old "## The borders on each side of the button, in left, top, right, bottom order."
|
||||
@@ -171,7 +175,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:155
|
||||
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
|
||||
new "## Якщо True, фонове зображення буде мозаїчно. Якщо False, фонове зображення буде лінійно масштабовано."
|
||||
new "## Якщо встановлено «True», зображення тла буде мозаїчно. Якщо «False», зображення тла буде лінійно масштабовано."
|
||||
|
||||
# gui/game/gui.rpy:159
|
||||
old "## The font used by the button."
|
||||
@@ -187,11 +191,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:171
|
||||
old "## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 is right)."
|
||||
new "## Горизонтальне вирівнювання тексту кнопки. (0,0 ліворуч, 0,5 центр, 1,0 праворуч)."
|
||||
new "## Горизонтальне вирівнювання тексту кнопки. (0,0 — ліворуч, 0,5 — центр, 1,0 — праворуч)."
|
||||
|
||||
# gui/game/gui.rpy:176
|
||||
old "## These variables override settings for different kinds of buttons. Please see the gui documentation for the kinds of buttons available, and what each is used for."
|
||||
new "## Ці змінні перекривають налаштування для різних типів кнопок. Перегляньте документацію gui, щоб дізнатися про типи доступних кнопок і для чого кожна з них використовується."
|
||||
new "## Ці змінні перевизначають налаштування для різних типів кнопок. Перегляньте документацію про GUI, щоб дізнатися про типи доступних кнопок і для чого кожна з них використовується."
|
||||
|
||||
# gui/game/gui.rpy:180
|
||||
old "## These customizations are used by the default interface:"
|
||||
@@ -211,23 +215,23 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:218
|
||||
old "## File Slot Buttons"
|
||||
new "## Кнопки слотів файлів"
|
||||
new "## Кнопки комірок збережень"
|
||||
|
||||
# gui/game/gui.rpy:220
|
||||
old "## A file slot button is a special kind of button. It contains a thumbnail image, and text describing the contents of the save slot. A save slot uses image files in gui/button, like the other kinds of buttons."
|
||||
new "## Кнопка слота файлів — це особливий вид кнопки. Він містить ескіз зображення та текст, що описує вміст гнізда збереження. Слот збереження використовує файли зображень у gui/button, як і інші типи кнопок."
|
||||
new "## Кнопка комірки збереження — це особливий вид кнопки. Він містить мале зображення та текст, що описує вміст комірки збереження. Комірка збереження використовує файли зображень у gui/button, як і інші типи кнопок."
|
||||
|
||||
# gui/game/gui.rpy:224
|
||||
old "## The save slot button."
|
||||
new "## Кнопка збереження слота."
|
||||
new "## Кнопка комірки збереження."
|
||||
|
||||
# gui/game/gui.rpy:234
|
||||
old "## The width and height of thumbnails used by the save slots."
|
||||
new "## Ці змінні керують розташуванням і відстанню між різними елементами інтерфейсу користувача."
|
||||
new "## Ширина та висота малих зображень, що використовуються комірками збереження."
|
||||
|
||||
# gui/game/gui.rpy:238
|
||||
old "## The number of columns and rows in the grid of save slots."
|
||||
new "## Ширина та висота мініатюр, що використовуються слотами для збереження."
|
||||
new "## Кількість стовпців і рядків у сітці комірок збереження."
|
||||
|
||||
# gui/game/gui.rpy:243
|
||||
old "## Positioning and Spacing"
|
||||
@@ -235,7 +239,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:245
|
||||
old "## These variables control the positioning and spacing of various user interface elements."
|
||||
new "## Ці змінні керують розташуванням і відстанню між різними елементами інтерфейсу користувача."
|
||||
new "## Ці змінні керують розташуванням і відстанню між різними елементами інтерфейсу."
|
||||
|
||||
# gui/game/gui.rpy:248
|
||||
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
|
||||
@@ -247,11 +251,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:255
|
||||
old "## The vertical position of the notify screen."
|
||||
new "## Вертикальне положення екрана сповіщень."
|
||||
new "## Вертикальна позиція екрана сповіщень."
|
||||
|
||||
# gui/game/gui.rpy:258
|
||||
old "## The spacing between menu choices."
|
||||
new "## Інтервал між пунктами меню."
|
||||
new "## Інтервал між елементами у меню вибору."
|
||||
|
||||
# gui/game/gui.rpy:261
|
||||
old "## Buttons in the navigation section of the main and game menus."
|
||||
@@ -271,7 +275,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:273
|
||||
old "## The spacing between file slots."
|
||||
new "## Відстань між слотами файлів."
|
||||
new "## Відстань між комірками збережень."
|
||||
|
||||
# gui/game/gui.rpy:276
|
||||
old "## The position of the main menu text."
|
||||
@@ -283,7 +287,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:282
|
||||
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
|
||||
new "## Ці змінні керують виглядом рамок, що можуть містити компоненти інтерфейсу користувача, коли накладання або вікно відсутні."
|
||||
new "## Ці змінні керують виглядом рамок, що можуть містити компоненти інтерфейсу, коли накладання або вікно відсутні."
|
||||
|
||||
# gui/game/gui.rpy:285
|
||||
old "## Generic frames."
|
||||
@@ -295,7 +299,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:291
|
||||
old "## The frame that is used as part of the skip screen."
|
||||
new "## Рамка, який використовується як частина екрана пропуску."
|
||||
new "## Рамка, яка використовується як частина екрана пропуску."
|
||||
|
||||
# gui/game/gui.rpy:294
|
||||
old "## The frame that is used as part of the notify screen."
|
||||
@@ -303,7 +307,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:297
|
||||
old "## Should frame backgrounds be tiled?"
|
||||
new "## Чи слід фонові рамки розміщувати плиткою?"
|
||||
new "## Чи слід фонові рамки розміщувати мозаїчно?"
|
||||
|
||||
# gui/game/gui.rpy:301
|
||||
old "## Bars, Scrollbars, and Sliders"
|
||||
@@ -311,11 +315,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:303
|
||||
old "## These control the look and size of bars, scrollbars, and sliders."
|
||||
new "## Це керує виглядом і розміром смуг, смуг прокрутки та повзунків."
|
||||
new "## Ці керують виглядом і розміром панель, смуг прокрутки та повзунків."
|
||||
|
||||
# gui/game/gui.rpy:305
|
||||
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
|
||||
new "## GUI за замовчуванням використовує лише повзунки та вертикальні смуги прокручування. Усі інші смужки використовуються лише на екранах, написаних автором."
|
||||
new "## Стандартний інтерфейс використовує лише повзунки та вертикальні смуги прокрутки. Усі інші смуги використовуються лише на екранах, написаних автором."
|
||||
|
||||
# gui/game/gui.rpy:308
|
||||
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
|
||||
@@ -323,7 +327,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:314
|
||||
old "## True if bar images should be tiled. False if they should be linearly scaled."
|
||||
new "## True якщо зображення панелей мають бути мозаїками. False, якщо вони повинні бути лінійно масштабовані."
|
||||
new "## True якщо зображення панелей мають бути мозаїчно. False, якщо вони повинні бути лінійно масштабовані."
|
||||
|
||||
# gui/game/gui.rpy:319
|
||||
old "## Horizontal borders."
|
||||
@@ -335,7 +339,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:329
|
||||
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
|
||||
new "## Що робити з непрокручуваними смугами прокручування в gui. \"hide\" приховує їх, а «Нічого» показує їх."
|
||||
new "## Що робити з непрокручуваними смугами прокрутки в інтерфейсі. Значення «hide» приховує їх, а «None» показує їх."
|
||||
|
||||
# gui/game/gui.rpy:334
|
||||
old "## History"
|
||||
@@ -351,12 +355,16 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:341
|
||||
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
|
||||
new "## Висота запису на екрані історії або «Нічого», щоб зробити висоту змінною за рахунок продуктивності."
|
||||
new "## Висота запису на екрані історії або «None», щоб зробити висоту змінною шляхом швидкодії."
|
||||
|
||||
# gui/game/gui.rpy:345
|
||||
old "## The position, width, and alignment of the label giving the name of the speaking character."
|
||||
new "## Положення, ширина та вирівнювання мітки, що вказує ім’я персонажа, що говорить."
|
||||
|
||||
# gui/game/gui.rpy:347
|
||||
old "## Additional space to add between history screen entries."
|
||||
new "## Додатковий простір для додавання між записами на екрані «Історія»."
|
||||
|
||||
# gui/game/gui.rpy:352
|
||||
old "## The position, width, and alignment of the dialogue text."
|
||||
new "## Позиція, ширина та вирівнювання тексту діалогу."
|
||||
@@ -371,7 +379,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:363
|
||||
old "## The borders of the background of the NVL-mode background window."
|
||||
new "## Межі фону заднього плану режиму NVL."
|
||||
new "## Межі тла вікна заднього плану режиму NVL."
|
||||
|
||||
# gui/game/gui.rpy:366
|
||||
old "## The maximum number of NVL-mode entries Ren'Py will display. When more entries than this are to be show, the oldest entry will be removed."
|
||||
@@ -399,7 +407,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:404
|
||||
old "## This controls where a line break is permitted. The default is suitable for most languages. A list of available values can be found at https://www.renpy.org/doc/html/style_properties.html#style-property-language"
|
||||
new "## Це визначає, де дозволений розрив рядка. Стандартне значення підходить для більшості мов. Список доступних значень можна знайти за адресою https://www.renpy.org/doc/html/style_properties.html#style-property-language"
|
||||
new "## Це визначає, де дозволений розрив рядка. Стандартне значення підходить для більшості мов. Список доступних значень можна знайти на https://www.renpy.org/doc/html/style_properties.html#style-property-language"
|
||||
|
||||
# gui/game/gui.rpy:412
|
||||
old "## Mobile devices"
|
||||
@@ -407,15 +415,15 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:417
|
||||
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
|
||||
new "## Це збільшує розмір швидких кнопок, щоб їх було легше торкатися на планшетах і телефонах."
|
||||
new "## Це збільшує розмір кнопок швидкої панелі доступу, щоб їх було легше торкатися на планшетах і телефонах."
|
||||
|
||||
# gui/game/gui.rpy:424
|
||||
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
|
||||
new "## Це змінює розмір і відстань між різними елементами gui, щоб вони були видимими на телефонах."
|
||||
new "## Це змінює розмір і відстань між різними елементами інтерфейсу, щоб вони були видимими на телефонах."
|
||||
|
||||
# gui/game/gui.rpy:429
|
||||
old "## Font sizes."
|
||||
new "## Розміри шрифту"
|
||||
new "## Розміри шрифтів"
|
||||
|
||||
# gui/game/gui.rpy:437
|
||||
old "## Adjust the location of the textbox."
|
||||
@@ -427,15 +435,8 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:457
|
||||
old "## File button layout."
|
||||
new "## Макет кнопки файлу."
|
||||
new "## Макет кнопки збереження."
|
||||
|
||||
# gui/game/gui.rpy:461
|
||||
old "## NVL-mode."
|
||||
new "## NVL-режим."
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# gui/game/gui.rpy:14
|
||||
old "## Enable checks for invalid or unstable properties in screens or transforms"
|
||||
new "## Увімкнути перевірку недійсних або нестабільних властивостей у екранах або перетвореннях"
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# gui/game/options.rpy:1
|
||||
@@ -179,7 +179,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/options.rpy:183
|
||||
old "## Classify files as None to exclude them from the built distributions."
|
||||
new "## Для виключення файлів із збірок для розповсюдження, класифікуйте їх як «None»."
|
||||
new "## Для виключення файлів із збірки файлів розповсюдження, класифікуйте їх як «None»."
|
||||
|
||||
# gui/game/options.rpy:191
|
||||
old "## To archive files, classify them as 'archive'."
|
||||
@@ -197,10 +197,8 @@ translate ukrainian strings:
|
||||
old "## The username and project name associated with an itch.io project, separated by a slash."
|
||||
new "## Ім’я користувача та назва проєкту, пов’язані з проєктом itch.io, розділені скісною рискою."
|
||||
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# gui/game/options.rpy:203
|
||||
old "## A Google Play license key is required to perform in-app purchases. It can be found in the Google Play developer console, under \"Monetize\" > \"Monetization Setup\" > \"Licensing\"."
|
||||
new "## Для здійснення покупок у застосунку потрібен ліцензійний ключ Google Play. Його можна знайти в консолі розробника Google Play у розділі «Монетизація» > «Налаштування монетизації» > «Ліцензування»."
|
||||
|
||||
new "## Для здійснення внутрішньоігрового придбання потрібен ліцензійний ключ Google Play. Його можна знайти в консолі розробника Google Play у розділі «Монетизація» > «Налаштування монетизації» > «Ліцензування»."
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:9
|
||||
@@ -11,15 +11,15 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:85
|
||||
old "## Say screen"
|
||||
new "## Екран Say"
|
||||
new "## Екран промови"
|
||||
|
||||
# gui/game/screens.rpy:87
|
||||
old "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
|
||||
new "## Екран Say використовується для відображення діалогу гравцеві. Він приймає два параметри, who і what, ім’я персонажа, що говорить, і текст, який буде відображатися відповідно. (Параметр who може мати значення None, якщо ім’я не вказано.)"
|
||||
new "## Екран промови використовується для показу діалогу гравцеві. Він приймає два параметри, «who» та «what», ім’я персонажа й текст, який буде показано відповідно. (Параметр «who» може мати значення «None», якщо ім’я не вказано.)"
|
||||
|
||||
# gui/game/screens.rpy:92
|
||||
old "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
|
||||
new "## Цей екран має створювати текст, який можна відображати з ідентифікатором «what», оскільки Ren'Py використовує це для керування відображенням тексту. Він також може створювати відображувані елементи з ідентифікаторами «who» та «window» для застосування властивостей стилю."
|
||||
new "## Цей екран має створювати текст з ідентифікатором «what», оскільки Ren'Py використовує його для керування показу тексту. Він також може створювати елементи з ідентифікаторами «who» та «window» для застосування властивостей стилю."
|
||||
|
||||
# gui/game/screens.rpy:96
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#say"
|
||||
@@ -39,11 +39,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:167
|
||||
old "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
|
||||
new "## Цей екран використовується для відображення renpy.input. Параметр prompt використовується для передачі текстової підказки."
|
||||
new "## Цей екран використовується для показу «renpy.input». Параметр «prompt» використовується для передачі текстової підказки."
|
||||
|
||||
# gui/game/screens.rpy:170
|
||||
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
|
||||
new "## Цей екран має створити відображуваний вхід з ідентифікатором «input» для прийняття різних вхідних параметрів."
|
||||
new "## Цей екран має створити введення з ідентифікатором «input» для прийняття різних параметрів введення."
|
||||
|
||||
# gui/game/screens.rpy:173
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#input"
|
||||
@@ -55,7 +55,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:202
|
||||
old "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, is a list of objects, each with caption and action fields."
|
||||
new "## Цей екран використовується для відображення вибору в грі, представленого командою 'menu'. Один параметр, 'items' — це список об’єктів, кожен із полями заголовка та дії."
|
||||
new "## Цей екран використовується для показу ігрових варіантів вибору, представлених оператором «menu». Один параметр, «items», являє собою список об’єктів, кожен з яких має підпис і поле дії."
|
||||
|
||||
# gui/game/screens.rpy:206
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#choice"
|
||||
@@ -67,11 +67,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:236
|
||||
old "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
|
||||
new "## Швидке меню відображається в грі, щоб забезпечити легкий доступ до меню поза грою."
|
||||
new "## Швидке меню показується у грі, щоб забезпечити легкий доступ до меню поза грою."
|
||||
|
||||
# gui/game/screens.rpy:241
|
||||
old "## Ensure this appears on top of other screens."
|
||||
new "## Переконайтеся, що це відображається поверх інших екранів."
|
||||
new "## Переконайтеся, що воно показується поверх інших екранів."
|
||||
|
||||
# gui/game/screens.rpy:252
|
||||
old "Back"
|
||||
@@ -83,7 +83,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:254
|
||||
old "Skip"
|
||||
new "Пропустити"
|
||||
new "Пропускати"
|
||||
|
||||
# gui/game/screens.rpy:255
|
||||
old "Auto"
|
||||
@@ -107,7 +107,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:262
|
||||
old "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
|
||||
new "## Цей код гарантує, що екран quick_menu відображається в грі, якщо гравець явно не приховав інтерфейс."
|
||||
new "## Цей код гарантує, що екран «quick_menu» показується у грі, якщо гравець не приховав інтерфейс явно."
|
||||
|
||||
# gui/game/screens.rpy:280
|
||||
old "## Main and Game Menu Screens"
|
||||
@@ -119,7 +119,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:285
|
||||
old "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
|
||||
new "## Цей екран включено в головне та ігрове меню та забезпечує навігацію до інших меню та початок гри."
|
||||
new "## Цей екран включено в головне та ігрове меню і забезпечує навігацію до інших меню та початку гри."
|
||||
|
||||
# gui/game/screens.rpy:300
|
||||
old "Start"
|
||||
@@ -147,7 +147,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:324
|
||||
old "## Help isn't necessary or relevant to mobile devices."
|
||||
new "## Допомога не є необхідною або актуальною для мобільних пристроїв."
|
||||
new "## Довідка не є необхідною або доречною для мобільних пристроїв."
|
||||
|
||||
# gui/game/screens.rpy:325
|
||||
old "Help"
|
||||
@@ -155,7 +155,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:329
|
||||
old "## The quit button is banned on iOS and unnecessary on Android and Web."
|
||||
new "## Кнопка виходу заборонена на iOS і непотрібна на Android і в Web."
|
||||
new "## Кнопка виходу заборонена на iOS й непотрібна на Android та Web."
|
||||
|
||||
# gui/game/screens.rpy:330
|
||||
old "Quit"
|
||||
@@ -167,7 +167,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:346
|
||||
old "## Used to display the main menu when Ren'Py starts."
|
||||
new "## Використовується для відображення головного меню під час запуску Ren'Py."
|
||||
new "## Використовується для показу головного меню під час запуску Ren'Py."
|
||||
|
||||
# gui/game/screens.rpy:348
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#main-menu"
|
||||
@@ -183,19 +183,19 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:361
|
||||
old "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
|
||||
new "## Інструкція використання включає інший екран всередині цього. Фактичний вміст головного меню знаходиться на екрані навігації."
|
||||
new "## Оператор «use» включає інший екран усередині цього. Фактичний вміст головного меню знаходиться на екрані навігації."
|
||||
|
||||
# gui/game/screens.rpy:406
|
||||
old "## Game Menu screen"
|
||||
new "## Екран меню гри"
|
||||
new "## Екран ігрового меню"
|
||||
|
||||
# gui/game/screens.rpy:408
|
||||
old "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
|
||||
new "## Це описує базову структуру екрана меню гри. Він викликається за допомогою заголовка екрана та відображає тло, заголовок і навігацію."
|
||||
new "## Тут викладено основну загальну структуру екрана ігрового меню. Він викликається заголовком екрана і показує тло, заголовок і навігацію."
|
||||
|
||||
# gui/game/screens.rpy:411
|
||||
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". This screen is intended to be used with one or more children, which are transcluded (placed) inside it."
|
||||
new "## Параметр прокручування може бути None або одним із «viewport» чи «vpgrid». Цей екран призначений для використання з одним або декількома об’єктами, які включені (розміщені) всередині нього."
|
||||
new "## Параметр «scroll» може мати значення «None» або один з «viewport» чи «vpgrid». Цей екран призначений для використання з одним або декількома об’єктами, які включені (розміщені) всередині нього."
|
||||
|
||||
# gui/game/screens.rpy:429
|
||||
old "## Reserve space for the navigation section."
|
||||
@@ -211,7 +211,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:536
|
||||
old "## This screen gives credit and copyright information about the game and Ren'Py."
|
||||
new "## Цей екран містить інформацію про авторство та авторські права щодо гри та Ren'Py."
|
||||
new "## Цей екран містить інформацію про авторів та авторські права щодо гри та Ren'Py."
|
||||
|
||||
# gui/game/screens.rpy:539
|
||||
old "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
|
||||
@@ -219,7 +219,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:546
|
||||
old "## This use statement includes the game_menu screen inside this one. The vbox child is then included inside the viewport inside the game_menu screen."
|
||||
new "## Цей оператор використання включає екран «game_menu» всередині цього. Потім дочірній елемент «vbox» включається в область перегляду всередині екрана «game_menu»."
|
||||
new "## Цей оператор «use» включає екран «game_menu» всередині цього. Потім дочірній елемент «vbox» буде включено до «viewport» всередині екрана «game_menu»."
|
||||
|
||||
# gui/game/screens.rpy:556
|
||||
old "Version [config.version!t]\n"
|
||||
@@ -227,7 +227,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:558
|
||||
old "## gui.about is usually set in options.rpy."
|
||||
new "## «gui.about» зазвичай встановлюється в «options.rpy»."
|
||||
new "## Значення «gui.about» зазвичай задається у файлі «options.rpy»."
|
||||
|
||||
# gui/game/screens.rpy:562
|
||||
old "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
|
||||
@@ -259,7 +259,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:604
|
||||
old "## This ensures the input will get the enter event before any of the buttons do."
|
||||
new "## Це гарантує, що введення отримає подію «enter» раніше, ніж будь-яка кнопка."
|
||||
new "## Це гарантує, що введення отримає подію входу раніше, ніж будь-яка кнопка."
|
||||
|
||||
# gui/game/screens.rpy:608
|
||||
old "## The page name, which can be edited by clicking on a button."
|
||||
@@ -267,11 +267,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:620
|
||||
old "## The grid of file slots."
|
||||
new "## Сітка комірок для файлів."
|
||||
new "## Сітка комірок збережень."
|
||||
|
||||
# gui/game/screens.rpy:640
|
||||
old "{#file_time}%A, %B %d %Y, %H:%M"
|
||||
new "{#file_time}%A, %B %d %Y, %H:%M"
|
||||
new "{#file_time}%A, %d %B %Y, %H:%M"
|
||||
|
||||
# gui/game/screens.rpy:640
|
||||
old "empty slot"
|
||||
@@ -279,7 +279,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:648
|
||||
old "## Buttons to access other pages."
|
||||
new "## Кнопки для доступу до інших сторінок."
|
||||
new "## Кнопки для відкриття інших сторінок."
|
||||
|
||||
# gui/game/screens.rpy:657
|
||||
old "<"
|
||||
@@ -295,7 +295,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:665
|
||||
old "## range(1, 10) gives the numbers from 1 to 9."
|
||||
new "## range(1, 10) дає числа від 1 до 9."
|
||||
new "## range(1, 10) повертає числа від 1 до 9."
|
||||
|
||||
# gui/game/screens.rpy:669
|
||||
old ">"
|
||||
@@ -339,11 +339,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:737
|
||||
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
|
||||
new "## Сюди можна долучити додаткові вікна vbox типу «radio_pref» або «check_pref», щоб долучити додаткові параметри, визначені творцем."
|
||||
new "## Сюди можна додати додаткові vbox'и типу «radio_pref» або «check_pref», щоб додати додаткові налаштування, визначені автором."
|
||||
|
||||
# gui/game/screens.rpy:748
|
||||
old "Text Speed"
|
||||
new "Швидкість тексту"
|
||||
new "Швидкість друку тексту"
|
||||
|
||||
# gui/game/screens.rpy:752
|
||||
old "Auto-Forward Time"
|
||||
@@ -355,7 +355,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:766
|
||||
old "Sound Volume"
|
||||
new "Гучність звук. ефектів"
|
||||
new "Гучність звукових ефектів"
|
||||
|
||||
# gui/game/screens.rpy:772
|
||||
old "Test"
|
||||
@@ -375,7 +375,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:865
|
||||
old "## This is a screen that displays the dialogue history to the player. While there isn't anything special about this screen, it does have to access the dialogue history stored in _history_list."
|
||||
new "## Це екран, на якому гравцеві відображається історія діалогів. Хоча в цьому екрані немає нічого особливого, він має доступ до історії діалогів, що зберігається в _history_list."
|
||||
new "## Це екран, на якому гравцеві буде показано історію діалогів. Хоч й в цьому екрані немає нічого особливого, він має мати доступ до історії діалогів, що зберігається в «_history_list»."
|
||||
|
||||
# gui/game/screens.rpy:869
|
||||
old "## https://www.renpy.org/doc/html/history.html"
|
||||
@@ -383,15 +383,15 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:875
|
||||
old "## Avoid predicting this screen, as it can be very large."
|
||||
new "## Не намагайтеся передбачити цей екран, оскільки він може бути дуже великим."
|
||||
new "## Уникайте виклику цього екрану, оскільки він може бути дуже великим."
|
||||
|
||||
# gui/game/screens.rpy:886
|
||||
old "## This lays things out properly if history_height is None."
|
||||
new "## Тут все буде правильно, якщо history_height дорівнює None."
|
||||
new "## Тут усе буде показано правильно, якщо «history_height» дорівнює «None»."
|
||||
|
||||
# gui/game/screens.rpy:896
|
||||
old "## Take the color of the who text from the Character, if set."
|
||||
new "## Бере колір тексту who з Character, якщо він заданий."
|
||||
new "## Бере колір тексту «who» з «Character», якщо він заданий."
|
||||
|
||||
# gui/game/screens.rpy:905
|
||||
old "The dialogue history is empty."
|
||||
@@ -399,7 +399,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:908
|
||||
old "## This determines what tags are allowed to be displayed on the history screen."
|
||||
new "## Це визначає теги, які можна відображати на екрані історії."
|
||||
new "## Визначає, які теги дозволено показувати на екрані історії."
|
||||
|
||||
# gui/game/screens.rpy:953
|
||||
old "## Help screen"
|
||||
@@ -407,7 +407,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:955
|
||||
old "## A screen that gives information about key and mouse bindings. It uses other screens (keyboard_help, mouse_help, and gamepad_help) to display the actual help."
|
||||
new "## Екран, що надає інформацію про прив’язку клавіш і миші. Він використовує інші екрани (keyboard_help, mouse_help і gamepad_help), щоб відобразити фактичну довідку."
|
||||
new "## Екран, що надає інформацію про призначення клавіш і миші. Він використовує інші екрани (keyboard_help, mouse_help та gamepad_help), щоб показати саму довідку."
|
||||
|
||||
# gui/game/screens.rpy:974
|
||||
old "Keyboard"
|
||||
@@ -439,7 +439,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:999
|
||||
old "Arrow Keys"
|
||||
new "Клавіші зі стрілками"
|
||||
new "Клавіші стрілок"
|
||||
|
||||
# gui/game/screens.rpy:1000
|
||||
old "Navigate the interface."
|
||||
@@ -451,7 +451,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1004
|
||||
old "Accesses the game menu."
|
||||
new "Доступ до меню гри."
|
||||
new "Відкриває ігрове меню."
|
||||
|
||||
# gui/game/screens.rpy:1007
|
||||
old "Ctrl"
|
||||
@@ -467,7 +467,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1012
|
||||
old "Toggles dialogue skipping."
|
||||
new "Вмикає пропуск діалогу."
|
||||
new "Перемикає пропуск діалогу."
|
||||
|
||||
# gui/game/screens.rpy:1015
|
||||
old "Page Up"
|
||||
@@ -475,7 +475,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1016
|
||||
old "Rolls back to earlier dialogue."
|
||||
new "Відкат до попереднього діалогу."
|
||||
new "Відкатує до попереднього діалогу."
|
||||
|
||||
# gui/game/screens.rpy:1019
|
||||
old "Page Down"
|
||||
@@ -483,7 +483,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1020
|
||||
old "Rolls forward to later dialogue."
|
||||
new "Перехід до наступного діалогу."
|
||||
new "Переходить до наступного діалогу."
|
||||
|
||||
# gui/game/screens.rpy:1024
|
||||
old "Hides the user interface."
|
||||
@@ -503,15 +503,15 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1042
|
||||
old "Left Click"
|
||||
new "ЛКМ"
|
||||
new "Ліва кнопка миші"
|
||||
|
||||
# gui/game/screens.rpy:1046
|
||||
old "Middle Click"
|
||||
new "СКМ"
|
||||
new "Середня кнопка миші"
|
||||
|
||||
# gui/game/screens.rpy:1050
|
||||
old "Right Click"
|
||||
new "ПКМ"
|
||||
new "Права кнопка миші"
|
||||
|
||||
# gui/game/screens.rpy:1054
|
||||
old "Mouse Wheel Up"
|
||||
@@ -523,7 +523,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1065
|
||||
old "Right Trigger\nA/Bottom Button"
|
||||
new "Правий тригер\nA/Нижня кнопка"
|
||||
new "Правий тригер\nКнопка A/Униз"
|
||||
|
||||
# gui/game/screens.rpy:1069
|
||||
old "Left Trigger\nLeft Shoulder"
|
||||
@@ -535,7 +535,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1078
|
||||
old "D-Pad, Sticks"
|
||||
new "Хрестовина, Стики"
|
||||
new "Хрестовина, стики"
|
||||
|
||||
# gui/game/screens.rpy:1082
|
||||
old "Start, Guide"
|
||||
@@ -543,12 +543,16 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1086
|
||||
old "Y/Top Button"
|
||||
new "Y/Верхня кнопка"
|
||||
new "Кнопка Y/Угору"
|
||||
|
||||
# gui/game/screens.rpy:1089
|
||||
old "Calibrate"
|
||||
new "Відкалібрувати"
|
||||
|
||||
# gui/game/screens.rpy:1098
|
||||
old "Start, Guide, B/Right Button"
|
||||
new "Start, Guide, Кнопка B/Управо"
|
||||
|
||||
# gui/game/screens.rpy:1117
|
||||
old "## Additional screens"
|
||||
new "## Додаткові екрани"
|
||||
@@ -559,7 +563,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1123
|
||||
old "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
|
||||
new "## Екран підтвердження викликається, коли Ren'Py хоче поставити гравцеві запитання «Так» або «Ні»."
|
||||
new "## Екран підтвердження викликається, коли Ren'Py хоче поставити гравцеві запитання з відповіддю «Так» або «Ні»."
|
||||
|
||||
# gui/game/screens.rpy:1126
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#confirm"
|
||||
@@ -567,7 +571,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1130
|
||||
old "## Ensure other screens do not get input while this screen is displayed."
|
||||
new "## Переконайтеся, що інші екрани не отримують введення, поки відображається цей екран."
|
||||
new "## Переконайтеся, що на інші екранах не отримується введення під час показу цього екрана."
|
||||
|
||||
# gui/game/screens.rpy:1154
|
||||
old "Yes"
|
||||
@@ -579,7 +583,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1157
|
||||
old "## Right-click and escape answer \"no\"."
|
||||
new "## Клацніть ПКМ та вийдіть із відповіді «Ні»."
|
||||
new "## Клацніть ПКМ й оберіть відповідь «Ні»."
|
||||
|
||||
# gui/game/screens.rpy:1184
|
||||
old "## Skip indicator screen"
|
||||
@@ -587,7 +591,7 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1186
|
||||
old "## The skip_indicator screen is displayed to indicate that skipping is in progress."
|
||||
new "## Екран skip_indicator відображається, щоб вказати, що триває пропуск."
|
||||
new "## Екран «skip_indicator» показується, що вказати на те, що виконується пропуск."
|
||||
|
||||
# gui/game/screens.rpy:1189
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
|
||||
@@ -599,19 +603,19 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1208
|
||||
old "## This transform is used to blink the arrows one after another."
|
||||
new "## Це перетворення використовується для миготіння стрілок одна за одною."
|
||||
new "## Це перетворення використовується для блимання стрілок одна за одною."
|
||||
|
||||
# gui/game/screens.rpy:1235
|
||||
old "## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE glyph in it."
|
||||
new "## Ми повинні використовувати шрифт із гліфом МАЛЕНЬКИЙ ЧОРНИЙ ТРИКУТНИК ВПРАВО."
|
||||
new "## Ми маємо використовувати шрифт, в якому є гліф «BLACK RIGHT-POINTING SMALL TRIANGLE»."
|
||||
|
||||
# gui/game/screens.rpy:1240
|
||||
old "## Notify screen"
|
||||
new "## Екран сповіщень"
|
||||
new "## Екран оповіщення"
|
||||
|
||||
# gui/game/screens.rpy:1242
|
||||
old "## The notify screen is used to show the player a message. (For example, when the game is quicksaved or a screenshot has been taken.)"
|
||||
new "## Екран сповіщень використовується, щоб показати гравцеві повідомлення. (Наприклад, коли гра швидко збережена або зроблено знімок екрана.)"
|
||||
new "## Екран оповіщення використовується, щоб показати гравцеві повідомлення. (Наприклад, коли гру збережено або зроблено знімок екрана)."
|
||||
|
||||
# gui/game/screens.rpy:1245
|
||||
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
|
||||
@@ -631,15 +635,15 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1294
|
||||
old "## Displays dialogue in either a vpgrid or the vbox."
|
||||
new "## Відображає діалог у vpgrid або vbox."
|
||||
new "## Показує діалог у типі «vpgrid» або «vbox»."
|
||||
|
||||
# gui/game/screens.rpy:1307
|
||||
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
|
||||
new "## Відображає меню, якщо є. Меню може відображатися неправильно, якщо для config.narrator_menu задано значення True."
|
||||
new "## Показує меню, якщо його задано. Меню може показуватися некоректно, якщо «config.narrator_menu» має значення «True»."
|
||||
|
||||
# gui/game/screens.rpy:1337
|
||||
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
|
||||
new "## Це визначає максимальну кількість записів у режимі NVL, які можуть бути відображені одночасно."
|
||||
new "## Цей параметр контролює максимальну кількість реплік у режимі NVL, які можуть бути показані одночасно."
|
||||
|
||||
# gui/game/screens.rpy:1399
|
||||
old "## Mobile Variants"
|
||||
@@ -653,7 +657,6 @@ translate ukrainian strings:
|
||||
old "Menu"
|
||||
new "Меню"
|
||||
|
||||
|
||||
translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:676
|
||||
@@ -666,11 +669,11 @@ translate ukrainian strings:
|
||||
|
||||
# gui/game/screens.rpy:1410
|
||||
old "## Bubble screen"
|
||||
new "## Екран з бульбашками"
|
||||
new "## Екран бульбашок"
|
||||
|
||||
# gui/game/screens.rpy:1412
|
||||
old "## The bubble screen is used to display dialogue to the player when using speech bubbles. The bubble screen takes the same parameters as the say screen, must create a displayable with the id of \"what\", and can create displayables with the \"namebox\", \"who\", and \"window\" ids."
|
||||
new "## Екран бульбашок використовується для показу діалогу гравцеві під час використання мовних бульбашок. Екран бульбашок має ті самі параметри, що й екран слів, має створювати елемент відображення з ідентифікатором «what», а також може створювати елементи відображення з ідентифікаторами «namebox», «who» і «window»."
|
||||
new "## Екран бульбашок використовується для показу діалогу гравцеві під час використання мовних бульбашок. Екран бульбашок має ті самі параметри, що й екран промови, має створювати об’єкт з ідентифікатором «what», а також може створювати об’єкти з ідентифікаторами «namebox», «who» і «window»."
|
||||
|
||||
# gui/game/screens.rpy:1417
|
||||
old "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# У цьому файлі міститься скрипт гри.
|
||||
# У цьому файлі міститься сценарій гри.
|
||||
|
||||
# Оголошення персонажів, які використовуються в цій грі. Колірний аргумент розфарбовує
|
||||
# ім’я персонажа.
|
||||
# Визначення персонажів для гри.
|
||||
# Аргумент color змінює колір ім’я персонажа.
|
||||
|
||||
define e = Character("Ейлін")
|
||||
|
||||
@@ -10,23 +10,23 @@ define e = Character("Ейлін")
|
||||
|
||||
label start:
|
||||
|
||||
# Це показує тло. За стандратом використовується заповнювач, але ви можете
|
||||
# Показ тла. Типово використовується заповнювач, але ви можете
|
||||
# додати файл (з назвою «bg room.png» або «bg room.jpg») до
|
||||
# теки images, щоб показати його.
|
||||
|
||||
scene bg room
|
||||
|
||||
# Це показує спрайт персонажа. Використовується заповнювач, але ви можете
|
||||
# замінити його, додавши до зображень файл із назвою «eileen happy.png».
|
||||
# до теки.
|
||||
# Наступний рядок показує спрайт персонажа. Тут використано заповнювач,
|
||||
# але ви можете замінити його, додавши файл з назвою «eileen happy.png»,
|
||||
# до теки images.
|
||||
|
||||
show eileen happy
|
||||
|
||||
# Це репліки діалогу.
|
||||
# Ці рядки показують репліки діалогу.
|
||||
|
||||
e "Ви створили нову гру Ren'Py."
|
||||
|
||||
e "Додавши історію, зображення та музику, ви можете оприлюднити це світові!"
|
||||
e "Додавши сюжет, зображення та музику, ви зможете оприлюднити її світові!"
|
||||
|
||||
# На цьому гра закінчується.
|
||||
|
||||
|
||||
@@ -25,11 +25,6 @@ renpy.display.accelerator gen/renpy.display.accelerator.c
|
||||
renpy.display.quaternion gen/renpy.display.quaternion.c
|
||||
renpy.uguu.gl gen/renpy.uguu.gl.c
|
||||
renpy.uguu.uguu gen/renpy.uguu.uguu.c
|
||||
renpy.gl.gldraw gen/renpy.gl.gldraw.c
|
||||
renpy.gl.gltexture gen/renpy.gl.gltexture.c
|
||||
renpy.gl.glenviron_shader gen/renpy.gl.glenviron_shader.c
|
||||
renpy.gl.glrtt_copy gen/renpy.gl.glrtt_copy.c
|
||||
renpy.gl.glrtt_fbo gen/renpy.gl.glrtt_fbo.c
|
||||
renpy.gl2.gl2mesh gen/renpy.gl2.gl2mesh.c
|
||||
renpy.gl2.gl2mesh2 gen/renpy.gl2.gl2mesh2.c
|
||||
renpy.gl2.gl2mesh3 gen/renpy.gl2.gl2mesh3.c
|
||||
|
||||
@@ -174,12 +174,6 @@ cython("renpy.display.quaternion", libs=[ 'm' ])
|
||||
cython("renpy.uguu.gl", libs=sdl)
|
||||
cython("renpy.uguu.uguu", libs=sdl)
|
||||
|
||||
cython("renpy.gl.gldraw", libs=sdl)
|
||||
cython("renpy.gl.gltexture", libs=sdl)
|
||||
cython("renpy.gl.glenviron_shader", libs=sdl)
|
||||
cython("renpy.gl.glrtt_copy", libs=sdl)
|
||||
cython("renpy.gl.glrtt_fbo", libs=sdl)
|
||||
|
||||
cython("renpy.gl2.gl2mesh")
|
||||
cython("renpy.gl2.gl2mesh2")
|
||||
cython("renpy.gl2.gl2mesh3")
|
||||
|
||||
@@ -223,7 +223,6 @@ backup_blacklist = {
|
||||
"renpy.test.testmouse",
|
||||
"renpy.test.testparser",
|
||||
"renpy.gl2",
|
||||
"renpy.gl",
|
||||
"renpycoverage",
|
||||
}
|
||||
|
||||
@@ -479,7 +478,6 @@ def import_all():
|
||||
|
||||
sys.modules[pystr('renpy.display.text')] = renpy.text.text
|
||||
|
||||
import renpy.gl
|
||||
import renpy.gl2
|
||||
|
||||
import renpy.display.layout
|
||||
|
||||
@@ -2162,6 +2162,7 @@ EARLY_CONFIG = {
|
||||
"check_translate_none",
|
||||
"defer_tl_scripts",
|
||||
"munge_in_strings",
|
||||
"interface_layer",
|
||||
}
|
||||
|
||||
define_statements = [ ]
|
||||
|
||||
+31
-9
@@ -91,11 +91,13 @@ class AudioData(str):
|
||||
"""
|
||||
:doc: audio
|
||||
|
||||
This class wraps a bytes object containing audio data, so it can be
|
||||
passed to the audio playback system. The audio data should be contained
|
||||
This class wraps a bytes object containing audio or video data, so it can be
|
||||
passed to the audio/video playback system. The audio or video data should be contained
|
||||
in some format Ren'Py supports. (For examples RIFF WAV format headers,
|
||||
not unadorned samples.)
|
||||
|
||||
Despite the name, this can be used to represent video data as well as audio data.
|
||||
|
||||
`data`
|
||||
A bytes object containing the audio file data.
|
||||
|
||||
@@ -104,6 +106,9 @@ class AudioData(str):
|
||||
suggest the format `data` is in, and is reported as part of
|
||||
error messages.
|
||||
|
||||
If this starts with angle bracket, it can supply properties to
|
||||
the audio, like from and to times.
|
||||
|
||||
Once created, this can be used wherever an audio filename is allowed. For
|
||||
example::
|
||||
|
||||
@@ -226,7 +231,7 @@ class Channel(object):
|
||||
# The audio filter to use.
|
||||
audio_filter = None
|
||||
|
||||
def __init__(self, name, default_loop, stop_on_mute, tight, file_prefix, file_suffix, buffer_queue, movie, framedrop):
|
||||
def __init__(self, name, default_loop, stop_on_mute, tight, file_prefix, file_suffix, buffer_queue, movie, framedrop, synchro_start):
|
||||
|
||||
# The name assigned to this channel. This is used to look up
|
||||
# information about the channel in the MusicContext object.
|
||||
@@ -263,6 +268,9 @@ class Channel(object):
|
||||
# once all channels are ready.
|
||||
self.synchro_start = False
|
||||
|
||||
# Does this participate in synchro start by default.
|
||||
self.default_synchro_start = synchro_start
|
||||
|
||||
# The time the music in this channel was last changed.
|
||||
self.last_changed = 0
|
||||
|
||||
@@ -392,8 +400,7 @@ class Channel(object):
|
||||
except Exception:
|
||||
raise exception("expected channel, got {!r}.".format(v))
|
||||
|
||||
if isinstance(filename, AudioData):
|
||||
return filename, 0, -1
|
||||
original_filename = filename
|
||||
|
||||
m = re.match(r'<(.*)>(.*)', filename)
|
||||
if not m:
|
||||
@@ -434,6 +441,9 @@ class Channel(object):
|
||||
if (loop is not None) and looped:
|
||||
start = loop
|
||||
|
||||
if isinstance(original_filename, AudioData):
|
||||
fn = AudioData(original_filename.data, fn)
|
||||
|
||||
return fn, start, end
|
||||
|
||||
def periodic(self):
|
||||
@@ -697,7 +707,10 @@ class Channel(object):
|
||||
|
||||
renpysound.replace_audio_filter(self.number, new_audio_filter)
|
||||
|
||||
def enqueue(self, filenames, loop=True, synchro_start=False, fadein=0, tight=None, loop_only=False, relative_volume=1.0):
|
||||
def enqueue(self, filenames, loop=True, synchro_start=None, fadein=0, tight=None, loop_only=False, relative_volume=1.0):
|
||||
|
||||
if synchro_start is None:
|
||||
synchro_start = self.default_synchro_start
|
||||
|
||||
with lock:
|
||||
|
||||
@@ -838,7 +851,8 @@ def register_channel(name,
|
||||
buffer_queue=True,
|
||||
movie=False,
|
||||
framedrop=True,
|
||||
force=False):
|
||||
force=False,
|
||||
synchro_start=None):
|
||||
"""
|
||||
:doc: audio
|
||||
:args: (name, mixer, loop=None, stop_on_mute=True, tight=False, file_prefix="", file_suffix="", buffer_queue=True, movie=False, framedrop=True)
|
||||
@@ -889,15 +903,23 @@ def register_channel(name,
|
||||
This controls what a video does when lagging. If true, frames will
|
||||
be dropped to keep up with realtime and the soundtrack. If false,
|
||||
Ren'Py will display frames late rather than dropping them.
|
||||
|
||||
`synchro_start`
|
||||
Does this channel particpate in synchro start? Synchro start determines if
|
||||
the channel will start playing at the same time as other channels. If None,
|
||||
this defaults to `loop`.
|
||||
"""
|
||||
|
||||
if synchro_start is None:
|
||||
synchro_start = loop
|
||||
|
||||
if name == "movie":
|
||||
movie = True
|
||||
|
||||
if not force and not renpy.game.context().init_phase and (" " not in name):
|
||||
raise Exception("Can't register channel outside of init phase.")
|
||||
|
||||
c = Channel(name, loop, stop_on_mute, tight, file_prefix, file_suffix, buffer_queue, movie=movie, framedrop=framedrop)
|
||||
c = Channel(name, loop, stop_on_mute, tight, file_prefix, file_suffix, buffer_queue, movie=movie, framedrop=framedrop, synchro_start=synchro_start)
|
||||
|
||||
c.mixer = mixer
|
||||
|
||||
@@ -1016,7 +1038,7 @@ def init():
|
||||
pcm_ok = True
|
||||
except Exception:
|
||||
|
||||
renpy.display.log.write("Sound init failed. Proceeding anyway.")
|
||||
renpy.display.log.write("Audio and video init failed. Proceeding anyway.")
|
||||
renpy.display.log.exception()
|
||||
|
||||
os.environ["SDL_AUDIODRIVER"] = "dummy"
|
||||
|
||||
@@ -34,7 +34,7 @@ from renpy.audio.audio import get_channel, get_serial
|
||||
from renpy.audio.audio import register_channel, alias_channel
|
||||
|
||||
|
||||
def play(filenames, channel="music", loop=None, fadeout=None, synchro_start=True, fadein=0, tight=None, if_changed=False, relative_volume=1.0):
|
||||
def play(filenames, channel="music", loop=None, fadeout=None, synchro_start=None, fadein=0, tight=None, if_changed=False, relative_volume=1.0):
|
||||
"""
|
||||
:doc: audio
|
||||
|
||||
@@ -62,6 +62,8 @@ def play(filenames, channel="music", loop=None, fadeout=None, synchro_start=True
|
||||
channels start playing. This is useful when playing two audio files that
|
||||
are meant to be synchronized with each other.
|
||||
|
||||
If None, this takes its value from the channel.
|
||||
|
||||
`fadein`
|
||||
This is the number of seconds to fade the music in for, on the
|
||||
first loop only.
|
||||
|
||||
+8
-4
@@ -43,11 +43,12 @@ class Callbacks(object):
|
||||
This stores and calls the character callbacks.
|
||||
"""
|
||||
|
||||
def __init__(self, callbacks, interact, type, cb_args):
|
||||
def __init__(self, callbacks, interact, type, cb_args, multiple):
|
||||
self.callbacks = callbacks
|
||||
self.interact = interact
|
||||
self.type = type
|
||||
self.cb_args = cb_args
|
||||
self.multiple = multiple # type: tuple[int, int]|None
|
||||
|
||||
self.what = None # type: str|None
|
||||
self.start = None # type: int|None
|
||||
@@ -79,6 +80,9 @@ class Callbacks(object):
|
||||
if self.last_segment is not None:
|
||||
kwargs["last_segment"] = self.last_segment
|
||||
|
||||
if self.multiple is not None:
|
||||
kwargs["multiple"] = self.multiple
|
||||
|
||||
kwargs["please_ignore_unknown_keyword_arguments"] = None
|
||||
|
||||
kwargs.update(self.cb_args)
|
||||
@@ -87,7 +91,7 @@ class Callbacks(object):
|
||||
c(*args, **kwargs)
|
||||
|
||||
def copy(self):
|
||||
rv = Callbacks(self.callbacks, self.interact, self.type, self.cb_args)
|
||||
rv = Callbacks(self.callbacks, self.interact, self.type, self.cb_args, self.multiple)
|
||||
rv.__dict__.update(self.__dict__)
|
||||
return rv
|
||||
|
||||
@@ -566,7 +570,7 @@ def display_say(
|
||||
callback = [ callback ]
|
||||
|
||||
callback = renpy.config.all_character_callbacks + callback
|
||||
callback = Callbacks(callback, interact, type, cb_args)
|
||||
callback = Callbacks(callback, interact, type, cb_args, multiple)
|
||||
|
||||
roll_forward = renpy.exports.roll_forward_info()
|
||||
|
||||
@@ -790,7 +794,7 @@ def display_say(
|
||||
|
||||
slow = False
|
||||
|
||||
pause_callback("show_done")
|
||||
pause_callback("show_done")
|
||||
|
||||
if not slow:
|
||||
slow_done()
|
||||
|
||||
@@ -408,10 +408,11 @@ init -1500 python:
|
||||
layout.yesno_screen(layout.OVERWRITE_SAVE, FileSave(self.name, False, False, self.page, cycle=self.cycle, slot=self.slot, action=self.action))
|
||||
return
|
||||
|
||||
if self.cycle:
|
||||
renpy.renpy.loadsave.cycle_saves(__slotname("", self.page, self.slot), config.quicksave_slots)
|
||||
with renpy.savelocation.SyncfsLock():
|
||||
if self.cycle:
|
||||
renpy.renpy.loadsave.cycle_saves(__slotname("", self.page, self.slot), config.quicksave_slots)
|
||||
|
||||
renpy.save(fn, extra_info=save_name)
|
||||
renpy.save(fn, extra_info=save_name)
|
||||
|
||||
renpy.restart_interaction()
|
||||
|
||||
|
||||
@@ -300,6 +300,11 @@ init -1500 python:
|
||||
if not self.get_sensitive():
|
||||
return
|
||||
|
||||
if config.skipping:
|
||||
config.skipping = None
|
||||
renpy.restart_interaction()
|
||||
return
|
||||
|
||||
if self.confirm:
|
||||
if self.fast:
|
||||
if _preferences.skip_unseen:
|
||||
@@ -317,14 +322,10 @@ init -1500 python:
|
||||
else:
|
||||
renpy.jump("_return_skipping")
|
||||
else:
|
||||
|
||||
if not config.skipping:
|
||||
if self.fast:
|
||||
config.skipping = "fast"
|
||||
else:
|
||||
config.skipping = "slow"
|
||||
if self.fast:
|
||||
config.skipping = "fast"
|
||||
else:
|
||||
config.skipping = None
|
||||
config.skipping = "slow"
|
||||
|
||||
renpy.restart_interaction()
|
||||
|
||||
|
||||
@@ -173,11 +173,7 @@ init -1500 python:
|
||||
self.url = url
|
||||
|
||||
def __call__(self):
|
||||
try:
|
||||
import webbrowser
|
||||
webbrowser.open_new(self.url)
|
||||
except Exception:
|
||||
pass
|
||||
renpy.open_url(self.url)
|
||||
|
||||
class With(Action, DictEquality):
|
||||
"""
|
||||
|
||||
@@ -217,7 +217,6 @@ init -1100 python:
|
||||
|
||||
if version <= (7, 4, 4):
|
||||
config.pause_after_rollback = True
|
||||
config.gl2 = False
|
||||
config.gl_lod_bias = -1.0
|
||||
config.who_what_sub_compat = 1
|
||||
|
||||
|
||||
@@ -230,11 +230,7 @@ init -1500 python:
|
||||
if protocol in config.hyperlink_handlers:
|
||||
return config.hyperlink_handlers[protocol](value)
|
||||
else:
|
||||
try:
|
||||
import webbrowser
|
||||
webbrowser.open(target)
|
||||
except Exception:
|
||||
pass
|
||||
renpy.open_url(target)
|
||||
|
||||
def hyperlink_sensitive(target):
|
||||
|
||||
|
||||
@@ -51,8 +51,9 @@ init -1500 python:
|
||||
class __GalleryImage(object):
|
||||
|
||||
show_properties = None
|
||||
movie = False
|
||||
|
||||
def __init__(self, gallery, displayables, **properties):
|
||||
def __init__(self, gallery, displayables, movie=False, **properties):
|
||||
|
||||
# The gallery object we belong to.
|
||||
self.gallery = gallery
|
||||
@@ -67,6 +68,8 @@ init -1500 python:
|
||||
# to not apply a transform.
|
||||
self.transforms = [ None ] * len(displayables)
|
||||
|
||||
self.movie = movie
|
||||
|
||||
self.show_properties, = renpy.split_properties(properties, "show_")
|
||||
|
||||
def check_unlock(self, all_prior):
|
||||
@@ -103,7 +106,13 @@ init -1500 python:
|
||||
|
||||
renpy.show_screen(self.gallery.image_screen, locked=locked, index=index + 1, count=count, displayables=displayables, gallery=self.gallery, **self.show_properties)
|
||||
|
||||
return ui.interact()
|
||||
rv = ui.interact()
|
||||
|
||||
if self.movie:
|
||||
renpy.hide_screen(self.gallery.image_screen)
|
||||
renpy.pause(0)
|
||||
|
||||
return rv
|
||||
|
||||
|
||||
class __GalleryButton(object):
|
||||
@@ -285,6 +294,13 @@ init -1500 python:
|
||||
Properties beginning with `show_` have that prefix stripped off,
|
||||
and are passed to the gallery.image_screen screen as additional
|
||||
keyword arguments.
|
||||
|
||||
This takes one keword argument:
|
||||
|
||||
`movie`
|
||||
This should be set to true if one of the displayables is a
|
||||
movie with sound. This will cause the movie to be hidden
|
||||
during a transition.
|
||||
"""
|
||||
|
||||
self.image_ = __GalleryImage(self, displayables, **properties)
|
||||
|
||||
@@ -27,8 +27,7 @@ init -1500:
|
||||
python:
|
||||
class _SetRenderer(Action):
|
||||
"""
|
||||
Sets the preferred renderer to one of "auto", "angle", "gl", or
|
||||
"sw".
|
||||
Sets the preferred renderer.
|
||||
"""
|
||||
|
||||
def __init__(self, renderer):
|
||||
@@ -95,24 +94,6 @@ init -1500:
|
||||
action _SetRenderer("auto")
|
||||
style_suffix "radio_button"
|
||||
|
||||
if not config.gl2:
|
||||
|
||||
if gl:
|
||||
textbutton _("Force GL Renderer"):
|
||||
action _SetRenderer("gl")
|
||||
style_suffix "radio_button"
|
||||
|
||||
if angle:
|
||||
textbutton _("Force ANGLE Renderer"):
|
||||
action _SetRenderer("angle")
|
||||
style_suffix "radio_button"
|
||||
|
||||
if gles:
|
||||
textbutton _("Force GLES Renderer"):
|
||||
action _SetRenderer("gles")
|
||||
style_suffix "radio_button"
|
||||
|
||||
|
||||
if gl:
|
||||
textbutton _("Force GL2 Renderer"):
|
||||
action _SetRenderer("gl2")
|
||||
@@ -349,16 +330,11 @@ init -1500 python:
|
||||
|
||||
renderer_info = renpy.get_renderer_info()
|
||||
|
||||
# Software renderer check.
|
||||
# Software renderer check.
|
||||
if config.renderer != "sw" and renderer_info["renderer"] == "sw":
|
||||
problem = "sw"
|
||||
allow_continue = False
|
||||
|
||||
# Game require gl2 that wasn't initialized.
|
||||
elif config.gl2 and not renderer_info.get("models", False):
|
||||
problem = "gl2"
|
||||
allow_continue = False
|
||||
|
||||
if problem is None:
|
||||
return
|
||||
|
||||
|
||||
@@ -275,21 +275,18 @@ init -1600 python:
|
||||
renpy.call_in_new_context(help)
|
||||
return
|
||||
|
||||
_preferences.fullscreen = False
|
||||
|
||||
try:
|
||||
import webbrowser
|
||||
import os
|
||||
|
||||
if help.startswith('http://') or help.startswith('https://'):
|
||||
webbrowser.open_new(help)
|
||||
renpy.open_url(help)
|
||||
return
|
||||
|
||||
file_path = os.path.join(config.basedir, help)
|
||||
if not os.path.isfile(file_path):
|
||||
return
|
||||
|
||||
webbrowser.open_new("file:///" + file_path)
|
||||
renpy.open_url("file:///" + file_path)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
@@ -220,6 +220,8 @@ init -1500 python:
|
||||
* Preference("font transform", "dejavusans") - Sets the accessibility font transform to deja vu sans.
|
||||
* Preference("font transform", None) - Disables the accessibility font transform.
|
||||
|
||||
See :var:`config.font_transforms` for how to add font transforms.
|
||||
|
||||
* Preference("font size", 1.0) - Sets the accessibility font size scaling factor.
|
||||
* Preference("font line spacing", 1.0) - Sets the accessibility font vertical spacing scaling factor.
|
||||
|
||||
|
||||
@@ -413,10 +413,7 @@ init -1100 python in _sync:
|
||||
os.rename(nfn, fn)
|
||||
|
||||
renpy.loadsave.location.scan()
|
||||
|
||||
if renpy.emscripten:
|
||||
import emscripten
|
||||
emscripten.syncfs()
|
||||
renpy.savelocation.syncfs()
|
||||
|
||||
return True
|
||||
|
||||
|
||||
@@ -284,11 +284,7 @@ init python:
|
||||
|
||||
def _error_hyperlink_function(target):
|
||||
if target.startswith("http:") or target.startswith("https:"):
|
||||
try:
|
||||
import webbrowser
|
||||
webbrowser.open(target)
|
||||
except Exception:
|
||||
pass
|
||||
renpy.open_url(target)
|
||||
|
||||
if target.startswith("edit:"):
|
||||
prefix, line, filename = target.split(":", 2)
|
||||
|
||||
@@ -227,7 +227,7 @@ def init_keymap():
|
||||
|
||||
def clear_keymap_cache():
|
||||
"""
|
||||
:undocumented:
|
||||
:doc: keymap
|
||||
|
||||
Clears the keymap cache. This allows changes to :var:`config.keymap` to
|
||||
take effect without restarting Ren'Py.
|
||||
|
||||
+51
-19
@@ -108,6 +108,30 @@ enabled_events = {
|
||||
EVENTNAME,
|
||||
}
|
||||
|
||||
input_events = {
|
||||
pygame.KEYDOWN,
|
||||
pygame.KEYUP,
|
||||
|
||||
pygame.TEXTEDITING,
|
||||
pygame.TEXTINPUT,
|
||||
|
||||
pygame.MOUSEMOTION,
|
||||
pygame.MOUSEBUTTONDOWN,
|
||||
pygame.MOUSEBUTTONUP,
|
||||
pygame.MOUSEWHEEL,
|
||||
|
||||
pygame.JOYAXISMOTION,
|
||||
pygame.JOYHATMOTION,
|
||||
pygame.JOYBALLMOTION,
|
||||
pygame.JOYBUTTONDOWN,
|
||||
pygame.JOYBUTTONUP,
|
||||
|
||||
pygame.CONTROLLERAXISMOTION,
|
||||
pygame.CONTROLLERBUTTONDOWN,
|
||||
pygame.CONTROLLERBUTTONUP,
|
||||
}
|
||||
|
||||
|
||||
# The number of msec between periodic events.
|
||||
PERIODIC_INTERVAL = 50
|
||||
|
||||
@@ -742,6 +766,9 @@ class Interface(object):
|
||||
# The time when the event was dispatched.
|
||||
self.event_time = 0
|
||||
|
||||
# The time of the last input event (mouse, keyboard, gamepad).
|
||||
self.input_event_time = 0
|
||||
|
||||
# The time we saw the last mouse event.
|
||||
self.mouse_event_time = None
|
||||
|
||||
@@ -1174,24 +1201,15 @@ class Interface(object):
|
||||
renpy.config.renderer = renderer
|
||||
|
||||
if renpy.android or renpy.ios or renpy.emscripten:
|
||||
renderers = [ "gles" ]
|
||||
renderers = [ "gles2" ]
|
||||
elif renpy.windows:
|
||||
renderers = [ "gl", "angle", "gles" ]
|
||||
renderers = [ "gl2", "angle2", "gles2" ]
|
||||
else:
|
||||
renderers = [ "gl", "gles" ]
|
||||
|
||||
gl2_renderers = [ ]
|
||||
|
||||
for i in [ "gl", "angle", "gles" ]:
|
||||
|
||||
if i in renderers:
|
||||
gl2_renderers.append(i + "2")
|
||||
|
||||
renderers = gl2_renderers + renderers
|
||||
renderers = [ "gl2", "gles2" ]
|
||||
|
||||
# Prevent a performance warning if the renderer
|
||||
# is taken from old persistent data.
|
||||
if renderer not in gl2_renderers and (renpy.macintosh or renpy.android or renpy.config.gl2):
|
||||
if renderer not in renderers:
|
||||
renderer = "auto"
|
||||
|
||||
# Software renderer is the last hope for PC .
|
||||
@@ -1227,10 +1245,6 @@ class Interface(object):
|
||||
|
||||
return False
|
||||
|
||||
make_draw("gl", "renpy.gl.gldraw", "GLDraw", "gl")
|
||||
make_draw("angle", "renpy.gl.gldraw", "GLDraw", "angle")
|
||||
make_draw("gles", "renpy.gl.gldraw", "GLDraw", "gles")
|
||||
|
||||
make_draw("gl2", "renpy.gl2.gl2draw", "GL2Draw", "gl2")
|
||||
make_draw("angle2", "renpy.gl2.gl2draw", "GL2Draw", "angle2")
|
||||
make_draw("gles2", "renpy.gl2.gl2draw", "GL2Draw", "gles2")
|
||||
@@ -1337,7 +1351,6 @@ class Interface(object):
|
||||
raise Exception("Could not set video mode.")
|
||||
|
||||
renpy.session["renderer"] = draw.info["renderer"]
|
||||
renpy.game.persistent._gl2 = renpy.config.gl2
|
||||
|
||||
if renpy.android:
|
||||
android.init()
|
||||
@@ -2315,11 +2328,24 @@ class Interface(object):
|
||||
|
||||
if not self.did_autosave:
|
||||
renpy.loadsave.autosave()
|
||||
renpy.persistent.check_update()
|
||||
self.did_autosave = True
|
||||
|
||||
step += 1
|
||||
|
||||
# Step 6: Persistent data.
|
||||
elif step == 6:
|
||||
|
||||
if not self.did_persistent:
|
||||
|
||||
if renpy.emscripten:
|
||||
renpy.persistent.update()
|
||||
else:
|
||||
renpy.persistent.check_update()
|
||||
|
||||
self.did_persistent = True
|
||||
|
||||
step += 1
|
||||
|
||||
else:
|
||||
|
||||
# Check to see if preloading has finished
|
||||
@@ -2746,6 +2772,9 @@ class Interface(object):
|
||||
# We only want to do autosave once.
|
||||
self.did_autosave = False
|
||||
|
||||
# We only want to save persistent once.
|
||||
self.did_persistent = False
|
||||
|
||||
old_timeout_time = None
|
||||
old_redraw_time = None
|
||||
|
||||
@@ -3216,6 +3245,9 @@ class Interface(object):
|
||||
|
||||
self.event_time = end_time = get_time()
|
||||
|
||||
if ev.type in input_events:
|
||||
self.input_event_time = self.event_time
|
||||
|
||||
try:
|
||||
|
||||
if self.touch:
|
||||
|
||||
@@ -60,8 +60,6 @@ def init_display():
|
||||
The minimum amount of code required to init the display.
|
||||
"""
|
||||
|
||||
renpy.config.gl2 = getattr(renpy.game.persistent, "_gl2", True)
|
||||
|
||||
# Ensure we have correctly-typed preferences.
|
||||
renpy.game.preferences.check()
|
||||
|
||||
|
||||
@@ -434,7 +434,7 @@ def before_interact(roots):
|
||||
max_default_focus_name = None
|
||||
|
||||
# Should we do the max_default logic?
|
||||
should_max_default = renpy.display.interface.event_time > renpy.display.interface.mouse_event_time + .1
|
||||
should_max_default = renpy.display.interface.input_event_time > renpy.display.interface.mouse_event_time + .1
|
||||
|
||||
# Is this an explicit change, using the override operation?
|
||||
explicit = False
|
||||
|
||||
+62
-41
@@ -537,39 +537,6 @@ def mark_sweep():
|
||||
live_renders = worklist
|
||||
|
||||
|
||||
def compute_subline(sx0, sw, cx0, cw):
|
||||
"""
|
||||
Given a source line (start sx0, width sw) and a crop line (cx0, cw),
|
||||
return three things:
|
||||
|
||||
* The offset of the portion of the source line that overlaps with
|
||||
the crop line, relative to the crop line.
|
||||
* The offset of the portion of the source line that overlaps with the
|
||||
the crop line, relative to the source line.
|
||||
* The length of the overlap in pixels. (can be <= 0)
|
||||
"""
|
||||
|
||||
sx1 = sx0 + sw
|
||||
cx1 = cx0 + cw
|
||||
|
||||
if sx0 > cx0:
|
||||
start = sx0
|
||||
else:
|
||||
start = cx0
|
||||
|
||||
offset = start - cx0
|
||||
crop = start - sx0
|
||||
|
||||
if sx1 < cx1:
|
||||
width = sx1 - start
|
||||
else:
|
||||
width = cx1 - start
|
||||
|
||||
return offset, crop, width
|
||||
|
||||
|
||||
|
||||
|
||||
# Possible operations that can be done as part of a render.
|
||||
BLIT = 0
|
||||
DISSOLVE = 1
|
||||
@@ -915,7 +882,42 @@ cdef class Render:
|
||||
|
||||
pygame_surface = render_to_texture
|
||||
|
||||
def subsurface(self, rect, focus=False, subpixel=False):
|
||||
|
||||
def compute_subline(self, sx, sw, cx, cw, bx, bw):
|
||||
"""
|
||||
Given a source line (start sx0, width sw) and a crop line (cx0, cw),
|
||||
return three things:
|
||||
|
||||
* The offset of the portion of the source line that overlaps with
|
||||
the crop line, relative to the crop line.
|
||||
* The offset of the portion of the source line that overlaps with the
|
||||
the crop line, relative to the source line.
|
||||
* The length of the overlap in pixels. (can be <= 0)
|
||||
"""
|
||||
|
||||
|
||||
s_end = sx + sw
|
||||
c_end = cx + cw
|
||||
|
||||
start = max(sx, cx)
|
||||
|
||||
offset = start - cx
|
||||
crop = start - sx
|
||||
|
||||
end = min(s_end, c_end)
|
||||
width = end - start
|
||||
|
||||
bsx = max(sx, bx)
|
||||
|
||||
if bsx < 0:
|
||||
offset += bsx
|
||||
crop += bsx
|
||||
width -= bsx
|
||||
|
||||
return offset, crop, width
|
||||
|
||||
|
||||
def subsurface(self, rect, focus=False, subpixel=False, bounds=None):
|
||||
"""
|
||||
Returns a subsurface of this render. If `focus` is true, then
|
||||
the focuses are copied from this render to the child.
|
||||
@@ -929,6 +931,14 @@ cdef class Render:
|
||||
w = int(w)
|
||||
h = int(h)
|
||||
|
||||
if bounds is not None:
|
||||
bx, by, bw, bh = bounds
|
||||
else:
|
||||
bx = x
|
||||
by = y
|
||||
bw = w
|
||||
bh = h
|
||||
|
||||
rv = Render(w, h)
|
||||
|
||||
reverse = self.reverse
|
||||
@@ -991,8 +1001,11 @@ cdef class Render:
|
||||
child_subpixel = subpixel or not isinstance(cx, int) or not isinstance(cy, int)
|
||||
|
||||
childw, childh = child.get_size()
|
||||
xo, cx, cw = compute_subline(cx, childw, x, w)
|
||||
yo, cy, ch = compute_subline(cy, childh, y, h)
|
||||
xo, cx, cw = self.compute_subline(cx, childw, x, w, bx, bw)
|
||||
yo, cy, ch = self.compute_subline(cy, childh, y, h, by, bh)
|
||||
|
||||
cbx = bx - xo
|
||||
cby = by - yo
|
||||
|
||||
if cw <= 0 or ch <= 0 or w - xo <= 0 or h - yo <= 0:
|
||||
continue
|
||||
@@ -1007,17 +1020,25 @@ cdef class Render:
|
||||
if isinstance(child, Render):
|
||||
|
||||
if child.xclipping:
|
||||
end = min(cw, cbx+bw)
|
||||
cbx = max(0, cbx)
|
||||
bw = end - cbx
|
||||
|
||||
cropw = cw
|
||||
else:
|
||||
cropw = w - xo
|
||||
|
||||
if child.yclipping:
|
||||
end = min(ch, cby+bh)
|
||||
cby = max(0, cby)
|
||||
bh = end - cby
|
||||
|
||||
croph = ch
|
||||
else:
|
||||
croph = h - yo
|
||||
|
||||
crop = (cx, cy, cropw, croph)
|
||||
newchild = child.subsurface(crop, focus=focus, subpixel=child_subpixel)
|
||||
newchild = child.subsurface(crop, focus=focus, subpixel=child_subpixel, bounds=(cbx, cby, bw, bh))
|
||||
newchild.width = cw
|
||||
newchild.height = ch
|
||||
newchild.render_of = child.render_of[:]
|
||||
@@ -1044,8 +1065,8 @@ cdef class Render:
|
||||
rv.add_focus(d, arg, xo, yo, fw, fh, mx, my, mask)
|
||||
continue
|
||||
|
||||
xo, cx, fw = compute_subline(xo, fw, x, w)
|
||||
yo, cy, fh = compute_subline(yo, fh, y, h)
|
||||
xo, cx, fw = self.compute_subline(xo, fw, x, w, bx, bw)
|
||||
yo, cy, fh = self.compute_subline(yo, fh, y, h, by, bh)
|
||||
|
||||
if fw <= 0 or fh <= 0:
|
||||
continue
|
||||
@@ -1054,8 +1075,8 @@ cdef class Render:
|
||||
|
||||
mw, mh = mask.get_size()
|
||||
|
||||
mx, mcx, mw = compute_subline(mx, mw, x, w)
|
||||
my, mcy, mh = compute_subline(my, mh, y, h)
|
||||
mx, mcx, mw = self.compute_subline(mx, mw, x, w, bx, bw)
|
||||
my, mcy, mh = self.compute_subline(my, mh, y, h, by, bh)
|
||||
|
||||
if mw <= 0 or mh <= 0:
|
||||
mx = None
|
||||
|
||||
@@ -194,14 +194,32 @@ class TransformState(renpy.object.Object):
|
||||
Returns the value of an attribute.
|
||||
"""
|
||||
|
||||
rv = getattr(self, prop, None)
|
||||
if rv is not None:
|
||||
return rv
|
||||
old_xpos = self.xpos
|
||||
old_ypos = self.ypos
|
||||
old_xanchor = self.xanchor
|
||||
old_yanchor = self.yanchor
|
||||
|
||||
try:
|
||||
if self.xpos is None:
|
||||
self.xpos = self.inherited_xpos
|
||||
|
||||
if self.ypos is None:
|
||||
self.ypos = self.inherited_ypos
|
||||
|
||||
if self.xanchor is None:
|
||||
self.xanchor = self.inherited_xanchor
|
||||
|
||||
if self.yanchor is None:
|
||||
self.yanchor = self.inherited_yanchor
|
||||
|
||||
return getattr(self, prop, None)
|
||||
|
||||
finally:
|
||||
self.xpos = old_xpos
|
||||
self.ypos = old_ypos
|
||||
self.xanchor = old_xanchor
|
||||
self.yanchor = old_yanchor
|
||||
|
||||
if prop in diff4_properties:
|
||||
return getattr(self, "inherited_" + prop, None)
|
||||
else:
|
||||
return rv
|
||||
|
||||
|
||||
def get_placement(self, cxoffset=0, cyoffset=0):
|
||||
|
||||
@@ -335,6 +335,7 @@ from renpy.exports.contextexports import (
|
||||
pop_return,
|
||||
scry,
|
||||
set_return_stack,
|
||||
stop_skipping,
|
||||
)
|
||||
|
||||
from renpy.exports.debugexports import (
|
||||
@@ -495,6 +496,7 @@ from renpy.exports.platformexports import (
|
||||
request_permission,
|
||||
variant,
|
||||
vibrate,
|
||||
open_url,
|
||||
)
|
||||
|
||||
from renpy.exports.predictexports import (
|
||||
|
||||
@@ -358,6 +358,16 @@ def is_skipping():
|
||||
return not not renpy.config.skipping
|
||||
|
||||
|
||||
def stop_skipping():
|
||||
"""
|
||||
:doc: other
|
||||
|
||||
Stops skipping, if Ren'Py is currently skipping.
|
||||
"""
|
||||
|
||||
renpy.config.skipping = None
|
||||
|
||||
|
||||
def is_init_phase():
|
||||
"""
|
||||
:doc: other
|
||||
|
||||
@@ -276,3 +276,19 @@ def request_permission(permission):
|
||||
return False
|
||||
|
||||
return get_sdl_dll().SDL_AndroidRequestPermission(permission.encode("utf-8")) # type: ignore
|
||||
|
||||
def open_url(url):
|
||||
"""
|
||||
:doc: other
|
||||
|
||||
Opens a URL in the system's web browser, if possible.
|
||||
"""
|
||||
|
||||
if not renpy.mobile:
|
||||
renpy.game.preferences.fullscreen = False
|
||||
|
||||
try:
|
||||
import webbrowser
|
||||
webbrowser.open_new(url)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
@@ -1,17 +0,0 @@
|
||||
from __future__ import division, absolute_import, with_statement, print_function, unicode_literals
|
||||
from renpy.compat import PY2, basestring, bchr, bord, chr, open, pystr, range, round, str, tobytes, unicode # *
|
||||
|
||||
|
||||
|
||||
import renpy
|
||||
renpy.update_path()
|
||||
|
||||
|
||||
# Generated by scripts/relative_imports.py, do not edit below this line.
|
||||
if 1 == 0:
|
||||
from . import gldraw
|
||||
from . import glenviron_shader
|
||||
from . import glfunctions
|
||||
from . import glrtt_copy
|
||||
from . import glrtt_fbo
|
||||
from . import gltexture
|
||||
@@ -1,96 +0,0 @@
|
||||
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
# (the "Software"), to deal in the Software without restriction,
|
||||
# including without limitation the rights to use, copy, modify, merge,
|
||||
# publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
# and to permit persons to whom the Software is furnished to do so,
|
||||
# subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
from renpy.display.matrix cimport Matrix, Matrix2D
|
||||
cimport renpy.display.render as render
|
||||
|
||||
cdef class Environ
|
||||
|
||||
cdef class GLDraw:
|
||||
|
||||
cdef bint gles
|
||||
cdef bint angle
|
||||
cdef bint did_init
|
||||
cdef bint did_texture_test
|
||||
cdef Environ environ
|
||||
cdef public object rtt
|
||||
cdef object window
|
||||
cdef tuple virtual_size
|
||||
cdef public tuple physical_size
|
||||
cdef public tuple drawable_size
|
||||
cdef public tuple virtual_box
|
||||
cdef public tuple physical_box
|
||||
cdef object texture_cache
|
||||
cdef double last_redraw_time
|
||||
cdef double redraw_period
|
||||
cdef public dict info
|
||||
cdef object old_fullscreen
|
||||
cdef public object fullscreen_surface
|
||||
cdef object display_info
|
||||
cdef tuple clip_cache
|
||||
cdef bint fast_dissolve
|
||||
cdef tuple default_clip
|
||||
cdef bint did_render_to_texture
|
||||
cdef float dpi_scale
|
||||
cdef object ready_texture_queue
|
||||
|
||||
cdef public tuple clip_rtt_box
|
||||
|
||||
# The number of drawable pixels per virtual pixel.
|
||||
cdef public object draw_per_virt
|
||||
|
||||
# Matrices that transform drawable to virtual, and vice versa.
|
||||
cdef public Matrix virt_to_draw
|
||||
cdef public Matrix draw_to_virt
|
||||
|
||||
cdef public int fast_redraw_frames
|
||||
|
||||
cpdef set_clip(GLDraw self, tuple clip)
|
||||
|
||||
cpdef int draw_render_textures(
|
||||
GLDraw self,
|
||||
object what,
|
||||
bint non_aligned) except 1
|
||||
|
||||
cpdef int draw_transformed(
|
||||
GLDraw self,
|
||||
object what,
|
||||
tuple clip,
|
||||
double xo,
|
||||
double yo,
|
||||
double alpha,
|
||||
double over,
|
||||
Matrix reverse,
|
||||
bint nearest,
|
||||
bint subpixel) except 1
|
||||
|
||||
cdef class Environ:
|
||||
cdef void blit(self)
|
||||
cdef void blend(self, double fraction)
|
||||
cdef void imageblend(self, double fraction, int ramp)
|
||||
cdef void set_vertex(self, float *vertices)
|
||||
cdef void set_texture(self, int unit, float *coords)
|
||||
cdef void set_color(self, float r, float g, float b, float a)
|
||||
cdef void set_clip(self, tuple clip_box, GLDraw draw)
|
||||
cdef void unset_clip(self, GLDraw draw)
|
||||
cdef void ortho(self, double left, double right, double bottom, double top, double near, double far)
|
||||
cdef void viewport(self, int x, int y, int width, int height)
|
||||
|
||||
-1417
File diff suppressed because it is too large
Load Diff
@@ -1,671 +0,0 @@
|
||||
#cython: profile=False
|
||||
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
# (the "Software"), to deal in the Software without restriction,
|
||||
# including without limitation the rights to use, copy, modify, merge,
|
||||
# publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
# and to permit persons to whom the Software is furnished to do so,
|
||||
# subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
from renpy.uguu.gl cimport *
|
||||
from renpy.gl.gldraw cimport *
|
||||
|
||||
cdef int round(double d):
|
||||
return <int> (d + .5)
|
||||
|
||||
|
||||
GLES_PORTABILITY = """\
|
||||
#ifdef GL_ES
|
||||
#ifdef GL_FRAGMENT_PRECISION_HIGH
|
||||
precision highp float;
|
||||
# else
|
||||
precision mediump float;
|
||||
# endif
|
||||
#endif
|
||||
"""
|
||||
|
||||
VERTEX_SHADER1 = GLES_PORTABILITY + """\
|
||||
uniform mat4 Projection;
|
||||
|
||||
attribute vec4 Vertex;
|
||||
attribute vec2 VertexTexCoord0;
|
||||
|
||||
varying vec2 TexCoord0;
|
||||
|
||||
varying vec2 pos;
|
||||
|
||||
void main() {
|
||||
TexCoord0 = VertexTexCoord0;
|
||||
|
||||
pos = Vertex.xy;
|
||||
gl_Position = Projection * Vertex;
|
||||
}
|
||||
"""
|
||||
|
||||
VERTEX_SHADER2 = GLES_PORTABILITY + """\
|
||||
uniform mat4 Projection;
|
||||
|
||||
attribute vec4 Vertex;
|
||||
attribute vec2 VertexTexCoord0;
|
||||
attribute vec2 VertexTexCoord1;
|
||||
|
||||
varying vec2 TexCoord0;
|
||||
varying vec2 TexCoord1;
|
||||
|
||||
varying vec2 pos;
|
||||
|
||||
void main() {
|
||||
TexCoord0 = VertexTexCoord0;
|
||||
TexCoord1 = VertexTexCoord1;
|
||||
|
||||
pos = Vertex.xy;
|
||||
gl_Position = Projection * Vertex;
|
||||
}
|
||||
"""
|
||||
|
||||
VERTEX_SHADER3 = GLES_PORTABILITY + """\
|
||||
uniform mat4 Projection;
|
||||
|
||||
attribute vec4 Vertex;
|
||||
attribute vec2 VertexTexCoord0;
|
||||
attribute vec2 VertexTexCoord1;
|
||||
attribute vec2 VertexTexCoord2;
|
||||
|
||||
varying vec2 TexCoord0;
|
||||
varying vec2 TexCoord1;
|
||||
varying vec2 TexCoord2;
|
||||
|
||||
varying vec2 pos;
|
||||
|
||||
void main() {
|
||||
TexCoord0 = VertexTexCoord0;
|
||||
TexCoord1 = VertexTexCoord1;
|
||||
TexCoord2 = VertexTexCoord2;
|
||||
|
||||
pos = Vertex.xy;
|
||||
gl_Position = Projection * Vertex;
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
|
||||
|
||||
BLIT_SHADER = GLES_PORTABILITY + """\
|
||||
uniform vec4 Color;
|
||||
uniform sampler2D tex0;
|
||||
|
||||
varying vec2 TexCoord0;
|
||||
|
||||
varying vec2 pos;
|
||||
uniform vec2 clip0;
|
||||
uniform vec2 clip1;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 color0 = texture2D(tex0, TexCoord0.st);
|
||||
gl_FragColor = color0 * Color;
|
||||
}
|
||||
"""
|
||||
|
||||
BLIT_CLIP_SHADER = GLES_PORTABILITY + """\
|
||||
uniform vec4 Color;
|
||||
uniform sampler2D tex0;
|
||||
|
||||
varying vec2 TexCoord0;
|
||||
|
||||
varying vec2 pos;
|
||||
uniform vec2 clip0;
|
||||
uniform vec2 clip1;
|
||||
|
||||
void main()
|
||||
{
|
||||
if (pos.x < clip0.x || pos.y < clip0.y || pos.x >= clip1.x || pos.y >= clip1.y) {
|
||||
discard;
|
||||
}
|
||||
|
||||
vec4 color0 = texture2D(tex0, TexCoord0.st);
|
||||
gl_FragColor = color0 * Color;
|
||||
}
|
||||
"""
|
||||
|
||||
BLEND_SHADER = GLES_PORTABILITY + """\
|
||||
uniform vec4 Color;
|
||||
uniform sampler2D tex0;
|
||||
uniform sampler2D tex1;
|
||||
uniform float done;
|
||||
|
||||
varying vec2 TexCoord0;
|
||||
varying vec2 TexCoord1;
|
||||
|
||||
varying vec2 pos;
|
||||
uniform vec2 clip0;
|
||||
uniform vec2 clip1;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 color0 = texture2D(tex0, TexCoord0.st);
|
||||
vec4 color1 = texture2D(tex1, TexCoord1.st);
|
||||
|
||||
gl_FragColor = mix(color0, color1, done) * Color;
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
BLEND_CLIP_SHADER = GLES_PORTABILITY + """\
|
||||
uniform vec4 Color;
|
||||
uniform sampler2D tex0;
|
||||
uniform sampler2D tex1;
|
||||
uniform float done;
|
||||
|
||||
varying vec2 TexCoord0;
|
||||
varying vec2 TexCoord1;
|
||||
|
||||
varying vec2 pos;
|
||||
uniform vec2 clip0;
|
||||
uniform vec2 clip1;
|
||||
|
||||
void main()
|
||||
{
|
||||
if (pos.x < clip0.x || pos.y < clip0.y || pos.x >= clip1.x || pos.y >= clip1.y) {
|
||||
discard;
|
||||
}
|
||||
|
||||
vec4 color0 = texture2D(tex0, TexCoord0.st);
|
||||
vec4 color1 = texture2D(tex1, TexCoord1.st);
|
||||
|
||||
gl_FragColor = mix(color0, color1, done) * Color;
|
||||
}
|
||||
"""
|
||||
|
||||
IMAGEBLEND_SHADER = GLES_PORTABILITY + """\
|
||||
uniform vec4 Color;
|
||||
uniform sampler2D tex0;
|
||||
uniform sampler2D tex1;
|
||||
uniform sampler2D tex2;
|
||||
uniform float offset;
|
||||
uniform float multiplier;
|
||||
|
||||
varying vec2 TexCoord0;
|
||||
varying vec2 TexCoord1;
|
||||
varying vec2 TexCoord2;
|
||||
|
||||
varying vec2 pos;
|
||||
uniform vec2 clip0;
|
||||
uniform vec2 clip1;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 color0 = texture2D(tex0, TexCoord0.st);
|
||||
vec4 color1 = texture2D(tex1, TexCoord1.st);
|
||||
vec4 color2 = texture2D(tex2, TexCoord2.st);
|
||||
|
||||
float a = clamp((color0.a + offset) * multiplier, 0.0, 1.0);
|
||||
|
||||
gl_FragColor = mix(color1, color2, a) * Color;
|
||||
}
|
||||
"""
|
||||
|
||||
IMAGEBLEND_CLIP_SHADER = GLES_PORTABILITY + """\
|
||||
uniform vec4 Color;
|
||||
uniform sampler2D tex0;
|
||||
uniform sampler2D tex1;
|
||||
uniform sampler2D tex2;
|
||||
uniform float offset;
|
||||
uniform float multiplier;
|
||||
|
||||
varying vec2 TexCoord0;
|
||||
varying vec2 TexCoord1;
|
||||
varying vec2 TexCoord2;
|
||||
|
||||
varying vec2 pos;
|
||||
uniform vec2 clip0;
|
||||
uniform vec2 clip1;
|
||||
|
||||
void main()
|
||||
{
|
||||
if (pos.x < clip0.x || pos.y < clip0.y || pos.x >= clip1.x || pos.y >= clip1.y) {
|
||||
discard;
|
||||
}
|
||||
|
||||
vec4 color0 = texture2D(tex0, TexCoord0.st);
|
||||
vec4 color1 = texture2D(tex1, TexCoord1.st);
|
||||
vec4 color2 = texture2D(tex2, TexCoord2.st);
|
||||
|
||||
float a = clamp((color0.a + offset) * multiplier, 0.0, 1.0);
|
||||
|
||||
gl_FragColor = mix(color1, color2, a) * Color;
|
||||
}
|
||||
"""
|
||||
|
||||
|
||||
|
||||
|
||||
def check_status(shader, handle, type):
|
||||
"""
|
||||
Checks the status of a shader or program. If it fails, then an
|
||||
exception is raised.
|
||||
"""
|
||||
|
||||
cdef GLint status = 0
|
||||
cdef GLint log_length = 0
|
||||
|
||||
if shader:
|
||||
glGetShaderiv(handle, type, &status)
|
||||
else:
|
||||
glGetProgramiv(handle, type, &status)
|
||||
|
||||
if status == 1: # 0 for problems.
|
||||
return
|
||||
|
||||
if shader:
|
||||
glGetShaderiv(handle, GL_INFO_LOG_LENGTH, &log_length)
|
||||
else:
|
||||
glGetProgramiv(handle, GL_INFO_LOG_LENGTH, &log_length)
|
||||
|
||||
log = ' ' * log_length
|
||||
|
||||
if shader:
|
||||
glGetShaderInfoLog(handle, log_length, &log_length, <char *> log)
|
||||
else:
|
||||
glGetProgramInfoLog(handle, log_length, &log_length, <char *> log)
|
||||
|
||||
raise Exception("Shader error: %s" % log)
|
||||
|
||||
|
||||
def compile_shader(kind, source):
|
||||
"""
|
||||
Allocates and compiles a shader.
|
||||
"""
|
||||
|
||||
source = source.encode("utf-8")
|
||||
|
||||
cdef char *sourceptr = <char *> source
|
||||
cdef int lensource = len(source)
|
||||
|
||||
handle = glCreateShader(kind)
|
||||
glShaderSource(handle, 1, <const GLchar * const *> &sourceptr, &lensource)
|
||||
glCompileShader(handle)
|
||||
|
||||
check_status(True, handle, GL_COMPILE_STATUS)
|
||||
|
||||
return handle
|
||||
|
||||
|
||||
def compile_program(vertex, fragment):
|
||||
"""
|
||||
Compiles a pair of shaders into a program.
|
||||
"""
|
||||
|
||||
vertex_shader = compile_shader(GL_VERTEX_SHADER, vertex)
|
||||
fragment_shader = compile_shader(GL_FRAGMENT_SHADER, fragment)
|
||||
|
||||
program = glCreateProgram()
|
||||
|
||||
glAttachShader(program, vertex_shader)
|
||||
glAttachShader(program, fragment_shader)
|
||||
|
||||
glLinkProgram(program)
|
||||
|
||||
check_status(False, program, GL_LINK_STATUS)
|
||||
|
||||
glUseProgram(program)
|
||||
|
||||
glDeleteShader(vertex_shader)
|
||||
glDeleteShader(fragment_shader)
|
||||
|
||||
return program
|
||||
|
||||
cdef class Program(object):
|
||||
"""
|
||||
Encapsulates a program.
|
||||
"""
|
||||
|
||||
cdef GLuint program
|
||||
|
||||
# Attributes.
|
||||
cdef GLint Vertex
|
||||
cdef GLint VertexTexCoord0
|
||||
cdef GLint VertexTexCoord1
|
||||
cdef GLint VertexTexCoord2
|
||||
|
||||
# Uniforms.
|
||||
cdef GLint Projection
|
||||
cdef GLint Color
|
||||
|
||||
cdef GLint tex0
|
||||
cdef GLint tex1
|
||||
cdef GLint tex2
|
||||
|
||||
cdef GLint clip0
|
||||
cdef GLint clip1
|
||||
|
||||
cdef GLint offset
|
||||
cdef GLint multiplier
|
||||
cdef GLint done
|
||||
|
||||
def __init__(self, vertex, fragment):
|
||||
self.program = compile_program(vertex, fragment)
|
||||
|
||||
self.Vertex = glGetAttribLocation(self.program, "Vertex")
|
||||
self.VertexTexCoord0 = glGetAttribLocation(self.program, "VertexTexCoord0")
|
||||
self.VertexTexCoord1 = glGetAttribLocation(self.program, "VertexTexCoord1")
|
||||
self.VertexTexCoord2 = glGetAttribLocation(self.program, "VertexTexCoord2")
|
||||
|
||||
self.Projection = glGetUniformLocation(self.program, "Projection")
|
||||
self.tex0 = glGetUniformLocation(self.program, "tex0")
|
||||
self.tex1 = glGetUniformLocation(self.program, "tex1")
|
||||
self.tex2 = glGetUniformLocation(self.program, "tex2")
|
||||
self.offset = glGetUniformLocation(self.program, "offset")
|
||||
self.multiplier = glGetUniformLocation(self.program, "multiplier")
|
||||
self.done = glGetUniformLocation(self.program, "done")
|
||||
self.Color = glGetUniformLocation(self.program, "Color")
|
||||
self.clip0 = glGetUniformLocation(self.program, "clip0")
|
||||
self.clip1 = glGetUniformLocation(self.program, "clip1")
|
||||
|
||||
def disable_attribs(self):
|
||||
# Disable the vertex attributes used by this program.
|
||||
|
||||
if self.Vertex != -1:
|
||||
glDisableVertexAttribArray(self.Vertex)
|
||||
|
||||
if self.VertexTexCoord0 != -1:
|
||||
glDisableVertexAttribArray(self.VertexTexCoord0)
|
||||
|
||||
if self.VertexTexCoord1 != -1:
|
||||
glDisableVertexAttribArray(self.VertexTexCoord1)
|
||||
|
||||
if self.VertexTexCoord2 != -1:
|
||||
glDisableVertexAttribArray(self.VertexTexCoord2)
|
||||
|
||||
def delete(self):
|
||||
glDeleteProgram(self.program)
|
||||
|
||||
|
||||
cdef class ShaderEnviron(Environ):
|
||||
"""
|
||||
This is an environment that uses shaders.
|
||||
"""
|
||||
|
||||
cdef Program program
|
||||
cdef float projection[16]
|
||||
|
||||
cdef Program blit_program
|
||||
cdef Program blend_program
|
||||
cdef Program imageblend_program
|
||||
|
||||
cdef Program blit_clip_program
|
||||
cdef Program blend_clip_program
|
||||
cdef Program imageblend_clip_program
|
||||
|
||||
cdef bint clipping
|
||||
cdef double clip_x0
|
||||
cdef double clip_y0
|
||||
cdef double clip_x1
|
||||
cdef double clip_y1
|
||||
|
||||
cdef int viewport_x
|
||||
cdef int viewport_y
|
||||
cdef int viewport_w
|
||||
cdef int viewport_h
|
||||
|
||||
|
||||
def init(self):
|
||||
|
||||
self.blit_program = Program(VERTEX_SHADER1, BLIT_SHADER)
|
||||
self.blit_clip_program = Program(VERTEX_SHADER1, BLIT_CLIP_SHADER)
|
||||
|
||||
self.blend_program = Program(VERTEX_SHADER2, BLEND_SHADER)
|
||||
self.blend_clip_program = Program(VERTEX_SHADER2, BLEND_CLIP_SHADER)
|
||||
|
||||
self.imageblend_program = Program(VERTEX_SHADER3, IMAGEBLEND_SHADER)
|
||||
self.imageblend_clip_program = Program(VERTEX_SHADER3, IMAGEBLEND_CLIP_SHADER)
|
||||
|
||||
# The current program.
|
||||
self.program = None
|
||||
|
||||
def deinit(self):
|
||||
"""
|
||||
Called before changing the GL context.
|
||||
"""
|
||||
|
||||
if self.program is not None:
|
||||
self.program.disable_attribs()
|
||||
self.program = None
|
||||
|
||||
self.blit_program.delete()
|
||||
self.blend_program.delete()
|
||||
self.imageblend_program.delete()
|
||||
|
||||
def activate(self, Program program):
|
||||
|
||||
if self.program is not None:
|
||||
self.program.disable_attribs()
|
||||
|
||||
self.program = program
|
||||
|
||||
glUseProgram(program.program)
|
||||
glUniformMatrix4fv(program.Projection, 1, GL_FALSE, self.projection)
|
||||
|
||||
if self.clipping:
|
||||
glUniform2f(program.clip0, self.clip_x0 - .01, self.clip_y0 - .01)
|
||||
glUniform2f(program.clip1, self.clip_x1 + .01, self.clip_y1 + .01)
|
||||
|
||||
cdef void blit(self):
|
||||
|
||||
if self.clipping:
|
||||
program = self.blit_clip_program
|
||||
else:
|
||||
program = self.blit_program
|
||||
|
||||
if self.program is not program:
|
||||
self.activate(program)
|
||||
glUniform1i(program.tex0, 0)
|
||||
|
||||
cdef void blend(self, double fraction):
|
||||
if self.clipping:
|
||||
program = self.blend_clip_program
|
||||
else:
|
||||
program = self.blend_program
|
||||
|
||||
if self.program is not program:
|
||||
self.activate(program)
|
||||
glUniform1i(program.tex0, 0)
|
||||
glUniform1i(program.tex1, 1)
|
||||
|
||||
glUniform1f(program.done, fraction)
|
||||
|
||||
cdef void imageblend(self, double fraction, int ramp):
|
||||
|
||||
if self.clipping:
|
||||
program = self.imageblend_clip_program
|
||||
else:
|
||||
program = self.imageblend_program
|
||||
|
||||
if self.program is not program:
|
||||
self.activate(program)
|
||||
glUniform1i(program.tex0, 0)
|
||||
glUniform1i(program.tex1, 1)
|
||||
glUniform1i(program.tex2, 2)
|
||||
|
||||
# Prevent a DBZ if the user gives us a 0 ramp.
|
||||
if ramp < 1:
|
||||
ramp = 1
|
||||
|
||||
# Compute the offset to apply to the alpha.
|
||||
start = -1.0
|
||||
end = ramp / 256.0
|
||||
offset = start + ( end - start) * fraction
|
||||
|
||||
# Setup the multiplier and the offset.
|
||||
glUniform1f(program.multiplier, 256.0 / ramp)
|
||||
glUniform1f(program.offset, offset)
|
||||
|
||||
cdef void set_vertex(self, float *vertices):
|
||||
glEnableVertexAttribArray(self.program.Vertex)
|
||||
glVertexAttribPointer(self.program.Vertex, 2, GL_FLOAT, GL_FALSE, 0, <GLubyte *> vertices)
|
||||
|
||||
cdef void set_texture(self, int unit, float *coords):
|
||||
cdef tex
|
||||
|
||||
if unit == 0:
|
||||
tex = self.program.VertexTexCoord0
|
||||
elif unit == 1:
|
||||
tex = self.program.VertexTexCoord1
|
||||
elif unit == 2:
|
||||
tex = self.program.VertexTexCoord2
|
||||
else:
|
||||
return
|
||||
|
||||
if tex < 0:
|
||||
return
|
||||
|
||||
if coords != NULL:
|
||||
glVertexAttribPointer(tex, 2, GL_FLOAT, GL_FALSE, 0, <GLubyte *> coords)
|
||||
glEnableVertexAttribArray(tex)
|
||||
else:
|
||||
glDisableVertexAttribArray(tex)
|
||||
|
||||
cdef void set_color(self, float r, float g, float b, float a):
|
||||
glUniform4f(self.program.Color, r, g, b, a)
|
||||
|
||||
cdef void ortho(self, double left, double right, double bottom, double top, double near, double far):
|
||||
|
||||
self.projection[ 0] = 2 / (right - left)
|
||||
self.projection[ 4] = 0
|
||||
self.projection[ 8] = 0
|
||||
self.projection[12] = -(right + left) / (right - left)
|
||||
|
||||
self.projection[ 1] = 0
|
||||
self.projection[ 5] = 2 / (top - bottom)
|
||||
self.projection[ 9] = 0
|
||||
self.projection[13] = -(top + bottom) / (top - bottom)
|
||||
|
||||
self.projection[ 2] = 0
|
||||
self.projection[ 6] = 0
|
||||
self.projection[10] = -2 / (far - near)
|
||||
self.projection[14] = -(far + near) / (far - near)
|
||||
|
||||
self.projection[ 3] = 0
|
||||
self.projection[ 7] = 0
|
||||
self.projection[11] = 0
|
||||
self.projection[15] = 1
|
||||
|
||||
if self.program is not None:
|
||||
self.program.disable_attribs()
|
||||
|
||||
self.program = None
|
||||
|
||||
cdef void project(self, x, y, z, double *rv_x, double *rv_y, double *rv_z):
|
||||
"""
|
||||
Given a point, projects it using the projection.
|
||||
"""
|
||||
|
||||
rv_x[0] = x * self.projection[0] + y * self.projection[4] + z * self.projection[8] + self.projection[12]
|
||||
rv_y[0] = x * self.projection[1] + y * self.projection[5] + z * self.projection[9] + self.projection[13]
|
||||
rv_z[0] = x * self.projection[2] + y * self.projection[6] + z * self.projection[10] + self.projection[14]
|
||||
|
||||
cdef void set_clip(self, tuple clip_box, GLDraw draw):
|
||||
|
||||
cdef double minx, miny, maxx, maxy, z
|
||||
cdef double vwidth, vheight
|
||||
cdef double px, py, pw, ph
|
||||
cdef int cx, cy, cw, ch
|
||||
cdef int psw, psh
|
||||
|
||||
if clip_box == draw.default_clip:
|
||||
self.unset_clip(draw)
|
||||
return
|
||||
|
||||
minx, miny, maxx, maxy = clip_box
|
||||
psw, psh = draw.physical_size
|
||||
|
||||
# The clipping box.
|
||||
self.clipping = True
|
||||
self.clip_x0 = minx
|
||||
self.clip_y0 = miny
|
||||
self.clip_x1 = maxx
|
||||
self.clip_y1 = maxy
|
||||
|
||||
# Set the scissor rectangle to be slightly larger than the
|
||||
# clipping box. This ensures everything that needs to be drawn
|
||||
# is drawn, and we don't spend a lot of time shading clipped
|
||||
# fragments.
|
||||
|
||||
if draw.clip_rtt_box is None:
|
||||
|
||||
z = 0
|
||||
|
||||
# Project to normalized coordinates.
|
||||
self.project(minx, miny, z, &minx, &miny, &z)
|
||||
self.project(maxx, maxy, z, &maxx, &maxy, &z)
|
||||
|
||||
# Convert to window coordinates.
|
||||
minx = (minx + 1) * self.viewport_w / 2 + self.viewport_x
|
||||
maxx = (maxx + 1) * self.viewport_w / 2 + self.viewport_x
|
||||
miny = (miny + 1) * self.viewport_h / 2 + self.viewport_y
|
||||
maxy = (maxy + 1) * self.viewport_h / 2 + self.viewport_y
|
||||
|
||||
# Increase the bounding box, to ensure every relevant pixel is
|
||||
# in it. The shader will take care of enforcing the actual box.
|
||||
minx -= 1
|
||||
maxx += 1
|
||||
miny += 1
|
||||
maxy -= 1
|
||||
|
||||
if minx < 0:
|
||||
minx = 0
|
||||
if miny < 0:
|
||||
miny = 0
|
||||
|
||||
glEnable(GL_SCISSOR_TEST)
|
||||
glScissor(<GLint> round(minx), <GLint> round(maxy), <GLint> round(maxx - minx), <GLsizei> round(miny - maxy))
|
||||
|
||||
else:
|
||||
|
||||
cx, cy, cw, ch = draw.clip_rtt_box
|
||||
|
||||
glEnable(GL_SCISSOR_TEST)
|
||||
glScissor(<GLint> round(minx - cx), <GLint> round(miny - cy), <GLint> round(maxx - minx), <GLint> round(maxy - miny))
|
||||
|
||||
if self.program is not None:
|
||||
self.program.disable_attribs()
|
||||
|
||||
self.program = None
|
||||
|
||||
cdef void unset_clip(self, GLDraw draw):
|
||||
|
||||
glDisable(GL_SCISSOR_TEST)
|
||||
|
||||
self.clipping = False
|
||||
self.clip_x0 = 0
|
||||
self.clip_y0 = 0
|
||||
self.clip_x1 = 65535
|
||||
self.clip_y1 = 65535
|
||||
|
||||
if self.program is not None:
|
||||
self.program.disable_attribs()
|
||||
|
||||
self.program = None
|
||||
|
||||
cdef void viewport(self, int x, int y, int width, int height):
|
||||
glViewport(x, y, width, height)
|
||||
self.viewport_x = x
|
||||
self.viewport_y = y
|
||||
self.viewport_w = width
|
||||
self.viewport_h = height
|
||||
@@ -1,59 +0,0 @@
|
||||
# This file has been automatically generated by module/uguu/generate_required_functions.py,
|
||||
# please do not edit it by hand.
|
||||
|
||||
from __future__ import division, absolute_import, with_statement, print_function, unicode_literals
|
||||
from renpy.compat import PY2, basestring, bchr, bord, chr, open, pystr, range, round, str, tobytes, unicode # *
|
||||
|
||||
|
||||
|
||||
required_functions = [
|
||||
"glActiveTexture",
|
||||
"glAttachShader",
|
||||
"glBindFramebuffer",
|
||||
"glBindTexture",
|
||||
"glBlendFunc",
|
||||
"glClear",
|
||||
"glClearColor",
|
||||
"glCompileShader",
|
||||
"glCopyTexImage2D",
|
||||
"glCopyTexSubImage2D",
|
||||
"glCreateProgram",
|
||||
"glCreateShader",
|
||||
"glDeleteFramebuffers",
|
||||
"glDeleteProgram",
|
||||
"glDeleteShader",
|
||||
"glDeleteTextures",
|
||||
"glDisable",
|
||||
"glDisableVertexAttribArray",
|
||||
"glDrawArrays",
|
||||
"glEnable",
|
||||
"glEnableVertexAttribArray",
|
||||
"glFinish",
|
||||
"glFramebufferTexture2D",
|
||||
"glGenFramebuffers",
|
||||
"glGenTextures",
|
||||
"glGetAttribLocation",
|
||||
"glGetError",
|
||||
"glGetIntegerv",
|
||||
"glGetProgramInfoLog",
|
||||
"glGetProgramiv",
|
||||
"glGetShaderInfoLog",
|
||||
"glGetShaderiv",
|
||||
"glGetString",
|
||||
"glGetUniformLocation",
|
||||
"glLinkProgram",
|
||||
"glReadPixels",
|
||||
"glScissor",
|
||||
"glShaderSource",
|
||||
"glTexImage2D",
|
||||
"glTexParameteri",
|
||||
"glTexSubImage2D",
|
||||
"glUniform1f",
|
||||
"glUniform1i",
|
||||
"glUniform2f",
|
||||
"glUniform4f",
|
||||
"glUniformMatrix4fv",
|
||||
"glUseProgram",
|
||||
"glVertexAttribPointer",
|
||||
"glViewport",
|
||||
]
|
||||
@@ -1,72 +0,0 @@
|
||||
#@PydevCodeAnalysisIgnore
|
||||
#cython: profile=False
|
||||
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
# (the "Software"), to deal in the Software without restriction,
|
||||
# including without limitation the rights to use, copy, modify, merge,
|
||||
# publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
# and to permit persons to whom the Software is furnished to do so,
|
||||
# subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
from renpy.uguu.gl cimport *
|
||||
from renpy.gl.gldraw cimport *
|
||||
from renpy.gl.gldraw import Rtt
|
||||
|
||||
class CopyRtt(Rtt):
|
||||
"""
|
||||
This class uses texture copying to implement Render-to-texture.
|
||||
"""
|
||||
|
||||
def init(self):
|
||||
return
|
||||
|
||||
def deinit(self):
|
||||
return
|
||||
|
||||
def render(self, Environ environ, texture, x, y, w, h, draw_func):
|
||||
"""
|
||||
This function is called to trigger a rendering to a texture.
|
||||
`x`, `y`, `w`, and `h` specify the location and dimensions of
|
||||
the sub-image to render to the texture. `draw_func` is called
|
||||
to render the texture.
|
||||
"""
|
||||
|
||||
environ.viewport(0, 0, w, h)
|
||||
environ.ortho(x, x + w, y, y + h, -1, 1)
|
||||
|
||||
draw_func(x, y, w, h)
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, texture)
|
||||
|
||||
glCopyTexSubImage2D(
|
||||
GL_TEXTURE_2D,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
w,
|
||||
h)
|
||||
|
||||
def end(self):
|
||||
"""
|
||||
This is called when a Render-to-texture session ends.
|
||||
"""
|
||||
|
||||
def get_size_limit(self, dimension):
|
||||
return dimension
|
||||
@@ -1,115 +0,0 @@
|
||||
#@PydevCodeAnalysisIgnore
|
||||
#cython: profile=False
|
||||
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
# (the "Software"), to deal in the Software without restriction,
|
||||
# including without limitation the rights to use, copy, modify, merge,
|
||||
# publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
# and to permit persons to whom the Software is furnished to do so,
|
||||
# subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
from __future__ import print_function
|
||||
|
||||
from renpy.uguu.gl cimport *
|
||||
from renpy.gl.gldraw cimport *
|
||||
from renpy.gl.gldraw import Rtt
|
||||
|
||||
import renpy
|
||||
|
||||
# The framebuffer object we use.
|
||||
cdef GLuint fbo
|
||||
|
||||
# The root framebuffer.
|
||||
cdef GLint root_fbo
|
||||
|
||||
# The renderbuffer object we use.
|
||||
cdef GLuint texture
|
||||
|
||||
class FboRtt(Rtt):
|
||||
"""
|
||||
This class uses texture copying to implement Render-to-texture.
|
||||
"""
|
||||
|
||||
def init(self):
|
||||
|
||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING, &root_fbo);
|
||||
renpy.display.log.write("Root FBO is: %d", root_fbo)
|
||||
|
||||
glGenFramebuffers(1, &fbo)
|
||||
glGenTextures(1, &texture)
|
||||
|
||||
cdef int i
|
||||
|
||||
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &i)
|
||||
self.size_limit = min(i, 2048)
|
||||
renpy.display.log.write("FBO Maximum Texture Size: %d", self.size_limit)
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, texture)
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.size_limit, self.size_limit, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, fbo)
|
||||
glFramebufferTexture2D(
|
||||
GL_FRAMEBUFFER,
|
||||
GL_COLOR_ATTACHMENT0,
|
||||
GL_TEXTURE_2D,
|
||||
texture,
|
||||
0)
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, root_fbo)
|
||||
|
||||
|
||||
def deinit(self):
|
||||
"""
|
||||
Called before changing the GL context.
|
||||
"""
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, root_fbo)
|
||||
glDeleteFramebuffers(1, &fbo)
|
||||
glDeleteTextures(1, &texture)
|
||||
|
||||
def begin(self):
|
||||
"""
|
||||
This function should be called when a Render-to-texture
|
||||
session begins. It's responsible for setting the GPU to
|
||||
RTT mode.
|
||||
"""
|
||||
|
||||
def render(self, Environ environ, texture, x, y, w, h, draw_func):
|
||||
"""
|
||||
This function is called to trigger a rendering to a texture.
|
||||
`x`, `y`, `w`, and `h` specify the location and dimensions of
|
||||
the sub-image to render to the texture. `draw_func` is called
|
||||
to render the texture.
|
||||
"""
|
||||
|
||||
try:
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, fbo)
|
||||
|
||||
environ.viewport(0, 0, w, h)
|
||||
environ.ortho(x, x + w, y, y + h, -1, 1)
|
||||
|
||||
draw_func(x, y, w, h)
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, texture)
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL)
|
||||
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, w, h, 0)
|
||||
|
||||
finally:
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, root_fbo)
|
||||
|
||||
|
||||
def get_size_limit(self, dimension):
|
||||
return self.size_limit
|
||||
@@ -1,104 +0,0 @@
|
||||
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person
|
||||
# obtaining a copy of this software and associated documentation files
|
||||
# (the "Software"), to deal in the Software without restriction,
|
||||
# including without limitation the rights to use, copy, modify, merge,
|
||||
# publish, distribute, sublicense, and/or sell copies of the Software,
|
||||
# and to permit persons to whom the Software is furnished to do so,
|
||||
# subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be
|
||||
# included in all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
from renpy.display.matrix cimport Matrix
|
||||
cimport renpy.display.render as render
|
||||
from renpy.gl.gldraw cimport Environ
|
||||
|
||||
cdef class TextureCore:
|
||||
cdef public int width
|
||||
cdef public int height
|
||||
cdef public int generation
|
||||
cdef public unsigned int number
|
||||
cdef unsigned int format
|
||||
cdef double xmul
|
||||
cdef double xadd
|
||||
cdef double ymul
|
||||
cdef double yadd
|
||||
cdef object premult
|
||||
cdef tuple premult_size
|
||||
cdef int premult_left
|
||||
cdef int premult_right
|
||||
cdef int premult_top
|
||||
cdef int premult_bottom
|
||||
cdef bint nearest
|
||||
cdef public list free_list
|
||||
|
||||
cdef void make_ready(TextureCore)
|
||||
cdef void make_nearest(TextureCore)
|
||||
cdef void make_linear(TextureCore)
|
||||
cpdef int allocate(TextureCore)
|
||||
|
||||
cdef public object debug
|
||||
|
||||
cdef class TextureGrid:
|
||||
|
||||
|
||||
cdef object __weakref__
|
||||
|
||||
cdef public int width
|
||||
cdef public int height
|
||||
cdef list rows
|
||||
cdef list columns
|
||||
cdef list tiles # list of lists.
|
||||
cdef public TextureGrid half_cache
|
||||
|
||||
cpdef void make_ready(self, bint nearest)
|
||||
|
||||
cdef public object debug
|
||||
cdef public bint ready
|
||||
|
||||
|
||||
cpdef blit(
|
||||
TextureGrid tg,
|
||||
double sx,
|
||||
double sy,
|
||||
Matrix transform,
|
||||
double alpha,
|
||||
double over,
|
||||
Environ environ,
|
||||
bint nearest)
|
||||
|
||||
cpdef blend(
|
||||
TextureGrid tg0,
|
||||
TextureGrid tg1,
|
||||
double sx,
|
||||
double sy,
|
||||
Matrix transform,
|
||||
double alpha,
|
||||
double over,
|
||||
double fraction,
|
||||
Environ environ,
|
||||
bint nearest)
|
||||
|
||||
cpdef imageblend(
|
||||
TextureGrid tg0,
|
||||
TextureGrid tg1,
|
||||
TextureGrid tg2,
|
||||
double sx,
|
||||
double sy,
|
||||
Matrix transform,
|
||||
double alpha,
|
||||
double over,
|
||||
double fraction,
|
||||
int ramp,
|
||||
Environ environ,
|
||||
bint nearest)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -66,4 +66,4 @@ cdef class Mesh:
|
||||
|
||||
# The triangle data, where each triangle consists of the index of three
|
||||
# points. This is 3 * allocated_triangles in size.
|
||||
cdef unsigned short *triangle
|
||||
cdef unsigned int *triangle
|
||||
|
||||
@@ -58,6 +58,7 @@ TEXT_LAYOUT.add_attribute("a_text_max_time", 1) # The maximum time any vertex in
|
||||
TEXT_LAYOUT.add_attribute("a_text_index", 1) # The glyph number.
|
||||
TEXT_LAYOUT.add_attribute("a_text_pos_rect", 4) # The rectangle being drawn.
|
||||
TEXT_LAYOUT.add_attribute("a_text_ascent", 1) # The ascent of the font.
|
||||
TEXT_LAYOUT.add_attribute("a_text_descent", 1) # The ascent of the font.
|
||||
|
||||
cdef class Mesh:
|
||||
|
||||
|
||||
+31
-4
@@ -65,7 +65,7 @@ cdef class Mesh2(Mesh):
|
||||
if triangles:
|
||||
|
||||
self.triangles = 0
|
||||
self.triangle = <unsigned short *> malloc(triangles * 3 * sizeof(int))
|
||||
self.triangle = <unsigned int *> malloc(triangles * 3 * sizeof(unsigned int))
|
||||
|
||||
def __dealloc__(Mesh2 self):
|
||||
|
||||
@@ -78,8 +78,8 @@ cdef class Mesh2(Mesh):
|
||||
|
||||
def __repr__(Mesh2 self):
|
||||
|
||||
cdef unsigned short i
|
||||
cdef unsigned short j
|
||||
cdef int i
|
||||
cdef int j
|
||||
|
||||
rv = "<Mesh2 {!r}".format(self.layout.offset)
|
||||
|
||||
@@ -252,7 +252,7 @@ cdef class Mesh2(Mesh):
|
||||
double index,
|
||||
double left, double top, double right, double bottom,
|
||||
double left_time, double right_time,
|
||||
double ascent
|
||||
double ascent, double descent,
|
||||
):
|
||||
"""
|
||||
Adds a glyph to a mesh created by `text_mesh`.
|
||||
@@ -298,6 +298,7 @@ cdef class Mesh2(Mesh):
|
||||
self.attribute[attribute + 10] = width
|
||||
self.attribute[attribute + 11] = height
|
||||
self.attribute[attribute + 12] = ascent
|
||||
self.attribute[attribute + 13] = descent
|
||||
|
||||
attribute += stride
|
||||
|
||||
@@ -317,6 +318,7 @@ cdef class Mesh2(Mesh):
|
||||
self.attribute[attribute + 10] = width
|
||||
self.attribute[attribute + 11] = height
|
||||
self.attribute[attribute + 12] = ascent
|
||||
self.attribute[attribute + 13] = descent
|
||||
|
||||
attribute += stride
|
||||
|
||||
@@ -336,6 +338,7 @@ cdef class Mesh2(Mesh):
|
||||
self.attribute[attribute + 10] = width
|
||||
self.attribute[attribute + 11] = height
|
||||
self.attribute[attribute + 12] = ascent
|
||||
self.attribute[attribute + 13] = descent
|
||||
|
||||
attribute += stride
|
||||
|
||||
@@ -355,6 +358,7 @@ cdef class Mesh2(Mesh):
|
||||
self.attribute[attribute + 10] = width
|
||||
self.attribute[attribute + 11] = height
|
||||
self.attribute[attribute + 12] = ascent
|
||||
self.attribute[attribute + 13] = descent
|
||||
|
||||
cdef int triangle = self.triangles * 3
|
||||
|
||||
@@ -376,6 +380,29 @@ cdef class Mesh2(Mesh):
|
||||
|
||||
return crop_mesh(self, p)
|
||||
|
||||
def remap_texture(
|
||||
self,
|
||||
float old_x, float old_y, float old_w, float old_h,
|
||||
float new_x, float new_y, float new_w, float new_h):
|
||||
|
||||
"""
|
||||
Offsets the texture coordinates of this mesh by the given amount.
|
||||
"""
|
||||
|
||||
cdef int i
|
||||
cdef float x
|
||||
cdef float y
|
||||
|
||||
if new_w == 0 or new_h == 0:
|
||||
return
|
||||
|
||||
for 0 <= i < self.points:
|
||||
x = self.attribute[i * self.layout.stride + 0] * old_w + old_x
|
||||
y = self.attribute[i * self.layout.stride + 1] * old_h + old_y
|
||||
|
||||
self.attribute[i * self.layout.stride + 0] = (x - new_x) / new_w
|
||||
self.attribute[i * self.layout.stride + 1] = (y - new_y) / new_h
|
||||
|
||||
def get_points(Mesh2 self):
|
||||
"""
|
||||
Returns the points that make up this mesh as tuples.
|
||||
|
||||
@@ -64,7 +64,7 @@ cdef class Mesh3(Mesh):
|
||||
|
||||
if triangles:
|
||||
self.triangles = 0
|
||||
self.triangle = <unsigned short *> malloc(triangles * 3 * sizeof(int))
|
||||
self.triangle = <unsigned int *> malloc(triangles * 3 * sizeof(unsigned int))
|
||||
|
||||
|
||||
def __dealloc__(Mesh3 self):
|
||||
@@ -77,8 +77,8 @@ cdef class Mesh3(Mesh):
|
||||
|
||||
def __repr__(Mesh3 self):
|
||||
|
||||
cdef unsigned short i
|
||||
cdef unsigned short j
|
||||
cdef int i
|
||||
cdef int j
|
||||
|
||||
rv = "<Mesh3 {!r}".format(self.layout.offset)
|
||||
|
||||
@@ -218,7 +218,6 @@ cdef class Mesh3(Mesh):
|
||||
else:
|
||||
return (self.point[0].x, self.point[0].y, self.point[0].z, 1.0)
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Mesh cropping.
|
||||
|
||||
|
||||
@@ -44,3 +44,5 @@ cdef class Program:
|
||||
cdef dict properties
|
||||
|
||||
cdef GLuint load_shader(self, GLenum shader_type, source) except? 0
|
||||
|
||||
cdef dict uniform_values
|
||||
|
||||
+11
-6
@@ -196,6 +196,9 @@ cdef class Program:
|
||||
# A map from uniform name to a Uniform object.
|
||||
self.uniforms = { }
|
||||
|
||||
# A map from unform name to a value.
|
||||
self.uniform_values = { }
|
||||
|
||||
# A list of Attribute objects
|
||||
self.attributes = [ ]
|
||||
|
||||
@@ -361,6 +364,11 @@ cdef class Program:
|
||||
if u is None:
|
||||
return
|
||||
|
||||
if name in self.uniform_values and name in renpy.config.merge_uniforms:
|
||||
value = renpy.config.merge_uniforms[name](self.uniform_values[name], value)
|
||||
|
||||
self.uniform_values[name] = value
|
||||
|
||||
u.assign(self, value)
|
||||
u.ready = True
|
||||
|
||||
@@ -368,12 +376,8 @@ cdef class Program:
|
||||
cdef Uniform u
|
||||
|
||||
for name, value in uniforms.iteritems():
|
||||
u = self.uniforms.get(name, None)
|
||||
if u is None:
|
||||
continue
|
||||
|
||||
u.assign(self, value)
|
||||
u.ready = True
|
||||
self.set_uniform(name, value)
|
||||
|
||||
def draw(self, Mesh mesh):
|
||||
|
||||
@@ -423,7 +427,7 @@ cdef class Program:
|
||||
glBlendEquationSeparate(rgb_eq, alpha_eq)
|
||||
glBlendFuncSeparate(src_rgb, dst_rgb, src_alpha, dst_alpha)
|
||||
|
||||
glDrawElements(GL_TRIANGLES, 3 * mesh.triangles, GL_UNSIGNED_SHORT, mesh.triangle)
|
||||
glDrawElements(GL_TRIANGLES, 3 * mesh.triangles, GL_UNSIGNED_INT, mesh.triangle)
|
||||
|
||||
if properties:
|
||||
|
||||
@@ -451,3 +455,4 @@ cdef class Program:
|
||||
u.finish(self)
|
||||
|
||||
self.properties = None
|
||||
self.uniform_values = { }
|
||||
|
||||
@@ -69,8 +69,6 @@ def register_shader(name, **kwargs):
|
||||
return ShaderPart(name, **kwargs)
|
||||
|
||||
|
||||
|
||||
|
||||
class ShaderPart(object):
|
||||
"""
|
||||
Arguments are as for register_shader.
|
||||
|
||||
@@ -73,4 +73,10 @@ cdef class GLTexture(GL2Model):
|
||||
cdef public int texture_width
|
||||
cdef public int texture_height
|
||||
|
||||
# Borders
|
||||
cdef public int bl
|
||||
cdef public int bt
|
||||
cdef public int br
|
||||
cdef public int bb
|
||||
|
||||
cpdef subsurface(GLTexture self, t)
|
||||
|
||||
@@ -113,6 +113,12 @@ cdef class TextureLoader:
|
||||
rv.from_surface(surf, properties)
|
||||
|
||||
if bl or bt or br or bb:
|
||||
|
||||
rv.bl = bl
|
||||
rv.bt = bt
|
||||
rv.br = br
|
||||
rv.bb = bb
|
||||
|
||||
w, h = size
|
||||
|
||||
pw = w - bl - br
|
||||
@@ -128,6 +134,7 @@ cdef class TextureLoader:
|
||||
0.0, 0.0, pw, ph,
|
||||
0.0, 0.0, 0.0, 0.0)
|
||||
|
||||
|
||||
rv = GL2Model((pw, ph), mesh, ("renpy.texture",), { "tex0" : rv, "res0" : (rv.texture_width, rv.texture_height) })
|
||||
|
||||
return rv
|
||||
@@ -276,6 +283,12 @@ cdef class GLTexture(GL2Model):
|
||||
# Update the loader.
|
||||
self.loader = loader
|
||||
|
||||
# Borders.
|
||||
self.bl = 0
|
||||
self.bt = 0
|
||||
self.br = 0
|
||||
self.bb = 0
|
||||
|
||||
if renpy.emscripten and generate:
|
||||
# Generate a texture name to access video frames for web
|
||||
glGenTextures(1, &number)
|
||||
|
||||
@@ -88,9 +88,6 @@ def init():
|
||||
if live2dmodel is None:
|
||||
raise Exception("Live2D has not been built.")
|
||||
|
||||
if not renpy.config.gl2:
|
||||
raise Exception("Live2D requires that config.gl2 be True.")
|
||||
|
||||
if renpy.emscripten:
|
||||
raise Exception("Live2D is not supported the web platform.")
|
||||
|
||||
|
||||
@@ -433,7 +433,9 @@ cdef class Live2DModel:
|
||||
memcpy(mesh.attribute, self.drawable_vertex_uvs[i], sizeof(float) * mesh.points * 2)
|
||||
|
||||
mesh.triangles = self.drawable_index_counts[i] // 3
|
||||
memcpy(mesh.triangle, self.drawable_indices[i], sizeof(unsigned short) * mesh.triangles * 3)
|
||||
|
||||
for 0 <= j < mesh.triangles * 3:
|
||||
mesh.triangle[j] = self.drawable_indices[i][j]
|
||||
|
||||
tex = textures[self.drawable_texture_indices[i]]
|
||||
|
||||
|
||||
@@ -343,6 +343,9 @@ check_file_cache = { }
|
||||
|
||||
def check_file(what, fn, directory=None):
|
||||
|
||||
if not isinstance(fn, basestring):
|
||||
return
|
||||
|
||||
present = check_file_cache.get(fn, None)
|
||||
if present is True:
|
||||
return
|
||||
|
||||
+3
-6
@@ -488,7 +488,7 @@ def autosave_thread_function(take_screenshot):
|
||||
|
||||
try:
|
||||
|
||||
try:
|
||||
with renpy.savelocation.SyncfsLock():
|
||||
|
||||
if renpy.config.auto_save_extra_info:
|
||||
extra_info = renpy.config.auto_save_extra_info()
|
||||
@@ -505,14 +505,11 @@ def autosave_thread_function(take_screenshot):
|
||||
autosave_counter = 0
|
||||
did_autosave = True
|
||||
|
||||
except Exception:
|
||||
pass
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
finally:
|
||||
autosave_not_running.set()
|
||||
if renpy.emscripten:
|
||||
import emscripten
|
||||
emscripten.syncfs()
|
||||
|
||||
|
||||
def autosave():
|
||||
|
||||
+2
-1
@@ -436,12 +436,13 @@ def update(force_save=False):
|
||||
|
||||
should_save_persistent = True
|
||||
|
||||
|
||||
def save():
|
||||
"""
|
||||
Saves the persistent data to disk.
|
||||
"""
|
||||
|
||||
global old_persistent_data
|
||||
|
||||
if not renpy.config.save_persistent:
|
||||
return
|
||||
|
||||
|
||||
+75
-19
@@ -45,6 +45,58 @@ import time
|
||||
tmp = "." + str(int(time.time())) + ".tmp"
|
||||
|
||||
|
||||
# The number of times pause_syncfs has been called, without a corresponding
|
||||
# resume_syncfs
|
||||
pause_syncfs_count = 0
|
||||
|
||||
def pause_syncfs():
|
||||
"""
|
||||
Pauses the filesystem sync. This should be called before doing a large
|
||||
number of file operations.
|
||||
"""
|
||||
|
||||
global pause_syncfs_count
|
||||
pause_syncfs_count += 1
|
||||
|
||||
|
||||
def resume_syncfs():
|
||||
"""
|
||||
Resumes the filesystem sync. This should be called after a corresponding
|
||||
pause_syncfs.
|
||||
"""
|
||||
|
||||
global pause_syncfs_count
|
||||
pause_syncfs_count -= 1
|
||||
|
||||
if pause_syncfs_count == 0:
|
||||
syncfs()
|
||||
|
||||
|
||||
class SyncfsLock(object):
|
||||
"""
|
||||
Context to pause then resume the filesystem sync.
|
||||
"""
|
||||
def __enter__(self):
|
||||
pause_syncfs()
|
||||
return self
|
||||
|
||||
def __exit__(self, exception_type, exception_value, exception_traceback):
|
||||
resume_syncfs()
|
||||
|
||||
|
||||
def syncfs():
|
||||
"""
|
||||
Syncs the filesystem.
|
||||
"""
|
||||
|
||||
if pause_syncfs_count > 0:
|
||||
return
|
||||
|
||||
if renpy.emscripten:
|
||||
import emscripten # type: ignore
|
||||
emscripten.syncfs()
|
||||
|
||||
|
||||
class FileLocation(object):
|
||||
"""
|
||||
A location that saves files to a directory on disk.
|
||||
@@ -98,9 +150,7 @@ class FileLocation(object):
|
||||
Called to indicate that the HOME filesystem was changed.
|
||||
"""
|
||||
|
||||
if renpy.emscripten:
|
||||
import emscripten # type: ignore
|
||||
emscripten.syncfs()
|
||||
syncfs()
|
||||
|
||||
def scan(self):
|
||||
"""
|
||||
@@ -371,6 +421,8 @@ class FileLocation(object):
|
||||
fn_tmp = fn + tmp
|
||||
fn_new = fn + ".new"
|
||||
|
||||
pause_syncfs()
|
||||
|
||||
with open(fn_tmp, "wb") as f:
|
||||
f.write(data)
|
||||
|
||||
@@ -382,7 +434,7 @@ class FileLocation(object):
|
||||
|
||||
renpy.util.expose_file(fn)
|
||||
|
||||
self.sync()
|
||||
resume_syncfs()
|
||||
|
||||
def unlink_persistent(self):
|
||||
|
||||
@@ -460,9 +512,10 @@ class MultiLocation(object):
|
||||
|
||||
saved = False
|
||||
|
||||
for l in self.active_locations():
|
||||
l.save(slotname, record)
|
||||
saved = True
|
||||
with SyncfsLock():
|
||||
for l in self.active_locations():
|
||||
l.save(slotname, record)
|
||||
saved = True
|
||||
|
||||
if not saved:
|
||||
raise Exception("Not saved - no valid save locations.")
|
||||
@@ -535,22 +588,25 @@ class MultiLocation(object):
|
||||
if not renpy.config.save:
|
||||
return
|
||||
|
||||
for l in self.active_locations():
|
||||
l.unlink(slotname)
|
||||
with SyncfsLock():
|
||||
for l in self.active_locations():
|
||||
l.unlink(slotname)
|
||||
|
||||
def rename(self, old, new):
|
||||
if not renpy.config.save:
|
||||
return
|
||||
|
||||
for l in self.active_locations():
|
||||
l.rename(old, new)
|
||||
with SyncfsLock():
|
||||
for l in self.active_locations():
|
||||
l.rename(old, new)
|
||||
|
||||
def copy(self, old, new):
|
||||
if not renpy.config.save:
|
||||
return
|
||||
|
||||
for l in self.active_locations():
|
||||
l.copy(old, new)
|
||||
with SyncfsLock():
|
||||
for l in self.active_locations():
|
||||
l.copy(old, new)
|
||||
|
||||
def load_persistent(self):
|
||||
rv = [ ]
|
||||
@@ -561,14 +617,14 @@ class MultiLocation(object):
|
||||
return rv
|
||||
|
||||
def save_persistent(self, data):
|
||||
|
||||
for l in self.active_locations():
|
||||
l.save_persistent(data)
|
||||
with SyncfsLock():
|
||||
for l in self.active_locations():
|
||||
l.save_persistent(data)
|
||||
|
||||
def unlink_persistent(self):
|
||||
|
||||
for l in self.active_locations():
|
||||
l.unlink_persistent()
|
||||
with SyncfsLock():
|
||||
for l in self.active_locations():
|
||||
l.unlink_persistent()
|
||||
|
||||
def scan(self):
|
||||
# This should scan everything, as a scan can help decide if a
|
||||
|
||||
@@ -1377,6 +1377,106 @@ class SLDisplayable(SLBlock):
|
||||
i.dump_const(prefix + " ")
|
||||
|
||||
|
||||
class SLAddImage(SLDisplayable):
|
||||
def __init__(self, loc, name):
|
||||
super().__init__(loc, None, name=name, unique=False)
|
||||
|
||||
def execute(self, context):
|
||||
debug = context.debug
|
||||
|
||||
cache = context.old_cache.get(self.serial, None) or context.miss_cache.get(self.serial, None)
|
||||
|
||||
# We use and check 'displayable', 'constant' and 'old_showif'
|
||||
# fields, and rest are left unchanged.
|
||||
if not isinstance(cache, SLCache):
|
||||
cache = SLCache()
|
||||
|
||||
context.new_cache[self.serial] = cache
|
||||
|
||||
if debug:
|
||||
self.debug_line()
|
||||
|
||||
# Add image does not use style or scope.
|
||||
if cache.constant is not None:
|
||||
d = cache.constant
|
||||
|
||||
if context.showif is not None:
|
||||
d = self.wrap_in_showif(d, context, cache)
|
||||
|
||||
context.children.append(d)
|
||||
|
||||
if debug:
|
||||
profile_log.write(" reused constant displayable")
|
||||
|
||||
return
|
||||
|
||||
# Create the context.
|
||||
ctx = SLContext(context)
|
||||
|
||||
# True if we encountered an exception that we're recovering from
|
||||
# due to being in prediction mode.
|
||||
fail = False
|
||||
|
||||
# Result transform to display.
|
||||
d = None
|
||||
|
||||
try:
|
||||
ctx.keywords = {}
|
||||
|
||||
SLBlock.keywords(self, ctx)
|
||||
|
||||
d = ctx.keywords.pop("at")
|
||||
assert not ctx.keywords, ctx.keywords
|
||||
|
||||
if debug:
|
||||
self.report_arguments(cache, (), {}, None)
|
||||
|
||||
d._location = self.location
|
||||
|
||||
cache.copy_on_change = False # We no longer need to copy on change.
|
||||
|
||||
if debug:
|
||||
if self.constant:
|
||||
profile_log.write(" created constant displayable")
|
||||
else:
|
||||
profile_log.write(" created displayable")
|
||||
|
||||
except Exception:
|
||||
if not context.predicting:
|
||||
raise
|
||||
fail = True
|
||||
|
||||
if self.variable is not None:
|
||||
context.scope[self.variable] = d
|
||||
|
||||
old_d = cache.displayable
|
||||
|
||||
if old_d is not None:
|
||||
d.take_state(old_d)
|
||||
d.take_execution_state(old_d)
|
||||
|
||||
# If a failure occurred during prediction, predict main (if known),
|
||||
# and return.
|
||||
if fail:
|
||||
predict_displayable(d)
|
||||
context.fail = True
|
||||
return
|
||||
|
||||
cache.displayable = d
|
||||
|
||||
if ctx.fail:
|
||||
context.fail = True
|
||||
|
||||
else:
|
||||
if self.constant:
|
||||
cache.constant = d
|
||||
|
||||
if context.showif is not None:
|
||||
d = self.wrap_in_showif(d, context, cache)
|
||||
|
||||
context.children.append(d)
|
||||
|
||||
|
||||
class SLIf(SLNode):
|
||||
"""
|
||||
A screen language AST node that corresponds to an If/Elif/Else statement.
|
||||
|
||||
+71
-13
@@ -194,21 +194,42 @@ class Parser(object):
|
||||
self.keyword[i.prefix + j + i.name] = i
|
||||
|
||||
elif isinstance(i, Parser):
|
||||
self.children[i.name] = i
|
||||
self.children[tuple(i.name.split())] = i
|
||||
|
||||
def parse_statement(self, loc, l, layout_mode=False, keyword=True):
|
||||
word = l.word() or l.match(r'\$')
|
||||
|
||||
if word and word in self.children:
|
||||
if layout_mode:
|
||||
c = self.children[word].parse_layout(loc, l, self, keyword)
|
||||
# Look for one-line python only once.
|
||||
if l.match(r'\$'):
|
||||
if ("$", ) in self.children:
|
||||
assert not layout_mode, "One-line python can not be in layout mode."
|
||||
return self.children["$", ].parse(loc, l, self, keyword)
|
||||
else:
|
||||
c = self.children[word].parse(loc, l, self, keyword)
|
||||
return None
|
||||
|
||||
return c
|
||||
else:
|
||||
name = ()
|
||||
while True:
|
||||
cp = l.checkpoint()
|
||||
word = l.word()
|
||||
if not word:
|
||||
break
|
||||
|
||||
# Look for more specialized child parser.
|
||||
new_name = (*name, word)
|
||||
if new_name not in self.children:
|
||||
l.revert(cp)
|
||||
break
|
||||
|
||||
name = new_name
|
||||
|
||||
if not name:
|
||||
return None
|
||||
|
||||
if layout_mode:
|
||||
c = self.children[name].parse_layout(loc, l, self, keyword)
|
||||
else:
|
||||
c = self.children[name].parse(loc, l, self, keyword)
|
||||
|
||||
return c
|
||||
|
||||
def parse_layout(self, loc, l, parent, keyword):
|
||||
l.error("The %s statement cannot be used as a container for the has statement." % self.name)
|
||||
|
||||
@@ -229,7 +250,16 @@ class Parser(object):
|
||||
|
||||
raise Exception("Not Implemented")
|
||||
|
||||
def parse_contents(self, l, target, layout_mode=False, can_has=False, can_tag=False, block_only=False, keyword=True):
|
||||
def parse_contents(
|
||||
self,
|
||||
l, target,
|
||||
layout_mode=False,
|
||||
can_has=False,
|
||||
can_tag=False,
|
||||
block_only=False,
|
||||
keyword=True,
|
||||
line_only=False,
|
||||
):
|
||||
"""
|
||||
Parses the remainder of the current line of `l`, and all of its subblock,
|
||||
looking for keywords and children.
|
||||
@@ -247,6 +277,10 @@ class Parser(object):
|
||||
|
||||
`block_only`
|
||||
If true, only parse the block and not the initial properties.
|
||||
|
||||
`line_only`
|
||||
If true, only parse initial properties and not the block.
|
||||
Lexer ends before the colon (if any).
|
||||
"""
|
||||
|
||||
seen_keywords = set()
|
||||
@@ -330,10 +364,16 @@ class Parser(object):
|
||||
# If not block_only, we allow keyword arguments on the starting
|
||||
# line.
|
||||
while True:
|
||||
cp = l.checkpoint()
|
||||
if l.match(':'):
|
||||
l.expect_eol()
|
||||
l.expect_block(self.name)
|
||||
block = True
|
||||
# If line_only, we stop before the colon.
|
||||
if line_only:
|
||||
l.revert(cp)
|
||||
block = False
|
||||
else:
|
||||
l.expect_eol()
|
||||
l.expect_block(self.name)
|
||||
block = True
|
||||
break
|
||||
|
||||
if l.eol():
|
||||
@@ -700,6 +740,24 @@ class DisplayableParser(Parser):
|
||||
return rv
|
||||
|
||||
|
||||
class AddImageParser(Parser):
|
||||
def __init__(self, name):
|
||||
super().__init__(name)
|
||||
self.variable = True
|
||||
|
||||
def parse(self, loc, l, parent, keyword):
|
||||
rv = slast.SLAddImage(loc, self.name)
|
||||
|
||||
self.parse_contents(l, rv, line_only=True)
|
||||
l.require(':')
|
||||
l.expect_eol()
|
||||
l.expect_block("ATL block")
|
||||
rv.atl_transform = renpy.atl.parse_atl(l.subblock_lexer()) # type: ignore
|
||||
return rv
|
||||
|
||||
AddImageParser("add image")
|
||||
|
||||
|
||||
class IfParser(Parser):
|
||||
|
||||
def __init__(self, name, node_type, parent_contents):
|
||||
|
||||
@@ -608,6 +608,7 @@ cdef class FTFont:
|
||||
gl.character = c
|
||||
gl.variation = vs
|
||||
gl.ascent = self.ascent
|
||||
gl.descent = -self.descent
|
||||
gl.width = cache.width
|
||||
gl.line_spacing = self.lineskip
|
||||
gl.draw = True
|
||||
|
||||
@@ -908,6 +908,7 @@ cdef class HBFont:
|
||||
gl.glyph = glyph_info[i].codepoint
|
||||
|
||||
gl.ascent = self.ascent
|
||||
gl.descent = -self.descent
|
||||
gl.line_spacing = self.lineskip
|
||||
gl.draw = True
|
||||
|
||||
|
||||
@@ -266,6 +266,9 @@ def create_textshader_args_dict(name, shader, s):
|
||||
if not uniform.startswith("u_"):
|
||||
uniform = "u_" + uniform
|
||||
|
||||
if uniform.startswith("u__"):
|
||||
uniform = uniform[:2] + "textshader_" + name.replace(".", "_") + uniform[2:]
|
||||
|
||||
for k, v in shader.uniforms:
|
||||
if k == uniform:
|
||||
break
|
||||
|
||||
+50
-18
@@ -37,6 +37,8 @@ import renpy.text.font as font
|
||||
import renpy.text.extras as extras
|
||||
from renpy.text.emoji_trie import emoji, UNQUALIFIED
|
||||
|
||||
from renpy.gl2.gl2polygon import Polygon
|
||||
|
||||
from _renpybidi import log2vis, WRTL, RTL, ON # @UnresolvedImport
|
||||
|
||||
BASELINE = -65536
|
||||
@@ -84,8 +86,7 @@ class TextMeshDisplayable(renpy.display.core.Displayable):
|
||||
|
||||
def render(self, width, height, st, at):
|
||||
|
||||
rv = renpy.display.render.Render(width, height)
|
||||
rv.mesh = self.mesh
|
||||
rv = renpy.display.render.Render(self.width, self.height)
|
||||
|
||||
rv.add_shader("renpy.texture")
|
||||
|
||||
@@ -95,12 +96,41 @@ class TextMeshDisplayable(renpy.display.core.Displayable):
|
||||
for k, v, is_displayable in self.uniforms:
|
||||
|
||||
if is_displayable:
|
||||
v = renpy.display.render.render(v, width, height, st, at)
|
||||
v = renpy.display.render.render(v, self.width, self.height, st, at)
|
||||
rv.depends_on(v)
|
||||
|
||||
rv.add_uniform(k, v)
|
||||
|
||||
rv.absolute_blit(self.tex, (0, 0))
|
||||
if not isinstance(self.tex, renpy.display.render.Render):
|
||||
|
||||
# Single texture case.
|
||||
|
||||
rv.absolute_blit(self.tex, (0, 0))
|
||||
rv.mesh = self.mesh
|
||||
|
||||
else:
|
||||
|
||||
for model, x, y, focus, main in self.tex.children:
|
||||
tex = model.uniforms["tex0"]
|
||||
w, h = tex.get_size()
|
||||
|
||||
# Adjust the size for the texture borders.
|
||||
w -= tex.bl + tex.br
|
||||
h -= tex.bt + tex.bb
|
||||
|
||||
cmesh = self.mesh.crop(Polygon.rectangle(x, y+h, x+w, y))
|
||||
|
||||
cmesh.remap_texture(
|
||||
0, 0, self.width, self.height,
|
||||
x - tex.bl, y - tex.bt, w + tex.bl + tex.br, h + tex.bt + tex.bb,
|
||||
)
|
||||
|
||||
cr = renpy.display.render.Render(self.width, self.height)
|
||||
cr.mesh = cmesh
|
||||
|
||||
cr.absolute_blit(tex, (0, 0))
|
||||
rv.absolute_blit(cr, (0, 0))
|
||||
|
||||
|
||||
return rv
|
||||
|
||||
@@ -921,6 +951,7 @@ class Layout(object):
|
||||
di = DrawInfo()
|
||||
|
||||
depth = len(self.outlines)
|
||||
max_depth = depth - 1
|
||||
|
||||
for o, color, xo, yo in self.outlines:
|
||||
depth -= 1
|
||||
@@ -989,7 +1020,7 @@ class Layout(object):
|
||||
|
||||
if self.textshaders:
|
||||
for ts in self.textshaders:
|
||||
mr = self.create_mesh_displayable(o, tex, lines, xo, yo, depth, ts)
|
||||
mr = self.create_mesh_displayable(o, tex, lines, xo, yo, depth, max_depth, ts)
|
||||
self.mesh_displayables.append((o, xo, yo, mr))
|
||||
|
||||
if self.textshaders:
|
||||
@@ -1677,7 +1708,7 @@ class Layout(object):
|
||||
|
||||
return rv
|
||||
|
||||
def create_mesh_displayable(self, outline, tex, lines, xo, yo, depth, ts):
|
||||
def create_mesh_displayable(self, outline, tex, lines, xo, yo, depth, max_depth, ts):
|
||||
"""
|
||||
Create a Displayable that will use a mesh to draw the text character-by-character.
|
||||
|
||||
@@ -1692,6 +1723,16 @@ class Layout(object):
|
||||
|
||||
`xo`, `yo`
|
||||
The x and y offsets of the text.
|
||||
|
||||
`depth`
|
||||
The depth of the text. Depth 0 is closest to the screen, 1 is further away, and
|
||||
so on.
|
||||
|
||||
`max_depth`
|
||||
The maximum depth of any text.
|
||||
|
||||
`ts`
|
||||
The text shader.
|
||||
"""
|
||||
|
||||
tw, th = tex.get_size()
|
||||
@@ -1773,24 +1814,17 @@ class Layout(object):
|
||||
g.index,
|
||||
left, top, right, bottom,
|
||||
left_time, right_time,
|
||||
g.ascent,
|
||||
g.ascent, g.descent,
|
||||
)
|
||||
|
||||
top = bottom
|
||||
|
||||
r = renpy.display.render.Render(tw, th)
|
||||
r.absolute_blit(tex, (0, 0))
|
||||
r.mesh = mesh
|
||||
r.add_shader("renpy.texture")
|
||||
|
||||
for i in ts.shader:
|
||||
r.add_shader(i)
|
||||
|
||||
main = xo == 0 and yo == 0 and outline == 0
|
||||
main = (depth == 0)
|
||||
|
||||
# (name, value, is_displayable)
|
||||
uniforms = [
|
||||
("u_text_depth", depth, False),
|
||||
("u_text_max_depth", max_depth, False),
|
||||
("u_text_outline", outline, False),
|
||||
("u_text_offset", (xo, yo), False),
|
||||
("u_text_main", 1.0 if main else 0.0, False),
|
||||
@@ -2526,10 +2560,8 @@ class Text(renpy.display.displayable.Displayable):
|
||||
vw, vh = virtual_layout.size
|
||||
w, h = layout.size
|
||||
|
||||
|
||||
# Blit text layers.
|
||||
rv = renpy.display.render.Render(vw, vh)
|
||||
# rv = renpy.display.render.Render(*layout.unscale_pair(w, h))
|
||||
|
||||
if renpy.config.draw_virtual_text_box:
|
||||
fill = renpy.display.render.Render(vw, vh)
|
||||
|
||||
@@ -66,6 +66,7 @@ cdef class Glyph:
|
||||
|
||||
# The ascent and spacing of the font.
|
||||
public int ascent
|
||||
public int descent
|
||||
public int line_spacing
|
||||
|
||||
# The width of the character.
|
||||
@@ -106,7 +107,7 @@ cdef class Glyph:
|
||||
public object shader
|
||||
|
||||
# The index of this displayable - the order in which it is shown.
|
||||
public short index
|
||||
public int index
|
||||
|
||||
|
||||
cdef class Line:
|
||||
|
||||
@@ -39,6 +39,7 @@ cdef class Glyph:
|
||||
self.rtl = 0
|
||||
self.duration = -1
|
||||
self.shader = None
|
||||
self.descent = 0
|
||||
|
||||
def __repr__(self):
|
||||
if self.variation == 0:
|
||||
@@ -55,6 +56,7 @@ cdef class Glyph:
|
||||
split : int
|
||||
ruby : int
|
||||
ascent : int
|
||||
descent: int
|
||||
line_spacing : int
|
||||
width : float
|
||||
advance : float
|
||||
@@ -885,6 +887,7 @@ def assign_index(index, list glyphs):
|
||||
return index
|
||||
|
||||
|
||||
|
||||
def hyperlink_areas(list l):
|
||||
"""
|
||||
Returns a list of (hyperlink, x, y, w, h, valid_st) tuples, where each entry in
|
||||
|
||||
+5
-4
@@ -48,11 +48,12 @@ class Version(object):
|
||||
|
||||
py_branch_to_version[(python, branch)] = self
|
||||
|
||||
Version("main", 3, "8.3.0", "Second Star to the Right")
|
||||
Version("main", 2, "7.8.0", "Straight on Till Morning")
|
||||
|
||||
Version("fix", 3, "8.2.4", "64bit Sensation")
|
||||
Version("fix", 2, "7.7.4", "32bit Sensation")
|
||||
Version("main", 3, "8.4.0", "TBD")
|
||||
|
||||
Version("fix", 3, "8.3.1", "Second Star to the Right")
|
||||
Version("fix", 2, "7.8.1", "Straight on Till Morning")
|
||||
|
||||
|
||||
def make_dict(branch, suffix="00000000", official=False, nightly=False):
|
||||
"""
|
||||
|
||||
+1
-2
@@ -2,5 +2,4 @@
|
||||
|
||||
cd $(dirname $(dirname $(readlink -f $0)))
|
||||
|
||||
nice lib/py2-linux-x86_64/python add.py --real "$@"
|
||||
nice lib/py3-linux-x86_64/python add.py --real "$@"
|
||||
lib/py3-linux-x86_64/python add.py --real "$@"
|
||||
|
||||
@@ -16,7 +16,5 @@ sleep 2
|
||||
|
||||
rpy pull
|
||||
rpy build --python 3
|
||||
rpy build --python 2
|
||||
|
||||
lib/py3-linux-x86_64/python distribute.py
|
||||
lib/py2-linux-x86_64/python distribute.py
|
||||
|
||||
@@ -114,13 +114,17 @@ be used like this.
|
||||
|
||||
.. _synchro-start:
|
||||
|
||||
When multiple play statements are run at the same time, the audio in each channel will start synchronized.
|
||||
Specifically, the audio will start:
|
||||
Ren'Py supports a feature that can ensure that audio files start playing at the same time. This feature
|
||||
is enabled on looping audio channels (like music) by default, but can also be enabled by the
|
||||
`synchro_start` option to :func:`renpy.music.register_channel` or :func:`renpy.music.play`.
|
||||
|
||||
When synchro start is enabled and multiple play statements are run at the same time, the audio in each channel
|
||||
will start synchronized. Specifically, the audio will start:
|
||||
|
||||
* When the audio files on every channel have been loaded and audio samples are available.
|
||||
* When all all channels have been faded out.
|
||||
|
||||
The play statement will delay starting new audio until these conditions have been met.
|
||||
New audio will start playing when both conditions are met.
|
||||
|
||||
|
||||
Stop Statement
|
||||
|
||||
+58
-11
@@ -4,6 +4,53 @@ Changelog (Ren'Py 7.x-)
|
||||
|
||||
*There is also a list of* :doc:`incompatible changes <incompatible>`
|
||||
|
||||
.. _renpy-8.3.1:
|
||||
.. _renpy-7.8.1:
|
||||
|
||||
8.3.1 / 7.8.1
|
||||
=============
|
||||
|
||||
Fixes
|
||||
-----
|
||||
|
||||
Using local shader variables by name in {shader} tags now works.
|
||||
|
||||
Textshaders now work with very large sizes and numbers of characters.
|
||||
|
||||
Lint avoids checking non-files as files.
|
||||
|
||||
The show_done character callback is now called and documented.
|
||||
|
||||
The web version of Ren'Py now saves persistent data when the screen is idle for .33 seconds.
|
||||
|
||||
The path to game.zip in a web build can now be configured by editing the generated index.html.
|
||||
|
||||
The web version of Ren'Py now defers calls to FS.syncfs, preventing errors that could be caused by files
|
||||
being rapidly renamed.
|
||||
|
||||
By default, synchronized start of audio now only occurs on looping channels, like music channels. The default
|
||||
can be changed on a channel-by-channel basis by supplying `synchro_start` to :func:`renpy.music.register_channel`.
|
||||
|
||||
Other Changes
|
||||
-------------
|
||||
|
||||
The new :func:`renpy.stop_skipping` cancels slow and fast skip.
|
||||
|
||||
Fast-skipping when slow-skipping (or vice versa) now cancels skipping.
|
||||
|
||||
On PC, Ren'Py will disable fullscreen when opening a URL.
|
||||
|
||||
Ren'Py now correctly clips displayables that are positioned at negative offsets to the parent, provided the
|
||||
displayable does not exit the clip rectangle.
|
||||
|
||||
:class:`AudioData` now explicitly supports video, and supports properties inside angles (like <from 1.0 to 6.0>).
|
||||
|
||||
:var:`config.font_transforms` is now documented. This allows you to define new font transforms for accessibility
|
||||
purposes.
|
||||
|
||||
The multiple argument to Character is now supplied to :doc:`character_callbacks`.
|
||||
|
||||
|
||||
.. _renpy-8.3.0:
|
||||
.. _renpy-7.8.0:
|
||||
|
||||
@@ -22,7 +69,7 @@ audio channels. The audio filter system is based on webaudio, and includes the f
|
||||
* Mix, a way of mixing two audio streams.
|
||||
* Sequence, a way of applying more than one filter to audio.
|
||||
* WetDry, a way of filtering a stream with a wet and dry control.
|
||||
* Reverb, a way of applying artifical reverb to the audio.
|
||||
* Reverb, a way of applying artificial reverb to the audio.
|
||||
|
||||
|
||||
Text Shaders
|
||||
@@ -41,7 +88,7 @@ the :var:`config.default_textshader` variable. A text block should either use te
|
||||
is not supported.
|
||||
|
||||
Custom text shaders are supported using the :func:`renpy.register_text_shader` function. These have access
|
||||
to new uniforms and attributes that are appopriate to text display.
|
||||
to new uniforms and attributes that are appropriate to text display.
|
||||
|
||||
|
||||
Other Shader Changes
|
||||
@@ -78,7 +125,7 @@ filter out translation files.
|
||||
Window Statement Changes
|
||||
------------------------
|
||||
|
||||
There have been a changes to the ``window`` statment:
|
||||
There have been changes to the ``window`` statement:
|
||||
|
||||
* ``window show`` and ``window hide`` no longer disable the automatic window
|
||||
management that Ren'Py does. Instead, these statements will immediately
|
||||
@@ -86,7 +133,7 @@ There have been a changes to the ``window`` statment:
|
||||
|
||||
* The new ``window auto False`` statement will disable automatic window
|
||||
management, and the new ``window auto True`` statement will re-enable it.
|
||||
(The existing ``window auto`` statement wil also work, but ``window auto True``
|
||||
(The existing ``window auto`` statement will also work, but ``window auto True``
|
||||
is preferred.)
|
||||
|
||||
The intent behind this is to make ``window hide`` more useful, as it can
|
||||
@@ -94,15 +141,15 @@ be used to hide the window for effects without disabling automatic window
|
||||
management.
|
||||
|
||||
When a ``window show`` occurs after ``window hide``, Ren'Py will look forward
|
||||
to the next say statement to determine the type of thr window to show. Previously,
|
||||
to the next say statement to determine the type of the window to show. Previously,
|
||||
it looked back to the last say statement.
|
||||
|
||||
|
||||
Screenshots and Paper Dolls
|
||||
---------------------------
|
||||
|
||||
Taking a screenshot now hides the notify screen, so multiple screenshot do not
|
||||
leak the path to the previous one. This controled by :var:`config.pre_screenshot_actions`.
|
||||
Taking a screenshot now hides the notify screen, so multiple screenshots do not
|
||||
leak the path to the previous one. This controlled by :var:`config.pre_screenshot_actions`.
|
||||
|
||||
The new :func:`renpy.render_to_file` and :func:`renpy.render_to_surface` functions make it possible to
|
||||
capture displayables (including trees of displayables, like layered images) and save that to a file
|
||||
@@ -126,7 +173,7 @@ Wrapped methods of the Steamworks API are documented on the :doc:`achievement` p
|
||||
Android
|
||||
-------
|
||||
|
||||
Ren'Py now targts Android 15 (API level 35), though versions down to Androoid 5 may still work.
|
||||
Ren'Py now targets Android 15 (API level 35), though versions down to Android 5 may still work.
|
||||
|
||||
Features
|
||||
--------
|
||||
@@ -138,7 +185,7 @@ The translation identifier screen (accessed through shift+D) is now the translat
|
||||
information about the line being executed. If a language is selected, the screen will also show the line being
|
||||
translated, and the text of the say statement being translated.
|
||||
|
||||
:doc:`cds` can now take take an ATL block, which is supplied to the `execute` function as a keyword argument
|
||||
:doc:`cds` can now take an ATL block, which is supplied to the `execute` function as a keyword argument
|
||||
giving an ATL transform. It's also possible to define a creator-defined statement that optionally takes
|
||||
an ATL block, or a block of script statements.
|
||||
|
||||
@@ -159,7 +206,7 @@ purpose of translations.
|
||||
The :class:`Hide` action and :func:`renpy.hide_screen` actions now take an `immediately`
|
||||
keyword argument, which prevents 'on hide' handlers in the screens from running.
|
||||
|
||||
:doc:`character_callbacks` are now given information about the line of of dialogue
|
||||
:doc:`character_callbacks` are now given information about the line of dialogue
|
||||
and the segment of the line that is being shown.
|
||||
|
||||
The :func:`renpy.call_in_new_context` and :func:`renpy.invoke_in_new_context` functions
|
||||
@@ -196,7 +243,7 @@ Other Changes
|
||||
|
||||
The notification screen is now hidden before a screenshot is taken.
|
||||
|
||||
The :tpref:`crop` transform propery now always takes the size of the crop box,
|
||||
The :tpref:`crop` transform property now always takes the size of the crop box,
|
||||
even if bigger than what is being cropped.
|
||||
|
||||
The hspace and vspace text tags now respect window scaling.
|
||||
|
||||
@@ -19,6 +19,9 @@ that occured. Possible events are:
|
||||
into multiple segments by the {w} or {p} text tags, but always consists of
|
||||
at least one segment.
|
||||
|
||||
"show_done"
|
||||
Called after showing each segment of dialogue.
|
||||
|
||||
"slow_done"
|
||||
Called after slow text finishes showing. Note that this event may occur
|
||||
after "end", in cases where dialogue does not cause an interaction
|
||||
@@ -38,6 +41,9 @@ The callback is called with at the keyword arguments:
|
||||
`what`
|
||||
The text that is going to be supplied to the what displayable.
|
||||
|
||||
`multiple`
|
||||
The `multiple` argument to :func:`Character`.
|
||||
|
||||
The "show" and "slow_done" callbacks are also given additional keyword
|
||||
arguments:
|
||||
|
||||
|
||||
@@ -1629,6 +1629,21 @@ Text and Fonts
|
||||
simplify and shorten ``{font}`` tags, and gives them access to the
|
||||
:ref:`fontgroup` feature.
|
||||
|
||||
.. var:: config.font_transforms = { ... }
|
||||
|
||||
This is used to create new font transforms for accessibility purposes. The font transforms can be
|
||||
activated by :func:`Preferences` using "font transform" as the first argument.
|
||||
|
||||
The dictionary maps strings giving the nam use to a function. The function is called with a font
|
||||
or :class:`FontGroup` as the only argument, and is expected to return a font or font group. For
|
||||
example, the dejavusans transform is defined as::
|
||||
|
||||
init python:
|
||||
def dejavusans(f):
|
||||
return "DejaVuSans.ttf"
|
||||
|
||||
config.font_transforms["dejavusans"] = dejavusans
|
||||
|
||||
.. var:: config.font_replacement_map = { }
|
||||
|
||||
This is a map from (font, bold, italics) to (font, bold, italics),
|
||||
|
||||
@@ -106,6 +106,7 @@ the omission in future versions.
|
||||
* Gustavo Carvalho
|
||||
* Haelwenn (lanodan) Monnier
|
||||
* Hanaka
|
||||
* HB38
|
||||
* Helloise
|
||||
* Helmut K. C. Tessarek
|
||||
* Hentai Senshi
|
||||
|
||||
@@ -61,7 +61,7 @@ the ``[`` character begins a substitution. To use them in dialogue,
|
||||
double them. It may also be necessary to precede a quote with a
|
||||
backslash to prevent it from closing the string. For example::
|
||||
|
||||
"I walked past a sign saying, \"Let's give it 100%!\""
|
||||
"I walked past a sign saying, \"Let's give it 100%%!\""
|
||||
|
||||
It's also possible to use a proxy function instead of a character
|
||||
object. More details about this in :ref:`this section <say-proxy>`.
|
||||
|
||||
+500
-500
File diff suppressed because it is too large
Load Diff
@@ -155,11 +155,20 @@ it needs to be declared in the `variables` argument to renpy.register_text_shade
|
||||
In addition to these, the model :ref:`uniforms and attributes <model-uniforms>` are available, with
|
||||
`a_position`, `a_tex_coord`, `u_time` and `u_random` being particularly useful.
|
||||
|
||||
|
||||
Uniforms
|
||||
^^^^^^^^
|
||||
|
||||
``float u_text_depth``
|
||||
The depth of the text from the top. The topmost layer of text has a depth of 0.0, the next layer has a depth of 1.0, and so on.
|
||||
The depth of the text from the top. The topmost text has a depth of 0.0, the first outline or shadow has a
|
||||
depth of 1.0, the second outline or shadow has a depth of 2.0, and so on.
|
||||
|
||||
``float u_text_main``
|
||||
If this is 1.0, the text is the main text. If this is 0.0, the text is the outline or shadow of the main text.
|
||||
|
||||
``float u_text_max_depth``
|
||||
The maximum value of u_text_depth. This is the number of outlines and shadows that will be drawn. When u_text_depth
|
||||
is equal to this value, the texct is the last outline or shadow, which may be useful for drawing backgrounds.
|
||||
|
||||
``vec2 u_text_offset``
|
||||
The offset of the text from the center of the character. This is in drawable pixels in x, y order.
|
||||
@@ -167,39 +176,43 @@ Uniforms
|
||||
``float u_text_outline``
|
||||
The width of the outline around the text. This is in drawable pixels, and is the distance from the edge of the text to the edge of the outline.
|
||||
|
||||
``float u_text_main``
|
||||
If this is 1.0, the text is the main text. If this is 0.0, the text is the outline or shadow of the main text.
|
||||
``float u_text_slow_duration``
|
||||
The duration of a single slow character, when showing slow text. 0.0 if not showing slow text.
|
||||
|
||||
``float u_text_slow_time``
|
||||
The time in seconds since the start of the slow text effect. This will only increase until the end of slow
|
||||
text, when it will max out. If the user clicks to terminate slow text, this will max out. It should only
|
||||
be used for slow text - use
|
||||
|
||||
``float u_text_slow_duration``
|
||||
The duration of a single slow character, when showing slow text. 0.0 if not showing slow text.
|
||||
``float u_text_to_drawable``
|
||||
The ratio of virtual pixels to drawable pixels. This is used to convert from virtual pixels to drawable pixels.
|
||||
|
||||
``float u_text_to_virtual``
|
||||
The ratio of drawable pixels to virtual pixels. This is used to convert from drawable pixels to virtual pixels.
|
||||
|
||||
``float u_text_to_drawable``
|
||||
The ratio of virtual pixels to drawable pixels. This is used to convert from virtual pixels to drawable pixels.
|
||||
|
||||
``sampler2D tex0``
|
||||
This texture contains the rendered text.
|
||||
This texture contains the rendered text at the current depth.
|
||||
|
||||
``vec2 res0``
|
||||
The resolution of the texture, in drawable pixels.
|
||||
The resolution of tex0, in drawable pixels.
|
||||
|
||||
|
||||
Attributes
|
||||
^^^^^^^^^^
|
||||
|
||||
When drawing text, each vertex corresponds to a single glyph. Multiple glyphs may have vertices that share
|
||||
locations, but these are passed to the shader as different vertices.
|
||||
|
||||
``float a_text_ascent``
|
||||
The ascent of the current character above the baseline, in drawable pixels.
|
||||
The ascent of the current glyph's font above the baseline, in drawable pixels.
|
||||
|
||||
``vec2 a_text_center``
|
||||
The position of the center of the center of the vertex's baseline, in drawable pixels. This is not the
|
||||
The position of the center of the glyphs's baseline, in drawable pixels. This is not the
|
||||
center of the rectangle, it's a point on the baseline and around the center of the character.
|
||||
|
||||
``float a_text_descent``
|
||||
The descent of the current glyph below the baseline, in drawable pixels.
|
||||
|
||||
``float a_text_index``
|
||||
The index of the glyph being drawn. This is 0 for the first vertex and goes up by one for each vertex.
|
||||
|
||||
@@ -218,7 +231,7 @@ Attributes
|
||||
but ``u_text_slow_duration`` is not 0.0, this will be -3600.0.
|
||||
|
||||
``vec4 a_text_pos_rect``
|
||||
The rectangle being drawn, in drawable pixels. This is a vec4 with the x, y, width, and height of the rectangle,
|
||||
The rectangle containing the glyph, in drawable pixels. This is a vec4 with the x, y, width, and height of the rectangle,
|
||||
in drawable pixels. This can be converted to texture coordinates by dividing it by ``res0``.
|
||||
|
||||
|
||||
|
||||
@@ -95,9 +95,9 @@ Open build Directory
|
||||
|
||||
Generated folders
|
||||
-----------------
|
||||
Say, your project is in the renpy/projects/main/yourproject folder. Then you
|
||||
Say, your project is in the renpy/projects/main/yourproject folder. Then you
|
||||
will find a new renpy/projects/main/yourproject-1.0-dists folder. This folder
|
||||
contains a yourproject-1.0-web subfolder, and this subfolder's zipped version,
|
||||
contains a yourproject-1.0-web subfolder, and this subfolder's zipped version,
|
||||
a yourproject-1.0-web.zip file.
|
||||
|
||||
Uploading your Game
|
||||
@@ -112,6 +112,9 @@ If you're hosting the game yourself, you'll want to make sure your web
|
||||
server serves .wasm files using the application/wasm MIME type. Doing
|
||||
so will make the game load faster, and prevent a warning from happening.
|
||||
|
||||
Some web hosts may reject the game.zip file. In that case, rename it to
|
||||
game.data, and edit index.html to change game.zip to game.data.
|
||||
|
||||
.. _web-presplash:
|
||||
|
||||
Presplash
|
||||
@@ -141,7 +144,7 @@ package your game for the web the first time. The default contents of this
|
||||
file is::
|
||||
|
||||
# RenPyWeb progressive download rules - first match applies"
|
||||
# '+' = progressive download, '-' = keep in game.zip (default)
|
||||
# '+' = progressive download, '-' = keep in game.data (default)
|
||||
# See https://www.renpy.org/doc/html/build.html#classifying-and-ignoring-files for matching
|
||||
#
|
||||
# +/- type path
|
||||
|
||||
Reference in New Issue
Block a user