Compare commits

...

238 Commits

Author SHA1 Message Date
Tom Rothamel 8a21aa55dc Wrap json loaded in revertible objects.
This is intended to improve compatibility with older games that might
use .iteritems and similar methods.
2025-02-12 23:21:48 -05:00
Tom Rothamel 6c948bf046 fonts: Allow deallocation and clear face cache.
So fonts can be reloaded when required. Fixes #6153.
2025-02-12 22:51:50 -05:00
Tom Rothamel 8de2bda1e6 Proxy SelectedIf and SensitiveIf lists into a single Action.
Fixes #6132.
2025-02-07 01:24:18 -05:00
Tom Rothamel 5e3b209ba2 Fix the name of config.dissolve_shrinks.
Fixes #6122.
2025-01-31 22:07:18 -05:00
Tom Rothamel 2e45c3e609 doc: Fixes.
Fixes #6097.
2025-01-24 21:29:51 -05:00
Tom Rothamel 8c7a3b13bf Merge pull request #6105 from nullvoid8/docs_nearrect
Update `nearrect` documentation
2025-01-23 22:32:49 -05:00
Tom Rothamel 4a0738f2aa Document build.version.
Fixes #6102.
2025-01-22 22:19:42 -05:00
nullvoid8 899eb6616f merge documentation of nearrect the class, and nearrect the statement 2025-01-23 02:46:14 +00:00
Tom Rothamel 536fce4a22 sl2: Add box properties to imagemap.
As documented. Fixes #6090.
2025-01-18 23:03:42 -05:00
Tom Rothamel ca9e2dfe47 Fix regexp. 2025-01-14 01:49:35 -05:00
Tom Rothamel 321434e95e Allow a displayable with size to opt out of mouse focus.
And do that for viewports.

Fixes #6081.
2025-01-14 01:44:45 -05:00
the66F95 41b6e689d3 fix some newline typos 2025-01-13 08:56:13 -05:00
Tom Rothamel 7958f5445a Make gles2 the default renderer on arm-linux.
As it's much faster on Raspberry Pi, and probably other arm-linux
devices.
2025-01-11 22:36:46 -05:00
Gio efd4cc6b5e Document cb_args cb_ prefix behavior 2025-01-11 15:34:01 -05:00
Tom Rothamel 35c4ba4a41 Make all fields in gl2draw public.
Fixes #6060.
2025-01-10 22:56:34 -05:00
Tom Rothamel 5361a8e9a5 Ignore text tag errors that happen after {done}. 2025-01-10 01:21:56 -05:00
Tom Rothamel ba76f970c5 Perform substitution when scrying extend text.
This prevents problems if the scryed text substitutes things.

Fixes #6071
2025-01-10 01:07:25 -05:00
Tom Rothamel 7d8d05107b Allow the fix branch to run on python 3.12. 2025-01-09 22:44:43 -05:00
Tom Rothamel 2639028ce7 Document config.has_music, config.has_sound, and config.has_voice.
Also, slight correction on how a channel without a mixer works.

Fixes #6068.
2025-01-08 08:27:10 -05:00
Kassy beedbc0a22 Do not kill Renders that cache the last video frame on Web (#6057)
Fixes and issue where, when the next video frame is not ready, the previous one is returned by get_movie_texture_web(). Normally, this is just a GLTexture instance, but when using a mask, that frame is a Render instance instead. The problem is that Render instances get killed soon after they have been drawn, so get_movie_texture_web() returns a dead instance when re-using the previous frame which causes a crash because of missing uniforms when drawing the screen.

Fixes #6050.
2025-01-05 00:50:49 -05:00
Tom Rothamel 74157a4ad6 Update copyright for 2025. 2025-01-02 18:48:44 -05:00
Ruben Garcia 25b4a17d1a Fix typo 2025-01-02 18:47:03 -05:00
Tom Rothamel 4163c1396c Merge pull request #6035 from shawna-p/default-focus-fix2
Don't overrule focus override for max focus
2024-12-25 20:39:00 -05:00
shawna-p d6ab06dd1f Don't overrule focus override for max focus 2024-12-25 16:42:56 -05:00
Tichq 3db515db3c fix: function staticmethod of TransformMatrix 2024-12-25 07:29:53 -05:00
Tom Rothamel cc654ebfeb atl: Distinguish between children and included transforms.
During prediction. Fixes #6014.
2024-12-25 00:04:04 -05:00
Tom Rothamel f389c13b29 Better error if textshaders are used incorrectly. 2024-12-24 00:23:35 -05:00
Tom Rothamel c57dbe7a9d Use the correct condition for including i686.
Fixes #6028.
2024-12-23 20:34:28 -05:00
Tom Rothamel e35fcb2e86 Only include the current libpython3.{x}.dll in builds. 2024-12-22 09:32:23 -05:00
Tom Rothamel 38b505ba36 Fix code-typo regarding tight playback.
Fixes #6019.
2024-12-22 01:32:26 -05:00
Tom Rothamel f132d49157 text: Handle events in virtual coordinates.
Fixes #6013.
2024-12-18 23:17:56 -05:00
Tom Rothamel ba0bc218c2 cy3: Add noexcept annotations.
These allow Ren'Py to be compiled by cython 3.0.
2024-12-14 20:50:07 -05:00
Tom Rothamel 97331e2464 Fix to how SetCharacterVolume sets the volume.
Previously, it would try to adjust the volume. Now it treats it
the same way _CharacterVolumeValue does.

Fixes #6001.
2024-12-13 20:05:12 -05:00
Tom Rothamel 8d38a6ae4d Add no_launcher_links.txt.
If a file named ``no_launcher_links.txt`` exists in the Ren'Py base directory (the one with
renpy.exe, renpy.sh, and renpy.app in it), the launcher will disable links to renpy.org. While
not guaranteed, this is intended in educational and homeschool environments to prevent young
Ren'Py users from seeing adult sponsors.
2024-12-11 22:27:36 -05:00
Tom Rothamel e3c4993487 Bump the fix version. 2024-12-08 23:48:49 -05:00
Tom Rothamel d0270729c1 doc: Changelog. 2024-12-07 22:57:53 -05:00
Tom Rothamel 3bc3bf3e19 Avoid reporting string errors on triple-quoted strings.
Which tend to be much more intentional, and cause errors when
monologue mode exists.
2024-12-07 22:31:04 -05:00
Tom Rothamel 831fb59d49 Produce a better error for monologue mode with an id clause.
Fixes #5980.
2024-12-07 22:16:19 -05:00
Tom Rothamel f5555d6f1a Merge pull request #5982 from mal/fix-5981
Prevent MultipleDict masking builtins during interpolation
2024-12-05 22:02:58 -05:00
Mal Graty e7eb0e135b Meet expectation to raise KeyError on missing keys
Fixes #5981
2024-12-06 00:15:14 +00:00
Tom Rothamel bf9de85f75 Offer config.screen_width, config.screen_height to imagemaps.
This shouldn't affect normal imagemaps that use images, but
should make using non-image displayables in imagemaps work better.

Fixes #5976.
2024-12-03 23:28:01 -05:00
Tom Rothamel 6470a37b40 Use itch.zone instead of itch.ovh.
Per https://github.com/itchio/butler/commit/898b30bb2cadaaf561d91c4f7784aa1927c5cfb2

Fixes #5795.
2024-12-03 19:18:34 -05:00
Tom Rothamel 99a5ac89db Remove style_prefix from the template say screen.
As it's not used.

Fixes #5973.
2024-12-03 00:34:17 -05:00
Tom Rothamel e46073b059 Allow renpy.register_style_preference to take a style by name.
Per the documentation.

