Compare commits

...

226 Commits

Author SHA1 Message Date
Tom Rothamel 4117176a0a Check in updated keywords. 2023-04-30 21:32:10 -04:00
Mal Graty 62136111e8 Update preference name in docs 2023-04-30 23:26:25 +01:00
Tom Rothamel 48cfb76607 Update translations. 2023-04-30 14:33:39 -04:00
Tom Rothamel f20ba5e633 bubble: Document the required changes. 2023-04-30 14:32:37 -04:00
Tom Rothamel a2719b9995 bubble: Add a thought bubble to the default game. 2023-04-30 14:19:12 -04:00
Tom Rothamel 9e4417729d Add omitted character. 2023-04-30 09:46:01 -04:00
Tom Rothamel 0f253c15c4 live2d: Add Live2D.blend_opacity.
This can be used in an update_function.
2023-04-29 23:15:26 -04:00
Tom Rothamel 224965c0cc live2d: Add support for x86_64 Android. 2023-04-29 22:44:02 -04:00
Tom Rothamel be2be8c557 live2d: Support multiply and screen.
Fixes #3729.
2023-04-29 22:41:29 -04:00
Tom Rothamel 594bb9d8e0 live2d: Load the csmGetDrawableMultiplyColors and csmGetDrawableScreenColors functions. 2023-04-29 20:28:01 -04:00
Tom Rothamel 31aa071f4a Add deprecations to incompatible changes. 2023-04-29 00:25:40 -04:00
Tom Rothamel 4d40a29350 Merge pull request #4586 from renpy/doc-jsondb
JSONDB doc
2023-04-28 13:07:13 -04:00
Gouvernathor 82c05454be Rephrase and add link 2023-04-28 18:56:44 +02:00
Tom Rothamel 6eefafd5a9 Allow radius to be a position.
As documented, but not implemented. Fixes #4574.
2023-04-28 00:45:00 -04:00
Tom Rothamel d07fe424eb Prevent radius and angle from conflicting.
This is necessary, as it's basically impossible to use these two
properties without them conflicting.
2023-04-28 00:45:00 -04:00
Tom Rothamel 2f19fe65bd Merge pull request #4582 from renpy/confirm-action
Allow layout.yesno_screen and Confirm to take lists of actions
2023-04-26 23:40:14 -04:00
Gouvernathor d795f03b13 doc interlinks 2023-04-27 05:29:17 +02:00
Gouvernathor 1e5355e727 whitespace 2023-04-27 04:55:49 +02:00
Tom Rothamel c5571e6637 Add config.linear_fades.
This is is a vairable that returns the pre-8.1 fade behavior,
which was linear in amplitude, and so would perceptually barely
fader and then fade out all at once.

Fixes #4580.
2023-04-26 22:55:47 -04:00
Gouvernathor 64aab8a62e use renpy.run instead of calling 2023-04-27 04:55:35 +02:00
Tom Rothamel 774991431e Avoid generating translations for empty extends.
Per #4581.
2023-04-26 19:22:58 -04:00
Andy_kl a687f5ec13 Use collections.deque in walk_memory.
This makes the function way, way faster. Seconds instead of hour to walk 1GB of RAM.
2023-04-27 01:23:37 +04:00
Tom Rothamel 59c9ce1901 Add GetMixer().
This is an action that can display a mixer, either as a value
or in DB.
2023-04-26 00:51:16 -04:00
Tom Rothamel 1edb2c8cde Better document what SVG is supported. 2023-04-25 21:49:36 -04:00
Tom Rothamel 78ba95403f Prevent audio from starting during a global pause.
* Prevent non-looping audio entirely.
* Avoid starting music until unpaused

Fixes #4568.
2023-04-25 01:31:02 -04:00
Tom Rothamel bb798c2db9 Make all hyperlinks active immediately when text is not slow.
Fixes #4569.
2023-04-25 00:17:21 -04:00
Tom Rothamel 9cfbd3a75d Merge pull request #4573 from Kassy2048/web_sync_fix
Fix sync download for web
2023-04-24 18:53:32 -04:00
Kassy 302d4fe1c1 Fix sync download for web 2023-04-24 19:41:17 +02:00
Tom Rothamel 6b0332a566 Merge pull request #4564 from renpy/bubbledoc
Tweak and fix bubble doc
2023-04-24 11:02:11 -04:00
Tom Rothamel e3e78a7524 Always apply the default parameters to a transition.
Fixes #4551.
2023-04-24 09:28:54 -04:00
Gouvernathor c547bf3623 Fix wrong config name, quadratic_volumeS 2023-04-24 15:00:36 +02:00
Tom Rothamel 42bc1ccb79 Fix zzoom.
* Fix the implementation.
* Fix the documentation.

Fixes #4556.
2023-04-24 00:59:41 -04:00
Tom Rothamel 4613ee1fa4 doc: Fix the name of config.quadradic_volumes.
Fixes #4554.
2023-04-23 23:08:29 -04:00
Tom Rothamel 8279f4aad0 Do not create a new scope when going from predicting -> updating.
The scope itself will be shared with constant displayables, so
clear it rather than replacing it with a new object.

