Compare commits

..

286 Commits

Author SHA1 Message Date
Gouvernathor db1a4367ae Use the docstring instead of a rst entry
no need to edit the doc generation script actually
2023-07-19 15:00:38 +02:00
Gouvernathor fe8dc69cde Tweak doc entry 2023-07-16 18:38:55 +02:00
Gouvernathor 3ebd020841 Document addition
Unless I add deco or decorator as a :doc: option, decorators can't be documented by docstring
2023-07-16 18:24:10 +02:00
Gouvernathor 1bc5e25ed3 Add register_decorator 2023-07-16 18:13:48 +02:00
Tom Rothamel e1aff07997 Merge pull request #4844 from renpy/absolute-compute
Absolute compute
2023-07-15 20:46:59 -04:00
Gouvernathor 02e365584e doc: move last to dedicated doc section 2023-07-15 05:45:24 +02:00
Tom Rothamel ec8104ae6b Add renpy.reset_all_contexts().
This replaces all contexts with a single context that continues at
the next statement, to allow a game to clean up after load and
error.

Fixes #4476.
2023-07-14 23:36:41 -04:00
Ren'Py Bot df114f794e Merge branch 'fix' 2023-07-14 04:30:37 -04:00
Abdul 7a801523e4 Fixed Typo in dialogue.rst
Fixed minor typo in dialogue.rst
2023-07-13 23:08:16 -04:00
Tom Rothamel 3a897f0fee Merge pull request #4837 from AbdulGoodLooks/patch-1
Fixed Typo in dialogue.rst
2023-07-13 23:07:06 -04:00
Tom Rothamel a5343eb0fa Merge pull request #4843 from renpy/absolute-slots
Fix absolute.slots to __slots__
2023-07-13 18:26:58 -04:00
Gouvernathor beceb10166 Use conpute_raw uniformly 2023-07-13 22:13:26 +02:00
Gouvernathor c687c175fe Add absolute.compute and absolute.compute_raw 2023-07-13 19:27:24 +02:00
Gouvernathor 1032b4f990 Fix slots to __slots__
Mistake done in 690f249 and not seen by me in #4680.
I tested a save-load cycle on an instance of absolute before and after this very fix, it passed without problem. But if someone added arbitrary attributes on an absolute instance, that will now fail.
2023-07-13 19:15:06 +02:00
Tom Rothamel e4bed1cbc2 Remove the androidhw and ioshw video playback methods, and config.hw_video.
These haven't been the default for many years and the players haven't
gottem any attention in that time. Removing them will simplify
the surface that needs to be maintained.
2023-07-12 23:37:13 -04:00
Gouvernathor bdcd6191bd Support position (absolute) everywhere (#4709)
This makes most places that support positions support absolute.
2023-07-12 21:30:22 -04:00
Tom Rothamel deadc4a466 Document that angle/anchorangle are clamped now. 2023-07-12 09:20:35 -04:00
Abdul 505303f51a Fixed Typo in dialogue.rst
Fixed minor typo in dialogue.rst
2023-07-12 14:08:22 +01:00
Tom Rothamel 0f84d898f2 Merge branch 'fix' 2023-07-11 23:28:33 -04:00
Tom Rothamel 6041da97c5 atl: Actually animate anchorangle.
A temporary fix until the better one in 8.2 comes in.
2023-07-11 23:10:25 -04:00
Tom Rothamel cb80aea906 transform: Clamp polar coordinates to 0 <= angle < 360.
This ensures that the angle computed by Ren'Py from cartesian
coordinates and the angle stored in last_angle are always in
the same range, rather than having potentially odd interactions.

The main use of a polar coordinate outside of the range would be-
to provide a movement through 0 (for example, moving from 350 to 370
degrees), this is now directly supported.

Fixes #4835.
2023-07-11 23:00:49 -04:00
Ren'Py Bot 850ad647cc Merge branch 'fix' 2023-07-11 04:30:37 -04:00
Tom Rothamel c02ccf8dcd Multiple fixes to choosing a directory.
Fix an issue where the default wasn't being set, and also deal
better with the user cancelling.

Fixes #3826.
2023-07-10 21:16:12 -04:00
Gouvernathor 49896ba938 doc: Disable python highlighting for math formula 2023-07-10 22:15:24 +02:00
Tom Rothamel bdec32fa5b Merge branch 'fix' 2023-07-10 01:31:51 -04:00
Tom Rothamel be36f99d4c Fix last fix. 2023-07-10 01:31:26 -04:00
Tom Rothamel c007c85490 Fix tiled frames.
Fixes a major regression in the last commit (broke the launcher).
2023-07-09 18:27:43 -04:00
Ren'Py Bot b349ab06fd Merge branch 'fix' 2023-07-09 04:30:37 -04:00
Tom Rothamel a33009b382 Ensure frames are at least one drawable pixel in size.
The same logic applies to frames as to the last commit.
2023-07-08 14:44:21 -04:00
Tom Rothamel c50c6bb23d Prevent solids from being shrunken to below one pixel.
Fixes #4824.

The justification here is that if the creator shows a solid, they
want something, not nothing shown, so we want to show at least 1px
in each direction.
2023-07-08 14:24:55 -04:00
Tom Rothamel 60ade3ae19 Enable all stores in android.json, to test the build. 2023-07-08 13:58:54 -04:00
Tom Rothamel 09d119b2d4 Add bubble.properties_callback.
This makes it possible to limit the bubble properties based
on the character that is speaking.
2023-07-05 23:20:36 -04:00
Tom Rothamel 4588c15333 Merge pull request #4823 from qTich/feature/path-to-logdir
add: `path_to_logdir`
2023-07-05 21:50:23 -04:00
Tichq b9c5317556 add: path_to_logdir 2023-07-06 01:53:03 +03:00
Ren'Py Bot e051e1a120 Merge branch 'fix' 2023-07-05 04:30:37 -04:00
Tom Rothamel ef84c65ce5 Merge pull request #4821 from renpy/layim-auto-multiple-tweak
doc: readd information that went missing during the rewrite
2023-07-04 23:32:30 -04:00
Gouvernathor d3fe5cd6bb doc: readd information that went missing during the rewrite 2023-07-05 05:12:15 +02:00
Tom Rothamel 5073076bb5 Merge branch 'fix' 2023-07-04 20:58:04 -04:00
Tom Rothamel c0248b5af0 Avoid deleting .rpyc files corresponding to _ren.py files that exist.
Fixes #4815/
2023-07-04 20:55:01 -04:00
Abdul 0e4fca9c2f Update screens.rst
Fixed minor typo
2023-07-04 20:20:52 -04:00
Tom Rothamel f35e340c16 Merge pull request #4809 from renpy/last_say-tweaks
Tweaks to renpy.last_say
2023-07-04 19:13:42 -04:00
Tom Rothamel b4dc241e08 Merge pull request #4820 from renpy/layeredimage.predict_all
Update layeredimage.predict_all to None
2023-07-04 19:11:58 -04:00
Tom Rothamel d1c1c0f1ff Merge pull request #4818 from AbdulGoodLooks/patch-1
Fixed typo in documentation
2023-07-04 19:11:36 -04:00
Gouvernathor f45b13a101 Update layeredimage.predict_all to None 2023-07-04 18:07:58 +02:00
Abdul 3d26079aff Update screens.rst
Fixed minor typo
2023-07-04 14:53:51 +01:00
Tom Rothamel 4f152e93ab Move Displayable into its own module (renpy.display.displayable).
Mostly to make the file easier to manage as work begins on
clone.
2023-07-03 19:35:11 -04:00
Tom Rothamel 5fd0d17e0b Merge pull request #4813 from renpy/update-operators-list
Update the list of operators in the lexer
2023-07-03 17:56:42 -04:00
Gouvernathor 0dd9c81e8c Update the list of operators 2023-07-03 18:39:51 +02:00
Gouvernathor fcaa02f21a doc: Advise using ATL transitions to customize the punches 2023-07-03 17:09:20 +02:00
Tom Rothamel b3a0c8f47c Fix typo. 2023-07-03 10:30:16 -04:00
Tom Rothamel ca8977ae7c Document the Ren'Py updater doesn't support mac apps.
Fixes #4803.
2023-07-03 10:30:16 -04:00
Gouvernathor 045932fed6 Copy the warning to similar functions 2023-07-03 04:16:49 +02:00
Gouvernathor 4c1570fdae Tweak renpy.last_say and its doc
The character is evaluated at each query, so that if the LastSay object is saved, it will point to an up-to-date Character object
2023-07-03 04:16:31 +02:00
Tom Rothamel c7c499c6c8 Merge pull request #4745 from mal/multipart-translations
Detect multipart strings marked for translation
2023-07-02 21:47:04 -04:00
Mal Graty 7459dea76c Detect multipart strings marked for translation 2023-07-03 02:35:45 +01:00
Tom Rothamel 0f30d74045 Merge pull request #4808 from mal/fix-pause-roll-forward
Allow control exceptions as pause roll forward
2023-07-02 21:07:43 -04:00
Mal Graty 1c9cff6be3 Allow control exceptions as pause roll forward 2023-07-02 18:22:35 +01:00
Tom Rothamel 2880e63082 doc: Link and changeloy renpy.last_say. 2023-07-02 00:13:58 -04:00
Tom Rothamel 55d16830c9 iap: Add support for reviewing on the Apple App Store. 2023-07-02 00:06:45 -04:00
Tom Rothamel 5422467e02 iap: Add support for requesting a review on Google Play. 2023-07-01 23:18:37 -04:00
Gouvernathor 9189178a5f doc: fix attributes listing 2023-07-02 04:07:03 +02:00
Lezalith 494bb54620 Add renpy.last_say function. (#4749)
This is a function that returns information about the last dialogue line.
2023-07-01 22:03:56 -04:00
Gouvernathor d0e925156b Enable jump/call expression to local labels (#4797)
* Enable jump/call expression to local labels

* Use a separate slot to store the local global label

* Document passing .local_label, and changelog
2023-07-01 21:59:44 -04:00
Moshibit 7a96e8ad82 Spanish translation update (#4805)
* Update launcher.rpy

* Fix Spansih translation.rpy

* Update common.rpy

* Update gui.rpy

* Update launcher.rpy
2023-07-01 10:17:02 -04:00
Tom Rothamel 4d0d262a76 Report deferred errors in load_script.
Fixes #4798.
2023-07-01 01:21:19 -04:00
Tom Rothamel 3dad9048f0 Document the Ren'Py updater doesn't support mac apps.
Fixes #4803.
2023-06-30 22:33:54 -04:00
Tom Rothamel 10ecb3f05b doc: Remove a warning about macOS 10.9.
Which is no longer supported.
2023-06-29 23:30:33 -04:00
Tom Rothamel 648f2835ac doc: Remove a warning about macOS 10.9.
Which is no longer supported.
2023-06-29 23:30:05 -04:00
Tom Rothamel 23adb33f71 Merge pull request #4794 from renpy/doc-screen-properties
Add the screen property directive
2023-06-29 21:27:37 -04:00
Tom Rothamel d62b8b8dfc Merge pull request #4777 from renpy/itch_channels
Convert build.itch_channels to a true dict
2023-06-29 21:09:04 -04:00
Tom Rothamel 5e03d9eb29 Merge pull request #4778 from mal/fix-drag-drop-db0
Prevent rare divide by zero in drag/drop
2023-06-29 21:08:36 -04:00
Gouvernathor eef91dcda8 doc typo
what f976f31 was meant to do
2023-06-30 02:30:21 +02:00
Gouvernathor 29324f6092 Add the screen property directive 2023-06-30 02:08:11 +02:00
Gouvernathor b224df24dc doc: fix bullet point list 2023-06-30 01:50:15 +02:00
Gouvernathor 446a1d74e7 doc: follow-up last 2023-06-30 01:47:56 +02:00
Gouvernathor 5b7bd98219 doc: fix missing ref 2023-06-30 01:45:05 +02:00
Gouvernathor c42b975be3 doc: use the tt reference role and avoid wasting a label 2023-06-30 01:42:18 +02:00
Tom Rothamel 9207334808 Report empty ATL blocks as an error.
Fixes #4792. Deferring to a major release because it's a very
unlikely issue, and may require script changes.
2023-06-28 21:38:44 -04:00
Gouvernathor f976f31e7a doc typo 2023-06-28 23:27:35 +02:00
Gouvernathor 3017331aa9 doc: spacing in an example 2023-06-28 23:14:54 +02:00
Ren'Py Bot 34d4eb57a4 Merge branch 'fix' 2023-06-28 04:30:37 -04:00
Tom Rothamel c7d7cc23b1 doc: Changelog last. 2023-06-27 23:21:38 -04:00
Tom Rothamel a65cecfc18 Enable or disable text input as required.
This prevents the input method from always being active, to consume
and consuming keyboard bindings.

Fixes #4784.
2023-06-27 22:47:51 -04:00
Ren'Py Bot e8323f4cad Merge branch 'fix' 2023-06-27 01:08:00 -04:00
Tom Rothamel 4284d45069 Better error handling when cancelling directory selecton.
Fixes #4779.
2023-06-27 01:07:55 -04:00
Tom Rothamel 9d9085d379 Reset the compile and warp arguments when reloading.
Fixes #4780.
2023-06-26 23:17:55 -04:00
Tom Rothamel cb0cf2bf5e Add the fact that we're reloading to renpy.session. 2023-06-26 23:07:38 -04:00
Tom Rothamel 2c4194e754 rapt: Remove missing JDK options.
Since we no longer search for the JDK on windows until we install
the SDK.
2023-06-26 23:04:26 -04:00
Ren'Py Bot ac2534a87f Merge branch 'fix' 2023-06-26 04:30:37 -04:00
Tom Rothamel 9c442bb694 Merge pull request #4782 from Kassy2048/fix-web-fullscreen
Fix fullscreen Web
2023-06-25 21:47:10 -04:00
Kassy 20d7ecf868 Alias Window mode to non-Fullscreen mode on Web
There is no good way to resize the browser window size and
it's not really desirable to resize it anyway. These
changes should partially fix the issues reported in #4760.
2023-06-26 02:48:42 +02:00
Ren'Py Bot bb4e4da909 Merge branch 'fix' 2023-06-25 04:30:37 -04:00
Gouvernathor b467514c39 add incompat entry 2023-06-25 03:57:13 +02:00
Mal Graty e51642ff3f Prevent rare divide by zero in drag/drop
Encountered in rare rollback scenarios where self.st would correctly
reflect the drag was complete, but the render st was zero, resulting in
self.st and self.target_st being equal resulting in the divide by zero.
2023-06-24 16:27:10 +01:00
Gouvernathor 8556d563c9 Convert build.itch_channels to a true dict, and light compat 2023-06-24 15:20:27 +02:00
Gouvernathor a370643f40 Fix absolute.__rdivmod__
fixes #4772
2023-06-24 13:43:03 +02:00
Gouvernathor e56fbd90f1 fix Camera AST node 2023-06-23 21:56:03 +02:00
Gouvernathor 15ec88c900 Update exception text 2023-06-23 21:44:44 +02:00
Gouvernathor 7eeadcfde1 Typos in incompatible.rst
per previous commit
2023-06-23 13:13:08 +02:00
Gouvernathor 061a8c9194 Typos in changelog.rst
per https://github.com/renpy/renpy/pull/4564#issuecomment-1520347974
I didn't test the right-to-left/bottom-to-top thing
2023-06-23 13:10:31 +02:00
Ren'Py Bot 584b13ff67 Merge branch 'fix' 2023-06-23 04:30:37 -04:00
Tom Rothamel d309f3fb93 Add gui.history_spacing.
This variable allows the creator to customize the space between
history entries.

Fixes #4766.
2023-06-23 01:00:07 -04:00
Tom Rothamel 5505c01d0a Changes to box_reverse.
Per #4765.
2023-06-23 00:41:56 -04:00
Daniel Brookman b423982a28 Correct var in GUI Customization Guide
"gui.choice_text_hover_color" doesn't point to choice_button, so
changing it won't do anything.
2023-06-22 23:28:29 -04:00
Ren'Py Bot 86afb06388 Merge branch 'fix' 2023-06-22 23:27:45 -04:00
Tom Rothamel 0e74637c87 Merge pull request #4767 from dbrookman/doc_choice_button_text_hover
Correct var in GUI Customization Guide
2023-06-22 23:27:32 -04:00
Tom Rothamel 6ca4fc2ae1 Fix image component sorting in the directory.
Make sure each component is a string, but pad out numbers so the
sorting is better (ie, c2 should sort before c12.).

Fixes #4769.
2023-06-22 23:19:54 -04:00
Daniel Brookman 6710dbbde8 Correct var in GUI Customization Guide
"gui.choice_text_hover_color" doesn't point to choice_button, so
changing it won't do anything.
2023-06-22 14:55:41 -04:00
Gouvernathor fb03b82f4c doc: tweaks for timed nw 2023-06-22 13:12:30 +02:00
Tom Rothamel 360277f0fe Document that loadable doesn't search images.
Fixes #4712.
2023-06-22 01:14:39 -04:00
Tom Rothamel 14a09d2cc6 The {nw} text tag takes a number of seconds before the line is dismissed.
Fixes #4763.
2023-06-21 23:07:15 -04:00
Ren'Py Bot 822f1a4da6 Merge branch 'fix' 2023-06-21 04:30:37 -04:00
Tom Rothamel 607c1ac64d A better error message if config.version has a bad character.
Fixes #4758.
2023-06-20 23:52:36 -04:00
Tom Rothamel eb0d4948d0 End an animation immediately if time resets. 2023-06-19 22:21:18 -04:00
Ren'Py Bot bd3d5f9dde Merge branch 'fix' 2023-06-18 23:29:40 -04:00
Tom Rothamel 2c91ada1a6 Restore/improve the handling of mouse events.
* It's now possible to bind a mousedown event to skip, and other
  functions that care about keyup/keydown pairs.

* Mouseup events that are are bound to keyup are ignored.

Fixes #4755.
2023-06-18 22:46:33 -04:00
Tom Rothamel 46b0a05849 Merge pull request #4753 from renpy/tweak-4750
Tweak 1a62894
2023-06-18 14:13:41 -04:00
Gouvernathor 6a663830f8 linkify, tweak phrasings and code 2023-06-18 17:45:03 +02:00
Ren'Py Bot 9a23172671 Merge branch 'fix' 2023-06-18 02:08:44 -04:00
Tom Rothamel 1a62894650 Document the limits to MoveTransition, check for errors. 2023-06-18 02:08:36 -04:00
Tom Rothamel 22b3106504 Merge pull request #4751 from renpy/move-transitions-doc-tweaks
Tweak docstrings for transitions
2023-06-18 00:55:20 -04:00
Gouvernathor 9a1c783895 doc: clarify MultipleTransition API
avoiding rapid unscheduled disassembly of creators' keyboards
2023-06-18 03:14:05 +02:00
Gouvernathor d793750adb doc: tweak docstrings for move transitions
add links, and clarity
2023-06-18 02:33:42 +02:00
Gouvernathor 74b476f8c1 doc: hide Dissolve's alpha parameter
Documented as ignored and kw-only, might as well not exist at all
The other classes in this file had the same done to them, this one was probably forgotten
2023-06-18 01:56:11 +02:00
Gouvernathor 06d6d4b1ef doc: typo 2023-06-17 19:52:33 +02:00
Tom Rothamel 8fe9b7ad89 Add the keep_last_frame parameter to Movie.
This keeps the last frame after the movie ends.

Fixes #4732.
2023-06-17 01:12:37 -04:00
Ren'Py Bot c6456618e4 Merge branch 'fix' 2023-06-16 23:47:53 -04:00
Tom Rothamel 9dc7aa1603 Merge pull request #4722 from Kassy2048/fix_7.6_web
Fix for 7.6 web
2023-06-16 23:31:41 -04:00
Tom Rothamel 98fd979c82 Fix downloads of dlc into the nightly builds. 2023-06-16 23:29:56 -04:00
Tom Rothamel 9723a2b7f8 Merge pull request #4738 from renpy/movie-doc
Tweak the Movie callable documentation
2023-06-16 20:27:16 -04:00
Tom Rothamel 77b1ad7fb1 Merge pull request #4747 from Lezalith/master
Czech Translation of The Question
2023-06-16 20:10:48 -04:00
Lezalith b9bcff650b Czech Language button in Preferences screen. 2023-06-17 02:07:58 +02:00
Lezalith fcc3d2a1b6 The Question czech translation files. 2023-06-17 02:07:29 +02:00
Ren'Py Bot 728f217eb7 Merge branch 'fix' 2023-06-16 04:30:37 -04:00
Tom Rothamel 917ac66cae movie: Ensure the channels exist in any function that can use them.
Fixes #4723.
2023-06-15 22:09:19 -04:00
Mal Graty 30c2a2a269 Avoid cropping widgets during a dissolve (#4717) 2023-06-15 21:17:38 -04:00
Morgan Willcock 79a1890539 Fix changelog entry for 'rpy python' (#4720) 2023-06-15 21:16:48 -04:00
Morgan Willcock ebb9358d87 Fix changelog entry for 'rpy python' (#4720) 2023-06-15 21:15:54 -04:00
Ren'Py Bot 3f5df973bf Merge branch 'fix' 2023-06-15 04:30:37 -04:00
Tom Rothamel e17ef3d265 Merge Ukrainian translation.
By @GVeydzher on twitter.
2023-06-14 22:26:25 -04:00
Ren'Py Bot fb4264f3ee Merge branch 'fix' 2023-06-14 01:38:06 -04:00
Tom Rothamel d72de4ab68 Preserve time when upgrading a save to have a token.
Fixes #4736.
2023-06-14 01:27:45 -04:00
Tom Rothamel a069545bcd retain: Document retained bubbles. 2023-06-13 23:32:08 -04:00
Asriel Senna 79d3951fad doc: reorder parameters to fit their description 2023-06-13 17:30:48 +02:00
Asriel Senna 97fc57d912 Undocument the fps parameter 2023-06-13 17:29:26 +02:00
Tom Rothamel 6ed04f3d5e Merge branch 'fix' 2023-06-13 00:54:35 -04:00
Tom Rothamel 8de1dccf43 Report an error if init is used with a directive, not a statement.
Fixes #4713.
2023-06-12 23:57:24 -04:00
Tom Rothamel 8ec26b7b66 Report parse errors in editor when run from the launcher.
This prevents parse errors from passing hidden when the game
is recompiled during distribution.
2023-06-12 22:35:50 -04:00
Tom Rothamel 1f05d93ea6 bubble, retain: Implement clearing retained bubbles.
This was implemented with a new button in the bubble editor, that
the user can click to clear out all buttons on the screen apart
from the current bubble.
2023-06-12 01:33:40 -04:00
Tom Rothamel c3a2d4745d retain: When retain is in use, each bubble has its own location. 2023-06-11 00:36:05 -04:00
Kassy 6ce1cda92b Fix crash on Web2 because pydoc is not shipped 2023-06-10 23:40:45 +02:00
Kassy 3070a40fce Fix crash on Web2 because WebInput is not implemented 2023-06-10 23:39:58 +02:00
Kassy 0176e42268 Fix crash on Web2 because subprocess.Popen is not implemented 2023-06-10 23:39:34 +02:00
Tom Rothamel afb9729ecf retain: Initial implementation of retained dialogue.
This is intended for used with speech bubbles, but might be useful
in other place. It's a mode where each say statement shows a new
screen, until the screens are cleared by the (to be added)
clear statement.
2023-06-09 20:36:30 -04:00
Tom Rothamel d079dda223 Update piglatin translation. 2023-06-09 00:22:11 -04:00
Tom Rothamel 87b2291f99 Improved translation generation.
* Better filtering of braces, especially nested braces.
* Do not piglatin-ify numbers.
2023-06-09 00:22:11 -04:00
Tom Rothamel 6e7d650f51 doc: Match the fix branch. 2023-06-08 22:09:30 -04:00
Gouvernathor c2c094fbf6 Fix bad automatic comment translation
old ["']##[^\n]+?["']\n\s*(?:# Automatic translation\.\n\s*)?new ["']#?[^#]
updated gift for posterity (see d037830)
2023-06-08 20:56:59 +02:00
Gouvernathor 22cf8d3166 doc: tweaks 2023-06-08 17:28:15 +02:00
Tom Rothamel bb0b7f807f Bump version. 2023-06-08 01:50:27 -04:00
Tom Rothamel 08667dedf1 Re-generate the vc version in add.py.
So the correct version is used for releases.
2023-06-07 22:03:59 -04:00
Tom Rothamel cd5a9b2830 doc: Credits. 2023-06-07 20:57:56 -04:00
Tom Rothamel 4579dbab15 Clean up the fix-branch changelog. 2023-06-07 20:43:11 -04:00
Tom Rothamel 10a9521a19 docgen: Set the search z-index to 1. 2023-06-07 20:38:19 -04:00
Gouvernathor bcc0d211e1 Extend the system cursor preference to config.mouse_displayable (#4706)
* Make the system_cursor preference disable mouse_displayable

* doc: new "system_cursor" behavior

* changelog system_cursor
2023-06-07 20:37:48 -04:00
Tom Rothamel a33f891d65 docgen: Set the search z-index to 1. 2023-06-07 19:55:48 -04:00
Gouvernathor 9b1f23fe4d Extend the system cursor preference to config.mouse_displayable (#4706)
* Make the system_cursor preference disable mouse_displayable

* doc: new "system_cursor" behavior

* changelog system_cursor
2023-06-07 19:55:32 -04:00
Ren'Py Bot bb6ca17bc3 Merge branch 'fix' 2023-06-07 02:17:36 -04:00
Tom Rothamel 7e8ed2dcf7 doc: Update sponsors. 2023-06-07 02:07:15 -04:00
Tom Rothamel 3893bcbc7a doc: Credits. 2023-06-07 01:16:44 -04:00
Ren'Py Bot f33ab6b095 Merge branch 'fix' 2023-06-07 01:06:44 -04:00
Tom Rothamel b0b096bf16 audio: if_changed handles tight looping.
Subject to how if_changed works, as it does queue up a new
loop.

Fixes #4695.
2023-06-07 01:05:22 -04:00
Gouvernathor 7df26f34ed Fix mouse_move documentation (#4700)
* docstring spaces

* doc: fix inconsistencies about the mouse_move preference
2023-06-06 23:58:49 -04:00
Tom Rothamel 454ba1360d Ensure that scrollable bars have the sensitive style.
Fixes #4690.
2023-06-06 23:57:11 -04:00
Tom Rothamel 5116fdaa47 Check atl state for validity where it might have changed.
Fixes #4701.
2023-06-06 21:45:14 -04:00
Ren'Py Bot 26d4b1af50 Merge branch 'fix' 2023-06-06 04:30:56 -04:00
Tom Rothamel 9d1b8c0e29 atl: Run ATL transforms in the animation timebase.
This fixes #4696 while keeping #4634 and #4167 fixed.
2023-06-06 01:15:50 -04:00
Tom Rothamel e740a83764 doc: Changelog. 2023-06-05 23:25:24 -04:00
Ren'Py Bot 25e2dba5b3 Merge branch 'fix' 2023-06-05 04:30:56 -04:00
Gouvernathor b8c4565a38 Dereference utter_restart and move reload-related functions to the reload section (#4657)
doc: deref utter_restart and move reload-related functions
2023-06-05 00:40:03 -04:00
Tom Rothamel 36a2e32401 web: Fix audio end time.
It takes a duration, not the end time itself.

Fixes #4694.
2023-06-05 00:38:12 -04:00
Tom Rothamel b586355a8e Ensure that objects reachable from Context rollback.
Fixes #4687, and a class of potential related problems, by
auditing things that are reachable through Context.
2023-06-04 18:24:02 -04:00
Ren'Py Bot dd1c162271 Merge branch 'fix' 2023-06-04 04:30:56 -04:00
Tom Rothamel 7171b21fb4 doc: That dropping doesn't respect the alpha channel.
Closes #4686.
2023-06-03 22:11:01 -04:00
Tom Rothamel 30aba15be2 Accept the vscode plugin style changes. 2023-06-03 22:10:25 -04:00
Tom Rothamel 007aa19291 live2d: Determine if _sustain is required after attribute_filter.
As it's possible attribute_filter will introduce a motion that
makes sustain pointless.

Fixes #4660.
2023-06-03 21:36:53 -04:00
Tom Rothamel 7e6560b766 live2d: _choose_attributes should enforce required attributes.
If it can't find all of the required attributes, then it should
not allow the displayable to be shown.

Fixes the first part of #4660.
2023-06-03 20:55:48 -04:00
Tom Rothamel dd2b26807d doc: Changelog e29fdf8cbf. 2023-06-02 23:29:53 -04:00
Ren'Py Bot e6d5b8eef6 Merge branch 'fix' 2023-06-02 23:28:42 -04:00
Tom Rothamel 206431c210 Add links to 8.1.1 and 7.6.1. 2023-06-02 23:22:46 -04:00
Tom Rothamel 61c9ebffa9 Propagate times to ATL transitions, but not other state.
This tries to fix #4634 without breaking #4167, by recognizing
when a transition has started and propagating the adjusted times
into it, but not the state.

This can probably fail, as events and choices won't be propagated,
but those should be rare in transitions, ideally.
2023-06-02 23:01:32 -04:00
Ren'Py Bot f79c052ace Merge branch 'fix' 2023-06-01 22:52:41 -04:00
Tom Rothamel e29fdf8cbf Prevent autoreloading while the git index lock is present.
Fixes #3689.
2023-06-01 22:42:50 -04:00
Moshibit 544cf07739 Fix Spanish tranlation (#4684)
* Update launcher.rpy

* Fix Spansih translation.rpy
2023-06-01 22:26:16 -04:00
Moshibit a88e2a3980 Fix Spanish tranlation (#4684)
* Update launcher.rpy

* Fix Spansih translation.rpy
2023-06-01 22:25:22 -04:00
Ren'Py Bot 1251ce7e36 Merge branch 'fix' 2023-06-01 04:30:56 -04:00
Gouvernathor 360dc4fdbb Make absolute a float again (#4680)
Multiple advantages over the wrapper-class implementation : lighter in memory, don't wrap methods that don't need too, don't spend time converting their parameters, avoid a two-version pickling and unpickling mechanism (with slots), shorter code with less warning silencing.
2023-06-01 00:31:00 -04:00
Tom Rothamel 3396feff33 Rewrite absolute to not inherit from float.
This replaces absolute with a class that contains a float, and
behaves like a float in most circumstances. However, when an
operation is performed on it that would create a float, an
absolute is returned instead.

This is meant to address #4666 and a class of potential issues
that could be similar to it, where absolutes that are operated
on could become a float, and cause layout issues.

I need to think if this is something that should got into the
fix branch, as it's a major change.
2023-06-01 00:31:00 -04:00
Tom Rothamel 7cf287c4f4 docgen: Fix the location of the searchbox.
Fixes #4682.
2023-05-31 23:51:08 -04:00
Tom Rothamel 732b98f7a2 Document that YUV444 is slow.
Per discussion in #4646.
2023-05-31 22:45:17 -04:00
Tom Rothamel 838ce5a82b Fix non-full playback of videos.
Fixes #4646.
2023-05-31 22:41:54 -04:00
Gouvernathor c7083584df Make absolute a float again (#4680)
Multiple advantages over the wrapper-class implementation : lighter in memory, don't wrap methods that don't need too, don't spend time converting their parameters, avoid a two-version pickling and unpickling mechanism (with slots), shorter code with less warning silencing.
2023-05-31 01:31:02 -04:00
Ren'Py Bot b6f1be507b Merge branch 'fix' 2023-05-30 04:30:56 -04:00
Tom Rothamel 690f249481 Rewrite absolute to not inherit from float.
This replaces absolute with a class that contains a float, and
behaves like a float in most circumstances. However, when an
operation is performed on it that would create a float, an
absolute is returned instead.

This is meant to address #4666 and a class of potential issues
that could be similar to it, where absolutes that are operated
on could become a float, and cause layout issues.

I need to think if this is something that should got into the
fix branch, as it's a major change.
2023-05-30 02:01:39 -04:00
midgethetree 13cd7d0ebc fix fonts linting (#4679)
Fixes an issue where fonts located in the fonts/ directory and referenced in .rpy files with just their filename and not the fonts/ prefix would be falsely claimed to be unloadable by the linter despite working just fine in-game. Also fixes the converse issue, where fonts located in images/ directory and referenced without the images/ prefix weren't caught by the linter despite the game crashing when actually attempting to load them.
2023-05-30 00:48:09 -04:00
midgethetree dfc29bb646 fix fonts linting (#4679)
Fixes an issue where fonts located in the fonts/ directory and referenced in .rpy files with just their filename and not the fonts/ prefix would be falsely claimed to be unloadable by the linter despite working just fine in-game. Also fixes the converse issue, where fonts located in images/ directory and referenced without the images/ prefix weren't caught by the linter despite the game crashing when actually attempting to load them.
2023-05-30 00:31:11 -04:00
Tom Rothamel a14b4c3ddc Avoid including the 311 bytecode in the launcher.
As it's not needed there.

Per #4677.
2023-05-29 21:57:16 -04:00
Ren'Py Bot d94c3ef043 Merge branch 'fix' 2023-05-29 12:27:46 -04:00
brainos233 917292b443 fix: launcher\game\tl\schinese\options.rpy (#4676) 2023-05-29 18:16:05 +02:00
Tom Rothamel e02ce6579f docgen: Fix a style issue. 2023-05-29 12:15:15 -04:00
brainos233 d8322a6db7 fix: launcher\game\tl\schinese\options.rpy (#4676) 2023-05-29 18:14:36 +02:00
Tom Rothamel 5201ff3e10 sl2: Better analyze imagemaps.
The issue was that:

    imagemap:
        if cond:
            idle "idle_true"
            hover "hover_true"
        else:
            idle "idle_false"
            hover "hover_false"

        hotspot (0, 0, 100, 100) action Jump("test")

Didn't depend on cond, which meant that the hotspot
would not change when the imagemap was updated.

Test: xagrim-imagemap.
2023-05-29 11:58:23 -04:00
Gouvernathor 64ac9c1a99 BOM and UTF-LF 2023-05-29 12:57:11 +02:00
zedraxlo ff426586b8 SChinese translation update (#4675) 2023-05-29 12:56:53 +02:00
Gouvernathor f3f703b426 BOM and UTF-LF 2023-05-29 12:53:55 +02:00
zedraxlo ac39001a61 SChinese translation update (#4675) 2023-05-29 12:40:58 +02:00
Ren'Py Bot cfd1721d71 Merge branch 'fix' 2023-05-29 04:30:56 -04:00
Tom Rothamel 0cd32aa9a4 (Mostly) revert changes to afm_enable preference handling.
This is a bit special, as it define if afm_enable is used or not.
Since this is baked in to older games, restore the previous values,
but let the default statement override them, which was the goal of
the previous commit.
2023-05-29 02:08:40 -04:00
Ren'Py Bot e33cc4c43c Merge branch 'fix' 2023-05-28 23:07:07 -04:00
Tom Rothamel 9c9c36a723 rapt: Document the key changes. 2023-05-28 23:06:41 -04:00
Morgan Willcock 3762c42604 doc: Fix interpolation example block (#4674)
Corrects the indentation so that the code is valid.

One of the affected lines had a typo ('thje' instead of 'the'), which
is now corrected.
2023-05-28 23:25:59 +02:00
Ren'Py Bot 389e882505 Merge branch 'fix' 2023-05-27 00:38:16 -04:00
Tom Rothamel 75832ccd22 Avoid having preference defaults by default.
The older config.default_.... variables could force a preference
to take on a value, even if the creator used default to set the
preference.

This changres a few of the defaults in preferences.py, and removes
the need for config.default_... variables.

Fixes #4667.
2023-05-26 22:13:45 -04:00
Ren'Py Bot fe2d76bdd3 Merge branch 'fix' 2023-05-25 01:40:53 -04:00
Tom Rothamel 26af404433 Fix typo in nosave list.
Fixes #4664.
2023-05-25 01:40:10 -04:00
Tom Rothamel 8209e61d75 Fix problem with non-resiable windows on macOS.
Apparently, when a window is not resizable on macOS, the MAXIMIZED
flag is always set. Since the window can't actually be maximized,
ignore it.

Fixes #4659.
2023-05-25 00:30:39 -04:00
Tom Rothamel 09ee1cb52f Deal with mac reporting fullscreen windows as maximized.
This can cause a problem when changing modes.

Per #4659.
2023-05-25 00:30:39 -04:00
Ren'Py Bot b152e0b00a Merge branch 'fix' 2023-05-23 13:34:03 -04:00
Gouvernathor 75d0f4dc64 Encode the save directory as bytes on py2 2023-05-23 13:33:57 -04:00
Ren'Py Bot df982c1b4c Merge branch 'fix' 2023-05-23 04:30:46 -04:00
Tom Rothamel bb526f6ae3 doc: Fix doc problem with ui.interact. 2023-05-23 01:51:00 -04:00
Gouvernathor 110e6340e4 doc: remove double variable entry
the second one, which was fixed a week ago (1436e3e), is slightly better phrased
2023-05-22 17:19:43 +02:00
Gouvernathor 166e81b2e5 Revert "doc: move reload-related functions to the dedicated section"
This reverts commit 078ffb9e5a.
2023-05-22 17:02:11 +02:00
Ren'Py Bot a851c97c85 Merge branch 'fix' 2023-05-22 10:51:36 -04:00
Moshibit 217d0e85f8 Update launcher.rpy 2023-05-22 10:51:23 -04:00
Moshibit 09a29a941c Update launcher.rpy 2023-05-22 10:43:06 -04:00
Gouvernathor 078ffb9e5a doc: move reload-related functions to the dedicated section 2023-05-22 16:34:23 +02:00
Ren'Py Bot f9233742a2 Merge branch 'fix' 2023-05-22 01:51:15 -04:00
Tom Rothamel a2adf917aa The window icon is an image.
Fixes #4651.
2023-05-22 01:51:15 -04:00
Gouvernathor 41d0b41518 actual translation 2023-05-22 01:51:15 -04:00
Gouvernathor aded4dd05e french translations 2023-05-22 01:51:15 -04:00
Tom Rothamel 412c56e76b The window icon is an image.
Fixes #4651.
2023-05-22 01:48:41 -04:00
Gouvernathor 15024f32a8 quicken PY3 case 2023-05-21 16:30:29 +02:00
Gouvernathor cdee6e388c actual translation 2023-05-21 16:27:29 +02:00
Gouvernathor 1a820b67a7 french translations 2023-05-21 15:50:29 +02:00
Tom Rothamel 8c21f14bf7 autotl: Better handling of lines beginning with ##. 2023-05-21 01:48:34 -04:00
Tom Rothamel 1660375bde autotl: The description of the nightly fix build. 2023-05-21 01:47:22 -04:00
Tom Rothamel c9ec07f566 Add infrastructure for single-string translations.
This is intended to allow important strings to be automatically
translated while we work on improving the quality of automatic
translations.
2023-05-21 01:47:02 -04:00
Tom Rothamel 19316303b7 Add strings describing the nightly branch. 2023-05-21 00:18:50 -04:00
Tom Rothamel e46d664aed Diagnose issues with a class no longer inheriting from object. 2023-05-20 23:31:49 -04:00
Tom Rothamel ccaf664e3c Allow error handling to deal with exceptions in rollback.
Previously, the exception would occur with the context stack
already altered. As the exception was handled, contexts could
be removed from the stack, leading to a case where there was
no context - which causes crashes.
2023-05-20 22:53:21 -04:00
Tom Rothamel 572ebcc3a8 Make sure Execution.__repr__ always produces a result. 2023-05-20 22:51:35 -04:00
Tom Rothamel 8f5c2526f0 Properly quote replacement text.
Fixes #4631.
2023-05-20 02:32:05 -04:00
Tom Rothamel d93745e2e1 Delete .pyo and .pyc files when reloading a module.
This can fix a problem on Python 2, where a .pyo file would be
loaded in preference to an updated .py file, even if the .py file
was created the first time around.
2023-05-19 23:27:50 -04:00
Tom Rothamel 4f8f3155ef Take the version out of the newly-generation dict. 2023-05-19 00:51:39 -04:00
Tom Rothamel deb4a2c9eb Merge pull request #4645 from brainos233/docs-build-packages
Docs: Fix missing "renpy" list in Packages example
2023-05-18 11:15:51 -04:00
Tom Rothamel 4d26440cbb Remove pyo and pyc files to make sure a reload occurrs. 2023-05-18 04:17:43 -04:00
Brainos cf98746660 Docs: Fix missing "renpy" list in Packages example 2023-05-18 15:47:29 +08:00
Ren'Py Bot 824828f5c8 Merge branch 'fix' 2023-05-17 02:25:34 -04:00
Tom Rothamel 59e427512c fix: Fix text tag issues with the Korean (and maybe Vietnamese) translations.
Fixes #4643.
2023-05-17 01:44:08 -04:00
Tom Rothamel 09c1a84169 Scry fixes.
- Return None of there is no current statement.
- Deal with a scry of None in character.
- Improve documentation.

Fixes #4640.
2023-05-17 01:29:18 -04:00
Tom Rothamel b254c23882 Include libydrogen in the source distribution.
Fixes #4638.
2023-05-17 01:23:01 -04:00
Tom Rothamel da7655642f Include libydrogen in the source distribution.
Fixes #4638.
2023-05-17 01:19:50 -04:00
Tom Rothamel 5c7efe99e6 Merge branch 'fix' 2023-05-17 00:58:53 -04:00
Tom Rothamel 17e743d346 Determine the version if vc_version.py does not exist.
This is likely to only happen if a git checkout exists. In that
case, we determine what branch we're on, and use that to
initialize the version information.
2023-05-17 00:54:34 -04:00
Tom Rothamel 2c898e4581 Merge branch 'fix' 2023-05-17 00:07:05 -04:00
Gouvernathor 1638a89023 Fix incorrect variable name
That was preventing renpy boot when vc_version is not present
Also, differenciate versions not yet named, "tbd", and versions not identified
2023-05-17 04:49:54 +02:00
Gouvernathor 1436e3e4f1 doc: role issues and involuntary comments 2023-05-17 04:10:16 +02:00
Gouvernathor d037830d38 Fix bad automatic comment translations
old ["']##[^\n]+?["']\n\s*(?:# Automatic translation\.\n\s*)?new ["'][^#]
(a gift to posterity)
The machine translate script should remove any prepending "## ", translate the rest, and then prepend it again to the result. Otherwise deepl thinks it's a word.
fixes #4633
2023-05-16 10:36:23 -04:00
Tom Rothamel d8cfb32514 distribute: Changes to support nightly builds.
* The --nightly flag to mark a version as nightly.
* The --print-version flag, to print the computed version.

This will allow distribute to supply version information to the
nightly build process.
2023-05-16 10:36:03 -04:00
Tom Rothamel adddcd6a11 distribute: Changes to support nightly builds.
* The --nightly flag to mark a version as nightly.
* The --print-version flag, to print the computed version.

This will allow distribute to supply version information to the
nightly build process.
2023-05-16 10:15:51 -04:00
Gouvernathor 8c511bcd72 Fix bad automatic comment translations
old ["']##[^\n]+?["']\n\s*(?:# Automatic translation\.\n\s*)?new ["'][^#]
(a gift to posterity)
The machine translate script should remove any prepending "## ", translate the rest, and then prepend it again to the result. Otherwise deepl thinks it's a word.
fixes #4633
2023-05-15 15:46:11 +02:00
Tom Rothamel 06acc1984a Use the runtime python to generate the version information. 2023-05-15 08:52:20 -04:00
Tom Rothamel 14c06dd2e4 Add py2 before py3.
Useful in the github case, to ensure Ren'Py 8 is uploaded last,
and hence is at the top of the list of downloads at github.
2023-05-15 02:40:13 -04:00
Tom Rothamel 516fceb2ab Store the version in vc_version, generate it from the branch. 2023-05-15 02:39:23 -04:00
Tom Rothamel 17b2be083a doc: Update sponsors. 2023-05-13 17:13:31 -04:00
Tom Rothamel 21caff9610 Update keywords. 2023-05-13 17:13:21 -04:00
Tom Rothamel 84db013177 doc: Credits. 2023-05-13 15:20:35 -04:00
Tom Rothamel 479c688851 doc: Polar coordinate changes. 2023-05-13 15:11:59 -04:00
Tom Rothamel 20593ac279 viewport: Allow draggable to become False during drag.
Fixes #4629.
2023-05-13 13:30:59 -04:00
Tom Rothamel 6639c4c162 Merge pull request #4576 from shawna-p/master
Allow None transition for ShowMenu
2023-05-13 13:30:04 -04:00
shawna-p 9c5eb15024 Shorten & clean up code 2023-04-28 14:40:11 -04:00
shawna-p 9e7109af81 Rename to prevent name conflict 2023-04-27 12:14:15 -04:00
shawna-p 3162455e14 Check for transition in call method 2023-04-27 12:11:19 -04:00
shawna-p bb568d4b5f Merge branch 'renpy:master' into master 2023-04-25 15:09:33 -04:00
shawna-p 24d991ae77 Allow the None transition for ShowMenu 2023-04-25 15:08:55 -04:00
191 changed files with 6490 additions and 4341 deletions
+137
View File
@@ -56,4 +56,141 @@
"renpy.warnOnInvalidVariableNames": "Disabled",
"renpy.warnOnInvalidFilenameIssues": "Disabled",
"renpy.warnOnIndentationAndSpacingIssues": "Disabled",
"editor.tokenColorCustomizations": {
"textMateRules": [
{
"scope": "renpy.meta.plain",
"settings": {
"fontStyle": ""
}
},
{
"scope": "renpy.meta.i",
"settings": {
"fontStyle": "italic"
}
},
{
"scope": "renpy.meta.b",
"settings": {
"fontStyle": "bold"
}
},
{
"scope": [
"renpy.meta.u",
"renpy.meta.a"
],
"settings": {
"fontStyle": "underline"
}
},
{
"scope": "renpy.meta.s",
"settings": {
"fontStyle": "strikethrough"
}
},
{
"scope": "renpy.meta.i renpy.meta.b",
"settings": {
"fontStyle": "italic bold"
}
},
{
"scope": "renpy.meta.i renpy.meta.u",
"settings": {
"fontStyle": "italic underline"
}
},
{
"scope": "renpy.meta.i renpy.meta.s",
"settings": {
"fontStyle": "italic strikethrough"
}
},
{
"scope": "renpy.meta.b renpy.meta.u",
"settings": {
"fontStyle": "bold underline"
}
},
{
"scope": "renpy.meta.b renpy.meta.s",
"settings": {
"fontStyle": "bold strikethrough"
}
},
{
"scope": "renpy.meta.u renpy.meta.s",
"settings": {
"fontStyle": "underline strikethrough"
}
},
{
"scope": "renpy.meta.i renpy.meta.b renpy.meta.u",
"settings": {
"fontStyle": "italic bold underline"
}
},
{
"scope": "renpy.meta.i renpy.meta.b renpy.meta.s",
"settings": {
"fontStyle": "italic bold strikethrough"
}
},
{
"scope": "renpy.meta.i renpy.meta.u renpy.meta.s",
"settings": {
"fontStyle": "italic underline strikethrough"
}
},
{
"scope": "renpy.meta.b renpy.meta.u renpy.meta.s",
"settings": {
"fontStyle": "bold underline strikethrough"
}
},
{
"scope": "renpy.meta.i renpy.meta.b renpy.meta.u renpy.meta.s",
"settings": {
"fontStyle": "italic bold underline strikethrough"
}
},
{
"scope": "renpy.meta.color.text",
"settings": {
"foreground": "#ffffff"
}
},
{
"scope": "text.notes.info",
"settings": {
"foreground": "#17a2b8",
"fontStyle": "bold"
}
},
{
"scope": "text.notes.success",
"settings": {
"foreground": "#28a745",
"fontStyle": "bold"
}
},
{
"scope": "text.notes.warning",
"settings": {
"foreground": "#ffc107",
"fontStyle": "bold"
}
},
{
"scope": "text.notes.danger",
"settings": {
"foreground": "#dc3545",
"fontStyle": "bold"
}
}
]
},
}
+5 -3
View File
@@ -15,9 +15,11 @@ SOURCE = [
"/home/tom/ab/renpy-build/renpyweb",
]
version = ".".join(str(i) for i in version_tuple)
short_version = ".".join(str(i) for i in version_tuple[:-1])
major = short_version.split(".")[0]
from renpy.versions import generate_vc_version
version = generate_vc_version()["version"]
short_version = version.rpartition(".")[0]
major = version.partition(".")[0]
print("Version", version)
ap = argparse.ArgumentParser()
+27 -43
View File
@@ -94,6 +94,8 @@ def main():
ap.add_argument("--vc-version-only", action="store_true")
ap.add_argument("--link-directories", action="store_true")
ap.add_argument("--append-version", action="store_true")
ap.add_argument("--nightly", action="store_true")
ap.add_argument("--print-version", action="store_true")
args = ap.parse_args()
@@ -101,71 +103,53 @@ def main():
link_directory("renios")
link_directory("web")
if args.link_directories:
import renpy.versions
renpy.versions.generate_vc_version(nightly=args.nightly)
if args.link_directories or args.vc_version_only:
return
if not os.path.abspath(sys.executable).startswith(ROOT + "/lib"):
raise Exception("Distribute must be run with the python in lib/.")
if args.sign:
os.environ["RENPY_MAC_IDENTITY"] = "Developer ID Application: Tom Rothamel (XHTE5H7Z79)"
if PY2 and not sys.flags.optimize:
raise Exception("Not running with python optimization.")
if not os.path.abspath(sys.executable).startswith(ROOT + "/lib"):
raise Exception("Distribute must be run with the python in lib/.")
# Revision updating is done early, so we can do it even if the rest
# of the program fails.
# Determine the version. We grab the current revision, and if any
# file has changed, bump it by 1.
import renpy
if args.version is None:
args.version = ".".join(str(i) for i in renpy.version_tuple[:-1])
try:
s = subprocess.check_output([ "git", "describe", "--tags", "--dirty", ]).decode("utf-8").strip()
parts = s.strip().split("-")
dirty = "dirty" in parts
vc_version_base = os.path.splitext(renpy.vc_version.__file__)[0]
commits_per_day = collections.defaultdict(int)
# Delete the .pyc and .pyo files, as reload can choose one of them instead
# of the new .py file.
for fn in [ vc_version_base + ".pyc", vc_version_base + ".pyo" ]:
if os.path.exists(fn):
os.unlink(fn)
for i in subprocess.check_output([ "git", "log", "-99", "--pretty=%cd", "--date=format:%Y%m%d" ]).decode("utf-8").split():
commits_per_day[i[2:]] += 1
if dirty:
key = time.strftime("%Y%m%d")[2:]
vc_version = "{}{:02d}".format(key, commits_per_day[key] + 1)
else:
key = max(commits_per_day.keys())
vc_version = "{}{:02d}".format(key, commits_per_day[key])
reload(renpy.vc_version)
except Exception:
vc_version = 0
import renpy.vc_version
with open("renpy/vc_version.py", "w") as f:
import socket
official = socket.gethostname() == "eileen"
nightly = args.version and "nightly" in args.version
# A normal reload is fine, as renpy/__init__.py won't change.
reload(renpy)
f.write("vc_version = {}\n".format(vc_version))
f.write("official = {}\n".format(official))
f.write("nightly = {}\n".format(nightly))
if args.vc_version_only:
if args.print_version:
print(renpy.version_only)
return
try:
reload(sys.modules['renpy.vc_version']) # @UndefinedVariable
except Exception:
import renpy.vc_version # @UnusedImport
reload(sys.modules['renpy'])
if args.version is None:
if args.nightly:
args.version = renpy.version_only
else:
args.version = ".".join(str(i) for i in renpy.version_tuple[:-1])
if args.append_version:
args.version += "-" + renpy.version_only
# Check that the versions match.
full_version = renpy.version_only # @UndefinedVariable
if "-" not in args.version \
and not full_version.startswith(args.version):
raise Exception("The command-line and Ren'Py versions do not match.")
+3
View File
@@ -344,6 +344,9 @@ define config.history_length = 250
## at the cost of performance.
define gui.history_height = gui.scale(140)
## Additional space to add between history screen entries.
define gui.history_spacing = 0
## The position, width, and alignment of the label giving the name of the
## speaking character.
define gui.history_name_xpos = gui.scale(155)
+6 -2
View File
@@ -412,7 +412,7 @@ style main_menu_version:
## This screen is intended to be used with one or more children, which are
## transcluded (placed) inside it.
screen game_menu(title, scroll=None, yinitial=0.0):
screen game_menu(title, scroll=None, yinitial=0.0, spacing=0):
style_prefix "game_menu"
@@ -445,6 +445,8 @@ screen game_menu(title, scroll=None, yinitial=0.0):
side_yfill True
vbox:
spacing spacing
transclude
elif scroll == "vpgrid":
@@ -460,6 +462,8 @@ screen game_menu(title, scroll=None, yinitial=0.0):
side_yfill True
spacing spacing
transclude
else:
@@ -888,7 +892,7 @@ screen history():
## Avoid predicting this screen, as it can be very large.
predict False
use game_menu(_("History"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0):
use game_menu(_("History"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0, spacing=gui.history_spacing):
style_prefix "history"
+4 -6
View File
@@ -31,10 +31,9 @@ init python:
ANDROID_NO_BUNDLE = 6
ANDROID_OK = 7
JDK_REQUIREMENT=8
JDK_REQUIREMENT = 42
NO_RAPT_TEXT = _("To build Android packages, please download RAPT, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher.")
NO_JDK_TEXT = _("A 64-bit/x64 Java [JDK_REQUIREMENT] Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}download and install the JDK{/a}, then restart the Ren'Py launcher.")
NO_SDK_TEXT = _("RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this.")
NO_KEY_TEXT = _("RAPT has been installed, but a key hasn't been configured. Please generate new keys, or copy android.keystore and bundle.keystore to the base directory.")
NO_CONFIG_TEXT = _("The current project has not been configured. Use \"Configure\" to configure it before building.")
@@ -99,9 +98,12 @@ init python:
rapt.plat.renpy = True
rapt.plat.translate = __
JDK_REQUIREMENT = rapt.plat.jdk_requirement
else:
rapt = None
def AndroidState():
"""
Determines the state of the android install, and returns it.
@@ -109,8 +111,6 @@ init python:
if RAPT_PATH is None:
return ANDROID_NO_RAPT
if renpy.windows and not "JAVA_HOME" in os.environ:
return ANDROID_NO_JDK
if not os.path.exists(rapt.plat.adb):
return ANDROID_NO_SDK
if not rapt.keys.keys_exist(project.current.path):
@@ -133,8 +133,6 @@ init python:
if state == ANDROID_NO_RAPT:
return NO_RAPT_TEXT
if state == ANDROID_NO_JDK:
return NO_JDK_TEXT
if state == ANDROID_NO_SDK:
return NO_SDK_TEXT
if state == ANDROID_NO_KEY:
+1 -1
View File
@@ -1,4 +1,4 @@
# This file contains strings used by RAPT, so the Ren'Py translation framework
# can find them. It's automatically generated by rapt/update_translations.py, and
# hence should not be changed by hand.
+19 -21
View File
@@ -41,7 +41,7 @@ init python:
except Exception:
return False
def choose_directory(path):
def choose_directory(default_path):
"""
Pops up a directory chooser.
@@ -54,33 +54,31 @@ init python:
rather than user choice.
"""
if path:
default_path = path
path = None
else:
try:
default_path = os.path.dirname(os.path.abspath(config.renpy_base))
except Exception:
default_path = os.path.abspath(config.renpy_base)
if _renpytfd:
path = _renpytfd.selectFolderDialog(__("Select Projects Directory"), default_path)
else:
path = None
is_default = False
if default_path is None:
try:
default_path = os.path.dirname(os.path.abspath(config.renpy_base))
except Exception:
default_path = os.path.abspath(config.renpy_base)
# Path being None or "" means nothing was selected.
if not path:
path = default_path
is_default = True
if default_path is None or not os.path.isdir(default_path) or not directory_is_writable(default_path):
interface.error(_("No directory was selected, but one is required."))
return default_path, True
# Apply more thorough checks to an explicit path.
path = renpy.fsdecode(path)
if (not os.path.isdir(path)) or (not directory_is_writable(path)):
interface.error(_("The selected projects directory is not writable."))
path = default_path
is_default = True
if not os.path.isdir(path):
interface.error(_("The selected directory does not exist."))
elif not directory_is_writable(path):
interface.error(_("The selected directory is not writable."))
if is_default and (not directory_is_writable(path)):
path = os.path.expanduser("~")
return path, is_default
return path, False
+4 -1
View File
@@ -551,7 +551,10 @@ change_renpy_executable()
self.pretty_version = build['version']
if (" " in self.base_name) or (":" in self.base_name) or (";" in self.base_name):
reporter.info(_("Building distributions failed:\n\nThe build.directory_name variable may not include the space, colon, or semicolon characters."), pause=True)
reporter.info(
_("Building distributions failed:\n\nThe build.directory_name variable may not include the space, colon, or semicolon characters."),
submessage=_("This may be derived from build.name and config.version or build.version."),
pause=True)
self.log.close()
return
-9
View File
@@ -196,7 +196,6 @@ screen front_page_project:
textbutton _("Navigate Script") action Jump("navigation")
textbutton _("Check Script (Lint)") action Jump("lint")
textbutton _("Launch tests") action Jump("launch_tests")
if project.current.exists("game/gui.rpy"):
textbutton _("Change/Update GUI") action Jump("change_gui")
@@ -284,11 +283,3 @@ label force_recompile:
project.current.launch([ 'compile' ], wait=True)
jump front_page
label launch_tests:
python hide:
interface.processing(_("Launching tests..."))
project.current.launch([ 'test' ], wait=True)
jump front_page
+1 -1
View File
@@ -98,7 +98,7 @@ label itch:
for fn in os.listdir(destination):
for pattern, channel in reversed(build['itch_channels']):
for pattern, channel in reversed(build['itch_channels'].items()):
if fnmatch.fnmatch(fn, pattern):
break
else:
+1 -1
View File
@@ -339,7 +339,6 @@ init python:
build.classify_renpy(pattern + "/**.rpymc", binary)
build.classify_renpy(pattern + "/**/" + renpy.script.BYTECODE_FILE, binary)
build.classify_renpy(pattern + "/**/cache/bytecode-311.rpyb", "web")
build.classify_renpy(pattern + "/**/cache/bytecode-*.rpyb", None)
build.classify_renpy(pattern + "/**/cache/*", binary)
@@ -396,6 +395,7 @@ init python:
build.classify_renpy("module/pysdlsound/*.pyx", "source")
build.classify_renpy("module/fribidi-src/**", "source")
build.classify_renpy("module/tinyfiledialogs/**", "source")
build.classify_renpy("module/libhydrogen/**", "source")
# all-platforms binary.
build.classify_renpy("lib/**/*steam_api*", "steam")
+3 -25
View File
@@ -1,31 +1,9 @@
init python:
def finally_callback():
print("finally "*100)
whether = renpy.is_in_test()
define config.end_testcase_callbacks += [finally_callback]
testcase default:
python hide:
renpy.watch("renpy.is_in_test()")
renpy.watch("waitch")
renpy.watch("whether")
waitch = 5
"preferences"
"theme"
"dEfAuLt theme"
"theme"
"dark the"
"return"
# exit
"quit"
init python:
TEST_PROJECTS = "/tmp/renpy-moé"
TEST_PROJECTS = u"/tmp/renpy-moé"
import shutil
testcase old_default:
testcase default:
call new_project
call translate_project
+8
View File
@@ -2122,3 +2122,11 @@ translate finnish strings:
# Automatic translation.
new "Ennen verkkosovellusten pakkaamista sinun on ladattava RenPyWeb, Ren'Pyn verkkotuki. Haluatko ladata RenPyWebin nyt?"
translate finnish strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Yöllinen versio, joka sisältää korjauksia Ren'Pyn julkaisuversioon."
+41 -25
View File
@@ -1108,6 +1108,14 @@
old "Release"
new "Stable"
# game/updater.rpy:64
old "Release (Ren'Py 8, Python 3)"
new "Stable (Ren'Py 8, Python 3)"
# game/updater.rpy:65
old "Release (Ren'Py 7, Python 2)"
new "Stable (Ren'Py 7, Python 2)"
# updater.rpy:97
old "{b}Recommended.{/b} The version of Ren'Py that should be used in all newly-released games."
new "{b}Recommandé.{/b} La version de RenPy qui devrait être utilisée pour tous les jeux récemment sortis."
@@ -1116,6 +1124,14 @@
old "Prerelease"
new "Pré-stable"
# game/updater.rpy:69
old "Prerelease (Ren'Py 8, Python 3)"
new "Pré-stable (Ren'Py 8, Python 3)"
# game/updater.rpy:70
old "Prerelease (Ren'Py 7, Python 2)"
new "Pré-stable (Ren'Py 7, Python 2)"
# updater.rpy:108
old "A preview of the next version of Ren'Py that can be used for testing and taking advantage of new features, but not for final releases of games."
new "Un aperçu de la prochaine version de RenPy qui peut être utilisée pour faire des tests et profiter de toutes nouvelles fonctionnalités, mais pas pour créer de nouveaux jeux."
@@ -1132,9 +1148,33 @@
old "Nightly"
new "Journalière"
# game/updater.rpy:77
old "Nightly (Ren'Py 8, Python 3)"
new "Journalière (Ren'Py 8, Python 3)"
# game/updater.rpy:78
old "Nightly (Ren'Py 7, Python 2)"
new "Journalière (Ren'Py 7, Python 2)"
# updater.rpy:132
old "The bleeding edge of Ren'Py development. This may have the latest features, or might not run at all."
new "Les toutes dernières version de RenPy encore en développement. Vous pouvez alors utiliser les toutes dernières fonctionnalités, mais le logiciel peut également ne pas sexécuter du tout."
new "La toute dernière version de RenPy, encore en développement. Elle peut contenir les toutes dernières fonctionnalités, ou alors ne pas marcher du tout."
# game/updater.rpy:76
old "Nightly Fix"
new "Journalière Corrective"
# game/updater.rpy:77
old "Nightly Fix (Ren'Py 8, Python 3)"
new "Journalière Corrective (Ren'Py 8, Python 3)"
# game/updater.rpy:78
old "Nightly Fix (Ren'Py 7, Python 2)"
new "Journalière Corrective (Ren'Py 7, Python 2)"
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
new "Une version journalière qui corrige les bugs de la dernière version stable."
# updater.rpy:152
old "An error has occured:"
@@ -2044,30 +2084,6 @@
old "Install Libraries:"
new "Installer des bibliothèques :"
# game/updater.rpy:64
old "Release (Ren'Py 8, Python 3)"
new "Stable (Ren'Py 8, Python 3)"
# game/updater.rpy:65
old "Release (Ren'Py 7, Python 2)"
new "Stable (Ren'Py 7, Python 2)"
# game/updater.rpy:69
old "Prerelease (Ren'Py 8, Python 3)"
new "Pré-stable (Ren'Py 8, Python 3)"
# game/updater.rpy:70
old "Prerelease (Ren'Py 7, Python 2)"
new "Pré-stable (Ren'Py 7, Python 2)"
# game/updater.rpy:77
old "Nightly (Ren'Py 8, Python 3)"
new "Journalière (Ren'Py 8, Python 3)"
# game/updater.rpy:78
old "Nightly (Ren'Py 7, Python 2)"
new "Journalière (Ren'Py 7, Python 2)"
# game/preferences.rpy:327
old "{#in language font}Welcome! Please choose a language"
new "{font=fonts/Roboto-Light.ttf}Bienvenue ! Choisissez une langue{/font}"
+1 -2
View File
@@ -134,7 +134,7 @@ translate german strings:
# gui.rpy:96
old "## Dialogue"
# Automatic translation.
new "*Dialog"
new "## Dialog"
# gui.rpy:98
old "## These variables control how dialogue is displayed on the screen one line at a time."
@@ -576,4 +576,3 @@ translate german strings:
old "## Change the size and spacing of various things."
# Automatic translation.
new "## Ändern Sie die Größe und die Abstände verschiedener Dinge."
+8
View File
@@ -2201,3 +2201,11 @@ translate german strings:
# Automatic translation.
new "Paket erstellen..."
translate german strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Ein nächtlicher Build mit Korrekturen für die Release-Version von Ren'Py."
-9
View File
@@ -207,11 +207,6 @@ translate german strings:
# Automatic translation.
new "## ** passt auf alle Zeichen, auch auf das Verzeichnis-Trennzeichen."
# options.rpy:173
old "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
# Automatic translation.
new "*.txt\" findet beispielsweise txt-Dateien im Basisverzeichnis, \"game/**.ogg\" findet ogg-Dateien im Spielverzeichnis oder einem seiner Unterverzeichnisse und \"**.psd\" findet psd-Dateien überall im Projekt."
# options.rpy:177
old "## Classify files as None to exclude them from the built distributions."
# Automatic translation.
@@ -237,9 +232,6 @@ translate german strings:
# Automatic translation.
new "## Der mit einem itch.io-Projekt verbundene Benutzername und Projektname, getrennt durch einen Schrägstrich."
translate german strings:
# gui/game/options.rpy:31
old "## Text that is placed on the game's about screen. Place the text between the triple-quotes, and leave a blank line between paragraphs."
# Automatic translation.
@@ -263,4 +255,3 @@ translate german strings:
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\"."
# Automatic translation.
new "## Für In-App-Käufe ist ein Google Play-Lizenzschlüssel erforderlich. Sie finden ihn in der Google Play-Entwicklerkonsole unter \"Monetize\" > \"Monetization Setup\" > \"Licensing\"."
+8
View File
@@ -2210,3 +2210,11 @@ translate greek strings:
# Automatic translation.
new "Πριν συσκευάσετε εφαρμογές ιστού, θα πρέπει να κατεβάσετε το RenPyWeb, την υποστήριξη ιστού της Ren'Py. Θα θέλατε να κατεβάσετε το RenPyWeb τώρα;"
translate greek strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Ένα νυχτερινό build με διορθώσεις στην έκδοση κυκλοφορίας του Ren'Py."
-18
View File
@@ -207,11 +207,6 @@ translate indonesian strings:
# Automatic translation.
new "## Tombol Pilihan"
# gui.rpy:207
old "## Choice buttons are used in the in-game menus."
# Automatic translation.
new "Tombol pilihan ## digunakan dalam menu dalam game."
# gui.rpy:220
old "## File Slot Buttons"
# Automatic translation.
@@ -267,11 +262,6 @@ translate indonesian strings:
# Automatic translation.
new "## Jarak spasi di antara pilihan menu."
# gui.rpy:261
old "## Buttons in the navigation section of the main and game menus."
# Automatic translation.
new "Tombol ## di bagian navigasi pada menu utama dan menu permainan."
# gui.rpy:264
old "## Controls the amount of spacing between preferences."
# Automatic translation.
@@ -441,11 +431,6 @@ translate indonesian strings:
# Automatic translation.
new "## Ini mengubah ukuran dan spasi berbagai elemen GUI untuk memastikan elemen-elemen tersebut mudah terlihat pada ponsel."
# gui.rpy:413
old "## Font sizes."
# Automatic translation.
new "Ukuran huruf ##."
# gui.rpy:421
old "## Adjust the location of the textbox."
# Automatic translation.
@@ -471,8 +456,6 @@ translate indonesian strings:
# Automatic translation.
new "## Tombol cepat."
translate indonesian strings:
# gui.rpy:17
old "## GUI Configuration Variables"
new "## Variabel konfigurasi GUI"
@@ -532,4 +515,3 @@ translate indonesian strings:
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."
# Automatic translation.
new "## Jumlah maksimum entri mode NVL yang akan ditampilkan Ren'Py. Ketika lebih banyak entri daripada ini akan ditampilkan, entri tertua akan dihapus."
+8
View File
@@ -2168,3 +2168,11 @@ translate indonesian strings:
# Automatic translation.
new "Gambar dan musik dapat diunduh saat bermain. File 'progressive_download.txt' akan dibuat sehingga Anda dapat mengonfigurasi perilaku ini."
translate indonesian strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Perbaikan versi malam hari untuk versi rilis Ren'Py."
+8
View File
@@ -2169,3 +2169,11 @@ translate italian strings:
# Automatic translation.
new "Prima di confezionare le applicazioni web, è necessario scaricare RenPyWeb, il supporto web di Ren'Py. Volete scaricare RenPyWeb ora?"
translate italian strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Una build notturna di correzioni alla versione di rilascio di Ren'Py."
+8
View File
@@ -2153,3 +2153,11 @@ translate japanese strings:
old "Creating package..."
new "パッケージの作成..."
translate japanese strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Ren'Py のリリース版に対する修正を行ったナイトリービルドです。"
+8 -2
View File
@@ -2047,8 +2047,7 @@ translate korean strings:
# game/preferences.rpy:256
old "Information about creating a custom theme can be found {a=https://www.renpy.org/doc/html/skins.html}in the Ren'Py Documentation{/a}."
# Automatic translation.
new "사용자 지정 테마를 만드는 방법에 대한 정보는 Ren'Py 문서{/a} 에서 {a=https://www.renpy.org/doc/html/skins.html}확인할 수 있습니다."
new "사용자 지정 테마를 만드는 방법에 대한 정보는 {a=https://www.renpy.org/doc/html/skins.html}Ren'Py 문서{/a} 에서 확인할 수 있습니다."
# game/preferences.rpy:273
old "Install Libraries:"
@@ -2150,3 +2149,10 @@ translate korean strings:
# Automatic translation.
new "재생 중에 이미지와 음악을 다운로드할 수 있습니다. 이 동작을 구성할 수 있도록 'progressive_download.txt' 파일이 생성됩니다."
translate korean strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Ren'Py 릴리스 버전에 대한 수정 사항이 포함된 야간 빌드입니다."
-6
View File
@@ -207,13 +207,7 @@ translate korean strings:
# Automatic translation.
new "## 이 세 가지 변수는 무엇보다도 플레이어에게 기본적으로 표시되는 믹서를 제어합니다. 이 중 하나를 False로 설정하면 해당 믹서가 숨겨집니다."
# gui/game/options.rpy:152
old "## Icon"
# Automatic translation.
new "아이콘 ##"
# 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\"."
# Automatic translation.
new "## 인앱 구매를 수행하려면 Google Play 라이선스 키가 필요합니다. Google Play 개발자 콘솔의 '수익 창출' > '수익 창출 설정' > '라이선스'에서 찾을 수 있습니다."
-5
View File
@@ -704,11 +704,6 @@ translate korean strings:
# Automatic translation.
new "## 주어진 경우 메뉴를 표시합니다. config.narrator_menu가 True로 설정된 경우 메뉴가 잘못 표시될 수 있습니다."
# gui/game/screens.rpy:1410
old "## Bubble screen"
# Automatic translation.
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."
# Automatic translation.
+16 -16
View File
@@ -321,7 +321,7 @@ translate piglatin strings:
old "Language [text]"
new "Anguagelay [text]"
# renpy/common/00action_other.rpy:721
# renpy/common/00action_other.rpy:722
old "Open [text] directory."
new "Penoay [text] irectoryday."
@@ -485,11 +485,11 @@ translate piglatin strings:
old "Saved screenshot as %s."
new "Avedsay creenshotsay asay %say."
# renpy/common/00library.rpy:235
# renpy/common/00library.rpy:248
old "Skip Mode"
new "Kipsay Odemay"
# renpy/common/00library.rpy:340
# renpy/common/00library.rpy:353
old "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}."
new "Histay rogrampay ontainscay eefray oftwaresay underay aay umbernay ofay icenseslay, includingay hetay Itmay Icenselay anday Nugay Esserlay Eneralgay Ublicpay Icenselay. Aay ompletecay istlay ofay oftwaresay, includingay inkslay otay ullfay ourcesay odecay, ancay ebay oundfay {a=https://www.renpy.org/l/license}erehay{/a}."
@@ -733,55 +733,55 @@ translate piglatin strings:
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 "Hetay Enray'Ypay Yncsay erversay oesday otnay avehay aay opycay ofay histay yncsay. Hetay yncsay Diay aymay ebay invaliday, oray itay aymay avehay imedtay outay."
# renpy/common/00sync.rpy:409
# renpy/common/00sync.rpy:412
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
new "Leasepay enteray hetay yncsay Diay ouyay eneratedgay.\nEvernay enteray aay yncsay Diay ouyay idnday'tay reatecay ourselfyay."
# renpy/common/00sync.rpy:428
# renpy/common/00sync.rpy:431
old "The sync ID is not in the correct format."
new "Hetay yncsay Diay isay otnay inay hetay orrectcay ormatfay."
# renpy/common/00sync.rpy:448
# renpy/common/00sync.rpy:451
old "The sync could not be decrypted."
new "Hetay yncsay ouldcay otnay ebay ecryptedday."
# renpy/common/00sync.rpy:471
# renpy/common/00sync.rpy:474
old "The sync belongs to a different game."
new "Hetay yncsay elongsbay otay aay ifferentday amegay."
# renpy/common/00sync.rpy:476
# renpy/common/00sync.rpy:479
old "The sync contains a file with an invalid name."
new "Hetay yncsay ontainscay aay ilefay ithway anay invaliday amenay."
# renpy/common/00sync.rpy:529
# renpy/common/00sync.rpy:532
old "This will upload your saves to the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nDo you want to continue?"
new "Histay illway uploaday ouryay avessay otay hetay {a=https://sync.renpy.org}Enray'Ypay Yncsay Erversay{/a}.\nOday ouyay antway otay ontinuecay?"
# renpy/common/00sync.rpy:558
# renpy/common/00sync.rpy:561
old "Enter Sync ID"
new "Ntereay Yncsay Diay"
# renpy/common/00sync.rpy:569
# renpy/common/00sync.rpy:572
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
new "Histay illway ontactcay hetay {a=https://sync.renpy.org}Enray'Ypay Yncsay Erversay{/a}."
# renpy/common/00sync.rpy:596
# renpy/common/00sync.rpy:599
old "Sync Success"
new "Yncsay Uccesssay"
# renpy/common/00sync.rpy:599
# renpy/common/00sync.rpy:602
old "The Sync ID is:"
new "Hetay Yncsay Diay isay:"
# renpy/common/00sync.rpy:605
# renpy/common/00sync.rpy:608
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 "Ouyay ancay useay histay Diay otay ownloadday ouryay avesay onay anotheray eviceday.\nHistay yncsay illway expireay inay anay ourhay.\nEnray'Ypay Yncsay isay upportedsay ybay {a=https://www.renpy.org/sponsors.html}Enray'Ypay'say Ponsorssay{/a}."
# renpy/common/00sync.rpy:609
# renpy/common/00sync.rpy:612
old "Continue"
new "Ontinuecay"
# renpy/common/00sync.rpy:631
# renpy/common/00sync.rpy:634
old "Sync Error"
new "Yncsay Rroreay"
+2 -2
View File
@@ -51,11 +51,11 @@ translate piglatin strings:
# renpy/common/00gltest.rpy:181
old "60"
new "06ay"
new "60"
# renpy/common/00gltest.rpy:185
old "30"
new "03ay"
new "30"
# renpy/common/00gltest.rpy:191
old "Tearing"
+6 -6
View File
@@ -123,15 +123,15 @@ translate piglatin strings:
# gui/game/gui.rpy:103
old "## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is center, and 1.0 is the bottom."
new "## Hetay acementplay ofay hetay extboxtay erticallyvay onay hetay creensay. 0ay.0ay isay hetay optay, 0ay.5ay isay entercay, anday 1ay.0ay isay hetay ottombay."
new "## Hetay acementplay ofay hetay extboxtay erticallyvay onay hetay creensay. 0.0 isay hetay optay, 0.5 isay entercay, anday 1.0 isay hetay ottombay."
# gui/game/gui.rpy:108
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 "## Hetay acementplay ofay hetay peakingsay aracterchay'say amenay, elativeray otay hetay extboxtay. Hesetay ancay ebay aay holeway umbernay ofay ixelspay omfray hetay eftlay oray optay, oray 0ay.5ay otay entercay."
new "## Hetay acementplay ofay hetay peakingsay aracterchay'say amenay, elativeray otay hetay extboxtay. Hesetay ancay ebay aay holeway umbernay ofay ixelspay omfray hetay eftlay oray optay, oray 0.5 otay entercay."
# gui/game/gui.rpy:113
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."
new "## Hetay orizontalhay alignmentay ofay hetay aracterchay'say amenay. Histay ancay ebay 0ay.0ay orfay eftlay-aligneday, 0ay.5ay orfay enteredcay, anday 1ay.0ay orfay ightray-aligneday."
new "## Hetay orizontalhay alignmentay ofay hetay aracterchay'say amenay. Histay ancay ebay 0.0 orfay eftlay-aligneday, 0.5 orfay enteredcay, anday 1.0 orfay ightray-aligneday."
# gui/game/gui.rpy:117
old "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
@@ -147,7 +147,7 @@ translate piglatin strings:
# gui/game/gui.rpy:131
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."
new "## Hetay acementplay ofay ialogueday elativeray otay hetay extboxtay. Hesetay ancay ebay aay holeway umbernay ofay ixelspay elativeray otay hetay eftlay oray optay idesay ofay hetay extboxtay, oray 0ay.5ay otay entercay."
new "## Hetay acementplay ofay ialogueday elativeray otay hetay extboxtay. Hesetay ancay ebay aay holeway umbernay ofay ixelspay elativeray otay hetay eftlay oray optay idesay ofay hetay extboxtay, oray 0.5 otay entercay."
# gui/game/gui.rpy:137
old "## The maximum width of dialogue text, in pixels."
@@ -155,7 +155,7 @@ translate piglatin strings:
# gui/game/gui.rpy:140
old "## The horizontal alignment of the dialogue text. This can be 0.0 for left-aligned, 0.5 for centered, and 1.0 for right-aligned."
new "## Hetay orizontalhay alignmentay ofay hetay ialogueday exttay. Histay ancay ebay 0ay.0ay orfay eftlay-aligneday, 0ay.5ay orfay enteredcay, anday 1ay.0ay orfay ightray-aligneday."
new "## Hetay orizontalhay alignmentay ofay hetay ialogueday exttay. Histay ancay ebay 0.0 orfay eftlay-aligneday, 0.5 orfay enteredcay, anday 1.0 orfay ightray-aligneday."
# gui/game/gui.rpy:145
old "## Buttons"
@@ -191,7 +191,7 @@ translate piglatin strings:
# gui/game/gui.rpy:173
old "## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 is right)."
new "## Hetay orizontalhay alignmentay ofay hetay uttonbay exttay. (0ay.0ay isay eftlay, 0ay.5ay isay entercay, 1ay.0ay isay ightray)."
new "## Hetay orizontalhay alignmentay ofay hetay uttonbay exttay. (0.0 isay eftlay, 0.5 isay entercay, 1.0 isay ightray)."
# gui/game/gui.rpy:178
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."
+58 -62
View File
@@ -39,7 +39,7 @@ translate piglatin strings:
# game/android.rpy:37
old "A 64-bit/x64 Java [JDK_REQUIREMENT] Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Aay 46ay-itbay/64xay Avajay [JDK_REQUIREMENT] Evelopmentday Itkay isay equiredray otay uildbay Ndroidaay ackagespay onay Indowsway. Hetay Dkjay isay ifferentday omfray hetay Rejay, osay itay'say ossiblepay ouyay avehay Avajay ithoutway avinghay hetay Dkjay.\n\nLeasepay {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}ownloadday anday installay hetay Dkjay{/a}, hentay estartray hetay Enray'Ypay auncherlay."
new "Aay 64-itbay/64xay Avajay [JDK_REQUIREMENT] Evelopmentday Itkay isay equiredray otay uildbay Ndroidaay ackagespay onay Indowsway. Hetay Dkjay isay ifferentday omfray hetay Rejay, osay itay'say ossiblepay ouyay avehay Avajay ithoutway avinghay hetay Dkjay.\n\nLeasepay {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}ownloadday anday installay hetay Dkjay{/a}, hentay estartray hetay Enray'Ypay auncherlay."
# game/android.rpy:38
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
@@ -107,11 +107,11 @@ translate piglatin strings:
# game/android.rpy:57
old "Pairs with a device over Wi-Fi, on Android 11+."
new "Airspay ithway aay eviceday overay Iway-Ifay, onay Ndroidaay 11ay+."
new "Airspay ithway aay eviceday overay Iway-Ifay, onay Ndroidaay 11+."
# game/android.rpy:58
old "Connects to a device over Wi-Fi, on Android 11+."
new "Onnectscay otay aay eviceday overay Iway-Ifay, onay Ndroidaay 11ay+."
new "Onnectscay otay aay eviceday overay Iway-Ifay, onay Ndroidaay 11+."
# game/android.rpy:59
old "Disconnects a device connected over Wi-Fi."
@@ -123,11 +123,11 @@ translate piglatin strings:
# game/android.rpy:63
old "Builds an Android App Bundle (ABB), intended to be uploaded to Google Play. This can include up to 2GB of data."
new "Uildsbay anay Ndroidaay Ppaay Undlebay (Bbaay), intendeday otay ebay uploadeday otay Ooglegay Laypay. Histay ancay includeay upay otay GB2ay ofay ataday."
new "Uildsbay anay Ndroidaay Ppaay Undlebay (Bbaay), intendeday otay ebay uploadeday otay Ooglegay Laypay. Histay ancay includeay upay otay 2GB ofay ataday."
# game/android.rpy:64
old "Builds a Universal APK package, intended for sideloading and stores other than Google Play. This can include up to 2GB of data."
new "Uildsbay aay Niversaluay Pkaay ackagepay, intendeday orfay ideloadingsay anday oresstay otheray hantay Ooglegay Laypay. Histay ancay includeay upay otay GB2ay ofay ataday."
new "Uildsbay aay Niversaluay Pkaay ackagepay, intendeday orfay ideloadingsay anday oresstay otheray hantay Ooglegay Laypay. Histay ancay includeay upay otay 2GB ofay ataday."
# game/android.rpy:258
old "Copying Android files to distributions directory."
@@ -423,7 +423,7 @@ translate piglatin strings:
# game/androidstrings.rpy:49
old "The version of Java on your computer does not appear to be JDK 8, which is the only version supported by the Android SDK. If you need to install JDK 8, you can download it from:\n\n{a=https://adoptium.net/?variant=openjdk8}https://adoptium.net/?variant=openjdk8{/a}\n\nYou can also set the JAVA_HOME environment variable to use a different version of Java."
new "Hetay ersionvay ofay Avajay onay ouryay omputercay oesday otnay appearay otay ebay Dkjay 8ay, hichway isay hetay onlyay ersionvay upportedsay ybay hetay Ndroidaay Dksay. Fiay ouyay eednay otay installay Dkjay 8ay, ouyay ancay ownloadday itay omfray:\n\n{a=https://adoptium.net/?variant=openjdk8}ttpshay://adoptiumay.etnay/?ariantvay=openjdk8ay{/a}\n\nOuyay ancay alsoay etsay hetay Ava_homejay environmentay ariablevay otay useay aay ifferentday ersionvay ofay Avajay."
new "Hetay ersionvay ofay Avajay onay ouryay omputercay oesday otnay appearay otay ebay Dkjay 8, hichway isay hetay onlyay ersionvay upportedsay ybay hetay Ndroidaay Dksay. Fiay ouyay eednay otay installay Dkjay 8, ouyay ancay ownloadday itay omfray:\n\n{a=https://adoptium.net/?variant=openjdk8}ttpshay://adoptiumay.etnay/?ariantvay=openjdk8ay{/a}\n\nOuyay ancay alsoay etsay hetay Ava_homejay environmentay ariablevay otay useay aay ifferentday ersionvay ofay Avajay."
# game/androidstrings.rpy:50
old "The JDK is present and working. Good!"
@@ -711,7 +711,7 @@ translate piglatin strings:
# game/editor.rpy:169
old "Up to 110 MB download required."
new "Puay otay 101ay Bmay ownloadday equiredray."
new "Puay otay 110 Bmay ownloadday equiredray."
# game/editor.rpy:182
old "A modern and approachable text editor."
@@ -723,7 +723,7 @@ translate piglatin strings:
# game/editor.rpy:196
old "Up to 150 MB download required."
new "Puay otay 501ay Bmay ownloadday equiredray."
new "Puay otay 150 Bmay ownloadday equiredray."
# game/editor.rpy:211
old "jEdit"
@@ -735,7 +735,7 @@ translate piglatin strings:
# game/editor.rpy:211
old "1.8 MB download required."
new "1ay.8ay Bmay ownloadday equiredray."
new "1.8 Bmay ownloadday equiredray."
# game/editor.rpy:211
old "This may have occured because Java is not installed on this system."
@@ -821,26 +821,6 @@ translate piglatin strings:
old "Open Directory"
new "Penoay Irectoryday"
# game/front_page.rpy:162
old "game"
new "amegay"
# game/front_page.rpy:163
old "base"
new "asebay"
# game/front_page.rpy:164
old "images"
new "imagesay"
# game/front_page.rpy:165
old "audio"
new "audioay"
# game/front_page.rpy:166
old "gui"
new "uigay"
# game/front_page.rpy:171
old "Edit File"
new "Diteay Ilefay"
@@ -939,11 +919,11 @@ translate piglatin strings:
# game/gui7.rpy:333
old "What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of [default_size[0]]x[default_size[1]] is a reasonable compromise."
new "Hatway esolutionray ouldshay hetay rojectpay useay? Lthoughaay Enray'Ypay ancay calesay hetay indowway upay anday ownday, histay isay hetay initialay izesay ofay hetay indowway, hetay izesay atay hichway assetsay ouldshay ebay rawnday, anday hetay izesay atay hichway hetay assetsay illway ebay atay heirtay arpestshay.\n\nHetay efaultday ofay [default_size[]]x0ay[default_size[]]1ay isay aay easonableray ompromisecay."
new "Hatway esolutionray ouldshay hetay rojectpay useay? Lthoughaay Enray'Ypay ancay calesay hetay indowway upay anday ownday, histay isay hetay initialay izesay ofay hetay indowway, hetay izesay atay hichway assetsay ouldshay ebay rawnday, anday hetay izesay atay hichway hetay assetsay illway ebay atay heirtay arpestshay.\n\nHetay efaultday ofay [default_size[0]]xay[default_size[1]] isay aay easonableray ompromisecay."
# game/gui7.rpy:333
old "Custom. The GUI is optimized for a 16:9 aspect ratio."
new "Ustomcay. Hetay Uigay isay optimizeday orfay aay 61ay:9ay aspectay atioray."
new "Ustomcay. Hetay Uigay isay optimizeday orfay aay 16:9 aspectay atioray."
# game/gui7.rpy:350
old "WIDTH"
@@ -1019,7 +999,7 @@ translate piglatin strings:
# game/install.rpy:182
old "The {a=https://www.live2d.com/en/download/cubism-sdk/download-native/}Cubism SDK for Native{/a} adds support for displaying Live2D models. Place CubismSdkForNative-4-{i}version{/i}.zip in the Ren'Py SDK directory, and then click Install. Distributing a game with Live2D requires you to accept a license from Live2D, Inc."
new "Hetay {a=https://www.live2d.com/en/download/cubism-sdk/download-native/}Ubismcay Dksay orfay Ativenay{/a} addsay upportsay orfay isplayingday Ive2dlay odelsmay. Lacepay Ubismsdkfornativecay-4ay-{i}ersionvay{/i}.ipzay inay hetay Enray'Ypay Dksay irectoryday, anday hentay ickclay Nstalliay. Istributingday aay amegay ithway Ive2dlay equiresray ouyay otay acceptay aay icenselay omfray Ive2dlay, Nciay."
new "Hetay {a=https://www.live2d.com/en/download/cubism-sdk/download-native/}Ubismcay Dksay orfay Ativenay{/a} addsay upportsay orfay isplayingday Ive2dlay odelsmay. Lacepay Ubismsdkfornativecay-4-{i}ersionvay{/i}.ipzay inay hetay Enray'Ypay Dksay irectoryday, anday hentay ickclay Nstalliay. Istributingday aay amegay ithway Ive2dlay equiresray ouyay otay acceptay aay icenselay omfray Ive2dlay, Nciay."
# game/install.rpy:186
old "Live2D in Ren'Py doesn't support the Web, Android x86_64 (including emulators and Chrome OS), and must be added to iOS projects manually. Live2D must be reinstalled after upgrading Ren'Py or installing Android support."
@@ -1671,11 +1651,11 @@ translate piglatin strings:
# game/updater.rpy:64
old "Release (Ren'Py 8, Python 3)"
new "Eleaseray (Enray'Ypay 8ay, Ythonpay 3ay)"
new "Eleaseray (Enray'Ypay 8, Ythonpay 3)"
# game/updater.rpy:65
old "Release (Ren'Py 7, Python 2)"
new "Eleaseray (Enray'Ypay 7ay, Ythonpay 2ay)"
new "Eleaseray (Enray'Ypay 7, Ythonpay 2)"
# game/updater.rpy:66
old "{b}Recommended.{/b} The version of Ren'Py that should be used in all newly-released games."
@@ -1687,11 +1667,11 @@ translate piglatin strings:
# game/updater.rpy:69
old "Prerelease (Ren'Py 8, Python 3)"
new "Rereleasepay (Enray'Ypay 8ay, Ythonpay 3ay)"
new "Rereleasepay (Enray'Ypay 8, Ythonpay 3)"
# game/updater.rpy:70
old "Prerelease (Ren'Py 7, Python 2)"
new "Rereleasepay (Enray'Ypay 7ay, Ythonpay 2ay)"
new "Rereleasepay (Enray'Ypay 7, Ythonpay 2)"
# game/updater.rpy:71
old "A preview of the next version of Ren'Py that can be used for testing and taking advantage of new features, but not for final releases of games."
@@ -1706,102 +1686,118 @@ translate piglatin strings:
new "Xperimentaleay ersionsvay ofay Enray'Ypay. Ouyay ouldnshay'tay electsay histay annelchay unlessay askeday ybay aay Enray'Ypay eveloperday."
# game/updater.rpy:76
old "Nightly Fix"
new "Ightlynay Ixfay"
# game/updater.rpy:77
old "Nightly Fix (Ren'Py 8, Python 3)"
new "Ightlynay Ixfay (Enray'Ypay 8, Ythonpay 3)"
# game/updater.rpy:78
old "Nightly Fix (Ren'Py 7, Python 2)"
new "Ightlynay Ixfay (Enray'Ypay 7, Ythonpay 2)"
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
new "Aay ightlynay uildbay ofay ixesfay otay hetay eleaseray ersionvay ofay Enray'Ypay."
# game/updater.rpy:81
old "Nightly"
new "Ightlynay"
# game/updater.rpy:77
# game/updater.rpy:82
old "Nightly (Ren'Py 8, Python 3)"
new "Ightlynay (Enray'Ypay 8ay, Ythonpay 3ay)"
new "Ightlynay (Enray'Ypay 8, Ythonpay 3)"
# game/updater.rpy:78
# game/updater.rpy:83
old "Nightly (Ren'Py 7, Python 2)"
new "Ightlynay (Enray'Ypay 7ay, Ythonpay 2ay)"
new "Ightlynay (Enray'Ypay 7, Ythonpay 2)"
# game/updater.rpy:79
# game/updater.rpy:84
old "The bleeding edge of Ren'Py development. This may have the latest features, or might not run at all."
new "Hetay eedingblay edgeay ofay Enray'Ypay evelopmentday. Histay aymay avehay hetay atestlay eaturesfay, oray ightmay otnay unray atay allay."
# game/updater.rpy:97
# game/updater.rpy:102
old "Select Update Channel"
new "Electsay Pdateuay Hannelcay"
# game/updater.rpy:108
# game/updater.rpy:113
old "The update channel controls the version of Ren'Py the updater will download."
new "Hetay updateay annelchay ontrolscay hetay ersionvay ofay Enray'Ypay hetay updateray illway ownloadday."
# game/updater.rpy:116
# game/updater.rpy:121
old "• {a=https://www.renpy.org/doc/html/changelog.html}View change log{/a}"
new "• {a=https://www.renpy.org/doc/html/changelog.html}Iewvay angechay oglay{/a}"
# game/updater.rpy:118
# game/updater.rpy:123
old "• {a=https://www.renpy.org/dev-doc/html/changelog.html}View change log{/a}"
new "• {a=https://www.renpy.org/dev-doc/html/changelog.html}Iewvay angechay oglay{/a}"
# game/updater.rpy:124
# game/updater.rpy:129
old "• This version is installed and up-to-date."
new "• Histay ersionvay isay installeday anday upay-otay-ateday."
# game/updater.rpy:136
# game/updater.rpy:141
old "%B %d, %Y"
new "%Bay %day, %Yay"
# game/updater.rpy:158
# game/updater.rpy:163
old "An error has occured:"
new "Naay erroray ashay occureday:"
# game/updater.rpy:160
# game/updater.rpy:165
old "Checking for updates."
new "Heckingcay orfay updatesay."
# game/updater.rpy:162
# game/updater.rpy:167
old "Ren'Py is up to date."
new "Enray'Ypay isay upay otay ateday."
# game/updater.rpy:164
# game/updater.rpy:169
old "[u.version] is now available. Do you want to install it?"
new "[u.version] isay ownay availableay. Oday ouyay antway otay installay itay?"
# game/updater.rpy:166
# game/updater.rpy:171
old "Preparing to download the update."
new "Reparingpay otay ownloadday hetay updateay."
# game/updater.rpy:168
# game/updater.rpy:173
old "Downloading the update."
new "Ownloadingday hetay updateay."
# game/updater.rpy:170
# game/updater.rpy:175
old "Unpacking the update."
new "Npackinguay hetay updateay."
# game/updater.rpy:172
# game/updater.rpy:177
old "Finishing up."
new "Inishingfay upay."
# game/updater.rpy:174
# game/updater.rpy:179
old "The update has been installed. Ren'Py will restart."
new "Hetay updateay ashay eenbay installeday. Enray'Ypay illway estartray."
# game/updater.rpy:176
# game/updater.rpy:181
old "The update has been installed."
new "Hetay updateay ashay eenbay installeday."
# game/updater.rpy:178
# game/updater.rpy:183
old "The update was cancelled."
new "Hetay updateay asway ancelledcay."
# game/updater.rpy:195
# game/updater.rpy:200
old "Ren'Py Update"
new "Enray'Ypay Pdateuay"
# game/updater.rpy:201
# game/updater.rpy:206
old "Proceed"
new "Roceedpay"
# game/updater.rpy:215
# game/updater.rpy:220
old "Fetching the list of update channels"
new "Etchingfay hetay istlay ofay updateay annelschay"
# game/updater.rpy:220
# game/updater.rpy:225
old "downloading the list of update channels"
new "ownloadingday hetay istlay ofay updateay annelschay"
+3 -3
View File
@@ -23,7 +23,7 @@ translate piglatin strings:
# gui/game/options.rpy:17
old "Ren'Py 7 Default GUI"
new "Enray'Ypay 7ay Efaultday Uigay"
new "Enray'Ypay 7 Efaultday Uigay"
# gui/game/options.rpy:20
old "## Determines if the title given above is shown on the main menu screen. Set this to False to hide the title."
@@ -107,11 +107,11 @@ translate piglatin strings:
# gui/game/options.rpy:123
old "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
new "## Ontrolscay hetay efaultday exttay peedsay. Hetay efaultday, 0ay, isay infiniteay, hileway anyay otheray umbernay isay hetay umbernay ofay aracterschay erpay econdsay otay ypetay outay."
new "## Ontrolscay hetay efaultday exttay peedsay. Hetay efaultday, 0, isay infiniteay, hileway anyay otheray umbernay isay hetay umbernay ofay aracterschay erpay econdsay otay ypetay outay."
# gui/game/options.rpy:129
old "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
new "## Hetay efaultday autoay-orwardfay elayday. Argerlay umbersnay eadlay otay ongerlay aitsway, ithway 0ay otay 03ay eingbay hetay alidvay angeray."
new "## Hetay efaultday autoay-orwardfay elayday. Argerlay umbersnay eadlay otay ongerlay aitsway, ithway 0 otay 30 eingbay hetay alidvay angeray."
# gui/game/options.rpy:135
old "## Save directory"
+2 -1
View File
@@ -295,7 +295,7 @@ translate piglatin strings:
# gui/game/screens.rpy:668
old "## range(1, 10) gives the numbers from 1 to 9."
new "## angeray(1ay, 01ay) ivesgay hetay umbersnay omfray 1ay otay 9ay."
new "## angeray(1, 10) ivesgay hetay umbersnay omfray 1 otay 9."
# gui/game/screens.rpy:672
old ">"
@@ -672,3 +672,4 @@ translate piglatin strings:
# gui/game/screens.rpy:1526
old "Menu"
new "Enumay"
+8
View File
@@ -2055,3 +2055,11 @@ translate polish strings:
# Automatic translation.
new "Tworzenie pakietu..."
translate polish strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Nocna kompilacja poprawek do wydanej wersji Ren'Py."
+1 -4
View File
@@ -674,9 +674,6 @@ translate polish strings:
old "Menu"
new "Menu"
translate polish strings:
# gui/game/screens.rpy:676
old "Upload Sync"
# Automatic translation.
@@ -700,7 +697,7 @@ translate polish strings:
# gui/game/screens.rpy:1410
old "## Bubble screen"
# Automatic translation.
new "# Bubble screen"
new "## Bubble screen"
# 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."
+8
View File
@@ -1227,3 +1227,11 @@ translate portuguese strings:
# Automatic translation.
new "Antes de empacotar aplicativos Web, você precisará baixar o RenPyWeb, o suporte Web do Ren'Py. Gostaria de fazer o download do RenPyWeb agora?"
translate portuguese strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Uma compilação noturna de correções para a versão de lançamento do Ren'Py."
+1 -2
View File
@@ -206,7 +206,7 @@ translate portuguese strings:
# gui/game/options.rpy:175
old "## * matches all characters, except the directory separator."
# Automatic translation.
new "* corresponde a todos os caracteres, exceto o separador de diretório."
new "## * corresponde a todos os caracteres, exceto o separador de diretório."
# gui/game/options.rpy:177
old "## ** matches all characters, including the directory separator."
@@ -242,4 +242,3 @@ translate portuguese strings:
old "## The username and project name associated with an itch.io project, separated by a slash."
# Automatic translation.
new "## O nome de usuário e o nome do projeto associados a um projeto itch.io, separados por uma barra."
+8
View File
@@ -2091,3 +2091,11 @@ translate russian strings:
# Automatic translation.
new "Создание пакета..."
translate russian strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Ночная сборка исправлений к релизной версии Ren'Py."
+29 -358
View File
@@ -12,51 +12,6 @@
old "Self-voicing enabled. "
new "机器朗读已启用。"
# renpy/common/00accessibility.rpy:32
old "bar"
# Automatic translation.
new "吧台"
# renpy/common/00accessibility.rpy:33
old "selected"
# Automatic translation.
new "选定的"
# renpy/common/00accessibility.rpy:34
old "viewport"
# Automatic translation.
new "视口"
# renpy/common/00accessibility.rpy:35
old "horizontal scroll"
# Automatic translation.
new "横向滚动"
# renpy/common/00accessibility.rpy:36
old "vertical scroll"
# Automatic translation.
new "垂直滚动"
# renpy/common/00accessibility.rpy:37
old "activate"
# Automatic translation.
new "激活"
# renpy/common/00accessibility.rpy:38
old "deactivate"
# Automatic translation.
new "停用"
# renpy/common/00accessibility.rpy:39
old "increase"
# Automatic translation.
new "增加"
# renpy/common/00accessibility.rpy:40
old "decrease"
# Automatic translation.
new "减少"
# renpy/common/00accessibility.rpy:138
old "Font Override"
new "字体覆盖"
@@ -351,36 +306,31 @@
# renpy/common/00director.rpy:1561
old "(statement)"
# Automatic translation.
new "(声明)"
new "(语句)"
# renpy/common/00director.rpy:1562
old "(tag)"
# Automatic translation.
new "(标签)"
new "(标签)"
# renpy/common/00director.rpy:1563
old "(attributes)"
# Automatic translation.
new "(属性)"
new "(属性)"
# renpy/common/00director.rpy:1564
old "(transform)"
new "(transform)"
new "(变换)"
# renpy/common/00director.rpy:1589
old "(transition)"
new "(transition)"
new "(转场)"
# renpy/common/00director.rpy:1601
old "(channel)"
# Automatic translation.
new "(频道)"
new "(轨道)"
# renpy/common/00director.rpy:1602
old "(filename)"
# Automatic translation.
new "(文件名)"
new "(文件名)"
# renpy/common/00director.rpy:1631
old "Change"
@@ -486,238 +436,6 @@
old "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}."
new "本程序包含了由数个许可证授权的自由软件,包括 MIT 许可证和 GNU 宽松通用公共许可证。完整软件列表及源代码链接,请{a=https://www.renpy.org/l/license}访问此处{/a}。"
# renpy/common/00preferences.rpy:263
old "display"
# Automatic translation.
new "展示"
# renpy/common/00preferences.rpy:275
old "transitions"
# Automatic translation.
new "过渡"
# renpy/common/00preferences.rpy:284
old "skip transitions"
# Automatic translation.
new "跳过过渡期"
# renpy/common/00preferences.rpy:286
old "video sprites"
# Automatic translation.
new "视频精灵"
# renpy/common/00preferences.rpy:295
old "show empty window"
# Automatic translation.
new "显示空窗口"
# renpy/common/00preferences.rpy:304
old "text speed"
# Automatic translation.
new "文字速度"
# renpy/common/00preferences.rpy:312
old "joystick"
# Automatic translation.
new "操纵杆"
# renpy/common/00preferences.rpy:312
old "joystick..."
# Automatic translation.
new "操纵杆..."
# renpy/common/00preferences.rpy:319
old "skip"
# Automatic translation.
new "跳过"
# renpy/common/00preferences.rpy:322
old "skip unseen [text]"
# Automatic translation.
new "跳过未见的[text]"
# renpy/common/00preferences.rpy:327
old "skip unseen text"
# Automatic translation.
new "跳过未看到的文本"
# renpy/common/00preferences.rpy:329
old "begin skipping"
# Automatic translation.
new "开始跳伞"
# renpy/common/00preferences.rpy:333
old "after choices"
# Automatic translation.
new "选择之后"
# renpy/common/00preferences.rpy:340
old "skip after choices"
# Automatic translation.
new "选择后跳过"
# renpy/common/00preferences.rpy:342
old "auto-forward time"
# Automatic translation.
new "自动转发时间"
# renpy/common/00preferences.rpy:356
old "auto-forward"
# Automatic translation.
new "自动转发"
# renpy/common/00preferences.rpy:363
old "Auto forward"
new "自动前进"
# renpy/common/00preferences.rpy:366
old "auto-forward after click"
# Automatic translation.
new "点击后自动转发"
# renpy/common/00preferences.rpy:375
old "automatic move"
# Automatic translation.
new "自动移动"
# renpy/common/00preferences.rpy:384
old "wait for voice"
# Automatic translation.
new "等待声音"
# renpy/common/00preferences.rpy:393
old "voice sustain"
# Automatic translation.
new "语音持续"
# renpy/common/00preferences.rpy:402
old "self voicing"
# Automatic translation.
new "自言自语"
# renpy/common/00preferences.rpy:411
old "self voicing volume drop"
# Automatic translation.
new "自我发声的音量下降"
# renpy/common/00preferences.rpy:419
old "clipboard voicing"
# Automatic translation.
new "剪贴板配音"
# renpy/common/00preferences.rpy:428
old "debug voicing"
new "debug voicing"
# renpy/common/00preferences.rpy:437
old "emphasize audio"
# Automatic translation.
new "强调音频"
# renpy/common/00preferences.rpy:446
old "rollback side"
# Automatic translation.
new "回滚方"
# renpy/common/00preferences.rpy:456
old "gl powersave"
# Automatic translation.
new "拯救生命的力量"
# renpy/common/00preferences.rpy:462
old "gl framerate"
# Automatic translation.
new "帧速率"
# renpy/common/00preferences.rpy:465
old "gl tearing"
new "gl tearing"
# renpy/common/00preferences.rpy:468
old "font transform"
# Automatic translation.
new "字体转换"
# renpy/common/00preferences.rpy:471
old "font size"
# Automatic translation.
new "字体大小"
# renpy/common/00preferences.rpy:479
old "font line spacing"
# Automatic translation.
new "字体行距"
# renpy/common/00preferences.rpy:487
old "system cursor"
# Automatic translation.
new "系统光标"
# renpy/common/00preferences.rpy:496
old "renderer menu"
# Automatic translation.
new "渲染器菜单"
# renpy/common/00preferences.rpy:499
old "accessibility menu"
# Automatic translation.
new "无障碍菜单"
# renpy/common/00preferences.rpy:502
old "high contrast text"
# Automatic translation.
new "高对比度文本"
# renpy/common/00preferences.rpy:511
old "audio when minimized"
# Automatic translation.
new "最小化时的音频"
# renpy/common/00preferences.rpy:531
old "main volume"
# Automatic translation.
new "主卷"
# renpy/common/00preferences.rpy:532
old "music volume"
# Automatic translation.
new "音量"
# renpy/common/00preferences.rpy:533
old "sound volume"
# Automatic translation.
new "音量"
# renpy/common/00preferences.rpy:534
old "voice volume"
# Automatic translation.
new "音量"
# renpy/common/00preferences.rpy:535
old "mute main"
# Automatic translation.
new "静音主"
# renpy/common/00preferences.rpy:536
old "mute music"
# Automatic translation.
new "静音音乐"
# renpy/common/00preferences.rpy:537
old "mute sound"
# Automatic translation.
new "静音"
# renpy/common/00preferences.rpy:538
old "mute voice"
# Automatic translation.
new "喑哑的声音"
# renpy/common/00preferences.rpy:539
old "mute all"
# Automatic translation.
new "全部静音"
# renpy/common/00preferences.rpy:620
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "剪贴板朗读已启用。按 Shift+C 来禁用。"
@@ -888,8 +606,7 @@
# renpy/common/_developer/inspector.rpym:185
old "<repr() failed>"
# Automatic translation.
new "<repr()失败>。"
new "<repr() 失败>"
# renpy/common/_layout/classic_load_save.rpym:170
old "a"
@@ -995,140 +712,94 @@
old "return"
new "返回"
translate schinese strings:
# renpy/common/00director.rpy:1745
old "Click to toggle attribute, right click to toggle negative attribute."
# Automatic translation.
new "点击切换属性,右击切换负面属性。"
new "点击切换属性,右键点击切换反面属性。"
# renpy/common/00director.rpy:1768
old "Click to set transform, right click to add to transform list."
# Automatic translation.
new "点击设置变换,右击添加到变换列表。"
new "点击设置变换,右键点击添加到变换列表。"
# renpy/common/00director.rpy:1789
old "Click to set, right click to add to behind list."
# Automatic translation.
new "点击设置,右击添加到后面的列表。"
new "点击设置,右键点击添加到置后(behind)列表。"
# 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?"
# Automatic translation.
new "这个保存文件是在不同的设备上创建的。恶意构建的保存文件会损害你的计算机。你相信这个保存文件的创建者和所有可能改变该文件的人吗?"
new "此存档是在其他设备上创建的。恶意构造的存档文件可能会对您的计算机造成损害。您是否信任此存档的创建者以及所有可能更改过该文件的人?"
# 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."
# Automatic translation.
new "你是否信任创建保存的设备?只有当你是该设备的唯一用户时,你才应该选择是。"
# renpy/common/00preferences.rpy:528
old "audio when unfocused"
# Automatic translation.
new "无焦点时的音频"
# renpy/common/00preferences.rpy:537
old "web cache preload"
# Automatic translation.
new "网络高速缓存预加载"
# renpy/common/00preferences.rpy:552
old "voice after game menu"
# Automatic translation.
new "游戏菜单后的语音"
new "您是否信任创建此存档的设备?只有当您是设备的唯一用户时,才应选择是。"
# renpy/common/00speechbubble.rpy:344
old "Speech Bubble Editor"
# Automatic translation.
new "语音泡编辑"
# renpy/common/00speechbubble.rpy:349
old "(hide)"
# Automatic translation.
new "(隐藏)"
new "对话气泡编辑器"
# renpy/common/00sync.rpy:70
old "Sync downloaded."
# Automatic translation.
new "同步下载。"
new "同步下载完成。"
# renpy/common/00sync.rpy:190
old "Could not connect to the Ren'Py Sync server."
# Automatic translation.
new "无法连接到Ren Py Sync服务器。"
new "无法连接到 Ren'Py 同步服务器。"
# renpy/common/00sync.rpy:192
old "The Ren'Py Sync server timed out."
# Automatic translation.
new "Ren'Py Sync服务器超时了。"
new "Ren'Py 同步服务器已超时。"
# renpy/common/00sync.rpy:194
old "An unknown error occurred while connecting to the Ren'Py Sync server."
# Automatic translation.
new "在连接到Ren Py Sync服务器时发生了一个未知的错误。"
new "在连接到 Ren'Py 同步服务器时发生了未知错误。"
# 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."
# Automatic translation.
new "Ren'Py Sync服务器没有这个同步的副本。同步ID可能是无效的,也可能是超时了。"
new "Ren'Py 同步服务器没有该同步副本。同步 ID 可能无效,或者可能已经超时。"
# renpy/common/00sync.rpy:409
old "Please enter the sync ID you generated.\nNever enter a sync ID you didn't create yourself."
# Automatic translation.
new "请输入你生成的同步ID。\n永远不要输入不是你自己创建的同步ID。"
new "请输入您生成的同步 ID。\n切勿输入并非由您创建的同步 ID。"
# renpy/common/00sync.rpy:428
old "The sync ID is not in the correct format."
# Automatic translation.
new "同步ID的格式不正确。"
new "同步 ID 的格式不正确。"
# renpy/common/00sync.rpy:448
old "The sync could not be decrypted."
# Automatic translation.
new "同步不能被解密。"
new "无法解密该同步。"
# renpy/common/00sync.rpy:471
old "The sync belongs to a different game."
# Automatic translation.
new "同步属于一个不同的游戏。"
new "该同步属于另一款游戏。"
# renpy/common/00sync.rpy:476
old "The sync contains a file with an invalid name."
# Automatic translation.
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?"
# Automatic translation.
new "这将把你的保存上传到{a=https://sync.renpy.org}Ren Py Sync Server{/a} 。\n你想继续吗?"
new "此操作将把您的存档上传到 {a=https://sync.renpy.org}Ren'Py 同步服务器{/a} 。\n您想要继续吗?"
# renpy/common/00sync.rpy:558
old "Enter Sync ID"
# Automatic translation.
new "输入同步ID"
new "输入同步 ID"
# renpy/common/00sync.rpy:569
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
# Automatic translation.
new "这将联系{a=https://sync.renpy.org}Ren'Py Sync Server{/a} 。"
new "此操作将联系 {a=https://sync.renpy.org}Ren'Py 同步服务器{/a}。"
# renpy/common/00sync.rpy:596
old "Sync Success"
# Automatic translation.
new "同步成功"
# renpy/common/00sync.rpy:599
old "The Sync ID is:"
# Automatic translation.
new "同步ID是:"
new "同步 ID 是:"
# renpy/common/00sync.rpy:605
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}."
# Automatic translation.
new "你可以使用这个ID在另一个设备上下载你的保存。\n这种同步将在一小时后失效。\nRen'Py Sync是由{a=https://www.renpy.org/sponsors.html}Ren'Py的赞助商{/a} 。"
new "你可以使用此 ID 在另一设备上下载您的存档。\n此同步将在一小时后失效。\nRen'Py 同步由{a=https://www.renpy.org/sponsors.html}Ren'Py 赞助者{/a}赞助。"
# renpy/common/00sync.rpy:631
old "Sync Error"
# Automatic translation.
new "同步错误"
+12 -22
View File
@@ -1,5 +1,13 @@
translate schinese strings:
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
new "持久化数据查看器"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
new "对话气泡编辑器(Shift+B"
# renpy/common/00console.rpy:492
old "Press <esc> to exit console. Type help for help.\n"
new "按 Esc 来退出控制台。输入 help 来查看帮助。\n"
@@ -12,9 +20,9 @@
old "Ren'Py script disabled."
new "Ren'Py 脚本已禁用。"
# renpy/common/00console.rpy:747
old "help: show this help"
new "help:显示此帮助信息"
# 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:752
old "commands:\n"
@@ -84,25 +92,7 @@
old "unescape: Disables escaping of unicode symbols in unicode strings and print it as is (default)."
new "unescape:禁止转义 Unicode 字符串中的 Unicode 符号,并按原样打印(默认)。"
translate schinese strings:
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
# Automatic translation.
new "持久性查看器"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
# Automatic translation.
new "语音泡泡编辑器(Shift+B"
# renpy/common/00console.rpy:789
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
# Automatic translation.
new "help: 显示此帮助\n help <expr>: 显示<expr>的签名和文件"
# 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"
# Automatic translation.
new "帮助可能会显示未记录的功能。请检查该函数或\n你想使用的类是有记录的。\n\n"
new "帮助功能可能会显示未记录文档的函数。请确认您想使用的函数或类是否已经被记录文档。\n\n"
-3
View File
@@ -432,10 +432,7 @@
old "## NVL-mode."
new "## NVL 模式。"
translate schinese strings:
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
# Automatic translation.
new "## 启用对屏幕或变换中无效或不稳定属性的检查"
+30 -88
View File
@@ -44,13 +44,9 @@
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
new "RAPT 已安装,但您还需要安装安卓 SDK 才可以构建安卓应用包。请继续安装 SDK。"
# game/android.rpy:37
old "RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore."
new "RAPT 已安装,但尚未配置密钥。请创建一个新密钥,或恢复 android.keystore 文件。"
# game/android.rpy:38
old "RAPT has been installed, but a bundle key hasn't been configured. Please create a new key, or restore bundle.keystore."
new "RAPT 已安装,但尚未配置 bundle 密钥。请创建一个新密钥,或恢复 bundle.keystore 文件。"
# game/android.rpy:39
old "RAPT has been installed, but a key hasn't been configured. Please generate new keys, or copy android.keystore and bundle.keystore to the base directory."
new "RAPT 已安装,但尚未配置密钥。请生成新的密钥,或 android.keystore 和 bundle.keystore 复制到基础目录中。"
# game/android.rpy:39
old "The current project has not been configured. Use \"Configure\" to configure it before building."
@@ -73,12 +69,16 @@
new "尝试模拟为安卓平板。\n\nEsc 和 PageUp 键将分别重映射为平板的菜单键和返回键。"
# game/android.rpy:45
old "Attempts to emulate a televison-based Android console, like the OUYA or Fire TV.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "尝试模拟为基于电视的安卓平台,例如 OUYA 或 Fire TV。\n\n键盘方向键将重映射为手柄方向键,Enter、Esc 和 PageUp 键将分别重映射为手柄的选择键、菜单键和返回键。"
old "Attempts to emulate a televison-based Android console.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "尝试模拟为基于电视的安卓游戏机。\n\n键盘方向键将重映射为手柄方向键,Enter、Esc 和 PageUp 键将分别重映射为手柄的选择键、菜单键和返回键。"
# game/android.rpy:47
old "Downloads and installs the Android SDK and supporting packages. Optionally, generates the keys required to sign the package."
new "下载并安装安卓 SDK 以及支持包。还可以选择生成对应用包进行签名所需的密钥。"
old "Downloads and installs the Android SDK and supporting packages."
new "下载并安装安卓 SDK 以及支持包。"
# game/android.rpy:49
old "Generates the keys required to sign the package."
new "生成对应用包进行签名所需的密钥。"
# game/android.rpy:48
old "Configures the package name, version, and other information about this project."
@@ -196,11 +196,6 @@
old "Other:"
new "其他:"
# game/android.rpy:452
old "Logcat"
# Automatic translation.
new "洛克特"
# game/android.rpy:456
old "List Devices"
new "列出设备"
@@ -354,12 +349,12 @@
new "版本号应仅含数字和点。"
# game/androidstrings.rpy:32
old "How much RAM do you want to allocate to Gradle?\n\nThis must be a positive integer number."
new "您打算给 Gradle 分配多少内存?\n\n必须为正整数。"
old "How much RAM (in GB) do you want to allocate to Gradle?\nThis must be a positive integer number."
new "您希望为 Gradle 分配多少 GB 的内存?\n\n必须为正整数。"
# game/androidstrings.rpy:33
old "The RAM size must contain only numbers."
new "内存大小应仅含数字。"
old "The RAM size must contain only numbers and be positive."
new "内存大小应为正整数。"
# game/androidstrings.rpy:34
old "How would you like your application to be displayed?"
@@ -497,11 +492,6 @@
old "Could not change the theme. Perhaps options.rpy was changed too much."
new "无法更改主题。可能 options.rpy 已被过度修改。"
# game/choose_theme.rpy:371
old "Planetarium"
# Automatic translation.
new "天文馆"
# game/choose_theme.rpy:426
old "Choose Theme"
new "选择主题"
@@ -778,11 +768,6 @@
old "Tutorial"
new "教程"
# game/front_page.rpy:133
old "The Question"
# Automatic translation.
new "问题"
# game/front_page.rpy:149
old "Active Project"
new "活跃项目"
@@ -1815,99 +1800,56 @@
old "Before packaging web apps, you'll need to download RenPyWeb, Ren'Py's web support. Would you like to download RenPyWeb now?"
new "在打包网页应用之前,您需要先下载 Ren'Py 网页支持包 RenPyWeb。您希望现在下载 RenPyWeb 吗?"
translate schinese strings:
# game/android.rpy:39
old "RAPT has been installed, but a key hasn't been configured. Please generate new keys, or copy android.keystore and bundle.keystore to the base directory."
# Automatic translation.
new "RAPT已经安装,但还没有配置密钥。请生成新的密钥,或将android.keystore和bundle.keystore复制到基本目录中。"
# game/android.rpy:46
old "Attempts to emulate a televison-based Android console.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button."
# Automatic translation.
new "试图模拟一个基于电视的安卓控制台。\n\n控制器的输入被映射到方向键上,回车键被映射到选择按钮上,Escape被映射到菜单按钮上,而PageUp被映射到返回按钮上。"
# game/android.rpy:48
old "Downloads and installs the Android SDK and supporting packages."
# Automatic translation.
new "下载并安装Android SDK和支持包。"
# game/android.rpy:49
old "Generates the keys required to sign the package."
# Automatic translation.
new "生成签署软件包所需的密钥。"
# game/android.rpy:383
old "Install SDK"
# Automatic translation.
new "安装SDK"
new "安装 SDK"
# game/android.rpy:387
old "Generate Keys"
# Automatic translation.
new "生成钥"
# game/androidstrings.rpy:32
old "How much RAM (in GB) do you want to allocate to Gradle?\nThis must be a positive integer number."
# Automatic translation.
new "你想给Gradle分配多少内存(GB)?\n这必须是一个正的整数。"
# game/androidstrings.rpy:33
old "The RAM size must contain only numbers and be positive."
# Automatic translation.
new "RAM大小必须只包含数字,并且是正数。"
new "生成钥"
# game/androidstrings.rpy:38
old "Which app store would you like to support in-app purchasing through?"
# Automatic translation.
new "你希望通过哪个应用商店支持应用内购买?"
# game/androidstrings.rpy:39
old "Google Play."
# Automatic translation.
new "谷歌游戏。"
new "您希望通过哪个应用商店支持应用内购买?"
# game/androidstrings.rpy:40
old "Amazon App Store."
# Automatic translation.
new "亚马逊应用商店。"
new "亚马逊(Amazon)应用商店。"
# game/androidstrings.rpy:41
old "Both, in one app."
# Automatic translation.
new "两者都是,在一个应用程序中。"
new "在一个应用程序中同时支持两者。"
# game/androidstrings.rpy:42
old "Neither."
# Automatic translation.
new "也没有。"
new "以上都不需要。"
# game/androidstrings.rpy:63
old "I found an android.keystore file in the rapt directory. Do you want to use this file?"
# Automatic translation.
new "我在rapt目录中发现了一个android.keystore文件。你想使用这个文件吗?"
new "我在 RAPT 目录中找到了一个 android.keystore 文件。您希望使用这个文件吗?"
# game/androidstrings.rpy:66
old "\n\nSaying 'No' will prevent key creation."
# Automatic translation.
new "\n\n说 \"不 \"将阻止钥匙的创建。"
new "\n\n选择“否”将阻止密钥创建。"
# game/androidstrings.rpy:69
old "I found a bundle.keystore file in the rapt directory. Do you want to use this file?"
# Automatic translation.
new "我在rapt目录中发现了一个bundle.keystore文件。你想使用这个文件吗?"
new "我在 RAPT 目录中找到了一个 bundle.keystore 文件。您希望使用这个文件吗?"
# game/distribute_gui.rpy:231
old "(DLC)"
new "(DLC)"
new "DLC"
# game/project.rpy:46
old "Lint checks your game for potential mistakes, and gives you statistics."
# Automatic translation.
new "林特检查你的游戏是否有潜在的错误,并给你统计。"
new "Lint 工具会检查您的游戏中可能的错误,并为您提供统计数据。"
# game/web.rpy:485
old "Creating package..."
# Automatic translation.
new "创建包..."
new "正在创建应用包……"
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
new "对 Ren'Py 发布版进行修正的每夜构建。"
+2 -10
View File
@@ -189,17 +189,9 @@
new "## 匹配为文档模式的文件会在 Mac 应用程序构建中被复制,因此它们同时出现在 APP 和 ZIP 文件中。"
# gui/game/options.rpy:203
old "## A Google Play license key is required to download expansion files and perform in-app purchases. It can be found on the \"Services & APIs\" page of the Google Play developer console."
new "## 下载扩展文件和执行应用内购需要一个 Google Play 许可密钥。许可密钥可以在 Google Play 开发者控制台的“服务和 API”页面找到。"
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 开发者控制台的“Monetize” > “Monetization Setup” > “Licensing”页面找到。"
# gui/game/options.rpy:210
old "## The username and project name associated with an itch.io project, separated by a slash."
new "## 与 itch.io 项目相关的用户名和项目名,以 / 分隔。"
translate schinese 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\"."
# Automatic translation.
new "##执行应用内购买需要一个Google Play许可证密钥。它可以在Google Play开发者控制台的 \"Monetize\" > \"Monetization Setup\" > \"Licensing \"下找到。"
+53 -71
View File
@@ -6,19 +6,19 @@
# gui/game/screens.rpy:81
old "## In-game screens"
new "## 游戏内界面"
new "## 游戏内屏幕"
# gui/game/screens.rpy:85
old "## Say screen"
new "## 对话界面"
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 "## 对话界面用于向用户显示对话。它需要两个参数,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 "## 此界面必须创建一个 id 为 what 的文本可视控件,因为 Ren'Py 使用它来管理文本显示。它还可以创建 id 为 who 和 id 为 window 的可视控件来应用样式属性。"
new "## 此屏幕必须创建一个 id 为 what 的文本可视控件,因为 Ren'Py 使用它来管理文本显示。它还可以创建 id 为 who 和 id 为 window 的可视控件来应用样式属性。"
# gui/game/screens.rpy:96
old "## https://www.renpy.org/doc/html/screen_special.html#say"
@@ -34,15 +34,15 @@
# gui/game/screens.rpy:165
old "## Input screen"
new "## 输入界面"
new "## 输入屏幕"
# 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 "## 此界面必须创建一个 id 为 input 的输入可视控件来接受各种输入参数。"
new "## 此屏幕必须创建一个 id 为 input 的输入可视控件来接受各种输入参数。"
# gui/game/screens.rpy:173
old "## https://www.renpy.org/doc/html/screen_special.html#input"
@@ -50,11 +50,11 @@
# gui/game/screens.rpy:200
old "## Choice screen"
new "## 选择界面"
new "## 选择屏幕"
# 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"
@@ -62,7 +62,7 @@
# gui/game/screens.rpy:234
old "## Quick Menu screen"
new "## 快捷菜单界面"
new "## 快捷菜单屏幕"
# gui/game/screens.rpy:236
old "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
@@ -70,7 +70,7 @@
# gui/game/screens.rpy:241
old "## Ensure this appears on top of other screens."
new "## 确保该菜单出现在其他界面之上,"
new "## 确保该菜单出现在其他屏幕之上,"
# gui/game/screens.rpy:252
old "Back"
@@ -106,19 +106,19 @@
# 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"
new "## 标题和游戏菜单界面"
new "## 标题和游戏菜单屏幕"
# gui/game/screens.rpy:283
old "## Navigation screen"
new "## 导航界面"
new "## 导航屏幕"
# 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"
@@ -138,7 +138,7 @@
# gui/game/screens.rpy:318
old "Main Menu"
new "标题界面"
new "标题菜单"
# gui/game/screens.rpy:320
old "About"
@@ -162,7 +162,7 @@
# gui/game/screens.rpy:344
old "## Main Menu screen"
new "## 标题菜单界面"
new "## 标题菜单屏幕"
# gui/game/screens.rpy:346
old "## Used to display the main menu when Ren'Py starts."
@@ -174,7 +174,7 @@
# gui/game/screens.rpy:352
old "## This ensures that any other menu screen is replaced."
new "## 此语句可确保替换掉任何其他菜单界面。"
new "## 此语句可确保替换掉任何其他菜单屏幕。"
# gui/game/screens.rpy:357
old "## This empty frame darkens the main menu."
@@ -182,19 +182,19 @@
# 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 "## use 语句将其他的界面包含进此界面。标题界面的实际内容在导航界面中。"
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\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
new "## scroll 参数可以是 None,也可以是 viewport 或 vpgrid。当此界面与一个或多个子界面同时使用,这些子界面将被嵌入(放置)在其中。"
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 "## scroll 参数可以是 None,也可以是 viewport 或 vpgrid。此屏幕旨在与一个或多个子屏幕同时使用,这些子屏幕将被嵌入(放置)在其中。"
# gui/game/screens.rpy:429
old "## Reserve space for the navigation section."
@@ -206,19 +206,19 @@
# gui/game/screens.rpy:534
old "## About screen"
new "## 关于界面"
new "## 关于屏幕"
# 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."
new "## 此界面没有什么特别之处,因此它也可以作为一个例子来说明如何制作一个自定义界面。"
new "## 此屏幕没有什么特别之处,因此它也可以作为一个例子来说明如何制作一个自定义屏幕。"
# 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 "## 此 use 语句将 game_menu 界面包含到了这个界面内。子级 vbox 将包含在 game_menu 界面的 viewport 内。"
new "## 此 use 语句将 game_menu 屏幕包含到了这个屏幕内。子级 vbox 将包含在 game_menu 屏幕的 viewport 内。"
# gui/game/screens.rpy:556
old "Version [config.version!t]\n"
@@ -234,11 +234,11 @@
# gui/game/screens.rpy:573
old "## Load and Save screens"
new "## 读取和保存界面"
new "## 读取和保存屏幕"
# gui/game/screens.rpy:575
old "## These screens are responsible for letting the player save the game and load it again. Since they share nearly everything in common, both are implemented in terms of a third screen, file_slots."
new "## 这些界面负责让用户保存游戏并能够再次读取。由于它们几乎完全一样,因此这两个界面都是以第三个界面 file_slots 来实现的。"
new "## 这些屏幕负责让用户保存游戏并能够再次读取。由于它们几乎完全一样,因此这两个屏幕都是以第三个屏幕 file_slots 来实现的。"
# gui/game/screens.rpy:579
old "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
@@ -302,11 +302,11 @@
# gui/game/screens.rpy:704
old "## Preferences screen"
new "## 设置界面"
new "## 设置屏幕"
# gui/game/screens.rpy:706
old "## The preferences screen allows the player to configure the game to better suit themselves."
new "## 设置界面允许用户配置游戏,使其更适合自己。"
new "## 设置屏幕允许用户配置游戏,使其更适合自己。"
# gui/game/screens.rpy:709
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
@@ -371,11 +371,11 @@
# gui/game/screens.rpy:863
old "## History screen"
new "## 历史界面"
new "## 历史屏幕"
# 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,7 +383,7 @@
# 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."
@@ -399,15 +399,15 @@
# 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"
new "## 帮助界面"
new "## 帮助屏幕"
# 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"
@@ -554,15 +554,15 @@
# gui/game/screens.rpy:1117
old "## Additional screens"
new "## 其他界面"
new "## 其他屏幕"
# gui/game/screens.rpy:1121
old "## Confirm screen"
new "## 确认界面"
new "## 确认屏幕"
# 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"
@@ -570,7 +570,7 @@
# 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"
@@ -586,11 +586,11 @@
# gui/game/screens.rpy:1184
old "## Skip indicator screen"
new "## 快进指示界面"
new "## 快进指示屏幕"
# 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"
@@ -610,11 +610,11 @@
# 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"
@@ -622,11 +622,11 @@
# gui/game/screens.rpy:1279
old "## NVL screen"
new "## NVL 模式界面"
new "## NVL 模式屏幕"
# gui/game/screens.rpy:1281
old "## This screen is used for NVL-mode dialogue and menus."
new "## 此界面用于 NVL 模式的对话和菜单。"
new "## 此屏幕用于 NVL 模式的对话和菜单。"
# gui/game/screens.rpy:1283
old "## https://www.renpy.org/doc/html/screen_special.html#nvl"
@@ -637,8 +637,8 @@
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, as it is above."
new "## 显示菜单,如果给定的话。如果 config.narrator_menu 设置为 True,则菜单可能显示不正确,就像上面那样。"
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,则菜单可能显示不正确。"
# gui/game/screens.rpy:1337
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
@@ -656,41 +656,23 @@
old "Menu"
new "菜单"
translate schinese strings:
# gui/game/screens.rpy:676
old "Upload Sync"
# Automatic translation.
new "上传同步"
# gui/game/screens.rpy:680
old "Download Sync"
# Automatic translation.
new "下载同步器"
# gui/game/screens.rpy:1320
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True."
# Automatic translation.
new "## 显示菜单,如果给定的话。如果config.narrator_menu被设置为True,菜单可能会被错误地显示。"
new "下载同步"
# gui/game/screens.rpy:1410
old "## Bubble screen"
# Automatic translation.
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."
# Automatic translation.
new "## 泡泡屏幕用于在使用语音泡泡时向玩家显示对话。泡泡屏的参数与say屏相同,必须创建一个id为 \"what \"的可显示文件,并且可以创建id为 \"namebox\"、\"who \"和 \"window \"的可显示文件。"
new "## 对话气泡屏幕用于以对话气泡的形式向玩家显示对话。对话气泡屏幕的参数与 say 屏幕相同,必须创建一个 id 为 what 的可视控件,并且可以创建 id 为 namebox、who 和 window 的可视控件。"
# gui/game/screens.rpy:1417
old "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
new "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
translate schinese strings:
# 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."
# Automatic translation.
new "##滚动参数可以是无,或者是 \"viewport \"或 \"vpgrid \"中的一个。这个屏幕旨在与一个或多个孩子一起使用,这些孩子被反括(放置)在它里面。"
+5
View File
@@ -889,3 +889,8 @@ translate spanish strings:
# renpy/common/00sync.rpy:619
old "Sync Error"
new "Error de sincronización"
# renpy/common/00speechbubble.rpy:391
old "(clear retained bubbles)"
new "(borrar burbujas retenidas)"
+6
View File
@@ -435,3 +435,9 @@
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
new "## Habilitar comprobaciones de propiedades no válidas o inestables en pantallas o transformaciones."
# gui/game/gui.rpy:347
old "## Additional space to add between history screen entries."
new "## Espacio adicional para añadir entre las entradas de la pantalla de historial."
+40 -9
View File
@@ -1185,7 +1185,7 @@
# updater.rpy:91
old "Release"
new "Lanzamiento"
new "Estable"
# updater.rpy:97
old "{b}Recommended.{/b} The version of Ren'Py that should be used in all newly-released games."
@@ -1193,7 +1193,7 @@
# updater.rpy:102
old "Prerelease"
new "Prelanzamiento"
new "Preliminar"
# updater.rpy:108
old "A preview of the next version of Ren'Py that can be used for testing and taking advantage of new features, but not for final releases of games."
@@ -1267,8 +1267,6 @@
old "Proceed"
new "Continuar"
translate spanish strings:
# game/add_file.rpy:37
old "The file name may not be empty."
new "El nombre del archivo no puede estar vacío."
@@ -1279,11 +1277,11 @@ translate spanish strings:
# game/android.rpy:50
old "Selects the Debug build, which can be accessed through Android Studio. Changing between debug and release builds requires an uninstall from your device."
new "Selecciona la versión de depuración, a la que se puedes acceder a través de Android Studio. Cambiar entre las compilaciones de depuración y de versión requiere una desinstalación de su dispositivo."
new "Selecciona la versión de depuración, a la que se puedes acceder a través de Android Studio. Cambiar entre las compilaciones de depuración y estable requiere una desinstalación de su dispositivo."
# game/android.rpy:51
old "Selects the Release build, which can be uploaded to stores. Changing between debug and release builds requires an uninstall from your device."
new "Selecciona la versión de lanzamiento, que se puede cargar en las tiendas. Cambiar entre las compilaciones de depuración y de versión requiere una desinstalación de su dispositivo."
new "Selecciona la versión estable, que se puede cargar en las tiendas. Cambiar entre las compilaciones de depuración y estable requiere una desinstalación de su dispositivo."
# game/androidstrings.rpy:7
old "{} is not a directory."
@@ -2007,7 +2005,7 @@ translate spanish strings:
# game/web.rpy:344
old "We will restore support in a future release of Ren'Py 8. Until then, please use Ren'Py 7 for web support."
new "Restauraremos el soporte en una versión futura de Ren'Py 8. Hasta entonces, use Ren'Py 7 para soporte web."
new "Restauraremos el soporte en una versión estable futura de Ren'Py 8. Hasta entonces, use Ren'Py 7 para soporte web."
# game/preferences.rpy:104
old "General"
@@ -2047,11 +2045,11 @@ translate spanish strings:
# game/updater.rpy:77
old "Nightly (Ren'Py 8, Python 3)"
new "Nightly (Ren'Py 8, Python 3)"
new "Nocturna (Ren'Py 8, Python 3)"
# game/updater.rpy:78
old "Nightly (Ren'Py 7, Python 2)"
new "Nightly (Ren'Py 7, Python 2)"
new "Nocturna (Ren'Py 7, Python 2)"
# game/preferences.rpy:327
old "{#in language font}Welcome! Please choose a language"
@@ -2116,3 +2114,36 @@ translate spanish strings:
# game/androidstrings.rpy:69
old "I found a bundle.keystore file in the rapt directory. Do you want to use this file?"
new "He encontrado un archivo bundle.keystore en el directorio rapt. ¿Quieres usar este archivo?"
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
new "Compilación nocturna de correcciones para la versión estable de Ren'Py."
# game/updater.rpy:76
old "Nightly Fix"
new "Correciones nocturnas"
# game/updater.rpy:77
old "Nightly Fix (Ren'Py 8, Python 3)"
new "Correciones nocturnas (Ren'Py 8, Python 3)"
# game/updater.rpy:78
old "Nightly Fix (Ren'Py 7, Python 2)"
new "Correciones nocturnas (Ren'Py 7, Python 2)"
# game/choose_directory.rpy:72
old "No directory was selected, but one is required."
new "No se seleccionó un directorio, pero uno requerido."
# game/choose_directory.rpy:79
old "The selected directory does not exist."
new "El directorio seleccionado no existe."
# game/choose_directory.rpy:81
old "The selected directory is not writable."
new "No se puede escribir en el directorio seleccionado."
# game/distribute.rpy:554
old "This may be derived from build.name and config.version or build.version."
new "Puede derivarse de build.name y config.version o build.version."
+8
View File
@@ -2095,3 +2095,11 @@ translate turkish strings:
# Automatic translation.
new "Web uygulamalarını paketlemeden önce, Ren'Py'nin web desteği olan RenPyWeb'i indirmeniz gerekir. RenPyWeb'i şimdi indirmek ister misiniz?"
translate turkish strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
# Automatic translation.
new "Ren'Py'nin sürümüne yönelik düzeltmelerden oluşan bir gece derlemesi."
+12 -42
View File
@@ -924,151 +924,121 @@ translate ukrainian strings:
# renpy/common/00accessibility.rpy:186
old "Disable"
# Automatic translation.
new "Вимкнути"
# renpy/common/00accessibility.rpy:209
old "Debug"
# Automatic translation.
new "Налагодження"
# renpy/common/00action_other.rpy:721
old "Open [text] directory."
# Automatic translation.
new "Відкрийте каталог [text]."
new "Відкрити теку [text]."
# renpy/common/00director.rpy:1745
old "Click to toggle attribute, right click to toggle negative attribute."
# Automatic translation.
new "Клацніть, щоб увімкнути атрибут, клацніть правою кнопкою миші, щоб увімкнути від'ємний атрибут."
new "Клацніть, аби увімкнути атрибут, клацніть ПКМ, аби увімкнути від’ємний атрибут."
# renpy/common/00director.rpy:1768
old "Click to set transform, right click to add to transform list."
# Automatic translation.
new "Клацніть, щоб встановити трансформацію, клацніть правою кнопкою миші, щоб додати до списку трансформацій."
new "Клацніть, щоб встановити трансформацію, клацніть ПКМ, щоб додати до списку трансформацій."
# renpy/common/00director.rpy:1789
old "Click to set, right click to add to behind list."
# Automatic translation.
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?"
# Automatic translation.
new "Це збереження було створено на іншому пристрої. Зловмисно створені файли збережень можуть завдати шкоди вашому комп'ютеру. Чи довіряєте ви творцю цього збереження і всім, хто міг змінити файл?"
# 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."
# Automatic translation.
new "Чи довіряєте ви пристрою, на якому було створено збереження? Ви повинні вибрати \"так\", тільки якщо ви є єдиним користувачем пристрою."
new "Чи довіряєте ви пристрою, на якому було створено збереження? Ви повинні вибрати \"Так\", тільки якщо ви є єдиним користувачем пристрою."
# renpy/common/00preferences.rpy:528
old "audio when unfocused"
# Automatic translation.
new "звук при розфокусуванні"
# renpy/common/00preferences.rpy:537
old "web cache preload"
# Automatic translation.
new "попереднє завантаження веб-кешу"
# renpy/common/00preferences.rpy:552
old "voice after game menu"
# Automatic translation.
new "голос після ігрового меню"
# renpy/common/00speechbubble.rpy:344
old "Speech Bubble Editor"
# Automatic translation.
new "Редактор мовних бульбашок"
# renpy/common/00speechbubble.rpy:349
old "(hide)"
# Automatic translation.
new "(приховати)"
# renpy/common/00sync.rpy:70
old "Sync downloaded."
# Automatic translation.
new "Синхронізація завантажена."
new "Синхронізацію завантажено."
# renpy/common/00sync.rpy:190
old "Could not connect to the Ren'Py Sync server."
# Automatic translation.
new "Не вдалося підключитися до сервера Ren'Py Sync."
# renpy/common/00sync.rpy:192
old "The Ren'Py Sync server timed out."
# Automatic translation.
new "Сервер Ren'Py Sync вийшов з ладу."
# renpy/common/00sync.rpy:194
old "An unknown error occurred while connecting to the Ren'Py Sync server."
# Automatic translation.
new "Під час підключення до сервера Ren'Py Sync виникла невідома помилка."
# 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."
# Automatic translation.
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."
# Automatic translation.
new "Будь ласка, введіть згенерований вами ідентифікатор синхронізації.\nНіколи не вводьте ідентифікатор синхронізації, який ви не створювали."
# renpy/common/00sync.rpy:428
old "The sync ID is not in the correct format."
# Automatic translation.
new "Ідентифікатор синхронізації має неправильний формат."
# renpy/common/00sync.rpy:448
old "The sync could not be decrypted."
# Automatic translation.
new "Синхронізацію не вдалося розшифрувати."
# renpy/common/00sync.rpy:471
old "The sync belongs to a different game."
# Automatic translation.
new "Синхронізація належить до іншої гри."
# renpy/common/00sync.rpy:476
old "The sync contains a file with an invalid name."
# Automatic translation.
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?"
# Automatic translation.
new "Це завантажить ваші збереження на сервер синхронізації {a=https://sync.renpy.org}Ren'Py Sync Server{/a}.\nХочете продовжити?"
new "Це завантажить ваші збереження на сервер синхронізації {a=https://sync.renpy.org}Ren'Py Sync{/a}.\nБажаєте продовжити?"
# renpy/common/00sync.rpy:558
old "Enter Sync ID"
# Automatic translation.
new "Введіть Sync ID"
new "Уведіть ідентифікатор синхронізації"
# renpy/common/00sync.rpy:569
old "This will contact the {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
# Automatic translation.
new "Він зв'яжеться з сервером синхронізації {a=https://sync.renpy.org}Ren'Py Sync Server{/a}."
new "Зв’язок зі сервером синхронізації {a=https://sync.renpy.org}Ren'Py Sync{/a}."
# renpy/common/00sync.rpy:596
old "Sync Success"
# Automatic translation.
new "Успіх синхронізації"
new "Успішна синхронізація"
# renpy/common/00sync.rpy:599
old "The Sync ID is:"
# Automatic translation.
new "Ідентифікатор синхронізації:"
# renpy/common/00sync.rpy:605
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}."
# Automatic translation.
new "Ви можете використовувати цей ідентифікатор, щоб завантажити збереження на інший пристрій.\nЦя синхронізація закінчиться через годину.\nRen'Py Sync підтримується {a=https://www.renpy.org/sponsors.html}Спонсорами Ren'Py{/a}."
new "Ви можете використовувати цей ідентифікатор, щоб завантажити збереження на інший пристрій.\nЦя синхронізація закінчиться через годину.\nRen'Py Sync підтримується {a=https://www.renpy.org/sponsors.html}спонсорами Ren'Py{/a}."
# renpy/common/00sync.rpy:631
old "Sync Error"
# Automatic translation.
new "Помилка синхронізації"
+3 -7
View File
@@ -93,21 +93,17 @@ translate ukrainian strings:
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
# Automatic translation.
new "Постійний глядач"
new "Переглядач постійних даних"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
# Automatic translation.
new "Редактор мовних бульбашок (Shift+B)"
# renpy/common/00console.rpy:789
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
# Automatic translation.
new "help: показати цю довідку\n help <expr>: показати підпис та документацію <expr>"
# 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"
# Automatic translation.
new "Довідка може відображати недокументовані функції. Будь ласка, перевірте, чи функція або\nклас, який ви хочете використовувати, задокументовано.\n\n"
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"
+37 -37
View File
@@ -3,23 +3,23 @@ translate ukrainian strings:
# 00gltest.rpy:70
old "Renderer"
new "Рендер"
new "Візуалізація"
# 00gltest.rpy:74
old "Automatically Choose"
new "Вибирати Автоматично"
new "Вибрати автоматично"
# 00gltest.rpy:79
old "Force Angle/DirectX Renderer"
new "Примусовий Angle/DirectX"
new "Примусова візуалізація Angle/DirectX"
# 00gltest.rpy:83
old "Force OpenGL Renderer"
new "Примусовий OpenGL"
new "Примусова візуалізація OpenGL"
# 00gltest.rpy:87
old "Force Software Renderer"
new "Примусовий Програмний"
new "Примусова програмна візуалізація"
# 00gltest.rpy:93
old "NPOT"
@@ -27,11 +27,11 @@ translate ukrainian strings:
# 00gltest.rpy:97
old "Enable"
new "Активовано"
new "Увімкнути"
# 00gltest.rpy:131
old "Powersave"
new "Економія енергії"
new "Енергозбереження"
# 00gltest.rpy:145
old "Framerate"
@@ -59,23 +59,23 @@ translate ukrainian strings:
# 00gltest.rpy:213
old "Performance Warning"
new "Попередження Продуктивності"
new "Попередження про продуктивність"
# 00gltest.rpy:218
old "This computer is using software rendering."
new "Цей комп'ютер використовує програмний рендеринг."
new "Цей пристрій використовує програмну візуалізацію."
# 00gltest.rpy:220
old "This computer is not using shaders."
new "Цей комп'ютер не використовує шейдерів."
new "Цей пристрій не використовує шейдерів."
# 00gltest.rpy:222
old "This computer is displaying graphics slowly."
new "Цей комп'ютер повільно відображає графіку."
new "Цей пристрій повільно відображає графіку."
# 00gltest.rpy:224
old "This computer has a problem displaying graphics: [problem]."
new "Цей комп'ютер має проблему з відображенням графіки: [problem]"
new "Цей пристрій має проблему з відображенням графіки: [problem]"
# 00gltest.rpy:229
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
@@ -91,11 +91,11 @@ translate ukrainian strings:
# 00gltest.rpy:242
old "Continue, Show this warning again"
new "Продовжити, показати це попередження знову"
new "Продовжити, показати знову"
# 00gltest.rpy:246
old "Continue, Don't show warning again"
new "Продовжити, не показувати це попередження знову."
new "Продовжити, не показувати знову."
# 00gltest.rpy:264
old "Updating DirectX."
@@ -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 за замовчуванням намагається встановити панель інструментів Bing. Якщо ви цього не хочете, зніміть відповідну галочку."
new "{b}Примітка:{/b} Інсталятор DirectX за замовчуванням намагається встановити панель інструментів Bing. Якщо ви цього не хочете, зніміть відповідну галочку."
# 00gltest.rpy:276
old "When setup finishes, please click below to restart this program."
new "Після завершення інсталяції клацніть, щоб перезапустити програму."
new "Після завершення налаштування, натисніть нижче, щоб перезапустити програму."
# 00gltest.rpy:278
old "Restart"
@@ -119,7 +119,7 @@ translate ukrainian strings:
# 00gamepad.rpy:32
old "Select Gamepad to Calibrate"
new "Виберіть Геймпад для калібрування"
new "Виберіть геймпад для калібрування"
# 00gamepad.rpy:35
old "No Gamepads Available"
@@ -127,11 +127,11 @@ translate ukrainian strings:
# 00gamepad.rpy:54
old "Calibrating [name] ([i]/[total])"
new "Калібрую [name] ([i]/[total])"
new "Калібрування [name] ([i]/[total])"
# 00gamepad.rpy:58
old "Press or move the [control!s] [kind]."
new "Натисніть або посуньте [control!s] [kind]."
new "Натисніть або перемістіть [control!s] [kind]."
# 00gamepad.rpy:66
old "Skip (A)"
@@ -143,7 +143,7 @@ translate ukrainian strings:
# _errorhandling.rpym:529
old "Open"
new "Журнал"
new "Відкрити"
# _errorhandling.rpym:531
old "Opens the traceback.txt file in a text editor."
@@ -159,15 +159,15 @@ translate ukrainian strings:
# _errorhandling.rpym:562
old "An exception has occurred."
new "Виник виняток."
new "Стався виняток."
# _errorhandling.rpym:582
old "Rollback"
new "Назад"
new "Відкат"
# _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"
@@ -187,7 +187,7 @@ translate ukrainian strings:
# _errorhandling.rpym:599
old "Reloads the game from disk, saving and restoring game state if possible."
new "Перезавантажує гру з диска, зберігаючи та відновлюючи її стан, якщо це можливо."
new "Перезавантажує гру з диска, зберігаючи та відновлюючи її стан, якщо можливо."
# _errorhandling.rpym:602
old "Console"
@@ -203,7 +203,7 @@ translate ukrainian strings:
# _errorhandling.rpym:638
old "Parsing the script failed."
new "Опрацювання сценарію завершилося невдало."
new "Опрацювання скрипту завершилося невдало."
# _errorhandling.rpym:664
old "Opens the errors.txt file in a text editor."
@@ -215,7 +215,7 @@ translate ukrainian strings:
# _errorhandling.rpym:542
old "Copy BBCode"
new "Копіювати як BBCode"
new "Копіювати BBCode"
# _errorhandling.rpym:544
old "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/."
@@ -223,11 +223,11 @@ translate ukrainian strings:
# _errorhandling.rpym:546
old "Copy Markdown"
new "Скопіювати як Markdown"
new "Копіювати Markdown"
# _errorhandling.rpym:548
old "Copies the traceback.txt file to the clipboard as Markdown for Discord."
new "Копіює файл traceback.txt у буфер обміну як Markdown для Дискорду."
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/."
@@ -239,27 +239,27 @@ translate ukrainian strings:
# renpy/common/00gltest.rpy:100
old "Force GL Renderer"
new "Примусовий рендеринг GL"
new "Примусова візуалізація GL"
# renpy/common/00gltest.rpy:105
old "Force ANGLE Renderer"
new "Примусовий рендеринг ANGLE"
new "Примусова візуалізація ANGLE"
# renpy/common/00gltest.rpy:110
old "Force GLES Renderer"
new "Примусовий рендеринг GLES"
new "Примусова візуалізація GLES"
# renpy/common/00gltest.rpy:116
old "Force GL2 Renderer"
new "Примусовий рендеринг GL2"
new "Примусова візуалізація GL2"
# renpy/common/00gltest.rpy:121
old "Force ANGLE2 Renderer"
new "Примусовий рендеринг ANGLE2"
new "Примусова візуалізація ANGLE2"
# renpy/common/00gltest.rpy:126
old "Force GLES2 Renderer"
new "Примусовий рендеринг GLES2"
new "Примусова візуалізація GLES2"
# renpy/common/00gltest.rpy:245
old "This game requires use of GL2 that can't be initialised."
@@ -279,8 +279,8 @@ 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."
new "Файл {a=edit:1:log.txt}log.txt{/a} може містити інформацію, яка допоможе вам визначити, що не так з вашим комп'ютером."
new "Файл {a=edit:1:log.txt}log.txt{/a} може містити інформацію, яка допоможе вам визначити, що не так з вашим пристроєм."
+1 -2
View File
@@ -437,6 +437,5 @@ translate ukrainian strings:
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
# Automatic translation.
new "## Увімкнути перевірку на невірні або нестабільні властивості в екранах або перетвореннях"
new "## Увімкнути перевірку недійсних або нестабільних властивостей у екранах або перетвореннях"
+64 -77
View File
@@ -35,11 +35,11 @@ translate ukrainian strings:
# game/android.rpy:34
old "To build Android packages, please download RAPT, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher."
new "Щоб створити пакети Android, завантажте RAPT, розархівуйте його та помістіть у каталог Ren'Py. Потім перезапустіть лаунчер Ren'Py."
new "Щоб створити пакети Android, завантажте RAPT, розархівуйте його та помістіть у теку Ren'Py. Потім перезапустіть лаунчер Ren'Py."
# game/android.rpy:35
old "A 64-bit/x64 Java [JDK_REQUIREMENT] Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Для створення пакетів Android у Windows потрібен 64-розрядний/x64 Java 8 Development Kit. JDK відрізняється від JRE, тому можливо, що у вас є Java без JDK.\n\nБудь ласка, {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}завантажте та встановіть JDK{/a}, а потім перезапустіть лаунчер Ren'Py."
new "Для створення пакетів Android у Windows потрібен 64-розрядний/x64 Java [JDK_REQUIREMENT] Development Kit. JDK відрізняється від JRE, тому можливо, що у вас є Java без JDK.\n\nБудь ласка, {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}завантажте та встановіть JDK{/a}, а потім перезапустіть лаунчер Ren'Py."
# game/android.rpy:36
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
@@ -135,12 +135,11 @@ translate ukrainian strings:
# game/android.rpy:266
old "Copying Android files to distributions directory."
new "Копіювання файлів Android в каталог дистрибутивів."
new "Копіювання файлів Android в теку дистрибутивів."
# game/android.rpy:335
old "Android: [project.current.display_name!q]"
# Automatic translation.
new "Андроїд: [project.current.display_name!q]"
new "Android: [project.current.display_name!q]"
# game/android.rpy:355
old "Emulation:"
@@ -156,23 +155,23 @@ translate ukrainian strings:
# game/android.rpy:372
old "Television"
new "Телебачення"
new "Телевізор"
# game/android.rpy:384
old "Build:"
new "Створити:"
new "Зібрати:"
# game/android.rpy:391
old "Install SDK & Create Keys"
new "Встановити SDK і створити ключі"
new "Установити SDK і створити ключі"
# game/android.rpy:395
old "Configure"
new "Налаштування"
new "Налаштувати"
# game/android.rpy:401
old "Play Bundle"
new "Пакетна гра"
new "Пакет гри"
# game/android.rpy:406
old "Universal APK"
@@ -184,7 +183,7 @@ translate ukrainian strings:
# game/android.rpy:417
old "Build & Install"
new "Створити та встановити"
new "Створити й встановити"
# game/android.rpy:421
old "Build, Install & Launch"
@@ -260,7 +259,7 @@ translate ukrainian strings:
# game/androidstrings.rpy:7
old "{} is not a directory."
new "{} не є каталогом."
new "{} не є текою."
# game/androidstrings.rpy:8
old "{} does not contain a Ren'Py game."
@@ -276,7 +275,7 @@ translate ukrainian strings:
# game/androidstrings.rpy:12
old "Creating assets directory."
new "Створення каталогу ресурсів."
new "Створення теки ресурсів."
# game/androidstrings.rpy:13
old "Packaging internal data."
@@ -480,7 +479,7 @@ translate ukrainian strings:
# 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."
new "Я відкрив каталог, що містить android.keystore і bundle.keystore. Створіть їх резервні копії та зберігайте в безпечному місці."
new "Відкрито теку, яка містить android.keystore і bundle.keystore. Створіть їх резервні копії та збережіть в безпечному місці."
# game/androidstrings.rpy:65
old "It looks like you're ready to start packaging games."
@@ -488,11 +487,11 @@ translate ukrainian strings:
# game/choose_directory.rpy:67
old "Select Projects Directory"
new "Виберіть каталог проєктів"
new "Виберіть теку проєктів"
# game/choose_directory.rpy:79
old "The selected projects directory is not writable."
new "Вибраний каталог проєктів не доступний для запису."
new "Вибрана тека проєктів не доступна для запису."
# game/choose_theme.rpy:304
old "Could not change the theme. Perhaps options.rpy was changed too much."
@@ -504,7 +503,7 @@ translate ukrainian strings:
# game/choose_theme.rpy:426
old "Choose Theme"
new "Вибрати Тему"
new "Вибрати тему"
# game/choose_theme.rpy:439
old "Theme"
@@ -596,7 +595,7 @@ translate ukrainian strings:
# game/distribute_gui.rpy:171
old "Directory Name:"
new "Назва каталогу:"
new "Назва теки:"
# game/distribute_gui.rpy:175
old "Executable Name:"
@@ -728,8 +727,7 @@ translate ukrainian strings:
# game/editor.rpy:245
old "None"
# Automatic translation.
new "Ні."
new "Немає"
# game/editor.rpy:245
old "Prevents Ren'Py from opening a text editor."
@@ -769,7 +767,6 @@ translate ukrainian strings:
# game/front_page.rpy:114
old "[p.name!q] (template)"
# Automatic translation.
new "[p.name!q] (шаблон)"
# game/front_page.rpy:116
@@ -790,7 +787,7 @@ translate ukrainian strings:
# game/front_page.rpy:157
old "Open Directory"
new "Відкрити каталог"
new "Відкрити теку"
# game/front_page.rpy:162
old "game"
@@ -990,7 +987,7 @@ translate ukrainian strings:
# game/install.rpy:185
old "The {a=https://www.live2d.com/en/download/cubism-sdk/download-native/}Cubism SDK for Native{/a} adds support for displaying Live2D models. Place CubismSdkForNative-4-{i}version{/i}.zip in the Ren'Py SDK directory, and then click Install. Distributing a game with Live2D requires you to accept a license from Live2D, Inc."
new "{a=https://www.live2d.com/en/download/cubism-sdk/download-native/}Cubism SDK for Native{/a} додає підтримку відображення моделей Live2D. Помістіть CubismSdkForNative-4-{i}version{/i}.zip у каталог Ren'Py SDK і натисніть «Встановити». Розповсюдження гри за допомогою Live2D вимагає від вас прийняти ліцензію від Live2D, Inc."
new "{a=https://www.live2d.com/en/download/cubism-sdk/download-native/}Cubism SDK for Native{/a} додає підтримку відображення моделей Live2D. Помістіть CubismSdkForNative-4-{i}version{/i}.zip у теку Ren'Py SDK і натисніть «Встановити». Розповсюдження гри за допомогою Live2D вимагає від вас прийняти ліцензію від Live2D, Inc."
# game/install.rpy:189
old "Live2D in Ren'Py doesn't support the Web, Android x86_64 (including emulators and Chrome OS), and must be added to iOS projects manually. Live2D must be reinstalled after upgrading Ren'Py or installing Android support."
@@ -998,7 +995,7 @@ translate ukrainian strings:
# game/install.rpy:194
old "Open Ren'Py SDK Directory"
new "Відкрийте каталог Ren'Py SDK"
new "Відкрийте теку Ren'Py SDK"
# game/installer.rpy:10
old "Downloading [extension.download_file]."
@@ -1042,7 +1039,7 @@ translate ukrainian strings:
# game/interface.rpy:269
old "Due to package format limitations, non-ASCII file and directory names are not allowed."
new "Через обмеження формату пакетів імена файлів і каталогів, відмінні від ASCII, заборонені."
new "Через обмеження формату пакетів імена файлів і тек, відмінні від ASCII, заборонені."
# game/interface.rpy:365
old "ERROR"
@@ -1066,15 +1063,15 @@ translate ukrainian strings:
# game/interface.rpy:437
old "File and directory names may not contain / or \\."
new "Імена файлів і каталогів не можуть містити / або \\."
new "Назви файлів і тек не можуть містити / або \\."
# game/interface.rpy:443
old "File and directory names must consist of ASCII characters."
new "Імена файлів і каталогів повинні складатися з символів ASCII."
new "Назви файлів і тек повинні бути зі символів ASCII."
# game/interface.rpy:511
old "PROCESSING"
new "ОБРОБКА"
new "ОБРОБЛЕННЯ"
# game/interface.rpy:528
old "QUESTION"
@@ -1086,11 +1083,11 @@ translate ukrainian strings:
# game/ios.rpy:28
old "To build iOS packages, please download renios, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher."
new "Щоб створити пакети iOS, завантажте renios, розпакуйте його та помістіть у каталог Ren'Py. Потім перезапустіть лаунчер Ren'Py."
new "Щоб створити пакети iOS, завантажте renios, розпакуйте його та помістіть у теку Ren'Py. Потім перезапустіть лаунчер Ren'Py."
# game/ios.rpy:29
old "The directory in where Xcode projects will be placed has not been selected. Choose 'Select Directory' to select it."
new "Каталог, у якому будуть розміщені проєкти Xcode, не вибрано. Виберіть «Вибрати каталог», щоб вибрати його."
new "Тека, у якій будуть розміщені проєкти Xcode, не вибрано. Виберіть «Вибрати теку», аби вибрати її."
# game/ios.rpy:30
old "There is no Xcode project corresponding to the current Ren'Py project. Choose 'Create Xcode Project' to create one."
@@ -1110,7 +1107,7 @@ translate ukrainian strings:
# game/ios.rpy:36
old "Selects the directory where Xcode projects will be placed."
new "Вибирає каталог, де будуть розміщені проєкти Xcode."
new "Вибирає теку, де будуть розміщені проєкти Xcode."
# game/ios.rpy:37
old "Creates an Xcode project corresponding to the current Ren'Py project."
@@ -1126,7 +1123,7 @@ translate ukrainian strings:
# game/ios.rpy:41
old "Opens the directory containing Xcode projects."
new "Відкриває каталог, що містить проєкти Xcode."
new "Відкриває теку, яка містить проєкти Xcode."
# game/ios.rpy:139
old "The Xcode project already exists. Would you like to rename the old project, and replace it with a new one?"
@@ -1146,7 +1143,7 @@ translate ukrainian strings:
# game/ios.rpy:322
old "Select Xcode Projects Directory"
new "Виберіть каталог проєктів Xcode"
new "Виберіть теку проєктів Xcode"
# game/ios.rpy:326
old "Create Xcode Project"
@@ -1162,7 +1159,7 @@ translate ukrainian strings:
# game/ios.rpy:358
old "Open Xcode Projects Directory"
new "Відкрити каталог проєктів Xcode"
new "Відкрити теку проєктів Xcode"
# game/ios.rpy:379
old "There are known issues with the iOS simulator on Apple Silicon. Please test on x86_64 or iOS devices."
@@ -1174,15 +1171,15 @@ translate ukrainian strings:
# game/ios.rpy:404
old "XCODE PROJECTS DIRECTORY"
new "КАТАЛОГ ПРОЄКТІВ XCODE"
new "ТЕКА ПРОЄКТІВ XCODE"
# game/ios.rpy:404
old "Please choose the Xcode Projects Directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"
new "Виберіть каталог проєктів Xcode за допомогою засобу вибору каталогу.\n{b}Можливо, засіб вибору каталогу відкрився за цим вікном.{/b}"
new "Виберіть теку проєктів Xcode за допомогою засобу вибору теки.\n{b}Можливо, засіб вибору теки відкрився за цим вікном.{/b}"
# game/ios.rpy:409
old "Ren'Py has set the Xcode Projects Directory to:"
new "Ren'Py встановив каталог проєктів Xcode на:"
new "Ren'Py встановив теку проєктів Xcode в:"
# game/itch.rpy:45
old "Downloading the itch.io butler."
@@ -1266,7 +1263,6 @@ translate ukrainian strings:
# game/navigation.rpy:204
old "TODOs"
# Automatic translation.
new "Список справ"
# game/navigation.rpy:243
@@ -1303,7 +1299,7 @@ translate ukrainian strings:
# game/new_project.rpy:63
old "The projects directory could not be set. Giving up."
new "Не вдалося встановити каталог проєктів. Залиште."
new "Не вдалося встановити теку проєктів. Залиште."
# game/new_project.rpy:70
old "Which interface would you like to use? The new GUI has a modern look, supports wide screens and mobile devices, and is easier to customize. Legacy themes might be necessary to work with older example code.\n\n[language_support!t]\n\nIf in doubt, choose the new GUI, then click Continue on the bottom-right."
@@ -1363,7 +1359,7 @@ translate ukrainian strings:
# game/preferences.rpy:131
old "Projects Directory:"
new "Каталог проєктів:"
new "Тека проєктів:"
# game/preferences.rpy:138
old "[persistent.projects_directory!q]"
@@ -1371,7 +1367,7 @@ translate ukrainian strings:
# game/preferences.rpy:140
old "Projects directory: [text]"
new "Каталог проєктів: [text]"
new "Тека проєктів: [text]"
# game/preferences.rpy:142
old "Not Set"
@@ -1411,7 +1407,7 @@ translate ukrainian strings:
# game/preferences.rpy:219
old "Large fonts"
new "Більші шрифти"
new "Великі шрифти"
# game/preferences.rpy:222
old "Console output"
@@ -1511,19 +1507,19 @@ translate ukrainian strings:
# game/project.rpy:794
old "PROJECTS DIRECTORY"
new "КАТАЛОГ ПРОЄКТІВ"
new "ТЕКА ПРОЄКТІВ"
# game/project.rpy:794
old "Please choose the projects directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"
new "Виберіть каталог проєктів за допомогою засобу вибору каталогу.\n{b}Можливо, засіб вибору каталогу відкрився за цим вікном.{/b}"
new "Виберіть теку проєктів за допомогою засобу вибору теки.\n{b}Можливо, засіб вибору теки відкрився за цим вікном.{/b}"
# game/project.rpy:794
old "This launcher will scan for projects in this directory, will create new projects in this directory, and will place built projects into this directory."
new "Цей лаунчер скануватиме проєкти в цьому каталозі, створюватиме нові проєкти в цьому каталозі та розміщуватиме вбудовані проєкти в цей каталог."
new "Цей лаунчер скануватиме проєкти в цьому каталозі, створюватиме нові проєкти в цьому каталозі та розміщуватиме вбудовані проєкти в цю теку."
# game/project.rpy:799
old "Ren'Py has set the projects directory to:"
new "Ren'Py встановив каталог проєктів в:"
new "Ren'Py встановив теку проєктів в:"
# game/translations.rpy:91
old "Translations: [project.current.display_name!q]"
@@ -1795,7 +1791,7 @@ translate ukrainian strings:
# game/web.rpy:310
old "Open build directory"
new "Відкрити каталог створення"
new "Відкрити теку створення"
# game/web.rpy:332
old "Images and music can be downloaded while playing. A 'progressive_download.txt' file will be created so you can configure this behavior."
@@ -1821,47 +1817,38 @@ translate ukrainian strings:
# game/android.rpy:39
old "RAPT has been installed, but a key hasn't been configured. Please generate new keys, or copy android.keystore and bundle.keystore to the base directory."
# Automatic translation.
new "RAPT встановлено, але ключ не налаштовано. Згенеруйте нові ключі або скопіюйте android.keystore та bundle.keystore до базового каталогу."
new "RAPT встановлено, але ключ не налаштовано. Згенеруйте нові ключі або скопіюйте android.keystore та bundle.keystore до базової теки."
# game/android.rpy:46
old "Attempts to emulate a televison-based Android console.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button."
# Automatic translation.
new "Спроби емулювати телевізійну Android-приставку на базі телевізора.\n\nКлавішам зі стрілками відповідає ввід контролера, клавіші Enter - кнопка вибору, Escape - кнопка меню, а кнопка PageUp - кнопка \"Назад\"."
new "Спроби емуляції телевізійної консолі Android.\n\nВведення контролера зіставляється з клавішами зі стрілками, Enter зіставляється з кнопкою вибору, Escape зіставляється з кнопкою меню, а PageUp зіставляється з кнопкою «Назад»."
# game/android.rpy:48
old "Downloads and installs the Android SDK and supporting packages."
# Automatic translation.
new "Завантажує та встановлює Android SDK та пакети підтримки."
# game/android.rpy:49
old "Generates the keys required to sign the package."
# Automatic translation.
new "Генерує ключі, необхідні для підписання пакунка."
new "Генерує ключі, необхідні для підпису пакета."
# game/android.rpy:383
old "Install SDK"
# Automatic translation.
new "Інсталяція SDK"
new "Установити SDK"
# game/android.rpy:387
old "Generate Keys"
# Automatic translation.
new "Згенеруйте ключі"
new "Згенерувати ключі"
# game/androidstrings.rpy:32
old "How much RAM (in GB) do you want to allocate to Gradle?\nThis must be a positive integer number."
# Automatic translation.
new "Скільки оперативної пам'яті (в ГБ) потрібно виділити Gradle?\nЦе має бути додатне ціле число."
new "Скільки оперативної пам’яті (у Гб) потрібно виділити Gradle?\nЦе має бути ціле додатне число."
# game/androidstrings.rpy:33
old "The RAM size must contain only numbers and be positive."
# Automatic translation.
new "Розмір оперативної пам'яті повинен містити тільки числа і бути додатнім."
new "Розмір оперативної пам’яті повинен містити тільки числа і бути додатнім."
# game/androidstrings.rpy:38
old "Which app store would you like to support in-app purchasing through?"
# Automatic translation.
new "Через який магазин додатків ви хотіли б підтримувати внутрішні покупки?"
# game/androidstrings.rpy:39
@@ -1874,28 +1861,23 @@ translate ukrainian strings:
# game/androidstrings.rpy:41
old "Both, in one app."
# Automatic translation.
new "І те, і інше в одному додатку."
new "Обох, в одному додатку."
# game/androidstrings.rpy:42
old "Neither."
# Automatic translation.
new "Ні те, ні інше."
new "Жодного."
# game/androidstrings.rpy:63
old "I found an android.keystore file in the rapt directory. Do you want to use this file?"
# Automatic translation.
new "Я знайшов файл android.keystore у каталозі rapt. Ви хочете використовувати цей файл?"
new "Знайдено файл android.keystore у теці rapt. Бажаєте використовувати цей файл?"
# game/androidstrings.rpy:66
old "\n\nSaying 'No' will prevent key creation."
# Automatic translation.
new "\n\nЯкщо ви скажете \"Ні\", то не зможете створити ключ."
new "\n\nЯкщо ви оберете «Ні», то не зможете створити ключ."
# game/androidstrings.rpy:69
old "I found a bundle.keystore file in the rapt directory. Do you want to use this file?"
# Automatic translation.
new "Я знайшов файл bundle.keystore у каталозі rapt. Ви хочете використовувати цей файл?"
new "Знайдено файл bundle.keystore у теці rapt. Бажаєте використовувати цей файл?"
# game/distribute_gui.rpy:231
old "(DLC)"
@@ -1903,11 +1885,16 @@ translate ukrainian strings:
# game/project.rpy:46
old "Lint checks your game for potential mistakes, and gives you statistics."
# Automatic translation.
new "Lint перевіряє вашу гру на наявність потенційних помилок і надає статистику."
new "Lint перевіряє вашу гру на наявність потенційних помилок і надає вам статистику."
# game/web.rpy:485
old "Creating package..."
# Automatic translation.
old "Creating package..."
new "Створення пакету..."
translate ukrainian strings:
# game/updater.rpy:79
old "A nightly build of fixes to the release version of Ren'Py."
new "Рання збірка виправлень до релізної версії Ren'Py."
+7 -8
View File
@@ -39,7 +39,7 @@ translate ukrainian strings:
# gui/game/options.rpy:38
old "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
new "## Коротка назва гри, яка використовується для виконуваних файлів і каталогів у вбудованому дистрибутиві. Це має бути лише ASCII і не повинно містити пробілів, двокрапки чи крапки з комою."
new "## Коротка назва гри, яка використовується для виконуваних файлів і тек у вбудованому дистрибутиві. Це має бути лише ASCII і не повинно містити пробілів, двокрапки чи крапки з комою."
# gui/game/options.rpy:45
old "## Sounds and music"
@@ -115,7 +115,7 @@ translate ukrainian strings:
# gui/game/options.rpy:135
old "## Save directory"
new "## Зберегти каталог"
new "## Зберегти теку"
# gui/game/options.rpy:137
old "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
@@ -155,7 +155,7 @@ translate ukrainian strings:
# gui/game/options.rpy:166
old "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
new "## Наступні функції приймають шаблони файлів. Шаблони файлів не чутливі до регістру та зіставляються зі шляхом відносно основного каталогу, з / без нього на початку. Якщо збігається декілька шаблонів, використовується перший."
new "## Наступні функції приймають шаблони файлів. Шаблони файлів не чутливі до регістру та зіставляються зі шляхом відносно основної теки, з / без нього на початку. Якщо збігається декілька шаблонів, використовується перший."
# gui/game/options.rpy:171
old "## In a pattern:"
@@ -163,19 +163,19 @@ translate ukrainian strings:
# gui/game/options.rpy:173
old "## / is the directory separator."
new "## / є роздільником каталогу."
new "## / є роздільником теки."
# gui/game/options.rpy:175
old "## * matches all characters, except the directory separator."
new "## * відповідає всім символам, крім роздільника каталогу."
new "## * відповідає всім символам, крім роздільника теки."
# gui/game/options.rpy:177
old "## ** matches all characters, including the directory separator."
new "## ** відповідає всім символам, включаючи роздільник каталогу."
new "## ** відповідає всім символам, включаючи роздільник теки."
# gui/game/options.rpy:179
old "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
new "## Наприклад, \"*.txt\" відповідає файлам txt у базовому каталозі, \"game/**.ogg\" відповідає файлам ogg у каталозі гри або будь-якому з його підкаталогів, а \"**.psd \" відповідає файлам psd будь-де в проєкті."
new "## Наприклад, \"*.txt\" відповідає файлам txt у базовому каталозі, \"game/**.ogg\" відповідає файлам ogg у каталозі гри або будь-якому з його під-тек, а \"**.psd \" відповідає файлам psd будь-де в проєкті."
# gui/game/options.rpy:183
old "## Classify files as None to exclude them from the built distributions."
@@ -202,6 +202,5 @@ 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\"."
# Automatic translation.
new "## Для здійснення покупок у додатку потрібен ліцензійний ключ Google Play. Його можна знайти в консолі розробника Google Play у розділі \"Монетизація\" > \"Налаштування монетизації\" > \"Ліцензування\"."
+38 -43
View File
@@ -87,7 +87,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:255
old "Auto"
new "Авто"
new "Авто."
# gui/game/screens.rpy:256
old "Save"
@@ -103,7 +103,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:259
old "Prefs"
new "Опції"
new "Налаштування"
# 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."
@@ -135,7 +135,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:314
old "End Replay"
new "Кінець повтору"
new "Закінчити повтору"
# gui/game/screens.rpy:318
old "Main Menu"
@@ -199,7 +199,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:429
old "## Reserve space for the navigation section."
new "## Зарезервуйте місце для розділу навігації."
new "## Зарезервування місця для розділу навігації."
# gui/game/screens.rpy:471
old "Return"
@@ -207,7 +207,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:534
old "## About screen"
new "## Про екран"
new "## Екран «Про гру»"
# gui/game/screens.rpy:536
old "## This screen gives credit and copyright information about the game and Ren'Py."
@@ -231,7 +231,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:562
old "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
new "Створено за допомогою {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
new "Зроблено з {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
# gui/game/screens.rpy:573
old "## Load and Save screens"
@@ -251,7 +251,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:598
old "Automatic saves"
new "Авто збереження"
new "Автозбереження"
# gui/game/screens.rpy:598
old "Quick saves"
@@ -267,7 +267,7 @@ 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"
@@ -275,7 +275,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:640
old "empty slot"
new "порожній слот"
new "порожня комірка"
# gui/game/screens.rpy:648
old "## Buttons to access other pages."
@@ -315,11 +315,11 @@ translate ukrainian strings:
# gui/game/screens.rpy:726
old "Display"
new "Дисплей"
new "Режим показу"
# gui/game/screens.rpy:727
old "Window"
new "Вікно"
new "У вікні"
# gui/game/screens.rpy:728
old "Fullscreen"
@@ -327,7 +327,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:733
old "Unseen Text"
new "Невидимий текст"
new "Непрочитаний текст"
# gui/game/screens.rpy:734
old "After Choices"
@@ -347,7 +347,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:752
old "Auto-Forward Time"
new "Час авто-переадресації"
new "Швидкість авточитання"
# gui/game/screens.rpy:759
old "Music Volume"
@@ -355,7 +355,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:766
old "Sound Volume"
new "Гучність звуку"
new "Гучність ефектів"
# gui/game/screens.rpy:772
old "Test"
@@ -415,7 +415,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:975
old "Mouse"
new "Мишка"
new "Миша"
# gui/game/screens.rpy:978
old "Gamepad"
@@ -423,8 +423,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:991
old "Enter"
# Automatic translation.
new "Увійдіть"
new "Enter"
# gui/game/screens.rpy:992
old "Advances dialogue and activates the interface."
@@ -432,8 +431,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:995
old "Space"
# Automatic translation.
new "Простір"
new "Пробіл"
# gui/game/screens.rpy:996
old "Advances dialogue without selecting choices."
@@ -441,7 +439,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:999
old "Arrow Keys"
new "Клавіші cтрілок"
new "Стрілки"
# gui/game/screens.rpy:1000
old "Navigate the interface."
@@ -449,8 +447,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:1003
old "Escape"
# Automatic translation.
new "Втеча"
new "Escape"
# gui/game/screens.rpy:1004
old "Accesses the game menu."
@@ -474,8 +471,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:1015
old "Page Up"
# Automatic translation.
new "Перегорнути сторінку."
new "Page Up"
# gui/game/screens.rpy:1016
old "Rolls back to earlier dialogue."
@@ -483,8 +479,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:1019
old "Page Down"
# Automatic translation.
new "Перегорнути сторінку вниз."
new "Page Down"
# gui/game/screens.rpy:1020
old "Rolls forward to later dialogue."
@@ -496,7 +491,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:1028
old "Takes a screenshot."
new "Робить скріншот."
new "Робить знімок екрана."
# gui/game/screens.rpy:1032
old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
@@ -508,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\nClick Rollback Side"
@@ -528,19 +523,19 @@ translate ukrainian strings:
# gui/game/screens.rpy:1065
old "Right Trigger\nA/Bottom Button"
new "Правий тригер\nA/нижня кнопка"
new "Правий тригер\nA/Нижня кнопка"
# gui/game/screens.rpy:1069
old "Left Trigger\nLeft Shoulder"
new "Лівий тригер\nЛіве плече"
new "Лівий тригер\nЛівий бампер"
# gui/game/screens.rpy:1073
old "Right Shoulder"
new "Праве плече"
new "Правий бампер"
# gui/game/screens.rpy:1078
old "D-Pad, Sticks"
new "D-Pad, стіки"
new "D-Pad, Стіки"
# gui/game/screens.rpy:1082
old "Start, Guide"
@@ -552,7 +547,7 @@ translate ukrainian strings:
# gui/game/screens.rpy:1089
old "Calibrate"
new "Калібрувати"
new "Відкалібрувати"
# gui/game/screens.rpy:1117
old "## Additional screens"
@@ -663,23 +658,23 @@ translate ukrainian strings:
# gui/game/screens.rpy:676
old "Upload Sync"
# Automatic translation.
new "Завантажити Синхронізація"
new "Вивантажити синхронізацію"
# gui/game/screens.rpy:680
old "Download Sync"
# Automatic translation.
new "Завантажити Синхронізація"
new "Завантажити синхронізацію"
# gui/game/screens.rpy:1410
old "## Bubble screen"
# Automatic translation.
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."
# Automatic translation.
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"
+2 -2
View File
@@ -12,13 +12,13 @@ label start:
# Це показує фон. За замовчуванням використовується заповнювач, але ви можете
# додати файл (з назвою "bg room.png" або "bg room.jpg") до
# каталогу images, щоб показати його.
# теки images, щоб показати його.
scene bg room
# Це показує спрайт персонажа. Використовується заповнювач, але ви можете
# замінити його, додавши до зображень файл із назвою "eileen happy.png".
# до каталогу.
# до теки.
show eileen happy
+2 -2
View File
@@ -357,11 +357,11 @@
# editor.rpy:150
old "{b}Recommended.{/b} A beta editor with an easy to use interface and features that aid in development, such as spell-checking. Editra currently lacks the IME support required for Chinese, Japanese, and Korean text input."
new "{b}Khuyến khích{/ b} Một trình biên tập có giao diện thân thiện và chức năng hỗ trợ phát triển, chẳng hạn như kiểm tra lỗi chính tả. Editra hiện đang thiếu sự hỗ trợ IME cần thiết để nhập văn bản Trung Quốc, Nhật Bản, và Hàn Quốc."
new "{b}Khuyến khích{/b} Một trình biên tập có giao diện thân thiện và chức năng hỗ trợ phát triển, chẳng hạn như kiểm tra lỗi chính tả. Editra hiện đang thiếu sự hỗ trợ IME cần thiết để nhập văn bản Trung Quốc, Nhật Bản, và Hàn Quốc."
# editor.rpy:151
old "{b}Recommended.{/b} A beta editor with an easy to use interface and features that aid in development, such as spell-checking. Editra currently lacks the IME support required for Chinese, Japanese, and Korean text input. On Linux, Editra requires wxPython."
new "{b}Khuyến khích{/ b} Một trình biên tập có giao diện thân thiện và chức năng hỗ trợ phát triển, chẳng hạn như kiểm tra lỗi chính tả. Editra hiện đang thiếu sự hỗ trợ IME cần thiết để nhập văn bản Trung Quốc, Nhật Bản, và Hàn Quốc. Với Linux Editra cần thêm wxPython."
new "{b}Khuyến khích{/b} Một trình biên tập có giao diện thân thiện và chức năng hỗ trợ phát triển, chẳng hạn như kiểm tra lỗi chính tả. Editra hiện đang thiếu sự hỗ trợ IME cần thiết để nhập văn bản Trung Quốc, Nhật Bản, và Hàn Quốc. Với Linux Editra cần thêm wxPython."
# editor.rpy:167
old "This may have occured because wxPython is not installed on this system."
+6 -1
View File
@@ -52,7 +52,7 @@ init python:
if state is not None:
base_name = state.get("sdk", {}).get('base_name', '')
if "-nightly-" in base_name:
if "+nightly" in base_name:
dlc_url = "http://nightly.renpy.org/{}/updates.json".format(base_name[6:])
return renpy.invoke_in_new_context(updater.update, dlc_url, add=[name], public_key=PUBLIC_KEY, simulate=UPDATE_SIMULATE, restart=restart)
@@ -73,6 +73,11 @@ init python:
_("Experimental")
_("Experimental versions of Ren'Py. You shouldn't select this channel unless asked by a Ren'Py developer.")
_("Nightly Fix")
_("Nightly Fix (Ren'Py 8, Python 3)")
_("Nightly Fix (Ren'Py 7, Python 2)")
_("A nightly build of fixes to the release version of Ren'Py.")
_("Nightly")
_("Nightly (Ren'Py 8, Python 3)")
_("Nightly (Ren'Py 7, Python 2)")
+15 -1
View File
@@ -204,7 +204,7 @@ def path_to_saves(gamedir, save_directory=None): # type: (str, str|None) -> str
# the launcher, usually.)
def path_to_renpy_base():
"""
Returns the absolute path to thew Ren'Py base directory.
Returns the absolute path to the Ren'Py base directory.
"""
renpy_base = os.path.dirname(os.path.realpath(sys.argv[0]))
@@ -212,6 +212,20 @@ def path_to_renpy_base():
return renpy_base
def path_to_logdir(basedir):
"""
Returns the absolute path to the log directory.
`basedir`
The base directory (config.basedir)
"""
import renpy # @UnresolvedImport
if renpy.android:
return os.environ['ANDROID_PUBLIC']
return basedir
##############################################################################
+25 -32
View File
@@ -75,31 +75,20 @@ from collections import namedtuple
# Version numbers.
try:
from renpy.vc_version import vc_version, official, nightly
from renpy.vc_version import official, nightly, version_name, version
except ImportError:
vc_version = 0
official = False
nightly = False
import renpy.versions
version_dict = renpy.versions.get_version()
official = version_dict["official"]
nightly = version_dict["nightly"]
version_name = version_dict["version_name"]
version = version_dict["version"]
official = official and getattr(site, "renpy_build_official", False)
VersionTuple = namedtuple("VersionTuple", ["major", "minor", "patch", "commit"])
if PY2:
# The tuple giving the version number.
version_tuple = VersionTuple(7, 6, 0, vc_version)
# The name of this version.
version_name = "To Boldly Go"
else:
# The tuple giving the version number.
version_tuple = VersionTuple(8, 1, 0, vc_version)
# The name of this version.
version_name = "Where No One Has Gone Before"
version_tuple = VersionTuple(*(int(i) for i in version.split(".")))
# A string giving the version number only (8.0.1.123), with a suffix if needed.
version_only = ".".join(str(i) for i in version_tuple)
@@ -448,11 +437,12 @@ def import_all():
import renpy.script
import renpy.statements
import renpy.util
import renpy.versions
global plog
plog = renpy.performance.log # type:ignore
import renpy.styledata # @UnresolvedImport
import renpy.styledata
import renpy.style
renpy.styledata.import_style_functions()
@@ -467,14 +457,15 @@ def import_all():
import renpy.translation.extract
import renpy.translation.merge
import renpy.display # @UnresolvedImport @Reimport
import renpy.display
import renpy.display.presplash
import renpy.display.pgrender
import renpy.display.scale
import renpy.display.module
import renpy.display.render # Most display stuff depends on this. @UnresolvedImport
import renpy.display.core # object @UnresolvedImport
import renpy.display.render
import renpy.display.displayable
import renpy.display.core
import renpy.display.swdraw
import renpy.text
@@ -494,13 +485,13 @@ def import_all():
import renpy.display.layout
import renpy.display.viewport
import renpy.display.transform
import renpy.display.motion # layout @UnresolvedImport
import renpy.display.behavior # layout @UnresolvedImport
import renpy.display.transition # core, layout @UnresolvedImport
import renpy.display.movetransition # core @UnresolvedImport
import renpy.display.motion
import renpy.display.behavior
import renpy.display.transition
import renpy.display.movetransition
import renpy.display.im
import renpy.display.imagelike
import renpy.display.image # core, behavior, im, imagelike @UnresolvedImport
import renpy.display.image
import renpy.display.video
import renpy.display.focus
import renpy.display.anim
@@ -546,7 +537,7 @@ def import_all():
import renpy.memory
import renpy.exports
import renpy.character # depends on exports. @UnresolvedImport
import renpy.character
import renpy.add_from
import renpy.dump
@@ -559,8 +550,8 @@ def import_all():
import renpy.gl2.gl2texture
import renpy.gl2.live2d
import renpy.minstore # depends on lots. @UnresolvedImport
import renpy.defaultstore # depends on everything. @UnresolvedImport
import renpy.minstore
import renpy.defaultstore
import renpy.test
import renpy.test.testmouse
@@ -709,6 +700,7 @@ if 1 == 0:
from . import dump
from . import easy
from . import editor
from . import encryption
from . import error
from . import execution
from . import exports
@@ -753,5 +745,6 @@ if 1 == 0:
from . import ui
from . import util
from . import vc_version
from . import versions
from . import warp
from . import webloader
+4 -11
View File
@@ -151,20 +151,13 @@ class ArgumentParser(argparse.ArgumentParser):
else:
self.group.add_argument(*args, **kwargs)
def parse_args(self, *args, **kwargs):
rv = argparse.ArgumentParser.parse_args(self, *args, **kwargs)
if rv.command in compile_commands:
rv.compile = True
if renpy.session.get("compile", False):
rv.compile = True
return rv
def parse_known_args(self, *args, **kwargs):
args, rest = argparse.ArgumentParser.parse_known_args(self, *args, **kwargs)
if renpy.session.get("_reload", False):
args.compile = False
if args.command in compile_commands:
args.compile = True
@@ -195,7 +188,7 @@ def run():
args = renpy.game.args = ap.parse_args()
if args.warp:
if args.warp and not renpy.session.get("_reload", False):
renpy.warp.warp_spec = args.warp
if args.profile_display: # @UndefinedVariable
+27 -5
View File
@@ -665,7 +665,7 @@ class Node(object):
be executed after this one.
"""
raise NotImplementedError("Node subclass forgot to define execute.")
raise Exception("Node subclass forgot to define execute.")
# def early_execute(self):
# """
@@ -719,7 +719,7 @@ class Node(object):
text in the statement.
"""
raise NotImplementedError
raise Exception("Not Implemented")
def analyze(self):
"""
@@ -1497,7 +1497,7 @@ class Camera(Node):
self.atl = atl
def diff_info(self):
return (ShowLayer, self.layer)
return (Camera, self.layer)
def execute(self):
next_node(self.next)
@@ -1697,19 +1697,22 @@ class Call(Node):
'label',
'arguments',
'expression',
'global_label',
]
def __new__(cls, *args, **kwargs):
self = Node.__new__(cls)
self.arguments = None
self.global_label = ""
return self
def __init__(self, loc, label, expression, arguments):
def __init__(self, loc, label, expression, arguments, global_label=""):
super(Call, self).__init__(loc)
self.label = label
self.expression = expression
self.arguments = arguments
self.global_label = global_label
def diff_info(self):
return (Call, self.label, self.expression)
@@ -1722,6 +1725,9 @@ class Call(Node):
if self.expression:
label = renpy.python.py_eval(label)
if isinstance(label, str) and label.startswith("."):
label = self.global_label + label
rv = renpy.game.context().call(label, return_site=self.next.name)
next_node(rv)
renpy.game.context().abnormal = True
@@ -1748,6 +1754,9 @@ class Call(Node):
except Exception:
return [ ]
if isinstance(label, str) and label.startswith("."):
label = self.global_label + label
if not renpy.game.script.has_label(label):
return [ ]
@@ -1966,13 +1975,20 @@ class Jump(Node):
__slots__ = [
'target',
'expression',
'global_label',
]
def __init__(self, loc, target, expression):
def __new__(cls, *args, **kwargs):
self = Node.__new__(cls)
self.global_label = ""
return self
def __init__(self, loc, target, expression, global_label=""):
super(Jump, self).__init__(loc)
self.target = target
self.expression = expression
self.global_label = global_label
def diff_info(self):
return (Jump, self.target, self.expression)
@@ -1989,6 +2005,9 @@ class Jump(Node):
if self.expression:
target = renpy.python.py_eval(target)
if isinstance(target, str) and target.startswith("."):
target = self.global_label + target
rv = renpy.game.script.lookup(target)
renpy.game.context().abnormal = True
@@ -2008,6 +2027,9 @@ class Jump(Node):
except Exception:
return [ ]
if isinstance(label, str) and label.startswith("."):
label = self.global_label + label
if not renpy.game.script.has_label(label):
return [ ]
+30 -14
View File
@@ -301,12 +301,6 @@ class Context(object):
for i in variables:
if self.context.get(i, NotInContext) != other.context.get(i, NotInContext):
# Ignore the arguments given to ATL Transitions, which
# will change each time an interaction restarts. (See #4167.)
if i in ("new_widget", "old_widget"):
continue
return False
return True
@@ -398,6 +392,13 @@ class ATLTransformBase(renpy.object.Object):
if renpy.game.context().init_phase:
compile_queue.append(self)
@property
def transition(self):
"""
Returns true if this is likely to be an ATL transition.
"""
return "new_widget" in self.context.context
def _handles_event(self, event):
@@ -596,6 +597,9 @@ class ATLTransformBase(renpy.object.Object):
def execute(self, trans, st, at):
if self.state.debug:
print("A", st)
if self.done:
return None
@@ -639,7 +643,7 @@ class ATLTransformBase(renpy.object.Object):
if (self.atl_st_offset is None) or (st - self.atl_st_offset) < 0:
self.atl_st_offset = st
if self.atl.animation:
if self.atl.animation or self.transition:
timebase = at
else:
timebase = st - self.atl_st_offset
@@ -1362,7 +1366,7 @@ class Interpolation(Statement):
complete = warper(complete)
if state is None:
if state is None or len(state) != 6:
# Create a new transform state, and apply the property
# changes to it.
@@ -1378,20 +1382,17 @@ class Interpolation(Statement):
setattr(newts, k, v)
if k == "angle":
newts.last_angle = v
has_angle = True
elif k == "radius":
has_radius = True
elif k == "anchorangle":
newts.last_anchorangle = v
has_anchorangle = True
elif k == "anchorradius":
has_anchorradius = True
# Now, the things we change linearly are in the difference
# between the new and old states.
linear = trans.state.diff(newts)
@@ -1474,14 +1475,29 @@ class Interpolation(Statement):
else:
if has_angle:
last_angle = trans.state.angle or trans.state.last_angle
angle = (last_angle, newts.last_angle)
start = trans.state.angle
end = newts.last_angle
if end - start > 180:
start += 360
if end - start < -180:
start -= 360
angle = (start, end)
if has_radius:
radius = (trans.state.radius, newts.radius)
if has_anchorangle:
last_anchorangle = trans.state.anchorangle or trans.state.last_anchorangle
start = trans.state.anchorangle
end = newts.last_anchorangle
if end - start > 180:
start += 360
if end - start < -180:
start -= 360
anchorangle = (start, end)
if has_anchorradius:
anchorradius = (trans.state.anchorradius, newts.anchorradius)
-217
View File
@@ -1,217 +0,0 @@
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR OTHER DEALINGS IN THE SOFTWARE.
from __future__ import division, absolute_import, with_statement, print_function, unicode_literals
from renpy.compat import PY2, basestring, bchr, bord, chr, open, pystr, range, round, str, tobytes, unicode # *
import renpy
import jnius # type: ignore
from renpy.audio.audio import MusicContext
VideoPlayer = jnius.autoclass("org.renpy.android.VideoPlayer")
class AndroidVideoChannel(object):
def __init__(self, name, file_prefix="", file_suffix="", default_loop=None):
# A list of queued filenames.
self.queue = [ ]
# The filename that's currently playing.
self.filename = None
# The videoplayer that's currently playing.
self.player = None
# The name assigned to this channel. This is used to look up
# information about the channel in the MusicContext object.
self.name = name
# The name of the mixer this channel uses. Set below, as there's
# no good default.
self.mixer = None
# The time the music in this channel was last changed.
self.last_changed = 0
# The callback that is called if the queue becomes empty.
self.callback = None
# Ignored.
self.synchro_start = False
self.wait_stop = False
self.loop = [ ]
# A prefix and suffix that are used to create the full filenames.
self.file_prefix = file_prefix
self.file_suffix = file_suffix
if default_loop is None:
# By default, should we loop the music?
self.default_loop = True
# Was this set explicitly?
self.default_loop_set = False
else:
self.default_loop = default_loop
self.default_loop_set = True
def get_context(self):
"""
Returns the MusicContext corresponding to this channel, taken from
the context object. Allocates a MusicContext if none exists.
"""
mcd = renpy.game.context().music
rv = mcd.get(self.name)
if rv is None:
rv = mcd[self.name] = MusicContext()
return rv
context = property(get_context)
def copy_context(self):
"""
Copies the MusicContext associated with this channel, updates the
ExecutionContext to point to the copy, and returns the copy.
"""
mcd = renpy.game.context().music
ctx = self.get_context().copy()
mcd[self.name] = ctx
return ctx
def start(self):
"""
Starts playing the first video in the queue.
"""
if not self.queue:
return
filename = self.queue.pop(0)
with renpy.loader.load(filename, directory="audio") as f:
real_fn = f.name
base = getattr(f, "base", -1)
length = getattr(f, "length", -1)
self.filename = filename
self.player = VideoPlayer(real_fn, base, length)
def stop(self):
if self.player is not None:
self.player.stop()
self.player = None
self.filename = None
def get_playing(self):
if self.player is None:
return None
if self.player.isPlaying():
return self.filename
def periodic(self):
# This should be set from something that checks to see if our
# mixer is muted.
force_stop = self.context.force_stop
if force_stop:
self.dequeue()
self.stop()
return
if self.get_playing():
return
if self.queue:
self.start()
def dequeue(self, even_tight=False):
"""
Clears the queued music, except for a first item that has
not been started.
"""
if self.get_playing():
self.queue = [ ]
else:
self.queue = self.queue[:1]
def interact(self):
"""
Called (mostly) once per interaction.
"""
self.periodic()
def fadeout(self, secs):
"""
Causes the playing music to be faded out for the given number
of seconds. Also clears any queued music.
"""
self.stop()
self.queue = [ ]
def enqueue(self, filenames, loop=True, synchro_start=False, fadein=0, tight=None, loop_only=False, relative_volume=1.0):
self.queue.extend(filenames)
def set_volume(self, volume):
pass
def get_pos(self):
pass
def set_pan(self, pan, delay):
pass
def set_secondary_volume(self, volume, delay):
pass
def pause(self):
if self.player is not None:
self.player.pause()
def unpause(self):
if self.player is not None:
self.player.unpause()
def reload(self):
return
def read_video(self):
return None
def video_ready(self):
return 1
+12 -33
View File
@@ -668,7 +668,7 @@ class Channel(object):
renpysound.dequeue(self.number, True)
renpysound.stop(self.number)
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=False, fadein=0, tight=None, relative_volume=1.0):
with lock:
@@ -676,22 +676,20 @@ class Channel(object):
filename, _, _ = self.split_filename(filename, False)
renpy.game.persistent._seen_audio[str(filename)] = True # type: ignore
if not loop_only:
if tight is None:
tight = self.tight
if tight is None:
tight = self.tight
self.keep_queue += 1
self.keep_queue += 1
for filename in filenames:
qe = QueueEntry(filename, fadein, tight, False, relative_volume)
self.queue.append(qe)
for filename in filenames:
qe = QueueEntry(filename, fadein, tight, False, relative_volume)
self.queue.append(qe)
# Only fade the first thing in.
fadein = 0
# Only fade the first thing in.
fadein = 0
self.wait_stop = synchro_start
self.synchro_start = synchro_start
self.wait_stop = synchro_start
self.synchro_start = synchro_start
if loop:
self.loop = list(filenames)
@@ -792,20 +790,6 @@ class Channel(object):
return renpysound.video_ready(self.number)
# Use unconditional imports so these files get compiled during the build
# process.
try:
from renpy.audio.androidhw import AndroidVideoChannel
except Exception:
pass
try:
from renpy.audio.ioshw import IOSVideoChannel
except Exception:
pass
# A list of channels we know about.
all_channels = [ ]
@@ -882,12 +866,7 @@ def register_channel(name,
if not force and not renpy.game.context().init_phase and (" " not in name):
raise Exception("Can't register channel outside of init phase.")
if renpy.android and renpy.config.hw_video and name == "movie":
c = AndroidVideoChannel(name, default_loop=loop, file_prefix=file_prefix, file_suffix=file_suffix)
elif renpy.ios and renpy.config.hw_video and name == "movie":
c = IOSVideoChannel(name, default_loop=loop, file_prefix=file_prefix, file_suffix=file_suffix)
else:
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)
c.mixer = mixer
-196
View File
@@ -1,196 +0,0 @@
from __future__ import division, absolute_import, with_statement, print_function, unicode_literals
from renpy.compat import PY2, basestring, bchr, bord, chr, open, pystr, range, round, str, tobytes, unicode # *
import renpy
import pyobjus # type: ignore
from renpy.audio.audio import MusicContext
VideoPlayer = pyobjus.autoclass("VideoPlayer")
class IOSVideoChannel(object):
def __init__(self, name, file_prefix="", file_suffix="", default_loop=None):
# A list of queued filenames.
self.queue = [ ]
# The filename that's currently playing.
self.filename = None
# The videoplayer that's currently playing.
self.player = None
# The name assigned to this channel. This is used to look up
# information about the channel in the MusicContext object.
self.name = name
# The name of the mixer this channel uses. Set below, as there's
# no good default.
self.mixer = None
# The time the music in this channel was last changed.
self.last_changed = 0
# The callback that is called if the queue becomes empty.
self.callback = None
# Ignored.
self.synchro_start = False
self.wait_stop = False
self.loop = [ ]
# A prefix and suffix that are used to create the full filenames.
self.file_prefix = file_prefix
self.file_suffix = file_suffix
if default_loop is None:
# By default, should we loop the music?
self.default_loop = True
# Was this set explicitly?
self.default_loop_set = False
else:
self.default_loop = default_loop
self.default_loop_set = True
def get_context(self):
"""
Returns the MusicContext corresponding to this channel, taken from
the context object. Allocates a MusicContext if none exists.
"""
mcd = renpy.game.context().music
rv = mcd.get(self.name)
if rv is None:
rv = mcd[self.name] = MusicContext()
return rv
context = property(get_context)
def copy_context(self):
"""
Copies the MusicContext associated with this channel, updates the
ExecutionContext to point to the copy, and returns the copy.
"""
mcd = renpy.game.context().music
ctx = self.get_context().copy()
mcd[self.name] = ctx
return ctx
def start(self):
"""
Starts playing the first video in the queue.
"""
if not self.queue:
return
filename = self.queue.pop(0)
with renpy.loader.load(filename, directory="audio") as f:
real_fn = f.name
self.filename = filename
self.player = VideoPlayer.alloc().initWithFile_(real_fn)
def stop(self):
if self.player is not None:
self.player.stop()
self.player = None
self.filename = None
def get_playing(self):
if self.player is None:
return None
if self.player.isPlaying():
return self.filename
def periodic(self):
# This should be set from something that checks to see if our
# mixer is muted.
force_stop = self.context.force_stop
if force_stop:
self.dequeue()
self.stop()
return
if self.player:
self.player.periodic()
if self.get_playing():
return
if self.queue:
self.start()
def dequeue(self, even_tight=False):
"""
Clears the queued music, except for a first item that has
not been started.
"""
if self.get_playing():
self.queue = [ ]
else:
self.queue = self.queue[:1]
def interact(self):
"""
Called (mostly) once per interaction.
"""
self.periodic()
def fadeout(self, secs):
"""
Causes the playing music to be faded out for the given number
of seconds. Also clears any queued music.
"""
self.stop()
self.queue = [ ]
def enqueue(self, filenames, loop=True, synchro_start=False, fadein=0, tight=None, loop_only=False, relative_volume=1.0):
self.queue.extend(filenames)
def pause(self):
if self.player is not None:
self.player.pause()
def unpause(self):
if self.player is not None:
self.player.unpause()
def set_volume(self, volume):
pass
def get_pos(self):
pass
def set_pan(self, pan, delay):
pass
def set_secondary_volume(self, volume, delay):
pass
def reload(self):
return
def read_video(self):
return None
def video_ready(self):
return 1
+4 -5
View File
@@ -111,17 +111,16 @@ def play(filenames, channel="music", loop=None, fadeout=None, synchro_start=Fals
loop_is_filenames = (c.loop == filenames)
c.dequeue()
if fadeout is None:
fadeout = renpy.config.fadeout_audio
if if_changed and c.get_playing() in filenames:
fadein = 0
loop_only = loop_is_filenames
if not loop_is_filenames:
c.dequeue()
else:
c.dequeue()
c.fadeout(fadeout)
loop_only = False
if renpy.config.skip_sounds and renpy.config.skipping and (not loop):
enqueue = False
@@ -129,7 +128,7 @@ def play(filenames, channel="music", loop=None, fadeout=None, synchro_start=Fals
enqueue = True
if enqueue:
c.enqueue(filenames, loop=loop, synchro_start=synchro_start, fadein=fadein, tight=tight, loop_only=loop_only, relative_volume=relative_volume)
c.enqueue(filenames, loop=loop, synchro_start=synchro_start, fadein=fadein, tight=tight, relative_volume=relative_volume)
t = get_serial()
ctx.last_changed = t
+1 -8
View File
@@ -264,10 +264,7 @@ You may be using a system install of python. Please run {0}.sh,
renpy.config.gamedir = gamedir
renpy.config.args = [ ] # type: ignore
if renpy.android:
renpy.config.logdir = os.environ['ANDROID_PUBLIC']
else:
renpy.config.logdir = basedir
renpy.config.logdir = renpy.__main__.path_to_logdir(basedir)
if not os.path.exists(renpy.config.logdir):
os.makedirs(renpy.config.logdir, 0o777)
@@ -308,10 +305,6 @@ You may be using a system install of python. Please run {0}.sh,
finally:
if renpy.test.testexecution.node is not None:
for clbk in renpy.config.end_testcase_callbacks:
clbk()
if "RENPY_SHUTDOWN_TRACE" in os.environ:
enable_trace(int(os.environ["RENPY_SHUTDOWN_TRACE"]))
+67 -30
View File
@@ -95,6 +95,11 @@ class DialogueTextTags(object):
elif tag == "nw":
self.no_wait = True
if value is not None and not less_pauses:
self.pause_start.append(len(self.text))
self.pause_end.append(len(self.text))
self.pause_delay.append(value)
elif tag == "fast":
self.pause_start = [ len(self.text) ]
self.pause_end = [ ]
@@ -240,6 +245,7 @@ def show_display_say(who, what, who_args={}, what_args={}, window_args={},
layer=None,
properties={},
multiple=None,
retain=None,
**kwargs):
"""
This is called (by default) by renpy.display_say to add the
@@ -270,6 +276,11 @@ def show_display_say(who, what, who_args={}, what_args={}, window_args={},
@param kwargs: Additional keyword arguments should be ignored.
`retain`
If not None, the screen should be retained (not transient),
and the screen should be given the value of this argument as
its tag.
This function is required to return the ui.text() widget
displaying the what text.
"""
@@ -305,7 +316,10 @@ def show_display_say(who, what, who_args={}, what_args={}, window_args={},
tag = screen
if multiple:
if retain:
tag = retain
elif multiple:
if renpy.display.screen.has_screen("multiple_" + screen):
screen = "multiple_" + screen
@@ -325,7 +339,7 @@ def show_display_say(who, what, who_args={}, what_args={}, window_args={},
renpy.display.screen.show_screen(
screen,
_widget_properties=props,
_transient=True,
_transient=not retain,
_tag=tag,
who=who,
what=what,
@@ -439,7 +453,8 @@ def display_say(
ctc_force=False,
advance=True,
multiple=None,
dtt=None):
dtt=None,
retain=False):
global afm_text_queue
@@ -538,6 +553,19 @@ def display_say(
exception = None
retain_tag = "_retain_0"
retain_count = -1
if retain:
while True:
retain_count += 1
retain_tag = "_retain_{}".format(retain_count)
if not renpy.exports.get_screen(retain_tag):
break
if dtt.fast:
for i in renpy.config.say_sustain_callbacks:
i()
@@ -609,9 +637,12 @@ def display_say(
# is not required.
if renpy.config.scry_extend:
scry = renpy.exports.scry().next()
scry_count = 0
scry = renpy.exports.scry()
if scry is not None:
scry = scry.next()
scry_count = 0
while scry and scry_count < 64:
if scry.extend_text is renpy.ast.DoesNotExtend:
@@ -626,10 +657,16 @@ def display_say(
extend_text = "{done}" + extend_text
# Show the text.
show_args = { }
if multiple:
what_text = show_function(who, what_string, multiple=multiple)
else:
what_text = show_function(who, what_string)
show_args["multiple"] = multiple
if retain:
show_args["retain"] = retain_tag
what_text = show_function(who, what_string, **show_args)
if isinstance(what_text, tuple):
what_text = renpy.display.screen.get_widget(what_text[0], what_text[1], what_text[2])
@@ -856,6 +893,7 @@ class ADVCharacter(object):
callback=d('callback'),
type=d('type'),
advance=d('advance'),
retain=d('retain'),
)
self._statement_name = properties.pop("statement_name", None)
@@ -956,34 +994,27 @@ class ADVCharacter(object):
return screen, show_args, who_args, what_args, window_args, properties
def do_show(self, who, what, multiple=None, extra_properties=None):
def do_show(self, who, what, multiple=None, extra_properties=None, retain=None):
screen, show_args, who_args, what_args, window_args, properties = self.get_show_properties(extra_properties)
show_args = dict(show_args)
if multiple is not None:
show_args["multiple"] = multiple
return self.show_function(
who,
what,
who_args=who_args,
what_args=what_args,
window_args=window_args,
screen=screen,
properties=properties,
multiple=multiple,
**show_args)
if retain:
show_args["retain"] = retain
else:
return self.show_function(
who,
what,
who_args=who_args,
what_args=what_args,
window_args=window_args,
screen=screen,
properties=properties,
**show_args)
return self.show_function(
who,
what,
who_args=who_args,
what_args=what_args,
window_args=window_args,
screen=screen,
properties=properties,
**show_args)
# This is called after the last interaction is done.
@@ -1628,6 +1659,12 @@ def Character(name=NotSet, kind=None, **properties):
`screen`
The name of the screen that is used to display the dialogue.
`retain`
If not true, an unused tag is generated for each line of dialogue,
and the screens are shown non-transiently. Call :func:`renpy.clear_retain`
to remove all retaint screens. This is almost always used with
:doc:`bubble`.
Keyword arguments beginning with ``show_`` have the prefix
stripped off, and are passed to the screen as arguments. For
example, the value of ``show_myflag`` will become the value of
+10 -4
View File
@@ -30,6 +30,8 @@ init -1500 python:
"load" : "(not _in_replay)",
}
__NoShowTransition = renpy.object.Sentinel("NoShowTransition")
@renpy.pure
class ShowMenu(Action, DictEquality):
"""
@@ -62,11 +64,11 @@ init -1500 python:
Extra arguments and keyword arguments are passed on to the screen
"""
transition = None # For save compatability; see renpy#2376
transition = None # For save compatibility; see renpy#2376
def __init__(self, screen=None, *args, **kwargs):
self.screen = screen
self.transition = kwargs.pop("_transition", None)
self.transition = kwargs.pop("_transition", __NoShowTransition)
self.args = args
self.kwargs = kwargs
@@ -79,6 +81,10 @@ init -1500 python:
if not self.get_sensitive():
return
transition = self.transition
if transition is __NoShowTransition:
transition = config.intra_transition
orig_screen = screen = self.screen or store._game_menu_screen
if not (renpy.has_screen(screen) or renpy.has_label(screen)):
@@ -90,12 +96,12 @@ init -1500 python:
if renpy.has_screen(screen):
renpy.transition(self.transition or config.intra_transition)
renpy.transition(transition)
renpy.show_screen(screen, _transient=True, *self.args, **self.kwargs)
renpy.restart_interaction()
elif renpy.has_label(screen):
renpy.transition(config.intra_transition)
renpy.transition(transition)
ui.layer("screens")
ui.remove_above(None)
+3 -4
View File
@@ -476,7 +476,8 @@ init -1500 python:
:doc: other_action
Move the mouse pointer to `x`, `y`. If the device does not have a mouse
pointer or _preferences.mouse_move is False, this does nothing.
pointer or if the :var:`"automatic move" preference <preferences.mouse_move>`
is False, this does nothing.
`duration`
The time it will take to perform the move, in seconds. During
@@ -697,10 +698,8 @@ init -1500 python:
amount = delta * adjustment.step
elif self.amount == "page":
amount = delta * adjustment.page
elif isinstance(self.amount, float) and not isinstance(self.amount, absolute):
amount = delta * self.amount * adjustment.range
else:
amount = delta * self.amount
amount = absolute.compute_raw(delta*self.amount, adjustment.range)
if self.delay == 0.0:
adjustment.change(adjustment.value + amount)
+16 -13
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2023 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
@@ -345,11 +345,14 @@ init -1500 python in build:
dmg
A Macintosh DMG containing the files.
app-zip
A zip file containing a macintosh application.
A zip file containing a macintosh application. This format
doesn't support the Ren'Py updater.
app-directory
A directory containing the mac app.
A directory containing the mac app. This format
doesn't support the Ren'Py updater.
app-dmg
A macintosh drive image containing a dmg. (Mac only.)
A macintosh drive image containing a dmg. (Mac only.) This format
doesn't support the Ren'Py updater.
bare-zip
A zip file without :var:`build.directory_name`
prepended.
@@ -457,15 +460,15 @@ init -1500 python in build:
itch_project = None
# Maps from files to itch.io channels.
itch_channels = [
( "*-all.zip", "win-osx-linux" ),
( "*-market.zip", "win-osx-linux" ),
( "*-pc.zip", "win-linux" ),
( "*-win.zip", "win" ),
( "*-mac.zip", "osx" ),
( "*-linux.tar.bz2", "linux" ),
( "*-release.apk", "android" ),
]
itch_channels = {
"*-all.zip" : "win-osx-linux",
"*-market.zip" : "win-osx-linux",
"*-pc.zip" : "win-linux",
"*-win.zip" : "win",
"*-mac.zip" : "osx",
"*-linux.tar.bz2" : "linux",
"*-release.apk" : "android",
}
# Should we include the old Ren'Py themes?
include_old_themes = True
+4 -1
View File
@@ -208,7 +208,6 @@ init -1100 python:
if version <= (7, 3, 5):
config.side_image_requires_attributes = False
config.window_functions_set_auto = False
config.hw_video = True
config.who_what_sub_compat = 0
if version <= (7, 4, 0):
@@ -293,6 +292,10 @@ init -1100 python:
store.layeredimage._constant = True
store.updater._constant = True
if _compat_versions(version, (7, 6, 99), (8, 1, 99)):
config.simple_box_reverse = True
build.itch_channels = list(build.itch_channels.items())
# The version of Ren'Py this script is intended for, or
# None if it's intended for the current version.
config.script_version = None
+5 -1
View File
@@ -128,7 +128,11 @@ init -1500 python in _console:
import sys
import traceback
import store
import pydoc
try:
import pydoc
except ImportError:
# Web2 does not have pydoc, help() will fail but game will load at least
pass
from reprlib import Repr
class PrettyRepr(Repr):
+6 -6
View File
@@ -39,19 +39,19 @@ init -1500 python:
config.default_language = None
# If not None, the default value of wait_voice
config.default_wait_for_voice = True
config.default_wait_for_voice = None
# If not None, the default value of voice_sustain
config.default_voice_sustain = False
config.default_voice_sustain = None
# If not None, the default value of mouse_move.
config.default_mouse_move = True
config.default_mouse_move = None
# If not None, the default value of show_empty_window.
config.default_show_empty_window = True
config.default_show_empty_window = None
# If not None, the default value of emphasize_audio.
config.default_emphasize_audio = False
config.default_emphasize_audio = None
# If not None, the default value of set_volume (music)
config.default_music_volume = 1.0
@@ -117,7 +117,7 @@ init 1500 python hide:
_preferences.mouse_move = config.default_mouse_move
if config.default_afm_enable is not None:
_preferences.afm_enable = config.default_afm_enable
_preferences.afm_enable = config.default_afm_enable or _preferences.afm_enable
if config.default_show_empty_window is not None:
_preferences.show_empty_window = config.default_show_empty_window
+5 -3
View File
@@ -127,7 +127,7 @@ init -1400 python:
"""
:doc: transition_family
This defines a family of move transitions, similar to the move and ease
This defines a family of :class:`move transitions <MoveTransition>`, similar to the move and ease
transitions. For a given `prefix`, this defines the transitions:
* *prefix*- A transition that takes `delay` seconds to move images that
@@ -147,6 +147,7 @@ init -1400 python:
Time warp functions that are given a time from 0.0 to 1.0 representing
the fraction of the move that is complete, and return a value in the same
range giving the fraction of a linear move that is complete.
See :ref:`warpers <warpers>` for more information.
This can be used to define functions that ease the images around,
rather than moving them at a constant speed.
@@ -155,7 +156,9 @@ init -1400 python:
newly shown images, and newly hidden images, respectively.
`old`
If true, the transitions to move the old displayables, rather than the new ones.
If true, when a tag gets its image changed during the transition,
the old image will be used in preference to the new one. Otherwise,
the new images will be used.
`layers`
The layers the transition will apply to.
@@ -166,7 +169,6 @@ init -1400 python:
# with "move".
init python:
define.move_transitions("move", 0.5)
"""
moves = {
+2 -2
View File
@@ -1369,11 +1369,11 @@ init python in director:
continue
if i & 1:
v = int(v)
v = "%08d" % int(v)
rv.append(v)
return tuple(rv)
return "".join(rv)
init 2202 python hide in director:
+27
View File
@@ -111,6 +111,13 @@ init -1500 python in iap:
return
def request_review(self):
"""
Called to request that the user review the application.
"""
return False
class AndroidBackend(object):
"""
The IAP backend that is used when IAP is supported.
@@ -181,6 +188,9 @@ init -1500 python in iap:
identifier = self.identifier(p)
return self.store.getPrice(identifier)
def request_review(self):
return self.store.requestReview()
def init(self):
restore(False)
@@ -293,6 +303,10 @@ init -1500 python in iap:
return rv
def request_review(self):
self.helper.requestReview()
return True
def init(self):
self.helper.validateProductIdentifiersInBackground()
@@ -541,6 +555,19 @@ init -1500 python in iap:
return backend.get_store_name()
def request_review():
"""
:doc: iap
When called, the app store is asked to request a review from the user.
This returns true if the request was successful, and false if the
request was not. Note that a successful request does not mean that
the user will be asked to review the app, as app stores determine
if the user is actually asked.
This is supported on Google Play and the Apple App Store, only.
"""
def missing_products():
"""
Determines if any products are missing from persistent._iap_purchases
+2 -2
View File
@@ -1,4 +1,4 @@
init offset = -100
init offset = -100
python early in layeredimage:
@@ -15,7 +15,7 @@ python early in layeredimage:
FIXED_PROPERTIES = renpy.sl2.slproperties.position_property_names + renpy.sl2.slproperties.box_property_names
# This is the default value for predict_all given to conditions.
predict_all = False
predict_all = None
def format_function(what, name, group, variant, attribute, image, image_format, **kwargs):
"""
+1 -1
View File
@@ -349,7 +349,7 @@ init -1500 python:
while config.nvl_list_length and (len(nvl_list) + 1 > config.nvl_list_length):
nvl_list.pop(0)
def do_display(self, who, what, multiple=None, **display_args):
def do_display(self, who, what, multiple=None, retain=None, **display_args):
renpy.translation.check_language()
+139 -135
View File
@@ -80,186 +80,186 @@ init -1500 python:
@renpy.pure
def Preference(name, value=None, range=None):
"""
:doc: preference_action
:doc: preference_action
This constructs the appropriate action or value from a preference.
The preference name should be the name given in the standard
menus, while the value should be either the name of a choice,
"toggle" to cycle through choices, a specific value, or left off
in the case of buttons.
This constructs the appropriate action or value from a preference.
The preference name should be the name given in the standard
menus, while the value should be either the name of a choice,
"toggle" to cycle through choices, a specific value, or left off
in the case of buttons.
Actions that can be used with buttons and hotspots are:
Actions that can be used with buttons and hotspots are:
* Preference("display", "fullscreen") - displays in fullscreen mode.
* Preference("display", "window") - displays in windowed mode at 1x normal size.
* Preference("display", 2.0) - displays in windowed mode at 2.0x normal size.
* Preference("display", "any window") - displays in windowed mode at the previous size.
* Preference("display", "toggle") - toggle display mode.
* Preference("display", "fullscreen") - displays in fullscreen mode.
* Preference("display", "window") - displays in windowed mode at 1x normal size.
* Preference("display", 2.0) - displays in windowed mode at 2.0x normal size.
* Preference("display", "any window") - displays in windowed mode at the previous size.
* Preference("display", "toggle") - toggle display mode.
* Preference("transitions", "all") - show all transitions.
* Preference("transitions", "none") - do not show transitions.
* Preference("transitions", "toggle") - toggle transitions.
* Preference("transitions", "all") - show all transitions.
* Preference("transitions", "none") - do not show transitions.
* Preference("transitions", "toggle") - toggle transitions.
* Preference("video sprites", "show") - show all video sprites.
* Preference("video sprites", "hide") - fall back to images where possible.
* Preference("video sprites", "toggle") - toggle image fallback behavior.
* Preference("video sprites", "show") - show all video sprites.
* Preference("video sprites", "hide") - fall back to images where possible.
* Preference("video sprites", "toggle") - toggle image fallback behavior.
* Preference("show empty window", "show") - Allow the "window show" and "window auto" statement to show an empty window outside of the say statement.
* Preference("show empty window", "hide") - Prevent the above.
* Preference("show empty window", "toggle") - Toggle the above.
* Preference("show empty window", "show") - Allow the "window show" and "window auto" statement to show an empty window outside of the say statement.
* Preference("show empty window", "hide") - Prevent the above.
* Preference("show empty window", "toggle") - Toggle the above.
* Preference("text speed", 0) - make text appear instantaneously.
* Preference("text speed", 142) - set text speed to 142 characters per second.
* Preference("text speed", 0) - make text appear instantaneously.
* Preference("text speed", 142) - set text speed to 142 characters per second.
* Preference("joystick") - Show the joystick preferences.
* Preference("joystick") - Show the joystick preferences.
* Preference("skip", "seen") - Only skip seen messages.
* Preference("skip", "all") - Skip unseen messages.
* Preference("skip", "toggle") - Toggle between skip seen and skip all.
* Preference("skip", "seen") - Only skip seen messages.
* Preference("skip", "all") - Skip unseen messages.
* Preference("skip", "toggle") - Toggle between skip seen and skip all.
* Preference("begin skipping") - Starts skipping.
* Preference("begin skipping") - Starts skipping.
* Preference("after choices", "skip") - Skip after choices.
* Preference("after choices", "stop") - Stop skipping after choices.
* Preference("after choices", "toggle") - Toggle skipping after choices.
* Preference("after choices", "skip") - Skip after choices.
* Preference("after choices", "stop") - Stop skipping after choices.
* Preference("after choices", "toggle") - Toggle skipping after choices.
* Preference("auto-forward time", 0) - Set the auto-forward time to infinite.
* Preference("auto-forward time", 10) - Set the auto-forward time (unit is seconds per 250 characters).
* Preference("auto-forward time", 0) - Set the auto-forward time to infinite.
* Preference("auto-forward time", 10) - Set the auto-forward time (unit is seconds per 250 characters).
* Preference("auto-forward", "enable") - Enable auto-forward mode.
* Preference("auto-forward", "disable") - Disable auto-forward mode.
* Preference("auto-forward", "toggle") - Toggle auto-forward mode.
* Preference("auto-forward", "enable") - Enable auto-forward mode.
* Preference("auto-forward", "disable") - Disable auto-forward mode.
* Preference("auto-forward", "toggle") - Toggle auto-forward mode.
* Preference("auto-forward after click", "enable") - Remain in auto-forward mode after a click.
* Preference("auto-forward after click", "disable") - Disable auto-forward mode after a click.
* Preference("auto-forward after click", "toggle") - Toggle auto-forward after click.
* Preference("auto-forward after click", "enable") - Remain in auto-forward mode after a click.
* Preference("auto-forward after click", "disable") - Disable auto-forward mode after a click.
* Preference("auto-forward after click", "toggle") - Toggle auto-forward after click.
* Preference("automatic move", "enable") - Enable automatic mouse mode.
* Preference("automatic move", "disable") - Disable automatic mouse mode.
* Preference("automatic move", "toggle") - Toggle automatic mouse mode.
* Preference("automatic move", "enable") - Allow Ren'Py to move the mouse automatically using the :func:`MouseMove` action.
* Preference("automatic move", "disable") - Disable the :func:`MouseMove` action.
* Preference("automatic move", "toggle") - Toggle automatic mouse mode.
* Preference("wait for voice", "enable") - Wait for the currently playing voice to complete before auto-forwarding.
* Preference("wait for voice", "disable") - Do not wait for the currently playing voice to complete before auto-forwarding.
* Preference("wait for voice", "toggle") - Toggle wait voice.
* Preference("wait for voice", "enable") - Wait for the currently playing voice to complete before auto-forwarding.
* Preference("wait for voice", "disable") - Do not wait for the currently playing voice to complete before auto-forwarding.
* Preference("wait for voice", "toggle") - Toggle wait voice.
* Preference("voice sustain", "enable") - Sustain voice past the current interaction.
* Preference("voice sustain", "disable") - Don't sustain voice past the current interaction.
* Preference("voice sustain", "toggle") - Toggle voice sustain.
* Preference("voice sustain", "enable") - Sustain voice past the current interaction.
* Preference("voice sustain", "disable") - Don't sustain voice past the current interaction.
* Preference("voice sustain", "toggle") - Toggle voice sustain.
* Preference("music mute", "enable") - Mute the music mixer.
* Preference("music mute", "disable") - Un-mute the music mixer.
* Preference("music mute", "toggle") - Toggle music mute.
* Preference("music mute", "enable") - Mute the music mixer.
* Preference("music mute", "disable") - Un-mute the music mixer.
* Preference("music mute", "toggle") - Toggle music mute.
* Preference("sound mute", "enable") - Mute the sound mixer.
* Preference("sound mute", "disable") - Un-mute the sound mixer.
* Preference("sound mute", "toggle") - Toggle sound mute.
* Preference("sound mute", "enable") - Mute the sound mixer.
* Preference("sound mute", "disable") - Un-mute the sound mixer.
* Preference("sound mute", "toggle") - Toggle sound mute.
* Preference("voice mute", "enable") - Mute the voice mixer.
* Preference("voice mute", "disable") - Un-mute the voice mixer.
* Preference("voice mute", "toggle") - Toggle voice mute.
* Preference("voice mute", "enable") - Mute the voice mixer.
* Preference("voice mute", "disable") - Un-mute the voice mixer.
* Preference("voice mute", "toggle") - Toggle voice mute.
* Preference("mixer <mixer> mute", "enable") - Mute the specified mixer.
* Preference("mixer <mixer> mute", "disable") - Unmute the specified mixer.
* Preference("mixer <mixer> mute", "toggle") - Toggle mute of the specified mixer.
* Preference("mixer <mixer> mute", "enable") - Mute the specified mixer.
* Preference("mixer <mixer> mute", "disable") - Unmute the specified mixer.
* Preference("mixer <mixer> mute", "toggle") - Toggle mute of the specified mixer.
* Preference("all mute", "enable") - Mute each individual mixer.
* Preference("all mute", "disable") - Unmute each individual mixer.
* Preference("all mute", "toggle") - Toggle mute of each individual mixer.
* Preference("all mute", "enable") - Mute each individual mixer.
* Preference("all mute", "disable") - Unmute each individual mixer.
* Preference("all mute", "toggle") - Toggle mute of each individual mixer.
* Preference("main volume", 0.5) - Set the adjustment applied to all channels.
* Preference("music volume", 0.5) - Set the music volume.
* Preference("sound volume", 0.5) - Set the sound volume.
* Preference("voice volume", 0.5) - Set the voice volume.
* Preference("mixer <mixer> volume", 0.5) - Set the specified mixer volume.
* Preference("main volume", 0.5) - Set the adjustment applied to all channels.
* Preference("music volume", 0.5) - Set the music volume.
* Preference("sound volume", 0.5) - Set the sound volume.
* Preference("voice volume", 0.5) - Set the voice volume.
* Preference("mixer <mixer> volume", 0.5) - Set the specified mixer volume.
* Preference("emphasize audio", "enable") - Emphasize the audio channels found in :var:`config.emphasize_audio_channels`.
* Preference("emphasize audio", "disable") - Do not emphasize audio channels.
* Preference("emphasize audio", "toggle") - Toggle emphasize audio.
* Preference("emphasize audio", "enable") - Emphasize the audio channels found in :var:`config.emphasize_audio_channels`.
* Preference("emphasize audio", "disable") - Do not emphasize audio channels.
* Preference("emphasize audio", "toggle") - Toggle emphasize audio.
* Preference("self voicing", "enable") - Enables self-voicing.
* Preference("self voicing", "disable") - Disable self-voicing.
* Preference("self voicing", "toggle") - Toggles self-voicing.
* Preference("self voicing", "enable") - Enables self-voicing.
* Preference("self voicing", "disable") - Disable self-voicing.
* Preference("self voicing", "toggle") - Toggles self-voicing.
* Preference("self voicing volume drop", 0.5) - Drops the volume of non-voice mixers when self voicing is active.
* Preference("self voicing volume drop", 0.5) - Drops the volume of non-voice mixers when self voicing is active.
* Preference("clipboard voicing", "enable") - Enables clipboard-voicing.
* Preference("clipboard voicing", "disable") - Disable clipboard-voicing.
* Preference("clipboard voicing", "toggle") - Toggles clipboard-voicing.
* Preference("clipboard voicing", "enable") - Enables clipboard-voicing.
* Preference("clipboard voicing", "disable") - Disable clipboard-voicing.
* Preference("clipboard voicing", "toggle") - Toggles clipboard-voicing.
* Preference("debug voicing", "enable") - Enables self-voicing debug
* Preference("debug voicing", "disable") - Disable self-voicing debug.
* Preference("debug voicing", "toggle") - Toggles self-voicing debug.
* Preference("debug voicing", "enable") - Enables self-voicing debug
* Preference("debug voicing", "disable") - Disable self-voicing debug.
* Preference("debug voicing", "toggle") - Toggles self-voicing debug.
* Preference("rollback side", "left") - Touching the left side of the screen causes rollback.
* Preference("rollback side", "right") - Touching the right side of the screen causes rollback.
* Preference("rollback side", "disable") - Touching the screen will not cause rollback.
* Preference("rollback side", "left") - Touching the left side of the screen causes rollback.
* Preference("rollback side", "right") - Touching the right side of the screen causes rollback.
* Preference("rollback side", "disable") - Touching the screen will not cause rollback.
* Preference("gl powersave", True) - Drop framerate to allow for power savings.
* Preference("gl powersave", False) - Do not drop framerate to allow for power savings.
* Preference("gl powersave", "auto") - Enable powersave when running on battery.
* Preference("gl powersave", True) - Drop framerate to allow for power savings.
* Preference("gl powersave", False) - Do not drop framerate to allow for power savings.
* Preference("gl powersave", "auto") - Enable powersave when running on battery.
* Preference("gl framerate", None) - Runs at the display framerate.
* Preference("gl framerate", 60) - Runs at the given framerate.
* Preference("gl framerate", None) - Runs at the display framerate.
* Preference("gl framerate", 60) - Runs at the given framerate.
* Preference("gl tearing", True) - Tears rather than skipping frames.
* Preference("gl tearing", False) - Skips frames rather than tearing.
* Preference("gl tearing", True) - Tears rather than skipping frames.
* Preference("gl tearing", False) - Skips frames rather than tearing.
* Preference("font transform", "opendyslexic") - Sets the accessibility font transform to opendyslexic.
* Preference("font transform", "dejavusans") - Sets the accessibility font transform to deja vu sans.
* Preference("font transform", None) - Disables the accessibility font transform.
* Preference("font transform", "opendyslexic") - Sets the accessibility font transform to opendyslexic.
* Preference("font transform", "dejavusans") - Sets the accessibility font transform to deja vu sans.
* Preference("font transform", None) - Disables the accessibility font transform.
* Preference("font size", 1.0) - Sets the accessibility font size scaling factor.
* Preference("font line spacing", 1.0) - Sets the accessibility font vertical spacing scaling factor.
* Preference("font size", 1.0) - Sets the accessibility font size scaling factor.
* Preference("font line spacing", 1.0) - Sets the accessibility font vertical spacing scaling factor.
* Preference("system cursor", "enable") - Use system cursor ignoring :var:`config.mouse`.
* Preference("system cursor", "disable") - Use cursor defined in :var:`config.mouse`.
* Preference("system cursor", "toggle") - Toggle system cursor.
* Preference("system cursor", "disable") - Use the cursor defined in :var:`config.mouse` or :var:`config.mouse_displayable`.
* Preference("system cursor", "enable") - Use the system cursor, ignoring :var:`config.mouse`.
* Preference("system cursor", "toggle") - Toggle system cursor.
* Preference("high contrast text", "enable") - Enables white text on a black background.
* Preference("high contrast text", "disable") - Disables high contrast text.
* Preference("high contrast text", "toggle") - Toggles high contrast text.
* Preference("high contrast text", "enable") - Enables white text on a black background.
* Preference("high contrast text", "disable") - Disables high contrast text.
* Preference("high contrast text", "toggle") - Toggles high contrast text.
* Preference("audio when minimized", "enable") - Enable sounds playing when the window has been minimized.
* Preference("audio when minimized", "disable") - Disable sounds playing when the window has been minimized.
* Preference("audio when minimized", "toggle") - Toggle sounds playing when the window has been minimized.
* Preference("audio when minimized", "enable") - Enable sounds playing when the window has been minimized.
* Preference("audio when minimized", "disable") - Disable sounds playing when the window has been minimized.
* Preference("audio when minimized", "toggle") - Toggle sounds playing when the window has been minimized.
* Preference("audio when unfocused", "enable") - Enable sounds playing when the window is not in focus.
* Preference("audio when unfocused", "disable") - Disable sounds playing when the window is not in focus.
* Preference("audio when unfocused", "toggle") - Toggle sounds playing when the window is not in focus.
* Preference("audio when unfocused", "enable") - Enable sounds playing when the window is not in focus.
* Preference("audio when unfocused", "disable") - Disable sounds playing when the window is not in focus.
* Preference("audio when unfocused", "toggle") - Toggle sounds playing when the window is not in focus.
* Preference("web cache preload", "enable") - Will cause the web cache to be preloaded.
* Preference("web cache preload", "disable") - Will cause the web cache to not be preloaded, and preloaded data to be deleted.
* Preference("web cache preload", "toggle") - Will toggle the web cache preload state.
* Preference("web cache preload", "enable") - Will cause the web cache to be preloaded.
* Preference("web cache preload", "disable") - Will cause the web cache to not be preloaded, and preloaded data to be deleted.
* Preference("web cache preload", "toggle") - Will toggle the web cache preload state.
* Preference("voice after game menu", "enable") - Will cause the voice to continue being played when entering the game menu.
* Preference("voice after game menu", "disable") - Will cause the voice to stop being played when entering the game menu.
* Preference("voice after game menu", "toggle") - Will toggle the voice after game menu state.
* Preference("voice after game menu", "enable") - Will cause the voice to continue being played when entering the game menu.
* Preference("voice after game menu", "disable") - Will cause the voice to stop being played when entering the game menu.
* Preference("voice after game menu", "toggle") - Will toggle the voice after game menu state.
Values that can be used with bars are:
Values that can be used with bars are:
* Preference("text speed")
* Preference("auto-forward time")
* Preference("main volume")
* Preference("music volume")
* Preference("sound volume")
* Preference("voice volume")
* Preference("mixer <mixer> volume")
* Preference("self voicing volume drop")
* Preference("font size")
* Preference("font line spacing")
* Preference("text speed")
* Preference("auto-forward time")
* Preference("main volume")
* Preference("music volume")
* Preference("sound volume")
* Preference("voice volume")
* Preference("mixer <mixer> volume")
* Preference("self voicing volume drop")
* Preference("font size")
* Preference("font line spacing")
The `range` parameter can be given to give the range of certain bars.
For "text speed", it defaults to 200 cps. For "auto-forward time", it
defaults to 30.0 seconds per chunk of text. (These are maximums, not
defaults.)
The `range` parameter can be given to give the range of certain bars.
For "text speed", it defaults to 200 cps. For "auto-forward time", it
defaults to 30.0 seconds per chunk of text. (These are maximums, not
defaults.)
Actions that can be used with buttons are:
Actions that can be used with buttons are:
* Preference("renderer menu") - Show the renderer menu.
* Preference("accessibility menu") - Show the accessibility menu.
* Preference("renderer menu") - Show the renderer menu.
* Preference("accessibility menu") - Show the accessibility menu.
These screens are intended for internal use, and are not customizable.
"""
These screens are intended for internal use, and are not customizable.
"""
name = name.lower()
@@ -272,7 +272,11 @@ init -1500 python:
if value == "fullscreen":
return SetField(_preferences, "fullscreen", True)
elif value == "window":
return __DisplayAction(1.0)
if renpy.variant("web"):
# Only fullscreen and non-fullscreen modes for Web
return SetField(_preferences, "fullscreen", False)
else:
return __DisplayAction(1.0)
elif value == "any window":
return SetField(_preferences, "fullscreen", False)
elif value == "toggle":
+72 -10
View File
@@ -61,6 +61,10 @@ init -1150 python in bubble:
# The property group names, in order.
properties_order = [ ]
# If not None, a function that takes the character's image tag, and returns
# the list of property names that are allowed for that image tag.
properties_callback = None
# A map from property name to the (left, top, right, bottom) number of pixels
# areas with that property are expanded by. If a property is not in this
# map, None is tried.
@@ -75,6 +79,9 @@ init -1150 python in bubble:
frame = None
thoughtframe = None
# The layer that retained screens are placed on.
retain_layer = "screens"
class ToggleShown(Action):
def __call__(self):
if not active and not shown.value:
@@ -151,11 +158,19 @@ init -1150 python in bubble:
int(default_area[3] * ygrid)
]
return {
rv = {
"area" : default_area_rect,
"properties" : properties_order[0]
}
if properties_callback is not None:
rv["properties"] = properties_callback(image_tag)[0]
else:
rv["properties"] = properties_order[0]
return rv
def expand_area(self, area, properties_key):
"""
This is called to expand the area of a bubble. It is given the
@@ -178,8 +193,16 @@ init -1150 python in bubble:
return (x, y, w, h)
def do_add(self, who, what, multiple=False):
def do_show(self, who, what, multiple=None, extra_properties=None):
tlid = renpy.get_translation_identifier()
if tlid is not None:
if db[tlid].get("clear_retain", False):
renpy.clear_retain(layer=retain_layer)
def do_show(self, who, what, multiple=None, retain=None, extra_properties=None):
if extra_properties is None:
extra_properties = { }
@@ -188,7 +211,7 @@ init -1150 python in bubble:
image_tag = self.image_tag
if image_tag not in tag_properties:
if retain or (image_tag not in tag_properties):
tag_properties[image_tag] = self.bubble_default_properties(image_tag)
tlid = renpy.get_translation_identifier()
@@ -204,7 +227,7 @@ init -1150 python in bubble:
extra_properties.update(properties.get(properties_key, { }))
extra_properties[area_property] = self.expand_area(tag_properties[image_tag]["area"], properties_key)
return super(BubbleCharacter, self).do_show(who, what, multiple=multiple, extra_properties=extra_properties)
return super(BubbleCharacter, self).do_show(who, what, multiple=multiple, retain=retain, extra_properties=extra_properties)
class CycleBubbleProperty(Action):
"""
@@ -223,14 +246,19 @@ init -1150 python in bubble:
current = tag_properties[self.image_tag]["properties"]
if properties_callback is not None:
properties = properties_callback(self.image_tag)
else:
properties = properties_order
try:
idx = properties_order.index(current)
idx = properties.index(current)
except ValueError:
idx = 0
idx = (idx + 1) % len(properties_order)
idx = (idx + 1) % len(properties)
db[self.tlid]["properties"] = properties_order[idx]
db[self.tlid]["properties"] = properties[idx]
renpy.rollback(checkpoints=0, force=True, greedy=True)
def alternate(self):
@@ -238,6 +266,26 @@ init -1150 python in bubble:
del db[self.tlid]["properties"]
renpy.rollback(checkpoints=0, force=True, greedy=True)
class ToggleClearRetain(Action):
"""
This is an action that causes the clear_retain property to be toggled.
"""
def __init__(self, tlid):
self.tlid = tlid
def get_selected(self):
return db[self.tlid].get("clear_retain", False)
def __call__(self):
db[self.tlid]["clear_retain"] = not db[self.tlid].get("clear_retain", False)
renpy.rollback(checkpoints=0, force=True, greedy=True)
def alternate(self):
self()
class SetWindowArea(Action):
"""
An action that displays the area picker to select the window area.
@@ -356,6 +404,18 @@ screen _bubble_editor():
null height gui._scale(5)
if bubble.current_dialogue and renpy.get_screen("_retain_0", layer=bubble.retain_layer):
textbutton _("(clear retained bubbles)"):
style "_default"
text_color "#ddd8"
text_selected_idle_color "#ddd"
text_hover_color "#fff"
text_size gui._scale(16)
action bubble.ToggleClearRetain(bubble.current_dialogue[0][1])
null height gui._scale(5)
for image_tag, properties in bubble.GetCurrentDialogue():
hbox:
@@ -364,7 +424,7 @@ screen _bubble_editor():
text "[image_tag!q]":
style "_default"
color "#fff"
size gui._scale(15)
size gui._scale(16)
for prop, action in properties:
textbutton "[prop!q]":
@@ -374,7 +434,9 @@ screen _bubble_editor():
text_color "#ddd8"
text_selected_idle_color "#ddd"
text_hover_color "#fff"
text_size gui._scale(15)
text_size gui._scale(16)
screen _bubble_window_area_editor(action):
+1 -7
View File
@@ -24,8 +24,6 @@ init -1500 python:
self.points = []
for p in points:
length = len(p)
if isinstance(p[-1], float):
length = len(p) - 1
point = [ p[-1] ]
@@ -62,11 +60,7 @@ init -1500 python:
self.initialized = None
def init_values(self, sizes):
def to_abs_(value, size):
if isinstance(value, float):
return value * size
else:
return value
to_abs_ = absolute.compute_raw
def coord_(c):
+1 -1
View File
@@ -874,7 +874,7 @@ init -1499 python in achievement:
renpy.write_log("Initialized steam.")
except Exception as e:
renpy.write_log("Faled to initialize steam: %r", e)
renpy.write_log("Failed to initialize steam: %r", e)
steam = None
steamapi = None
+5 -2
View File
@@ -354,8 +354,11 @@ init -1100 python in _sync:
total_size = 0
if renpy.config.save_directory:
zf.writestr("save_directory", renpy.config.save_directory)
sd = renpy.config.save_directory
if sd:
if PY2:
sd = sd.encode("utf-8")
zf.writestr("save_directory", sd)
persistent = location.path("persistent")[1]
+2 -2
View File
@@ -139,7 +139,7 @@ let start_playing = (c) => {
}
if (p.end >= 0) {
p.source.start(0, p.start, p.end);
p.source.start(0, p.start, p.end - p.start);
} else {
p.source.start(0, p.start);
}
@@ -287,7 +287,7 @@ let video_start = (c) => {
c.playing.source.stop(context.currentTime + p.fadeout);
} catch (e) {
}
}
setValue(c.relative_volume.gain, p.relative_volume);
+11 -11
View File
@@ -142,11 +142,11 @@ from future.builtins import chr
def add_attribute(obj, name, value):
pass
try:
if PY2:
if PY2:
try:
from renpy.compat.dictviews import add_attribute
except ImportError:
print("Could not import renpy.compat.dictviews.", file=sys.stderr)
except ImportError:
print("Could not import renpy.compat.dictviews.", file=sys.stderr)
################################################################################
@@ -183,13 +183,14 @@ if PY2:
# Chance the default for subprocess.Popen.
if PY2:
import subprocess
class Popen(subprocess.Popen):
def __init__(self, *args, **kwargs):
if ("stdout" not in kwargs) and ("stderr" not in kwargs) and ("stdin" not in kwargs):
kwargs.setdefault("close_fds", True)
super(Popen, self).__init__(*args, **kwargs)
if hasattr(subprocess, 'Popen'): # Web2 does not have subprocess.Popen
class Popen(subprocess.Popen):
def __init__(self, *args, **kwargs):
if ("stdout" not in kwargs) and ("stderr" not in kwargs) and ("stdin" not in kwargs):
kwargs.setdefault("close_fds", True)
super(Popen, self).__init__(*args, **kwargs)
subprocess.Popen = Popen
subprocess.Popen = Popen
################################################################################
@@ -204,6 +205,5 @@ if PY2:
# Generated by scripts/relative_imports.py, do not edit below this line.
if 1 == 0:
from . import dictviews
from . import fixes
from . import pickle
+7 -3
View File
@@ -1377,9 +1377,6 @@ early_developer = False
# A function that returns the autosave prefix.
autosave_prefix_callback = None
# Functions called when a test ends - one way or another
end_testcase_callbacks = [ ]
# Compatibility for c492f2f8e6de57b2740fa5d00566f445124caaba.
at_transform_compare_full_context = False
@@ -1395,6 +1392,13 @@ quadratic_volumes = False
# If true, fades will be linear rather than logarithmic.
linear_fades = False
# Classes that used to participate in rollback, but no longer do.
ex_rollback_classes = [ ]
# Should we revert to the old behavior of box_reverse?
simple_box_reverse = False
del os
del collections
+1
View File
@@ -391,6 +391,7 @@ adv = ADVCharacter(None,
callback=None,
type='say',
advance=True,
retain=False,
who_style='say_label',
what_style='say_dialogue',
+2
View File
@@ -72,6 +72,7 @@ if 1 == 0:
from . import behavior
from . import controller
from . import core
from . import displayable
from . import dragdrop
from . import emulator
from . import error
@@ -93,6 +94,7 @@ if 1 == 0:
from . import pgrender
from . import predict
from . import presplash
from . import quaternion
from . import render
from . import scale
from . import screen
+9 -19
View File
@@ -94,7 +94,7 @@ def get_poi(state):
height = renpy.config.screen_height
placement = (d.xpos, d.ypos, d.xanchor, d.yanchor, d.xoffset, d.yoffset, True)
xplacement, yplacement = renpy.display.core.place(width, height, width, height, placement)
xplacement, yplacement = renpy.display.displayable.place(width, height, width, height, placement)
return (xplacement + width / 2, yplacement + height / 2, d.zpos + z11)
@@ -392,13 +392,13 @@ cdef class RenderTransform:
ysize = state.ysize
if xsize is not None:
if (type(xsize) is float) and renpy.config.relative_transform_size:
xsize *= self.widtho
if renpy.config.relative_transform_size:
xsize = absolute.compute_raw(xsize, self.widtho)
self.widtho = xsize
if ysize is not None:
if (type(ysize) is float) and renpy.config.relative_transform_size:
ysize *= self.heighto
if renpy.config.relative_transform_size:
ysize = absolute.compute_raw(ysize, self.heighto)
self.heighto = ysize
self.cr = render(child, self.widtho, self.heighto, st - self.transform.child_st_base, at)
@@ -644,7 +644,7 @@ cdef class RenderTransform:
zrotate = state.zrotate or 0
placement = (state.xpos, state.ypos, state.xanchor, state.yanchor, state.xoffset, state.yoffset, True)
xplacement, yplacement = renpy.display.core.place(width, height, width, height, placement)
xplacement, yplacement = renpy.display.displayable.place(width, height, width, height, placement)
if poi:
start_pos = (xplacement + width / 2, yplacement + height / 2, state.zpos + z11)
@@ -753,18 +753,13 @@ cdef class RenderTransform:
manchory = height / 2.0
else:
manchorx, manchory = state.matrixanchor
if type(manchorx) is float:
manchorx *= width
if type(manchory) is float:
manchory *= height
manchorx, manchory = map(absolute.compute_raw, state.matrixanchor, (width, height))
m = Matrix.offset(-manchorx, -manchory, 0.0)
if poi:
placement = self.transform.get_placement()
xplacement, yplacement = renpy.display.core.place(self.widtho, self.heighto, width, height, placement)
xplacement, yplacement = renpy.display.displayable.place(self.widtho, self.heighto, width, height, placement)
start_pos = (xplacement + manchorx, yplacement + manchory, state.zpos)
a, b, c = ( float(e - s) for s, e in zip(start_pos, poi) )
@@ -833,12 +828,7 @@ cdef class RenderTransform:
manchory = self.height / 2.0
else:
manchorx, manchory = state.matrixanchor
if type(manchorx) is float:
manchorx *= self.width
if type(manchory) is float:
manchory *= self.height
manchorx, manchory = map(absolute.compute_raw, state.matrixanchor, (self.width, self.height))
m = Matrix.offset(-manchorx, -manchory, 0.0)
m = mt * m
+4 -4
View File
@@ -55,7 +55,7 @@ class State(object):
Position object, that modifies the position of the image.
"""
if image and not isinstance(image, renpy.display.core.Displayable):
if image and not isinstance(image, renpy.display.displayable.Displayable):
image = renpy.easy.displayable(image)
self.name = name
@@ -125,7 +125,7 @@ class Edge(object):
sma.edges.setdefault(self.old, []).append(self)
class SMAnimation(renpy.display.core.Displayable):
class SMAnimation(renpy.display.displayable.Displayable):
"""
This creates a state-machine animation. Such an animation is
created by randomly traversing the edges between states in a
@@ -322,7 +322,7 @@ def Animation(*args, **kwargs):
return TransitionAnimation(*newargs, **kwargs)
class TransitionAnimation(renpy.display.core.Displayable):
class TransitionAnimation(renpy.display.displayable.Displayable):
"""
A displayable that draws an animation with each frame separated
by a transition.
@@ -409,7 +409,7 @@ class TransitionAnimation(renpy.display.core.Displayable):
return self.images
class Blink(renpy.display.core.Displayable):
class Blink(renpy.display.displayable.Displayable):
def __init__(self, image, on=0.5, off=0.5, rise=0.5, set=0.5, # @ReservedAssignment
high=1.0, low=0.0, offset=0.0, anim_timebase=False, **properties):
+22 -11
View File
@@ -98,9 +98,16 @@ def compile_event(key, keydown):
mouse = True
rv = "(ev.type == %d" % pygame.MOUSEBUTTONUP
if not keydown:
return "(False)"
elif part[0] == "mousedown":
mouse = True
rv = "(ev.type == %d" % pygame.MOUSEBUTTONDOWN
if keydown:
rv = "(ev.type == %d" % pygame.MOUSEBUTTONDOWN
else:
rv = "(ev.type == %d" % pygame.MOUSEBUTTONUP
elif keydown:
rv = "(ev.type == %d" % pygame.KEYDOWN
@@ -108,9 +115,6 @@ def compile_event(key, keydown):
else:
rv = "(ev.type == %d" % pygame.KEYUP
if mouse and not keydown:
return
if not mouse:
if "repeat" in modifiers:
@@ -795,7 +799,7 @@ class SayBehavior(renpy.display.layout.Null):
return None
class DismissBehavior(renpy.display.core.Displayable):
class DismissBehavior(renpy.display.displayable.Displayable):
"""
This is used to implement the dismiss screen language statement.
"""
@@ -1309,7 +1313,7 @@ def input_post_per_interact():
i.caret_pos = len(content)
class CaretBlink(renpy.display.core.Displayable):
class CaretBlink(renpy.display.displayable.Displayable):
"""
A displayable that renders the caret.
"""
@@ -2037,6 +2041,10 @@ class Adjustment(renpy.object.Object):
if self.animation_start is None:
self.animation_start = st
if st < self.animation_start:
self.end_animation(instantly=True)
return 0
done = (st - self.animation_start) / self.animation_delay
done = self.animation_warper(done)
@@ -2054,7 +2062,7 @@ class Adjustment(renpy.object.Object):
return 0
class Bar(renpy.display.core.Displayable):
class Bar(renpy.display.displayable.Displayable):
"""
Implements a bar that can display an integer value, and respond
to clicks on that value.
@@ -2196,6 +2204,9 @@ class Bar(renpy.display.core.Displayable):
return renpy.display.render.Render(width, height)
elif self.style.unscrollable == "insensitive":
self.set_style_prefix("insensitive_", True)
else:
if self.style.prefix == "insensitive_":
self.set_style_prefix("idle_", True)
self.hidden = False
@@ -2571,7 +2582,7 @@ class Timer(renpy.display.layout.Null):
return run(self.function, *self.args, **self.kwargs)
class MouseArea(renpy.display.core.Displayable):
class MouseArea(renpy.display.displayable.Displayable):
# The offset between st and at.
at_st_offset = 0
@@ -2633,7 +2644,7 @@ class MouseArea(renpy.display.core.Displayable):
run(self.unhovered)
class OnEvent(renpy.display.core.Displayable):
class OnEvent(renpy.display.displayable.Displayable):
"""
This is a displayable that runs an action in response to a transform
event. It's used to implement the screen language on statement.
@@ -2825,7 +2836,7 @@ class AreaPicker(renpy.display.layout.Container):
class WebInput(renpy.display.core.Displayable):
class WebInput(renpy.display.displayable.Displayable):
"""
A displayable meant to pull input from an input tag in the web browser.
"""
@@ -2854,7 +2865,7 @@ class WebInput(renpy.display.core.Displayable):
@staticmethod
def post_find_focusable():
if not renpy.emscripten:
if PY2 or not renpy.emscripten:
return
if WebInput.active is None:
+111 -599
View File
@@ -19,9 +19,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.
# This file contains code for initializing and managing the display
# window.
from __future__ import division, absolute_import, with_statement, print_function, unicode_literals
from renpy.compat import PY2, basestring, bchr, bord, chr, open, pystr, range, round, str, tobytes, unicode # *
@@ -39,6 +36,8 @@ import atexit
import pygame_sdl2 as pygame
import renpy
from renpy.display.displayable import Displayable, DisplayableArguments, place
import_time = time.time()
try:
@@ -190,608 +189,109 @@ class EndInteraction(Exception):
self.value = value
def absolute_wrap(func):
"""
Wraps func_name into a method of absolute. The wrapped method
converts a float result back to absolute.
"""
def wrapper(*args):
rv = func(*args)
if type(rv) is float:
return absolute(rv)
else:
return rv
return wrapper
class absolute(float):
"""
This represents an absolute float coordinate.
"""
__slots__ = [ ]
def place(width, height, sw, sh, placement):
"""
Performs the Ren'Py placement algorithm.
`width`, `height`
The width and height of the area the image will be
placed in.
`size`
The size of the image to be placed.
`placement`
The tuple returned by Displayable.get_placement().
"""
xpos, ypos, xanchor, yanchor, xoffset, yoffset, _subpixel = placement
if xpos is None:
xpos = 0
if ypos is None:
ypos = 0
if xanchor is None:
xanchor = 0
if yanchor is None:
yanchor = 0
if xoffset is None:
xoffset = 0
if yoffset is None:
yoffset = 0
# We need to use type, since isinstance(absolute(0), float).
if xpos.__class__ is float:
xpos *= width
if xanchor.__class__ is float:
xanchor *= sw
x = xpos + xoffset - xanchor
if ypos.__class__ is float:
ypos *= height
if yanchor.__class__ is float:
yanchor *= sh
y = ypos + yoffset - yanchor
return x, y
class DisplayableArguments(renpy.object.Object):
"""
Represents a set of arguments that can be passed to a duplicated
displayable.
"""
# The name of the displayable without any arguments.
name = () # type: Tuple
# Arguments supplied.
args = () # type: Tuple
# The style prefix in play. This is used by DynamicImage to figure
# out the prefix list to apply.
prefix = None # Optional[str]
# True if lint is in use.
lint = False
def copy(self, **kwargs):
"""
Returns a copy of this object with the various fields set to the
values they were given in kwargs.
"""
rv = DisplayableArguments()
rv.__dict__.update(self.__dict__)
rv.__dict__.update(kwargs)
return rv
def extraneous(self):
if renpy.config.developer and renpy.config.report_extraneous_attributes:
raise Exception("Image '{}' does not accept attributes '{}'.".format(
" ".join(self.name),
" ".join(self.args),
))
default_style = renpy.style.Style("default")
class Displayable(renpy.object.Object):
"""
The base class for every object in Ren'Py that can be
displayed to the screen.
Drawables will be serialized to a savegame file. Therefore, they
shouldn't store non-serializable things (like pygame surfaces) in
their fields.
"""
# Some invariants about method call order:
#
# per_interact is called before render.
# render is called before event.
#
# get_placement can be called at any time, so can't
# assume anything.
# If True this displayable can accept focus.
# If False, it can't, but it keeps its place in the focus order.
# If None, it does not have a place in the focus order.
focusable = None
# This is the focus named assigned by the focus code.
full_focus_name = None
# A role ('selected_' or '' that prefixes the style).
role = ''
# The event we'll pass on to our parent transform.
transform_event = None
# Can we change our look in response to transform_events?
transform_event_responder = False
# The main displayable, if this displayable is the root of a composite
# displayable. (This is used by SL to figure out where to add children
# to.) If None, it is itself.
_main = None
# A list of the children that make up this composite displayable.
_composite_parts = [ ]
# The location the displayable was created at, if known.
_location = None
# Does this displayable use the scope?
_uses_scope = False
# Arguments supplied to this displayable.
_args = DisplayableArguments()
# Set to true of the displayable is duplicatable (has a non-trivial
# duplicate method), or one of its children is.
_duplicatable = False
# Does this displayable require clipping?
_clipping = False
# Does this displayable have a tooltip?
_tooltip = None
# Should hbox and vbox skip this displayable?
_box_skip = False
# If not None, this should be a (width, height) tuple that overrides the
# amount of space offered to the displayable.
_offer_size = None
# If true, this displayable will be treated as draggable in its own right.
# This is used by viewport to decide if a drag is meant for the viewport
# or for its child.
_draggable = False
# Used by a transition (or transition-like object) to determine how long to
# delay for.
delay = None # type: float|None
def __ne__(self, o):
return not (self == o)
def __init__(self, focus=None, default=False, style='default', _args=None, tooltip=None, default_focus=False, **properties):
global default_style
if (style == "default") and (not properties):
self.style = default_style
else:
self.style = renpy.style.Style(style, properties) # @UndefinedVariable
self.focus_name = focus
self.default = default or default_focus
self._tooltip = tooltip
if _args is not None:
self._args = _args
def _copy(self, args=None):
"""
Makes a shallow copy of the displayable. If `args` is provided,
replaces the arguments with the stored copy.
"""
rv = copy.copy(self)
if args is not None:
rv._args = args
return rv
def _duplicate(self, args):
"""
Makes a duplicate copy of the following kids of displayables:
* Displayables that can accept arguments.
* Displayables that maintain state that should be reset before being
shown to the user.
* Containers that contain (including transitively) one of the other
kinds of displayables.
Displayables that contain state that can be manipulated by the user
are never copied.
This should call _unique on children that have been copied before
setting its own _duplicatable flag.
"""
if args and args.args:
args.extraneous()
return self
def _get_tooltip(self):
"""
Returns the tooltip of this displayable.
"""
return self._tooltip
def _in_current_store(self):
"""
Returns a version of this displayable that will not change as it is
rendered.
"""
return self
def _unique(self):
"""
This is called when a displayable is "unique", meaning there will
only be one reference to it, ever, from the tree of displayables.
"""
self._duplicatable = False
return
def parameterize(self, name, parameters):
"""
Obsolete alias for _duplicate.
"""
a = self._args.copy(name=name, args=parameters)
return self._duplicate(a)
def _equals(self, o):
"""
This is a utility method that can be called by a Displayable's
__eq__ method, to compare displayables for type and displayable
component equality.
"""
if type(self) is not type(o):
return False
if self.focus_name != o.focus_name:
return False
if self.style != o.style:
return False
if self.default != o.default:
return False
return True
def _repr_info(self):
return None
__slots__ = ()
def __repr__(self):
rep = object.__repr__(self)
reprinfo = self._repr_info()
if reprinfo is None:
return rep
if reprinfo and not ((reprinfo[0] == '(') and (reprinfo[-1] == ')')):
reprinfo = "".join(("(", reprinfo, ")"))
parto = rep.rpartition(" at ")
return " ".join((parto[0],
reprinfo,
"at",
parto[2]))
return "absolute({})".format(float.__repr__(self))
def find_focusable(self, callback, focus_name):
def __divmod__(self, value):
return self//value, self%value
focus_name = self.focus_name or focus_name
def __rdivmod__(self, value):
return value//self, value%self
if self.focusable:
callback(self, focus_name)
elif self.focusable is not None:
callback(None, focus_name)
for i in self.visit():
if i is None:
continue
i.find_focusable(callback, focus_name)
def focus(self, default=False):
@staticmethod
def compute_raw(value, room):
"""
Called to indicate that this widget has the focus.
Converts a position from one of the many supported position types
into an absolute number of pixels, without regard for the return type.
"""
if isinstance(value, (absolute, int)):
return value
elif isinstance(value, float):
return value * room
raise TypeError("Value {} of type {} not recognized as a position.".format(value, type(value)))
self.set_style_prefix(self.role + "hover_", True)
if not default:
renpy.exports.play(self.style.hover_sound)
def unfocus(self, default=False):
@staticmethod
def compute(value, room):
"""
Called to indicate that this widget has become unfocused.
Does the same, but converts the result to the absolute type.
"""
self.set_style_prefix(self.role + "idle_", True)
def is_focused(self):
if renpy.display.focus.grab and renpy.display.focus.grab is not self:
return
return renpy.game.context().scene_lists.focused is self
def set_style_prefix(self, prefix, root):
"""
Called to set the style prefix of this widget and its child
widgets, if any.
`root` - True if this is the root of a style tree, False if this
has been passed on to a child.
"""
if prefix == self.style.prefix:
return
self.style.set_prefix(prefix)
renpy.display.render.redraw(self, 0)
def render(self, width, height, st, at):
"""
Called to display this displayable. This is called with width
and height parameters, which give the largest width and height
that this drawable can be drawn to without overflowing some
bounding box. It's also given two times. It returns a Surface
that is the current image of this drawable.
@param st: The time since this widget was first shown, in seconds.
@param at: The time since a similarly named widget was first shown,
in seconds.
"""
raise Exception("Render not implemented.")
def event(self, ev, x, y, st):
"""
Called to report than an event has occured. Ev is the raw
pygame event object representing that event. If the event
involves the mouse, x and y are the translation of the event
into the coordinates of this displayable. st is the time this
widget has been shown for.
@returns A value that should be returned from Interact, or None if
no value is appropriate.
"""
return None
def get_placement(self):
"""
Returns a style object containing placement information for
this Displayable. Children are expected to overload this
to return something more sensible.
"""
return self.style.get_placement()
def visit_all(self, callback, seen=None):
"""
Calls the callback on this displayable, and then on all children
of this displayable.
"""
if seen is None:
seen = set()
for d in self.visit():
if d is None:
continue
id_d = id(d)
if id_d in seen:
continue
seen.add(id_d)
d.visit_all(callback, seen)
callback(self)
def visit(self):
"""
Called to ask the displayable to return a list of its children
(including children taken from styles). For convenience, this
list may also include None values.
"""
return [ ]
def per_interact(self):
"""
Called once per widget per interaction.
"""
return None
def predict_one(self):
"""
Called to ask this displayable to call the callback with all
the images it may want to load.
"""
return
def predict_one_action(self):
"""
Called to ask this displayable to cause image prediction
to occur for images that may be loaded by its actions.
"""
return
def place(self, dest, x, y, width, height, surf, main=True):
"""
This places a render (which must be of this displayable)
within a bounding area. Returns an (x, y) tuple giving the location
the displayable was placed at.
`dest`
If not None, the `surf` will be blitted to `dest` at the
computed coordinates.
`x`, `y`, `width`, `height`
The bounding area.
`surf`
The render to place.
`main`
This is passed to Render.blit().
"""
placement = self.get_placement()
subpixel = placement[6]
xpos, ypos = place(width, height, surf.width, surf.height, placement)
xpos += x
ypos += y
pos = (xpos, ypos)
if dest is not None:
if subpixel:
dest.subpixel_blit(surf, pos, main, main, None)
else:
dest.blit(surf, pos, main, main, None)
return pos
def set_transform_event(self, event):
"""
Sets the transform event of this displayable to event.
"""
if event == self.transform_event:
return
self.transform_event = event
if self.transform_event_responder:
renpy.display.render.redraw(self, 0)
def _handles_event(self, event):
"""
Returns True if the displayable handles event, False otherwise.
"""
return False
def _hide(self, st, at, kind):
"""
Returns None if this displayable is ready to be hidden, or
a replacement displayable if it doesn't want to be hidden
quite yet.
Kind may be "hide", "replace", or "cancel", with the latter
being called when the hide is being hidden itself because
another displayable is shown.
"""
return None
def _show(self):
"""
No longer used.
"""
def _target(self):
"""
If this displayable is part of a chain of one or more references,
returns the ultimate target of those references. Otherwise, returns
the displayable.
"""
return self
def _change_transform_child(self, child):
"""
If this is a transform, makes a copy of the transform and sets
the child of the innermost transform to this. Otherwise,
simply returns child.
"""
return child
def _clear(self):
"""
Clears out the children of this displayable, if any.
"""
return
def _tts_common(self, default_alt=None, reverse=False):
rv = [ ]
if reverse:
order = -1
else:
order = 1
speech = ""
for i in self.visit()[::order]:
if i is not None:
speech = i._tts()
if speech.strip():
if isinstance(speech, renpy.display.tts.TTSDone):
rv = [ speech ]
else:
rv.append(speech)
rv = ": ".join(rv)
rv = rv.replace("::", ":")
rv = rv.replace(": :", ":")
alt = self.style.alt
if alt is None:
alt = default_alt
if alt is not None:
rv = renpy.substitutions.substitute(alt, scope={ "text" : rv })[0]
rv = type(speech)(rv)
return rv
def _tts(self):
"""
Returns the self-voicing text of this displayable and all of its
children that cannot take focus. If the displayable can take focus,
returns the empty string.
"""
return self._tts_common()
def _tts_all(self):
"""
Returns the self-voicing text of this displayable and all of its
children that cannot take focus.
"""
return self._tts_common()
return absolute(absolute.compute_raw(value, room))
for fn in (
'__coerce__', # PY2
'__div__', # PY2
'__long__', # PY2
'__nonzero__', # PY2
'__rdiv__', # PY2
'__abs__',
'__add__',
# '__bool__', # non-float
'__ceil__',
# '__divmod__', # special-cased above, tuple of floats
# '__eq__', # non-float
'__floordiv__',
# '__format__', # non-float
# '__ge__', # non-float
# '__gt__', # non-float
# '__hash__', # non-float
# '__int__', # non-float
# '__le__', # non-float
# '__lt__', # non-float
'__mod__',
'__mul__',
# '__ne__', # non-float
'__neg__',
'__pos__',
'__pow__',
'__radd__',
# '__rdivmod__', # special-cased above, tuple of floats
'__rfloordiv__',
'__rmod__',
'__rmul__',
'__round__',
'__rpow__',
'__rsub__',
'__rtruediv__',
# '__str__', # non-float
'__sub__',
'__truediv__',
# '__trunc__', # non-float
# 'as_integer_ratio', # tuple of non-floats
'conjugate',
'fromhex',
# 'hex', # non-float
# 'is_integer', # non-float
):
f = getattr(float, fn, None)
if f is not None: # for PY2-only and PY3-only methods
setattr(absolute, fn, absolute_wrap(f))
del absolute_wrap, fn, f # type: ignore
class SceneListEntry(renpy.object.Object):
@@ -2437,6 +1937,12 @@ class Interface(object):
pygame.event.set_blocked(i)
pygame.event.set_blocked(pygame.TEXTINPUT)
# Fix a problem with fullscreen and maximized.
if renpy.game.preferences.fullscreen:
renpy.game.preferences.maximized = False
def after_first_frame(self):
"""
Called after the first frame has been drawn.
@@ -2460,7 +1966,7 @@ class Interface(object):
if icon:
try:
with renpy.loader.load(icon) as f:
with renpy.loader.load(icon, directory="images") as f:
im = renpy.display.scale.image_load_unscaled(
f,
icon,
@@ -2627,6 +2133,7 @@ class Interface(object):
# Stop the resizing.
pygame.key.stop_text_input() # @UndefinedVariable
pygame.key.set_text_input_rect(None) # @UndefinedVariable
pygame.event.set_blocked(pygame.TEXTINPUT)
self.text_rect = None
self.old_text_rect = None
self.display_reset = False
@@ -3412,6 +2919,7 @@ class Interface(object):
rect = (x0, y0, x1 - x0, y1 - y0)
pygame.key.set_text_input_rect(rect) # @UndefinedVariable
pygame.event.set_allowed(pygame.TEXTINPUT)
if not self.old_text_rect or not_shown:
pygame.key.start_text_input() # @UndefinedVariable
@@ -3428,6 +2936,7 @@ class Interface(object):
if self.old_text_rect:
pygame.key.stop_text_input() # @UndefinedVariable
pygame.key.set_text_input_rect(None) # @UndefinedVariable
pygame.event.set_blocked(pygame.TEXTINPUT)
if self.touch_keyboard:
renpy.exports.hide_screen('_touch_keyboard', layer='screens')
@@ -3841,7 +3350,7 @@ class Interface(object):
new_widget=new_d)
if not isinstance(trans, Displayable):
raise Exception("Expected transition to be a displayable, not a %r" % trans)
raise Exception("Expected transition to return a displayable, not a {!r}".format(trans))
if isinstance(trans, renpy.display.transform.Transform) and isinstance(old_trans, renpy.display.transform.Transform):
trans.take_state(old_trans)
@@ -3893,7 +3402,7 @@ class Interface(object):
trans = instantiate_transition(None, old_root, layers_root)
if not isinstance(trans, Displayable):
raise Exception("Expected transition to be a displayable, not a %r" % trans)
raise Exception("Expected transition to return a displayable, not a {!r}".format(trans))
transition_time = self.transition_time.get(None, None)
root_widget.add(trans, transition_time, transition_time)
@@ -3925,13 +3434,16 @@ class Interface(object):
for i in renpy.display.emulator.overlay:
root_widget.add(i)
mouse_displayable = renpy.config.mouse_displayable
if mouse_displayable is not None:
if not isinstance(mouse_displayable, Displayable):
mouse_displayable = mouse_displayable()
if renpy.game.preferences.system_cursor:
mouse_displayable = None
else:
mouse_displayable = renpy.config.mouse_displayable
if mouse_displayable is not None:
root_widget.add(mouse_displayable, 0, 0)
if not isinstance(mouse_displayable, Displayable):
mouse_displayable = mouse_displayable()
if mouse_displayable is not None:
root_widget.add(mouse_displayable, 0, 0)
self.prediction_coroutine = renpy.display.predict.prediction_coroutine(root_widget)
self.prediction_coroutine.send(None)
+620
View File
@@ -0,0 +1,620 @@
# Copyright 2004-2023 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from __future__ import division, absolute_import, with_statement, print_function, unicode_literals
from renpy.compat import PY2, basestring, bchr, bord, chr, open, pystr, range, round, str, tobytes, unicode # *
import copy
import renpy
def place(width, height, sw, sh, placement):
"""
Performs the Ren'Py placement algorithm.
`width`, `height`
The width and height of the area the image will be
placed in.
`sw`, `sh`
The size of the image to be placed.
`placement`
The tuple returned by Displayable.get_placement().
"""
xpos, ypos, xanchor, yanchor, xoffset, yoffset, _subpixel = placement
compute_raw = renpy.display.core.absolute.compute_raw
if xpos is None:
xpos = 0
if ypos is None:
ypos = 0
if xanchor is None:
xanchor = 0
if yanchor is None:
yanchor = 0
if xoffset is None:
xoffset = 0
if yoffset is None:
yoffset = 0
xpos = compute_raw(xpos, width)
xanchor = compute_raw(xanchor, sw)
x = xpos + xoffset - xanchor
ypos = compute_raw(ypos, height)
yanchor = compute_raw(yanchor, sh)
y = ypos + yoffset - yanchor
return x, y
class DisplayableArguments(renpy.object.Object):
"""
Represents a set of arguments that can be passed to a duplicated
displayable.
"""
# The name of the displayable without any arguments.
name = () # type: tuple
# Arguments supplied.
args = () # type: tuple
# The style prefix in play. This is used by DynamicImage to figure
# out the prefix list to apply.
prefix = None # Optional[str]
# True if lint is in use.
lint = False
def copy(self, **kwargs):
"""
Returns a copy of this object with the various fields set to the
values they were given in kwargs.
"""
rv = DisplayableArguments()
rv.__dict__.update(self.__dict__)
rv.__dict__.update(kwargs)
return rv
def extraneous(self):
if renpy.config.developer and renpy.config.report_extraneous_attributes:
raise Exception("Image '{}' does not accept attributes '{}'.".format(
" ".join(self.name),
" ".join(self.args),
))
default_style = renpy.style.Style("default")
class Displayable(renpy.object.Object):
"""
The base class for every object in Ren'Py that can be
displayed to the screen.
Drawables will be serialized to a savegame file. Therefore, they
shouldn't store non-serializable things (like pygame surfaces) in
their fields.
"""
# Some invariants about method call order:
#
# per_interact is called before render.
# render is called before event.
#
# get_placement can be called at any time, so can't
# assume anything.
# If True this displayable can accept focus.
# If False, it can't, but it keeps its place in the focus order.
# If None, it does not have a place in the focus order.
focusable = None
# This is the focus named assigned by the focus code.
full_focus_name = None
# A role ('selected_' or '' that prefixes the style).
role = ''
# The event we'll pass on to our parent transform.
transform_event = None
# Can we change our look in response to transform_events?
transform_event_responder = False
# The main displayable, if this displayable is the root of a composite
# displayable. (This is used by SL to figure out where to add children
# to.) If None, it is itself.
_main = None
# A list of the children that make up this composite displayable.
_composite_parts = [ ]
# The location the displayable was created at, if known.
_location = None
# Does this displayable use the scope?
_uses_scope = False
# Arguments supplied to this displayable.
_args = DisplayableArguments()
# Set to true of the displayable is duplicatable (has a non-trivial
# duplicate method), or one of its children is.
_duplicatable = False
# Does this displayable require clipping?
_clipping = False
# Does this displayable have a tooltip?
_tooltip = None
# Should hbox and vbox skip this displayable?
_box_skip = False
# If not None, this should be a (width, height) tuple that overrides the
# amount of space offered to the displayable.
_offer_size = None
# If true, this displayable will be treated as draggable in its own right.
# This is used by viewport to decide if a drag is meant for the viewport
# or for its child.
_draggable = False
# Used by a transition (or transition-like object) to determine how long to
# delay for.
delay = None # type: float|None
def __ne__(self, o):
return not (self == o)
def __init__(self, focus=None, default=False, style='default', _args=None, tooltip=None, default_focus=False, **properties):
global default_style
if (style == "default") and (not properties):
self.style = default_style
else:
self.style = renpy.style.Style(style, properties) # @UndefinedVariable
self.focus_name = focus
self.default = default or default_focus
self._tooltip = tooltip
if _args is not None:
self._args = _args
def _copy(self, args=None):
"""
Makes a shallow copy of the displayable. If `args` is provided,
replaces the arguments with the stored copy.
"""
rv = copy.copy(self)
if args is not None:
rv._args = args
return rv
def _duplicate(self, args):
"""
Makes a duplicate copy of the following kids of displayables:
* Displayables that can accept arguments.
* Displayables that maintain state that should be reset before being
shown to the user.
* Containers that contain (including transitively) one of the other
kinds of displayables.
Displayables that contain state that can be manipulated by the user
are never copied.
This should call _unique on children that have been copied before
setting its own _duplicatable flag.
"""
if args and args.args:
args.extraneous()
return self
def _get_tooltip(self):
"""
Returns the tooltip of this displayable.
"""
return self._tooltip
def _in_current_store(self):
"""
Returns a version of this displayable that will not change as it is
rendered.
"""
return self
def _unique(self):
"""
This is called when a displayable is "unique", meaning there will
only be one reference to it, ever, from the tree of displayables.
"""
self._duplicatable = False
return
def parameterize(self, name, parameters):
"""
Obsolete alias for _duplicate.
"""
a = self._args.copy(name=name, args=parameters)
return self._duplicate(a)
def _equals(self, o):
"""
This is a utility method that can be called by a Displayable's
__eq__ method, to compare displayables for type and displayable
component equality.
"""
if type(self) is not type(o):
return False
if self.focus_name != o.focus_name:
return False
if self.style != o.style:
return False
if self.default != o.default:
return False
return True
def _repr_info(self):
return None
def __repr__(self):
rep = object.__repr__(self)
reprinfo = self._repr_info()
if reprinfo is None:
return rep
if reprinfo and not ((reprinfo[0] == '(') and (reprinfo[-1] == ')')):
reprinfo = "".join(("(", reprinfo, ")"))
parto = rep.rpartition(" at ")
return " ".join((parto[0],
reprinfo,
"at",
parto[2]))
def find_focusable(self, callback, focus_name):
focus_name = self.focus_name or focus_name
if self.focusable:
callback(self, focus_name)
elif self.focusable is not None:
callback(None, focus_name)
for i in self.visit():
if i is None:
continue
i.find_focusable(callback, focus_name)
def focus(self, default=False):
"""
Called to indicate that this widget has the focus.
"""
self.set_style_prefix(self.role + "hover_", True)
if not default:
renpy.exports.play(self.style.hover_sound)
def unfocus(self, default=False):
"""
Called to indicate that this widget has become unfocused.
"""
self.set_style_prefix(self.role + "idle_", True)
def is_focused(self):
if renpy.display.focus.grab and renpy.display.focus.grab is not self:
return
return renpy.game.context().scene_lists.focused is self
def set_style_prefix(self, prefix, root):
"""
Called to set the style prefix of this widget and its child
widgets, if any.
`root` - True if this is the root of a style tree, False if this
has been passed on to a child.
"""
if prefix == self.style.prefix:
return
self.style.set_prefix(prefix)
renpy.display.render.redraw(self, 0)
def render(self, width, height, st, at):
"""
Called to display this displayable. This is called with width
and height parameters, which give the largest width and height
that this drawable can be drawn to without overflowing some
bounding box. It's also given two times. It returns a Surface
that is the current image of this drawable.
@param st: The time since this widget was first shown, in seconds.
@param at: The time since a similarly named widget was first shown,
in seconds.
"""
raise Exception("Render not implemented.")
def event(self, ev, x, y, st):
"""
Called to report than an event has occured. Ev is the raw
pygame event object representing that event. If the event
involves the mouse, x and y are the translation of the event
into the coordinates of this displayable. st is the time this
widget has been shown for.
@returns A value that should be returned from Interact, or None if
no value is appropriate.
"""
return None
def get_placement(self):
"""
Returns a style object containing placement information for
this Displayable. Children are expected to overload this
to return something more sensible.
"""
return self.style.get_placement()
def visit_all(self, callback, seen=None):
"""
Calls the callback on this displayable, and then on all children
of this displayable.
"""
if seen is None:
seen = set()
for d in self.visit():
if d is None:
continue
id_d = id(d)
if id_d in seen:
continue
seen.add(id_d)
d.visit_all(callback, seen)
callback(self)
def visit(self):
"""
Called to ask the displayable to return a list of its children
(including children taken from styles). For convenience, this
list may also include None values.
"""
return [ ]
def per_interact(self):
"""
Called once per widget per interaction.
"""
return None
def predict_one(self):
"""
Called to ask this displayable to call the callback with all
the images it may want to load.
"""
return
def predict_one_action(self):
"""
Called to ask this displayable to cause image prediction
to occur for images that may be loaded by its actions.
"""
return
def place(self, dest, x, y, width, height, surf, main=True):
"""
This places a render (which must be of this displayable)
within a bounding area. Returns an (x, y) tuple giving the location
the displayable was placed at.
`dest`
If not None, the `surf` will be blitted to `dest` at the
computed coordinates.
`x`, `y`, `width`, `height`
The bounding area.
`surf`
The render to place.
`main`
This is passed to Render.blit().
"""
placement = self.get_placement()
subpixel = placement[6]
xpos, ypos = place(width, height, surf.width, surf.height, placement)
xpos += x
ypos += y
pos = (xpos, ypos)
if dest is not None:
if subpixel:
dest.subpixel_blit(surf, pos, main, main, None)
else:
dest.blit(surf, pos, main, main, None)
return pos
def set_transform_event(self, event):
"""
Sets the transform event of this displayable to event.
"""
if event == self.transform_event:
return
self.transform_event = event
if self.transform_event_responder:
renpy.display.render.redraw(self, 0)
def _handles_event(self, event):
"""
Returns True if the displayable handles event, False otherwise.
"""
return False
def _hide(self, st, at, kind):
"""
Returns None if this displayable is ready to be hidden, or
a replacement displayable if it doesn't want to be hidden
quite yet.
Kind may be "hide", "replace", or "cancel", with the latter
being called when the hide is being hidden itself because
another displayable is shown.
"""
return None
def _show(self):
"""
No longer used.
"""
def _target(self):
"""
If this displayable is part of a chain of one or more references,
returns the ultimate target of those references. Otherwise, returns
the displayable.
"""
return self
def _change_transform_child(self, child):
"""
If this is a transform, makes a copy of the transform and sets
the child of the innermost transform to this. Otherwise,
simply returns child.
"""
return child
def _clear(self):
"""
Clears out the children of this displayable, if any.
"""
return
def _tts_common(self, default_alt=None, reverse=False):
rv = [ ]
if reverse:
order = -1
else:
order = 1
speech = ""
for i in self.visit()[::order]:
if i is not None:
speech = i._tts()
if speech.strip():
if isinstance(speech, renpy.display.tts.TTSDone):
rv = [ speech ]
else:
rv.append(speech)
rv = ": ".join(rv)
rv = rv.replace("::", ":")
rv = rv.replace(": :", ":")
alt = self.style.alt
if alt is None:
alt = default_alt
if alt is not None:
rv = renpy.substitutions.substitute(alt, scope={ "text" : rv })[0]
rv = type(speech)(rv)
return rv
def _tts(self):
"""
Returns the self-voicing text of this displayable and all of its
children that cannot take focus. If the displayable can take focus,
returns the empty string.
"""
return self._tts_common()
def _tts_all(self):
"""
Returns the self-voicing text of this displayable and all of its
children that cannot take focus.
"""
return self._tts_common()
+12 -22
View File
@@ -58,7 +58,7 @@ def default_drop_allowable(drop, drags):
return True
class Drag(renpy.display.core.Displayable, renpy.revertable.RevertableObject):
class Drag(renpy.display.displayable.Displayable, renpy.revertable.RevertableObject):
"""
:doc: drag_drop class
:args: (d=None, drag_name=None, draggable=True, droppable=True, drag_raise=True, dragging=None, dragged=None, dropped=None, drag_handle=(0.0, 0.0, 1.0, 1.0), drag_joined=..., clicked=None, hovered=None, unhovered=None, mouse_drop=False, **properties)
@@ -159,9 +159,7 @@ class Drag(renpy.display.core.Displayable, renpy.revertable.RevertableObject):
`drag_handle`
A (x, y, width, height) tuple, giving the position of the drag
handle within the child. In this tuple, integers are considered
to be a literal number of pixels, while floats are relative to
the size of the child.
handle within the child. This tuple takes :term:`positions <position>`.
`drag_joined`
This is called with the current Drag as an argument. It's
@@ -382,7 +380,7 @@ class Drag(renpy.display.core.Displayable, renpy.revertable.RevertableObject):
self.target_at_delay = 0
# The displayable we were last dropping on.
self.last_drop = None # type: renpy.display.core.Displayable|None
self.last_drop = None # type: renpy.display.displayable.Displayable|None
# Did we move over the course of this drag?
self.drag_moved = False
@@ -426,11 +424,11 @@ class Drag(renpy.display.core.Displayable, renpy.revertable.RevertableObject):
linear move.
"""
if (type(x) is float) and self.parent_width is not None:
x = int(x * self.parent_width)
if self.parent_width is not None:
x = int(absolute.compute_raw(x, self.parent_width))
if (type(y) is float) and self.parent_height is not None:
y = int(y * self.parent_height)
if self.parent_height is not None:
y = int(absolute.compute_raw(y, self.parent_height))
self.target_x = x
self.target_y = y
@@ -597,7 +595,7 @@ class Drag(renpy.display.core.Displayable, renpy.revertable.RevertableObject):
self.target_at = at + self.target_at_delay
self.target_at_delay = 0
redraw(self, 0)
elif at >= self.target_at:
elif self.target_at <= at or self.target_at <= self.at:
# Snap complete
self.x = self.target_x
self.y = self.target_y
@@ -611,18 +609,10 @@ class Drag(renpy.display.core.Displayable, renpy.revertable.RevertableObject):
if self.draggable or self.clicked is not None:
fx, fy, fw, fh = self.drag_handle
if isinstance(fx, float):
fx = int(fx * cw)
if isinstance(fy, float):
fy = int(fy * ch)
if isinstance(fw, float):
fw = int(fw * cw)
if isinstance(fh, float):
fh = int(fh * ch)
fx = int(absolute.compute_raw(fx, cw))
fy = int(absolute.compute_raw(fy, ch))
fw = int(absolute.compute_raw(fw, cw))
fh = int(absolute.compute_raw(fh, ch))
mask = self.style.focus_mask
+2 -2
View File
@@ -622,7 +622,7 @@ def free_memory():
cache.clear()
class ImageBase(renpy.display.core.Displayable):
class ImageBase(renpy.display.displayable.Displayable):
"""
This is the base class for all of the various kinds of images that
we can possibly have.
@@ -2004,7 +2004,7 @@ def image(arg, loose=False, **properties):
elif loose:
return arg
if isinstance(arg, renpy.display.core.Displayable):
if isinstance(arg, renpy.display.displayable.Displayable):
raise Exception("Expected an image, but got a general displayable.")
else:
raise Exception("Could not construct image from argument.")
+8 -8
View File
@@ -319,7 +319,7 @@ def wrap_render(child, w, h, st, at):
return rv
class ImageReference(renpy.display.core.Displayable):
class ImageReference(renpy.display.displayable.Displayable):
"""
ImageReference objects are used to reference images by their name,
which is a tuple of strings corresponding to the name used to define
@@ -348,7 +348,7 @@ class ImageReference(renpy.display.core.Displayable):
super(ImageReference, self).__init__(**properties)
self.name = name
self.target = None # type: renpy.display.core.Displayable|None
self.target = None # type: renpy.display.displayable.Displayable|None
def _repr_info(self):
return repr(self.name)
@@ -379,7 +379,7 @@ class ImageReference(renpy.display.core.Displayable):
name = self.name
if isinstance(name, renpy.display.core.Displayable):
if isinstance(name, renpy.display.displayable.Displayable):
self.target = name
return True
@@ -452,7 +452,7 @@ class ImageReference(renpy.display.core.Displayable):
rv = self._copy(args)
rv.target = None
if isinstance(rv.name, renpy.display.core.Displayable):
if isinstance(rv.name, renpy.display.displayable.Displayable):
if rv.name._duplicatable:
rv.name = rv.name._duplicate(args)
@@ -542,7 +542,7 @@ class ImageReference(renpy.display.core.Displayable):
return [ self.target ]
class DynamicImage(renpy.display.core.Displayable):
class DynamicImage(renpy.display.displayable.Displayable):
"""
:doc: disp_imagelike
:args: (name)
@@ -555,10 +555,10 @@ class DynamicImage(renpy.display.core.Displayable):
nosave = [ 'raw_target' ]
# The target that this image currently resolves to.
target = None # type: renpy.display.core.Displayable|None
target = None # type: renpy.display.displayable.Displayable|None
# The raw target that the image resolves to, before it has been parameterized.
raw_target = None # type: renpy.display.core.Displayable|None
raw_target = None # type: renpy.display.displayable.Displayable|None
# Have we been locked, so we never change?
locked = False
@@ -688,7 +688,7 @@ class DynamicImage(renpy.display.core.Displayable):
if not update:
return True
raw_target = target # type: renpy.display.core.Displayable
raw_target = target # type: renpy.display.displayable.Displayable
old_target = self.target
if raw_target._duplicatable:
+26 -6
View File
@@ -31,7 +31,7 @@ from renpy.display.render import render, Render
from renpy.display.matrix import Matrix2D
class Solid(renpy.display.core.Displayable):
class Solid(renpy.display.displayable.Displayable):
"""
:doc: disp_imagelike
@@ -75,6 +75,12 @@ class Solid(renpy.display.core.Displayable):
rv = Render(width, height)
if width and height:
minw, minh = renpy.display.draw.draw_to_virt.transform(1, 1)
width = max(width, minw)
height = max(height, minh)
if color is None or width <= 0 or height <= 0:
return rv
@@ -139,7 +145,7 @@ class Borders(object):
)
class Frame(renpy.display.core.Displayable):
class Frame(renpy.display.displayable.Displayable):
"""
:doc: disp_imagelike
:args: (image, left=0, top=0, right=None, bottom=None, *, tile=False, **properties)
@@ -273,6 +279,23 @@ class Frame(renpy.display.core.Displayable):
width = max(self.style.xminimum, width)
height = max(self.style.yminimum, height)
# The size of the final displayable.
if self.tile:
dw = int(width)
dh = int(height)
else:
dw = width
dh = height
if width and height:
minw, minh = renpy.display.draw.draw_to_virt.transform(1, 1)
width = max(width, minw)
height = max(height, minh)
image = self.style.child or self.image
crend = render(image, width, height, st, at)
@@ -280,9 +303,6 @@ class Frame(renpy.display.core.Displayable):
sw = int(sw)
sh = int(sh)
dw = int(width)
dh = int(height)
bw = self.left + self.right
bh = self.top + self.bottom
@@ -585,7 +605,7 @@ class Frame(renpy.display.core.Displayable):
return rv
class FileCurrentScreenshot(renpy.display.core.Displayable):
class FileCurrentScreenshot(renpy.display.displayable.Displayable):
"""
:doc: file_action_function
+2 -2
View File
@@ -36,7 +36,7 @@ from renpy.display.render import render
cached = set()
class ImageMapCrop(renpy.display.core.Displayable):
class ImageMapCrop(renpy.display.displayable.Displayable):
"""
This handles the cropping of uncached imagemap components.
"""
@@ -55,7 +55,7 @@ class ImageMapCrop(renpy.display.core.Displayable):
return cr.subsurface(self.rect)
class ImageCacheCrop(renpy.display.core.Displayable):
class ImageCacheCrop(renpy.display.displayable.Displayable):
"""
This handles the cropping of an imagemap component.
"""
+39 -40
View File
@@ -31,16 +31,7 @@ import renpy
from renpy.display.render import render, Render
def scale(num, base):
"""
If num is a float, multiplies it by base and returns that. Otherwise,
returns num unchanged.
"""
if type(num) is float:
return num * base
else:
return num
compute_raw = renpy.display.core.absolute.compute_raw
def xyminimums(style, width, height):
@@ -58,7 +49,7 @@ def xyminimums(style, width, height):
if (type(xmaximum) is float) and xmaximum and renpy.config.adjust_minimums:
xminimum = xminimum / xmaximum
xminimum = xminimum * width
xminimum = compute_raw(xminimum, width)
if type(yminimum) is float:
ymaximum = style.ymaximum
@@ -66,12 +57,12 @@ def xyminimums(style, width, height):
if (type(ymaximum) is float) and ymaximum and renpy.config.adjust_minimums:
yminimum = yminimum / ymaximum
yminimum = yminimum * height
yminimum = compute_raw(yminimum, height)
return xminimum, yminimum
class Null(renpy.display.core.Displayable):
class Null(renpy.display.displayable.Displayable):
"""
:doc: disp_imagelike
:name: Null
@@ -101,7 +92,7 @@ class Null(renpy.display.core.Displayable):
return rv
class Container(renpy.display.core.Displayable):
class Container(renpy.display.displayable.Displayable):
"""
This is the base class for containers that can have one or more
children.
@@ -128,7 +119,7 @@ class Container(renpy.display.core.Displayable):
def __init__(self, *args, **properties):
self.children = self._list_type() # type: list
self.child = None # type: renpy.display.core.Displayable|None
self.child = None # type: renpy.display.displayable.Displayable|None
self.offsets = self._list_type() # type: list[tuple[int, int]]
for i in args:
@@ -467,13 +458,13 @@ class Grid(Container):
yspacing = self.style.spacing
if renpy.config.relative_spacing:
xspacing = renpy.display.layout.scale(xspacing, width)
yspacing = renpy.display.layout.scale(yspacing, height)
xspacing = compute_raw(xspacing, width)
yspacing = compute_raw(yspacing, height)
left_margin = scale(self.style.left_margin, width)
right_margin = scale(self.style.right_margin, width)
top_margin = scale(self.style.top_margin, height)
bottom_margin = scale(self.style.bottom_margin, height)
left_margin = compute_raw(self.style.left_margin, width)
right_margin = compute_raw(self.style.right_margin, width)
top_margin = compute_raw(self.style.top_margin, height)
bottom_margin = compute_raw(self.style.bottom_margin, height)
# For convenience and speed.
cols = self.cols
@@ -815,11 +806,11 @@ class MultiBox(Container):
minx = self.style.xminimum
if minx is not None:
width = max(width, scale(minx, width))
width = max(width, compute_raw(minx, width))
miny = self.style.yminimum
if miny is not None:
height = max(height, scale(miny, height))
height = max(height, compute_raw(miny, height))
if self.first and adjust_times:
self.update_times()
@@ -962,7 +953,7 @@ class MultiBox(Container):
# The children to layout.
children = list(self.children)
if self.style.box_reverse:
if self.style.box_reverse and renpy.config.simple_box_reverse:
children.reverse()
spacings.reverse()
@@ -1134,9 +1125,20 @@ class MultiBox(Container):
if not yfill:
height = max(yminimum, maxy)
if self.style.box_reverse and not renpy.config.simple_box_reverse:
new_placements = [ ]
for child, x, y, w, h, surf in placements:
if layout == "vertical":
new_placements.append((child, x, height - y - h, w, h, surf))
else:
new_placements.append((child, width - x - w, y, w, h, surf))
placements = new_placements
rv = renpy.display.render.Render(width, height)
if self.style.box_reverse ^ self.style.order_reverse:
if self.style.order_reverse ^ (self.style.box_reverse and renpy.config.simple_box_reverse):
placements.reverse()
for child, x, y, w, h, surf in placements:
@@ -1291,17 +1293,17 @@ class Window(Container):
width = max(xminimum, width)
height = max(yminimum, height)
left_margin = scale(style.left_margin, width)
left_padding = scale(style.left_padding, width)
left_margin = compute_raw(style.left_margin, width)
left_padding = compute_raw(style.left_padding, width)
right_margin = scale(style.right_margin, width)
right_padding = scale(style.right_padding, width)
right_margin = compute_raw(style.right_margin, width)
right_padding = compute_raw(style.right_padding, width)
top_margin = scale(style.top_margin, height)
top_padding = scale(style.top_padding, height)
top_margin = compute_raw(style.top_margin, height)
top_padding = compute_raw(style.top_padding, height)
bottom_margin = scale(style.bottom_margin, height)
bottom_padding = scale(style.bottom_padding, height)
bottom_margin = compute_raw(style.bottom_margin, height)
bottom_padding = compute_raw(style.bottom_padding, height)
# c for combined.
cxmargin = left_margin + right_margin
@@ -1415,7 +1417,7 @@ def dynamic_displayable_compat(st, at, expr):
return child, None
class DynamicDisplayable(renpy.display.core.Displayable):
class DynamicDisplayable(renpy.display.displayable.Displayable):
"""
:doc: disp_dynamic
@@ -1964,7 +1966,7 @@ class Side(Container):
return rv
class Alpha(renpy.display.core.Displayable):
class Alpha(renpy.display.displayable.Displayable):
def __init__(self, start, end, time, child=None, repeat=False, bounce=False,
anim_timebase=False, time_warp=None, **properties):
@@ -2379,11 +2381,8 @@ class NearRect(Container):
layout_y = py - ch
# Initial x positioning - using a variant of the layout algorithm.
if isinstance(xpos, float):
xpos = xpos * pw
if isinstance(xanchor, float):
xanchor = xanchor * cw
xpos = compute_raw(xpos, pw)
xanchor = compute_raw(xanchor, cw)
layout_x = px + xpos - xanchor

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