Fixes #5972.
2024-12-02 21:57:17 -05:00
Mal Graty 88ddee9d5e doc: Missing version headers in changelog 2024-12-02 01:24:05 +00:00
Tom Rothamel d8283c958c doc: Changelog. 2024-12-01 20:17:41 -05:00
Tom Rothamel 31025cdadb doc: Credits, sponsors. 2024-12-01 19:27:10 -05:00
naughty road e66a9b8c6d Code cleanup: remove superfluous line 2024-12-01 19:10:20 -05:00
naughty road 2b5b9835b7 Fix order of attempting to load presplash images
Checks for foreground+background first, before falling back to the single presplash image, instead of the other way around, to match behavior in the documentation (https://www.renpy.org/doc/html/splashscreen_presplash.html#adding-a-progress-bar).
2024-12-01 19:10:08 -05:00
the66F95 3f667e3ef1 Update dragdrop.py
should fix #5968 (not extensively tested)
2024-12-01 19:08:38 -05:00
Tom Rothamel 823e235a1c Remove debug raise.
Fixes #5966.
2024-12-01 17:09:27 -05:00
Tom Rothamel 1df2c15b07 Stop movies that may have been restarted when returning to a channel.
Fixes #5960. (Replicated as bug5911.)
2024-12-01 00:20:18 -05:00
Tom Rothamel 5c5252a516 Use the correct variable name. 2024-11-30 08:25:11 -05:00
Tom Rothamel 70bb4208bc Avoid save scanning restarting the interaction.
The strategy chosen was to keep track of which slots have had
information by the rest of Ren'Py, and only restarting if one of
those slots is accessed.

This is motivated by a series of interaction restarts at choice menus,
caused by the autosaves that happen when a choice menu is reached.
2024-11-29 21:42:03 -05:00
Tom Rothamel 2e1c09dbbd Remove the ATL "update" event.
This was rarely used, and caused problems, like #5926, with no
actual benefit.

Fixes #5956 by virtue of reverting #5927.
2024-11-29 21:09:41 -05:00
Tom Rothamel fc5f8e0d3e Revert "Update screen.py"
This reverts commit cb10f2a21a.
2024-11-29 20:23:41 -05:00
Tom Rothamel 28ae4a7c0c Fix where nvl_hide sets store._window.
So that _window is False before the empty window is shown.
2024-11-29 14:36:51 -05:00
Tom Rothamel ec5738c6e0 Add renpy.get_statement_name.
To make available the statement name.
2024-11-29 14:30:40 -05:00
Tom Rothamel 2da8beecd7 Handle non-keyboard focusable displayables.
Specifically, before doing any sort of keyboard focus, check
that the current focus supports the keyboard, and drop it if
it does.

Per #5936. Keeps the fix for #5173.
2024-11-29 13:07:57 -05:00
Tom Rothamel e0062cbebc Compat #4717.
Fixes #5954.
2024-11-28 22:31:14 -05:00
Tom Rothamel 9b290e07f5 Fix keyboard focus of viewports.
Based on #5936, fixes #5934.
2024-11-28 21:53:27 -05:00
Tom Rothamel 864feaba02 Indentation fix from #5947. 2024-11-24 11:48:50 -05:00
Tom Rothamel 76b068c6dc Take the CaretBlink change from #5947. 2024-11-24 11:45:22 -05:00
Tom Rothamel ebc6e66433 Add a ZWSP to pad out an empty line.
This fixes the same thing seen in #5947, in a different way.
2024-11-24 11:11:00 -05:00
Tom Rothamel f25dcea3cb Take the remaining fix from #5931.
Fixes #5929.
2024-11-23 22:35:03 -05:00
ヽ◕◡◕✿ノ 78899cfef3 Live2D.blend_opacity wasn't usable 2024-11-23 22:28:51 -05:00
Tom Rothamel 339c7357dc Update and modernize SpriteManager.
Fixes #5939

* Make SpriteManager pickleable.
* Update the idea of a fast render to take gl2 into account.
2024-11-23 22:15:35 -05:00
Tom Rothamel 4a1182cdd5 Ensure inputs are at least 1px wide.
Fixes #5944 while retaining #5929 and #5913.
2024-11-23 21:41:38 -05:00
Tom Rothamel 9ff3bb67e8 Revert "input mask regression"
This reverts commit 89d5858d2b.
2024-11-23 21:19:45 -05:00
Jan Masek f7a5e874ea Mention screen calling labels in Special Labels 2024-11-22 23:39:29 -05:00
HorBro38 ec758301ac Update displaying_images.rst
Corrects errant use of .jxl file type discovered in #5933
2024-11-21 17:56:47 -05:00
the66F95 19122e45c8 Update screen.py
seems to fix #5926 while preserving #5905
2024-11-20 23:10:26 -05:00
the66F95 89d5858d2b input mask regression
should fix #5929 while preserving #5913
2024-11-20 23:10:12 -05:00
the66F95 5a65eea075 Update viewport.py
should fix #5921
2024-11-19 22:59:21 -05:00
Edward Nicholes Jr. 4e5dd16606 Fix the ATL part of the tutorial to show the correct example code
In the "Tutorial" > "Transforms and Animation", there is a section that demonstrated that `repeat` can take an integer argument.

However, the `alt_image1` example code is shown twice on lines 543 and 548 for two different examples.

Line 548, should be changed to show the `alt_image2` example code which removed the `repeat 2` line from the previous example, showing that the animation will only happen once.
2024-11-19 22:59:12 -05:00
Tom Rothamel dd61e71beb Ensure the cache is maintained under lock.
And also check that cache entry is in the cache when it's killed.

Fixes #5923.
2024-11-19 22:25:23 -05:00
naughty road 70f30147df fix link to pyjnius docs
Seems the original URL refering to "stable" doesn't exist anymore, this updates it to direct to "latest" instead.
2024-11-18 22:41:47 -05:00
Tom Rothamel fa84f0c61e doc: Changelog wording fix. 2024-11-16 03:06:09 -05:00
Tom Rothamel 74339b0432 Bump the fix version. 2024-11-16 01:59:03 -05:00
Tom Rothamel f6f4b3bce3 Empty masked inputs no longer show a single mask glyph.
Fixes #5913.
2024-11-15 20:34:32 -05:00
Tom Rothamel 5dbd50159a doc: Correct the notify screen. 2024-11-15 00:11:26 -05:00
Tom Rothamel 1e85fd051a doc: Sponsors. 2024-11-14 23:16:13 -05:00
Tom Rothamel dc65afd6f1 Duplicate the children of Movie.
Fixes #5907.
2024-11-13 22:55:57 -05:00
Tom Rothamel e3222ec11d Store the old_max_default even if it's not used.
Fixes #5903.
2024-11-12 22:30:57 -05:00
Tom Rothamel 37c78dccda config.nvl_adv_transition no longer forces the dialogue window to be hidden.
Fixes #5904.
2024-11-12 22:11:46 -05:00
Tom Rothamel 1a7f0ca8c3 Screens go from SHOW to UPDATE upon first update.
Fixes #5905.

The underlying issue was caused by the screen being run for a
second time in SHOW mode, which in turn prevented scopes of used
screens from being saved.
2024-11-12 21:55:58 -05:00
Tom Rothamel be8831b4b2 doc: Changelog and credits. 2024-11-11 00:50:46 -05:00
Tom Rothamel fc87c053c3 Do not focus a displayable that's been transformed to nothing.
Fixes #5869.
2024-11-11 00:41:32 -05:00
Tom Rothamel 10cc039460 Merge pull request #5900 from Kassy2048/fix
Do not offer to open "traceback.txt" on mobile
2024-11-10 23:48:00 -05:00
Tom Rothamel fd027dbdbd Duplicate an AlphaMask's mask. 2024-11-10 23:47:28 -05:00
Kassy 15eb9a9c13 Do not offer to open "traceback.txt" on mobile
renpy.launch_editor() is not supported on mobile (or Web) so clicking on
the button does nothing.
2024-11-11 05:31:11 +01:00
woolion 2ded06bc5d steam: fix get_session_ticket 2024-11-10 13:56:08 -05:00
Tom Rothamel c5cdd0038e Merge pull request #5891 from DipeshAggarwal/patch-2
Fix the wrong keymap for accessibility
2024-11-08 21:18:51 -05:00
Tom Rothamel 8bac98c29a Merge pull request #5892 from DipeshAggarwal/patch-3
Replace `balloon` with 'bubble` to represent a valid type for callbacks
2024-11-08 21:18:37 -05:00
Dipesh Aggarwal 421d8cc37d Replace balloon with 'bubble` to represent a valid type for callbacks 2024-11-09 07:08:01 +05:30
Dipesh Aggarwal c097434036 Fix the wrong keymap for accessibility 2024-11-09 06:59:12 +05:30
Dipesh Aggarwal e3cc4be1b8 Fix UnboundLocalError: local variable 'keyboard_mode' referenced before assignment
(cherry picked from commit 15f498516a)
2024-11-09 03:31:10 +04:00
Tom Rothamel b5711f7e11 doc: Changelog whitespace changes. 2024-11-08 01:07:11 -05:00
Tom Rothamel 8f2649e3a7 doc: Changelog. 2024-11-07 22:29:47 -05:00
Tom Rothamel ab42c0f6e1 Only skip the BOM, not other characters. 2024-11-07 22:02:23 -05:00
Tom Rothamel 01eacd2932 Avoid forcing synchro_start when playing a movie.
Fixes #5887.

This may cause mask_channel to get a bit more out of sync, but it's
already so-so, and side_mask is the superior alternative.
2024-11-07 21:55:08 -05:00
Tom Rothamel c25f22fe4f doc: Credits. 2024-11-07 21:54:55 -05:00
Tom Rothamel fe3b800cab Change Model to create meshes as documented.
Fixes #5692.
2024-11-05 00:36:12 -05:00
Tom Rothamel ccde74bdb8 doc: Fix config.skip_sounds.
Fixes #5883.
2024-11-04 08:47:28 -05:00
Tom Rothamel ab6f469811 textshader: Consider all glyphs when assigning coordinates.
Fixes #5884.
2024-11-03 23:22:46 -05:00
Tom Rothamel f92b70d38c Protect against errors with disconnected audio sources.
Fixes #5882, with low confidence.
2024-11-03 21:14:34 -05:00
Andy_kl e89338342a Skip BOM in ren_py_to_rpy so RENPY can start at first line. 2024-11-04 02:29:14 +04:00
Tom Rothamel 62ca262aec Fix tyop. 2024-11-02 15:49:52 -04:00
Tom Rothamel eb5a84d420 Remove unnecessary locking in im.Cache.
This is the most likely cause of the performance issues in #5295.
Now, the lock should be held for brief periods of time.
2024-11-02 15:48:08 -04:00
Tom Rothamel 3280bcc5ff Clarify where gui.unscrollable works.
Fixes #5218.
2024-11-02 15:06:05 -04:00
Tom Rothamel 5c5f72659c Restore old behavior of screenshot.
When render_tree is None, screenshot takes the old contents of
the framebuffer. Which isn't great, but since it happens when
at the main menu, isn't a huge deal.

Fixes #5879.
2024-11-01 22:47:15 -04:00
Tom Rothamel b9789ae25c Fix icon font in the director.
Fixes #5876.
2024-10-31 01:29:21 -04:00
Tom Rothamel 58e56cff88 Quote attributes in the image attributes screen.
Per #5877.
2024-10-30 22:30:28 -04:00
Tom Rothamel 4b532ac11e Produce a sensible error when monologue mode is used in a menu.
Fixes #5872.
2024-10-29 21:40:41 -04:00
Tom Rothamel a7f16eee3f Remove the "always" steam deck keyboard mode. 2024-10-29 21:13:53 -04:00
Tom Rothamel fff2558083 Revert "Fix an issue that could stop audio rollback from working."
This reverts commit 14ced3377a.
2024-10-28 01:03:30 -04:00
Tom Rothamel 944b7d0e9c Copy the music dictionary when it changes.
Fixes #5868 while continuing to fix #5802.
2024-10-28 00:51:38 -04:00
Tom Rothamel 7022001dbe Keep high-rate drawing for 12 frames (.2s).
This ensures that a static image is pushed through any sort of
compositor that requires constant flipping.

Fixes #5867.
2024-10-27 01:38:58 -04:00
Tom Rothamel 0ab9444676 hbfont: Underlines and strikethroughs should not include glyph.x_offset.
Fixes #5861.
2024-10-26 19:19:17 -04:00
Tom Rothamel 0795565e07 Quit out of pygame.display when the presplash ends.
This resets the IME system, which is needed to fix #5801.
2024-10-25 00:51:30 -04:00
Tom Rothamel 3cf31edae2 doc: Fix mistake.
Fixes #5863.
2024-10-24 21:45:59 -04:00
Craig de Stigter 8b356090d9 Fix an obvious undefined variable error 2024-10-24 21:28:40 -04:00
Tom Rothamel 9f3be6e604 Only synchro start movie channels when explicitly requested.
Per #5914.
2024-10-23 21:28:48 -04:00
Tom Rothamel 0e6522f867 Use a different approach to #5854.
The focus system may not always use the same displayable, so .focus
is a good idea. Instead, change the prefix each time it's asked for.
2024-10-23 01:50:46 -04:00
Tom Rothamel 3cbe6fa1d8 Avoid re-focusing a displayable that has replaced another.
Fixes #5854.
2024-10-22 23:42:02 -04:00
Ayowel bb5588f182 Do not needlessly track files in late_base_patterns 2024-10-21 23:38:34 -04:00
Ayowel 45a6a08559 Only ignore .rpe files if they are not explicitly tracked 2024-10-21 23:38:23 -04:00
Tom Rothamel e1cb42f253 gl2: Round coordinates during pixel_perfect.
Rounding errors could cause problems when performing the pixel
perfect correction, and the rounding errors could be different
in normal rendering and render-to-texture.

By rounding first, we eliminate these problems.

Fixes #5844.
2024-10-21 00:53:08 -04:00
Tom Rothamel dde19b8716 gl2: Fix gl_anisotropic
Which used the incorrect field.

Fixes #5851.
2024-10-20 21:57:18 -04:00
Tom Rothamel 906788fe88 video: Avoid stopping movies if both current and old have _play.
To make Ren'Py cooperate better with games that run the movies
themselves.

Per #5814.
2024-10-19 16:35:26 -04:00
Tom Rothamel 69b019f03c Use last_channel_movie to stop movies, since it exists. 2024-10-19 16:30:11 -04:00
Tom Rothamel 9de1c93ef9 Document that transforms shouldn't be applied to a Drag directly.
Per #5847.
2024-10-19 01:19:06 -04:00
Tom Rothamel c4f478160b Add referrer support to installer.download. 2024-10-17 23:21:01 -04:00
Tom Rothamel 054535f0c8 Restart looping movies during rollback.
Fixes #5564.
2024-10-16 23:19:10 -04:00
Tom Rothamel 16b9c2be67 Use insets when evaluating keyboard focus conditions.
Fixes #5831.
2024-10-15 01:05:44 -04:00
Tom Rothamel 4a591d552b Fix a rounding issue that stopped bar_invert from working.
Fixes #5843.
2024-10-14 00:43:15 -04:00
Tom Rothamel 576a1138d3 Changelog last. 2024-10-13 19:35:41 -04:00
avonder 50ef339f16 android: Install-time asset pack support. (#5837)
Enable reading from APK-based asset packs
2024-10-13 19:32:49 -04:00
Tom Rothamel 0385bbcb9b Re-render displayables after box_wrap.
After wrap, a displayable may be offered a different size, and
so the render needs to happen again.
2024-10-12 23:52:07 -04:00
Tom Rothamel 20a5d6cd69 Factor out check_spline_types.
Recursive inner functions create reference loops that need to be
GC-ed, so eliminating such can reduce GC pauses.

Per #5832.
2024-10-07 22:33:42 -04:00
Tom Rothamel 34a1f57e50 Make all default_focus activations explicit.
So the hovered handler runs.

Fixes #5794.
2024-10-07 02:06:43 -04:00
Tom Rothamel 5245fbb38e Consider controller events inputs before being mapped.
Fixes #5780.
2024-10-06 23:16:54 -04:00
Tom Rothamel 937c91f314 Proactively remove ongoing transitions.
Fixes #5827.
2024-10-06 01:39:47 -04:00
Tom Rothamel d90f1cdc30 Another fix to grabs and viewports. 2024-10-04 21:48:41 -04:00
Tom Rothamel 8c82667ae1 Disable pixel-perfect for Frame.
It only would work in corners, and wasn't working on the other sections
except at 1:1. So disable it.

Fixes #5793.
2024-10-04 00:28:32 -04:00
Tom Rothamel 3085c15caf Add a method in render.pyx to find GL properties. 2024-10-03 23:37:14 -04:00
Tom Rothamel 2e37df7103 Prevent crash when Live2D.used_nonexclusive is None.
Fixes #5816.
2024-10-03 21:46:32 -04:00
Tom Rothamel 9a75b6628b Another fix to viewport dragging.
Per #5776.

Co-Authored-by: the66F95 <54831834+the66F95@users.noreply.github.com>
2024-10-03 21:37:34 -04:00
Tom Rothamel 405d8d4399 Allow drag to begin inside a button.
Fixes #5776, comment 2383488254.
2024-10-03 00:51:19 -04:00
Mark 56dda5590b doc: Fix code block in cds.rst 2024-10-01 22:48:48 -04:00
Tom Rothamel 86046383a8 Improve how draggable viewports and drags interact.
After these changes, the innermost draggable should take precedence,
rather than what's focused.

Fixes #5776.
2024-09-29 22:16:42 -04:00
Tom Rothamel f907fe119a Changes to audio filters take place immediately after reload.
Fixes #5802.
2024-09-29 02:01:52 -04:00
Tom Rothamel 14ced3377a Fix an issue that could stop audio rollback from working.
The failure would take place in the case where a channel is changed
between roll-forward and and an interaction, but the sound playing
would not change (ie. a queue operation).
2024-09-29 01:47:28 -04:00
Tom Rothamel ad690d8a16 audiofilter: Make the time the filter changes well defined. 2024-09-28 23:47:12 -04:00
Tom Rothamel 1c830a0be1 Audited #5797 2024-09-27 18:21:28 -04:00
Tom Rothamel ee89717b47 linvol: Remove compatibility.
This was compat code that has served it's purpose - players can still
adjust the volumes as required.

Fixes #5806.
2024-09-26 01:09:13 -04:00
Tom Rothamel 6cfef151da Write <package>.update.json in a temporary directory, only copy if needed.
Fixes #5798.
2024-09-25 20:18:42 -04:00
Tom Rothamel 8d2a6d2596 Allow textshaders to work with glyphs at negative offsets.
Fixes #5787.
2024-09-19 00:20:57 -04:00
Tom Rothamel f225453ff1 Only store transform events on Displayables that use or produce them.
This prevents an issue from occurring when a non-duplicatable
displayable is the child of multiple other displayables, which
could set transform_event multiple times.

As it doesn't respond to the event, and doesn't produce it, there's
no reason for the event to be stored. So we don't.

Fixes #5788
2024-09-18 22:27:12 -04:00
Tom Rothamel 209eb580cf web: Prevent access to files and directories starting with "." 2024-09-17 21:24:01 -04:00
Tom Rothamel 3103cff7f7 Restore RENPY_NO_STEAM support. 2024-09-17 20:34:10 -04:00
brimbel 138884b545 Fix example of shader text tag
jitter text shader does not have a speed uniform
2024-09-17 00:46:19 -04:00
Tom Rothamel 1489a4e748 text: Add pseudo-glyphs to the start and end of outlined lines.
These are shown to ensure that all of the outlines are shown, even
if there is no character in that space.

Fixes #5778.
2024-09-16 01:48:00 -04:00
Tom Rothamel 1a7fb9c008 text: Ensure that there is no space between textshader glyphs. 2024-09-15 21:50:26 -04:00
Tom Rothamel 6506a3a45e Fix an issue with with sdist, versions, and pygame_sdl2. 2024-09-14 13:15:06 -04:00
levicratic 3913ca9c0c Fix size tag preventing outer tags from closing 2024-09-11 21:36:45 -04:00
Tom Rothamel 4e03602bd6 Bump versions. 2024-09-10 00:43:15 -04:00
Tom Rothamel a2e08864c4 doc: Changelog. 2024-09-09 01:09:54 -04:00
Tom Rothamel 14563943ed Do not include keys in build. 2024-09-09 00:48:57 -04:00
Tom Rothamel 5e91783620 Bump fix version. 2024-09-08 00:04:52 -04:00
Tom Rothamel cde01cf27b Do not allow image keywords to occur in image simple expressions. 2024-09-06 22:12:11 -04:00
the66F95 6d0b674c30 Update render.pyx
still debug output present.
2024-09-05 13:20:30 -04:00
Tom Rothamel e42c774cd4 doc: Fix changelog. 2024-09-05 09:03:21 -04:00
Tom Rothamel b46eabc2af Update changelog. 2024-09-04 21:43:43 -04:00
Tom Rothamel 2c6e08247f Fix invoking local shaders in shader tags.
Fixes #5765.
2024-09-04 00:45:50 -04:00
Tom Rothamel 32ab62f5dd Improve the audio init error message.
Per #5763.
2024-09-03 23:38:19 -04:00
Tom Rothamel 003ac717d8 Improve AudioData.
* Allow it to take <...> properties.
* Document that it works with video as well.
2024-09-03 23:23:33 -04:00
Tom Rothamel e4089d2dce text: Adjust large textshader text for texture borders. 2024-09-03 22:16:18 -04:00
Tom Rothamel 4076bc8ae9 gl2: Store the borders that were used to create a texture mesh. 2024-09-03 22:16:07 -04:00
Tom Rothamel 13831d4c39 text: Fixes > 4k textshaders. 2024-09-03 00:45:03 -04:00
Tom Rothamel 33552beb80 text: Close-to-working support for text textures above 4k. 2024-09-02 23:37:18 -04:00
Tom Rothamel 0da702db49 Add a function to offset textures in a mesh. 2024-09-02 22:10:51 -04:00
Tom Rothamel 9d8329c766 Add renpy.stop_skipping.
Fixes #5743.
2024-09-02 19:38:13 -04:00
Tom Rothamel efc671e647 Add Gallery.image(movie=True).
This fixes #5758 by providing a way to keep the movie from
playing through the transition.
2024-09-02 19:09:05 -04:00
Tom Rothamel b2456f5a16 Properly combine transform-uniforms with model-uniforms.
Per #5759
2024-09-01 21:00:13 -04:00
Tom Rothamel 2ad7cebd7a Improvements to allow large amounts of text and meshes.
Fixes #5760.
2024-09-01 15:57:32 -04:00
Andy_kl 72a6d5d347 Make config.interface_layer an early config.variable.
Without it, developer need to set it with `-501` priority to be
lower than `Screen.define`
2024-09-01 04:37:47 +04:00
Tom Rothamel c34b2da03b Add multiple to the character callback.
Fixes #5750.
2024-08-31 00:12:41 -04:00
Tom Rothamel bd943f16a1 Remove debug raise. 2024-08-30 09:31:52 -04:00
Tom Rothamel 26046d3b15 Only consider input events for default focus.
Fixes #5753.
2024-08-30 00:32:45 -04:00
Tom Rothamel 9ebe782866 Fix subsurfacing of displayables with negative offset and clipping.
Fixes #5752.
2024-08-30 00:19:15 -04:00
Tom Rothamel 327f6a32d5 Route all url-opening through renpy.open_url.
And on PC, shut down fullscreen when opening a web browser.

Fixes #5747.
2024-08-29 09:34:30 -04:00
Tom Rothamel a78af4ad86 Remove the Beta flag on the web port. 2024-08-29 00:11:09 -04:00
Tom Rothamel 495d980277 Check in the changes vscode settings. 2024-08-28 20:51:48 -04:00
Tom Rothamel 07ab2c9e52 lint: Do not check non-files as files. 2024-08-28 20:38:12 -04:00
Tom Rothamel c48e102658 Document config.font_transforms.
Fixes #5746.
2024-08-28 19:17:30 -04:00
Tom Rothamel 53f2d81f88 Remove debugging raise. 2024-08-28 00:54:14 -04:00
Tom Rothamel 14ed5f4f76 Make TransformState.get work with all properties.
Not just simple ones.

Fixes #5669.
2024-08-28 00:41:23 -04:00
Tom Rothamel a53b06834d Allow negative offsets to be subsurfaced.
This stores the area of the crop box, and lets a displayable go
outside its parents so long as it goes outside the crop box.

(Not 100% sure why this is working without changes when the
displayable is out to the right, but so far so good.)
2024-08-28 00:04:08 -04:00
Tom Rothamel e5d8581a7e render: Fix names compute_subline. 2024-08-27 21:35:02 -04:00
Mark 325a349092 doc: Fix example in dialogue.rst (#5736) 2024-08-27 16:53:23 -04:00
veydzh3r bb0a201e2a Update ukrainian (#5741)
* Update common.rpy

* Update developer.rpy

* Update gui.rpy

* Update launcher.rpy

* Update options.rpy

* Update screens.rpy

* Update script.rpym
2024-08-27 16:53:15 -04:00
Tom Rothamel ba48755589 Use the correct when rendering a TextMeshDisplayable.
Fixes #5737.
2024-08-26 20:57:18 -04:00
Tom Rothamel d6cf8b37ab Ensure the show_done callback is always called.
And re-document it.
2024-08-26 17:54:39 -04:00
Kassy 0e0ae03baa [Web] Only call syncfs once from MultiLocation functions (#5733)
* Do not call syncfs() twice in save_persistent()

With Ren'Py default config, MultiLocation.save_persistent() will call
save_persistent() on 2 different instances of FileLocation. They both
call synfc(), so the warning message "2 FS.syncfs operations in flight
at once, probably just doing extra work" shows up. This commit prevents
that.

* Create and use a context for syncfs pause

* Only call syncfs once from MultiLocation functions

This should handle all the functions of MultiLocation that call
functions of FileLocation that call syncfs().
2024-08-25 23:18:31 -04:00
Tom Rothamel 5d59d32634 Skip action cancels skipping when skipping.
Fixes #5731.
2024-08-25 09:13:28 -04:00
Tom Rothamel 06366a8f8f web: Save persistent data during idle frames. 2024-08-25 08:59:55 -04:00
Tom Rothamel be8f94443f py2: Fixes to add.py. 2024-08-24 23:56:11 -04:00
Tom Rothamel 61e1e025ce Make add.py understand multiple directories. 2024-08-24 23:50:59 -04:00
Tom Rothamel 3837df39be Update sponsor doc. 2024-08-24 23:24:46 -04:00
Tom Rothamel 850fc555e2 Bump fix versions. 2024-08-24 22:29:50 -04:00
Tom Rothamel dacbf5515e Synchro start only defaults to true on looping channels.
This is an attempt to prevent synchro start from delaying sound
effects while music is fading out.

Fixes #5730.
2024-08-24 21:53:07 -04:00
Tom Rothamel 147e46dbee Make game.zip configurable. 2024-08-24 21:29:39 -04:00
Tom Rothamel 1ce2f2b2ce doc: Back out. 2024-08-24 21:20:12 -04:00
Tom Rothamel 4242ff838e Revert "web: Rename game.zip to game.data."
This reverts commit f39d53cbac.
2024-08-24 21:19:25 -04:00
Tom Rothamel 4133172fab doc: Syncfs change. 2024-08-24 21:01:51 -04:00
Tom Rothamel f69768bad9 doc: Change from game.zip -> game.data. 2024-08-24 20:59:54 -04:00
Tom Rothamel f39d53cbac web: Rename game.zip to game.data.
This allows games to be hosted on web hosts that don't support
.zip files.

https://lemmasoft.renai.us/forums/viewtopic.php?t=68768
2024-08-24 20:55:50 -04:00
Tom Rothamel c275244741 Similar fix for quicksaves. 2024-08-24 02:22:03 -04:00
Tom Rothamel 3b1161c2a4 Allow syncfs to be deferred.
And defer it during autosaves, to prevent warning messages.

Fixes #5725. Closes #5728.
2024-08-24 02:17:16 -04:00
Tom Rothamel 5573b3c2dc Re-document renpy.clear_keymap_cache.
It never was undocumented, but the docs weren't being
generated properly.
2024-08-23 23:44:26 -04:00
Abdul d6ca5e6992 Fix typos in changelog.rst 2024-08-23 21:53:04 -04:00
Tom Rothamel 952e29e737 Merge branch 'future' 2024-08-23 00:40:07 -04:00
Tom Rothamel 276e4b1808 doc: Credits. 2024-08-21 21:35:27 -04:00
Tom Rothamel 4f4dcc1927 Add u_text_max_depth.
This provides a way to find the bottom layer.
2024-08-21 20:57:19 -04:00
Tom Rothamel 0fecd1f70a Add a_text_descent.
To mirror a_text_ascent and provide full metrics for a font.
2024-08-21 20:04:24 -04:00
Tom Rothamel 46c80bfae6 Merge pull request #5724 from Veydzher/master
Update Ukrainian translation
2024-08-21 18:21:39 -04:00
Denys 5d5954b150 Update TRANSLATORS.rst 2024-08-21 21:38:12 +01:00
Denys 7e1643b734 Update screens.rpy
Added new translations.
2024-08-21 21:29:24 +01:00
Denys bf9d78ce17 Update launcher.rpy 2024-08-21 21:27:20 +01:00
Denys b07b4db4cc Update gui.rpy
Added new translations.
2024-08-21 21:26:40 +01:00
Denys d104db85a0 Update developer.rpy 2024-08-21 21:25:09 +01:00
Denys fcadb205db Update developer.rpy
Added new translations.
2024-08-21 21:24:52 +01:00
Denys 961277a751 Update common.rpy
Added new translations.
2024-08-21 21:24:20 +01:00
Denys c4e6cb8a06 Update launcher.rpy 2024-08-21 20:23:22 +01:00
Denys 83e05fca2e Update launcher.rpy 2024-08-21 20:18:55 +01:00
Denys b2b80bbfc3 Update error.rpy 2024-08-21 19:23:54 +01:00
Tom Rothamel 52fba62616 Bump versions. 2024-08-21 01:40:12 -04:00
367 changed files with 3328 additions and 1833 deletions
+6
View File
@@ -186,6 +186,12 @@
"foreground": "#ffffff"
}
},
{
"scope": "renpy.meta.color.#f00",
"settings": {
"foreground": "#f00"
}
},
{
"scope": "text.notes.info",
"settings": {
+9 -1
View File
@@ -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>
+7 -2
View File
@@ -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")
+1 -1
View File
@@ -252,7 +252,7 @@ def main():
"-q",
"egg_info",
"--tag-build",
"+renpy" + args.version,
"+renpy" + args.version.replace("+", "-"),
"sdist",
"-d",
os.path.abspath(destination)
+1 -1
View File
@@ -328,7 +328,7 @@ define gui.vbar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.
define gui.vscrollbar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
define gui.vslider_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
## What to do with unscrollable scrollbars in the gui. "hide" hides them, while
## What to do with unscrollable scrollbars in the game menu. "hide" hides them, while
## None shows them.
define gui.unscrollable = "hide"
-1
View File
@@ -96,7 +96,6 @@ style frame:
## https://www.renpy.org/doc/html/screen_special.html#say
screen say(who, what):
style_prefix "say"
window:
id "window"
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+11 -6
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -1100,12 +1100,14 @@ fix_dlc("renios", "renios")
prefix = py("lib/py{major}-")
if os.path.exists(linux_i686):
i686fn = os.path.join(config.renpy_base, prefix + "linux-i686/renpy")
if os.path.exists(i686fn):
self.add_file(
linux_i686,
prefix + "linux-i686/" + self.executable_name,
os.path.join(config.renpy_base, prefix + "linux-i686/renpy"),
i686fn,
True)
self.add_file(
@@ -1531,7 +1533,8 @@ fix_dlc("renios", "renios")
update = { variant : { "version" : self.update_versions[variant], "base_name" : self.base_name, "files" : update_files, "directories" : update_directories, "xbit" : update_xbit } }
update_fn = os.path.join(self.destination, filename + ".update.json")
update_fn = self.temp_filename(filename + ".update.json")
if self.include_update and not format.startswith("app-"):
@@ -1565,9 +1568,11 @@ fix_dlc("renios", "renios")
in this thread or a background thread.
"""
if self.include_update and not self.build_update and not dlc:
final_update_fn = os.path.join(self.destination, filename + ".update.json")
if self.build_update or dlc:
if os.path.exists(update_fn):
os.unlink(update_fn)
shutil.copy(update_fn, final_update_fn)
if not directory:
file_hash = hash_file(path)
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -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")
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -172,7 +172,7 @@ class CodeGenerator(object):
for l in self.lines:
m = re.match('^(\s*)define (.*?) =', l)
m = re.match(r'^(\s*)define (.*?) =', l)
if m:
indent = m.group(1)
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+7 -3
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -169,7 +169,7 @@ def _check_hash(filename, hashj):
download_file = ""
download_url = ""
def download(url, filename, hash=None):
def download(url, filename, hash=None, headers=None, requests_kwargs={}):
"""
Downloads `url` to `filename`, a tempfile.
"""
@@ -188,9 +188,13 @@ def download(url, filename, hash=None):
progress_time = time.time()
all_headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36 renpy/8'}
if headers:
all_headers.update(headers)
try:
response = requests.get(url, stream=True, proxies=renpy.exports.proxies, timeout=15)
response = requests.get(url, stream=True, proxies=renpy.exports.proxies, timeout=15, headers=all_headers, **requests_kwargs)
response.raise_for_status()
total_size = int(response.headers.get('content-length', 1))
+11 -4
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -33,6 +33,10 @@ init python in interface:
DOC_URL = "http://www.renpy.org/doc/html/"
DOC_LOCAL_URL = "file:///" + DOC_PATH
# If true, the launcher should not link back to renpy.org.
NO_LAUNCHER_LINKS = os.path.exists(os.path.join(config.renpy_base, "no_launcher_links.txt"))
local_doc_exists = os.path.exists(DOC_PATH)
def get_doc_url(page):
@@ -40,7 +44,7 @@ init python in interface:
Returns the URL to the documentation page.
"""
if local_doc_exists and not persistent.use_web_doc:
if local_doc_exists and (NO_LAUNCHER_LINKS or not persistent.use_web_doc):
from urllib.parse import urljoin
from urllib.request import pathname2url
@@ -117,7 +121,10 @@ screen bottom_info:
hbox:
spacing INDENT
textbutton _("Documentation") style "l_link" action interface.OpenDocumentation()
textbutton _("Ren'Py Website") style "l_link" action OpenURL(interface.RENPY_URL)
if not interface.NO_LAUNCHER_LINKS:
textbutton _("Ren'Py Website") style "l_link" action OpenURL(interface.RENPY_URL)
textbutton _("[interface.version]") style "l_link" action Jump("about")
hbox:
@@ -133,7 +140,7 @@ screen bottom_info:
textbutton _("preferences") style "l_link" action Jump("preferences")
textbutton _("quit") style "l_link" action Quit(confirm=False)
if persistent.sponsor_message:
if persistent.sponsor_message and not interface.NO_LAUNCHER_LINKS:
textbutton _("Ren'Py Sponsor Information"):
style "l_link"
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -50,7 +50,7 @@ init python:
pass
with interface.error_handling(_("Downloading the itch.io butler.")):
url = "https://broth.itch.ovh/butler/{}/LATEST/archive/default".format(platform)
url = "https://broth.itch.zone/butler/{}/LATEST/archive/default".format(platform)
response = requests.get(url, headers={'User-Agent' : "Renpy"}, proxies=renpy.proxies)
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+9 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -301,6 +301,8 @@ init python:
build.classify_renpy("**.new", None)
build.classify_renpy("**.bak", None)
build.classify_renpy("**.keystore", None)
build.classify_renpy("**/log.txt", None)
build.classify_renpy("**/traceback.txt", None)
build.classify_renpy("**/errors.txt", None)
@@ -408,9 +410,15 @@ init python:
build.classify_renpy("module/libhydrogen/**", "source")
# all-platforms binary.
build.classify_renpy("lib/**/libpython{}.{}.dll".format(sys.version_info.major, sys.version_info.minor), "binary")
build.classify_renpy("lib/**/libpython*.dll", None)
build.classify_renpy("lib/**/*steam_api*", "steam")
build.classify_renpy("lib/**/*Live2D*", None)
libpython = "lib/python{}.{}".format(sys.version_info.major, sys.version_info.minor)
if PY2:
build.classify_renpy("lib/py2-linux-armv7l/**", "linux_arm")
build.classify_renpy("lib/py2-linux-aarch64/**", "linux_arm")
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
translate german strings:
# screens.rpy:9
+1 -1
View File
@@ -53,7 +53,7 @@
# game/editor.rpy:327
old "An exception occured while launching the text editor:\n[exception!q]"
new "Ocorreu uma exceção ao executar o editor de texto:\[exception!q]"
new "Ocorreu uma exceção ao executar o editor de texto:\n[exception!q]"
# game/editor.rpy:423
old "Select Editor"
+1 -1
View File
@@ -1874,7 +1874,7 @@
# game/androidstrings.rpy:43
old "I was unable to use javac to compile a test file. If you haven't installed the Java Development Kit yet, please download it from:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nThe JDK is different from the JRE, so it's possible you have Java without having the JDK. Please make sure you installed the 'JavaSoft (Oracle) registry keys'.\n\nWithout a working JDK, I can't continue."
new "Не удалось использовать javac для компиляции тестового файла. Если вы еще не установили Java Development Kit, загрузите его с:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\JDK отличается от JRE, поэтому возможно, что у вас есть Java без JDK. Пожалуйста, убедитесь, что вы установили 'переменные окружения JavaSoft (Oracle)'.\n\nБез работающего JDK я не могу продолжать."
new "Не удалось использовать javac для компиляции тестового файла. Если вы еще не установили Java Development Kit, загрузите его с:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nJDK отличается от JRE, поэтому возможно, что у вас есть Java без JDK. Пожалуйста, убедитесь, что вы установили 'переменные окружения JavaSoft (Oracle)'.\n\nБез работающего JDK я не могу продолжать."
# game/androidstrings.rpy:64
old "I've opened the directory containing android.keystore and bundle.keystore. Please back them up, and keep them in a safe place."
+1 -1
View File
@@ -884,7 +884,7 @@ translate spanish strings:
# renpy/common/00sync.rpy:593
old "You can use this ID to download your save on another device.\nThis sync will expire in an hour.\nRen'Py Sync is supported by {a=https://www.renpy.org/sponsors.html}Ren'Py's Sponsors{/a}."
new "Puede usar esta ID para descargar su guardado en otro dispositivo.\nEsta sincronización caducará en una hora.\RenPy Sync está para {a=https://www.renpy.org/sponsors.html}los patrocinadores de Ren'Py{/a}."
new "Puede usar esta ID para descargar su guardado en otro dispositivo.\nEsta sincronización caducará en una hora.\nRenPy Sync está para {a=https://www.renpy.org/sponsors.html}los patrocinadores de Ren'Py{/a}."
# renpy/common/00sync.rpy:619
old "Sync Error"
+169 -58
View File
@@ -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]"
+53 -4
View File
@@ -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"
+19 -19
View File
@@ -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."
+49 -48
View File
@@ -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
+2 -4
View File
@@ -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 у розділі «Монетизація» > «Налаштування монетизації» > «Ліцензування»."
+63 -60
View File
@@ -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"
+9 -9
View File
@@ -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 "Додавши сюжет, зображення та музику, ви зможете оприлюднити її світові!"
# На цьому гра закінчується.
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+12 -1
View File
@@ -17,6 +17,8 @@ root = ""
import renpy
class BannedException(Exception):
pass
class WebHandler(http.server.BaseHTTPRequestHandler):
@@ -59,7 +61,13 @@ class WebHandler(http.server.BaseHTTPRequestHandler):
None, in which case the caller has nothing further to do.
"""
path = self.translate_path(self.path)
try:
path = self.translate_path(self.path)
except BannedException:
self.send_error(403, "File not found")
return None
f = None
if os.path.isdir(path):
parts = urllib.parse.urlsplit(self.path)
@@ -192,6 +200,9 @@ class WebHandler(http.server.BaseHTTPRequestHandler):
path = root
for word in words:
if word.startswith("."):
raise BannedException("Invalid path.")
if os.path.dirname(word) or word in (os.curdir, os.pardir):
# Ignore components that are not a simple file/directory name
continue
+1 -1
View File
@@ -1,5 +1,5 @@
# -*- python -*-
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+4 -17
View File
@@ -8,25 +8,12 @@ cdef extern from "stdlib.h":
cdef extern from "pyfreetype.h":
#ftconfig.h
#Some tweaking may be needed on a platform-by-platform basis
DEF FT_SIZEOF_INT = 4
DEF FT_SIZEOF_LONG = 4
ctypedef signed short FT_Int16
ctypedef unsigned short FT_UInt16
IF FT_SIZEOF_INT == 4:
ctypedef signed int FT_Int32
ctypedef unsigned int FT_UInt32
ELIF FT_SIZEOF_LONG == 4:
ctypedef signed long FT_Int32
ctypedef unsigned long FT_UInt32
IF FT_SIZEOF_INT >= 4:
ctypedef int FT_Fast
ctypedef unsigned int FT_UFast
ELIF FT_SIZEOF_LONG >= 4:
ctypedef long FT_Fast
ctypedef unsigned long FT_UFast
ctypedef signed int FT_Int32
ctypedef unsigned int FT_UInt32
ctypedef int FT_Fast
ctypedef unsigned int FT_UFast
# Moved up.
cdef struct FT_ModuleRec_
+8 -5
View File
@@ -1202,7 +1202,7 @@ void RPS_set_secondary_volume(int channel, float vol2, float delay) {
/**
* Replaces audio filters with the given PyObject.
*/
void RPS_replace_audio_filter(int channel, PyObject *new_filter) {
void RPS_replace_audio_filter(int channel, PyObject *new_filter, int primary) {
struct Channel *c;
@@ -1214,10 +1214,13 @@ void RPS_replace_audio_filter(int channel, PyObject *new_filter) {
LOCK_AUDIO();
if (c->playing_audio_filter) {
Py_DECREF(c->playing_audio_filter);
Py_INCREF(new_filter);
c->playing_audio_filter = new_filter;
if (primary) {
if (c->playing_audio_filter) {
Py_DECREF(c->playing_audio_filter);
Py_INCREF(new_filter);
c->playing_audio_filter = new_filter;
}
}
if (c->queued_audio_filter) {
+1 -1
View File
@@ -43,7 +43,7 @@ void RPS_set_volume(int channel, float volume);
float RPS_get_volume(int channel);
void RPS_set_pan(int channel, float pan, float delay);
void RPS_set_secondary_volume(int channel, float vol2, float delay);
void RPS_replace_audio_filter(int channel, PyObject *audio_filter);
void RPS_replace_audio_filter(int channel, PyObject *audio_filter, int primary);
int RPS_video_ready(int channel);
PyObject *RPS_read_video(int channel);
+1 -1
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
View File
+1 -1
View File
@@ -3,7 +3,7 @@
# This file is part of Ren'Py. The license below applies to Ren'Py only.
# Games and other projects that use Ren'Py may use a different license.
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+8 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -43,11 +43,17 @@ from renpy.parameter import Parameter, Signature, ParameterInfo, ArgumentInfo, \
apply_arguments, EMPTY_PARAMETERS, EMPTY_ARGUMENTS
# The name of the current statement.
current_statement_name = "init"
def statement_name(name):
"""
Reports the name of this statement to systems like window auto.
"""
global current_statement_name
current_statement_name = name
for i in renpy.config.statement_callbacks:
i(name)
@@ -2162,6 +2168,7 @@ EARLY_CONFIG = {
"check_translate_none",
"defer_tl_scripts",
"munge_in_strings",
"interface_layer",
}
define_statements = [ ]
+12 -11
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -1146,6 +1146,16 @@ compatible_pairs = [
# values of the variables here.
def check_spline_types(value):
if isinstance(value, (position, int, float)):
return True
if isinstance(value, tuple):
return all(check_spline_types(i) for i in value)
return False
class RawMultipurpose(RawStatement):
warp_function = None
@@ -1208,15 +1218,6 @@ class RawMultipurpose(RawStatement):
compiling(self.loc)
def check_spline_types(value):
if isinstance(value, (position, int, float)):
return True
if isinstance(value, tuple):
return all(check_spline_types(i) for i in value)
return False
# Figure out what kind of statement we have. If there's no
# interpolator, and no properties, than we have either a
# call, or a child statement.
@@ -1333,7 +1334,7 @@ class RawMultipurpose(RawStatement):
except Exception:
continue
if isinstance(i, ATLTransformBase):
if isinstance(i, ATLTransformBase) and (i.child is None):
i.atl.predict(ctx)
return
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+56 -19
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -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::
@@ -225,8 +230,9 @@ class Channel(object):
# The audio filter to use.
audio_filter = None
raw_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 +269,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
@@ -356,9 +365,12 @@ class Channel(object):
ExecutionContext to point to the copy, and returns the copy.
"""
mcd = renpy.game.context().music
context = renpy.game.context()
mcd = dict(context.music)
context.music = mcd
ctx = self.get_context().copy()
mcd[self.name] = ctx
return ctx
@@ -392,8 +404,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 +445,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):
@@ -444,7 +458,11 @@ class Channel(object):
# Update the channel volume.
mixer_volume = renpy.game.preferences.volumes.get(self.mixer, 1.0)
if self.mixer:
mixer_volume = renpy.game.preferences.volumes.get(self.mixer, 1.0)
else:
mixer_volume = 1.0
main_volume = renpy.game.preferences.volumes.get("main", 1.0)
if renpy.game.preferences.self_voicing:
@@ -680,6 +698,7 @@ class Channel(object):
old_raw_audio_filter = self.context.raw_audio_filter
self.context.raw_audio_filter = audio_filter
self.raw_audio_filter = audio_filter
if old_raw_audio_filter is None and audio_filter is None:
new_audio_filter = None
@@ -691,13 +710,19 @@ class Channel(object):
self.context.audio_filter = new_audio_filter
for q in self.queue:
q.audio_filter = new_audio_filter
if replace:
for q in self.queue:
q.audio_filter = new_audio_filter
renpysound.replace_audio_filter(self.number, new_audio_filter, 1)
else:
renpysound.replace_audio_filter(self.number, new_audio_filter, 0)
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 +863,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 +915,26 @@ 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 participate 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 `movie` is False, and False otherwise.
"""
if name == "movie":
movie = True
if synchro_start is None:
if movie:
synchro_start = False
else:
synchro_start = loop
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 +1053,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"
@@ -1233,9 +1270,6 @@ def interact():
c.interact()
# if _music_volumes.get(i, 1.0) != c.chan_volume:
# c.set_volume(_music_volumes.get(i, 1.0))
ctx = c.context
# If we're in the same music change, then do nothing with the
@@ -1246,11 +1280,14 @@ def interact():
filenames = ctx.last_filenames
tight = ctx.last_tight
if ctx.raw_audio_filter != c.raw_audio_filter:
c.set_audio_filter(ctx.raw_audio_filter, True)
if c.loop != filenames:
c.fadeout(max(renpy.config.context_fadeout_music, renpy.config.fadeout_audio))
if filenames:
c.enqueue(filenames, loop=True, synchro_start=True, tight=tight, fadein=renpy.config.context_fadein_music, relative_volume=ctx.last_relative_volume)
c.enqueue(filenames, loop=True, synchro_start=c.default_synchro_start, tight=tight, fadein=renpy.config.context_fadein_music, relative_volume=ctx.last_relative_volume)
c.last_changed = ctx.last_changed
+1 -1
View File
@@ -20,6 +20,6 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ctypedef void (*apply_audio_filter_type)(object, float *, int, int, int)
ctypedef void (*apply_audio_filter_type)(object, float *, int, int, int) noexcept
cdef apply_audio_filter_type *get_apply_audio_filter()
+18 -19
View File
@@ -1,5 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
#
1#
# 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,
@@ -60,7 +59,7 @@ cdef struct SampleBuffer:
# A linked list of sample buffers with 0-16 subchannels.
cdef SampleBuffer *free_buffers[SUBCHANNELS+1]
cdef SampleBuffer *allocate_buffer(int subchannels, int length) nogil:
cdef SampleBuffer *allocate_buffer(int subchannels, int length) noexcept nogil:
"""
Allocates a sample buffer.
"""
@@ -91,7 +90,7 @@ cdef SampleBuffer *allocate_buffer(int subchannels, int length) nogil:
return buf
cdef void free_buffer(SampleBuffer *buf) nogil:
cdef void free_buffer(SampleBuffer *buf) noexcept nogil:
"""
Frees a sample buffer, by putting it back on the free list.
"""
@@ -123,7 +122,7 @@ cdef class AudioFilter:
raise NotImplementedError("prepare")
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
"""
Applies the filter to the given samples.
"""
@@ -157,7 +156,7 @@ cdef class Null(AudioFilter):
def prepare(self, int samplerate):
pass
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
cdef SampleBuffer *result = allocate_buffer(samples.subchannels, samples.length)
memcpy(result.samples, samples.samples, samples.length * samples.subchannels * sizeof(float))
return result
@@ -188,7 +187,7 @@ cdef class FilterList:
def __dealloc__(self):
free(self.filters)
cdef SampleBuffer *apply(self, int index, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, int index, SampleBuffer *samples) noexcept nogil:
return (<AudioFilter> self.filters[index]).apply(samples)
def __iter__(self):
@@ -223,7 +222,7 @@ cdef class Sequence(AudioFilter):
for f in self.filters:
f.prepare(samplerate)
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
cdef SampleBuffer *result
cdef SampleBuffer *old_result = samples
@@ -408,7 +407,7 @@ cdef class Biquad(AudioFilter):
self.cy2 = a2 / a0
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
cdef SampleBuffer *result = allocate_buffer(samples.subchannels, samples.length)
cdef int i, j
@@ -634,7 +633,7 @@ cdef class Crossfade(AudioFilter):
self.duration_samples = int(self.duration * samplerate)
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
cdef SampleBuffer *result1
cdef SampleBuffer *result2
@@ -705,7 +704,7 @@ cdef class Mix(AudioFilter):
for f in self.filters:
f.prepare(samplerate)
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
cdef SampleBuffer *result = NULL
cdef SampleBuffer *temp
@@ -744,7 +743,7 @@ cdef class Multiply(AudioFilter):
def prepare(self, int samplerate):
return
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
cdef SampleBuffer *result
cdef int i, j
@@ -807,7 +806,7 @@ cdef class DelayBuffer:
def __dealloc__(self):
free(self.buffer)
cdef void queue(self, SampleBuffer *samples) nogil:
cdef void queue(self, SampleBuffer *samples) noexcept nogil:
cdef int i, j
@@ -816,7 +815,7 @@ cdef class DelayBuffer:
self.buffer[self.write_index[j]] = samples.samples[i * samples.subchannels + j]
self.write_index[j] = (self.write_index[j] + 1) % self.length
cdef SampleBuffer * dequeue(self, int subchannels, int length) nogil:
cdef SampleBuffer * dequeue(self, int subchannels, int length) noexcept nogil:
cdef SampleBuffer *result = allocate_buffer(subchannels, length)
cdef int i, j
@@ -865,7 +864,7 @@ cdef class Delay(AudioFilter):
if self.buffer is None and self.max_delay >= 0.01:
self.buffer = DelayBuffer(self.delay, samplerate, SUBCHANNELS)
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
cdef SampleBuffer *result
if self.max_delay < 0.01:
@@ -936,7 +935,7 @@ cdef class Comb(AudioFilter):
self.filter.prepare(samplerate)
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
cdef SampleBuffer *delayed
cdef SampleBuffer *result
@@ -1001,7 +1000,7 @@ cdef class WetDry(AudioFilter):
def prepare(self, int samplerate):
self.filter.prepare(samplerate)
cdef SampleBuffer *apply(self, SampleBuffer *samples) nogil:
cdef SampleBuffer *apply(self, SampleBuffer *samples) noexcept nogil:
cdef SampleBuffer *result
cdef SampleBuffer *filtered
@@ -1107,7 +1106,7 @@ def to_audio_filter(o):
raise TypeError("Expected an AudioFilter, got {!r}.".format(o))
cdef void apply_audio_filter(AudioFilter af, float *samples, int subchannels, int length, int samplerate) nogil:
cdef void apply_audio_filter(AudioFilter af, float *samples, int subchannels, int length, int samplerate) noexcept nogil:
"""
:undocumented:
"""
@@ -1140,5 +1139,5 @@ cdef void apply_audio_filter(AudioFilter af, float *samples, int subchannels, in
return
cdef apply_audio_filter_type *get_apply_audio_filter():
cdef apply_audio_filter_type *get_apply_audio_filter() noexcept:
return <apply_audio_filter_type *> apply_audio_filter
+12 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -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.
@@ -660,11 +662,19 @@ def set_audio_filter(channel, audio_filter, replace=False, duration=0.016):
The duration to change from the current to the new filter, in seconds.
This prevents a popping sound when changing filters.
"""
replace = replace or renpy.game.after_rollback
if audio_filter is not None:
audio_filter = renpy.audio.filter.to_audio_filter(audio_filter)
try:
c = renpy.audio.audio.get_channel(channel)
ctx = c.copy_context()
t = get_serial()
ctx.last_changed = t
c.set_audio_filter(audio_filter, replace=replace, duration=duration)
except Exception:
if renpy.config.debug_sound:
+10 -6
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -74,7 +74,7 @@ cdef extern from "renpysound_core.h":
float RPS_get_volume(int channel)
void RPS_set_pan(int channel, float pan, float delay)
void RPS_set_secondary_volume(int channel, float vol2, float delay)
void RPS_replace_audio_filter(int channel, object audio_filter)
void RPS_replace_audio_filter(int channel, object audio_filter, int primary)
void RPS_advance_time()
int RPS_video_ready(int channel)
@@ -95,7 +95,7 @@ cdef extern from "renpysound_core.h":
from renpy.audio.filter cimport get_apply_audio_filter
RPS_apply_audio_filter = <void (*)(object, float *, int, int, int)> get_apply_audio_filter()
RPS_apply_audio_filter = <void (*)(object, float *, int, int, int) noexcept> get_apply_audio_filter()
def check_error():
@@ -343,15 +343,19 @@ def set_secondary_volume(channel, volume, delay):
check_error()
def replace_audio_filter(channel, audio_filter):
def replace_audio_filter(channel, audio_filter, playing):
"""
Replaces the audio filter for `channel` with `audio_filter`.
`playing`
If true, the filter is applied to the currently playing file and queued file. If false,
the filter is only applied to the queued file.
"""
if audio_filter is not None:
audio_filter.prepare(get_sample_rate())
RPS_replace_audio_filter(channel, audio_filter)
RPS_replace_audio_filter(channel, audio_filter, playing)
def deallocate_audio_filter(audio_filter):
@@ -514,7 +518,7 @@ def set_generate_audio_c_function(fn):
import ctypes
fn = ctypes.cast(fn, ctypes.c_void_p).value
RPS_generate_audio_c_function = <void (*)(float *, int)> <uintptr_t> fn
RPS_generate_audio_c_function = <void (*)(float *, int) noexcept> <uintptr_t> fn
# Store the sample surfaces so they stay alive.
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+3 -3
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -352,14 +352,14 @@ def set_secondary_volume(channel, volume, delay):
@proxy_with_channel
def replace_audio_filter(channel, audio_filter):
def replace_audio_filter(channel, audio_filter, primary):
"""
Replaces the audio filter for `channel` with `audio_filter`.
"""
afid = load_audio_filter(audio_filter)
call("replace_audio_filter", channel, afid)
call("replace_audio_filter", channel, afid, primary)
def audio_filter_constructor(f):
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+13 -6
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -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()
@@ -710,7 +714,10 @@ def display_say(
if scry.extend_text is renpy.ast.DoesNotExtend:
break
elif scry.extend_text is not None:
extend_text += scry.extend_text
try:
extend_text += renpy.substitutions.substitute(scry.extend_text, scope=None, force=False, translate=True)[0]
except Exception:
pass
scry = scry.next()
scry_count += 1
@@ -790,7 +797,7 @@ def display_say(
slow = False
pause_callback("show_done")
pause_callback("show_done")
if not slow:
slow_done()
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+5 -4
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -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()
+9 -8
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -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()
+41 -8
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
@@ -69,6 +69,37 @@ init -1500 python:
else:
return false
class _ActionList(Action, DictEquality):
"""
:undocumented:
Encapsulates a list of actions, so that they can be treated as a single action,
for the purposes of SelectedIf and SensitiveIf.
"""
def __init__(self, actions):
self.actions = actions
def get_selected(self):
return renpy.display.behavior.is_selected(self.actions)
def get_sensitive(self):
return renpy.display.behavior.is_sensitive(self.actions)
def get_tooltip(self):
return renpy.display.behavior.get_tooltip(self.actions)
def periodic(self, st):
return renpy.display.behavior.run_periodic(self.actions, st)
def unhovered(self):
return renpy.display.behavior.run_unhovered(self.actions)
def __call__(self):
return renpy.run(self.actions)
@renpy.pure
class SelectedIf(Action, DictEquality):
"""
@@ -89,10 +120,13 @@ init -1500 python:
# Note: This had been documented to take a boolean.
def __init__(self, expression):
if isinstance(expression, (list, tuple)):
expression = _ActionList(expression)
self.expression = expression
if isinstance(expression, Action):
for i in ("get_selected", "get_sensitive", "get_tooltip", "periodic", "unhovered"):
for i in ("get_selected", "get_sensitive", "get_tooltip", "periodic", "unhovered", "alt"):
setattr(self, i, getattr(expression, i, None))
def __call__(self):
@@ -123,10 +157,13 @@ init -1500 python:
# Note: This had been documented to take a boolean.
def __init__(self, expression):
if isinstance(expression, (list, tuple)):
expression = _ActionList(expression)
self.expression = expression
if isinstance(expression, Action):
for i in ("get_selected", "get_sensitive", "get_tooltip", "periodic", "unhovered"):
for i in ("get_selected", "get_sensitive", "get_tooltip", "periodic", "unhovered", "alt"):
setattr(self, i, getattr(expression, i, None))
def __call__(self):
@@ -173,11 +210,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):
"""
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2024 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2025 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

Some files were not shown because too many files have changed in this diff Show More