Fixes #4563.
2023-04-23 22:55:41 -04:00
Gouvernathor dd00c19708 Update bubble doc 2023-04-23 23:46:57 +02:00
Gouvernathor 510b19018d Update and fix french translations 2023-04-23 22:23:05 +02:00
Moshibit 1784db4663 Update Spanish translation (#4560)
* Update developer.rpy

* Update screens.rpy
2023-04-23 22:00:26 +02:00
Morgan Willcock bfcbb95156 Fix _ren.py format changelog example (#4557) 2023-04-23 16:40:56 +02:00
Tom Rothamel 37f7a397e3 Merge pull request #4553 from Kassy2048/prefix_movie
Apply path prefixes when loading movies for web
2023-04-23 00:40:23 -04:00
Kassy 830b122a1f Apply path prefixes when loading movies for web 2023-04-23 02:31:18 +02:00
Tom Rothamel f43208cce6 doc: Changelog fixes. 2023-04-22 17:31:51 -04:00
Tom Rothamel 8cb2379b25 Merge pull request #4550 from renpy/split-prop-pure
Mark renpy.split_properties as pure
2023-04-22 15:17:48 -04:00
Gouvernathor 811b135690 Mark renpy.split_properties as pure 2023-04-22 21:10:10 +02:00
Tom Rothamel f6460ed448 doc: More credits. 2023-04-22 14:42:46 -04:00
Tom Rothamel 617bd43afb doc: Update sponsor list. 2023-04-22 14:38:38 -04:00
Tom Rothamel 2c9c8205ee doc: Credits. 2023-04-22 14:38:38 -04:00
Gouvernathor 9c2c8c9535 doc: bad include 2023-04-22 20:04:19 +02:00
Tom Rothamel ece477836c doc: Fixes and edits. 2023-04-22 13:04:26 -04:00
Tom Rothamel eb47fc4500 Limit how far we try to scry extend.
Fixes #4548.
2023-04-21 22:52:21 -04:00
Tom Rothamel f322828baf Fix translations. 2023-04-21 21:50:27 -04:00
Tom Rothamel 20f1a76637 doc: Licenses. 2023-04-21 21:43:55 -04:00
Tom Rothamel 9cdd8a2654 doc: Changelog. 2023-04-21 21:24:56 -04:00
Gouvernathor 160fdd8489 Update tutorial translations from the launcher translations 2023-04-22 01:26:51 +02:00
Gouvernathor 48b1aeb5f3 Remove wrongly translatable string 2023-04-22 01:23:11 +02:00
Gouvernathor 54ec403f5b Cleanup french translation files
Using the brand new orphan translation flagging
2023-04-22 01:22:19 +02:00
Gouvernathor b7213f4b78 Forgotten in last 2023-04-22 01:20:29 +02:00
Gouvernathor 211da69d08 Update text_align -> textalign in translations
follow-up to a1f6312
2023-04-22 00:56:24 +02:00
Tom Rothamel c15f4c3487 doc: JSONDB. 2023-04-21 00:51:59 -04:00
Tom Rothamel 417aee0bff doc: Sync actions. 2023-04-21 00:38:56 -04:00
Tom Rothamel 9c130cf149 Doc and changelog areapicker.
And improve the screen language documentation for drag and
draggroup.
2023-04-21 00:29:14 -04:00
Tom Rothamel 49e7e9182e Merge pull request #4543 from renpy/reachme
Reachability tweaks
2023-04-20 20:30:45 -04:00
Tom Rothamel 27fd71815e live2d: Create a second copy of each mesh to use as a mask.
This is because the first copy was getting its shaders changed,
which would cause a problem when that copy was being used as a
mask.

This would cause a problem when a live2d layer both used a mask
and was used as a mask.

Per https://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=66455
2023-04-20 01:00:23 -04:00
Gouvernathor 9db0ec1683 Simplify CDS linting
Use elif instead of if
Merge two loops
Make builtin statements use the weakly_reachable set instead of a separate mechanism
Avoid a set update if the original is not read afterwards
2023-04-19 16:17:01 +02:00
Gouvernathor 1b62055d69 Better document how the reachable method works 2023-04-19 16:10:13 +02:00
Tom Rothamel 3deca06054 Allow statements to mark themselves as weakly reachable.
These are statements that are not reported as unreachable, but
will only pass reachability to the next statement if the statement
is actually reachable.
2023-04-19 01:09:30 -04:00
Tom Rothamel 9a250ccdc5 Add reachable as a method on user statements.
If given, this lets a statement register a function that
determines if it is reachable, and what is reachable
from the statement.
2023-04-18 23:23:39 -04:00
Tom Rothamel fb803ea05c Force a new checkpoint to begin when checkpointing is suspended.
Per #4534.
2023-04-17 23:29:15 -04:00
Tom Rothamel 04d9ea3016 itch: Make the channels configurable.
Fixes #4481.
2023-04-17 01:33:38 -04:00
Tom Rothamel 1f26d829d1 doc: Reload is disabled when autoreload is active. 2023-04-16 21:39:47 -04:00
Tom Rothamel d9b30cf8a1 Merge pull request #4537 from renpy/replay-action
Replay action's lockedness
2023-04-15 23:00:20 -04:00
Tom Rothamel ebcc0ce7dc Believe _choose_attributes when it chooses attributes.
Even if it does odd things, like removing a required attribute
from the list of attributes.

Fixes #4505.
2023-04-15 15:10:04 -04:00
Gouvernathor 8a2c6d4dc4 Better behavior for the locked parameter 2023-04-15 19:21:49 +02:00
Gouvernathor 5c400fdbc9 Accurate doc entry 2023-04-15 19:14:22 +02:00
Tom Rothamel 34a011e79f Python string prefixes must immediately precede delimiters.
Fixes #4535
2023-04-15 12:33:12 -04:00
Gouvernathor 7545b87364 Fix rst comment block
yes, sphinx is *that* annoying
2023-04-15 17:26:16 +02:00
Tom Rothamel 72f0535fb3 Prevent greedy rollbacks from passing through suspend_checkpointing.
Fixes #4534.
2023-04-15 01:28:30 -04:00
Tom Rothamel e776a4c3f5 doc: SVG. 2023-04-14 01:50:22 -04:00
Tom Rothamel e439957896 Document last change. 2023-04-14 01:04:10 -04:00
Tom Rothamel dffbe3521c Allow triple quoted strings to be used in simple expressions.
For example:

text """\
line 1
line 2
line 3"""

is now allowed.
2023-04-13 23:34:55 -04:00
Tom Rothamel 1fad559548 doc: Speech bubble dialogue. 2023-04-13 00:28:46 -04:00
Tom Rothamel e6fec6ea50 doc: Credit. 2023-04-12 01:10:24 -04:00
Tom Rothamel a427a6611b gl2: Restore the window position after a reload. 2023-04-12 00:36:39 -04:00
Tom Rothamel 9932e4e892 Allow Character's kind argument to be a namspace.
The main reason for this is to allow Character(kind=bubble), which
looks way nicer that Character(kind=bubble.character) to me.
2023-04-11 23:42:56 -04:00
Tom Rothamel e702a15785 bubble: Add shift+B as a way of toggling the bubble editor. 2023-04-11 23:40:30 -04:00
Tom Rothamel cf7910687f bubble: Add four speech bubbles by default. 2023-04-11 23:25:39 -04:00
Tom Rothamel 2a6c719678 Clean language dependent data when jumping back after a load.
Fixes #4525.
2023-04-10 22:28:52 -04:00
Tom Rothamel 9f08129084 Fix steam.activate_overlay_to_web_page.
Fixes #4526.
2023-04-10 01:12:38 -04:00
Tom Rothamel 40e81d44a4 bubble: Support expanding beyond what's given.
This will provide room for tails.
2023-04-09 00:39:19 -04:00
Tom Rothamel 40ac61bf23 Merge pull request #4523 from awaken1ng/fix-compat
Fix compat using unknown config option.
2023-04-08 23:24:11 -04:00
Tom Rothamel 16372810e5 Reset the video to the beginning when it is shown again.
As opposed to when it's hidden.

Per the discussion at #4508.
2023-04-08 21:33:43 -04:00
awakening f2a76c5872 Fix compat using unknown config option.
Fixes `Exception: config.timer_blocks_pause is not a known configuration variable.`

7d4610d13d introduces `modal_blocks_timer`
which is probably what was meant to be used here.
2023-04-08 19:44:49 +07:00
Tom Rothamel 3350ffa713 gl2: Add functions to allow a user to create a mesh from Python.
Per request via discord.
2023-04-07 23:27:18 -04:00
Tom Rothamel bf0634f738 Disable skip mode in the launcher. 2023-04-07 14:28:44 -04:00
Tom Rothamel 13f9b3d04c Remove pointless maintenance of ctx.updating. 2023-04-07 14:27:05 -04:00
Tom Rothamel 1d96e7a16f Fix Scroll action.
Fixes #4520.
2023-04-07 00:18:08 -04:00
Tom Rothamel df524315a8 sl2: Do not reuse the scope when showing a 'used' screen.
This fixes the default statement when in a used screen that's
passed different parameters than it was predicted with.

Fixes #4519.
2023-04-06 22:51:13 -04:00
Tom Rothamel 7c082f0fb5 Fixes to applying 3d state properties.
Recent changes made many of the properties incorrectly conditional
on each other, which prevented the properties from working
correctly.

Fixes #4518.
2023-04-06 21:33:29 -04:00
Tom Rothamel 6d637237ff doc: Extend the gl1 timeline slightly further. 2023-04-06 20:26:13 -04:00
Tom Rothamel 2f6556052a doc: Correct version. 2023-04-06 20:09:24 -04:00
Tom Rothamel 9a6448dd94 doc: Pending deprecations.
* Mention the planned removal of gl1 and Python 2/Ren'Py 7.
2023-04-06 19:05:24 -04:00
Tom Rothamel 54f62730a2 Fit the error that occurs if a style statement has two is clauses.
Per #4510

Co-authored-by: <Ayowel@users.noreply.github.com>
2023-04-06 00:31:33 -04:00
Tom Rothamel ca7c78dbcd Only reset a channel if a hide happens.
Fixes #4508.
2023-04-05 22:29:01 -04:00
Moshibit 16fb5ffb85 Update Spanish translation (#4511)
* Update gui.rpy

* Update launcher.rpy

* Update screens.rpy
2023-04-05 18:38:42 +02:00
Gouvernathor aea1129812 Update translations 2023-04-05 06:59:54 +02:00
Tom Rothamel 46320ddcd4 Fix the type of paths on mac.
Fixes #4509.
2023-04-05 00:48:56 -04:00
Tom Rothamel a65cdd6f0e Fix the Android JDK link.
Add a bit of abstraction so it'll only need to be restranslated
once, and route it through renpy.org so the links can't break.
2023-04-05 00:48:56 -04:00
Gouvernathor 9d275e9349 doc: forgotten markup 2023-04-04 20:01:15 +02:00
Gouvernathor 534fb0f9f6 Fix typo in docstring 2023-04-04 19:58:17 +02:00
Gouvernathor 005be375fc french translations 2023-04-04 17:50:28 +02:00
Tom Rothamel b2d5dd87fa Ignore ATL transition arguments when comparing contexts.
The new_widget argument will be different each time the
interaction restarts - but it generally represents the same
thing, and so it makes sense to consider it equal for the
purposes of this test.

Fixes #4167.
2023-04-03 00:08:28 -04:00
Tom Rothamel a6b99364aa Propagate ATL state between transitions when an interaction restarts.
This partially addresses #4167.
2023-04-02 23:38:59 -04:00
Tom Rothamel e5c2e7f88c doc: Last change. 2023-04-02 23:35:45 -04:00
Tom Rothamel 907ba19bea tts: Make it respect the voice volume mixer.
At least more or less, as it generally doesn't go through Ren'Py.
But on all platforms where voice is supported, the amplitude of
voice is controlled by the voice mixer

This also makes the voice volume mixer available on the
accessiiblity screen, so the volume can be adjusted even
if the game doesn't otherwise use voice.

Fixes #4161.
2023-04-02 20:56:15 -04:00
Tom Rothamel 74d8c5c398 gl2: Handle the interaction of maximized, fullscreen, and window size/location.
The maximized flag is persisted, so that if the game is shut down
when maximized, it will start up again maximized.

The size of the game is only stored when non maximized or fullscreen,
so only sensible game sizes are persisten.

Switching from fullscreen to maximized or vice versa goes through
the windowed state.

The first time the window is in the windowed state, it's moved to the
center of the screen - rather than being undefined when the game
starts fullscreen.

Fixes #4155.
2023-04-02 19:06:07 -04:00
Tom Rothamel f65c1a1af3 Merge pull request #4497 from mal/fix-style-optimisation
Let Transforms benefit from style optimisation
2023-04-02 00:14:01 -04:00
Mal Graty b740e723a3 Let Transforms benefit from style optimisation
In ef6173de4f we added the facility for
alt text to be passed through Transforms to allow its use in SL2. A side
effect of this was to always pass alt text, meaning that the underlying
Displayable's properties could never be empty (they'd contain alt=None).
This has been preventing Transforms benefiting from the optimised code
path in Displayable that avoids creating a new anonymous style.

In order to address this, we now filter out arguments passed to
Transform that ought to be propagated up to the parent class, sending
them only when defined, thus re-enabling the optimisation for the vast
majority of Transform instances.
2023-04-02 04:47:41 +01:00
Tom Rothamel 5bdb9b5459 Name Ren'Py 8.1 and Ren'Py 7.6. 2023-04-01 02:03:57 -04:00
Tom Rothamel d70d6b8f26 Merge pull request #4494 from renpy/comments-in-shader-variables
Allow comments in shader variables lists
2023-03-31 22:45:35 -04:00
Gouvernathor 44cdc09745 Allow comments in shader variables lists 2023-03-30 22:56:44 +02:00
Tom Rothamel 1291c3cb26 Slightly adjust controller deadbands (based on my experience). 2023-03-30 02:11:08 -04:00
Tom Rothamel 493edfbb82 Add renpy.load_rgba, loading a rgba string into a surface.
This is intended to support image data being created elsewhere,
loaded in via ctypes, and then passed into Ren'Py.
2023-03-29 23:27:25 -04:00
Tom Rothamel ec6277588d Allow the Ren'Py audio system to be extended. 2023-03-29 23:27:25 -04:00
Tom Rothamel 3f057f159a Make the audio buffer size configurable. 2023-03-29 23:27:25 -04:00
Tom Rothamel 420e167d41 Merge pull request #4491 from renpy/fix-__-munging
Fix name-munging
2023-03-29 12:27:16 -04:00
Gouvernathor 2828f3b517 Fix name-munging 2023-03-29 18:03:53 +02:00
Tom Rothamel c378247a39 Add config.display_start_callbacks.
This is intended to be used to let DLLS gain access to GL functios
before a frame is renderer.
2023-03-29 01:57:15 -04:00
Tom Rothamel 9ab745db85 Increase the contrast of the light GUI.
Fixes #4470.
2023-03-29 01:43:44 -04:00
Tom Rothamel f92022308d Disable ui-less IME.
Which shows the candidate list for languages that require one -
not sure why this isn't the default.

Fixes #4474.
2023-03-28 02:44:59 -04:00
Tom Rothamel 4f0e882d97 Set empty properties on a texture.
Fixes #4488.
2023-03-28 02:04:34 -04:00
Tom Rothamel 46f62133d1 Add movie groups.
When a movie in a group is starting, and doesn't have the first
frame, it checks to see if another movie in the group is playing.
If so, it takes the frame from the other movie - preventing flashes
of transparency when switching movies.

Fixes #4475.
2023-03-28 01:46:15 -04:00
Tom Rothamel 77889607f3 gl2: Use a 1px framebuffer for is_pixel_opaque.
So there's less to clear.
2023-03-27 01:39:24 -04:00
Tom Rothamel f92dcd8068 doc: Anonymous transforms on the first sl line. 2023-03-26 10:20:57 -04:00
Tom Rothamel 815a3999b4 Compat for c492f2f8e6. 2023-03-26 10:16:52 -04:00
Tom Rothamel 11c9b8f34b Revert "Consider all variables in the #4095 fix, not just locals."
This reverts commit d2b5f2fdc9.

This doesn't seem like the right fix, as it has the potential to
cause memory leaks. I'm going to compat the old behavior, and
require it to be explicit.
2023-03-26 09:59:41 -04:00
Tom Rothamel cfe892405e sl2: Allow at transform outside of a block.
This makes for a more compact syntax.
2023-03-26 09:58:52 -04:00
Tom Rothamel d2b5f2fdc9 Consider all variables in the #4095 fix, not just locals. 2023-03-26 03:42:41 -04:00
Tom Rothamel 8c4387bae4 Merge pull request #4486 from KiloOscarSix/master
Fixed incorrect behaviour for ToggleDict.get_sensitive()
2023-03-26 03:05:22 -04:00
Tom Rothamel bfb3955e9e Merge pull request #4483 from Kassy2048/touch_alternate_fix
Cancel long press wait when user stops touching the screen
2023-03-26 03:01:24 -04:00
Oscar Six 1498f625df Fixed incorrect behaviour for ToggleDict.get_sensitive() when using lists 2023-03-26 05:25:39 +01:00
Kassy 9523222b37 Only check for mouseup when long press is being detected 2023-03-26 01:39:27 +01:00
Kassy 9c197abca3 Cancel long press wait when user stops touching the screen 2023-03-26 00:26:00 +01:00
Tom Rothamel d3dbc40749 accelerator: Cythionify, add typing information, and document. 2023-03-25 12:25:12 -04:00
Tom Rothamel 6362ad8550 quaternion: Add cython types. 2023-03-25 10:56:07 -04:00
Tom Rothamel 04a73d2ad4 Remove old theme. 2023-03-25 10:30:54 -04:00
Tom Rothamel ddfcf67486 Make the total texture size a Python object.
(Preventing a crash if we get the calculation wrong.)
2023-03-25 10:29:49 -04:00
Tom Rothamel 8f5a32deeb Merge pull request #4477 from kyouryuukunn/fix_README
add README sphinx_rtd_theme sphinx_rtd_dark_mode
2023-03-25 10:24:55 -04:00
kyouryuukunn 5155c08f54 add README sphinx_rtd_theme sphinx_rtd_dark_mode 2023-03-25 19:09:57 +09:00
Tom Rothamel 7511c3ff42 Move quaternion code into its own pyx file.
This is a combination of it seeming like something meaty enough
that it might grow into more operations, and this taking 5s
for clang to compile.
2023-03-25 02:50:54 -04:00
Tom Rothamel e4ff027499 accelerator: Break up transform_render fully.
Break the ridiculously long transform_render function into a
number of smaller methods in a class, and use fields on that
class to store data used by multiple methods.

This is mostly to speed up compilation time by reducing how much
work clang has to do to compile things.

This is a work in progress - it's not well tested, and typing
information is missing or commented out. But it's enough to
render basic displayables.
2023-03-25 02:32:27 -04:00
Tom Rothamel 1cccdbdaaf Create a class to render transforms.
Basically, to store the variables that had been updated by
the crazy-big transform_render function.
2023-03-24 23:15:15 -04:00
Tom Rothamel 1a100a0006 accelerator: Begin to break up transform_render. 2023-03-24 03:04:19 -04:00
Tom Rothamel 2863bb2d88 live2d: Sort the properties to ensure a stable order. 2023-03-24 01:00:58 -04:00
Tom Rothamel 14f653f0a5 Attributes can't be required and optional.
Fixes #4466.
2023-03-24 01:00:58 -04:00
Gouvernathor 93fe44fa94 Fix wrong SetField use
It does take a fourth parameter, kind, which is private and only used for error messages when the target is not found/writable. It takes a string, so this code doesn't make sense.
My mistake, btw.
2023-03-23 19:40:15 +01:00
Tom Rothamel e73c750ef1 launcher: Make selected text more obvious.
Fixes #4471.
2023-03-22 23:00:05 -04:00
Tom Rothamel b929fa838c Apply pixel_perfect to renders rather than models.
This means that all the models that are underneath the render will be
adjusted together, so that relative blits all wind up in the same
place.

This is mostly the case for text, where things like centering, slow
text, and outlines could cause text to appear in different locations, and then be
drawn separately - only to jump into place when slow text finished and
the Text was drawn as a whole.

Fixes #4103.
2023-03-22 22:53:38 -04:00
Mal Graty d25bd3c01f Fix orientation interpolation
Ended up with an erroneous indent after the recent point_to changes.
2023-03-22 14:46:35 +00:00
Gouvernathor 1a9870ad5a doc: fix wrong role 2023-03-22 14:26:49 +01:00
Tom Rothamel fbbc8e0e34 Replace point_to True with point_to Camera()
The latter seems like a more readable syntax to me, as True doesn't
really feel associated with the camera. (And this provides a place
to store the layer.)
2023-03-22 02:45:01 -04:00
Tom Rothamel cc77af4d9f Move the point_to logic from ATL to Transform.
This is for two reasons:

* It allows point_to True to work in Transforms, at least if we figure
  out a way to refresh Transforms when the camera changes.

* It gets things right if the camera changes position while not
  interpolating point_to.
2023-03-22 02:11:01 -04:00
Tom Rothamel 65ff148898 Merge pull request #4449 from kyouryuukunn/allow_poi_tag_and_camera3
allow point_to to take camera
2023-03-21 22:01:01 -04:00
Tom Rothamel 24ad7c9a01 Merge pull request #4464 from renpy/fix-im-always-doc
Python equivalent of layeredimage's Always layer
2023-03-21 21:58:41 -04:00
Gouvernathor 6ce6a877a5 doc: Python equivalent of layeredimage's Always layer 2023-03-21 20:30:19 +01:00
Tom Rothamel 65bceeddba End ongoing transitions after rollback.
Fixes #4105.
2023-03-21 02:19:05 -04:00
Tom Rothamel 77cb945b9f On Android and iOS, log the Ren'Py version to stdout. 2023-03-20 22:26:50 -04:00
Tom Rothamel eab3d2dab4 Fix how None interacts with the pressed mouse state. 2023-03-20 20:17:59 -04:00
kyouryuukunn 4e3d66b975 remove tag from point_to 2023-03-20 17:36:24 +09:00
Tom Rothamel a192a352e1 sl2: Allow both 'at' and 'at transform' to be given to the same statement.
Fixes #4455.
2023-03-19 23:55:17 -04:00
kyouryuukunn c4e9a64b1e simplify codes around poi 2023-03-20 12:31:09 +09:00
Tom Rothamel 533cbe10e3 gamepad: Process more than one analog axis motion per frame.
Fixes #4178, more or less. This certainly makes the controller more
responsive, though perhaps not as good as desktop.

This also gains a bit of performance by reducing how far the
controller needs to deflect, and introdces hysteresis to
prevent spurious controller events.
2023-03-19 15:44:59 -04:00
Tom Rothamel c492f2f8e6 atl: Only compare contexts based on used variables.
This is useful in screens, where a transform might have a context
contains many variables that are not used by the transform. The
transform shouldn't restart when an irrelevant variable is
changed.

Fixes #4095.
2023-03-19 14:20:38 -04:00
Tom Rothamel 9249c6ffd4 sl2, atl: Compile ATL transforms in screens.
These transforms weren't being compiled before the game started.
2023-03-19 14:20:38 -04:00
kyouryuukunn 98609fe72f remove 2-tuple format from point_to 2023-03-19 13:14:50 +09:00
kyouryuukunn 03bf276e15 fix 2023-03-19 12:44:50 +09:00
Tom Rothamel d52fa74ffd Merge pull request #4454 from valery-iwanofu/input_multiline
Multiline support for input
2023-03-18 12:00:13 -04:00
valery.iwanofu 15d2e037fe Multiline support for input 2023-03-18 21:09:57 +07:00
Tom Rothamel 2da6f8cab0 Avoid cache.get keeping the surface in memory when returning a texture. 2023-03-18 01:08:18 -04:00
Tom Rothamel 8c331b336e gl2: More accurate accounting of texture memory.
This adds a 1.34x multiplier to textures that have mipmaps associated
with them, and only indicates that a texture is consuming memory when
it's been transferred to the GPU.
2023-03-18 00:54:37 -04:00
Tom Rothamel 8e90d2f6ab Add a 1.34x multiplier to account for mipmapping.
Increase the default image cache size to match. This won't actually
increase the amount of memory used by the image cache, just
makes the setting match the memory being used.
2023-03-17 22:27:32 -04:00
kyouryuukunn 01c9e137e0 consider camera anchor when calculating point_to camera 2023-03-17 23:01:30 +09:00
kyouryuukunn 47418aa92d allow point_to to take "tag" or camera 2023-03-17 14:35:16 +09:00
Tom Rothamel c998b456a1 Merge pull request #4447 from renpy/point-to
Rename poi to point_to
2023-03-16 18:46:07 -04:00
Gouvernathor bb34b38432 Update renpy/display/accelerator.pyx
Co-authored-by: Mal Graty <mal.graty@googlemail.com>
2023-03-16 12:50:55 +01:00
Tom Rothamel ca1871863b Only close fds if stdout/stderr/stdin are not being used.
Fixes #4445.
2023-03-16 01:17:42 -04:00
Gouvernathor 9475a0f4b8 Better phrased error message 2023-03-16 05:26:07 +01:00
Gouvernathor 606a196e52 Rename poi to point_to (and simplify code) 2023-03-16 05:18:27 +01:00
Gouvernathor bcfdb73715 Simplify and optimize some code 2023-03-16 05:07:10 +01:00
Tom Rothamel f8673861aa Go back to the default colorspace, but with the full JPEG range.
Per #4263.
2023-03-15 22:56:07 -04:00
Tom Rothamel 1947db8acd Merge pull request #4444 from mal/improve-savedump
Improve savedump
2023-03-15 22:10:55 -04:00
Tom Rothamel 260b8f5f8d Merge pull request #4443 from mal/fix-tint-matrix
Fix TintMatrix to respect alpha
2023-03-15 21:25:17 -04:00
Mal Graty e5f58fe935 savedump: Add function support 2023-03-15 18:38:32 +00:00
Mal Graty cfee63b880 savedump: Keep pickle protocol in-sync 2023-03-15 18:21:58 +00:00
Mal Graty ee817a32f4 savedump: Write warning into cache
Previously it would never have been used.
2023-03-15 17:45:49 +00:00
Mal Graty 8039704b0d savedump: Improve representation of singletons 2023-03-15 17:45:11 +00:00
Mal Graty c0ff662d60 matrixcolor: Fix TintMatrix to respect alpha
Per the documentation, the alpha shouldn't ever have been impacted.

This change instead treats the alpha in the supplied RGBA value as the
tint opacity rather than applying the tint formula to the alpha channel.
The result is the ability to use a colour value of #FF000080 to apply
a 50%-red tint to the target.
2023-03-15 17:23:05 +00:00
Tom Rothamel bfd6f2c9a8 Clear a deferred side image if a say statement runs.
Fixes #4438.
2023-03-15 02:27:27 -04:00
Tom Rothamel faa9155c88 More work on #4263.
Fundamentally, the problem is that ffmpeg's yuv->rgb conversion is
inaccurate, unless it's given flags that cause a ~12x slowdown -
SWS_ACCURATE_RND or SWS_ERROR_DIFFUSION.

That's not tolerable, so we do enable SWS_FULL_CHR_H_INT and
SWS_FULL_CHR_H_INP, which seem to improve things somewhat, without
slowing down conversion by much.

We now also default to the ITU 709 colorspace, which is the default
for HD video.
2023-03-14 23:18:15 -04:00
Tom Rothamel 444d002304 Revert "ffmedia: Convert to YUV444, then RGB."
This reverts commit a516bda700.

This conversion was too slow for practical use.
2023-03-14 23:13:32 -04:00
Tom Rothamel 2f56256a82 doc: Renpy.redraw is documented in cdd.rst. 2023-03-14 18:48:04 -04:00
Tom Rothamel 16cba5ef11 Remove debug print. 2023-03-14 01:29:46 -04:00
Tom Rothamel 53b9879a7a Limit the size of the icon to 1024x1024.
A 2048x2048 icon causes an X11 crash.
2023-03-14 00:37:11 -04:00
Tom Rothamel a628b2dba3 Document that being redrawn cancels redraw. 2023-03-13 23:51:21 -04:00
Tom Rothamel e45a3b18ae Separate angle and radius in ATL.
This allows angle and radius to be computed in parallel.

Fixes #4118.
2023-03-13 22:05:02 -04:00
Tom Rothamel a3b8f75a8d Avoid reverting the slast serial number.
This prevents slast nodes from getting the same serial number
after a shift+R reload.
2023-03-13 00:10:57 -04:00
Tom Rothamel a516bda700 ffmedia: Convert to YUV444, then RGB.
This works around some issues, reported in #4263, where going
from YUV420 to RGB directly produces artifacts. The two-step
conversion process eliminates these artifacts.
2023-03-12 18:29:34 -04:00
Tom Rothamel 44e23a9665 Use bilinear interpolation when resampling video.
This should only kick in when resampling movies that are
chroma subsampled, as the luma should always be full size.

Fixes #4263
2023-03-12 00:02:19 -05:00
Tom Rothamel 45e5535e89 Allow greedy rollback to the statement after renpy.block_rollback.
Previously, it woudn't proceed past the next checkpoint after
renpy.block_rollback, which could be several statements away.

Fixes #4138.
2023-03-11 23:08:11 -05:00
Gouvernathor 652a06c1a8 doc: remove obsolete name-munging in f-strings warning 2023-03-12 02:31:12 +01:00
Tom Rothamel e48cd58b2c Add config.file_slotname_callback and config.autosave_prefix_callback.
The former allows a game to customize the mapping from page and name
(used by the File actions) to slot (used by the save functions).

The latter lets the names of the autosaves Ren'Py generates be
customized to match.

Fixes #4067.
2023-03-11 20:27:03 -05:00
Tom Rothamel 8f2c27979a doc: Changelog f-string variable munging. 2023-03-11 19:21:21 -05:00
Tom Rothamel 0d7e5ec9e5 Munge variables in f-strings beginning with __.
As per the rest of Ren'Py. Rather than parsing f-strings ourselves,
this is done as part of the Python compiler.

Fixes #4084.
2023-03-11 18:14:11 -05:00
Tom Rothamel d89c89f368 Munge a _ren.py file the same as the .rpy file it replaces. 2023-03-11 17:44:01 -05:00
Tom Rothamel ec48202e27 Use equality when comparing InputValues.
This is to match the way equality is used in sl2ast to avoid
updating the displayables.

This could be wrong if two displayables use the same (or equal)
InputValues, but that's likely a rare situation.

Fixes #4042.
2023-03-11 16:45:50 -05:00
Tom Rothamel 245576331b Duplicate the control argument of AlphaDissolve.
So that the transform that's being used doesn't run.

Fixes #4435.
2023-03-10 22:31:18 -05:00
Tom Rothamel d426c80761 doc: Fix typo. 2023-03-10 09:14:10 -05:00
Tom Rothamel 303dadf377 Drag improvements.
* Apply displayable before calling per_interact, fixing set_child.
* In the examples, show the use of add rather than child, as the
  style property is for specialized use.

Fixes #4432
2023-03-09 23:55:58 -05:00
Tom Rothamel f50be5712d Merge pull request #4434 from via-my/master
Logical mistake
2023-03-09 20:56:59 -05:00
LaUwUrence ea76473e81 Logical mistake 2023-03-10 00:32:46 +04:00
Tom Rothamel 6662238338 Merge pull request #4428 from Kassy2048/webloader_voice
Remove useless double iteration
2023-03-09 00:14:32 -05:00
Tom Rothamel c33f5c4d3d Force the browser out of fullscreen on input.
Fixes #4429.
2023-03-08 19:14:29 -05:00
Kassy 54fb3d9be8 Remove useless double iteration 2023-03-08 13:50:26 +01:00
Tom Rothamel 5c0f86c19e Update Android strings. 2023-03-08 02:28:58 -05:00
Gouvernathor 1e5c227909 Say statement equivalents tweaks and refactor (#4294)
* doc: tweak and warn about say statement equivalents

* doc: move things around about say statement equivalents

Drain the part about it from the dialogue page
Add a link from there to the statement equivalents page
Add the warning about skipping seen dialogue
Incorporate other explanations, examples and the dialogue window management equivalents

* doc: add more advice about use of the character store

* Remove out-of-place explanation

* Clarify, reorganize, readd interact info with more

* Move the interact override hierarchy around

but leave the interact being passed automatically in the call in the statement equivalents page

* More information about say_arguments_callback

* Add example for say_arguments_callback

fixes #4319
2023-03-08 02:16:48 -05:00
Tom Rothamel 6c8996207b Remove an isinstance check in per_interact().
By moving it into the Layer displayable, we can save the call.
2023-03-08 00:50:02 -05:00
Tom Rothamel cd8b496876 Visit the image child of a Frame.
Fixes #4005.
2023-03-07 23:05:17 -05:00
Tom Rothamel 2379d75173 py2: Default subprocess.Popen's close_fds to True.
This matches the behavior change in Python 3.

Fixes #4425.
2023-03-07 20:31:13 -05:00
170 changed files with 5907 additions and 2743 deletions
+1 -1
View File
@@ -112,7 +112,7 @@ link in a nightly build, or compile the modules as described above. You'll
also need the `Sphinx <https://www.sphinx-doc.org>`_ documentation generator.
If you have pip working, install Sphinx using::
pip install -U sphinx sphinx-bootstrap-theme
pip install -U sphinx sphinx_rtd_theme sphinx_rtd_dark_mode
Once Sphinx is installed, change into the ``sphinx`` directory inside the
Ren'Py checkout and run::
-18
View File
@@ -1,18 +0,0 @@
{
"start_a170b500": {
"area": [
53,
120,
426,
120
]
},
"start_f41f55d7": {
"area": [
106,
60,
426,
120
]
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

+45 -12
View File
@@ -1409,12 +1409,12 @@ style nvl_button_text:
## Bubble screen ###############################################################
##
## 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
## 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.
##
## https://www.renpy.org/doc/html/screen_special.html#bubble
## https://www.renpy.org/doc/html/bubble.html#bubble-screen
screen bubble(who, what):
style_prefix "bubble"
@@ -1434,22 +1434,18 @@ screen bubble(who, what):
text what:
id "what"
style bubble_window is empty
style bubble_namebox is empty
style bubble_who is default
style bubble_what is default
style bubble_window:
background Frame("gui/bubble.png", 15, 15, 15, 15)
padding (15, 10)
xpadding 30
top_padding 5
bottom_padding 5
style bubble_namebox:
background Frame("gui/bubble.png", 15, 15, 15, 15)
pos (-15, -5)
anchor (0.0, 1.0)
padding (15, 10)
xalign 0.5
style bubble_who:
xalign 0.5
@@ -1458,10 +1454,47 @@ style bubble_who:
style bubble_what:
align (0.5, 0.5)
textalign 0.5
text_align 0.5
layout "subtitle"
color "#000"
define bubble.frame = Frame("gui/bubble.png", 55, 55, 55, 95)
define bubble.thoughtframe = Frame("gui/thoughtbubble.png", 55, 55, 55, 55)
define bubble.properties = {
"bottom_left" : {
"window_background" : Transform(bubble.frame, xzoom=1, yzoom=1),
"window_bottom_padding" : 27,
},
"bottom_right" : {
"window_background" : Transform(bubble.frame, xzoom=-1, yzoom=1),
"window_bottom_padding" : 27,
},
"top_left" : {
"window_background" : Transform(bubble.frame, xzoom=1, yzoom=-1),
"window_top_padding" : 27,
},
"top_right" : {
"window_background" : Transform(bubble.frame, xzoom=-1, yzoom=-1),
"window_top_padding" : 27,
},
"thought" : {
"window_background" : bubble.thoughtframe,
}
}
define bubble.expand_area = {
"bottom_left" : (0, 0, 0, 22),
"bottom_right" : (0, 0, 0, 22),
"top_left" : (0, 22, 0, 0),
"top_right" : (0, 22, 0, 0),
"thought" : (0, 0, 0, 0),
}
################################################################################
+3 -1
View File
@@ -31,8 +31,10 @@ init python:
ANDROID_NO_BUNDLE = 6
ANDROID_OK = 7
JDK_REQUIREMENT=8
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 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, 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.")
+3 -2
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.
@@ -63,11 +63,12 @@ init python hide:
__("I found an android.keystore file in the rapt directory. Do you want to use this file?")
__("I can create an application signing key for you. This key is required to create Universal APK for sideloading and stores other than Google Play.\n\nDo you want to create a key?")
__("I will create the key in the android.keystore file.\n\nYou need to back this file up. If you lose it, you will not be able to upgrade your application.\n\nYou also need to keep the key safe. If evil people get this file, they could make fake versions of your application, and potentially steal your users' data.\n\nWill you make a backup of android.keystore, and keep it in a safe place?")
__("\n\nSaying 'No' will prevent key creation.")
__("Could not create android.keystore. Is keytool in your path?")
__("I've finished creating android.keystore. Please back it up, and keep it in a safe place.")
__("I found a bundle.keystore file in the rapt directory. Do you want to use this file?")
__("I can create a bundle signing key for you. This key is required to build an Android App Bundle (AAB) for upload to Google Play.\n\nDo you want to create a key?")
__("I will create the key in the bundle.keystore file.\n\nYou need to back this file up. If you lose it, you will not be able to upgrade your application.\n\nYou also need to keep the key safe. If evil people get this file, they could make fake versions of your application, and potentially steal your users' data.\n\nWill you make a backup of bundle.keystore, and keep it in a safe place?")
__("\n\nSaying 'No' will prevent key creation.")
__("Could not create bundle.keystore. Is keytool in your path?")
__("I've opened the directory containing android.keystore and bundle.keystore. Please back them up, and keep them in a safe place.")
__("It looks like you're ready to start packaging games.")
+2 -1
View File
@@ -214,7 +214,8 @@ class CodeGenerator(object):
'gui.insensitive_color' : repr(self.p.insensitive_color.hexcode),
'gui.text_color' : repr(self.p.text_color.hexcode),
'gui.interface_text_color' : repr(self.p.text_color.hexcode),
'gui.choice_text_color' : repr(self.p.choice_color.hexcode),
'gui.choice_button_text_idle_color' : repr(self.p.idle_color.hexcode),
'gui.choice_button_text_insensitive_color' : repr(self.p.insensitive_color.hexcode),
}
self.update_defines(replacements, language_defines[self.p.language])
+7 -5
View File
@@ -408,13 +408,15 @@ class ImageGenerator(object):
import shutil
source = os.path.join(config.renpy_base, "gui", "game", "gui", "bubble.png")
dest = os.path.join(self.prefix, "bubble.png")
for fn in [ "bubble.png", "thoughtbubble.png" ]:
if source == dest:
return
source = os.path.join(config.renpy_base, "gui", "game", "gui", fn)
dest = os.path.join(self.prefix, fn)
shutil.copyfile(source, dest)
if source == dest:
return
shutil.copyfile(source, dest)
def generate_all(self):
+2 -2
View File
@@ -67,8 +67,8 @@ class GuiParameters(object):
if light:
self.selected_color = Color("#555555")
self.idle_color = Color("#aaaaaa")
self.idle_small_color = Color("#888888")
self.idle_color = Color("#707070")
self.idle_small_color = Color("#606060")
self.text_color = Color("#404040")
self.choice_color = Color("#cccccc")
+1 -3
View File
@@ -95,9 +95,7 @@ label install_live2d:
(r".*/Core/dll/android/(armeabi-v7a/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
(r".*/Core/dll/android/(arm64-v8a/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
# This doesn't exist yet.
# (r".*/Core/dll/android/(x86_64/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
(r".*/Core/dll/android/(x86_64/libLive2DCubismCore.so)", r"rapt/prototype/renpyandroid/src/main/jniLibs/\1"),
]
install_from_zip("Live2D Cubism SDK for Native", "CubismSdkForNative-4-*.zip", patterns)
+9 -1
View File
@@ -200,7 +200,15 @@ screen common:
add SPACER
for v, l in choices:
textbutton l action SetScreenVariable("selected", v)
textbutton l:
action SetScreenVariable("selected", v)
selected_background REVERSE_IDLE
selected_hover_background REVERSE_HOVER
xpadding 20
size_group "choice"
text_selected_idle_color REVERSE_TEXT
text_selected_hover_color REVERSE_TEXT
text_xalign 0.5
if selected is not None:
$ continue_ = Return(selected)
+4 -22
View File
@@ -97,32 +97,14 @@ label itch:
files = [ ]
for fn in os.listdir(destination):
fn = os.path.join(destination, fn)
if fn.endswith("-all.zip"):
channel = "win-osx-linux"
elif fn.endswith("-market.zip"):
channel = "win-osx-linux"
elif fn.endswith("-pc.zip"):
channel = "win-linux"
elif fn.endswith("-win.zip"):
channel = "win"
elif fn.endswith("-mac.zip"):
channel = "osx"
elif fn.endswith("-linux.tar.bz2"):
channel = "linux"
elif fn.endswith("-release.apk"):
channel = "android"
for pattern, channel in reversed(build['itch_channels']):
if fnmatch.fnmatch(fn, pattern):
break
else:
continue
fn = os.path.join(destination, fn)
files.append((fn, channel))
if not os.path.exists(destination):
+3
View File
@@ -449,3 +449,6 @@ python early:
# Since the launcher can be run directly or can be run from the SDK directory,
# uneliding files needs to be handled slightly differently.
define config.alternate_unelide_path = os.path.join(config.basedir, "launcher")
# Disable skipping.
define config.allow_skipping = False
+2 -2
View File
@@ -248,8 +248,8 @@ screen preferences():
add HALF_SPACER
textbutton _("Default theme") style "l_checkbox" action [SetField(persistent, "theme", None), RestartAtPreferences() ]
textbutton _("Dark theme") style "l_checkbox" action [SetField(persistent, "theme", "dark", None), RestartAtPreferences()]
textbutton _("Custom theme") style "l_checkbox" action [SetField(persistent, "theme", "custom", None), RestartAtPreferences()]
textbutton _("Dark theme") style "l_checkbox" action [SetField(persistent, "theme", "dark"), RestartAtPreferences()]
textbutton _("Custom theme") style "l_checkbox" action [SetField(persistent, "theme", "custom"), RestartAtPreferences()]
add SPACER
+1 -1
View File
@@ -20,7 +20,7 @@ label start:
define config.rtl = True
define gui.text_align = 1.0
define gui.textalign = 1.0
define gui.button_text_xalign = 1.0
define gui.prompt_text_xalign = 1.0
define gui.navigation_xpos = 240
+13 -3
View File
@@ -332,8 +332,6 @@
old "return"
new "retour"
translate french strings:
# renpy/common/00accessibility.rpy:76
old "Font Override"
new "Forcer la police"
@@ -812,7 +810,11 @@ translate french strings:
# renpy/common/00director.rpy:1771
old "Click to set transform, right click to add to transform list."
new "Clic pour ajouter un transform, clic droit pour ajouter une liste de transforms."
new "Clic pour assigner le transform, clic droit pour ajouter à la liste des transforms."
# renpy/common/00director.rpy:1789
old "Click to set, right click to add to behind list."
new "Clic pour assigner, clic droit pour ajouter à la liste du \"behind\"."
# renpy/common/00preferences.rpy:528
old "audio when unfocused"
@@ -897,3 +899,11 @@ translate french strings:
# renpy/common/00webvideo.rpy:5
old "Touch to play the video."
new "Touchez pour jouer la vidéo."
# 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?"
new "Cette sauvegarde a été créée sur un autre appareil. Des faux fichiers de sauvegarde peuvent être utilisés pour endommager votre ordinateur. Faites-vous confiance au créateur de cette sauvegarde et à tous ceux qui auraient pu modifier le fichier ?"
# renpy/common/00gui.rpy:457
old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user."
new "Faites-vous confiance à l'appareil sur lequel cette sauvegarde a été créée ? Vous ne devriez dire oui que si vous en êtes l'unique utilisateur ."
+5 -1
View File
@@ -78,7 +78,7 @@
# _developer/developer.rpym:532
old "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
new "\n{color=#cfc}✔ image prédite (bon){/color}\n{color=#fcc}✘ image prédite (mauvais){/color}\n{color=#fff}Glissez pour bouger.{/color}"
new "\n{color=#cfc}✔ image prédite (bien){/color}\n{color=#fcc}✘ image non prédite (pas bien){/color}\n{color=#fff}Glissez pour déplacer.{/color}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
@@ -207,3 +207,7 @@
# renpy/common/00console.rpy:784
old "stack: print the return stack"
new "stack : affiche la pile de retour"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
new "Éditeur de bulles de dialogue (Shift+B)"
+4
View File
@@ -455,3 +455,7 @@
# gui/game/gui.rpy:441
old "## Change the size and spacing of various things."
new "## Changer la taille et l'espacement de diverses choses."
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
new "## Active la vérification de propriétés invalides ou instables dans les screens et transforms"
+49 -5
View File
@@ -41,7 +41,7 @@
# android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
new "RAPT a été installé, mais vous devez installer le kit de développement Android pour pouvoir compiler les paquets Android. Choisissez « installer le kit de développement et créer les clés » pour cela."
new "RAPT a été installé, mais vous devez installer le kit de développement Android pour pouvoir compiler les paquets Android, avec « Installer le SDK »."
# android.rpy:33
old "RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore."
@@ -65,11 +65,11 @@
# android.rpy:39
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 "Tentative d’émulation d'une console télé basée sur Android, comme OUYA ou Fire TV.\n\n Le contrôleur est émulé par les touches fléchées, le bouton select par la touche Entrée, le bouton menu par la touche Echap, et le bouton retour par la touche PageUp."
new "Tentative d’émulation d'une console télé basée sur Android, comme OUYA ou Fire TV.\n\nLa manette est émulée par les touches fléchées, le bouton select par la touche Entrée, le bouton menu par la touche Echap, et le bouton retour par la touche PageUp."
# android.rpy:41
old "Downloads and installs the Android SDK and supporting packages. Optionally, generates the keys required to sign the package."
new "Télécharge et installe le kit de développement Android et les paquets supportés. Optionnellement, génère les clés requises pour signer le paquet."
new "Télécharge et installe le kit de développement Android et les paquets requis. Optionnellement, génère les clés requises pour signer le paquet."
# android.rpy:42
old "Configures the package name, version, and other information about this project."
@@ -1192,8 +1192,8 @@
new "Le nom de fichier ne peut pas être vide."
# game/android.rpy:31
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Un kit de développement Java 8 64-bit/x64 est requis pour construire des paquets Android depuis Windows. Le JDK est différent du JRE, donc il est possible d'avoir Java sans avoir le JDK.\n\n{a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}Téléchargez et installez le JDK{/a}, puis redémarrez Ren'Py."
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 "Un kit de développement Java [JDK_REQUIREMENT] 64-bit/x64 est requis pour construire des paquets Android depuis Windows. Le JDK est différent du JRE, donc il est possible d'avoir Java sans avoir le JDK.\n\n{a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}Téléchargez et installez le JDK{/a}, puis redémarrez Ren'Py."
# 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."
@@ -2086,3 +2086,47 @@
# game/web.rpy:484
old "Creating package..."
new "Création du package..."
# game/android.rpy:37
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 a été installé, mais aucune clé na été configurée. Veuillez générer de nouvelles clés, ou copier android.keystore and bundle.keystore dans le dossier racine du projet."
# game/android.rpy:44
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 "Tentative d’émulation d'une console télé basée sur Android.\n\nLa manette est émulée par les touches fléchées, le bouton select par la touche Entrée, le bouton menu par la touche Echap, et le bouton retour par la touche PageUp."
# game/android.rpy:46
old "Downloads and installs the Android SDK and supporting packages."
new "Télécharge et installe le kit de développement Android et les paquets requis."
# game/android.rpy:47
old "Generates the keys required to sign the package."
new "Génère les clés requises pour signer le package."
# game/android.rpy:381
old "Install SDK"
new "Installer le SDK"
# game/android.rpy:385
old "Generate Keys"
new "Générer les clés"
# game/androidstrings.rpy:32
old "How much RAM (in GB) do you want to allocate to Gradle?\nThis must be a positive integer number."
new "Combien de RAM (in GB) voulez-vous allouer à Gradle ?\nEntrez un nombre entier positif."
# game/androidstrings.rpy:33
old "The RAM size must contain only numbers and be positive."
new "La taille de RAM ne doit contenir que des chiffres et être positive."
# game/androidstrings.rpy:63
old "I found an android.keystore file in the rapt directory. Do you want to use this file?"
new "J'ai trouvé un fichier android.keystore dans le dossier \"rapt\". Voulez-vous l'utiliser ?"
# game/androidstrings.rpy:66
old "\n\nSaying 'No' will prevent key creation."
new "\n\nRépondre \"Non\" empêchera la création de clés."
# game/androidstrings.rpy:69
old "I found a bundle.keystore file in the rapt directory. Do you want to use this file?"
new "J'ai trouvé un fichier bundle.keystore dans le dossier \"rapt\". Voulez-vous l'utiliser ?"
+13 -5
View File
@@ -724,10 +724,18 @@
old "## Bubble screen"
new "## Screen des bulles"
# gui/game/screens.rpy:1399
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."
# gui/game/screens.rpy:1412
old "## The bubble screen is used to display dialogue to the player when using speech bubbles. The Bubble screen takes the same parameters as the say screen, must create a displayable with the id of \"what\", and can create displayables with the \"namebox\", \"who\", and \"window\" ids."
new "## Le screen des bulles est utilisé pour afficher des dialogues en utilisant des bulles. Ce screen prend les mêmes paramètres que le screen say, doit prévoir un displayable avec l'id \"what\", et peut créer des displayables avec les ids \"namebox\", \"who\", et \"window\"."
# gui/game/screens.rpy:1404
old "## https://www.renpy.org/doc/html/screen_special.html#bubble"
new "## https://www.renpy.org/doc/html/screen_special.html#bubble"
# 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"
# gui/game/screens.rpy:676
old "Upload Sync"
new "Uploader Sync"
# gui/game/screens.rpy:680
old "Download Sync"
new "Télécharger Sync"
+2 -5
View File
@@ -1199,15 +1199,13 @@
old "Proceed"
new "Fortsetzen"
translate german strings:
# game/add_file.rpy:37
old "The file name may not be empty."
new "Der Dateiname darf nicht leer sein."
# game/android.rpy:35
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, then restart the Ren'Py launcher."
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 "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."
# 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."
@@ -1932,4 +1930,3 @@ translate german strings:
# game/web.rpy:348
old "Before packaging web apps, you'll need to download RenPyWeb, Ren'Py's web support. Would you like to download RenPyWeb now?"
new "Before packaging web apps, you'll need to download RenPyWeb, Ren'Py's web support. Would you like to download RenPyWeb now?"
+2 -3
View File
@@ -1320,8 +1320,8 @@
new "ファイル名が与えられていません。"
# game/android.rpy:31
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "ウィンドウズでアンドロイドパッケージをビルドするには、 64-bit/x64 Java 8 Development Kit が必要になります。 JDK は JRE とは違うもので、Java には含まれていません。\n\n{a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}JDK{/a}をダンロード、インストールしてから Ren'Py ランチャーを再起動してください。"
old "A 64-bit/x64 Java [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 "ウィンドウズでアンドロイドパッケージをビルドするには、 64-bit/x64 Java 8 Development Kit が必要になります。 JDK は JRE とは違うもので、Java には含まれていません。\n\n{a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}JDK{/a}をダンロード、インストールしてから Ren'Py ランチャーを再起動してください。"
# 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."
@@ -2094,4 +2094,3 @@
# 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 "Ren'Py 8 の将来のリリースでサポートを復活させます。それまではRen'Py 7 をウェブプラットフォームに使用ください。"
+2 -2
View File
@@ -36,8 +36,8 @@
new "안드로이드 패키지를 만드려면, RAPT 파일을 내려받고 렌파이 디렉터리 안에 압축 해제하세요. 그다음 렌파이를 재시작하세요."
# game/android.rpy:31
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "윈도우에서 안드로이드 패키지를 만드려면 64비트 JDK가 필요합니다. JDK는 JRE와 다르므로 PC에 JDK가 없는 자바가 설치되어 있을 수 있습니다.\n\n{a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}JDK를 내려받아 설치한 뒤{/a}, 렌파이를 재시작해주세요."
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 "윈도우에서 안드로이드 패키지를 만드려면 64비트 JDK가 필요합니다. JDK는 JRE와 다르므로 PC에 JDK가 없는 자바가 설치되어 있을 수 있습니다.\n\n{a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}JDK를 내려받아 설치한 뒤{/a}, 렌파이를 재시작해주세요."
# game/android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
+233 -121
View File
@@ -109,11 +109,11 @@ translate piglatin strings:
old "Debug"
new "Ebugday"
# renpy/common/00accessibility.rpy:215
# renpy/common/00accessibility.rpy:223
old "Self-Voicing Volume Drop"
new "Elfsay-Oicingvay Olumevay Ropday"
# renpy/common/00accessibility.rpy:224
# renpy/common/00accessibility.rpy:234
old "The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was."
new "Hetay optionsay onay histay enumay areay intendeday otay improveay accessibilityay. Heytay aymay otnay orkway ithway allay amesgay, anday omesay ombinationscay ofay optionsay aymay enderray hetay amegay unplayableay. Histay isay otnay anay issueay ithway hetay amegay oray engineay. Orfay hetay estbay esultsray henway angingchay ontsfay, ytray otay eepkay hetay exttay izesay hetay amesay asay itay originallyay asway."
@@ -269,483 +269,595 @@ translate piglatin strings:
old "{#month_short}Dec"
new "{#month_short}Ecday"
# renpy/common/00action_file.rpy:250
# renpy/common/00action_file.rpy:258
old "%b %d, %H:%M"
new "%bay %day, %Hay:%May"
# renpy/common/00action_file.rpy:364
# renpy/common/00action_file.rpy:378
old "Save slot %s: [text]"
new "Avesay otslay %say: [text]"
# renpy/common/00action_file.rpy:445
# renpy/common/00action_file.rpy:461
old "Load slot %s: [text]"
new "Oadlay otslay %say: [text]"
# renpy/common/00action_file.rpy:498
# renpy/common/00action_file.rpy:514
old "Delete slot [text]"
new "Eleteday otslay [text]"
# renpy/common/00action_file.rpy:577
# renpy/common/00action_file.rpy:593
old "File page auto"
new "Ilefay agepay autoay"
# renpy/common/00action_file.rpy:579
# renpy/common/00action_file.rpy:595
old "File page quick"
new "Ilefay agepay uickqay"
# renpy/common/00action_file.rpy:581
# renpy/common/00action_file.rpy:597
old "File page [text]"
new "Ilefay agepay [text]"
# renpy/common/00action_file.rpy:780
# renpy/common/00action_file.rpy:796
old "Next file page."
new "Extnay ilefay agepay."
# renpy/common/00action_file.rpy:852
# renpy/common/00action_file.rpy:868
old "Previous file page."
new "Reviouspay ilefay agepay."
# renpy/common/00action_file.rpy:913
# renpy/common/00action_file.rpy:929
old "Quick save complete."
new "Uickqay avesay ompletecay."
# renpy/common/00action_file.rpy:931
# renpy/common/00action_file.rpy:944
old "Quick save."
new "Uickqay avesay."
# renpy/common/00action_file.rpy:950
# renpy/common/00action_file.rpy:963
old "Quick load."
new "Uickqay oadlay."
# renpy/common/00action_other.rpy:377
# renpy/common/00action_other.rpy:381
old "Language [text]"
new "Anguagelay [text]"
# renpy/common/00action_other.rpy:664
# renpy/common/00action_other.rpy:721
old "Open [text] directory."
new "Penoay [text] irectoryday."
# renpy/common/00director.rpy:708
# renpy/common/00director.rpy:705
old "The interactive director is not enabled here."
new "Hetay interactiveay irectorday isay otnay enableday erehay."
# renpy/common/00director.rpy:1481
# renpy/common/00director.rpy:1504
old "⬆"
new "⬆"
# renpy/common/00director.rpy:1487
# renpy/common/00director.rpy:1510
old "⬇"
new "⬇"
# renpy/common/00director.rpy:1551
# renpy/common/00director.rpy:1574
old "Done"
new "Oneday"
# renpy/common/00director.rpy:1561
# renpy/common/00director.rpy:1584
old "(statement)"
new "(atementstay)"
# renpy/common/00director.rpy:1562
# renpy/common/00director.rpy:1585
old "(tag)"
new "(agtay)"
# renpy/common/00director.rpy:1563
# renpy/common/00director.rpy:1586
old "(attributes)"
new "(attributesay)"
# renpy/common/00director.rpy:1564
# renpy/common/00director.rpy:1587
old "(transform)"
new "(ansformtray)"
# renpy/common/00director.rpy:1589
# renpy/common/00director.rpy:1612
old "(transition)"
new "(ansitiontray)"
# renpy/common/00director.rpy:1601
# renpy/common/00director.rpy:1624
old "(channel)"
new "(annelchay)"
# renpy/common/00director.rpy:1602
# renpy/common/00director.rpy:1625
old "(filename)"
new "(ilenamefay)"
# renpy/common/00director.rpy:1631
# renpy/common/00director.rpy:1654
old "Change"
new "Hangecay"
# renpy/common/00director.rpy:1633
# renpy/common/00director.rpy:1656
old "Add"
new "Ddaay"
# renpy/common/00director.rpy:1636
# renpy/common/00director.rpy:1659
old "Cancel"
new "Ancelcay"
# renpy/common/00director.rpy:1639
# renpy/common/00director.rpy:1662
old "Remove"
new "Emoveray"
# renpy/common/00director.rpy:1674
# renpy/common/00director.rpy:1697
old "Statement:"
new "Tatementsay:"
# renpy/common/00director.rpy:1695
# renpy/common/00director.rpy:1718
old "Tag:"
new "Agtay:"
# renpy/common/00director.rpy:1711
# renpy/common/00director.rpy:1734
old "Attributes:"
new "Ttributesaay:"
# renpy/common/00director.rpy:1729
# renpy/common/00director.rpy:1745
old "Click to toggle attribute, right click to toggle negative attribute."
new "Lickcay otay oggletay attributeay, ightray ickclay otay oggletay egativenay attributeay."
# renpy/common/00director.rpy:1757
old "Transforms:"
new "Ransformstay:"
# renpy/common/00director.rpy:1748
# renpy/common/00director.rpy:1768
old "Click to set transform, right click to add to transform list."
new "Lickcay otay etsay ansformtray, ightray ickclay otay adday otay ansformtray istlay."
# renpy/common/00director.rpy:1780
old "Behind:"
new "Ehindbay:"
# renpy/common/00director.rpy:1767
# renpy/common/00director.rpy:1789
old "Click to set, right click to add to behind list."
new "Lickcay otay etsay, ightray ickclay otay adday otay ehindbay istlay."
# renpy/common/00director.rpy:1801
old "Transition:"
new "Ransitiontay:"
# renpy/common/00director.rpy:1785
# renpy/common/00director.rpy:1819
old "Channel:"
new "Hannelcay:"
# renpy/common/00director.rpy:1803
# renpy/common/00director.rpy:1837
old "Audio Filename:"
new "Udioaay Ilenamefay:"
# renpy/common/00gui.rpy:435
# renpy/common/00gui.rpy:446
old "Are you sure?"
new "Reaay ouyay uresay?"
# renpy/common/00gui.rpy:436
# renpy/common/00gui.rpy:447
old "Are you sure you want to delete this save?"
new "Reaay ouyay uresay ouyay antway otay eleteday histay avesay?"
# renpy/common/00gui.rpy:437
# renpy/common/00gui.rpy:448
old "Are you sure you want to overwrite your save?"
new "Reaay ouyay uresay ouyay antway otay overwriteay ouryay avesay?"
# renpy/common/00gui.rpy:438
# renpy/common/00gui.rpy:449
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "Oadinglay illway oselay unsaveday rogresspay.\nReaay ouyay uresay ouyay antway otay oday histay?"
# renpy/common/00gui.rpy:439
# renpy/common/00gui.rpy:450
old "Are you sure you want to quit?"
new "Reaay ouyay uresay ouyay antway otay uitqay?"
# renpy/common/00gui.rpy:440
# renpy/common/00gui.rpy:451
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "Reaay ouyay uresay ouyay antway otay eturnray otay hetay ainmay enumay?\nHistay illway oselay unsaveday rogresspay."
# renpy/common/00gui.rpy:441
# renpy/common/00gui.rpy:452
old "Are you sure you want to end the replay?"
new "Reaay ouyay uresay ouyay antway otay enday hetay eplayray?"
# renpy/common/00gui.rpy:442
# renpy/common/00gui.rpy:453
old "Are you sure you want to begin skipping?"
new "Reaay ouyay uresay ouyay antway otay eginbay kippingsay?"
# renpy/common/00gui.rpy:443
# renpy/common/00gui.rpy:454
old "Are you sure you want to skip to the next choice?"
new "Reaay ouyay uresay ouyay antway otay kipsay otay hetay extnay oicechay?"
# renpy/common/00gui.rpy:444
# renpy/common/00gui.rpy:455
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "Reaay ouyay uresay ouyay antway otay kipsay unseenay ialogueday otay hetay extnay oicechay?"
# renpy/common/00keymap.rpy:310
# 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?"
new "Histay avesay asway reatedcay onay aay ifferentday eviceday. Aliciouslymay onstructedcay avesay ilesfay ancay armhay ouryay omputercay. Oday ouyay usttray histay avesay'say reatorcay anday everyoneay howay ouldcay avehay angedchay hetay ilefay?"
# renpy/common/00gui.rpy:457
old "Do you trust the device the save was created on? You should only choose yes if you are the device's sole user."
new "Oday ouyay usttray hetay eviceday hetay avesay asway reatedcay onay? Ouyay ouldshay onlyay oosechay esyay ifay ouyay areay hetay eviceday'say olesay useray."
# renpy/common/00keymap.rpy:322
old "Failed to save screenshot as %s."
new "Ailedfay otay avesay creenshotsay asay %say."
# renpy/common/00keymap.rpy:322
# renpy/common/00keymap.rpy:334
old "Saved screenshot as %s."
new "Avedsay creenshotsay asay %say."
# renpy/common/00library.rpy:211
# renpy/common/00library.rpy:235
old "Skip Mode"
new "Kipsay Odemay"
# renpy/common/00library.rpy:297
# renpy/common/00library.rpy:340
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}."
# renpy/common/00preferences.rpy:263
# renpy/common/00preferences.rpy:271
old "display"
new "isplayday"
# renpy/common/00preferences.rpy:275
# renpy/common/00preferences.rpy:283
old "transitions"
new "ansitionstray"
# renpy/common/00preferences.rpy:284
# renpy/common/00preferences.rpy:292
old "skip transitions"
new "kipsay ansitionstray"
# renpy/common/00preferences.rpy:286
# renpy/common/00preferences.rpy:294
old "video sprites"
new "ideovay pritessay"
# renpy/common/00preferences.rpy:295
# renpy/common/00preferences.rpy:303
old "show empty window"
new "owshay emptyay indowway"
# renpy/common/00preferences.rpy:304
# renpy/common/00preferences.rpy:312
old "text speed"
new "exttay peedsay"
# renpy/common/00preferences.rpy:312
# renpy/common/00preferences.rpy:320
old "joystick"
new "oystickjay"
# renpy/common/00preferences.rpy:312
# renpy/common/00preferences.rpy:320
old "joystick..."
new "oystickjay..."
# renpy/common/00preferences.rpy:319
# renpy/common/00preferences.rpy:327
old "skip"
new "kipsay"
# renpy/common/00preferences.rpy:322
# renpy/common/00preferences.rpy:330
old "skip unseen [text]"
new "kipsay unseenay [text]"
# renpy/common/00preferences.rpy:327
# renpy/common/00preferences.rpy:335
old "skip unseen text"
new "kipsay unseenay exttay"
# renpy/common/00preferences.rpy:329
# renpy/common/00preferences.rpy:337
old "begin skipping"
new "eginbay kippingsay"
# renpy/common/00preferences.rpy:333
# renpy/common/00preferences.rpy:341
old "after choices"
new "afteray oiceschay"
# renpy/common/00preferences.rpy:340
# renpy/common/00preferences.rpy:348
old "skip after choices"
new "kipsay afteray oiceschay"
# renpy/common/00preferences.rpy:342
# renpy/common/00preferences.rpy:350
old "auto-forward time"
new "autoay-orwardfay imetay"
# renpy/common/00preferences.rpy:356
# renpy/common/00preferences.rpy:364
old "auto-forward"
new "autoay-orwardfay"
# renpy/common/00preferences.rpy:363
# renpy/common/00preferences.rpy:371
old "Auto forward"
new "Utoaay orwardfay"
# renpy/common/00preferences.rpy:366
# renpy/common/00preferences.rpy:374
old "auto-forward after click"
new "autoay-orwardfay afteray ickclay"
# renpy/common/00preferences.rpy:375
# renpy/common/00preferences.rpy:383
old "automatic move"
new "automaticay ovemay"
# renpy/common/00preferences.rpy:384
# renpy/common/00preferences.rpy:392
old "wait for voice"
new "aitway orfay oicevay"
# renpy/common/00preferences.rpy:393
# renpy/common/00preferences.rpy:401
old "voice sustain"
new "oicevay ustainsay"
# renpy/common/00preferences.rpy:402
# renpy/common/00preferences.rpy:410
old "self voicing"
new "elfsay oicingvay"
# renpy/common/00preferences.rpy:411
# renpy/common/00preferences.rpy:419
old "self voicing volume drop"
new "elfsay oicingvay olumevay ropday"
# renpy/common/00preferences.rpy:419
# renpy/common/00preferences.rpy:427
old "clipboard voicing"
new "ipboardclay oicingvay"
# renpy/common/00preferences.rpy:428
# renpy/common/00preferences.rpy:436
old "debug voicing"
new "ebugday oicingvay"
# renpy/common/00preferences.rpy:437
# renpy/common/00preferences.rpy:445
old "emphasize audio"
new "emphasizeay audioay"
# renpy/common/00preferences.rpy:446
# renpy/common/00preferences.rpy:454
old "rollback side"
new "ollbackray idesay"
# renpy/common/00preferences.rpy:456
# renpy/common/00preferences.rpy:464
old "gl powersave"
new "glay owersavepay"
# renpy/common/00preferences.rpy:462
# renpy/common/00preferences.rpy:470
old "gl framerate"
new "glay ameratefray"
# renpy/common/00preferences.rpy:465
# renpy/common/00preferences.rpy:473
old "gl tearing"
new "glay earingtay"
# renpy/common/00preferences.rpy:468
# renpy/common/00preferences.rpy:476
old "font transform"
new "ontfay ansformtray"
# renpy/common/00preferences.rpy:471
# renpy/common/00preferences.rpy:479
old "font size"
new "ontfay izesay"
# renpy/common/00preferences.rpy:479
# renpy/common/00preferences.rpy:487
old "font line spacing"
new "ontfay inelay pacingsay"
# renpy/common/00preferences.rpy:487
# renpy/common/00preferences.rpy:495
old "system cursor"
new "ystemsay ursorcay"
# renpy/common/00preferences.rpy:496
# renpy/common/00preferences.rpy:504
old "renderer menu"
new "endererray enumay"
# renpy/common/00preferences.rpy:499
# renpy/common/00preferences.rpy:507
old "accessibility menu"
new "accessibilityay enumay"
# renpy/common/00preferences.rpy:502
# renpy/common/00preferences.rpy:510
old "high contrast text"
new "ighhay ontrastcay exttay"
# renpy/common/00preferences.rpy:511
# renpy/common/00preferences.rpy:519
old "audio when minimized"
new "audioay henway inimizedmay"
# renpy/common/00preferences.rpy:531
# renpy/common/00preferences.rpy:528
old "audio when unfocused"
new "audioay henway unfocuseday"
# renpy/common/00preferences.rpy:537
old "web cache preload"
new "ebway achecay reloadpay"
# renpy/common/00preferences.rpy:552
old "voice after game menu"
new "oicevay afteray amegay enumay"
# renpy/common/00preferences.rpy:571
old "main volume"
new "ainmay olumevay"
# renpy/common/00preferences.rpy:532
# renpy/common/00preferences.rpy:572
old "music volume"
new "usicmay olumevay"
# renpy/common/00preferences.rpy:533
# renpy/common/00preferences.rpy:573
old "sound volume"
new "oundsay olumevay"
# renpy/common/00preferences.rpy:534
# renpy/common/00preferences.rpy:574
old "voice volume"
new "oicevay olumevay"
# renpy/common/00preferences.rpy:535
# renpy/common/00preferences.rpy:575
old "mute main"
new "utemay ainmay"
# renpy/common/00preferences.rpy:536
# renpy/common/00preferences.rpy:576
old "mute music"
new "utemay usicmay"
# renpy/common/00preferences.rpy:537
# renpy/common/00preferences.rpy:577
old "mute sound"
new "utemay oundsay"
# renpy/common/00preferences.rpy:538
# renpy/common/00preferences.rpy:578
old "mute voice"
new "utemay oicevay"
# renpy/common/00preferences.rpy:539
# renpy/common/00preferences.rpy:579
old "mute all"
new "utemay allay"
# renpy/common/00preferences.rpy:620
# renpy/common/00preferences.rpy:653
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "Lipboardcay oicingvay enableday. Resspay 'iftshay+Cay' otay isableday."
# renpy/common/00preferences.rpy:622
# renpy/common/00preferences.rpy:655
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Elfsay-oicingvay ouldway aysay \"[renpy.display.tts.last]\". Resspay 'altay+iftshay+Vay' otay isableday."
# renpy/common/00preferences.rpy:624
# renpy/common/00preferences.rpy:657
old "Self-voicing enabled. Press 'v' to disable."
new "Elfsay-oicingvay enableday. Resspay 'vay' otay isableday."
# renpy/common/00speechbubble.rpy:344
old "Speech Bubble Editor"
new "Peechsay Ubblebay Ditoreay"
# renpy/common/00speechbubble.rpy:349
old "(hide)"
new "(idehay)"
# renpy/common/00sync.rpy:70
old "Sync downloaded."
new "Yncsay ownloadedday."
# renpy/common/00sync.rpy:190
old "Could not connect to the Ren'Py Sync server."
new "Ouldcay otnay onnectcay otay hetay Enray'Ypay Yncsay erversay."
# renpy/common/00sync.rpy:192
old "The Ren'Py Sync server timed out."
new "Hetay Enray'Ypay Yncsay erversay imedtay outay."
# renpy/common/00sync.rpy:194
old "An unknown error occurred while connecting to the Ren'Py Sync server."
new "Naay unknownay erroray occurreday hileway onnectingcay otay hetay Enray'Ypay Yncsay erversay."
# renpy/common/00sync.rpy:267
old "The Ren'Py Sync server does not have a copy of this sync. The sync ID may be invalid, or it may have timed out."
new "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
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
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
old "The sync could not be decrypted."
new "Hetay yncsay ouldcay otnay ebay ecryptedday."
# renpy/common/00sync.rpy:471
old "The sync belongs to a different game."
new "Hetay yncsay elongsbay otay aay ifferentday amegay."
# renpy/common/00sync.rpy:476
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
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
old "Enter Sync ID"
new "Ntereay Yncsay Diay"
# renpy/common/00sync.rpy:569
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
old "Sync Success"
new "Yncsay Uccesssay"
# renpy/common/00sync.rpy:599
old "The Sync ID is:"
new "Hetay Yncsay Diay isay:"
# 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}."
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
old "Continue"
new "Ontinuecay"
# renpy/common/00sync.rpy:631
old "Sync Error"
new "Yncsay Rroreay"
# renpy/common/00iap.rpy:219
old "Contacting App Store\nPlease Wait..."
new "Ontactingcay Ppaay Toresay\nLeasepay Aitway..."
# renpy/common/00updater.rpy:390
# renpy/common/00updater.rpy:419
old "The Ren'Py Updater is not supported on mobile devices."
new "Hetay Enray'Ypay Pdateruay isay otnay upportedsay onay obilemay evicesday."
# renpy/common/00updater.rpy:519
# renpy/common/00updater.rpy:548
old "An error is being simulated."
new "Naay erroray isay eingbay imulatedsay."
# renpy/common/00updater.rpy:703
# renpy/common/00updater.rpy:738
old "Either this project does not support updating, or the update status file was deleted."
new "Ithereay histay rojectpay oesday otnay upportsay updatingay, oray hetay updateay atusstay ilefay asway eletedday."
# renpy/common/00updater.rpy:717
# renpy/common/00updater.rpy:752
old "This account does not have permission to perform an update."
new "Histay accountay oesday otnay avehay ermissionpay otay erformpay anay updateay."
# renpy/common/00updater.rpy:720
# renpy/common/00updater.rpy:755
old "This account does not have permission to write the update log."
new "Histay accountay oesday otnay avehay ermissionpay otay riteway hetay updateay oglay."
# renpy/common/00updater.rpy:748
# renpy/common/00updater.rpy:783
old "Could not verify update signature."
new "Ouldcay otnay erifyvay updateay ignaturesay."
# renpy/common/00updater.rpy:1049
# renpy/common/00updater.rpy:1084
old "The update file was not downloaded."
new "Hetay updateay ilefay asway otnay ownloadedday."
# renpy/common/00updater.rpy:1067
# renpy/common/00updater.rpy:1102
old "The update file does not have the correct digest - it may have been corrupted."
new "Hetay updateay ilefay oesday otnay avehay hetay orrectcay igestday - itay aymay avehay eenbay orruptedcay."
# renpy/common/00updater.rpy:1217
# renpy/common/00updater.rpy:1252
old "While unpacking {}, unknown type {}."
new "Hileway unpackingay {}, unknownay ypetay {}."
# renpy/common/00updater.rpy:1589
# renpy/common/00updater.rpy:1624
old "Updater"
new "Pdateruay"
# renpy/common/00updater.rpy:1600
# renpy/common/00updater.rpy:1635
old "This program is up to date."
new "Histay rogrampay isay upay otay ateday."
# renpy/common/00updater.rpy:1602
# renpy/common/00updater.rpy:1637
old "[u.version] is available. Do you want to install it?"
new "[u.version] isay availableay. Oday ouyay antway otay installay itay?"
# renpy/common/00updater.rpy:1604
# renpy/common/00updater.rpy:1639
old "Preparing to download the updates."
new "Reparingpay otay ownloadday hetay updatesay."
# renpy/common/00updater.rpy:1606
# renpy/common/00updater.rpy:1641
old "Downloading the updates."
new "Ownloadingday hetay updatesay."
# renpy/common/00updater.rpy:1608
# renpy/common/00updater.rpy:1643
old "Unpacking the updates."
new "Npackinguay hetay updatesay."
# renpy/common/00updater.rpy:1612
# renpy/common/00updater.rpy:1647
old "The updates have been installed. The program will restart."
new "Hetay updatesay avehay eenbay installeday. Hetay rogrampay illway estartray."
# renpy/common/00updater.rpy:1614
# renpy/common/00updater.rpy:1649
old "The updates have been installed."
new "Hetay updatesay avehay eenbay installeday."
# renpy/common/00updater.rpy:1616
# renpy/common/00updater.rpy:1651
old "The updates were cancelled."
new "Hetay updatesay ereway ancelledcay."
+64 -56
View File
@@ -22,90 +22,94 @@ translate piglatin strings:
new "Ariablevay Iewervay"
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
new "Ersistentpay Iewervay"
# renpy/common/_developer/developer.rpym:53
old "Image Location Picker"
new "Mageiay Ocationlay Ickerpay"
# renpy/common/_developer/developer.rpym:53
# renpy/common/_developer/developer.rpym:55
old "Filename List"
new "Ilenamefay Istlay"
# renpy/common/_developer/developer.rpym:57
# renpy/common/_developer/developer.rpym:59
old "Show Image Load Log (F4)"
new "Howsay Mageiay Oadlay Oglay (4fay)"
# renpy/common/_developer/developer.rpym:60
# renpy/common/_developer/developer.rpym:62
old "Hide Image Load Log (F4)"
new "Idehay Mageiay Oadlay Oglay (4fay)"
# renpy/common/_developer/developer.rpym:63
# renpy/common/_developer/developer.rpym:65
old "Image Attributes"
new "Mageiay Ttributesaay"
# renpy/common/_developer/developer.rpym:90
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
new "Peechsay Ubblebay Ditoreay (Hiftsay+Bay)"
# renpy/common/_developer/developer.rpym:97
old "[name] [attributes] (hidden)"
new "[name] [attributes] (iddenhay)"
# renpy/common/_developer/developer.rpym:94
# renpy/common/_developer/developer.rpym:101
old "[name] [attributes]"
new "[name] [attributes]"
# renpy/common/_developer/developer.rpym:143
# renpy/common/_developer/developer.rpym:151
old "Nothing to inspect."
new "Othingnay otay inspectay."
# renpy/common/_developer/developer.rpym:154
# renpy/common/_developer/developer.rpym:162
old "Hide deleted"
new "Idehay eletedday"
# renpy/common/_developer/developer.rpym:154
# renpy/common/_developer/developer.rpym:162
old "Show deleted"
new "Howsay eletedday"
# renpy/common/_developer/developer.rpym:278
old "Return to the developer menu"
new "Eturnray otay hetay eveloperday enumay"
# renpy/common/_developer/developer.rpym:443
old "Rectangle: %r"
new "Ectangleray: %ray"
# renpy/common/_developer/developer.rpym:448
old "Mouse position: %r"
new "Ousemay ositionpay: %ray"
# renpy/common/_developer/developer.rpym:453
old "Right-click or escape to quit."
new "Ightray-ickclay oray escapeay otay uitqay."
# renpy/common/_developer/developer.rpym:485
# renpy/common/_developer/developer.rpym:318
old "Rectangle copied to clipboard."
new "Ectangleray opiedcay otay ipboardclay."
# renpy/common/_developer/developer.rpym:488
# renpy/common/_developer/developer.rpym:321
old "Position copied to clipboard."
new "Ositionpay opiedcay otay ipboardclay."
# renpy/common/_developer/developer.rpym:506
# renpy/common/_developer/developer.rpym:333
old "Rectangle: %r"
new "Ectangleray: %ray"
# renpy/common/_developer/developer.rpym:336
old "Mouse position: %r"
new "Ousemay ositionpay: %ray"
# renpy/common/_developer/developer.rpym:341
old "Right-click or escape to quit."
new "Ightray-ickclay oray escapeay otay uitqay."
# renpy/common/_developer/developer.rpym:389
old "Type to filter: "
new "Ypetay otay ilterfay: "
# renpy/common/_developer/developer.rpym:631
# renpy/common/_developer/developer.rpym:507
old "Textures: [tex_count] ([tex_size_mb:.1f] MB)"
new "Exturestay: [tex_count] ([tex_size_mb:.1f] Bmay)"
# renpy/common/_developer/developer.rpym:635
# renpy/common/_developer/developer.rpym:511
old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)"
new "Mageiay achecay: [cache_pct:.1f]% ([cache_size_mb:.1f] Bmay)"
# renpy/common/_developer/developer.rpym:645
# renpy/common/_developer/developer.rpym:521
old "✔ "
new "✔ "
# renpy/common/_developer/developer.rpym:648
# renpy/common/_developer/developer.rpym:524
old "✘ "
new "✘ "
# renpy/common/_developer/developer.rpym:653
# renpy/common/_developer/developer.rpym:529
old "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
new "\n{color=#cfc}✔ redictedpay imageay (oodgay){/color}\n{color=#fcc}✘ unpredicteday imageay (adbay){/color}\n{color=#fff}Ragday otay ovemay.{/color}"
@@ -145,87 +149,91 @@ translate piglatin strings:
old "<repr() failed>"
new "<eprray() ailedfay>"
# renpy/common/00console.rpy:492
# renpy/common/00console.rpy:533
old "Press <esc> to exit console. Type help for help.\n"
new "Resspay <escay> otay exitay onsolecay. Ypetay elphay orfay elphay.\n"
# renpy/common/00console.rpy:496
# renpy/common/00console.rpy:537
old "Ren'Py script enabled."
new "Enray'Ypay criptsay enableday."
# renpy/common/00console.rpy:498
# renpy/common/00console.rpy:539
old "Ren'Py script disabled."
new "Enray'Ypay criptsay isabledday."
# renpy/common/00console.rpy:747
old "help: show this help"
new "elphay: owshay histay elphay"
# renpy/common/00console.rpy:789
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
new "elphay: owshay histay elphay\n elphay <expray>: owshay ignaturesay anday ocumentationday ofay <expray>"
# renpy/common/00console.rpy:752
# renpy/common/00console.rpy:813
old "Help may display undocumented functions. Please check that the function or\nclass you want to use is documented.\n\n"
new "Elphay aymay isplayday undocumenteday unctionsfay. Leasepay eckchay hattay hetay unctionfay oray\nassclay ouyay antway otay useay isay ocumentedday.\n\n"
# renpy/common/00console.rpy:822
old "commands:\n"
new "ommandscay:\n"
# renpy/common/00console.rpy:762
# renpy/common/00console.rpy:832
old " <renpy script statement>: run the statement\n"
new " <enpyray criptsay atementstay>: unray hetay atementstay\n"
# renpy/common/00console.rpy:764
# renpy/common/00console.rpy:834
old " <python expression or statement>: run the expression or statement"
new " <ythonpay expressionay oray atementstay>: unray hetay expressionay oray atementstay"
# renpy/common/00console.rpy:772
# renpy/common/00console.rpy:842
old "clear: clear the console history"
new "earclay: earclay hetay onsolecay istoryhay"
# renpy/common/00console.rpy:776
# renpy/common/00console.rpy:846
old "exit: exit the console"
new "exitay: exitay hetay onsolecay"
# renpy/common/00console.rpy:784
# renpy/common/00console.rpy:854
old "stack: print the return stack"
new "ackstay: rintpay hetay eturnray ackstay"
# renpy/common/00console.rpy:806
# renpy/common/00console.rpy:876
old "load <slot>: loads the game from slot"
new "oadlay <otslay>: oadslay hetay amegay omfray otslay"
# renpy/common/00console.rpy:819
# renpy/common/00console.rpy:889
old "save <slot>: saves the game in slot"
new "avesay <otslay>: avessay hetay amegay inay otslay"
# renpy/common/00console.rpy:830
# renpy/common/00console.rpy:900
old "reload: reloads the game, refreshing the scripts"
new "eloadray: eloadsray hetay amegay, efreshingray hetay criptssay"
# renpy/common/00console.rpy:838
# renpy/common/00console.rpy:908
old "watch <expression>: watch a python expression\n watch short: makes the representation of traced expressions short (default)\n watch long: makes the representation of traced expressions as is"
new "atchway <expressionay>: atchway aay ythonpay expressionay\n atchway ortshay: akesmay hetay epresentationray ofay acedtray expressionsay ortshay (efaultday)\n atchway onglay: akesmay hetay epresentationray ofay acedtray expressionsay asay isay"
# renpy/common/00console.rpy:875
# renpy/common/00console.rpy:945
old "unwatch <expression>: stop watching an expression"
new "unwatchay <expressionay>: opstay atchingway anay expressionay"
# renpy/common/00console.rpy:918
# renpy/common/00console.rpy:991
old "unwatchall: stop watching all expressions"
new "unwatchallay: opstay atchingway allay expressionsay"
# renpy/common/00console.rpy:939
# renpy/common/00console.rpy:1012
old "jump <label>: jumps to label"
new "umpjay <abellay>: umpsjay otay abellay"
# renpy/common/00console.rpy:955
# renpy/common/00console.rpy:1028
old "short: Shorten the representation of objects on the console (default)."
new "ortshay: Hortensay hetay epresentationray ofay objectsay onay hetay onsolecay (efaultday)."
# renpy/common/00console.rpy:959
# renpy/common/00console.rpy:1032
old "long: Print the full representation of objects on the console."
new "onglay: Rintpay hetay ullfay epresentationray ofay objectsay onay hetay onsolecay."
# renpy/common/00console.rpy:963
# renpy/common/00console.rpy:1036
old "escape: Enables escaping of unicode symbols in unicode strings."
new "escapeay: Nableseay escapingay ofay unicodeay ymbolssay inay unicodeay ringsstay."
# renpy/common/00console.rpy:967
# renpy/common/00console.rpy:1040
old "unescape: Disables escaping of unicode symbols in unicode strings and print it as is (default)."
new "unescapeay: Isablesday escapingay ofay unicodeay ymbolssay inay unicodeay ringsstay anday rintpay itay asay isay (efaultday)."
+18 -18
View File
@@ -129,75 +129,75 @@ translate piglatin strings:
old "Back (B)"
new "Ackbay (Bay)"
# renpy/common/_errorhandling.rpym:553
# renpy/common/_errorhandling.rpym:555
old "Open"
new "Penoay"
# renpy/common/_errorhandling.rpym:555
# renpy/common/_errorhandling.rpym:557
old "Opens the traceback.txt file in a text editor."
new "Pensoay hetay acebacktray.xttay ilefay inay aay exttay editoray."
# renpy/common/_errorhandling.rpym:557
# renpy/common/_errorhandling.rpym:559
old "Copy BBCode"
new "Opycay Bcodebay"
# renpy/common/_errorhandling.rpym:559
# renpy/common/_errorhandling.rpym:561
old "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/."
new "Opiescay hetay acebacktray.xttay ilefay otay hetay ipboardclay asay Bcodebay orfay orumsfay ikelay ttpshay://emmasoftlay.enairay.usay/."
# renpy/common/_errorhandling.rpym:561
# renpy/common/_errorhandling.rpym:563
old "Copy Markdown"
new "Opycay Arkdownmay"
# renpy/common/_errorhandling.rpym:563
# renpy/common/_errorhandling.rpym:565
old "Copies the traceback.txt file to the clipboard as Markdown for Discord."
new "Opiescay hetay acebacktray.xttay ilefay otay hetay ipboardclay asay Arkdownmay orfay Iscordday."
# renpy/common/_errorhandling.rpym:592
# renpy/common/_errorhandling.rpym:594
old "An exception has occurred."
new "Naay exceptionay ashay occurreday."
# renpy/common/_errorhandling.rpym:615
# renpy/common/_errorhandling.rpym:617
old "Rollback"
new "Ollbackray"
# renpy/common/_errorhandling.rpym:617
# renpy/common/_errorhandling.rpym:619
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "Ttemptsaay aay ollray ackbay otay aay riorpay imetay, allowingay ouyay otay avesay oray oosechay aay ifferentday oicechay."
# renpy/common/_errorhandling.rpym:620
# renpy/common/_errorhandling.rpym:622
old "Ignore"
new "Gnoreiay"
# renpy/common/_errorhandling.rpym:624
# renpy/common/_errorhandling.rpym:626
old "Ignores the exception, allowing you to continue."
new "Gnoresiay hetay exceptionay, allowingay ouyay otay ontinuecay."
# renpy/common/_errorhandling.rpym:626
# renpy/common/_errorhandling.rpym:628
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "Gnoresiay hetay exceptionay, allowingay ouyay otay ontinuecay. Histay oftenay eadslay otay additionalay errorsay."
# renpy/common/_errorhandling.rpym:630
# renpy/common/_errorhandling.rpym:632
old "Reload"
new "Eloadray"
# renpy/common/_errorhandling.rpym:632
# renpy/common/_errorhandling.rpym:634
old "Reloads the game from disk, saving and restoring game state if possible."
new "Eloadsray hetay amegay omfray iskday, avingsay anday estoringray amegay atestay ifay ossiblepay."
# renpy/common/_errorhandling.rpym:635
# renpy/common/_errorhandling.rpym:637
old "Console"
new "Onsolecay"
# renpy/common/_errorhandling.rpym:637
# renpy/common/_errorhandling.rpym:639
old "Opens a console to allow debugging the problem."
new "Pensoay aay onsolecay otay alloway ebuggingday hetay roblempay."
# renpy/common/_errorhandling.rpym:650
# renpy/common/_errorhandling.rpym:652
old "Quits the game."
new "Uitsqay hetay amegay."
# renpy/common/_errorhandling.rpym:671
# renpy/common/_errorhandling.rpym:673
old "Parsing the script failed."
new "Arsingpay hetay criptsay ailedfay."
+109 -105
View File
@@ -13,423 +13,427 @@ translate piglatin strings:
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
new "## Allingcay uigay.initay esetsray hetay ylesstay otay ensiblesay efaultday aluesvay, anday etssay hetay idthway anday eighthay ofay hetay amegay."
# gui/game/gui.rpy:17
# gui/game/gui.rpy:14
old "## Enable checks for invalid or unstable properties in screens or transforms"
new "## Nableeay eckschay orfay invaliday oray unstableay ropertiespay inay creenssay oray ansformstray"
# gui/game/gui.rpy:19
old "## GUI Configuration Variables"
new "## Uigay Onfigurationcay Ariablesvay"
# gui/game/gui.rpy:21
# gui/game/gui.rpy:23
old "## Colors"
new "## Olorscay"
# gui/game/gui.rpy:23
# gui/game/gui.rpy:25
old "## The colors of text in the interface."
new "## Hetay olorscay ofay exttay inay hetay interfaceay."
# gui/game/gui.rpy:25
# gui/game/gui.rpy:27
old "## An accent color used throughout the interface to label and highlight text."
new "## Naay accentay olorcay useday hroughouttay hetay interfaceay otay abellay anday ighlighthay exttay."
# gui/game/gui.rpy:29
# gui/game/gui.rpy:31
old "## The color used for a text button when it is neither selected nor hovered."
new "## Hetay olorcay useday orfay aay exttay uttonbay henway itay isay eithernay electedsay ornay overedhay."
# gui/game/gui.rpy:32
# gui/game/gui.rpy:34
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
new "## Hetay mallsay olorcay isay useday orfay mallsay exttay, hichway eedsnay otay ebay ighterbray/arkerday otay achieveay hetay amesay effectay."
# gui/game/gui.rpy:36
# gui/game/gui.rpy:38
old "## The color that is used for buttons and bars that are hovered."
new "## Hetay olorcay hattay isay useday orfay uttonsbay anday arsbay hattay areay overedhay."
# gui/game/gui.rpy:39
# gui/game/gui.rpy:41
old "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
new "## Hetay olorcay useday orfay aay exttay uttonbay henway itay isay electedsay utbay otnay ocusedfay. Aay uttonbay isay electedsay ifay itay isay hetay urrentcay creensay oray referencepay aluevay."
# gui/game/gui.rpy:43
# gui/game/gui.rpy:45
old "## The color used for a text button when it cannot be selected."
new "## Hetay olorcay useday orfay aay exttay uttonbay henway itay annotcay ebay electedsay."
# gui/game/gui.rpy:46
# gui/game/gui.rpy:48
old "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
new "## Olorscay useday orfay hetay ortionspay ofay arsbay hattay areay otnay illedfay inay. Hesetay areay otnay useday irectlyday, utbay areay useday henway eray-eneratinggay arbay imageay ilesfay."
# gui/game/gui.rpy:51
# gui/game/gui.rpy:53
old "## The colors used for dialogue and menu choice text."
new "## Hetay olorscay useday orfay ialogueday anday enumay oicechay exttay."
# gui/game/gui.rpy:56
# gui/game/gui.rpy:58
old "## Fonts and Font Sizes"
new "## Ontsfay anday Ontfay Izessay"
# gui/game/gui.rpy:58
# gui/game/gui.rpy:60
old "## The font used for in-game text."
new "## Hetay ontfay useday orfay inay-amegay exttay."
# gui/game/gui.rpy:61
# gui/game/gui.rpy:63
old "## The font used for character names."
new "## Hetay ontfay useday orfay aracterchay amesnay."
# gui/game/gui.rpy:64
# gui/game/gui.rpy:66
old "## The font used for out-of-game text."
new "## Hetay ontfay useday orfay outay-ofay-amegay exttay."
# gui/game/gui.rpy:67
# gui/game/gui.rpy:69
old "## The size of normal dialogue text."
new "## Hetay izesay ofay ormalnay ialogueday exttay."
# gui/game/gui.rpy:70
# gui/game/gui.rpy:72
old "## The size of character names."
new "## Hetay izesay ofay aracterchay amesnay."
# gui/game/gui.rpy:73
# gui/game/gui.rpy:75
old "## The size of text in the game's user interface."
new "## Hetay izesay ofay exttay inay hetay amegay'say useray interfaceay."
# gui/game/gui.rpy:76
# gui/game/gui.rpy:78
old "## The size of labels in the game's user interface."
new "## Hetay izesay ofay abelslay inay hetay amegay'say useray interfaceay."
# gui/game/gui.rpy:79
# gui/game/gui.rpy:81
old "## The size of text on the notify screen."
new "## Hetay izesay ofay exttay onay hetay otifynay creensay."
# gui/game/gui.rpy:82
# gui/game/gui.rpy:84
old "## The size of the game's title."
new "## Hetay izesay ofay hetay amegay'say itletay."
# gui/game/gui.rpy:86
# gui/game/gui.rpy:88
old "## Main and Game Menus"
new "## Ainmay anday Amegay Enusmay"
# gui/game/gui.rpy:88
# gui/game/gui.rpy:90
old "## The images used for the main and game menus."
new "## Hetay imagesay useday orfay hetay ainmay anday amegay enusmay."
# gui/game/gui.rpy:93
# gui/game/gui.rpy:95
old "## Dialogue"
new "## Ialogueday"
# gui/game/gui.rpy:95
# gui/game/gui.rpy:97
old "## These variables control how dialogue is displayed on the screen one line at a time."
new "## Hesetay ariablesvay ontrolcay owhay ialogueday isay isplayedday onay hetay creensay oneay inelay atay aay imetay."
# gui/game/gui.rpy:98
# gui/game/gui.rpy:100
old "## The height of the textbox containing dialogue."
new "## Hetay eighthay ofay hetay extboxtay ontainingcay ialogueday."
# gui/game/gui.rpy:101
# 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."
# gui/game/gui.rpy:106
# 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."
# gui/game/gui.rpy:111
# 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."
# gui/game/gui.rpy:115
# 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."
new "## Hetay idthway, eighthay, anday ordersbay ofay hetay oxbay ontainingcay hetay aracterchay'say amenay, oray Onenay otay automaticallyay izesay itay."
# gui/game/gui.rpy:120
# gui/game/gui.rpy:122
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
new "## Hetay ordersbay ofay hetay oxbay ontainingcay hetay aracterchay'say amenay, inay eftlay, optay, ightray, ottombay orderay."
# gui/game/gui.rpy:124
# gui/game/gui.rpy:126
old "## If True, the background of the namebox will be tiled, if False, the background of the namebox will be scaled."
new "## Fiay Ruetay, hetay ackgroundbay ofay hetay ameboxnay illway ebay iledtay, ifay Alsefay, hetay ackgroundbay ofay hetay ameboxnay illway ebay caledsay."
# gui/game/gui.rpy:129
# 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."
# gui/game/gui.rpy:135
# gui/game/gui.rpy:137
old "## The maximum width of dialogue text, in pixels."
new "## Hetay aximummay idthway ofay ialogueday exttay, inay ixelspay."
# gui/game/gui.rpy:138
# 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."
# gui/game/gui.rpy:143
# gui/game/gui.rpy:145
old "## Buttons"
new "## Uttonsbay"
# gui/game/gui.rpy:145
# gui/game/gui.rpy:147
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
new "## Hesetay ariablesvay, alongay ithway hetay imageay ilesfay inay uigay/uttonbay, ontrolcay aspectsay ofay owhay uttonsbay areay isplayedday."
# gui/game/gui.rpy:148
# gui/game/gui.rpy:150
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
new "## Hetay idthway anday eighthay ofay aay uttonbay, inay ixelspay. Fiay Onenay, Enray'Ypay omputescay aay izesay."
# gui/game/gui.rpy:152
# gui/game/gui.rpy:154
old "## The borders on each side of the button, in left, top, right, bottom order."
new "## Hetay ordersbay onay eachay idesay ofay hetay uttonbay, inay eftlay, optay, ightray, ottombay orderay."
# gui/game/gui.rpy:155
# gui/game/gui.rpy:157
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
new "## Fiay Ruetay, hetay ackgroundbay imageay illway ebay iledtay. Fiay Alsefay, hetay ackgroundbay imageay illway ebay inearlylay caledsay."
# gui/game/gui.rpy:159
# gui/game/gui.rpy:161
old "## The font used by the button."
new "## Hetay ontfay useday ybay hetay uttonbay."
# gui/game/gui.rpy:162
# gui/game/gui.rpy:164
old "## The size of the text used by the button."
new "## Hetay izesay ofay hetay exttay useday ybay hetay uttonbay."
# gui/game/gui.rpy:165
# gui/game/gui.rpy:167
old "## The color of button text in various states."
new "## Hetay olorcay ofay uttonbay exttay inay ariousvay atesstay."
# gui/game/gui.rpy:171
# 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)."
# gui/game/gui.rpy:176
# 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."
new "## Hesetay ariablesvay overrideay ettingssay orfay ifferentday indskay ofay uttonsbay. Leasepay eesay hetay uigay ocumentationday orfay hetay indskay ofay uttonsbay availableay, anday hatway eachay isay useday orfay."
# gui/game/gui.rpy:180
# gui/game/gui.rpy:182
old "## These customizations are used by the default interface:"
new "## Hesetay ustomizationscay areay useday ybay hetay efaultday interfaceay:"
# gui/game/gui.rpy:195
# gui/game/gui.rpy:197
old "## You can also add your own customizations, by adding properly-named variables. For example, you can uncomment the following line to set the width of a navigation button."
new "## Ouyay ancay alsoay adday ouryay ownay ustomizationscay, ybay addingay roperlypay-amednay ariablesvay. Orfay exampleay, ouyay ancay uncommentay hetay ollowingfay inelay otay etsay hetay idthway ofay aay avigationnay uttonbay."
# gui/game/gui.rpy:202
# gui/game/gui.rpy:204
old "## Choice Buttons"
new "## Hoicecay Uttonsbay"
# gui/game/gui.rpy:204
# gui/game/gui.rpy:206
old "## Choice buttons are used in the in-game menus."
new "## Hoicecay uttonsbay areay useday inay hetay inay-amegay enusmay."
# gui/game/gui.rpy:218
# gui/game/gui.rpy:220
old "## File Slot Buttons"
new "## Ilefay Lotsay Uttonsbay"
# gui/game/gui.rpy:220
# gui/game/gui.rpy:222
old "## A file slot button is a special kind of button. It contains a thumbnail image, and text describing the contents of the save slot. A save slot uses image files in gui/button, like the other kinds of buttons."
new "## Aay ilefay otslay uttonbay isay aay pecialsay indkay ofay uttonbay. Tiay ontainscay aay humbnailtay imageay, anday exttay escribingday hetay ontentscay ofay hetay avesay otslay. Aay avesay otslay usesay imageay ilesfay inay uigay/uttonbay, ikelay hetay otheray indskay ofay uttonsbay."
# gui/game/gui.rpy:224
# gui/game/gui.rpy:226
old "## The save slot button."
new "## Hetay avesay otslay uttonbay."
# gui/game/gui.rpy:234
# gui/game/gui.rpy:236
old "## The width and height of thumbnails used by the save slots."
new "## Hetay idthway anday eighthay ofay humbnailstay useday ybay hetay avesay otsslay."
# gui/game/gui.rpy:238
# gui/game/gui.rpy:240
old "## The number of columns and rows in the grid of save slots."
new "## Hetay umbernay ofay olumnscay anday owsray inay hetay idgray ofay avesay otsslay."
# gui/game/gui.rpy:243
# gui/game/gui.rpy:245
old "## Positioning and Spacing"
new "## Ositioningpay anday Pacingsay"
# gui/game/gui.rpy:245
# gui/game/gui.rpy:247
old "## These variables control the positioning and spacing of various user interface elements."
new "## Hesetay ariablesvay ontrolcay hetay ositioningpay anday pacingsay ofay ariousvay useray interfaceay elementsay."
# gui/game/gui.rpy:248
# gui/game/gui.rpy:250
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
new "## Hetay ositionpay ofay hetay eftlay idesay ofay hetay avigationnay uttonsbay, elativeray otay hetay eftlay idesay ofay hetay creensay."
# gui/game/gui.rpy:252
# gui/game/gui.rpy:254
old "## The vertical position of the skip indicator."
new "## Hetay erticalvay ositionpay ofay hetay kipsay indicatoray."
# gui/game/gui.rpy:255
# gui/game/gui.rpy:257
old "## The vertical position of the notify screen."
new "## Hetay erticalvay ositionpay ofay hetay otifynay creensay."
# gui/game/gui.rpy:258
# gui/game/gui.rpy:260
old "## The spacing between menu choices."
new "## Hetay pacingsay etweenbay enumay oiceschay."
# gui/game/gui.rpy:261
# gui/game/gui.rpy:263
old "## Buttons in the navigation section of the main and game menus."
new "## Uttonsbay inay hetay avigationnay ectionsay ofay hetay ainmay anday amegay enusmay."
# gui/game/gui.rpy:264
# gui/game/gui.rpy:266
old "## Controls the amount of spacing between preferences."
new "## Ontrolscay hetay amountay ofay pacingsay etweenbay referencespay."
# gui/game/gui.rpy:267
# gui/game/gui.rpy:269
old "## Controls the amount of spacing between preference buttons."
new "## Ontrolscay hetay amountay ofay pacingsay etweenbay referencepay uttonsbay."
# gui/game/gui.rpy:270
# gui/game/gui.rpy:272
old "## The spacing between file page buttons."
new "## Hetay pacingsay etweenbay ilefay agepay uttonsbay."
# gui/game/gui.rpy:273
# gui/game/gui.rpy:275
old "## The spacing between file slots."
new "## Hetay pacingsay etweenbay ilefay otsslay."
# gui/game/gui.rpy:276
# gui/game/gui.rpy:278
old "## The position of the main menu text."
new "## Hetay ositionpay ofay hetay ainmay enumay exttay."
# gui/game/gui.rpy:280
# gui/game/gui.rpy:282
old "## Frames"
new "## Ramesfay"
# gui/game/gui.rpy:282
# gui/game/gui.rpy:284
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
new "## Hesetay ariablesvay ontrolcay hetay ooklay ofay amesfray hattay ancay ontaincay useray interfaceay omponentscay henway anay overlayay oray indowway isay otnay resentpay."
# gui/game/gui.rpy:285
# gui/game/gui.rpy:287
old "## Generic frames."
new "## Enericgay amesfray."
# gui/game/gui.rpy:288
# gui/game/gui.rpy:290
old "## The frame that is used as part of the confirm screen."
new "## Hetay amefray hattay isay useday asay artpay ofay hetay onfirmcay creensay."
# gui/game/gui.rpy:291
# gui/game/gui.rpy:293
old "## The frame that is used as part of the skip screen."
new "## Hetay amefray hattay isay useday asay artpay ofay hetay kipsay creensay."
# gui/game/gui.rpy:294
# gui/game/gui.rpy:296
old "## The frame that is used as part of the notify screen."
new "## Hetay amefray hattay isay useday asay artpay ofay hetay otifynay creensay."
# gui/game/gui.rpy:297
# gui/game/gui.rpy:299
old "## Should frame backgrounds be tiled?"
new "## Houldsay amefray ackgroundsbay ebay iledtay?"
# gui/game/gui.rpy:301
# gui/game/gui.rpy:303
old "## Bars, Scrollbars, and Sliders"
new "## Arsbay, Crollbarssay, anday Liderssay"
# gui/game/gui.rpy:303
# gui/game/gui.rpy:305
old "## These control the look and size of bars, scrollbars, and sliders."
new "## Hesetay ontrolcay hetay ooklay anday izesay ofay arsbay, crollbarssay, anday idersslay."
# gui/game/gui.rpy:305
# gui/game/gui.rpy:307
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written screens."
new "## Hetay efaultday Uigay onlyay usesay idersslay anday erticalvay crollbarssay. Llaay ofay hetay otheray arsbay areay onlyay useday inay reatorcay-rittenway creenssay."
# gui/game/gui.rpy:308
# gui/game/gui.rpy:310
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
new "## Hetay eighthay ofay orizontalhay arsbay, crollbarssay, anday idersslay. Hetay idthway ofay erticalvay arsbay, crollbarssay, anday idersslay."
# gui/game/gui.rpy:314
# gui/game/gui.rpy:316
old "## True if bar images should be tiled. False if they should be linearly scaled."
new "## Ruetay ifay arbay imagesay ouldshay ebay iledtay. Alsefay ifay heytay ouldshay ebay inearlylay caledsay."
# gui/game/gui.rpy:319
# gui/game/gui.rpy:321
old "## Horizontal borders."
new "## Orizontalhay ordersbay."
# gui/game/gui.rpy:324
# gui/game/gui.rpy:326
old "## Vertical borders."
new "## Erticalvay ordersbay."
# gui/game/gui.rpy:329
# gui/game/gui.rpy:331
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
new "## Hatway otay oday ithway unscrollableay crollbarssay inay hetay uigay. \"idehay\" ideshay hemtay, hileway Onenay owsshay hemtay."
# gui/game/gui.rpy:334
# gui/game/gui.rpy:336
old "## History"
new "## Istoryhay"
# gui/game/gui.rpy:336
# gui/game/gui.rpy:338
old "## The history screen displays dialogue that the player has already dismissed."
new "## Hetay istoryhay creensay isplaysday ialogueday hattay hetay ayerplay ashay alreadyay ismissedday."
# gui/game/gui.rpy:338
# gui/game/gui.rpy:340
old "## The number of blocks of dialogue history Ren'Py will keep."
new "## Hetay umbernay ofay ocksblay ofay ialogueday istoryhay Enray'Ypay illway eepkay."
# gui/game/gui.rpy:341
# gui/game/gui.rpy:343
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
new "## Hetay eighthay ofay aay istoryhay creensay entryay, oray Onenay otay akemay hetay eighthay ariablevay atay hetay ostcay ofay erformancepay."
# gui/game/gui.rpy:345
# gui/game/gui.rpy:347
old "## The position, width, and alignment of the label giving the name of the speaking character."
new "## Hetay ositionpay, idthway, anday alignmentay ofay hetay abellay ivinggay hetay amenay ofay hetay peakingsay aracterchay."
# gui/game/gui.rpy:352
# gui/game/gui.rpy:354
old "## The position, width, and alignment of the dialogue text."
new "## Hetay ositionpay, idthway, anday alignmentay ofay hetay ialogueday exttay."
# gui/game/gui.rpy:359
# gui/game/gui.rpy:361
old "## NVL-Mode"
new "## Vlnay-Odemay"
# gui/game/gui.rpy:361
# gui/game/gui.rpy:363
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
new "## Hetay Vlnay-odemay creensay isplaysday hetay ialogueday pokensay ybay Vlnay-odemay aracterschay."
# gui/game/gui.rpy:363
# gui/game/gui.rpy:365
old "## The borders of the background of the NVL-mode background window."
new "## Hetay ordersbay ofay hetay ackgroundbay ofay hetay Vlnay-odemay ackgroundbay indowway."
# gui/game/gui.rpy:366
# gui/game/gui.rpy:368
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."
new "## Hetay aximummay umbernay ofay Vlnay-odemay entriesay Enray'Ypay illway isplayday. Henway oremay entriesay hantay histay areay otay ebay owshay, hetay oldestay entryay illway ebay emovedray."
# gui/game/gui.rpy:370
# gui/game/gui.rpy:372
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
new "## Hetay eighthay ofay anay Vlnay-odemay entryay. Etsay histay otay Onenay otay avehay hetay entriesay ynamicallyday adjustay eighthay."
# gui/game/gui.rpy:374
# gui/game/gui.rpy:376
old "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
new "## Hetay pacingsay etweenbay Vlnay-odemay entriesay henway uigay.vl_heightnay isay Onenay, anday etweenbay Vlnay-odemay entriesay anday anay Vlnay-odemay enumay."
# gui/game/gui.rpy:391
# gui/game/gui.rpy:393
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
new "## Hetay ositionpay, idthway, anday alignmentay ofay vl_thoughtnay exttay (hetay exttay aidsay ybay hetay vl_narratornay aracterchay.)"
# gui/game/gui.rpy:398
# gui/game/gui.rpy:400
old "## The position of nvl menu_buttons."
new "## Hetay ositionpay ofay vlnay enu_buttonsmay."
# gui/game/gui.rpy:402
# gui/game/gui.rpy:405
old "## Localization"
new "## Ocalizationlay"
# gui/game/gui.rpy:404
# gui/game/gui.rpy:407
old "## This controls where a line break is permitted. The default is suitable for most languages. A list of available values can be found at https://www.renpy.org/doc/html/style_properties.html#style-property-language"
new "## Histay ontrolscay hereway aay inelay eakbray isay ermittedpay. Hetay efaultday isay uitablesay orfay ostmay anguageslay. Aay istlay ofay availableay aluesvay ancay ebay oundfay atay ttpshay://wwway.enpyray.orgay/ocday/tmlhay/yle_propertiesstay.tmlhay#ylestay-ropertypay-anguagelay"
# gui/game/gui.rpy:412
# gui/game/gui.rpy:415
old "## Mobile devices"
new "## Obilemay evicesday"
# gui/game/gui.rpy:417
# gui/game/gui.rpy:420
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
new "## Histay increasesay hetay izesay ofay hetay uickqay uttonsbay otay akemay hemtay easieray otay ouchtay onay abletstay anday onesphay."
# gui/game/gui.rpy:424
# gui/game/gui.rpy:427
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
new "## Histay angeschay hetay izesay anday pacingsay ofay ariousvay Uigay elementsay otay ensureay heytay areay easilyay isiblevay onay onesphay."
# gui/game/gui.rpy:429
# gui/game/gui.rpy:432
old "## Font sizes."
new "## Ontfay izessay."
# gui/game/gui.rpy:437
# gui/game/gui.rpy:440
old "## Adjust the location of the textbox."
new "## Djustaay hetay ocationlay ofay hetay extboxtay."
# gui/game/gui.rpy:443
# gui/game/gui.rpy:446
old "## Change the size and spacing of various things."
new "## Hangecay hetay izesay anday pacingsay ofay ariousvay hingstay."
# gui/game/gui.rpy:457
# gui/game/gui.rpy:460
old "## File button layout."
new "## Ilefay uttonbay ayoutlay."
# gui/game/gui.rpy:461
# gui/game/gui.rpy:464
old "## NVL-mode."
new "## Vlnay-odemay."
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -190,8 +190,8 @@ translate piglatin strings:
new "## Ilesfay atchingmay ocumentationday atternspay areay uplicatedday inay aay acmay appay uildbay, osay heytay appearay inay othbay hetay appay anday hetay ipzay ilefay."
# 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 "## Aay Ooglegay Laypay icenselay eykay isay equiredray otay ownloadday expansionay ilesfay anday erformpay inay-appay urchasespay. Tiay ancay ebay oundfay onay hetay \"Ervicessay & Pisaay\" agepay ofay hetay Ooglegay Laypay eveloperday onsolecay."
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 "## Aay Ooglegay Laypay icenselay eykay isay equiredray otay erformpay inay-appay urchasespay. Tiay ancay ebay oundfay inay hetay Ooglegay Laypay eveloperday onsolecay, underay \"Onetizemay\" > \"Onetizationmay Etupsay\" > \"Icensinglay\"."
# gui/game/options.rpy:210
old "## The username and project name associated with an itch.io project, separated by a slash."
+114 -93
View File
@@ -281,374 +281,395 @@ translate piglatin strings:
old "## Buttons to access other pages."
new "## Uttonsbay otay accessay otheray agespay."
# gui/game/screens.rpy:657
# gui/game/screens.rpy:660
old "<"
new "<"
# gui/game/screens.rpy:660
# gui/game/screens.rpy:663
old "{#auto_page}A"
new "{#auto_page}Aay"
# gui/game/screens.rpy:663
# gui/game/screens.rpy:666
old "{#quick_page}Q"
new "{#quick_page}Qay"
# gui/game/screens.rpy:665
# 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."
# gui/game/screens.rpy:669
# gui/game/screens.rpy:672
old ">"
new ">"
# gui/game/screens.rpy:704
# gui/game/screens.rpy:676
old "Upload Sync"
new "Ploaduay Yncsay"
# gui/game/screens.rpy:680
old "Download Sync"
new "Ownloadday Yncsay"
# gui/game/screens.rpy:717
old "## Preferences screen"
new "## Referencespay creensay"
# gui/game/screens.rpy:706
# gui/game/screens.rpy:719
old "## The preferences screen allows the player to configure the game to better suit themselves."
new "## Hetay referencespay creensay allowsay hetay ayerplay otay onfigurecay hetay amegay otay etterbay uitsay hemselvestay."
# gui/game/screens.rpy:709
# gui/game/screens.rpy:722
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
new "## ttpshay://wwway.enpyray.orgay/ocday/tmlhay/creen_specialsay.tmlhay#referencespay"
# gui/game/screens.rpy:726
# gui/game/screens.rpy:739
old "Display"
new "Isplayday"
# gui/game/screens.rpy:727
# gui/game/screens.rpy:740
old "Window"
new "Indowway"
# gui/game/screens.rpy:728
# gui/game/screens.rpy:741
old "Fullscreen"
new "Ullscreenfay"
# gui/game/screens.rpy:733
# gui/game/screens.rpy:746
old "Unseen Text"
new "Nseenuay Exttay"
# gui/game/screens.rpy:734
# gui/game/screens.rpy:747
old "After Choices"
new "Fteraay Hoicescay"
# gui/game/screens.rpy:735
# gui/game/screens.rpy:748
old "Transitions"
new "Ransitionstay"
# gui/game/screens.rpy:737
# gui/game/screens.rpy:750
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
new "## Dditionalaay boxesvay ofay ypetay \"adio_prefray\" oray \"eck_prefchay\" ancay ebay addeday erehay, otay adday additionalay reatorcay-efinedday referencespay."
# gui/game/screens.rpy:748
# gui/game/screens.rpy:761
old "Text Speed"
new "Exttay Peedsay"
# gui/game/screens.rpy:752
# gui/game/screens.rpy:765
old "Auto-Forward Time"
new "Utoaay-Orwardfay Imetay"
# gui/game/screens.rpy:759
# gui/game/screens.rpy:772
old "Music Volume"
new "Usicmay Olumevay"
# gui/game/screens.rpy:766
# gui/game/screens.rpy:779
old "Sound Volume"
new "Oundsay Olumevay"
# gui/game/screens.rpy:772
# gui/game/screens.rpy:785
old "Test"
new "Esttay"
# gui/game/screens.rpy:776
# gui/game/screens.rpy:789
old "Voice Volume"
new "Oicevay Olumevay"
# gui/game/screens.rpy:787
# gui/game/screens.rpy:800
old "Mute All"
new "Utemay Llaay"
# gui/game/screens.rpy:863
# gui/game/screens.rpy:876
old "## History screen"
new "## Istoryhay creensay"
# gui/game/screens.rpy:865
# gui/game/screens.rpy:878
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 "## Histay isay aay creensay hattay isplaysday hetay ialogueday istoryhay otay hetay ayerplay. Hileway heretay isnay'tay anythingay pecialsay aboutay histay creensay, itay oesday avehay otay accessay hetay ialogueday istoryhay oredstay inay history_list_ay."
# gui/game/screens.rpy:869
# gui/game/screens.rpy:882
old "## https://www.renpy.org/doc/html/history.html"
new "## ttpshay://wwway.enpyray.orgay/ocday/tmlhay/istoryhay.tmlhay"
# gui/game/screens.rpy:875
# gui/game/screens.rpy:888
old "## Avoid predicting this screen, as it can be very large."
new "## Voidaay redictingpay histay creensay, asay itay ancay ebay eryvay argelay."
# gui/game/screens.rpy:886
# gui/game/screens.rpy:899
old "## This lays things out properly if history_height is None."
new "## Histay ayslay hingstay outay roperlypay ifay istory_heighthay isay Onenay."
# gui/game/screens.rpy:896
# gui/game/screens.rpy:909
old "## Take the color of the who text from the Character, if set."
new "## Aketay hetay olorcay ofay hetay howay exttay omfray hetay Haractercay, ifay etsay."
# gui/game/screens.rpy:905
# gui/game/screens.rpy:918
old "The dialogue history is empty."
new "Hetay ialogueday istoryhay isay emptyay."
# gui/game/screens.rpy:908
# gui/game/screens.rpy:921
old "## This determines what tags are allowed to be displayed on the history screen."
new "## Histay eterminesday hatway agstay areay alloweday otay ebay isplayedday onay hetay istoryhay creensay."
# gui/game/screens.rpy:953
# gui/game/screens.rpy:966
old "## Help screen"
new "## Elphay creensay"
# gui/game/screens.rpy:955
# gui/game/screens.rpy:968
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 "## Aay creensay hattay ivesgay informationay aboutay eykay anday ousemay indingsbay. Tiay usesay otheray creenssay (eyboard_helpkay, ouse_helpmay, anday amepad_helpgay) otay isplayday hetay actualay elphay."
# gui/game/screens.rpy:974
# gui/game/screens.rpy:987
old "Keyboard"
new "Eyboardkay"
# gui/game/screens.rpy:975
# gui/game/screens.rpy:988
old "Mouse"
new "Ousemay"
# gui/game/screens.rpy:978
# gui/game/screens.rpy:991
old "Gamepad"
new "Amepadgay"
# gui/game/screens.rpy:991
# gui/game/screens.rpy:1004
old "Enter"
new "Ntereay"
# gui/game/screens.rpy:992
# gui/game/screens.rpy:1005
old "Advances dialogue and activates the interface."
new "Dvancesaay ialogueday anday activatesay hetay interfaceay."
# gui/game/screens.rpy:995
# gui/game/screens.rpy:1008
old "Space"
new "Pacesay"
# gui/game/screens.rpy:996
# gui/game/screens.rpy:1009
old "Advances dialogue without selecting choices."
new "Dvancesaay ialogueday ithoutway electingsay oiceschay."
# gui/game/screens.rpy:999
# gui/game/screens.rpy:1012
old "Arrow Keys"
new "Rrowaay Eyskay"
# gui/game/screens.rpy:1000
# gui/game/screens.rpy:1013
old "Navigate the interface."
new "Avigatenay hetay interfaceay."
# gui/game/screens.rpy:1003
# gui/game/screens.rpy:1016
old "Escape"
new "Scapeeay"
# gui/game/screens.rpy:1004
# gui/game/screens.rpy:1017
old "Accesses the game menu."
new "Ccessesaay hetay amegay enumay."
# gui/game/screens.rpy:1007
# gui/game/screens.rpy:1020
old "Ctrl"
new "Trlcay"
# gui/game/screens.rpy:1008
# gui/game/screens.rpy:1021
old "Skips dialogue while held down."
new "Kipssay ialogueday hileway eldhay ownday."
# gui/game/screens.rpy:1011
# gui/game/screens.rpy:1024
old "Tab"
new "Abtay"
# gui/game/screens.rpy:1012
# gui/game/screens.rpy:1025
old "Toggles dialogue skipping."
new "Ogglestay ialogueday kippingsay."
# gui/game/screens.rpy:1015
# gui/game/screens.rpy:1028
old "Page Up"
new "Agepay Puay"
# gui/game/screens.rpy:1016
# gui/game/screens.rpy:1029
old "Rolls back to earlier dialogue."
new "Ollsray ackbay otay earlieray ialogueday."
# gui/game/screens.rpy:1019
# gui/game/screens.rpy:1032
old "Page Down"
new "Agepay Ownday"
# gui/game/screens.rpy:1020
# gui/game/screens.rpy:1033
old "Rolls forward to later dialogue."
new "Ollsray orwardfay otay aterlay ialogueday."
# gui/game/screens.rpy:1024
# gui/game/screens.rpy:1037
old "Hides the user interface."
new "Ideshay hetay useray interfaceay."
# gui/game/screens.rpy:1028
# gui/game/screens.rpy:1041
old "Takes a screenshot."
new "Akestay aay creenshotsay."
# gui/game/screens.rpy:1032
# gui/game/screens.rpy:1045
old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
new "Ogglestay assistiveay {a=https://www.renpy.org/l/voicing}elfsay-oicingvay{/a}."
# gui/game/screens.rpy:1036
# gui/game/screens.rpy:1049
old "Opens the accessibility menu."
new "Pensoay hetay accessibilityay enumay."
# gui/game/screens.rpy:1042
# gui/game/screens.rpy:1055
old "Left Click"
new "Eftlay Lickcay"
# gui/game/screens.rpy:1046
# gui/game/screens.rpy:1059
old "Middle Click"
new "Iddlemay Lickcay"
# gui/game/screens.rpy:1050
# gui/game/screens.rpy:1063
old "Right Click"
new "Ightray Lickcay"
# gui/game/screens.rpy:1054
# gui/game/screens.rpy:1067
old "Mouse Wheel Up\nClick Rollback Side"
new "Ousemay Heelway Puay\nLickcay Ollbackray Idesay"
# gui/game/screens.rpy:1058
# gui/game/screens.rpy:1071
old "Mouse Wheel Down"
new "Ousemay Heelway Ownday"
# gui/game/screens.rpy:1065
# gui/game/screens.rpy:1078
old "Right Trigger\nA/Bottom Button"
new "Ightray Riggertay\nAay/Ottombay Uttonbay"
# gui/game/screens.rpy:1069
# gui/game/screens.rpy:1082
old "Left Trigger\nLeft Shoulder"
new "Eftlay Riggertay\nEftlay Houldersay"
# gui/game/screens.rpy:1073
# gui/game/screens.rpy:1086
old "Right Shoulder"
new "Ightray Houldersay"
# gui/game/screens.rpy:1078
# gui/game/screens.rpy:1091
old "D-Pad, Sticks"
new "Day-Adpay, Tickssay"
# gui/game/screens.rpy:1082
# gui/game/screens.rpy:1095
old "Start, Guide"
new "Tartsay, Uidegay"
# gui/game/screens.rpy:1086
# gui/game/screens.rpy:1099
old "Y/Top Button"
new "Yay/Optay Uttonbay"
# gui/game/screens.rpy:1089
# gui/game/screens.rpy:1102
old "Calibrate"
new "Alibratecay"
# gui/game/screens.rpy:1117
# gui/game/screens.rpy:1130
old "## Additional screens"
new "## Dditionalaay creenssay"
# gui/game/screens.rpy:1121
# gui/game/screens.rpy:1134
old "## Confirm screen"
new "## Onfirmcay creensay"
# gui/game/screens.rpy:1123
# gui/game/screens.rpy:1136
old "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
new "## Hetay onfirmcay creensay isay alledcay henway Enray'Ypay antsway otay askay hetay ayerplay aay esyay oray onay uestionqay."
# gui/game/screens.rpy:1126
# gui/game/screens.rpy:1139
old "## https://www.renpy.org/doc/html/screen_special.html#confirm"
new "## ttpshay://wwway.enpyray.orgay/ocday/tmlhay/creen_specialsay.tmlhay#onfirmcay"
# gui/game/screens.rpy:1130
# gui/game/screens.rpy:1143
old "## Ensure other screens do not get input while this screen is displayed."
new "## Nsureeay otheray creenssay oday otnay etgay inputay hileway histay creensay isay isplayedday."
# gui/game/screens.rpy:1154
# gui/game/screens.rpy:1167
old "Yes"
new "Esyay"
# gui/game/screens.rpy:1155
# gui/game/screens.rpy:1168
old "No"
new "Onay"
# gui/game/screens.rpy:1157
# gui/game/screens.rpy:1170
old "## Right-click and escape answer \"no\"."
new "## Ightray-ickclay anday escapeay answeray \"onay\"."
# gui/game/screens.rpy:1184
# gui/game/screens.rpy:1197
old "## Skip indicator screen"
new "## Kipsay indicatoray creensay"
# gui/game/screens.rpy:1186
# gui/game/screens.rpy:1199
old "## The skip_indicator screen is displayed to indicate that skipping is in progress."
new "## Hetay kip_indicatorsay creensay isay isplayedday otay indicateay hattay kippingsay isay inay rogresspay."
# gui/game/screens.rpy:1189
# gui/game/screens.rpy:1202
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
new "## ttpshay://wwway.enpyray.orgay/ocday/tmlhay/creen_specialsay.tmlhay#kipsay-indicatoray"
# gui/game/screens.rpy:1201
# gui/game/screens.rpy:1214
old "Skipping"
new "Kippingsay"
# gui/game/screens.rpy:1208
# gui/game/screens.rpy:1221
old "## This transform is used to blink the arrows one after another."
new "## Histay ansformtray isay useday otay inkblay hetay arrowsay oneay afteray anotheray."
# gui/game/screens.rpy:1235
# gui/game/screens.rpy:1248
old "## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE glyph in it."
new "## Eway avehay otay useay aay ontfay hattay ashay hetay Lackbay Ightray-Ointingpay Mallsay Riangletay yphglay inay itay."
# gui/game/screens.rpy:1240
# gui/game/screens.rpy:1253
old "## Notify screen"
new "## Otifynay creensay"
# gui/game/screens.rpy:1242
# gui/game/screens.rpy:1255
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 "## Hetay otifynay creensay isay useday otay owshay hetay ayerplay aay essagemay. (Orfay exampleay, henway hetay amegay isay uicksavedqay oray aay creenshotsay ashay eenbay akentay.)"
# gui/game/screens.rpy:1245
# gui/game/screens.rpy:1258
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
new "## ttpshay://wwway.enpyray.orgay/ocday/tmlhay/creen_specialsay.tmlhay#otifynay-creensay"
# gui/game/screens.rpy:1279
# gui/game/screens.rpy:1292
old "## NVL screen"
new "## Vlnay creensay"
# gui/game/screens.rpy:1281
# gui/game/screens.rpy:1294
old "## This screen is used for NVL-mode dialogue and menus."
new "## Histay creensay isay useday orfay Vlnay-odemay ialogueday anday enusmay."
# gui/game/screens.rpy:1283
# gui/game/screens.rpy:1296
old "## https://www.renpy.org/doc/html/screen_special.html#nvl"
new "## ttpshay://wwway.enpyray.orgay/ocday/tmlhay/creen_specialsay.tmlhay#vlnay"
# gui/game/screens.rpy:1294
# gui/game/screens.rpy:1307
old "## Displays dialogue in either a vpgrid or the vbox."
new "## Isplaysday ialogueday inay eitheray aay pgridvay oray hetay boxvay."
# gui/game/screens.rpy:1307
# 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."
new "## Isplaysday hetay enumay, ifay ivengay. Hetay enumay aymay ebay isplayedday incorrectlyay ifay onfigcay.arrator_menunay isay etsay otay Ruetay."
# gui/game/screens.rpy:1337
# gui/game/screens.rpy:1350
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
new "## Histay ontrolscay hetay aximummay umbernay ofay Vlnay-odemay entriesay hattay ancay ebay isplayedday atay onceay."
# gui/game/screens.rpy:1399
# gui/game/screens.rpy:1410
old "## Bubble screen"
new "## Ubblebay creensay"
# gui/game/screens.rpy:1412
old "## The bubble screen is used to display dialogue to the player when using speech bubbles. The bubble screen takes the same parameters as the say screen, must create a displayable with the id of \"what\", and can create displayables with the \"namebox\", \"who\", and \"window\" ids."
new "## Hetay ubblebay creensay isay useday otay isplayday ialogueday otay hetay ayerplay henway usingay peechsay ubblesbay. Hetay ubblebay creensay akestay hetay amesay arameterspay asay hetay aysay creensay, ustmay reatecay aay isplayableday ithway hetay iday ofay \"hatway\", anday ancay reatecay isplayablesday ithway hetay \"ameboxnay\", \"howay\", anday \"indowway\" idsay."
# gui/game/screens.rpy:1417
old "## https://www.renpy.org/doc/html/bubble.html#bubble-screen"
new "## ttpshay://wwway.enpyray.orgay/ocday/tmlhay/ubblebay.tmlhay#ubblebay-creensay"
# gui/game/screens.rpy:1501
old "## Mobile Variants"
new "## Obilemay Ariantsvay"
# gui/game/screens.rpy:1406
# gui/game/screens.rpy:1508
old "## Since a mouse may not be present, we replace the quick menu with a version that uses fewer and bigger buttons that are easier to touch."
new "## Incesay aay ousemay aymay otnay ebay resentpay, eway eplaceray hetay uickqay enumay ithway aay ersionvay hattay usesay ewerfay anday iggerbay uttonsbay hattay areay easieray otay ouchtay."
# gui/game/screens.rpy:1424
# gui/game/screens.rpy:1526
old "Menu"
new "Enumay"
+2 -2
View File
@@ -40,8 +40,8 @@
new "Aby zbudować pakiet dla Androida, pobierz RAPT, rozpakuj i umieść w katalogu Ren'Py. Następnie uruchom ponownie program Ren'py."
# game/android.rpy:31
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Tworzenie pakietów dla systemu Android w systemie Windows wymaga pakietu 64-bit/x64 Java Development Kit. JDK różni się od JRE, istnieje możliwość, że posiadasz Javę bez JDK.\n\n{a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}Pobierz i zainstaluj JDK{/a}, a następnie uruchom ponownie program Ren'py."
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 "Tworzenie pakietów dla systemu Android w systemie Windows wymaga pakietu 64-bit/x64 Java Development Kit. JDK różni się od JRE, istnieje możliwość, że posiadasz Javę bez JDK.\n\n{a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}Pobierz i zainstaluj JDK{/a}, a następnie uruchom ponownie program Ren'py."
# game/android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
+2 -2
View File
@@ -40,8 +40,8 @@
new "Чтобы построить Android-пакет, пожалуйста, загрузите RAPT, разархивируйте его, и поместите в директорию Ren'Py. Затем перезагрузите лаунчер Ren'Py."
# android.rpy:31
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Чтобы построить Android-пакеты на Windows требуется 64-битный инструментарий разработки Java 8. JDK отличен от JRE, и возможно, у вас есть Java без JDK.\n\nПожалуйста, {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}загрузите и установите JDK{/a}, и перезапустите лаунчер Ren'Py."
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-битный инструментарий разработки Java 8. JDK отличен от JRE, и возможно, у вас есть Java без JDK.\n\nПожалуйста, {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}загрузите и установите JDK{/a}, и перезапустите лаунчер Ren'Py."
# android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
+2 -2
View File
@@ -37,8 +37,8 @@
new "要构建安卓应用包,请下载 RAPT,并解压到 Ren'Py 目录中。之后重启 Ren'Py。"
# game/android.rpy:35
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "在 Windows 中构建安卓应用包需要 64 位/x64 Java 8 开发套件(JDK)。JDK 不同于 JRE,所以您可能已安装过 Java 但尚未安装 JDK。\n\n请{a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}下载并安装 JDK{/a},然后重启 Ren'Py。"
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 "在 Windows 中构建安卓应用包需要 64 位/x64 Java 8 开发套件(JDK)。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."
+1 -1
View File
@@ -785,7 +785,7 @@ translate spanish strings:
# renpy/common/00speechbubble.rpy:304
old "(hide)"
new "(ocultar)"
# renpy/common/00gui.rpy:455
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?"
new "Este archivo se creó en otro dispositivo. Los archivos de guardado maliciosamente creados pueden dañar tu computadora. Confías en el creador de este archivo y en todos los que podrían haberlo modificado?"
+7 -2
View File
@@ -10,7 +10,7 @@
# _developer/developer.rpym:45
old "Reload Game (Shift+R)"
new "Reiniciar juego (Shift+R)"
new "Reiniciar juego (Mayús+R)"
# _developer/developer.rpym:47
old "Console (Shift+O)"
@@ -211,7 +211,7 @@
# renpy/common/00console.rpy:784
old "stack: print the return stack"
new "stack: imprime la pila de retorno"
# renpy/common/00console.rpy:781
old "help: show this help\n help <expr>: show signature and documentation of <expr>"
new "help: muestra esta ayuda\n help <expr>: muestra la firma y la documentación de <expr>"
@@ -223,3 +223,8 @@
# renpy/common/_developer/developer.rpym:51
old "Persistent Viewer"
new "Visor de datos persistentes"
# renpy/common/_developer/developer.rpym:70
old "Speech Bubble Editor (Shift+B)"
new "Editor de burbujas de diálogo (Mayús+B)"
+4
View File
@@ -431,3 +431,7 @@
# gui.rpy:457
old "## NVL-mode."
new "## Modo-NVL"
# 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."
+47 -3
View File
@@ -36,8 +36,8 @@
new "Para construir un paquete para Android, por favor descarga RAPT, descomprímelo y colócalo dentro de la carpeta de Ren'Py. Después reinicia el lanzador de Ren'Py."
# game/android.rpy:31
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Se requiere un kit de desarrollo Java 8 de 64 bits/x64 para construir paquetes de Android en Windows. El JDK es diferente del JRE, por lo que es posible que tengas Java sin el JDK.\n\nPor favor, {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}descarga e instala el JDK{/a}, luego reinicia el lanzador de Ren'Py."
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 "Se requiere un kit de desarrollo Java 8 de 64 bits/x64 para construir paquetes de Android en Windows. El JDK es diferente del JRE, por lo que es posible que tengas Java sin el JDK.\n\nPor favor, {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}descarga e instala el JDK{/a}, luego reinicia el lanzador de Ren'Py."
# android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
@@ -2060,7 +2060,7 @@ translate spanish strings:
# game/preferences.rpy:327
old "{#in language font}Start using Ren'Py in [lang_name]"
new "{font=fonts/Roboto-Light.ttf}Empieza a usar Ren'Py en [lang_name]{/font}"
# game/distribute_gui.rpy:231
old "(DLC)"
new "(DLC)"
@@ -2072,3 +2072,47 @@ translate spanish strings:
# game/web.rpy:484
old "Creating package..."
new "Creando paquete..."
# 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 ha sido instalado, pero no se ha configurado una clave. Por favor, genera nuevas claves, o copia android.keystore y bundle.keystore al directorio base."
# 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."
new "Intenta emular una consola Android basada en televisión.\n\nLa entrada del controlador se asigna a las teclas de flecha, Enter se asigna al botón de selección, Escape se asigna al botón de menú y PageUp se asigna al botón de retroceso."
# game/android.rpy:48
old "Downloads and installs the Android SDK and supporting packages."
new "Descarga e instala el SDK de Android y los paquetes de soporte."
# game/android.rpy:49
old "Generates the keys required to sign the package."
new "Genera las claves necesarias para firmar el paquete."
# game/android.rpy:383
old "Install SDK"
new "Instalar SDK"
# game/android.rpy:387
old "Generate Keys"
new "Generar claves"
# game/androidstrings.rpy:32
old "How much RAM (in GB) do you want to allocate to Gradle?\nThis must be a positive integer number."
new "¿Cuánta RAM (en GB) quiere asignar a Gradle?\nDebe ser un número entero positivo."
# game/androidstrings.rpy:33
old "The RAM size must contain only numbers and be positive."
new "El tamaño de la RAM debe contener sólo números y ser positivo."
# game/androidstrings.rpy:63
old "I found an android.keystore file in the rapt directory. Do you want to use this file?"
new "He encontrado un archivo android.keystore en el directorio rapt. ¿Quieres usar este archivo?"
# game/androidstrings.rpy:66
old "\n\nSaying 'No' will prevent key creation."
new "\n\nDecir 'No' impedirá la creación de claves."
# 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?"
+18 -1
View File
@@ -680,7 +680,7 @@ translate spanish strings:
# gui/game/screens.rpy:1049
old "Opens the accessibility menu."
new "Abre el menú de accesibilidad."
# gui/game/screens.rpy:1397
old "## Bubble screen"
new "## Pantalla de globos"
@@ -692,3 +692,20 @@ translate spanish strings:
# gui/game/screens.rpy:1404
old "## https://www.renpy.org/doc/html/screen_special.html#bubble"
new "## https://www.renpy.org/doc/html/screen_special.html#bubble"
# gui/game/screens.rpy:676
old "Upload Sync"
new "Subir Sync"
# gui/game/screens.rpy:680
old "Download Sync"
new "Descargar Sync"
# gui/game/screens.rpy:1412
old "## The bubble screen is used to display dialogue to the player when using speech bubbles. The bubble screen takes the same parameters as the say screen, must create a displayable with the id of \"what\", and can create displayables with the \"namebox\", \"who\", and \"window\" ids."
new "## La pantalla de burbujas se utiliza para mostrar el diálogo al jugador cuando se utilizan burbujas de diálogo. La pantalla de burbujas toma los mismos parámetros que la pantalla \"say\", debe crear un visualizable con el id de \"what\", y puede crear visualizables con los ids \"namebox\", \"who\", y \"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"
+2 -2
View File
@@ -40,8 +40,8 @@
new "Android paketleri derlemek için lütfen RAPT'ı indirin, açın ve Ren'Py klasörüne atın. Ardından Ren'Py'ı yeniden başlatın."
# android.rpy:31
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Windows'ta Android paketleri derlemek için bir 64-bit/x64 Java 8 Development Kit gerekir. JDK, JRE'den farklıdır, bu yüzden JDK olmayan bir Java kurulumunuz olabilir.\n\nLütfen JDK'yı {a=http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html}indirin ve kurun{/a}, ardından Ren'Py'ı yeniden başlatın."
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 "Windows'ta Android paketleri derlemek için bir 64-bit/x64 Java 8 Development Kit gerekir. JDK, JRE'den farklıdır, bu yüzden JDK olmayan bir Java kurulumunuz olabilir.\n\nLütfen JDK'yı {a=https://www.renpy.org/jdk/[JDK_REQUIREMENT]}indirin ve kurun{/a}, ardından Ren'Py'ı yeniden başlatın."
# android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
+2 -2
View File
@@ -38,8 +38,8 @@ translate ukrainian strings:
new "Щоб створити пакети Android, завантажте RAPT, розархівуйте його та помістіть у каталог Ren'Py. Потім перезапустіть лаунчер Ren'Py."
# game/android.rpy:35
old "A 64-bit/x64 Java 8 Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=https://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}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://adoptopenjdk.net/?variant=openjdk8&jvmVariant=hotspot}завантажте та встановіть JDK{/a}, а потім перезапустіть лаунчер Ren'Py."
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."
# 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."
+1
View File
@@ -21,6 +21,7 @@ renpy.styledata.style_selected_activate_functions gen/renpy.styledata.style_sele
renpy.display.matrix gen/renpy.display.matrix.c
renpy.display.render gen/renpy.display.render.c
renpy.display.accelerator gen/renpy.display.accelerator.c
renpy.display.quaternion gen/renpy.display.quaternion.c
renpy.uguu.gl gen/renpy.uguu.gl.c
renpy.uguu.uguu gen/renpy.uguu.uguu.c
renpy.gl.gldraw gen/renpy.gl.gldraw.c
+22 -16
View File
@@ -824,27 +824,33 @@ static SurfaceQueueEntry *decode_video_frame(MediaState *ms) {
SDL_Surface *sample = rgba_surface;
ms->sws = sws_getCachedContext(
ms->sws,
if (ms->sws == NULL) {
ms->sws = sws_getContext(
ms->video_decode_frame->width,
ms->video_decode_frame->height,
ms->video_decode_frame->format,
ms->video_decode_frame->width,
ms->video_decode_frame->height,
ms->video_decode_frame->format,
ms->video_decode_frame->width,
ms->video_decode_frame->height,
get_pixel_format(sample),
ms->video_decode_frame->width,
ms->video_decode_frame->height,
get_pixel_format(rgba_surface),
SWS_POINT | SWS_FULL_CHR_H_INP | SWS_FULL_CHR_H_INT,
SWS_POINT,
NULL,
NULL,
NULL
);
NULL,
NULL,
NULL
);
if (!ms->sws) {
ms->video_finished = 1;
return NULL;
if (!ms->sws) {
ms->video_finished = 1;
return NULL;
}
sws_setColorspaceDetails(ms->sws,
sws_getCoefficients(SWS_CS_DEFAULT), 0,
sws_getCoefficients(SWS_CS_DEFAULT), 0,
0, 1 << 16, 1 << 16);
}
SurfaceQueueEntry *rv = av_malloc(sizeof(SurfaceQueueEntry));
+21 -2
View File
@@ -97,6 +97,9 @@ static const char *error_msg = NULL;
/* Have we been initialized? */
static int initialized = 0;
/** Should fades be linear rather than logarithmic? */
static int linear_fades = 0;
struct Interpolate {
/* The number of samples that are finished so far. */
@@ -113,7 +116,6 @@ struct Interpolate {
};
void init_interpolate(struct Interpolate *i, float value) {
i->done = 0;
i->duration = 0;
@@ -156,6 +158,10 @@ static inline float get_interpolate_power(struct Interpolate *i) {
float log_power = get_interpolate(i);
if (linear_fades) {
return log_power / MAX_POWER;
}
if (log_power == MIN_POWER) {
return 0;
} else if (log_power == MAX_POWER) {
@@ -350,6 +356,13 @@ static inline void mix_sample(struct Channel *c, short left_in, short right_in,
*right_out += right * volume;
}
/** If not NULL, this can be replaced with a function that will be called
to generate audio. The functtio is called with a consistion of 2*length
shorts, and should fill the buffer with audio data. */
void (*RPS_generate_audio_c_function)(float *stream, int length) = NULL;
static void callback(void *userdata, Uint8 *stream, int length) {
// Convert the length to samples.
@@ -360,6 +373,10 @@ static void callback(void *userdata, Uint8 *stream, int length) {
memset(mix_buffer, 0, length * 2 * sizeof(float));
if (RPS_generate_audio_c_function) {
RPS_generate_audio_c_function(mix_buffer, length);
}
for (int channel = 0; channel < num_channels; channel++) {
// The number of samples that have been mixed.
@@ -1114,7 +1131,7 @@ void RPS_set_video(int channel, int video) {
* Initializes the sound to the given frequencies, channels, and
* sample buffer size.
*/
void RPS_init(int freq, int stereo, int samples, int status, int equal_mono) {
void RPS_init(int freq, int stereo, int samples, int status, int equal_mono, int linear_fades_) {
if (initialized) {
return;
@@ -1151,6 +1168,8 @@ void RPS_init(int freq, int stereo, int samples, int status, int equal_mono) {
SDL_PauseAudio(0);
linear_fades = linear_fades_;
initialized = 1;
error(SUCCESS);
+4 -1
View File
@@ -50,7 +50,7 @@ PyObject *RPS_read_video(int channel);
void RPS_sample_surfaces(PyObject *rgb, PyObject *rgba);
void RPS_set_video(int channel, int video);
void RPS_init(int freq, int stereo, int samples, int status, int equal_mono);
void RPS_init(int freq, int stereo, int samples, int status, int equal_mono, int linear_fades);
void RPS_quit(void);
void RPS_advance_time(void);
@@ -58,4 +58,7 @@ void RPS_periodic(void);
char *RPS_get_error(void);
extern void (*RPS_generate_audio_c_function)(float *stream, int length);
#endif
+1
View File
@@ -165,6 +165,7 @@ for p in generate_styles.prefixes:
cython("renpy.display.matrix")
cython("renpy.display.render", libs=[ 'z', 'm' ])
cython("renpy.display.accelerator", libs=sdl + [ 'z', 'm' ])
cython("renpy.display.quaternion", libs=[ 'm' ])
cython("renpy.uguu.gl", libs=sdl)
cython("renpy.uguu.uguu", libs=sdl)
+5 -2
View File
@@ -91,7 +91,7 @@ if PY2:
version_tuple = VersionTuple(7, 6, 0, vc_version)
# The name of this version.
version_name = "TBD"
version_name = "To Boldly Go"
else:
@@ -99,7 +99,7 @@ else:
version_tuple = VersionTuple(8, 1, 0, vc_version)
# The name of this version.
version_name = "TBD"
version_name = "Where No One Has Gone Before"
# 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)
@@ -263,6 +263,8 @@ name_blacklist = {
"renpy.webloader.queue_lock",
"renpy.persistent.MP_instances",
"renpy.exports.sdl_dll",
"renpy.sl2.slast.serial",
"renpy.gl2.gl2draw.default_position",
}
class Backup(_object):
@@ -514,6 +516,7 @@ def import_all():
import renpy.display.tts
import renpy.display.gesture
import renpy.display.model
import renpy.display.quaternion
import renpy.display.error
+35
View File
@@ -2321,6 +2321,41 @@ class UserStatement(Node):
return False
def reachable(self, is_reachable):
"""
This is used by lint to find statements reachable from or through
this statement.
"""
rv = self.call(
"reachable",
is_reachable,
self.name,
self.next.name if self.next is not None else None,
self.code_block[0].name if self.code_block else None,
)
if rv is None:
rv = set()
if self.call("label"):
rv.add(self.name)
is_reachable = True
if is_reachable:
if self.code_block:
rv.add(self.code_block[0].name)
for i in self.subparses:
if i.block:
rv.add(i.block[0].name)
if self.next:
rv.add(self.next.name)
return rv
class PostUserStatement(Node):
+208 -37
View File
@@ -126,7 +126,7 @@ def interpolate(t, a, b, type): # @ReservedAssignment
"""
# Deal with booleans, nones, etc.
if b is None or isinstance(b, (bool, basestring, renpy.display.matrix.Matrix)):
if b is None or isinstance(b, (bool, basestring, renpy.display.matrix.Matrix, renpy.display.transform.Camera)):
if t >= 1.0:
return b
else:
@@ -228,7 +228,7 @@ def get_catmull_rom_value(t, p_1, p0, p1, p2):
+(t - 1) * t * t * p2) / 2)
# A list of atl transforms that may need to be compile.
# A list of atl transforms that may need to be compiled.
compile_queue = [ ]
@@ -241,11 +241,29 @@ def compile_all():
global compile_queue
for i in compile_queue:
i.atl.find_loaded_variables()
if i.atl.constant == GLOBAL_CONST:
i.compile()
compile_queue = [ ]
def find_loaded_variables(expr):
"""
Returns the set of variables that are loaded by the given expression.
"""
if expr is None:
return set()
ast = renpy.pyanalysis.ccache.ast_eval(expr)
return renpy.python.find_loaded_variables(ast)
# Used to indicate that a variable is not in the context.
NotInContext = renpy.object.Sentinel("NotInContext")
# This is the context used when compiling an ATL statement. It stores the
# scopes that are used to evaluate the various expressions in the statement,
@@ -267,6 +285,36 @@ class Context(object):
def __ne__(self, other):
return not (self == other)
def variables_equal(self, other, variables):
"""
Returns true if the variables in `variables` are equal in
this context and `other`. False if they are not equal.
Returns True if any variable cannot be compared.
"""
try:
if renpy.config.at_transform_compare_full_context:
if self.context != other.context:
return False
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
except Exception:
return True
# This is intended to be subclassed by ATLTransform. It takes care of
# managing ATL execution, which allows ATLTransform itself to not care
# much about the contents of this file.
@@ -287,9 +335,16 @@ class ATLTransformBase(renpy.object.Object):
def __init__(self, atl, context, parameters):
# The constructor will be called by atltransform.
if parameters is None:
parameters = ATLTransformBase.parameters
else:
# Apply the default parameters.
context = context.copy()
for k, v in parameters.parameters:
if v is not None:
context[k] = renpy.python.py_eval(v, locals=context)
# The parameters that we take.
self.parameters = parameters
@@ -343,6 +398,7 @@ class ATLTransformBase(renpy.object.Object):
if renpy.game.context().init_phase:
compile_queue.append(self)
def _handles_event(self, event):
if (event == "replaced") and (self.atl_state is None):
@@ -386,13 +442,12 @@ class ATLTransformBase(renpy.object.Object):
elif t.atl is not self.atl:
return
# Important to do it this way, so we use __eq__. The exception handling
# optimistically assumes that uncomparable objects are the same.
try:
if not (t.context == self.context):
# Only take the execution state if the contexts haven't changed in
# a way that would affect the execution of the ATL.
if t.atl.constant != GLOBAL_CONST:
if not self.context.variables_equal(t.context, t.atl.find_loaded_variables()):
return
except Exception:
pass
self.done = t.done
self.block = t.block
@@ -422,10 +477,6 @@ class ATLTransformBase(renpy.object.Object):
context = self.context.context.copy()
for k, v in self.parameters.parameters:
if v is not None:
context[k] = renpy.python.py_eval(v)
positional = list(self.parameters.positional)
args = list(args)
@@ -649,6 +700,13 @@ class RawStatement(object):
self.constant = NOT_CONST
def find_loaded_variables(self):
"""
Returns the set of variables that are loaded by this statement.
"""
raise Exception("find_loaded_variables not implemented.")
# The base class for compiled ATL Statements.
@@ -706,6 +764,11 @@ class RawBlock(RawStatement):
# and use this value for all ATLTransform that use us as an atl.
compiled_block = None
# If this is the outermost ATL of a parse, a set giving the variables
# that are loaded by this block.
loaded_variable_cache = None
def __init__(self, loc, statements, animation):
super(RawBlock, self).__init__(loc)
@@ -767,6 +830,20 @@ class RawBlock(RawStatement):
self.constant = constant
def find_loaded_variables(self):
if self.loaded_variable_cache is not None:
return self.loaded_variable_cache
variables = set()
for i in self.statements:
variables.update(i.find_loaded_variables())
self.loaded_variable_cache = variables
return variables
# A compiled ATL block.
class Block(Statement):
@@ -902,22 +979,29 @@ class Block(Statement):
def visit(self):
return [ j for i in self.statements for j in i.visit() ]
incompatible_props = {"alignaround" : {"xaround", "yaround", "xanchoraround", "yanchoraround"},
"align" : {"xanchor", "yanchor", "xpos", "ypos"},
"anchor" : {"xanchor", "yanchor"},
"angle" : {"xpos", "ypos"},
"around" : {"xaround", "yaround", "xanchoraround", "yanchoraround"},
"offset" : {"xoffset", "yoffset"},
"pos" : {"xpos", "ypos"},
"radius" : {"xpos", "ypos"},
"size" : {"xsize", "ysize"},
"xalign" : {"xpos", "xanchor"},
"xcenter" : {"xpos", "xanchor"},
"xycenter" : {"xpos", "ypos", "xanchor", "yanchor"},
"xysize" : {"xsize", "ysize"},
"yalign" : {"ypos", "yanchor"},
"ycenter" : {"ypos", "yanchor"},
}
# A list of properties
incompatible_props = {
"alignaround" : {"xaround", "yaround", "xanchoraround", "yanchoraround"},
"align" : {"xanchor", "yanchor", "xpos", "ypos"},
"anchor" : {"xanchor", "yanchor"},
"angle" : {"xpos", "ypos"},
"around" : {"xaround", "yaround", "xanchoraround", "yanchoraround"},
"offset" : {"xoffset", "yoffset"},
"pos" : {"xpos", "ypos"},
"radius" : {"xpos", "ypos"},
"size" : {"xsize", "ysize"},
"xalign" : {"xpos", "xanchor"},
"xcenter" : {"xpos", "xanchor"},
"xycenter" : {"xpos", "ypos", "xanchor", "yanchor"},
"xysize" : {"xsize", "ysize"},
"yalign" : {"ypos", "yanchor"},
"ycenter" : {"ypos", "yanchor"},
}
# A list of sets of pairs of properties that do not conflict.
compatible_pairs = [
{"radius", "angle"}
]
# This can become one of four things:
#
@@ -968,6 +1052,14 @@ class RawMultipurpose(RawStatement):
old = None
self.properties.append((name, exprs))
if old is not None:
pair = { old, name }
for i in compatible_pairs:
if pair == i:
old = None
return old
def add_expression(self, expr, with_clause):
@@ -1087,6 +1179,26 @@ class RawMultipurpose(RawStatement):
self.constant = constant
def find_loaded_variables(self):
rv = set()
rv.update(find_loaded_variables(self.warp_function))
rv.update(find_loaded_variables(self.duration))
rv.update(find_loaded_variables(self.circles))
for _name, expr in self.properties:
rv.update(find_loaded_variables(expr))
for _name, exprs in self.splines:
for expr in exprs:
rv.update(find_loaded_variables(expr))
for expr, withexpr in self.expressions:
rv.update(find_loaded_variables(expr))
rv.update(find_loaded_variables(withexpr))
return rv
def predict(self, ctx):
for i, _j in self.expressions:
@@ -1122,6 +1234,9 @@ class RawContainsExpr(RawStatement):
def mark_constant(self, analysis):
self.constant = analysis.is_constant_expr(self.expression)
def find_loaded_variables(self):
return find_loaded_variables(self.expression)
# This allows us to have multiple ATL transforms as children.
class RawChild(RawStatement):
@@ -1156,6 +1271,14 @@ class RawChild(RawStatement):
self.constant = constant
def find_loaded_variables(self):
rv = set()
for i in self.children:
rv.update(i.find_loaded_variables())
return rv
# This changes the child of this statement, optionally with a transition.
class Child(Statement):
@@ -1244,6 +1367,7 @@ class Interpolation(Statement):
newts.take_state(trans.state)
has_angle = False
has_radius = False
for k, v in self.properties:
setattr(newts, k, v)
@@ -1252,6 +1376,9 @@ class Interpolation(Statement):
newts.last_angle = v
has_angle = True
elif k == "radius":
has_radius = True
# Now, the things we change linearly are in the difference
# between the new and old states.
linear = trans.state.diff(newts)
@@ -1262,7 +1389,7 @@ class Interpolation(Statement):
revdir = self.revolution
circles = self.circles
if (revdir or (has_angle and renpy.config.automatic_polar_motion)) and (newts.xaround is not None):
if (revdir or ((has_angle or has_radius) and renpy.config.automatic_polar_motion)) and (newts.xaround is not None):
# Remove various irrelevant motions.
for i in [ 'xpos', 'ypos',
@@ -1302,13 +1429,22 @@ class Interpolation(Statement):
startangle += circles * 360
if has_radius:
linear["radius"] = (startradius, endradius)
# Store the revolution.
revolution = (startangle, endangle, startradius, endradius)
if has_angle:
revolution = (startangle, endangle)
else:
last_angle = trans.state.last_angle or trans.state.angle
revolution = (last_angle, newts.last_angle, trans.state.radius, newts.radius)
if has_angle:
last_angle = trans.state.last_angle or trans.state.angle
revolution = (last_angle, newts.last_angle)
if has_radius:
linear["radius"] = (trans.state.radius, newts.radius)
# Figure out the splines.
for name, values in self.splines:
@@ -1331,11 +1467,12 @@ class Interpolation(Statement):
if old is None:
old = (0.0, 0.0, 0.0)
if new is not None:
value = renpy.display.accelerator.quaternion_slerp(complete, old, new)
value = renpy.display.quaternion.euler_slerp(complete, old, new)
elif complete >= 1:
value = None
else:
value = old
else:
value = interpolate(complete, old, new, PROPERTIES[k])
@@ -1343,14 +1480,12 @@ class Interpolation(Statement):
# Handle the revolution.
if revolution is not None:
startangle, endangle, startradius, endradius = revolution
startangle, endangle = revolution[:2]
angle = interpolate(complete, startangle, endangle, float)
trans.state.last_angle = angle
trans.state.angle = angle
trans.state.radius = interpolate(complete, startradius, endradius, float)
# Handle any splines we might have.
for name, values in splines:
value = interpolate_spline(complete, values)
@@ -1388,6 +1523,8 @@ class RawRepeat(RawStatement):
def mark_constant(self, analysis):
self.constant = analysis.is_constant_expr(self.repeats)
def find_loaded_variables(self):
return find_loaded_variables(self.repeats)
class Repeat(Statement):
@@ -1426,6 +1563,14 @@ class RawParallel(RawStatement):
self.constant = constant
def find_loaded_variables(self):
rv = set()
for i in self.blocks:
rv.update(i.find_loaded_variables())
return rv
class Parallel(Statement):
@@ -1506,6 +1651,15 @@ class RawChoice(RawStatement):
self.constant = constant
def find_loaded_variables(self):
rv = set()
for chance, block in self.choices:
rv.update(find_loaded_variables(chance))
rv.update(block.find_loaded_variables())
return rv
class Choice(Statement):
@@ -1575,6 +1729,9 @@ class RawTime(RawStatement):
def mark_constant(self, analysis):
self.constant = analysis.is_constant_expr(self.time)
def find_loaded_variables(self):
return find_loaded_variables(self.time)
class Time(Statement):
@@ -1622,6 +1779,14 @@ class RawOn(RawStatement):
self.constant = constant
def find_loaded_variables(self):
rv = set()
for block in self.handlers.values():
rv.update(block.find_loaded_variables())
return rv
class On(Statement):
@@ -1731,6 +1896,9 @@ class RawEvent(RawStatement):
def mark_constant(self, analysis):
self.constant = GLOBAL_CONST
def find_loaded_variables(self):
return set()
class Event(Statement):
@@ -1757,6 +1925,9 @@ class RawFunction(RawStatement):
def mark_constant(self, analysis):
self.constant = analysis.is_constant_expr(self.expr)
def find_loaded_variables(self):
return find_loaded_variables(self.expr)
class Function(Statement):
+12 -2
View File
@@ -80,7 +80,7 @@ def load(fn):
elif exception.rtype == 'video':
# Video files are downloaded by the browser, so return
# the file name instead of a file-like object
return 'url:' + renpy.config.web_video_base + "/" + fn
return 'url:' + renpy.config.web_video_base + "/" + exception.relpath
# temporary 1s placeholder, will retry loading when looping:
rv = open(os.path.join(renpy.config.commondir, '_dl_silence.ogg'), 'rb') # type: ignore
@@ -448,6 +448,9 @@ class Channel(object):
# mixer is muted.
force_stop = self.context.force_stop or (renpy.game.preferences.mute.get(self.mixer, False) and self.stop_on_mute)
if global_pause and not self.loop:
force_stop = True
if self.playing and force_stop:
renpysound.stop(self.number)
self.playing = False
@@ -468,6 +471,9 @@ class Channel(object):
# files. So this loop will only execute once, in practice.
while True:
if global_pause:
break
if self._number is not None:
depth = renpysound.queue_depth(self.number)
else:
@@ -785,6 +791,7 @@ class Channel(object):
return renpysound.video_ready(self.number)
# Use unconditional imports so these files get compiled during the build
# process.
@@ -988,11 +995,14 @@ def init():
bufsize = 8192 # works for me
# bufsize = 16384 # jitter/silence right after starting a sound
if renpy.config.sound_buffer_size is not None:
bufsize = renpy.config.sound_buffer_size
if 'RENPY_SOUND_BUFSIZE' in os.environ:
bufsize = int(os.environ['RENPY_SOUND_BUFSIZE'])
try:
renpysound.init(renpy.config.sound_sample_rate, 2, bufsize, False, renpy.config.equal_mono)
renpysound.init(renpy.config.sound_sample_rate, 2, bufsize, False, renpy.config.equal_mono, renpy.config.linear_fades)
pcm_ok = True
except Exception:
+31 -4
View File
@@ -50,6 +50,8 @@ or is stopped.
from __future__ import print_function
from libc.stdint cimport uintptr_t
from pygame_sdl2 cimport *
import_pygame_sdl2()
@@ -78,12 +80,13 @@ cdef extern from "renpysound_core.h":
void RPS_set_video(int channel, int video)
void RPS_sample_surfaces(object, object)
void RPS_init(int freq, int stereo, int samples, int status, int equal_mono)
void RPS_init(int freq, int stereo, int samples, int status, int equal_mono, int linear_fades)
void RPS_quit()
void RPS_periodic()
char *RPS_get_error()
void (*RPS_generate_audio_c_function)(float *stream, int length)
def check_error():
"""
@@ -369,7 +372,7 @@ def set_video(channel, video, loop=False):
else:
RPS_set_video(channel, NO_VIDEO)
def init(freq, stereo, samples, status=False, equal_mono=False):
def init(freq, stereo, samples, status=False, equal_mono=False, linear_fades=False):
"""
Initializes the audio system with the given parameters. The parameter are
just informational - the audio system should be able to play all supported
@@ -386,7 +389,13 @@ def init(freq, stereo, samples, status=False, equal_mono=False):
`status`
If true, the sound system will print errors out to the console.
`
`equal_mono`
If true, the sound system will play mono files at the same volume as
stereo files.
`linear_fades`
If true, the sound system will use linear fades.
"""
if status:
@@ -394,7 +403,7 @@ def init(freq, stereo, samples, status=False, equal_mono=False):
else:
status = 0
RPS_init(freq, stereo, samples, status, equal_mono)
RPS_init(freq, stereo, samples, status, equal_mono, linear_fades)
check_error()
def quit(): # @ReservedAssignment
@@ -419,6 +428,24 @@ def advance_time():
RPS_advance_time()
def set_generate_audio_c_function(fn):
"""
This can be use to set a C function that totally replaces the Ren'Py
audio system.
The function is expected to have the signature void (*)(short *buf, int samples,
and fill buf with samples samples of audio, where each sample consists of two
shorts.
"""
global RPS_generate_audio_c_function
if not isinstance(fn, int):
import ctypes
fn = ctypes.cast(fn, ctypes.c_void_p).value
RPS_generate_audio_c_function = <void (*)(float *, int)> <uintptr_t> fn
# Store the sample surfaces so they stay alive.
rgb_surface = None
rgba_surface = None
+2 -15
View File
@@ -439,24 +439,11 @@ def load_script():
@proxy_call_both
def init(freq, stereo, samples, status=False, equal_mono=False):
def init(freq, stereo, samples, status=False, equal_mono=False, linear_fades=False):
"""
Initializes the audio system with the given parameters. The parameter are
Initializes the audio system with the given parameters. The parameters are
just informational - the audio system should be able to play all supported
files.
`freq`
The sample frequency to play back at.
`stereo`
Should we play in stereo (generally true).
`samples`
The length of the sample buffer.
`status`
If true, the sound system will print errors out to the console.
`
"""
load_script()
+14 -1
View File
@@ -609,14 +609,17 @@ def display_say(
if renpy.config.scry_extend:
scry = renpy.exports.scry().next()
scry_count = 0
while scry:
while scry and scry_count < 64:
if scry.extend_text is renpy.ast.DoesNotExtend:
break
elif scry.extend_text is not None:
extend_text += scry.extend_text
scry = scry.next()
scry_count += 1
if extend_text:
extend_text = "{done}" + extend_text
@@ -1258,6 +1261,11 @@ class ADVCharacter(object):
if not isinstance(what, basestring):
raise Exception("Character expects its what argument to be a string, got %r." % (what,))
if renpy.store._side_image_attributes_reset:
renpy.store._side_image_attributes = None
renpy.store._side_image_attributes_reset = False
# Figure out multiple and final. Multiple is None if this is not a multiple
# dialogue, or a step and the total number of steps in a multiple interaction.
@@ -1500,6 +1508,9 @@ def Character(name=NotSet, kind=None, **properties):
be used to define a template character, and then copy that
character with changes.
This can also be a namespace, in which case the 'character'
variable in the namespace is used as the kind.
**Linked Image.**
An image tag may be associated with a Character. This allows a
say statement involving this character to display an image with
@@ -1653,6 +1664,8 @@ def Character(name=NotSet, kind=None, **properties):
if kind is None:
kind = renpy.store.adv
kind = getattr(kind, "character", kind)
return type(kind)(name, kind=kind, **properties)
+10
View File
@@ -212,6 +212,14 @@ screen _accessibility():
null height 10
label _("Voice Volume")
null height 10
bar value Preference("voice volume")
null height 10
label _("Self-Voicing Volume Drop")
null height 10
@@ -219,6 +227,8 @@ screen _accessibility():
bar value Preference("self voicing volume drop")
vbox:
text _("The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was.")
+20 -1
View File
@@ -154,6 +154,26 @@ init -1500 python:
def get_selected(self):
return _preferences.get_volume(self.mixer) == self.volume
def GetMixer(mixer, db=False):
"""
:doc: audio_action
Returns the volume of `mixer`.
`db`
If true, returns the volume in decibels. If false, the default,
returns the volume as a number between 0.0 and 1.0.
"""
import math
rv = _preferences.get_mixer(mixer)
if db:
rv = renpy.config.volume_db_range * rv - renpy.config.volume_db_range
return rv
@renpy.pure
class SetMute(Action, DictEquality):
"""
@@ -257,4 +277,3 @@ init -1500 python:
rv = not rv
return rv
+3 -3
View File
@@ -302,11 +302,11 @@ init -1600 python:
renpy.restart_interaction()
def get_selected(self):
if self.key not in self.dict:
try:
rv = self.dict[self.key]
except (KeyError, IndexError):
return False
rv = self.dict[self.key]
if self.true_value is not None:
rv = (rv == self.true_value)
+10 -2
View File
@@ -129,6 +129,8 @@ init -1500 python:
config.predict_file_pages = True
config.file_slotname_callback = None
def __slotname(name, page=None, slot=False):
if slot:
@@ -151,7 +153,13 @@ init -1500 python:
except ValueError:
pass
return str(page) + "-" + str(name)
page = str(page)
name = str(name)
if config.file_slotname_callback is not None:
return config.file_slotname_callback(page, name)
else:
return page + "-" + name
def __newest_slot():
"""
@@ -566,7 +574,7 @@ init -1500 python:
page = unicode(page)
for i in renpy.list_slots(page + "-"):
for i in renpy.list_slots(__slotname(page, r'\d+')):
renpy.predict(renpy.slot_screenshot(i))
@renpy.pure
+7 -4
View File
@@ -414,8 +414,9 @@ init -1500 python:
when entering the replay.
`locked`
If true, this replay is locked. If false, it is unlocked. If None, the
replay is locked if the label has not been seen in any playthrough.
If true, this action is insensitive and will not do anything when triggered.
If false, it will behave normally. If None, it will be locked if the label
has not been seen in any playthrough.
"""
def __init__(self, label, scope={}, locked=None):
@@ -425,7 +426,7 @@ init -1500 python:
def __call__(self):
if self.locked:
if not self.get_sensitive():
return
if config.enter_replay_transition:
@@ -604,6 +605,8 @@ init -1500 python:
The sensitivity and selectedness of this action match those
of the `yes` action.
See :func:`layout.yesno_screen` for a function version of this action.
"""
@@ -694,7 +697,7 @@ init -1500 python:
amount = delta * adjustment.step
elif self.amount == "page":
amount = delta * adjustment.page
elif isinstance(self.amount) and not isinstance(self.amount, absolute):
elif isinstance(self.amount, float) and not isinstance(self.amount, absolute):
amount = delta * self.amount * adjustment.range
else:
amount = delta * self.amount
+13
View File
@@ -456,6 +456,17 @@ init -1500 python in build:
# The itch.io project name.
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" ),
]
# Should we include the old Ren'Py themes?
include_old_themes = True
@@ -552,6 +563,8 @@ init -1500 python in build:
if itch_project:
rv["itch_project"] = itch_project
rv["itch_channels"] = itch_channels
if mac_identity:
rv["mac_identity"] = mac_identity
rv["mac_codesign_command"] = mac_codesign_command
+5 -3
View File
@@ -250,14 +250,14 @@ init -1100 python:
config.atl_function_always_blocks = True
if version <= (7, 4, 11):
config.timer_blocks_pause = False
config.modal_blocks_timer = False
config.modal_blocks_pause = False
elif _compat_versions(version, (7, 5, 1), (8, 0, 1)):
config.timer_blocks_pause = True
config.modal_blocks_timer = True
config.modal_blocks_pause = False
elif _compat_versions(version, (7, 5, 2), (8, 0, 2)):
config.modal_blocks_pause = True
config.timer_blocks_pause = True
config.modal_blocks_timer = True
if _compat_versions(version, (7, 5, 3), (8, 0, 3)):
config.quadratic_volumes = True
@@ -268,6 +268,8 @@ init -1100 python:
config.history_current_dialogue = False
config.scry_extend = False
config.fadeout_audio = 0.0
config.at_transform_compare_full_context = True
config.linear_fades = True
if version > (6, 99, 5):
config.search_prefixes.append("images/")
+7 -4
View File
@@ -24,7 +24,7 @@ import renpy.exports as renpy
from renpy.minstore import _dict, _object
"""renpy
init -1100 python:
init -1200 python:
"""
class _JSONDBDict(_dict):
@@ -111,13 +111,16 @@ class JSONDB(_object):
For example, this can store information associated with each
say statement, that can change how a say statement is displayed.
JSONDBs are not intended for data that is changed after the game
has been released. :doc:`persistent` or normal save files are
JSONDBs are not intended for data that is changed through or because
of the player's actions. :doc:`persistent` or normal save files are
better choices for that data.
The database should only contain data that Python can serialize to
JSON. This includes lists, dictionaries (with strings as keys),
strings, numbers, True, False, and None.
strings, numbers, True, False, and None. See
`the Python documentation <https://docs.python.org/3/library/json.html#encoders-and-decoders>`__
about interoperability, how data converts between the two formats,
and the various associated pitfalls.
The two levels of the database are dictionaries both keyed by strings.
The first level is read only - when a key on the first level dictionary
+5 -3
View File
@@ -54,6 +54,7 @@ init -1600 python:
choose_renderer = ['alt_K_g', 'shift_K_g' ],
progress_screen = [ 'alt_shift_K_p', 'meta_shift_K_p', 'K_F2' ],
accessibility = [ 'K_a' ],
bubble_editor = [ 'alt_K_b', 'shift_K_b' ],
# Accessibility.
self_voicing = [ 'alt_K_v', 'K_v' ],
@@ -83,6 +84,7 @@ init -1600 python:
# Input.
input_backspace = [ 'any_K_BACKSPACE' ],
input_enter = [ 'K_RETURN', 'K_KP_ENTER' ],
input_next_line = [ 'shift_K_RETURN', 'shift_K_KP_ENTER' ],
input_left = [ 'any_K_LEFT', 'any_KP_LEFT' ],
input_right = [ 'any_K_RIGHT', 'any_KP_RIGHT' ],
input_up = [ 'any_K_UP', 'any_KP_UP' ],
@@ -296,7 +298,7 @@ init -1600 python:
dest = config.renpy_base
if renpy.macapp:
dest = os.path.expanduser(b"~/Desktop")
dest = os.path.expanduser("~/Desktop")
pattern = renpy.store._screenshot_pattern or config.screenshot_pattern
@@ -415,8 +417,7 @@ screen _progress:
init -1100 python:
# The default keymap. We might also want to put some of this into
# the launcher.
# The default keymap.
_default_keymap = renpy.Keymap(
rollback = renpy.rollback,
screenshot = _screenshot,
@@ -443,6 +444,7 @@ init -1100 python:
director = director.Start(),
performance = ToggleScreen("_performance"),
accessibility = ToggleScreen("_accessibility"),
bubble_editor = bubble.ToggleShown(),
)
config.underlay = [ _default_keymap ]
+5 -2
View File
@@ -438,7 +438,7 @@ python early in layeredimage:
class Always(Layer):
"""
:doc: li
:undocumented:
:name: Always
This is used for a displayable that is always shown.
@@ -515,11 +515,14 @@ python early in layeredimage:
displayables associated with those attribute.
`attributes`
This must be a list of Attribute objects. Each Attribute object
This must be a list of Attribute, Condition, ConditionGroup or
:func:`renpy.Displayable` objects. Each one
reflects a displayable that may or may not be displayed as part
of the image. The items in this list are in back-to-front order,
with the first item further from the viewer and the last
closest.
Passing a displayable directly is the equivalent of the `always`
layeredimage statement.
`at`
A transform or list of transforms that are applied to the displayable
+26 -28
View File
@@ -165,18 +165,17 @@ init -1400 python hide:
unhovered=None,
index=None,
**properties):
"""
label - The label of this button. Will be translated if necessary.
type - The type of this button. Used to generate the appropriate styles.
selected - Determines if this button should be selected.
enabled - Determines if this button should be enabled.
clicked - A function that is run when the button is clicked.
hovered - A function that is run when the button is hovered.
unhovered - A function that is run when the button is unhovered.
index - A style index. If None, label is used.
size_group - The size_group used by this button.
"""
label - The label of this button. Will be translated if necessary.
type - The type of this button. Used to generate the appropriate styles.
selected - Determines if this button should be selected.
enabled - Determines if this button should be enabled.
clicked - A function that is run when the button is clicked.
hovered - A function that is run when the button is hovered.
unhovered - A function that is run when the button is unhovered.
index - A style index. If None, label is used.
size_group - The size_group used by this button.
"""
if not enabled:
clicked = None
@@ -479,21 +478,23 @@ init -1400 python hide:
@layout
def yesno_screen(message, yes=None, no=None):
"""
:doc: other
:doc: other
This causes the a yes/no prompt screen with the given message
to be displayed. The screen will be hidden when the user hits
yes or no.
This causes the a yes/no prompt screen with the given message
to be displayed. The screen will be hidden when the user hits
yes or no.
`message`
The message that will be displayed.
`message`
The message that will be displayed.
`yes`
An action that is run when the user chooses yes.
`yes`
An action that is run when the user chooses yes.
`no`
An action that is run when the user chooses no.
"""
`no`
An action that is run when the user chooses no.
See :func:`Confirm` for an equivalent Action.
"""
if config.confirm_screen and renpy.has_screen('confirm'):
screen = "confirm"
elif renpy.has_screen("yesno_prompt"):
@@ -522,18 +523,15 @@ init -1400 python hide:
renpy.restart_interaction()
return
if renpy.invoke_in_new_context(layout.invoke_yesno_prompt, None, message):
elif renpy.invoke_in_new_context(layout.invoke_yesno_prompt, None, message):
if yes is not None:
yes()
renpy.run(yes)
else:
if no is not None:
no()
renpy.run(no)
def __auto_save_extra_info():
return save_name
config.auto_save_extra_info = __auto_save_extra_info
+5 -6
View File
@@ -167,17 +167,16 @@ init -1500 python:
b = oldb + (b - oldb) * done
a = olda + (a - olda) * done
# To properly handle premultiplied alpha, the color channels
# have to be multiplied by the alpha channel.
r *= a
g *= a
b *= a
# Update the tint with opacity from the alpha channel.
r = 1 - (1 - r) * a
g = 1 - (1 - g) * a
b = 1 - (1 - b) * a
# Return a Matrix.
return Matrix([ r, 0, 0, 0,
0, g, 0, 0,
0, 0, b, 0,
0, 0, 0, a ])
0, 0, 0, 1 ])
class BrightnessMatrix(ColorMatrix, DictEquality):
"""
+3 -3
View File
@@ -227,9 +227,9 @@ init -1500 python:
* 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 preload cache", "enable") - Will cause the web cache to be preloaded.
* Preference("web preload cache", "disable") - Will cause the web cache to not be preloaded, and preloaded data to be deleted.
* Preference("web preload cache", "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.
+54 -9
View File
@@ -27,7 +27,7 @@ default bubble.tag_properties = { }
# on the screen now.
default bubble.current_dialogue = [ ]
init -1050 python in bubble:
init -1150 python in bubble:
from store import config, ADVCharacter, Character, JSONDB, Action, Frame, NoRollback
@@ -41,13 +41,14 @@ init -1050 python in bubble:
# The path to the json file the bubble database is stored in.
db_filename = "bubble.json"
# The number of rows and columns in the bubble database.
# The number of rows and columns in the grid that is used to position
# speech bubbles.
cols = 24
rows = 24
# The default window area rectangle. This is expressed as squares, where units
# are defined by the rows and columns.
default_area = (0, 18, 24, 6)
default_area = (15, 1, 8, 5)
# The property that the area is supplied as.
area_property = "window_area"
@@ -55,17 +56,35 @@ init -1050 python in bubble:
# Additional properties that the player can use to customize the bubble.
# This is a map from a property name to a list of choices that are cycled
# through.
properties = {
"default" : { }
}
properties = { }
# The property group names, in order.
properties_order = [ "default" ]
properties_order = [ ]
# 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.
expand_area = { }
# This is set to the JSONDB object that stores the bubble database,
# or None if the databse doesn't exist yet.
# or None if the database doesn't exist yet.
db = None
# These are not used directly, but are used by the default screens.rpy, and
# so should not be set.
frame = None
thoughtframe = None
class ToggleShown(Action):
def __call__(self):
if not active and not shown.value:
return
shown.value = not shown.value
renpy.restart_interaction()
def get_selected(self):
return shown.value
def scene_callback(layer):
global tag_properties
@@ -117,6 +136,9 @@ init -1050 python in bubble:
for the given image tag.
"""
if not properties_order:
raise Exception("A speech bubble is being used, but bubble.properties has not been set.")
rv = { }
xgrid = config.screen_width / cols
@@ -134,6 +156,29 @@ init -1050 python in bubble:
"properties" : properties_order[0]
}
def expand_area(self, area, properties_key):
"""
This is called to expand the area of a bubble. It is given the
area, and the properties key, and returns a new area.
"""
x, y, w, h = area
expand = expand_area.get(properties_key, None) or expand_area.get(None, None)
if expand is None:
return area
left, top, right, bottom = expand
x = x - left
y = y - top
w = w + left + right
h = h + top + bottom
return (x, y, w, h)
def do_show(self, who, what, multiple=None, extra_properties=None):
if extra_properties is None:
@@ -157,7 +202,7 @@ init -1050 python in bubble:
properties_key = tag_properties[image_tag]["properties"]
extra_properties.update(properties.get(properties_key, { }))
extra_properties[area_property] = tag_properties[image_tag]["area"]
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)
+1 -1
View File
@@ -362,7 +362,7 @@ init -1499 python in _renpysteam:
Activates the Steam overlay, and opens the web page at `url`.
"""
steamapi.SteamFriends().ActivateGameOverlayToWebPage(url.encode("utf-8"))
steamapi.SteamFriends().ActivateGameOverlayToWebPage(url.encode("utf-8"), steamapi.k_EActivateGameOverlayToWebPageMode_Default)
def activate_overlay_to_store(appid, flag=None):
"""
+13 -1
View File
@@ -44,6 +44,12 @@ init -1100 python:
config.sync_server = "https://sync.renpy.org"
class UploadSync(Action):
"""
:doc: sync
This action begins the process of uploading the most recent
saves to the Ren'Py Sync server.
"""
def __call__(self):
renpy.invoke_in_new_context(_sync.upload)
@@ -52,6 +58,12 @@ init -1100 python:
return config.has_sync
class DownloadSync(Action):
"""
:doc: sync
This action begins the process of downloading a Sync from the
Ren'Py Sync server.
"""
def __call__(self):
if renpy.invoke_in_new_context(_sync.download):
@@ -221,7 +233,7 @@ init -1100 python in _sync:
return None
def download_content(hashed, url):
def download_content(url):
import emscripten
import time
import os
+1 -1
View File
@@ -183,7 +183,7 @@ init -1500 python:
if volume is None:
return _CharacterVolumeValue(voice_tag)
else:
if config.quadratic_volume:
if config.quadratic_volumes:
return SetDict(persistent._character_volume, voice_tag, volume ** 2)
else:
return SetDict(persistent._character_volume, voice_tag, volume)
+6 -3
View File
@@ -287,7 +287,7 @@ let video_start = (c) => {
//TODO? c.playing.source.stop(context.currentTime + p.fadeout);
//TODO? } catch (e) {
//TODO? }
//TODO?
//TODO?
//TODO? }
setValue(c.relative_volume.gain, p.relative_volume);
@@ -702,10 +702,13 @@ renpyAudio.set_pan = (channel, pan, delay) => {
linearRampToValue(control, control.value, pan, delay);
};
renpyAudio.tts = (s) => {
console.log("tts: " + s);
renpyAudio.tts = (s, v) => {
console.log("tts:", s, "volume:", v);
v = v || 1.0;
let u = new SpeechSynthesisUtterance(s);
u.volume = v;
speechSynthesis.cancel();
speechSynthesis.speak(u);
};
+1 -1
View File
@@ -67,7 +67,7 @@ screen _developer:
if bubble.active:
textbutton _("Speech Bubble Editor"):
textbutton _("Speech Bubble Editor (Shift+B)"):
action [ SetField(bubble.shown, "value", True), Hide("_developer") ]
hbox:
+13
View File
@@ -179,6 +179,19 @@ if PY2:
add_attribute(io.TextIOWrapper, "_write", io.TextIOWrapper.write)
add_attribute(io.TextIOWrapper, "write", types.MethodType(text_write, None, io.TextIOWrapper)) # type: ignore
################################################################################
# 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)
subprocess.Popen = Popen
################################################################################
# Export functions.
+15 -1
View File
@@ -97,7 +97,7 @@ savedir = None
image_cache_size = None
# The size of the image cache, in megabytes.
image_cache_size_mb = 300
image_cache_size_mb = 400
# The number of statements we will analyze when doing predictive
# loading. Please note that this is a total number of statements in a
@@ -1373,6 +1373,20 @@ check_translate_none = True
# Like developer, but available at the end of python early blocks.
early_developer = False
# A function that returns the autosave prefix.
autosave_prefix_callback = None
# Compatibility for c492f2f8e6de57b2740fa5d00566f445124caaba.
at_transform_compare_full_context = False
# A list of callbacks when the display starts.
display_start_callbacks = [ ]
# If not None, the size of the sound buffer, in bytes.
sound_buffer_size = None
# If true, fades will be linear rather than logarithmic.
linear_fades = False
del os
del collections
+2 -1
View File
@@ -163,7 +163,8 @@ ShowingSwitch = renpy.display.layout.ShowingSwitch
AlphaMask = renpy.display.layout.AlphaMask
Layer = renpy.display.layout.Layer
Transform = renpy.display.motion.Transform
Transform = renpy.display.transform.Transform
Camera = renpy.display.transform.Camera
Animation = anim.Animation
Movie = renpy.display.video.Movie
File diff suppressed because it is too large Load Diff
+17 -3
View File
@@ -1116,7 +1116,9 @@ class Button(renpy.display.layout.Window):
renpy.game.interface.timeout(renpy.config.longpress_duration)
if self.longpress_start is not None:
if math.hypot(x - self.longpress_x, y - self.longpress_y) > renpy.config.longpress_radius:
if ev.type == pygame.MOUSEBUTTONUP and ev.button == 1:
self.longpress_start = None
elif math.hypot(x - self.longpress_x, y - self.longpress_y) > renpy.config.longpress_radius:
self.longpress_start = None
elif st >= (self.longpress_start + renpy.config.longpress_duration):
renpy.exports.vibrate(renpy.config.longpress_vibrate)
@@ -1287,7 +1289,7 @@ def input_post_per_interact():
global input_value_active
for i in input_values:
if i is current_input_value:
if i == current_input_value:
break
else:
@@ -1298,7 +1300,7 @@ def input_post_per_interact():
for i in inputs:
editable = (i.value is current_input_value) and input_value_active and i.value.editable
editable = (i.value == current_input_value) and input_value_active and i.value.editable
content = i.value.get_text()
@@ -1365,6 +1367,7 @@ class Input(renpy.text.text.Text): # @UndefinedVariable
edit_text = u""
value = None
shown = False
multiline = False
st = 0
@@ -1384,6 +1387,7 @@ class Input(renpy.text.text.Text): # @UndefinedVariable
value=None,
copypaste=False,
caret_blink=None,
multiline=False,
**properties):
super(Input, self).__init__("", style=style, replaces=replaces, substitute=False, **properties)
@@ -1412,6 +1416,8 @@ class Input(renpy.text.text.Text): # @UndefinedVariable
self.editable = editable
self.pixel_width = pixel_width
self.multiline = multiline
caretprops = { 'color' : None }
for i, v in properties.items():
@@ -1582,6 +1588,14 @@ class Input(renpy.text.text.Text): # @UndefinedVariable
renpy.display.render.redraw(self, 0)
raise renpy.display.core.IgnoreEvent()
elif self.multiline and map_event(ev, 'input_next_line'):
content = self.content[:self.caret_pos] + '\n' + self.content[self.caret_pos:]
self.caret_pos += 1
self.update_text(content, self.editable)
renpy.display.render.redraw(self, 0)
raise renpy.display.core.IgnoreEvent()
elif map_event(ev, "input_enter"):
content = self.content
+20 -12
View File
@@ -84,7 +84,8 @@ controllers = { }
axis_positions = {}
# The axis threshold.
THRESHOLD = (32768 // 2)
THRESHOLD = 8192 + 4096
ZERO_THRESHOLD = 8192
# Should we ignore events?
ignore = False
@@ -254,21 +255,28 @@ def event(ev):
elif ev.type == CONTROLLERAXISMOTION:
if ev.value > THRESHOLD:
pos = "pos"
elif ev.value < -THRESHOLD:
pos = "neg"
else:
pos = "zero"
pygame_sdl2.event.pump()
events = [ ev ] + pygame.event.get(CONTROLLERAXISMOTION)
old_pos = axis_positions.get((ev.which, ev.axis), None)
for ev in events:
if pos == old_pos:
return None
old_pos = axis_positions.get((ev.which, ev.axis), None)
axis_positions[(ev.which, ev.axis)] = pos
if ev.value > THRESHOLD:
pos = "pos"
elif ev.value < -THRESHOLD:
pos = "neg"
elif abs(ev.value) < ZERO_THRESHOLD:
pos = "zero"
else:
pos = old_pos
controller_event(get_string_for_axis(ev.axis), pos)
if pos == old_pos:
continue
axis_positions[(ev.which, ev.axis)] = pos
controller_event(get_string_for_axis(ev.axis), pos)
return None
+85 -26
View File
@@ -2017,9 +2017,6 @@ class Interface(object):
self.old_scene = { }
self.transition = { }
self.ongoing_transition = { }
self.transition_time = { }
self.transition_from = { }
self.suppress_transition = False
self.quick_quit = False
self.force_redraw = False
@@ -2076,6 +2073,22 @@ class Interface(object):
# Is our audio paused?
self.audio_paused = False
# Transition-related:
# A map from layer (or None for the root) to the uninstantiate
# transition object that's on that layer.
self.ongoing_transition = { }
# The same, but for the transition after it's been called with the
# old and new displayables.
self.instantiated_transition = { }
# The time an ongoing transition started.
self.transition_time = { }
# The displayable that an ongoing transition is transitioning from.
self.transition_from = { }
# Init layers.
init_layers()
@@ -2360,6 +2373,7 @@ class Interface(object):
cursors = { }
for key, cursor_list in renpy.config.mouse.items():
l = [ ]
for i in cursor_list:
@@ -2373,11 +2387,18 @@ class Interface(object):
self.cursor_cache[key] = l
if ("default" not in self.cursor_cache) and (None in self.cursor_cache):
self.cursor_cache["default"] = self.cursor_cache[None]
s = "Total time until interface ready: {}s.".format(time.time() - import_time)
if renpy.android and not renpy.config.log_to_stdout:
print(s)
for i in renpy.config.display_start_callbacks:
i()
def post_init(self):
"""
This is called after display init, but before the window is created.
@@ -2388,6 +2409,7 @@ class Interface(object):
pygame.display.hint("SDL_TOUCH_MOUSE_EVENTS", "1")
pygame.display.hint("SDL_MOUSE_TOUCH_EVENTS", "0")
pygame.display.hint("SDL_EMSCRIPTEN_ASYNCIFY", "0")
pygame.display.hint("SDL_IME_SHOW_UI", "1")
if renpy.config.mouse_focus_clickthrough:
pygame.display.hint("SDL_MOUSE_FOCUS_CLICKTHROUGH", "1")
@@ -2451,6 +2473,9 @@ class Interface(object):
square_im.blit(im, ((imax - iw) // 2, (imax - ih) // 2))
im = square_im
if im.get_size()[0] > 1024:
im = renpy.display.scale.smoothscale(im, (1024, 1024))
pygame.display.set_icon(im)
except renpy.webloader.DownloadNeeded:
pass
@@ -2919,6 +2944,7 @@ class Interface(object):
for l in layers:
if l is None:
self.ongoing_transition.pop(None, None)
self.instantiated_transition.pop(None, None)
self.transition_time.pop(None, None)
self.transition_from.pop(None, None)
continue
@@ -2928,6 +2954,7 @@ class Interface(object):
if (self.frame_time - start) >= delay:
self.ongoing_transition.pop(l, None)
self.instantiated_transition.pop(l, None)
self.transition_time.pop(l, None)
self.transition_from.pop(l, None)
@@ -3138,6 +3165,9 @@ class Interface(object):
if interaction and (mouse_kind is None):
mouse_kind = self.mouse
if mouse_kind is None:
mouse_kind = "default"
if pygame.mouse.get_pressed()[0]:
mouse_kind = "pressed_" + mouse_kind # type: ignore
@@ -3328,6 +3358,7 @@ class Interface(object):
# Stop ongoing transitions.
self.ongoing_transition.clear()
self.instantiated_transition.clear()
self.transition_from.clear()
self.transition_time.clear()
@@ -3613,6 +3644,9 @@ class Interface(object):
else:
renpy.plog(1, "end idle_frame (inexpensive)")
# This gets assigned below.
take_layer_displayable = None
def interact_core(self,
show_mouse=True,
trans_pause=False,
@@ -3674,11 +3708,14 @@ class Interface(object):
self.suppress_transition = False
# Figure out transitions.
if suppress_transition:
if suppress_transition or renpy.game.after_rollback:
self.ongoing_transition.clear()
self.instantiated_transition.clear()
self.transition_from.clear()
self.transition_time.clear()
else:
if not suppress_transition:
for k, t in self.transition.items():
if k not in self.old_scene:
continue
@@ -3791,6 +3828,29 @@ class Interface(object):
layers_root = renpy.display.layout.MultiBox(layout='fixed')
layers_root.layers = { }
def instantiate_transition(layer, old_d, new_d):
"""
Create a transition that will be used to transition `layer` (which
can be None) to `d`.
"""
old_trans = self.instantiated_transition.get(layer, None)
trans = self.ongoing_transition[layer](
old_widget=old_d,
new_widget=new_d)
if not isinstance(trans, Displayable):
raise Exception("Expected transition to be a displayable, not a %r" % trans)
if isinstance(trans, renpy.display.transform.Transform) and isinstance(old_trans, renpy.display.transform.Transform):
trans.take_state(old_trans)
trans.take_execution_state(old_trans)
self.instantiated_transition[layer] = trans
return trans
def add_layer(where, layer):
scene_layer = scene[layer]
@@ -3799,12 +3859,7 @@ class Interface(object):
if (self.ongoing_transition.get(layer, None) and
not suppress_transition):
trans = self.ongoing_transition[layer](
old_widget=self.transition_from[layer],
new_widget=scene_layer)
if not isinstance(trans, Displayable):
raise Exception("Expected transition to be a displayable, not a %r" % trans)
trans = instantiate_transition(layer, self.transition_from[layer], scene_layer)
transition_time = self.transition_time.get(layer, None)
@@ -3835,9 +3890,7 @@ class Interface(object):
old_root.layers[layer] = d
old_root.add(d)
trans = self.ongoing_transition[None](
old_widget=old_root,
new_widget=layers_root)
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)
@@ -3896,23 +3949,29 @@ class Interface(object):
# caused by an exception propagating through this function.
try:
# Insert layers into Layer displayables.
def per_interact(i):
if isinstance(i, renpy.display.layout.Layer):
if i.layer in scene:
i.layers = layer_transitions
add_layer(i, i.layer)
del i.layers
else:
i.add(null)
# Call per-interaction code for all displayables.
def take_layer_displayable(ld):
"""
This is called by a layer displayable to add the layer's
contents to the layer displayable.
"""
i.per_interact()
if ld.layer in scene:
ld.layers = layer_transitions
add_layer(ld, ld.layer)
del ld.layers
else:
ld.add(null)
self.take_layer_displayable = take_layer_displayable
# Call per-interaction code for all widgets.
renpy.display.behavior.input_pre_per_interact()
root_widget.visit_all(per_interact)
root_widget.visit_all(lambda d : d.per_interact())
renpy.display.behavior.input_post_per_interact()
self.take_layer_displayable = None
# Consolidate static and layer transitions for later processing.
if layer_transitions:
layer_transitions.update(layers_root.layers)
+1 -1
View File
@@ -471,8 +471,8 @@ class Drag(renpy.display.core.Displayable, renpy.revertable.RevertableObject):
Changes the child of this drag to `d`.
"""
d.per_interact()
self.child = renpy.easy.displayable(d)
self.child.per_interact()
renpy.display.render.invalidate(self)
def top(self):
+29 -8
View File
@@ -71,7 +71,15 @@ class CacheEntry(object):
rv += self.width * self.height
if self.texture is not None:
rv += self.bounds[2] * self.bounds[3]
has_mipmaps = getattr(self.texture, "has_mipmaps", None)
if has_mipmaps and has_mipmaps():
mipmap_multiplier = 1.34
else:
mipmap_multiplier = 1.0
rv += int(self.bounds[2] * self.bounds[3] * mipmap_multiplier)
return rv
@@ -376,14 +384,9 @@ class Cache(object):
pass
if not predict:
if render:
return make_render(ce)
else:
rv = ce.texture
rv = ce.texture
else:
rv = None
else:
rv = ce.surf
@@ -394,11 +397,14 @@ class Cache(object):
ce.surf = None
if texture and render and not predict:
return make_render(ce)
if (ce.surf is None) and (ce.texture is None):
with self.lock:
self.kill(ce)
# Done... return the surface.
# Done. Return the surface or texture.
return rv
# This kills off a given cache entry.
@@ -2063,6 +2069,21 @@ def load_surface(im):
return cache.get(image(im))
def load_rgba(data, size):
"""
:name: renpy.load_rgba
:doc: udd_utility
Loads the image data `bytes` into a texture of size `size`, and return it.
`data`
Should be a bytes object containing the image data in RGBA8888 order.
"""
surf = renpy.display.pgrender.surface(size, True)
surf.from_data(data)
return renpy.display.draw.load_texture(surf)
def reset_module():
print("Resetting cache.")
+16 -13
View File
@@ -484,7 +484,7 @@ class ImageReference(renpy.display.core.Displayable):
def _handles_event(self, event):
if self.target is None:
return False
self.find_target()
return self.target._handles_event(event)
@@ -745,7 +745,7 @@ class DynamicImage(renpy.display.core.Displayable):
def _handles_event(self, event):
if self.target is None:
return False
self.find_target()
return self.target._handles_event(event)
@@ -1006,7 +1006,8 @@ class ShownImageInfo(renpy.object.Object):
if ca:
ca_required = [ i for i in required if i not in attrs ]
ca_optional = [ i for i in optional if i not in attrs ]
ca_optional = [ i for i in optional if i not in attrs if i not in required ]
newattrs = ca(tag, ca_required, ca_optional)
if newattrs is None:
@@ -1014,19 +1015,21 @@ class ShownImageInfo(renpy.object.Object):
attrs = attrs + newattrs
num_required = 0
else:
for i in attrs:
if i in required:
num_required += 1
num_required = 0
for i in attrs:
if i in required:
num_required += 1
continue
# We don't have any not-found attributes. But we might not
# have all of the attributes.
if num_required != len(required):
continue
# We don't have any not-found attributes. But we might not
# have all of the attributes.
if num_required != len(required):
continue
len_attrs = len(set(attrs))
if len_attrs < max_len:
+2 -2
View File
@@ -580,8 +580,8 @@ class Frame(renpy.display.core.Displayable):
return rv
def visit(self):
rv = [ ]
self.style._visit_frame(rv)
rv = [ self.image ]
self.style._visit_frame(rv.append)
return rv
+6
View File
@@ -2469,3 +2469,9 @@ class Layer(AdjustTimes):
seen.add(id_d)
d.visit_all(callback, seen)
def per_interact(self):
if renpy.game.interface and renpy.game.interface.take_layer_displayable:
renpy.game.interface.take_layer_displayable(self)
super(Layer, self).per_interact()
+1 -1
View File
@@ -247,7 +247,7 @@ def bilinear_scale(src, dst, sx=0, sy=0, sw=None, sh=None, dx=0, dy=0, dw=None,
_renpy.bilinear(src, dst, sx, sy, sw, sh, dx, dy, dw, dh, precise=precise)
transform = _renpy.transform
self = _renpy.transform
# Note: Blend requires all surfaces to be the same size.
blend = _renpy.blend
+197
View File
@@ -0,0 +1,197 @@
#cython: profile=False
# 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 print_function
from libc.math cimport sin, cos, atan2, asin, acos
DEF pi = 3.14159265358979323846
cdef double radians(double degrees):
return degrees * pi / 180.0
cdef double degrees(double radians):
return radians * 180.0 / pi
def euler_slerp(double complete, old, new):
"""
Use quaternions to interpolate between two euler angles.
"""
cdef double coeff1
cdef double coeff2
cdef double cosx_cosp
cdef double cosz_cosp1
cdef double cosz_cosp2
cdef double cx
cdef double cy
cdef double cz
cdef double dot
cdef double new_q_w
cdef double new_q_x
cdef double new_q_y
cdef double new_q_z
cdef double new_x
cdef double new_x_div_2
cdef double new_y
cdef double new_y_div_2
cdef double new_z
cdef double new_z_div_2
cdef double old_q_mul_new_q
cdef double old_q_w
cdef double old_q_x
cdef double old_q_y
cdef double old_q_z
cdef double old_x
cdef double old_x_div_2
cdef double old_y
cdef double old_y_div_2
cdef double old_z
cdef double old_z_div_2
cdef double q_w
cdef double q_x
cdef double q_y
cdef double q_z
cdef double sinx_cosp
cdef double siny
cdef double sinz_cosp1
cdef double sinz_cosp2
cdef double sout
cdef double st
cdef double sut
cdef double sx
cdef double sy
cdef double sz
cdef double theta
cdef double x
cdef double y
cdef double z
if old == new:
return new
#select the shorten root
old_x, old_y, old_z = old
old_x = old_x % 360
old_y = old_y % 360
old_z = old_z % 360
new_x, new_y, new_z = new
new_x = new_x % 360
new_y = new_y % 360
new_z = new_z % 360
if new_x - old_x > 180:
new_x = new_x - 360
if new_y - old_y > 180:
new_y = new_y - 360
if new_z - old_z > 180:
new_z = new_z - 360
#z-y-x Euler angles to quaternion conversion
#https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
old_x_div_2 = radians(old_x) * 0.5
old_y_div_2 = radians(old_y) * 0.5
old_z_div_2 = radians(old_z) * 0.5
cx = cos(old_x_div_2)
sx = sin(old_x_div_2)
cy = cos(old_y_div_2)
sy = sin(old_y_div_2)
cz = cos(old_z_div_2)
sz = sin(old_z_div_2)
old_q_x = sx * cy * cz - cx * sy * sz
old_q_y = cx * sy * cz + sx * cy * sz
old_q_z = cx * cy * sz - sx * sy * cz
old_q_w = cx * cy * cz + sx * sy * sz
new_x_div_2 = radians(new_x) * 0.5
new_y_div_2 = radians(new_y) * 0.5
new_z_div_2 = radians(new_z) * 0.5
cx = cos(new_x_div_2)
sx = sin(new_x_div_2)
cy = cos(new_y_div_2)
sy = sin(new_y_div_2)
cz = cos(new_z_div_2)
sz = sin(new_z_div_2)
new_q_x = sx * cy * cz - cx * sy * sz
new_q_y = cx * sy * cz + sx * cy * sz
new_q_z = cx * cy * sz - sx * sy * cz
new_q_w = cx * cy * cz + sx * sy * sz
#calculate new quaternion between old and new.
old_q_mul_new_q = (old_q_x * new_q_x + old_q_y * new_q_y + old_q_z * new_q_z + old_q_w * new_q_w)
dot = old_q_mul_new_q
if dot > 1.0:
dot = 1.0
elif dot < -1.0:
dot = -1.0
theta = abs(acos(dot))
st = sin(theta)
sut = sin(theta * complete)
sout = sin(theta * (1 - complete))
coeff1 = sout / st
coeff2 = sut / st
q_x = coeff1 * old_q_x + coeff2 * new_q_x
q_y = coeff1 * old_q_y + coeff2 * new_q_y
q_z = coeff1 * old_q_z + coeff2 * new_q_z
q_w = coeff1 * old_q_w + coeff2 * new_q_w
#Quaternion to z-y-x Euler angles conversion
#https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
sinx_cosp = 2 * (q_w * q_x + q_y * q_z)
cosx_cosp = 1 - 2 * (q_x * q_x + q_y * q_y)
siny = 2 * (q_w * q_y - q_z * q_x)
sinz_cosp1 = 2 * (q_x * q_y - q_w * q_z)
cosz_cosp1 = 1 - 2 * (q_x * q_x + q_z * q_z)
sinz_cosp2 = 2 * (q_w * q_z + q_x * q_y)
cosz_cosp2 = 1 - 2 * (q_y * q_y + q_z * q_z)
if siny >= 1:
x = 0
y = pi/2
z = atan2(sinz_cosp1, cosz_cosp1)
elif siny <= -1:
x = 0
y = -pi/2
z = atan2(sinz_cosp1, cosz_cosp1)
else:
x = atan2(sinx_cosp, cosx_cosp)
if siny > 1.0:
siny = 1.0
elif siny < -1.0:
siny = -1.0
y = asin(siny)
z = atan2(sinz_cosp2, cosz_cosp2)
x = degrees(x) % 360
y = degrees(y) % 360
z = degrees(z) % 360
return (x, y, z)
+1 -4
View File
@@ -414,10 +414,7 @@ def redraw_time():
def redraw(d, when):
"""
:doc: udd_utility
Causes the displayable `d` to be redrawn after `when` seconds have
elapsed.
Documented in cdd.rst.
"""
if not renpy.game.interface:
+3
View File
@@ -1002,6 +1002,9 @@ def prepare_screens():
s.ast.unprepare_screen()
s.ast.prepare_screen()
# Compile ATL in screens.
renpy.atl.compile_all()
prepared = True
finally:
+1 -1
View File
@@ -558,7 +558,7 @@ def draw_transformed(dest, clip, what, xo, yo, alpha, forward, reverse):
dest = dest.subsurface((minx, miny, maxx - minx, maxy - miny))
renpy.display.module.transform(
renpy.display.module.self(
what, dest,
cx, cy,
forward.xdx, forward.ydx,
+119 -21
View File
@@ -31,9 +31,25 @@ import types # @UnresolvedImport
import renpy
from renpy.display.layout import Container
from renpy.display.accelerator import transform_render
from renpy.display.accelerator import RenderTransform
from renpy.atl import position, any_object, bool_or_none, float_or_none, matrix, mesh
class Camera(renpy.object.Object):
"""
:doc: point_to_camera
Instances of this class can be used with point_to to point
at the location of the camera for a particular layer.
`layer`
The name of the layer.
"""
def __init__(self, layer="master"):
self.layer = layer
# The null object that's used if we don't have a defined child.
null = None
@@ -49,40 +65,99 @@ def get_null():
# Convert a position from cartesian to polar coordinates.
def cartesian_to_polar(x, y, xaround, yaround):
def cartesian_to_polar(x, y, xaround, yaround, available_width, available_height):
"""
Converts cartesian coordinates to polar coordinates.
"""
tx = type(x)
ty = type(y)
if not available_width:
available_width = renpy.config.screen_width
if not available_height:
available_height = renpy.config.screen_height
if type(xaround) is float:
xaround = int(xaround * available_width)
if type(yaround) is float:
yaround = int(yaround * available_height)
if tx is float:
x = x * available_width
if ty is float:
y = y * available_height
dx = x - xaround
dy = y - yaround
if tx is float:
if available_width:
dx /= available_width
else:
dx = x
if ty is float:
dy /= available_height
radius = math.hypot(dx, dy)
angle = math.atan2(dx, -dy) / math.pi * 180
if angle < 0:
angle += 360
radius = tx(radius)
print("AR", angle, radius)
return angle, radius
def polar_to_cartesian(angle, radius, xaround, yaround):
def polar_to_cartesian(angle, radius, xaround, yaround, available_width, available_height):
"""
Converts polart coordinates to cartesian coordinates.
Converts polar coordinates to cartesian coordinates.
"""
tr = type(radius)
if not available_width:
available_width = renpy.config.screen_width
if not available_height:
available_height = renpy.config.screen_height
if type(xaround) is float:
xaround = int(xaround * available_width)
if type(yaround) is float:
yaround = int(yaround * available_height)
angle = angle * math.pi / 180
dx = radius * math.sin(angle)
dy = -radius * math.cos(angle)
x = type(xaround)(xaround + dx)
y = type(yaround)(yaround + dy)
x = xaround + dx
y = yaround + dy
if tr is float:
x /= available_width
y /= available_height
x = tr(x)
y = tr(y)
print("XY", x, y)
return x, y
def first_not_none(*args):
"""
Returns the first argument that is not None, or the last argument if
@@ -101,6 +176,9 @@ class TransformState(renpy.object.Object):
last_angle = None
last_events = True
available_width = 0
available_height = 0
def __init__(self):
# Most fields on this object are set by add_property, at the bottom
@@ -237,34 +315,36 @@ class TransformState(renpy.object.Object):
def get_angle(self):
xpos = first_not_none(self.xpos, self.inherited_xpos, 0)
ypos = first_not_none(self.ypos, self.inherited_ypos, 0)
angle, _radius = cartesian_to_polar(xpos, ypos, self.xaround, self.yaround)
return angle
angle, _radius = cartesian_to_polar(xpos, ypos, self.xaround, self.yaround, self.available_width, self.available_height)
return angle or self.last_angle or 0
def get_radius(self):
xpos = first_not_none(self.xpos, self.inherited_xpos, 0)
ypos = first_not_none(self.ypos, self.inherited_ypos, 0)
_angle, radius = cartesian_to_polar(xpos, ypos, self.xaround, self.yaround)
_angle, radius = cartesian_to_polar(xpos, ypos, self.xaround, self.yaround, self.available_width, self.available_height)
return radius
def set_angle(self, value):
self.last_angle = 0
xpos = first_not_none(self.xpos, self.inherited_xpos, 0)
ypos = first_not_none(self.ypos, self.inherited_ypos, 0)
_angle, radius = cartesian_to_polar(xpos, ypos, self.xaround, self.yaround)
_angle, radius = cartesian_to_polar(xpos, ypos, self.xaround, self.yaround, self.available_width, self.available_height)
angle = value
self.xpos, self.ypos = polar_to_cartesian(angle, radius, self.xaround, self.yaround)
self.xpos, self.ypos = polar_to_cartesian(angle, radius, self.xaround, self.yaround, self.available_width, self.available_height)
if self.xanchoraround:
self.xanchor, self.yanchor = polar_to_cartesian(angle, radius, self.xaround, self.yaround)
self.xanchor, self.yanchor = polar_to_cartesian(angle, radius, self.xaround, self.yaround, self.available_width, self.available_height)
def set_radius(self, value):
xpos = first_not_none(self.xpos, self.inherited_xpos, 0)
ypos = first_not_none(self.ypos, self.inherited_ypos, 0)
angle, _radius = cartesian_to_polar(xpos, ypos, self.xaround, self.yaround)
angle, _radius = cartesian_to_polar(xpos, ypos, self.xaround, self.yaround, self.available_width, self.available_height)
radius = value
self.xpos, self.ypos = polar_to_cartesian(angle, radius, self.xaround, self.yaround)
self.xpos, self.ypos = polar_to_cartesian(angle, radius, self.xaround, self.yaround, self.available_width, self.available_height)
if self.xanchoraround:
self.xanchor, self.yanchor = polar_to_cartesian(angle, radius, self.xaround, self.yaround)
self.xanchor, self.yanchor = polar_to_cartesian(angle, radius, self.xaround, self.yaround, self.available_width, self.available_height)
angle = property(get_angle, set_angle)
radius = property(get_radius, set_radius)
@@ -433,14 +513,15 @@ class Transform(Container):
focus=None,
default=False,
_args=None,
alt=None,
**kwargs):
properties = {k: kwargs.pop(k) for k in style_properties if k in kwargs}
self.kwargs = kwargs
self.style_arg = style
super(Transform, self).__init__(style=style, focus=focus, default=default, _args=_args, alt=alt)
super(Transform, self).__init__(style=style, focus=focus, default=default, _args=_args, **properties)
self.function = function
@@ -750,7 +831,21 @@ class Transform(Container):
# The render method is now defined in accelerator.pyx.
def render(self, width, height, st, at):
return transform_render(self, width, height, st, at)
# Prevent time from ticking backwards, as can happen if we replace a
# transform but keep its state.
if st + self.st_offset <= self.st:
self.st_offset = self.st - st
if at + self.at_offset <= self.at:
self.at_offset = self.at - at
self.st = st = st + self.st_offset
self.at = at = at + self.at_offset
# Update the state.
self.update_state()
return RenderTransform(self).render(width, height, st, at)
def event(self, ev, x, y, st):
@@ -947,6 +1042,9 @@ class ATLTransform(renpy.atl.ATLTransformBase, Transform):
return repr((self.child, self.atl.loc))
# Names of style properties that should be sent to the parent.
style_properties = {'alt'}
# Names of transform properties, and if the property should be handled with
# diff2 or diff4.
all_properties = set()
@@ -1025,7 +1123,7 @@ add_property("nearest", bool_or_none, None)
add_property("perspective", any_object, None)
add_property("rotate", float, None)
add_property("rotate_pad", bool, True)
add_property("poi", (float, float, float), None)
add_property("point_to", any_object, None)
add_property("orientation", (float, float, float), None)
add_property("xrotate", float, None)
add_property("yrotate", float, None)
@@ -1077,7 +1175,7 @@ ALIASES = {
"around" : (position, position),
"offset" : (int, int),
"pos" : (position, position),
"radius" : float,
"radius" : position,
"size" : (int, int),
"xalign" : float,
"xcenter" : position,
+5
View File
@@ -639,6 +639,11 @@ class AlphaDissolve(Transition):
super(AlphaDissolve, self).__init__(delay, **properties)
self.control = renpy.display.layout.Fixed()
control = renpy.easy.displayable(control)
if control._duplicatable:
control = control._duplicate(self._args)
self.control.add(control)
self.old_widget = renpy.easy.displayable(old_widget)
+18 -6
View File
@@ -110,19 +110,29 @@ def default_tts_function(s):
fsencode = renpy.exports.fsencode
amplitude = renpy.game.preferences.get_mixer("voice")
amplitude_100 = int(amplitude * 100)
if "RENPY_TTS_COMMAND" in os.environ:
process = subprocess.Popen([ os.environ["RENPY_TTS_COMMAND"], fsencode(s) ])
elif renpy.linux:
if renpy.config.tts_voice is None:
process = subprocess.Popen([ "espeak", fsencode(s) ])
else:
process = subprocess.Popen([ "espeak", "-v", fsencode(renpy.config.tts_voice), fsencode(s) ])
cmd = [ "espeak", "-a", fsencode(str(amplitude_100)) ]
if renpy.config.tts_voice is not None:
cmd.extend([ "-v", fsencode(renpy.config.tts_voice) ])
cmd.append(fsencode(s))
process = subprocess.Popen(cmd)
elif renpy.macintosh:
s = "[[volm {}]]".format(amplitude) + s
if renpy.config.tts_voice is None:
process = subprocess.Popen([ "say", fsencode(s) ])
else:
@@ -137,13 +147,13 @@ def default_tts_function(s):
say_vbs = os.path.join(os.path.dirname(sys.executable), "say.vbs")
s = s.replace('"', "")
process = subprocess.Popen([ "wscript", fsencode(say_vbs), fsencode(s), fsencode(voice) ])
process = subprocess.Popen([ "wscript", fsencode(say_vbs), fsencode(s), fsencode(voice), fsencode(str(amplitude_100)) ])
elif renpy.emscripten and renpy.config.webaudio:
try:
from renpy.audio.webaudio import call
call("tts", s)
call("tts", s, amplitude)
except Exception:
pass
@@ -254,6 +264,8 @@ def displayable(d):
else:
prefix = renpy.translation.translate_string("Self-voicing enabled. ")
last_raw = None
for i in renpy.config.tts_voice_channels:
if not prefix and renpy.audio.music.get_playing(i):
return
+52 -9
View File
@@ -100,6 +100,9 @@ fullscreen = False
# place.
reset_channels = set()
# These store the textures for movies in the same group.
group_texture = { }
def early_interact():
"""
@@ -246,9 +249,15 @@ def get_movie_texture_web(channel, mask_channel, side_mask, mipmap):
return tex, new
def render_movie(channel, width, height):
def render_movie(channel, width, height, group=None):
tex, _new = get_movie_texture(channel)
if group is not None:
if tex is None:
tex = group_texture.get(group, None)
else:
group_texture[group] = tex
if tex is None:
return None
@@ -370,6 +379,13 @@ class Movie(renpy.display.core.Displayable):
If False, the movie will not loop. If `image` is defined, the image
will be displayed when the movie ends. Otherwise, the displayable will
become transparent.
`group`
If not None, this should be a string. If given, and if the movie has not
yet started playing, and another movie in the same group has played in
the previous frame, the last frame from that movie will be used for
this movie. This can prevent flashes of transparency when switching
between two movies.
"""
fullscreen = False
@@ -387,6 +403,7 @@ class Movie(renpy.display.core.Displayable):
play_callback = None
loop = True
group = None
def any_loadable(self, name):
@@ -417,7 +434,6 @@ class Movie(renpy.display.core.Displayable):
if self.mask_channel is not None:
self.mask_channel = self.channel + "_mask"
def ensure_channel(self, name):
if name is None:
@@ -433,7 +449,7 @@ class Movie(renpy.display.core.Displayable):
renpy.audio.music.register_channel(name, renpy.config.movie_mixer, loop=True, stop_on_mute=False, movie=True, framedrop=framedrop, force=True)
def __init__(self, fps=24, size=None, channel="movie", play=None, mask=None, mask_channel=None, image=None, play_callback=None, side_mask=False, loop=True, start_image=None, **properties):
def __init__(self, fps=24, size=None, channel="movie", play=None, mask=None, mask_channel=None, image=None, play_callback=None, side_mask=False, loop=True, start_image=None, group=None, **properties):
global movie_channel_serial
@@ -475,16 +491,23 @@ class Movie(renpy.display.core.Displayable):
self.play_callback = play_callback
self.group = group
if (self.channel == "movie") and (renpy.config.hw_video) and renpy.mobile:
raise Exception("Movie(channel='movie') doesn't work on mobile when config.hw_video is true. (Use a different channel argument.)")
def _handles_event(self, event):
return event == "show"
def set_transform_event(self, event):
if event == "show":
reset_channels.add(self.channel)
def render(self, width, height, st, at):
if self._play and not (renpy.game.preferences.video_image_fallback is True):
channel_movie[self.channel] = self
if st == 0:
reset_channels.add(self.channel)
if channel_movie.get(self.channel, None) is not self:
channel_movie[self.channel] = self
playing = renpy.audio.music.get_playing(self.channel)
@@ -493,6 +516,9 @@ class Movie(renpy.display.core.Displayable):
if self.channel in reset_channels:
not_playing = False
if self.group is not None and self.group in group_texture:
not_playing = False
if (self.image is not None) and not_playing:
surf = renpy.display.render.render(self.image, width, height, st, at)
w, h = surf.get_size()
@@ -505,6 +531,12 @@ class Movie(renpy.display.core.Displayable):
tex, _ = get_movie_texture(self.channel, self.mask_channel, self.side_mask, self.style.mipmap)
if self.group is not None:
if tex is None:
tex = group_texture.get(self.group, None)
else:
group_texture[self.group] = tex
if (not not_playing) and (tex is not None):
width, height = tex.get_size()
@@ -527,7 +559,7 @@ class Movie(renpy.display.core.Displayable):
if not playing:
rv = None
else:
rv = render_movie(self.channel, w, h)
rv = render_movie(self.channel, w, h, group=self.group)
if rv is None:
rv = renpy.display.render.Render(w, h)
@@ -613,7 +645,6 @@ def update_playing():
renpy.game.context().movie = dict(channel_movie)
reset_channels.clear()
def frequent():
"""
Called to update the video playback. Returns true if a video refresh is
@@ -624,6 +655,18 @@ def frequent():
renpy.audio.audio.advance_time()
# Cycle the group textures.
global group_texture
old_group_texture = group_texture
group_texture = { }
for movies in displayable_channels.values():
for m in movies:
if m.group is not None:
group_texture[m.group] = old_group_texture.get(m.group, None)
# Determine if we need to redraw.
if displayable_channels:
update = True
+11 -4
View File
@@ -75,7 +75,7 @@ from renpy.display.image import image_exists, image_exists as has_image, list_im
from renpy.display.image import get_available_image_tags, get_available_image_attributes, check_image_attributes, get_ordered_image_attributes
from renpy.display.image import get_registered_image
from renpy.display.im import load_surface, load_image
from renpy.display.im import load_surface, load_image, load_rgba
from renpy.curry import curry, partial
from renpy.display.video import movie_start_fullscreen, movie_start_displayable, movie_stop
@@ -132,6 +132,7 @@ renpy_pure("unelide_filename")
renpy_pure("known_languages")
renpy_pure("check_text_tags")
renpy_pure("filter_text_tags")
renpy_pure("split_properties")
import time
import sys
@@ -835,6 +836,9 @@ def web_input(prompt, default='', allow=None, exclude='{}', length=None, mask=Fa
renpy.exports.mode('input')
# Take the user out of fullscreen during input.
renpy.game.preferences.fullscreen = False
prompt = renpy.text.extras.filter_text_tags(prompt, allow=set())
roll_forward = renpy.exports.roll_forward_info()
@@ -864,7 +868,7 @@ def web_input(prompt, default='', allow=None, exclude='{}', length=None, mask=Fa
return rv
def input(prompt, default='', allow=None, exclude='{}', length=None, with_none=None, pixel_width=None, screen="input", mask=None, copypaste=True, **kwargs): # @ReservedAssignment
def input(prompt, default='', allow=None, exclude='{}', length=None, with_none=None, pixel_width=None, screen="input", mask=None, copypaste=True, multiline=False, **kwargs): # @ReservedAssignment
"""
:doc: input
@@ -904,6 +908,9 @@ def input(prompt, default='', allow=None, exclude='{}', length=None, with_none=N
`copypaste`
When true, copying from and pasting to this input is allowed.
`multiline`
When true, move caret to next line is allowed.
If :var:`config.disable_input` is True, this function only returns
`default`.
@@ -940,7 +947,7 @@ def input(prompt, default='', allow=None, exclude='{}', length=None, with_none=N
if has_screen(screen):
widget_properties = { }
widget_properties["input"] = dict(default=default, length=length, allow=allow, exclude=exclude, editable=not fixed, pixel_width=pixel_width, mask=mask, copypaste=copypaste)
widget_properties["input"] = dict(default=default, length=length, allow=allow, exclude=exclude, editable=not fixed, pixel_width=pixel_width, mask=mask, copypaste=copypaste, multiline=multiline)
show_screen(screen, _transient=True, _widget_properties=widget_properties, prompt=prompt, **show_properties)
@@ -1447,7 +1454,7 @@ def say(who, what, *args, **kwargs):
e "Hello, world."
$ renpy.say(e, "Hello, world.")
$ e("Hello, world.")
$ e("Hello, world.") # when e is not a string
"""
if renpy.config.old_substitutions:
+10
View File
@@ -47,6 +47,7 @@ cdef class GL2Draw:
cdef tuple default_clip
cdef float dpi_scale
cdef object shader_cache
cdef bint ever_set_position
cdef public tuple clip_rtt_box
@@ -73,6 +74,15 @@ cdef class GL2Draw:
# The framebuffer object used for offscreen rendering.
cdef GLuint fbo
# The color texture object used for pixel tests (1x1).
cdef GLuint color_renderbuffer_1px
# The depth renderbuffer object used for pixel tests. (1x1)
cdef GLuint depth_renderbuffer_1px
# The framebuffer object used for pixel tests (1x1)
cdef GLuint fbo_1px
# The texture_loader singleton.
cdef public TextureLoader texture_loader
+97 -15
View File
@@ -76,6 +76,9 @@ vsync = True
# A list of frame end times, used for the same purpose.
frame_times = [ ]
# The default position of the window.
default_position = (pygame.WINDOWPOS_CENTERED, pygame.WINDOWPOS_CENTERED)
cdef class GL2Draw:
def __init__(self, name):
@@ -121,6 +124,9 @@ cdef class GL2Draw:
# The shader cache,
self.shader_cache = None
# Has the position of this window ever been set?
self.ever_set_position = False
def get_texture_size(self):
"""
Returns the amount of memory locked up in textures.
@@ -142,7 +148,7 @@ cdef class GL2Draw:
if old_surface is not None:
maximized = old_surface.get_flags() & pygame.WINDOW_MAXIMIZED
else:
maximized = False
maximized = renpy.game.preferences.maximized
# Information about the virtual size.
vwidth, vheight = self.virtual_size
@@ -370,6 +376,10 @@ cdef class GL2Draw:
self.window = None
if self.window is None:
if renpy.game.preferences.maximized:
window_flags |= pygame.WINDOW_MAXIMIZED
try:
renpy.display.log.write("Windowed mode.")
self.window = pygame.display.set_mode((pwidth, pheight), window_flags)
@@ -440,22 +450,35 @@ cdef class GL2Draw:
# Are we in fullscreen mode?
fullscreen = bool(pygame.display.get_window().get_window_flags() & (pygame.WINDOW_FULLSCREEN_DESKTOP | pygame.WINDOW_FULLSCREEN))
# Are we maximized?
maximized = bool(pygame.display.get_window().get_window_flags() & pygame.WINDOW_MAXIMIZED)
# See if we've ever set the screen position, and if not, center the window.
if not fullscreen and not maximized:
if not self.ever_set_position:
self.ever_set_position = True
pygame.display.get_window().set_position(default_position)
# Get the size of the created screen.
pwidth, pheight = renpy.display.core.get_size()
renpy.game.preferences.fullscreen = fullscreen
renpy.game.interface.fullscreen = fullscreen
vwidth, vheight = self.virtual_size
self.physical_size = (pwidth, pheight)
self.drawable_size = pygame.display.get_drawable_size()
if not fullscreen:
renpy.game.preferences.physical_size = self.get_physical_size()
renpy.display.log.write("Screen sizes: virtual=%r physical=%r drawable=%r" % (self.virtual_size, self.physical_size, self.drawable_size))
# Update the preferences.
renpy.game.preferences.fullscreen = fullscreen
renpy.game.interface.fullscreen = fullscreen
if not fullscreen:
renpy.game.preferences.maximized = maximized
if not fullscreen and not maximized:
renpy.game.preferences.physical_size = self.get_physical_size()
if renpy.config.adjust_view_size is not None:
view_width, view_height = renpy.config.adjust_view_size(pwidth, pheight)
else:
@@ -542,8 +565,12 @@ cdef class GL2Draw:
width = max(width, 256)
height = max(height, 256)
pygame.display.get_window().restore()
pygame.display.get_window().resize((width, height), opengl=True, fullscreen=fullscreen)
if pygame.display.get_window().get_window_flags() & pygame.WINDOW_FULLSCREEN:
maximized = renpy.game.preferences.maximized
else:
maximized = False
pygame.display.get_window().resize((width, height), opengl=True, fullscreen=fullscreen, maximized=maximized)
def update(self, force=False):
"""
@@ -568,6 +595,18 @@ cdef class GL2Draw:
Called when terminating the use of the OpenGL context.
"""
global default_position
# Are we in fullscreen mode?
fullscreen = bool(pygame.display.get_window().get_window_flags() & (pygame.WINDOW_FULLSCREEN_DESKTOP | pygame.WINDOW_FULLSCREEN))
# Are we maximized?
maximized = bool(pygame.display.get_window().get_window_flags() & pygame.WINDOW_MAXIMIZED)
# See if we've ever set the screen position, and if not, center the window.
if not fullscreen and not maximized:
default_position = pygame.display.get_position()
self.kill_textures()
if self.texture_loader is not None:
@@ -611,11 +650,14 @@ cdef class GL2Draw:
# Generate the framebuffer.
glGenFramebuffers(1, &self.fbo)
glGenFramebuffers(1, &self.fbo_1px)
glGenRenderbuffers(1, &self.color_renderbuffer)
glGenRenderbuffers(1, &self.color_renderbuffer_1px)
if renpy.config.depth_size:
glGenRenderbuffers(1, &self.depth_renderbuffer)
glGenRenderbuffers(1, &self.depth_renderbuffer_1px)
glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_texture_size)
glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE, &max_renderbuffer_size)
@@ -642,6 +684,7 @@ cdef class GL2Draw:
self.texture_loader.max_texture_width = width
self.texture_loader.max_texture_height = height
# Full-size fbo.
self.change_fbo(self.fbo)
glBindRenderbuffer(GL_RENDERBUFFER, self.color_renderbuffer)
@@ -672,6 +715,37 @@ cdef class GL2Draw:
GL_RENDERBUFFER,
self.depth_renderbuffer)
# 1px fbo.
self.change_fbo(self.fbo_1px)
glBindRenderbuffer(GL_RENDERBUFFER, self.color_renderbuffer_1px)
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1)
glFramebufferRenderbuffer(
GL_FRAMEBUFFER,
GL_COLOR_ATTACHMENT0,
GL_RENDERBUFFER,
self.color_renderbuffer_1px)
if renpy.config.depth_size:
glBindRenderbuffer(GL_RENDERBUFFER, self.depth_renderbuffer_1px)
if self.gles:
if renpy.config.depth_size >= 24:
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT24, 1, 1)
else:
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, 1, 1)
else:
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, 1, 1)
glFramebufferRenderbuffer(
GL_FRAMEBUFFER,
GL_DEPTH_ATTACHMENT,
GL_RENDERBUFFER,
self.depth_renderbuffer_1px)
glBindRenderbuffer(GL_RENDERBUFFER, default_renderbuffer)
self.change_fbo(self.default_fbo)
@@ -680,12 +754,20 @@ cdef class GL2Draw:
self.change_fbo(self.default_fbo)
# Full-size fbo.
glDeleteFramebuffers(1, &self.fbo)
glDeleteRenderbuffers(1, &self.color_renderbuffer)
if renpy.config.depth_size:
glDeleteRenderbuffers(1, &self.depth_renderbuffer)
# 1px fbo.
glDeleteFramebuffers(1, &self.fbo_1px)
glDeleteRenderbuffers(1, &self.color_renderbuffer_1px)
if renpy.config.depth_size:
glDeleteRenderbuffers(1, &self.depth_renderbuffer_1px)
def can_block(self):
"""
@@ -940,7 +1022,7 @@ cdef class GL2Draw:
self.load_all_textures(what)
# Switch to the right FBO, and the right viewport.
self.change_fbo(self.fbo)
self.change_fbo(self.fbo_1px)
# Set up the viewport.
glViewport(0, 0, 1, 1)
@@ -1149,7 +1231,7 @@ cdef class GL2DrawingContext:
"""
cdef float halfwidth
cdef float halfheigh
cdef float halfheight
# This is the equivalent of projecting (0, 0, 0, 1), and getting x and y.
cdef float sx = transform.xdw
@@ -1175,9 +1257,6 @@ cdef class GL2DrawingContext:
if model.reverse is not IDENTITY:
transform = transform * model.reverse
if properties["pixel_perfect"]:
transform = self.correct_pixel_perfect(transform)
# If a clip polygon is in place, clip the mesh with it.
if clip_polygon is not None:
@@ -1271,10 +1350,13 @@ cdef class GL2DrawingContext:
has_reverse = (r.reverse is not None) and (r.reverse is not IDENTITY)
if r.properties and r.properties.get("pixel_perfect", False) and properties["pixel_perfect"] is None:
transform = self.correct_pixel_perfect(transform)
if has_reverse or r.properties:
properties = self.merge_properties(properties, r.properties)
if has_reverse and (properties["pixel_perfect"] is None):
if has_reverse:
properties["pixel_perfect"] = False
if r.shaders is not None:
+8 -8
View File
@@ -8,11 +8,11 @@ cdef class AttributeLayout:
# A map from a string giving the name of the attribute to the
# offset of the attribute.
cdef dict offset
cdef public dict offset
# The number of floats that make up the attributes for a single
# point.
cdef int stride
cdef public int stride
cdef class Mesh:
"""
@@ -21,28 +21,28 @@ cdef class Mesh:
"""
# The number of points that space has been allocated for.
cdef int allocated_points
cdef public int allocated_points
# The number of points that are in use.
cdef int points
cdef public int points
# The data corresponding to each point.
cdef float *point_data
# The number of floats corresponding to each point.
cdef int point_size
cdef public int point_size
# An AttributeLayout object controlling how attributes are stored.
cdef AttributeLayout layout
cdef public AttributeLayout layout
# The non-geometry attribute data. This is allocated_points * attribute_per_point in size.
cdef float *attribute
# The number of triangles that spaces has been allocated for.,
cdef int allocated_triangles
cdef public int allocated_triangles
# The number of triangles that are in use.
cdef int triangles
cdef public int triangles
# The triangle data, where each triangle consists of the index of three
# points. This is 3 * allocated_triangles in size.
+74
View File
@@ -32,6 +32,80 @@ TEXTURE_LAYOUT.add_attribute("a_tex_coord", 2)
cdef class Mesh:
def set_geometry_data(self, geometry):
"""
Sets the geometry data corresponding to this mesh.
`geometry`
This should be a sequence of floats, which are interpreted
as x, y for a Mesh2 or x, y, z for a Mesh3. The length of
the sequence must be a multiple of the point size of the
mesh, and must be less than or equal to the number of
allocated points.
This sets the `points` attribute of the mesh to the number of
points in the geometry.
"""
points = len(geometry) // self.point_size
if points > self.allocated_points:
raise Exception("Geometry contains too much data.")
self.points = points
cdef int i
cdef int len_geometry = len(geometry)
for 0 <= i < len_geometry:
self.point_data[i] = geometry[i]
def set_attribute_data(self, attributes):
"""
Sets the attribute data corresponding to this mesh.
`attributes`
This should be a list of floats, with the first
layout.stride floats corresponding to the first point, the
next layout.stride floats corresponding to the second point,
and so on. The length of the sequence must be a multiple of
the stride of the layout, and must be less than or equal to
the number of allocated points.
"""
cdef int i
cdef int len_attributes = len(attributes)
if len_attributes > self.allocated_points * self.layout.stride:
raise Exception("Attributes contains too much data.")
for 0 <= i < len_attributes:
self.attribute[i] = attributes[i]
def set_triangle_data(self, triangles):
"""
Sets the triangle data corresponding to this mesh.
`triangles`
This should be a list of integers, with each triple
corresponding to a triangle. The length of the sequence
must be a multiple of 3, and must be less than or equal to
the number of allocated triangles.
This sets the `triangles` attribute of the mesh to the number
of triangles given here.
"""
cdef int i
cdef int len_triangles = len(triangles)
if len_triangles > self.allocated_triangles * 3:
raise Exception("Triangles contains too much data.")
self.triangles = len_triangles // 3
for 0 <= i < len_triangles:
self.triangle[i] = triangles[i]
def get_triangles(self):
"""
Returns the triangles that make up this mesh as triples.
+1 -1
View File
@@ -105,7 +105,7 @@ class ShaderPart(object):
used.add(m.group(0))
for l in variables.split("\n"):
l = l.strip(' ;')
l = l.partition("//")[0].strip(' ;')
a = l.split()
if not a:
+1 -1
View File
@@ -37,7 +37,7 @@ cdef class TextureLoader:
# The total size (in bytes) of all the textures that have been allocated
# but not deallocated.
cdef int total_texture_size
cdef object total_texture_size
# The program used for fast texture loading
cdef Program ftl_program

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