Compare commits

...

1990 Commits

Author SHA1 Message Date
Tom Rothamel b805b0b526 Remove debug prints. 2016-12-10 21:57:51 -05:00
Tom Rothamel 4585246ad8 tutorial: Add from to calls. 2016-12-10 21:57:33 -05:00
Tom Rothamel 3b35174ff5 tl/japanese: Set gui.language.
Per #1064.
2016-12-10 21:51:35 -05:00
Tom Rothamel 7d732781e0 gui: Add a define for the language (used to control line-breaking). 2016-12-10 21:49:01 -05:00
Tom Rothamel b16caee9ea Support adding arbitrary code to a translation.
(Not currently documented, as it's not clear there's a good use for
this.)
2016-12-10 21:38:51 -05:00
Tom Rothamel 37049fecf3 Only update defines in gui.rpy. 2016-12-09 21:51:59 -05:00
Tom Rothamel 75ec77ab64 Enable launcher testcases. 2016-12-09 21:50:25 -05:00
Tom Rothamel 87feeb5e51 Merge pull request #1089 from nyaatrap/master
Remove trailing ' from comment for translation
2016-12-08 10:12:56 -05:00
nyaatrap 48bcf1bbf0 Remove trailing ' from comment for translation 2016-12-08 21:37:42 +09:00
Tom Rothamel 1579e3cbc7 Merge pull request #1088 from nyaatrap/master
Update Japanese translation
2016-12-07 23:26:41 -05:00
Tom Rothamel a7d19a2932 Properly scale clipped render-to-texture.
See https://lemmasoft.renai.us/forums/viewtopic.php?p=436487#p436487 . The issue
turned out to be that the draw needed to be scaled properly on a highdpi
system.
2016-12-07 22:01:07 -05:00
nyaatrap 83595e6dc9 Japanese translation: fix gamepad help 2016-12-08 11:21:01 +09:00
nyaatrap c9bcd34cd5 Japanese translation: Add weekday 2016-12-08 11:08:39 +09:00
Tom Rothamel 14807d120e Add a stop_skipping key.
Supports #1086.
2016-12-06 23:39:29 -05:00
Tom Rothamel 1263765cb7 gamepad: Support a neutral position for analog controller axes.
For #1086.
2016-12-06 23:38:57 -05:00
Tom Rothamel 9bc13f9f74 Fix translation of weekdays and months.
Yeah, forgot to actually assign the result to a variable.
2016-12-06 21:21:08 -05:00
Tom Rothamel 8fead122b6 Remove obsolete show_ variables. 2016-12-05 23:51:04 -05:00
Tom Rothamel cdd7b175fe Fix unbound variables.
Fixes #1085.
2016-12-05 23:48:45 -05:00
Tom Rothamel 1e56de4aed Merge pull request #1083 from nyaatrap/master
Add Japanese translation for new gui
2016-12-05 22:36:13 -05:00
Tom Rothamel b68455b391 Set the default font in the launcher.
As per #1064.
2016-12-05 22:34:11 -05:00
Tom Rothamel e4079bbceb testcases: Change GUI. 2016-12-04 09:22:25 -06:00
Tom Rothamel 43123177ab Fix unicode-related error. 2016-12-04 09:21:46 -06:00
Tom Rothamel 48c281bb1a testcases: Extract dialogue. 2016-12-04 08:03:03 -06:00
Tom Rothamel e5501d2aec Add translation testcases. 2016-12-03 12:09:16 -06:00
Tom Rothamel 9168b380a8 Add omitted return statement. 2016-12-03 12:08:50 -06:00
Tom Rothamel 75625abaf5 A pair of basic launcher testcases. 2016-12-03 11:38:51 -06:00
nyaatrap 5c1c882222 Revise Japanese Translation
-ボタン以外英単語のみ前後に半角スペース

-無生物主語の受動態を能動態に

-指示代名詞を名詞に
2016-12-03 16:12:04 +09:00
nyaatrap 39c3a39d6a Merge github.com:renpy/renpy 2016-12-03 15:17:02 +09:00
Tom Rothamel 7a45089b69 Fix spurious double-parenthesizing of print statements.
Not sure how this happened.
2016-12-02 12:53:49 -05:00
Tom Rothamel c323080002 Viewport and VPGrid take subsurfaces.
This should improve performance when clipping is enabled, and
might deal with some weird code that places a child outside
the borders of a viewport.
2016-12-02 00:51:34 -05:00
Tom Rothamel 27a7ce745c Fix translation problem and documentation.
Per the 3 most recent comments on #1064.
2016-12-01 22:19:20 -05:00
nyaatrap 2ebf885caf Add short tutorial on Japanese template 2016-12-02 01:08:36 +09:00
nyaatrap fe8786782d Proofread Japanese translation 2016-12-01 19:37:15 +09:00
nyaatrap 67cfaef550 Merge github.com:renpy/renpy 2016-12-01 13:17:00 +09:00
Tom Rothamel 2ee8202c94 update: Fix an issue with unicode strings and non-English directories. 2016-11-30 20:40:18 -05:00
Tom Rothamel 54edc4fa73 update: Add environment variable to force updates. 2016-11-30 20:37:24 -05:00
Tom Rothamel ed313eb3bb Merge pull request #1082 from XelaPy/master
- Fixes Lint Exception:
2016-11-30 20:17:14 -05:00
Tom Rothamel 52d7309d6d Ensure known_languages never returns None. 2016-11-30 20:03:53 -05:00
Tom Rothamel 05e2521c66 Make last change compatible with old saves. 2016-11-29 21:45:11 -05:00
Tom Rothamel 2723f8d348 Take the state of the old transform that was an image target.
This fixes the behavior of a Transform -> ImageReference -> Transform
case to be the same as it was in 6.99.10 and before.
2016-11-29 21:43:10 -05:00
nyaatrap ea26518809 Merge github.com:renpy/renpy 2016-11-29 21:24:25 +09:00
Tom Rothamel 1194379c99 Check in utility script. 2016-11-29 01:16:48 -05:00
Tom Rothamel 7e409222f2 Add Ren'Py libraries to LD_LIBRARY_PATH if it exists.
This is required because on Linux, Steam sets LD_LIBRARY_PATH to
something that contains the SDL libraries. Since these aren't the
libraries we ship, functionality (ie. WEBP support) could be missing.
2016-11-28 22:28:57 -05:00
XelaPy 293cd92687 Fixes small mistake in the docs 2016-11-28 17:58:49 +02:00
nyaatrap 1748c52d44 Japanee translation for new gui 2016-11-29 00:01:01 +09:00
XelaPy a24f9d0a27 - Fixes Lint Exception:
AttributeError: 'FontGroup' object has no attribute 'lstrip'

where DragGroup is mistaken for font path string.
2016-11-27 21:49:11 +02:00
Tom Rothamel 74a22c8a97 Merge pull request #1077 from xavi-mat/master
Update some strings is Spanish translation / Found some typos in gui/screens.rpy
2016-11-27 12:30:17 -05:00
Tom Rothamel caf83facf7 Disable planetarium mode. 2016-11-26 20:58:11 -05:00
Tom Rothamel 170457f25a Fix testcases. 2016-11-26 11:53:24 -05:00
Tom Rothamel aeb27db6d1 Commit missed change. 2016-11-26 11:03:34 -05:00
Tom Rothamel 9d4f0b3a1e Let code control if transitions are suppressed after rollback.
This is in support of the id.
2016-11-25 22:43:48 -05:00
Tom Rothamel f002bd6142 Add :s in the text-to-speech code to provide pauses.
Fixes #1080.
2016-11-25 16:00:13 -05:00
Tom Rothamel da696761ee Use a localized font in the gui example. 2016-11-25 00:25:31 -05:00
Tom Rothamel f93f7a604c Use a unicode-friendly wrapping algorithing when wrapping comments. 2016-11-24 22:56:42 -05:00
Tom Rothamel ca24ee64de Add a unicode-aware function for wrapping non-displayed text.
This function classifies characters in to full and half width,
and then performs wrapping into unicode strings based on what
it decides.
2016-11-24 14:23:53 -05:00
Tom Rothamel b5e008b028 Update the piglatin translation. 2016-11-23 22:32:06 -05:00
Tom Rothamel 280cd624ea Make the PROJECTS label translatable. 2016-11-23 22:19:26 -05:00
Tom Rothamel 4b8eb3eae1 Add a variable to control display of the quick menu. 2016-11-22 19:25:03 -05:00
Tom Rothamel 4659bcbbe8 Report duplicate labels.
Fixes #958.
2016-11-21 22:47:29 -05:00
Tom Rothamel 6f262eaeb7 Deal with _menu not existing on the context.
(Certain error handling cases.)
2016-11-21 22:46:28 -05:00
Tom Rothamel 38c1897c67 Detect duplicate labels. 2016-11-21 22:25:54 -05:00
Tom Rothamel bb688a6eba Store the new size when renpy.set_physical_size is called.
Fixes #1073.
2016-11-21 00:55:20 -05:00
Tom Rothamel f13437a0a4 Only clip when necessary.
The new GUI uses clipping on almost every screen. This slows things down, and
can cause problems on buggy drivers. With this change, we only use clipping
when necessary, and hence makes such problems less obvious.

(We can't fix the drivers, but we can work around them a little.)
2016-11-20 11:12:16 -05:00
Tom Rothamel 521fb426c1 Automatically select a channel for movie playback.
Fixes #1079.
2016-11-19 22:47:44 -05:00
Tom Rothamel b8f4e05929 Fix iap documentation. 2016-11-19 22:45:32 -05:00
Tom Rothamel f1c40a7b1d Remove fonts from legacy project templates.
We use copies of the fonts found in the launcher, and project.json
can now have a new font field that tells Ren'Py to copy the font
over.
2016-11-18 23:33:36 -05:00
Tom Rothamel 4805d4edd7 Modify the tutorial to use the fonts found in the launcher.
This eliminates a pair of duplicated fonts, reducing the total
size of Ren'Py.
2016-11-18 21:46:29 -05:00
Tom Rothamel 5710f4ce68 Move fonts into a central directory.
This will be shared in multiple places, and already gets rid of
multiple copies of DroidSansFallback.ttf.
2016-11-18 21:10:41 -05:00
Tom Rothamel dcd0f44f7c Add script. 2016-11-18 00:04:04 -05:00
Tom Rothamel 29c18d4f2c Deal with a read only projects directory. 2016-11-17 22:40:30 -05:00
Tom Rothamel 22dcfdaed6 Record abnormal vs normal transfer of control in the line log. 2016-11-16 23:23:20 -05:00
Tom Rothamel f364524241 Create LineLogEntry objects.
These let us structure the line log in a way a tuple will not.
2016-11-16 22:45:26 -05:00
Tom Rothamel 9ca789e62c Ensure we use byte strings for various filenames. 2016-11-15 18:50:45 -05:00
Tom Rothamel 5a265030df Encode save_directory before it's used. 2016-11-15 18:40:40 -05:00
xavi-mat bd15baa2e5 Updated som Spanish translations
Translated some more Spanish strings. Focus only in the final player, not the developer.
2016-11-15 23:39:19 +01:00
xavi-mat ef7c4b5280 Update screens.rpy 2016-11-15 23:36:15 +01:00
Tom Rothamel 63e381db92 Preserve object identity when restoring a style backup.
This is important for StylePreferences, where we want object
identity to remain the same so we can update the object even
after restoring a style backup.
2016-11-14 22:43:55 -05:00
Tom Rothamel 5d6635d642 Apply style preferences after deferred style creation. 2016-11-14 21:56:26 -05:00
Tom Rothamel 55e146b18e Check in a piglatin style files.
By using the Chinese font, we can make sure that all the game
generation stuff works.
2016-11-13 12:59:21 -05:00
Tom Rothamel ec981da41d When formatted, a character object returns its name. 2016-11-12 18:03:27 -05:00
Tom Rothamel 1dd6df55b9 Fix problems with Text._in_current_store().
Fixes #1071.
2016-11-12 14:09:26 -05:00
Tom Rothamel 33c5948763 Remove debug print. 2016-11-11 23:54:10 -05:00
Tom Rothamel ec696a728d Do not clear the voice data when interacting with a menu. 2016-11-11 22:08:18 -05:00
Tom Rothamel 2bf37063f5 Codesigning mac may take a long time. 2016-11-10 21:36:36 -05:00
Tom Rothamel 92f6db7ba3 Ensure update_fn is defined when used. 2016-11-10 01:03:20 -05:00
Tom Rothamel 912444f107 Fix the search for renpy.py. 2016-11-10 01:01:57 -05:00
Tom Rothamel f1d7d3e59b Include the common python code in the MacOS directory of the mac app.
This makes sure we detect and run it properly.
2016-11-10 00:12:25 -05:00
Tom Rothamel 1a7d06ae0f Update documentation. 2016-11-09 22:46:45 -05:00
Tom Rothamel 3764b128fe Only enable config.rtl when arabic is used.
Fixes a crash on mac in the launcher.
2016-11-09 22:42:33 -05:00
Tom Rothamel c6fe17446d Update the changelog. 2016-11-08 17:54:09 -05:00
Tom Rothamel b35fbb7ac1 More fixes to persistent.
Per https://lemmasoft.renai.us/forums/viewtopic.php?f=32&t=41056
2016-11-06 19:49:22 -05:00
Tom Rothamel ee619f2eef Call voice_sustain while hiding the interface.
This ensures voice replay works after we get back.
2016-11-06 10:55:01 -05:00
Tom Rothamel da7d7d1060 Add an all-in-one build to support Steam. 2016-11-06 00:21:06 -04:00
Tom Rothamel 246a146218 Preserve looping across renpy.music.play(..., if_changed=True).
This fixes a problem where renpy.music.play(..., if_changed=True)
would requeue the current track, which would cause it to start
playing from the beginning, rather than the loop point.

Now, if the music hasn't changed we just update the loop, which
causes it to start playing from the loop point.

Fixes #1055.
2016-11-06 00:12:40 -04:00
Tom Rothamel b5b3caa599 Use a two-step process to write the persistent file.
This ensures there's always a valid file on the disk, after the
initial creation process.

Fixes #1070.
2016-11-05 14:44:20 -04:00
Tom Rothamel 2d10bb0ff6 Add the DisableAllInputValues action. 2016-11-04 22:34:55 -04:00
Tom Rothamel 2de85f1341 Ensure the preferences are merged into persistent properly.
Fixes #1065.
2016-11-04 21:53:15 -04:00
Tom Rothamel cf9bf04d39 viewport: Add mousewheel "change"
This is a mode where the viewport only eats the mousewheel
if it would cause it to change. Doing so make it possible
for other code to handle the same event - for example, code
like:

    screen history():
        # ...

        key "viewport_wheeldown" action Return()

        viewport:
            mousewheel "change"
            # ...

Will dismiss the viewport if scrolling down doesn't cause the
viewport to change.
2016-11-03 19:24:21 -04:00
Tom Rothamel 3b21ab2650 Implement gui.system_font.
This is a variable that is used to set style._default.font, in both
normal and error conditions. This helps when None is translated into
a language that can't be represented by DejaVuSans.
2016-11-03 01:34:34 -04:00
Tom Rothamel 31557de26f Set gui.system_font when generating a new game.
This is a font that is used by error handling and other things
that use the _default style.
2016-11-03 01:22:58 -04:00
Tom Rothamel 92f51c12d9 tl: Load translations for the None language from common.rpym.
The idea here is that this loads the translations before an
error can occur, making it possible to display parse errors
in a localized language.
2016-11-03 00:16:36 -04:00
Tom Rothamel e0e08285f9 Set the _default font if a language font is set in the launcher. 2016-11-02 21:50:44 -04:00
Tom Rothamel 0b2f8e8799 Remove double-comments from script.rpy.
They're no longer neeeded, now that script.rpy is not translated.
2016-11-01 23:41:41 -04:00
Tom Rothamel b9c6bc1417 Flag comments as translatable.
As per #1064.
2016-11-01 23:41:12 -04:00
Tom Rothamel af579bf593 launcher: Back -> Return
This frees the word "Back" up for rollback.
2016-11-01 21:51:39 -04:00
Tom Rothamel 8a3d4f8554 Stop maintaining _child_uses_store. 2016-10-31 22:57:02 -04:00
Tom Rothamel 678d08c165 _in_current_store: don't use _child_uses_store
The latter proved hard to maintain, as it could changed as children
transitively changed. It's just easier to recurse everything when
it's time to make the copy.
2016-10-31 22:52:38 -04:00
Tom Rothamel d6560bc4bb Add _in_current_store to the child of a screen. 2016-10-31 01:10:29 -04:00
Tom Rothamel dd27ab0f73 Fix bugs in the current store stuff. 2016-10-31 01:10:07 -04:00
Tom Rothamel faf9a6d364 Rename variables introduced in last two commits.
These care about the store, not the scope.
2016-10-30 23:15:40 -04:00
Tom Rothamel 3681d4d306 Before a transition, copy displayables that used the current store.
This has the effect of "locking" DynamicImage before a transition,
so that the transition changes it from the old value of the variables
to the new value.

Fixes #1067.
2016-10-30 22:43:56 -04:00
Tom Rothamel 9198d5a7c5 Rename _in_old_scene -> _in_current_scope(). 2016-10-30 16:31:48 -04:00
Tom Rothamel dda5d1a4e5 Support dotted namespaces in python code. 2016-10-29 17:04:54 -04:00
Tom Rothamel 1f90221770 Property create namespaces with dots in them.
Previously, doing something like:

   default a.b.c = 42

would not create a variable named b in the store.a namespace. (It would
create 'a.b' in the store namespace, which is wrong.) This fixes that.
2016-10-29 16:54:20 -04:00
Tom Rothamel d375359a6b Make trans_pause available during the start_interact_callbacks.
This supports the id.
2016-10-29 16:17:55 -04:00
Tom Rothamel 01a30059e8 Update changelog. 2016-10-28 01:16:35 -04:00
Tom Rothamel cd7aadfb23 More work on the changelog. 2016-10-27 19:28:53 -04:00
Tom Rothamel 59efb70c9b Changelog. 2016-10-26 23:42:16 -04:00
Tom Rothamel 1cf1f7269c Add the mac changes to the changelog. 2016-10-25 23:40:18 -04:00
Tom Rothamel 0c9a4f579e Only add pc and mac if they're not there already. 2016-10-25 21:18:50 -04:00
Tom Rothamel 043f24d0dc Replace -all with "pc" and "mac". 2016-10-25 21:17:42 -04:00
Tom Rothamel 2cbf4689c8 Remove the -all distribution, replace it with a -pc one.
This removes the mac app from -all, since the mac all in a
-all.zip won't work very well.
2016-10-25 21:05:02 -04:00
Tom Rothamel 02412a4217 Do not duplicate layers.
There's no point in duplicating a layer, and doing so will duplicate
everything on it - causing transforms to not work properly, perhaps
among other problems.

Fixes #1034.
2016-10-25 02:22:11 -04:00
Tom Rothamel 1cfa873734 Finish translating Ren'Py documentation. 2016-10-23 23:49:28 -04:00
Tom Rothamel b7b2f36b04 lt: Make translate_font set gui.REGULAR_BOLD.
Then remove the code it makes redundant.
2016-10-23 23:44:58 -04:00
Tom Rothamel 20f157e875 tl: Ensure RTL is enabled in a newly-generated Arabic game. 2016-10-23 17:33:11 -04:00
Tom Rothamel bb7160f278 tl: Reorganize launcher translations.
This involves extracting translations from the old launcher transations
and the template games, deleting the old translation, generating a new
translation, merging in the strings. Then font and style files were
copied from old->new, and the translation was cleaned up to remove
TODOs.
2016-10-22 23:58:22 -04:00
Tom Rothamel 10dd1549a1 tl: extract_strings fixes and additional functionality. 2016-10-22 23:53:40 -04:00
Tom Rothamel 8f0e19dcb3 Fix some instances of obsolete syntax. 2016-10-22 13:18:58 -04:00
Tom Rothamel bf517e73fb Apply autopep8 to improve code style. 2016-10-22 00:13:38 -04:00
Tom Rothamel 939530525a Support passing positional arguments to a game menu screen.
Fixes #1059.
2016-10-21 21:30:28 -04:00
Tom Rothamel 5b562b8a25 scriptedit: Remove nodes from the namemap.
This lets rollback work with node removal - we'll go back to the next
node instead.
2016-10-21 01:14:11 -04:00
Tom Rothamel aa81539448 Merge pull request #1057 from bvtsang/patch-1
s/laterr/later/
2016-10-20 23:52:34 -04:00
Tom Rothamel c4c4e09858 tl: Support merging when extracing strings.
Command-line only.
2016-10-20 23:13:12 -04:00
Tom Rothamel 2623276132 Delete dynamically created styles on reset.
This fixes a problem caused by created styles coming into existence
during translation.
2016-10-20 00:08:33 -04:00
Tom Rothamel e3e0301544 launcher: Update translations.
This updates the translations to work with the new ordering -
which allows a massive simplification of the translation
code.
2016-10-20 00:06:00 -04:00
Tom Rothamel e1ccfee28f Avoid memory allocation during parsing. 2016-10-19 19:20:46 -04:00
Tom Rothamel 52b61f9cc6 Merge pull request #1060 from jsfehler/minor_fixes
Fix a few typos in docstrings
2016-10-19 19:10:12 -04:00
Joshua Fehler a67727a6fb Fix a few typos in docstrings 2016-10-19 08:27:16 -04:00
Tom Rothamel 135304e5e6 tl: Add the translate_font function.
This is designed to set the font in the launcher and the generated
game, all in one go.
2016-10-19 00:06:51 -04:00
Tom Rothamel 6f243367c0 tl: A callback that is called on language changes. 2016-10-19 00:04:58 -04:00
Tom Rothamel d43ae24dfa launcher: More complete underlay.
This makes launcher dev/translation easier, by allowing developers
to use things like shift+I and shift+R during launcher development.
2016-10-18 20:07:52 -04:00
Tom Rothamel 1bba35e970 Fix skip indicator. 2016-10-18 01:34:18 -04:00
Tom Rothamel 63477b8f06 tl: Ensure translate python blocks run before deferred styles.
This was the intended (and documented) behavior, but a second change
flipped the order.
2016-10-18 00:14:30 -04:00
Tom Rothamel 962697a55e Generate docs. 2016-10-17 22:11:30 -04:00
Tom Rothamel 53ce99e95e tl: Start documenting how to translate Ren'Py itself. 2016-10-17 22:08:13 -04:00
Tom Rothamel 29c797141c tl: Land piglatin translation.
What every game engine needs.
2016-10-17 01:55:56 -04:00
Tom Rothamel fa34fae53d tl: Change how we translate script.rpy.
In general, script.rpy wants to be totally customized for each
language. So if it exists, we'll copy launcher/game/tl/<language>/script.rpym
over script.rpy, allowing translators to customize it in any way they
fancy.
2016-10-17 01:51:29 -04:00
Tom Rothamel 9c8521b18a tl: Update default interface translations.
This is a function that copies strings from the current launcher
translation into the None translation of the project. (Thus
translating the Ren'Py strings used by the interface.)
2016-10-16 23:53:34 -04:00
Tom Rothamel 9f8cdc6f6a tl: Various things to support common translations. 2016-10-16 22:12:06 -04:00
Bryan Tsang 4311ef6c40 s/laterr/later/ 2016-10-16 17:52:07 -07:00
Tom Rothamel 8c6b0faac0 tl: Special mode for translating the launcher.
This puts everything in a small number of files, which should make
it more obvious the order in which to translate stuff.
2016-10-16 01:27:46 -04:00
Tom Rothamel e583e00626 tl: Take priorities while generating translations. 2016-10-15 22:16:45 -04:00
Tom Rothamel 8c697def79 tl: Give a priority to translatable strings.
This tries to ensure that a string is translated as part of the
"right" file - for example, it's translated as part of the
screens.rpy translation, rather than _layouts/something_screen.

The goal is to provide a logical order to the translaton process.
2016-10-15 21:59:48 -04:00
Tom Rothamel 9564402416 tl: Move around and remove various translatable strings.
The idea here is to make Ren'Py easier to translate by removing
strings that are either obsolete, or that it doesn't make sense
to translate.
2016-10-15 21:38:43 -04:00
Tom Rothamel dbeb0c1646 coverage: Simple launcher script. 2016-10-15 01:19:50 -04:00
Tom Rothamel 963bf51f12 coverage: Bring up to date with the latest Ren'Py. 2016-10-15 01:19:27 -04:00
Tom Rothamel 192bda6a49 tl: Reimplement the "translate --count" command.
To use the new string-scanning code.
2016-10-14 23:55:15 -04:00
Tom Rothamel 8943820914 tl: Ensure each string is generated once. 2016-10-14 22:35:03 -04:00
Tom Rothamel 7362bbfb31 tl: Generate strings from String objects. 2016-10-14 01:47:07 -04:00
Tom Rothamel cef08c6b47 translate: Refactor generation.
* Cache translation files, so a single file can be opened from
  multiple places.
* Separate translate generation from string generation and counting.
2016-10-13 23:33:20 -04:00
Tom Rothamel 14e2435229 strings: Centralize the filename list code in one place. 2016-10-12 23:35:54 -04:00
Tom Rothamel 638ef01636 Move string scanning into its own file, so that we can use the
strings for other things.
2016-10-12 22:53:47 -04:00
Tom Rothamel fbe53dc7ef Include the idna encoding.
Fixes #1054.
2016-10-11 17:34:54 -04:00
Tom Rothamel 4b8f659566 iap: Pull product/pricing data at startup, on iOS. 2016-10-10 17:05:13 -04:00
Tom Rothamel 481cf69bb2 Properly slice log in the upgrade case.
Fixes #1052.
2016-10-10 17:00:00 -04:00
Tom Rothamel 9522de1849 iap: Use byte strings for class names. 2016-10-09 20:40:40 -04:00
Tom Rothamel f7f273a1e9 Support translating the message used in the iOS purchase dialog. 2016-10-09 12:16:13 -04:00
Tom Rothamel 984d103159 Improve documentation for window management. 2016-10-08 13:45:42 -04:00
Tom Rothamel 685c7399a2 Use renpy.music.playable to lint voice statements.
This ensures that any prefix or suffix on the voice channel is
applied before looking for the sound file.

Fixes #1049.
2016-10-07 23:50:56 -04:00
Tom Rothamel 5755aaa6d8 Separate fit_first and xfit/yfit.
The semantics are too different for a single implementation, like
6.99.11 had. In first_fit, the first child is used to choose the
size that is offered to the rest of the children. xfit and yfit
render all at full size, then fit to them.

Fixes #1050.
2016-10-07 23:21:53 -04:00
Tom Rothamel 22f1f057c8 Ensure that the archiver only uses binary strings.
Fixes #1048.
2016-10-07 19:27:38 -04:00
Tom Rothamel fc0d7b77f9 Remove unicode_literals from the module importer.
This has too high a potential to break existing games - it broke
pefile.py, for example. So we require code to ask for unicode_literals
before we use it.

Fixes #1047.
2016-10-06 19:46:31 -04:00
Tom Rothamel 5139f03c76 Try to make unicode_literals clean. 2016-10-06 19:41:38 -04:00
Tom Rothamel 87f7115844 Add xbit rules for the mac lib transform.
This ensures the transformed code will run when zipped up, signed,
etc.
2016-10-05 21:51:25 -04:00
Tom Rothamel 3a8500a926 Place the tmp directory in renpy_base.
This ensures it remains in the same place, without caring if
Ren'Py is invoked as "./renpy.sh" or "./renpy.sh launcher."
2016-10-05 21:49:16 -04:00
Tom Rothamel 8663926ac3 Deal with an empty args argument in Placeholder.
Not well, but this should stop the game from crashing.
2016-10-04 21:04:46 -04:00
Tom Rothamel 2f9474e30a Merge pull request #1046 from merumelu/update_changelog
Fix cut off sentence in changelog
2016-10-04 20:50:27 -04:00
merumelu 039602fdc5 Fix cut off sentence in changelog 2016-10-04 15:48:25 +02:00
Tom Rothamel 46a9bf6c6b Add the ability to copy files as part of a translation. 2016-10-04 01:36:40 -04:00
Tom Rothamel 1627b5e12c gui: Add gui7.translate_define.
This is a function that lets a translation register that a define
should be set for that language, making it possible to change
fonts and such on a per-translation basis.
2016-10-03 22:17:07 -04:00
Tom Rothamel 6db08cce5a Change what config.rollback_limit represents.
Now it's the number of hard checkpoints we can rollback to, which
matches the way it was documented.
2016-10-02 23:36:22 -04:00
Tom Rothamel 281ee47f04 Trigger a soft rollback at game start.
This interacts well with the ID, as it lets us rollback to game
start in order to see the first few statements that initialize
the game.
2016-10-02 23:01:22 -04:00
Tom Rothamel 51a97b477c Ensure the environment uses bytes/strings, not unicodes. 2016-10-02 20:46:20 -04:00
Tom Rothamel a4670979e7 Encode and filter the environment before launch. 2016-10-02 16:49:57 -04:00
Tom Rothamel 2b494f2871 Remove obsolete documentation sections.
Most of this is covered by Ren'Py and the new GUI.
2016-10-01 14:54:52 -04:00
Tom Rothamel 875be1c525 lint: Do not warn about config.developer if it's set to auto. 2016-10-01 14:54:18 -04:00
Tom Rothamel a00673811a Make Project backwards-compatible.
For other code, like in distribute.py, that wants to use it.
2016-09-30 10:02:54 -04:00
Tom Rothamel 84f27b15b4 Fix regression in screenshots.
Caused by 55211b89c9.
2016-09-30 10:01:59 -04:00
Tom Rothamel 485adab9dd Restore dynamic variables when returning from invoke_in_new_context.
Fixes #1044.
2016-09-29 23:47:07 -04:00
Tom Rothamel 9d6328be13 Scan for mac apps in the launcher, and add them as projects.
This makes it possible to drop an unsigned mac app into the
launcher and easily launch it.
2016-09-29 22:49:33 -04:00
Tom Rothamel fac336ef53 Fix the error when a non-displayable gets a has statement.
Fixes #1042.
2016-09-28 21:07:46 -04:00
Tom Rothamel c17731637d Remove print statements in documentation generator game. 2016-09-27 23:09:38 -04:00
Tom Rothamel c8d09c80ba Compile python with __future__ flags.
This makes python-in-Ren'Py compatible with the dialect of Python
2 Ren'Py is (will be) written in.
2016-09-27 22:40:34 -04:00
Tom Rothamel 19f6dac811 Documentation updates. 2016-09-27 22:40:13 -04:00
Tom Rothamel 39ee421538 mac: Avoid saving into a read-only macapp. 2016-09-26 20:57:53 -04:00
Tom Rothamel ec079b6999 mac: Avoid writing rpyc and cache files into a read-only mac app. 2016-09-26 20:54:15 -04:00
Tom Rothamel 713d6d9b87 Do not produce logfiles inside a macapp. 2016-09-26 20:42:32 -04:00
Tom Rothamel 55211b89c9 mac: In the case of a macapp, write screenshots to the desktop. 2016-09-26 20:40:50 -04:00
Tom Rothamel 94ecd36445 Detect that we're running inside a mac app. 2016-09-26 20:21:51 -04:00
Tom Rothamel e346ef6d3e Merge pull request #1040 from jsfehler/use_hashlib
Replace deprecated md5 library with hashlib
2016-09-25 10:48:01 -04:00
Tom Rothamel 732e3a1b01 Build an app dmg if supported. 2016-09-24 14:24:38 -04:00
Tom Rothamel 3c448d18bc mac: Signed app and dmg version of the SDK.
This should allow us to start running on sierra.
2016-09-24 14:18:12 -04:00
Tom Rothamel f6dd6fae20 mac: Support creating signed DMGs. 2016-09-24 13:46:03 -04:00
Tom Rothamel 623b3f0435 mac: Sign applications. 2016-09-23 22:14:07 -04:00
Joshua Fehler 998f90ad34 Replace deprecated md5 library with hashlib 2016-09-22 22:49:18 -04:00
Tom Rothamel 8c9d700d68 Add autopep8 config file to project. 2016-09-22 18:43:01 -04:00
Tom Rothamel 58ffc877c8 Back out change to try_compile. 2016-09-22 12:06:24 -04:00
Tom Rothamel 83fef5bdeb Merge pull request #1039 from jsfehler/print_function
Replace print statement with print function
2016-09-22 12:02:50 -04:00
Joshua Fehler 1feecac9f1 Replace print statement with print function 2016-09-22 06:49:40 -04:00
Tom Rothamel a194bb0469 mac: Build settings.
* Support passing in variables to control signing.
* Support app-directory and app-dmg types.
2016-09-22 00:29:31 -04:00
Tom Rothamel 034f5bc814 Rescan the mac app after it's been signed.
(Of course, it hasn't been signed yet.)
2016-09-21 20:18:50 -04:00
Tom Rothamel 12eb226234 mac: Unpack the mac apps to prepare for the signing operation. 2016-09-21 01:34:09 -04:00
Tom Rothamel dbf16eb950 Prepare file lists in a function.
This is so we can strip out the app, sign it, and merge it back in.
2016-09-20 22:58:03 -04:00
Tom Rothamel d7fce4d212 itch: Fix path to butler. 2016-09-20 19:55:53 -04:00
Tom Rothamel ba5a6c6db3 mac: Transform the mac app so it can be signed. 2016-09-19 22:25:01 -04:00
Tom Rothamel a1a08c4575 mac: Disabled support for transform required for codesigning. 2016-09-18 23:56:43 -04:00
Tom Rothamel 052b6a3bff distribute: Create directories for the mac app.
This allows us to create directory distributions containing mac
apps. (And probably also tar files.)

Fixes #1035.
2016-09-16 22:00:11 -04:00
Tom Rothamel 01049f1452 gui: Reverse the who/what order in the say screen.
The old order was from before the current approach, and the (sane)
new order makes sure we read out the text properly.
2016-09-15 23:44:42 -04:00
Tom Rothamel 65a27c89e4 self voicing: Avoid reading out the text in Placeholders. 2016-09-15 23:29:14 -04:00
Tom Rothamel 27f955fd1b Start gui testcases. 2016-09-15 23:18:13 -04:00
Tom Rothamel 3b5e7c821a Remove bogus none translation. 2016-09-14 20:01:30 -04:00
Tom Rothamel fdba290547 Pull translations from gui/game/screens.rpy.
Fixes #1032.
2016-09-14 19:48:09 -04:00
Tom Rothamel a4b99d733c Automatically end skipping when necessary.
In the normal skip mode, if skip isn't possible, exit out of skip
mode. We'll exit out of skip mode anyway when the player clicks to
dismiss, so we combine it into a single step (and update the interface
to better reflect what's going on).

Fixes #1031.
2016-09-14 02:26:36 -04:00
Tom Rothamel efc490ec5a Add back button to the tablet/phone GUI.
With rollback side off by default, we need a convenient way for the
player to initiate rollback, especially when the bottom-bar is
hidden.

Fixes #1030.
2016-09-13 18:10:50 -04:00
Tom Rothamel 2673fbb133 Merge pull request #1033 from jsfehler/master
Buttons tied to MusicRoom's Stop action now stay selected when clicked.
2016-09-13 17:16:08 -04:00
Joshua Fehler 9c13539d0e Buttons tied to MusicRoom's Stop action now stay selected when clicked. 2016-09-13 00:30:47 -04:00
Tom Rothamel a4a52b3e6f Initialize translations on replays and loads.
This ensures that the translate python blocks are called and the
store is up to date.
2016-09-12 23:34:33 -04:00
Tom Rothamel c02f4b0615 Fix and update image load log.
* Ensure the window is not full-window.
* Make the window draggable.
* Add a legend, colors, and checkmark/X symbols.

Fixes #1026.
2016-09-12 22:18:03 -04:00
Tom Rothamel a366f0bee0 Make FilePageNameInputValue translatable. 2016-09-11 22:57:01 -04:00
Tom Rothamel 5ef4833cd7 Merge pull request #1023 from morganwillcock/config-typo
Fix some typos in config documentation
2016-09-11 13:32:23 -04:00
Tom Rothamel f8644ab49e Finish webp support.
* Add to the images/ directory.
* Add to docs.
2016-09-10 14:36:47 -04:00
Tom Rothamel 39fcba0473 Make error handling draggable. 2016-09-09 19:01:35 -04:00
Tom Rothamel 626c5c688f Fix Ren'Py calls from the console.
This was broken by the add_from integration.

While in 00console.rpy, removed the credit line, as it's the only
place in Ren'Py that gave specific credit to the contributors.
2016-09-08 20:22:32 -04:00
Tom Rothamel 26cc433a66 Support reentrant webp loading. 2016-09-07 18:14:13 -04:00
Tom Rothamel 8714d9564d ffmedia: Wait for media ready before unpause_all.
This should restore synchro_start functionality.
2016-09-06 23:00:34 -04:00
Tom Rothamel fb171044eb ffmedia: Do not wait for streams that aren't ready.
On Android (and probably slow PCs), a stream might not be ready in
time for the first callback. If we delay the callback for too long,
we'll cause skipping. So instead we read silence until the stream
is ready.
2016-09-06 22:50:51 -04:00
Tom Rothamel 13b251e915 ffmedia: Slow-start audio channels.
We decode only .2s of audio at a time, which should help minimize
the time we spend blocking the audio thread.
2016-09-06 22:17:59 -04:00
Morgan Willcock f3bc6ac027 Fix some typos in config documentation
Fix some spelling errors. Plus, I'm pretty sure hertz (the unit) is written as Hz, since it is named after Hertz (the person).
2016-09-05 21:27:44 +01:00
Tom Rothamel 53cbf69b08 Bump version. 2016-09-05 13:48:45 -04:00
Tom Rothamel 7b3a2675c4 Fix OSHS. 2016-09-05 13:29:04 -04:00
Tom Rothamel f89f1dfd07 Tweak idle_small_color on the light theme. 2016-09-04 00:31:11 -04:00
Tom Rothamel d39b332835 gui: Revert changes to dark theme. 2016-09-04 00:02:15 -04:00
Tom Rothamel 845d9c9dd1 gui: Increase contrast in the light theme.
This matches what I wound up doing in OSHS, and should help
accessibility for colorblind people.
2016-09-03 23:55:29 -04:00
Tom Rothamel e9fba23377 Change how we build and version updates.
This fixes a problem where, since current.json was not included,
the DLC was not being updated properly, meaning that updates
would also be required.

Fixing this (while still preserving fast building) required changing
the format of upgrades a little. The pretty version number is no
longer included in update files (it wasn't used), and the versions
themselves are hashes of the file content. This allows us to include
current.json in update files without having to constantly regenerate
those files.
2016-09-03 15:32:31 -04:00
Tom Rothamel d0e67c5da9 Convert the icon PNG after loading. 2016-09-03 12:01:05 -04:00
Tom Rothamel c5dc1003a4 Initialize _last_voice_play, so it can't be used uninitialized. 2016-09-02 22:42:58 -04:00
Tom Rothamel bcf456c697 Set default variables in the outermost context.
This fixes a bug where _history would be set by the defaults system,
but because it's a context-dynamic variable, it could get unset as
the context system unwound things.
2016-09-02 22:36:00 -04:00
Tom Rothamel 68a15d4efb Fix Indonesian translation. 2016-09-02 21:58:32 -04:00
Tom Rothamel 1b300d4fcf Update greek translation. 2016-09-02 21:57:52 -04:00
Tom Rothamel dc7dbcb469 Make side image variables context dynamic.
This prevents glitches when side image transitions are invoked
after entering and leaving a menu context.
2016-09-01 22:43:40 -04:00
Tom Rothamel 750fe6fb64 Disable rollback side by default. 2016-09-01 20:45:41 -04:00
Tom Rothamel 6d3d4bb3d3 Always respect renpy.session["compile"].
Previously, it would get unset when the arguments were re-parsed
as the run command started.
2016-08-31 22:53:57 -04:00
Tom Rothamel 91bc0b6bf9 Show expression respects config.tag_layer if a tag is given. 2016-08-30 20:46:22 -04:00
Tom Rothamel d15512416d Update changelog. 2016-08-28 22:42:16 -04:00
Tom Rothamel d9472f60f8 Change the name of 6.99.11.
Needed to get in a Hamilton reference somewhere, since I've been
listening to it Non-Stop while making this version. And that seems
to be another reference.

(And I'll mention Silver here, too - the car we took on our road
trip to Dallas and Hot Springs. A 2016 Dodge Challenger rental,
VIN 2C3CDZAG1GH254389, we had her from miles 2302-4557, 2255 miles
total. We listened to Hamilton for probably over 150 of those
miles...)
2016-08-28 20:14:46 -04:00
Tom Rothamel f6e63a96d8 Add config.afm_voice_delay.
This is a variable that lets one add a delay after the voice file
before text advances.

Fixes #978.
2016-08-28 16:30:29 -04:00
Tom Rothamel 6563cd1a42 Delete _images directory before building docs.
This ensures excluded image files are not present, significantly
reducing the build size.
2016-08-28 12:42:32 -04:00
Tom Rothamel 6064314d23 Merge pull request #1018 from pratomoastan/patch-27
update gui.rpy
2016-08-27 13:04:58 -04:00
Tom Rothamel 67a624129b Document _confirm_quit.
Also, set it in an init block, so a define statement can change it.
2016-08-26 21:29:42 -04:00
Tom Rothamel 3d8c4d06da Do not confirm quits when in the splashscreen. 2016-08-26 21:20:47 -04:00
Tom Rothamel 47a75797c7 Strip leading slashes before loading files. 2016-08-26 21:10:30 -04:00
Tom Rothamel 23a8ceb3d2 Update changelog a little. 2016-08-26 00:56:17 -04:00
Tom Rothamel 586d799c41 Generate documentation. 2016-08-25 22:49:25 -04:00
Tom Rothamel ba0e4cf35b Document offset style property. 2016-08-24 23:03:13 -04:00
Tom Rothamel da785836a5 sl2: Add offset style property. 2016-08-24 23:02:57 -04:00
Tom Rothamel 47f4687f56 Add the offset style property.
The offset style property sets xoffset and yoffset to the two
components of a tuple.
2016-08-24 22:55:03 -04:00
Tom Rothamel 64542b7780 Convert the presplash image before blitting it.
Fixes #1010.
2016-08-23 21:22:29 -04:00
Pratomo Asta N 9194d2ca59 update gui.rpy
next update estimated on 3 days from this pull request
2016-08-23 22:42:33 +07:00
Tom Rothamel 31af3e89de Properly support nested showifs.
Fixes #1007.
2016-08-22 21:47:52 -04:00
Tom Rothamel bde35e378d Merge pull request #1013 from kevinturner/master
New preference for forcing fallback images on video sprites
2016-08-21 04:10:17 -05:00
kevinturner af32cd000f New preference for forcing fallback images on video sprites
Video was too taxing for some of our systems and we wanted to be able
to fallback to the already defined backup images for movie sprites
without deleting the original file paths.
2016-08-20 20:51:19 -04:00
Tom Rothamel 2418ca6612 Add a way of forcing greedy rollback on load.
To support the id.
2016-08-18 16:17:38 -05:00
Tom Rothamel 708b6af21c Include the full node in the line log. 2016-08-17 23:14:25 -05:00
Tom Rothamel 9b7a1d0314 Compat prior change. 2016-08-16 22:15:43 -05:00
Tom Rothamel 195bd1535d Suppress overlay during splashscreen. 2016-08-16 22:12:37 -05:00
Tom Rothamel 8256204f6c When possible, prefer viewport scrolling to focus change.
When the arrowkeys are pressed.

Fixes #1009.
2016-08-15 22:42:02 -05:00
Tom Rothamel e55e559b3a Merge pull request #1011 from pratomoastan/patch-26
update /tl/indonesian/options.rpy
2016-08-14 08:19:39 -05:00
Tom Rothamel 3aeffad8de Include the statement type in the line log. 2016-08-13 10:14:43 -05:00
Pratomo Asta N 51455a1e0e update /tl/indonesian/options.rpy
file synced with latest version .
2016-08-13 17:06:05 +07:00
Tom Rothamel 7681561199 Fix divide-by-zero in Frame. 2016-08-11 23:34:44 -05:00
Tom Rothamel d7d2fa362a gui: Remove Eileen name color. 2016-08-11 17:13:52 -05:00
Tom Rothamel d7d1b4c04c Take execution state when duplicating a Transform.
This fixes the 3D camera.
2016-08-10 00:05:02 -05:00
Tom Rothamel 770d0899bf Duplicate displayables hidden in ImageReference.
This fixes behavior where such displayables would not be reset
when shown.
2016-08-09 22:32:40 -05:00
Tom Rothamel 76d584b8b1 transform: Break into own module. 2016-08-08 23:00:42 -05:00
Tom Rothamel 1b86849a4d Add renpy.get_adjustment() to get an adjustment from a BarValue.
Fixes #924.
2016-08-07 09:20:12 -05:00
Tom Rothamel 608b125083 Give better feedback when an image is corrupt.
Fixes  #1004.
2016-08-06 09:42:52 -05:00
Tom Rothamel aa53c8bc10 Support config.mouse_hide_time = None.
Fixes #1003.
2016-08-05 15:32:28 -04:00
Tom Rothamel d94305dde1 Avoid calling do_done from empty_window.
This behavior - which can lead to logging a spurious line in history -
is almost certainly not desired. So we introduced a new method on
Character that is called instead, to simply display the window
without any of the logging.
2016-08-04 23:28:25 -04:00
Tom Rothamel b7f934770c Continue past an initial display init failure.
This allows certain Ren'Py tools - like distribute and lint - to
run even without a display connected.
2016-08-04 09:38:12 -04:00
Tom Rothamel 8fdd1c3efc Update docs. 2016-08-04 01:46:15 -04:00
Tom Rothamel e6f2da4ece Merge pull request #1005 from morganwillcock/pause-typo
Fix typo in pause function docs
2016-08-04 01:16:38 -04:00
Tom Rothamel 0b4cf8103e Focus was wrong, fix it. 2016-08-04 00:32:38 -04:00
Tom Rothamel 54343c9347 Update keywords. 2016-08-03 23:33:30 -04:00
Tom Rothamel fdca1af62d gui: style_group to style_prefix. 2016-08-03 23:22:36 -04:00
Tom Rothamel 1f7c73dae8 Render selected quick buttons in the accent color.
This makes the state of the button more obvious.
2016-08-03 23:18:46 -04:00
Tom Rothamel 8659951686 gui: Use python to write image files.
This works around bugs in pygame_sdl2 (which I still need to fix)
on Japanese-encoding Windows.
2016-08-03 23:12:52 -04:00
Tom Rothamel dee8550dcb Text converts str to unicode uncleanly.
This might produce bad results, but it's better than producing a
crash - especially a crash in error handling completely unrelated
to the underlying error.
2016-08-03 22:41:46 -04:00
Morgan Willcock abf58f9a2a Fix typo in pause function docs
I'm pretty sure this is meant to be "delay"?
2016-08-03 17:59:08 +01:00
Tom Rothamel c70a284bf9 gui doc: New section on translating the gui. 2016-08-03 00:33:45 -04:00
Tom Rothamel 88e49c064c Revise GUI documentation. 2016-08-02 22:36:20 -04:00
Tom Rothamel db0ca085b7 Move the setting of config.window_icon into options.rpy. 2016-08-02 00:42:59 -04:00
Tom Rothamel 72c896e354 Use proper encodings with projects_directory command-line commands. 2016-08-01 23:07:20 -04:00
Tom Rothamel 67532aff52 Reloading at the main menu leaves us at the main menu.
Previously, it would bring us into the game menu equivalent of the
same screen.

Fixes #1002.
2016-08-01 22:57:46 -04:00
Tom Rothamel 94a99659c5 gui: Do not round image size on scale-down. 2016-08-01 22:40:13 -04:00
Tom Rothamel 722550efee Apply [prefix_] when searching for a file in lint. 2016-08-01 22:35:34 -04:00
Tom Rothamel a8fb72125c Add RENPY_LESS_PAUSES.
A hidden-ish environment variable that can disable the {p} and {w}
text tags in environments where clicking through them all would
be annoying.
2016-07-31 23:02:45 -04:00
Tom Rothamel ad722ac54d Deal with invalid _last_say_who (Thanks, Alex-Tracer)
If _last_say_who could no longer be evaluated,
_default_empty_window would fail. This uses narrator
instead in that case.

Fixes #1001.
2016-07-31 22:39:50 -04:00
Tom Rothamel b1bc7bc18d Merge pull request #1000 from pratomoastan/patch-25
adding  tutorial\game\tl\indonesian\gui.rpy
2016-07-31 21:43:10 -04:00
Tom Rothamel d36284f402 Fix detection of old translations. 2016-07-31 21:01:04 -04:00
Tom Rothamel 95ecb5b03d Center text window by default. 2016-07-31 20:45:13 -04:00
Tom Rothamel 5613b388c1 gui: Comment changes. 2016-07-31 19:46:37 -04:00
Tom Rothamel f7ead1fbc3 Add a commented-out itch.io project field. 2016-07-31 17:59:14 -04:00
Tom Rothamel af5c0f8929 Add a build section to options.rpy. 2016-07-31 17:53:25 -04:00
Tom Rothamel 0a1439a1a5 history: Document rollback_identifier. 2016-07-30 14:38:56 -04:00
Tom Rothamel bad2746607 rollback: Add the RollbackToIdentifier action.
This allows us to rollback to an identifier, if it exists.
2016-07-30 14:33:17 -04:00
Tom Rothamel bce2d01682 rollback: Include a rollback indentifier as part of a rollback.
This can be used to determine the number of checkpoints required
to get back to a line of dialogue.
2016-07-30 14:07:29 -04:00
Pratomo Asta N 91ed7c7669 Update gui.rpy 2016-07-30 19:53:07 +07:00
Pratomo Asta N 2a305e21dc adding tutorial\game\tl\indonesian\gui.rpy
adding  tutorial\game\tl\indonesian\gui.rpy
2016-07-30 19:48:43 +07:00
Tom Rothamel 97e80244c7 console: Rename HistoryEntry -> ConsoleHistoryEntry
So it's not confusable with HistoryEntry proper.
2016-07-30 00:09:09 -04:00
Tom Rothamel c328b264e4 gui: Refactor into a pair of files.
The idea is that all of the simple and intermediate customization
can be done in gui.rpy, and only when the player needs to make
major changes do they need to touch screens.rpy.
2016-07-29 23:59:55 -04:00
Tom Rothamel 22952accf4 gui doc: Document gui.history_height = None. 2016-07-29 21:56:35 -04:00
Tom Rothamel c1624f5ecf gui: Support gui.history_height = None. 2016-07-29 21:53:18 -04:00
Tom Rothamel 770e9e6b60 gui: Support viewport-based history. 2016-07-29 21:34:14 -04:00
Tom Rothamel eb17eae932 gui: Use the selected color for selected text. 2016-07-29 21:33:52 -04:00
Tom Rothamel 45469aea5d gui: Support variable height history. 2016-07-28 21:46:54 -04:00
Tom Rothamel 126b8ba885 Expose the margin property to screen language. 2016-07-28 21:42:58 -04:00
Tom Rothamel 03962c47ba Fix indonesian translation. 2016-07-28 00:31:58 -04:00
Tom Rothamel e2129e0205 Compat default sound loop.
This fixes a bug introduced in 6.17.5, and only manifested if
config.has_sound = False. (Which is the case in Moonlight Walks.)
2016-07-27 23:01:56 -04:00
Tom Rothamel f420612789 Merge pull request #983 from vollschauer/master
gallery: Just one option to advance trough unlocked images by left-cl…
2016-07-27 20:45:04 -04:00
Tom Rothamel 340e33cac8 Merge pull request #991 from pratomoastan/patch-16
adding  tutorial\game\tl\indonesian\demo_laye~.rpy
2016-07-27 17:46:14 -04:00
Tom Rothamel ecd7227324 Merge pull request #986 from pratomoastan/patch-11
On line 397@screens@tutorial add button to switch to indonesian lang
2016-07-27 17:46:06 -04:00
Tom Rothamel 4ae4c33756 Merge pull request #998 from pratomoastan/patch-22
adding  tutorial\game\tl\indonesian\tutorial_s~.rpy
2016-07-27 17:46:00 -04:00
Tom Rothamel 65b867293c Merge pull request #997 from pratomoastan/patch-23
adding  tutorial\game\tl\indonesian\tutori~_v.rpy
2016-07-27 17:45:54 -04:00
Tom Rothamel 6c0a2aaf24 Merge pull request #996 from pratomoastan/patch-21
adding  tutorial\game\tl\indonesian\demo_pers~.rpy
2016-07-27 17:45:49 -04:00
Tom Rothamel d9153573f4 Merge pull request #995 from pratomoastan/patch-20
adding  tutorial\game\tl\indonesian\demo_tran~.rpy
2016-07-27 17:45:44 -04:00
Tom Rothamel 6134fe7480 Merge pull request #994 from pratomoastan/patch-19
adding  tutorial\game\tl\indonesian\screens.rpy
2016-07-27 17:45:39 -04:00
Tom Rothamel 5c5477b0d8 Merge pull request #993 from pratomoastan/patch-18
adding  tutorial\game\tl\indonesian\demo_nvlm~.rpy
2016-07-27 17:45:34 -04:00
Tom Rothamel 3ca2bba366 Merge pull request #992 from pratomoastan/patch-17
adding tutorial\game\tl\indonesian\demo_minig~.rpy
2016-07-27 17:45:27 -04:00
Tom Rothamel 9dedc4f57f Merge pull request #990 from pratomoastan/patch-15
adding  tutorial\game\tl\indonesian\demo_imag~.rpy
2016-07-27 17:45:20 -04:00
Tom Rothamel c8ea170574 Merge pull request #989 from pratomoastan/patch-14
adding tutorial\game\tl\indonesian\demo_dynam~.rpy
2016-07-27 17:44:46 -04:00
Tom Rothamel 3af27d9eee Merge pull request #988 from pratomoastan/patch-13
adding  tutorial\game\tl\indonesian\add_file.rpy
2016-07-27 17:44:43 -04:00
Tom Rothamel 710833d338 Merge pull request #987 from pratomoastan/patch-12
adding tutorial\game\tl\indonesian\about.rpy
2016-07-27 17:44:40 -04:00
Tom Rothamel 0fd7e50c38 Merge pull request #985 from pratomoastan/patch-10
Pull request to add options.rpy to launcher\game\tl\indonesian
2016-07-27 17:44:30 -04:00
Tom Rothamel 8297d91663 Merge pull request #984 from pratomoastan/patch-9
Pull request to add script.rpy to launcher\game\tl\indonesian
2016-07-27 17:44:10 -04:00
Pratomo Asta N 1d90a270fa adding tutorial\game\tl\indonesian\tutori~_v.rpy
adding tutorial\game\tl\indonesian\tutorial_video.rpy
2016-07-27 20:08:55 +07:00
Pratomo Asta N 854ba0d757 adding tutorial\game\tl\indonesian\tutorial_s~.rpy
adding  tutorial\game\tl\indonesian\tutorial_sprite.rpy
2016-07-27 19:25:07 +07:00
Pratomo Asta N c2dc788a6d adding tutorial\game\tl\indonesian\demo_pers~.rpy
adding  tutorial\game\tl\indonesian\demo_persistent.rpy.rpy
2016-07-27 18:27:48 +07:00
Pratomo Asta N 1f0e77076b adding tutorial\game\tl\indonesian\demo_tran~.rpy
adding  tutorial\game\tl\indonesian\demo_transform.rpy
2016-07-27 18:11:06 +07:00
Pratomo Asta N 8ac18d8bd0 adding tutorial\game\tl\indonesian\screens.rpy
adding  tutorial\game\tl\indonesian\screens.rpy
2016-07-27 17:14:41 +07:00
Pratomo Asta N 9d265be059 adding tutorial\game\tl\indonesian\demo_nvlm~.rpy
adding  tutorial\game\tl\indonesian\demo_nvlmode.rpy
2016-07-27 16:20:21 +07:00
Pratomo Asta N 7df5f290da adding tutorial\game\tl\indonesian\demo_minig~.rpy
adding tutorial\game\tl\indonesian\demo_minigame.rpy
2016-07-27 16:15:03 +07:00
Pratomo Asta N 10588b38c7 adding tutorial\game\tl\indonesian\demo_laye~.rpy
adding  tutorial\game\tl\indonesian\demo_layers.rpy
2016-07-27 15:57:55 +07:00
Pratomo Asta N 00ea08752d adding tutorial\game\tl\indonesian\demo_imag~.rpy
adding  tutorial\game\tl\indonesian\demo_imageops.rpy
2016-07-27 15:55:49 +07:00
Pratomo Asta N 2eb0280fed adding tutorial\game\tl\indonesian\demo_dynam~.rpy
adding tutorial\game\tl\indonesian\demo_dynamic.rpy
2016-07-27 15:54:12 +07:00
Pratomo Asta N edadec0949 adding tutorial\game\tl\indonesian\add_file.rpy
adding tutorial\game\tl\indonesian\add_file.rpy
2016-07-27 15:50:42 +07:00
Pratomo Asta N 6e7de6dde5 adding \game\tl\indonesian\about.rpy
Adding \game\tl\indonesian\about.rpy
2016-07-27 15:47:52 +07:00
Pratomo Asta N b54520b9b8 On line 397 button to switch to indonesian lang
added textbutton "Indonesian" action Language("indonesian") on line 397
2016-07-27 15:44:04 +07:00
Pratomo Asta N 665a18f21f Update options.rpy 2016-07-27 15:29:11 +07:00
Pratomo Asta N 86af944033 Pull request to add options.rpy to tl\indonesian
As update 11.1626 launched translation was updated with 3 new files 
this is the 2nd pull request out of 3 pull request.
next pull request will be gui.rpy
2016-07-27 15:10:52 +07:00
Pratomo Asta N b3dfb133ba Pull request to add script.rpy
As update 11.1626 launched translation was updated with 3 new files 
this is the 1st pull request out of 3 pull request.
next pull request will be options.rpy
and gui.rpy
2016-07-27 14:16:56 +07:00
Tom Rothamel 73c704451d Minor doc fixes. 2016-07-26 21:26:55 -04:00
Tom Rothamel e197c696b3 Pass default name and version into the android code. 2016-07-26 21:25:52 -04:00
Tom Rothamel 48c061cedb Fix building of the reduced images documentation. 2016-07-26 20:22:24 -04:00
vollschauer c746b76825 gallery: Just one option to advance trough unlocked images by left-click or navigation buttons 2016-07-26 09:31:09 +02:00
Tom Rothamel 09ee9080a7 gui: Proofreading gui.rpy. 2016-07-25 20:56:47 -04:00
Tom Rothamel ac35102123 gui: Fix generation of simple name. 2016-07-25 20:49:02 -04:00
Tom Rothamel d57aeeeb70 Ignore web docs build. 2016-07-24 23:42:04 -04:00
Tom Rothamel 8d5dd2d564 Fixes to making projects in a built Ren'Py. 2016-07-24 23:38:45 -04:00
Tom Rothamel 49ae0099c8 Compat enforcing the window max size. 2016-07-24 15:15:20 -04:00
Tom Rothamel 4c75ac36d6 launcher: Fix layout of gui color picker. 2016-07-24 15:07:40 -04:00
Tom Rothamel 09c9d0997c gallery: Add the option to only navigate through unlocked images. 2016-07-24 14:27:01 -04:00
Tom Rothamel 8d9b2b64ee fixed: Only fit if first_fit is given.
This fixes a crash.
2016-07-24 13:40:08 -04:00
Tom Rothamel fc75f5c9d8 Document shift-alt-P. 2016-07-23 21:45:35 -04:00
Tom Rothamel c8045248ee Merge multiple slashes into one when loading files.
Fixes #980.
2016-07-23 15:49:03 -04:00
Tom Rothamel 8a491b10e8 Merge pull request #979 from morganwillcock/fix-typo
Fix some typos...
2016-07-23 00:05:58 -04:00
Morgan Willcock 5f3f7d5997 Fix some typos...
...in style properties.
2016-07-23 02:33:19 +01:00
Tom Rothamel 11cabb3dd8 Fix case of vietnamese translation.
One translation block had the Vietnamese name, which meant that
we had two entries for Vietnamese in the launcher.
2016-07-22 17:04:19 -04:00
Tom Rothamel 3b12051ece Add indonesian template. 2016-07-22 17:02:51 -04:00
Tom Rothamel fca81066bb Merge pull request #977 from pratomoastan/patch-8
update \launcher\game\tl\indonesian\common.rpy
2016-07-22 15:55:54 -04:00
Pratomo Asta N 014012fc83 Update common.rpy 2016-07-22 13:09:22 +07:00
Pratomo Asta N b2ba5066ec update \launcher\game\tl\indonesian\common.rpy
Add new translation :  for # renpy/common/00layout.rpy:459

# TODO: Translation updated at 2016-07-22 12:50

translate indonesian strings:

    # renpy/common/00layout.rpy:459
    old "Are you sure you want to skip unseen dialogue to the next choice?"
    new "Apakah kamu yakin ingin meloncati dialog yang belum terlihat sampai ke pilihan berikutnya?"
2016-07-22 13:07:35 +07:00
Tom Rothamel b91b4ce212 Update the changelog. 2016-07-22 00:37:33 -04:00
Tom Rothamel ad3a2f90cd Merge pull request #974 from pratomoastan/patch-4
indonesian: Update new_project.rpy
2016-07-21 19:18:08 -04:00
Tom Rothamel 2e626fabdd Merge pull request #975 from pratomoastan/patch-5
Update indonesian translation of navigation.rpy
2016-07-21 19:17:33 -04:00
Tom Rothamel 1c480dbbf1 Merge pull request #976 from pratomoastan/patch-6
Update indonesian translation of common.rpy
2016-07-21 19:17:00 -04:00
Pratomo Asta N ecbf844ffb Update common.rpy
Fix some leftover translation
Fix some miss translation 
Revert the {#Bulan} to {#month},etc
Fix line 813 change 'here' to 'disini'
Change line 817 from 'Sebuah Permainan Ren'Py' to 'Permainan Ren'Py'
2016-07-21 22:10:33 +07:00
Pratomo Asta N 71d955527b Update navigation.rpy
Fix miss translation
2016-07-21 19:55:21 +07:00
Pratomo Asta N 0a8b3d4f11 Update new_project.rpy
Fix grammar mistake
2016-07-21 19:48:31 +07:00
Tom Rothamel 82c775aa4c Correctly handle xmaximum/ymaximum in buttons.
This only uses an xmaximum/ymaximum that was given to the button,
rather than using a width or height that could be zero.

This fixes a bug that was preventing buttons below the viewport end
on the launcher projects list from appearing.
2016-07-21 00:28:04 -04:00
Tom Rothamel e7a9757010 Fix cancelling new projects. (from Pratomo Asta Nugraha) 2016-07-20 22:39:08 -04:00
Tom Rothamel fa80c1dc0f Add RENPY_DEFAULT_KEYMAP.
This is a hidden environment variable that lets me set the default
keymap for debugging problems in older games.
2016-07-19 23:37:43 -04:00
Tom Rothamel 3d5c03932d Fix keybindings for the progress screen.
Fixes #968.
2016-07-19 22:03:53 -04:00
Tom Rothamel 636896efec Fix grammar of gui.FAST_SKIP_UNSEEN. 2016-07-19 20:35:27 -04:00
Tom Rothamel a51f12a77b Prevent crash if view_width or view_height are 0.
Fixes #969.
2016-07-18 23:38:50 -04:00
Tom Rothamel 5d216076a1 Support including a default screen layer in the screen. 2016-07-18 22:47:51 -04:00
Tom Rothamel d912be444c gui: Phone variant. 2016-07-18 01:39:51 -04:00
Tom Rothamel debe837246 Allow image names to begin with an _. 2016-07-17 23:39:17 -04:00
Tom Rothamel e172098561 gui: Work on phone variant. 2016-07-17 11:40:21 -04:00
Tom Rothamel 32d18d9e2d gui: Add space to the left of the check/radio bar image.
This makes the result more visually pleasing, as the image
lines up properly with vertical lines in DejaVuSans glyphs.
(For example, the left side of D in display.) This is offset to the
right of the text bounding box by ~3 pixels, probably so slanted
lines can go a little to the left of it.
2016-07-17 11:16:05 -04:00
Tom Rothamel 0378d602bd gui: Tweak preference spacing. 2016-07-17 11:03:40 -04:00
Tom Rothamel 431375ef66 gui: Add gui.show_name to options.rpy
Since this is likely to be one of the most common customizations,
it makes sense to put it in options.rpy.
2016-07-17 01:21:07 -04:00
Tom Rothamel f56b7df318 gui doc: Document gui functions. 2016-07-17 01:12:51 -04:00
Tom Rothamel 70118ef88d gui doc: Advanced customizations. 2016-07-17 00:37:25 -04:00
Tom Rothamel e153f3adc9 gui doc: NVL. 2016-07-16 22:47:19 -04:00
Tom Rothamel 646b152d73 gui: Improve NVL-mode buttons. 2016-07-16 21:38:43 -04:00
Tom Rothamel b22edb09dd Allow define to take arbitrary variable names.
Previously, the line "define menu = nvl_menu" didn't work.
2016-07-16 02:17:33 -04:00
Tom Rothamel 05ecf7a410 Add nvl_thought style and nvl_narrator character. 2016-07-16 01:53:43 -04:00
Tom Rothamel dcf69973bd gui: NVL improvements. 2016-07-16 01:39:36 -04:00
Tom Rothamel 439aabde01 Add xfit and yfit style properties of fixed. 2016-07-16 00:39:06 -04:00
Tom Rothamel c0cd0d30fd gui: New NVL layout. 2016-07-15 23:27:18 -04:00
Tom Rothamel 6128306470 gui doc: History. 2016-07-15 00:41:45 -04:00
Tom Rothamel abb7b47dcd gui: Various fixes to say, history. 2016-07-14 23:12:08 -04:00
Tom Rothamel 8eb91fda15 gui: Comment init. 2016-07-14 22:42:37 -04:00
Tom Rothamel a85a606654 gui: More customizable history screen. 2016-07-14 02:20:30 -04:00
Tom Rothamel c55a5c13ef gui doc: Dialogue, part deux. 2016-07-14 00:30:17 -04:00
Tom Rothamel 6b27fec833 Fix regression in GL test.
Forgot to remove debug code.
2016-07-13 23:57:36 -04:00
Tom Rothamel d793ba337c Add indonesian translation of the launcher.
Contributed by Pratomo Asta Nugraha.
2016-07-12 21:39:41 -04:00
Tom Rothamel 839d646d79 gui: Fix performance warning screens. 2016-07-12 21:21:02 -04:00
Tom Rothamel 8743e1c9d3 gui: Have the input screen use the dialogue settings. 2016-07-12 18:57:58 -04:00
Tom Rothamel cf019e28db gui: More textbox customizations. 2016-07-12 09:48:12 -04:00
Tom Rothamel 9cf6365532 Start dialogue rework. 2016-07-12 01:57:39 -04:00
Tom Rothamel 0b265c6888 gui doc: namebox. 2016-07-11 00:47:37 -04:00
Tom Rothamel cb8817bb30 gui doc: Skip and notify. 2016-07-11 00:13:54 -04:00
Tom Rothamel f968130ca4 gui doc: Bars. 2016-07-10 19:09:51 -04:00
Tom Rothamel cb366b7fe5 gui: Modernize the frame styles. 2016-07-10 13:31:56 -04:00
Tom Rothamel 137aba5596 gui doc: Scrollbars. 2016-07-10 01:28:15 -04:00
Tom Rothamel a5d025d6db gui doc: Scrollbars. 2016-07-10 01:24:31 -04:00
Tom Rothamel 86c5a24b20 gui: Yfill viewports, add scrollbars. 2016-07-10 00:41:09 -04:00
Tom Rothamel e7c786d61b Add xfill and yfill to side. 2016-07-10 00:36:31 -04:00
Tom Rothamel d0b33e3d3e gui: Make unscrollable configurable. 2016-07-09 23:56:47 -04:00
Tom Rothamel 0f2da9a6e4 gui doc: Sliders. 2016-07-09 22:43:20 -04:00
Tom Rothamel 122a10ea94 Generate string translations for comments ending in #. 2016-07-09 01:02:01 -04:00
Tom Rothamel 5a1740d348 gui: Propertly wrap commments ending in ####... 2016-07-09 00:44:50 -04:00
Tom Rothamel 3113041d13 Update existing docs to match changes. 2016-07-09 00:17:38 -04:00
Tom Rothamel 634d5bd8b1 gui doc: Update oshs to support choice_button. 2016-07-08 22:21:29 -04:00
Tom Rothamel 2d6031df83 gui: Move to using choice_button, like the other buttons. 2016-07-08 01:28:20 -04:00
Tom Rothamel 2435b09e47 gui: Use button properties to define text colors. 2016-07-07 22:49:30 -04:00
Tom Rothamel 058d8aa808 gui: More reordering, tweaking, and formatting. 2016-07-07 00:29:46 -04:00
Tom Rothamel d634e24a3d gui: Rename/reorganize things. 2016-07-06 23:34:02 -04:00
Tom Rothamel 21a8a568ce gui: Remove debug print. 2016-07-05 23:42:14 -04:00
Tom Rothamel 9396690668 gui: Remove tile from borders in gui. 2016-07-05 23:37:34 -04:00
Tom Rothamel 1a2c83dcdf Remove tile from Borders.
It makes sense for tile to be inherited independently from the
Borders object, so we don't have to re-specify the tile each
time the borders change.
2016-07-05 23:36:44 -04:00
Tom Rothamel c5a3f8eea6 gui: New handling of buttons.
The idea is to use functions to generate properties that are used
to manage button info from a small number of gui variables.
2016-07-05 02:25:24 -04:00
Tom Rothamel 0a7804a45a gui: Change how we do buttons.
The new approach is to use a pair of functions to try to generate
the sizes and properties of buttons, to improve functionality
and reduce the amount of code needed.
2016-07-04 20:11:08 -04:00
Tom Rothamel b6cb41fb40 Allow the styles statement to take a properties dict.
This makes it more orthagonal to SL2, and better in
general.
2016-07-04 19:58:37 -04:00
Tom Rothamel be75dc3c50 gui: Allow repositioning of navigation buttons. 2016-07-04 12:44:06 -04:00
Tom Rothamel f3cf0ca3e2 gui doc: Add sliders to OSHS. 2016-07-04 12:14:10 -04:00
Tom Rothamel 7a6ab7a786 Document save slot customization. 2016-07-04 00:45:14 -04:00
Tom Rothamel 7fa9f29e52 gui doc: Update the look of button images to not be terrible. 2016-07-03 22:11:14 -04:00
Tom Rothamel 0c443e296f doc: Better presentation of variable definitions. 2016-07-03 18:52:29 -04:00
Tom Rothamel b0658b49e7 Limit button size to xmaximum and ymaximum. 2016-07-03 18:15:29 -04:00
Tom Rothamel 5a03d5d484 gui doc: Buttons. 2016-07-03 18:14:59 -04:00
Tom Rothamel e999652608 gui doc: Checkpoint button work. 2016-07-03 00:50:51 -04:00
Tom Rothamel 44ce212081 gui doc: Bring oshs up to parity with previous version.
More or less.
2016-07-02 14:44:27 -04:00
Tom Rothamel a78d11bb96 gui doc: Update oshs with new code and images. 2016-07-02 01:04:36 -04:00
Tom Rothamel 685bb97e8d gui: Use gui_images to generate gui images.
This makes it possible to regenerate the image based on creator-
selected sizes, colors, etc.
2016-07-02 00:22:31 -04:00
Tom Rothamel 39fa3ae6b8 gui: Increase the size of slider thumbs. 2016-07-02 00:18:47 -04:00
Tom Rothamel b1281ed0e9 gui: Use the correct slot sizes. 2016-07-02 00:16:49 -04:00
Tom Rothamel 29af9f909a gui: Remove obsolete code from image generator. 2016-07-01 22:34:10 -04:00
Tom Rothamel bda9b0dbed gui: Fixes
* Allow room for the preferences screen.
* Highlight the page name like a button.
2016-07-01 01:37:35 -04:00
Tom Rothamel 47ac00b6c5 gui: Generate slot images. 2016-07-01 01:28:51 -04:00
Tom Rothamel fce5166464 gui: Generate sliders, bars, and scrollbars. 2016-06-30 23:29:54 -04:00
Tom Rothamel 2974539340 gui: Include muted_color and hover_muted_color in gui.rpy.
This lets 00gui used them to generate bar, slider, and
scrollbar images.
2016-06-30 23:01:00 -04:00
Tom Rothamel 4999c3fbda gui: Generate button images in the game code.
This will allow a workflow where the creator customizes the GUI,
and then Ren'Py generates image templates.
2016-06-30 01:02:04 -04:00
Tom Rothamel ead671d113 gui: Explicit widths/heights, reuse button images.
Trying to make a GUI proved very difficult. It was hard to
pick the right size for buttons, since font changes could
break things. There were also way too many button images.

This change lets us get away with far fewer button images (as little
as 4, although some will be duplicated).

It also makes it easier to reposition certain things.
2016-06-30 00:49:39 -04:00
Tom Rothamel 908f354bae Allow [prefix_] in background and child style properties.
A missing comma combined those two, making neither work.
2016-06-30 00:42:14 -04:00
Tom Rothamel 2dcf361c28 DynamicImage: Fix display_or_none's dynamic parameter. 2016-06-29 23:07:01 -04:00
Tom Rothamel 506d1fa3b9 doc: Change disclaimer. 2016-06-29 02:58:52 -04:00
Tom Rothamel f45eb36bd8 DynamicImage: Fix support for lists. 2016-06-28 22:41:16 -04:00
Tom Rothamel 26fdefdc6b Allow displayables to be lists.
Specifically, a list of image files or filenames. This makes it
possible to have Ren'Py (and especially the new GUI) select from
a list of alternative choices.
2016-06-27 23:33:21 -04:00
Tom Rothamel 836301f586 gui: Add button_size. 2016-06-27 22:52:46 -04:00
Tom Rothamel 7a98db0d37 gui: Fix gui.choice_idle_color. 2016-06-26 19:56:12 -04:00
Tom Rothamel 1a4840a74a gui doc: Document frames and borders. 2016-06-26 18:08:04 -04:00
Tom Rothamel 438347569c Remove padding from the confirm screen template.x 2016-06-26 18:07:44 -04:00
Tom Rothamel 7520e35f2f gui docs: Borders images.
Too tired to write today. :(
2016-06-26 01:38:54 -04:00
Tom Rothamel 9909df9a63 An image for demonstrating how borders work. 2016-06-25 23:15:57 -04:00
Tom Rothamel d1c68deff1 gui doc: Fonts and Font Sizes. 2016-06-25 00:36:52 -04:00
Tom Rothamel cf9cbee8be gui doc: Colors. 2016-06-25 00:16:51 -04:00
Tom Rothamel 4c6eccd590 Commit various things. 2016-06-25 00:16:03 -04:00
Tom Rothamel 96e6e01060 gui: Support variables giving menu colors. 2016-06-24 00:16:59 -04:00
Tom Rothamel f397e7f1cc gui doc: Say Screen and Textbox. 2016-06-23 18:39:33 -04:00
Tom Rothamel f24ac6ef44 gui: Use gui.text_color. 2016-06-23 02:13:22 -04:00
Tom Rothamel 1f2a6521af gui doc: Say demo. 2016-06-23 02:13:00 -04:00
Tom Rothamel 5dc85919c0 gui: Create the images directory if missing. 2016-06-23 00:34:58 -04:00
Tom Rothamel 8f50094b22 gui: Fix and comment the default script. 2016-06-22 23:07:52 -04:00
Tom Rothamel 0ae0d848c5 doc: Reduce the size of gui images. 2016-06-22 01:23:17 -04:00
Tom Rothamel a44f505856 docs: Bootstrap-based docs. 2016-06-21 02:23:11 -04:00
Tom Rothamel 25f28d1201 gui: More documentation. 2016-06-20 22:39:56 -04:00
Tom Rothamel 996ad58a6b gui: Rename the main and game menu overlay images. 2016-06-20 21:05:35 -04:00
Tom Rothamel 8f381f54b8 Check in oshs test project. 2016-06-20 20:53:11 -04:00
Tom Rothamel bdcb02c4c9 Properly pass local constants to _scope.
In screen code like:

    for i in range(100):
        text "[i]"

I becomes a local constant. In the case where the entire screen
is constant, i could be missing (or have the wrong value) when
_scope is called to update text with the changed global
variables.

This fixes that problem, by storing the local constants and
adding them back to the scope before calling _scope().
2016-06-19 14:46:44 -04:00
Tom Rothamel 8ecc1b62f8 Allow iteration over DeltaSets. 2016-06-19 14:46:23 -04:00
Tom Rothamel 32e91674da Better comments on the gui. 2016-06-18 12:44:29 -04:00
Tom Rothamel 7781b977c1 Default config.quit_action to Quit().
Nowadays, it's better in most ways, so we should change to it.
2016-06-18 12:12:09 -04:00
Tom Rothamel c1d5286139 gui: Document many screens, move ctc to docs. 2016-06-17 22:49:19 -04:00
Tom Rothamel 1b9872a158 gui: Document the preferences screen. 2016-06-17 20:21:02 -04:00
Tom Rothamel c55bd6efca gui: Partially comment/organize gui.rpy. 2016-06-17 01:58:12 -04:00
Tom Rothamel e07b361415 gui: Rename the file slot background image. 2016-06-16 22:55:51 -04:00
Tom Rothamel e4acf2683d gui docs: Tweak paths. 2016-06-16 01:28:56 -04:00
Tom Rothamel 9b7b88af17 Update docs. 2016-06-16 01:28:44 -04:00
Tom Rothamel 07fb9df08b Add example pictures for gui. 2016-06-16 01:06:34 -04:00
Tom Rothamel 7a12bc6d55 gui: Fixes to code generation.
* Do not overwrite options.rpy or script.rpy - ever.
* Properly quote options.rpy entries, and mark for translation when
  appropriate.
2016-06-16 00:30:10 -04:00
Tom Rothamel 3f0e01530d Document window_icon. 2016-06-15 23:00:42 -04:00
Tom Rothamel 6b5c02bbc0 gui: More work on documentation. 2016-06-14 19:04:38 -04:00
Tom Rothamel 723d248f42 gui: Fix generation of new projects. 2016-06-14 19:00:37 -04:00
Tom Rothamel cb25514f81 Add gui.about to options.rpy.
Proper credit seems important.
2016-06-14 19:00:12 -04:00
Tom Rothamel 57ef911f0c Start work on gui documentation. 2016-06-14 18:35:34 -04:00
Tom Rothamel 6a0896b08b Add a link to the gui directory to the front page. 2016-06-14 18:35:02 -04:00
Tom Rothamel 8d97001197 Document building for ChromeOS. 2016-06-13 21:36:20 -04:00
Tom Rothamel ab064fbe0a Merge pull request #957 from morganwillcock/fix-typo
Fix some typos in documentation
2016-06-12 19:18:05 -04:00
Tom Rothamel b310c9f51c Add config.tts_voice, allowing selection of TTS voice.
Fixes #927.
2016-06-12 18:02:27 -04:00
Morgan Willcock bc9a8cbb00 Fix some typos in documentation
Fix some typos and edit line lengths (where the changes left the line a
little short).
2016-06-12 22:47:15 +01:00
Tom Rothamel 7b30c04c4d Document keysym/alternate_keysym, and add it to hotspots. 2016-06-11 12:04:21 -04:00
Tom Rothamel 29a124a152 Generate docs. 2016-06-11 12:01:32 -04:00
Tom Rothamel 5bbd752f0f Add keysym and alternate_keysym to buttons.
These provide a way to use keyboard keys to invoke the
action of the button.

Fixes #866.
2016-06-11 11:36:16 -04:00
Tom Rothamel b41a188a63 Remove disclaimers from docs. 2016-06-10 20:23:59 -04:00
Tom Rothamel 4b06e96d28 Update the changelog. 2016-06-10 20:23:59 -04:00
Tom Rothamel 3e37a02781 Merge pull request #956 from caryoscelus/master
fix missing word in docs
2016-06-10 19:40:53 -04:00
caryoscelus 2fa21e09a0 fix missing word in docs 2016-06-10 16:41:14 +03:00
Tom Rothamel 211abebb3d Work on changelog. 2016-06-10 00:56:16 -04:00
Tom Rothamel b90b3db579 Merge pull request #955 from kevinturner/master
Update MultipleTransition documentation example
2016-06-09 22:27:43 -04:00
Kevin Turner 0555149891 Updated MultipleTransition example
Given example is missing a comma and doesn't function in game.
2016-06-09 17:19:29 -04:00
Kevin Turner ad2ff1e446 Update MultipleTransition example in Sphinx 2016-06-09 17:18:19 -04:00
Kevin Turner 4580da346d Merge pull request #1 from renpy/master
Moving up to date with latest Ren'Py
2016-06-09 17:15:44 -04:00
Tom Rothamel 55ceca13b2 gui: Add a background image to the quick buttons. 2016-06-09 02:43:00 -04:00
Tom Rothamel 6ff21da818 viewport: Fix non-arrowkeys scrolling. 2016-06-08 22:58:19 -04:00
Tom Rothamel a4f050cd86 Fix tts/test mode. 2016-06-07 23:20:54 -04:00
Tom Rothamel ff130134ac Duplicate Text when slow is true.
This allows slow to be used when displaying Text that's associated
with an image, and have it work right.

Fixes #893.
2016-06-07 22:43:25 -04:00
Tom Rothamel 5d3b6365bc Merge pull request #952 from kevinturner/patch-1
Add {alpha} to text_tags dict
2016-06-07 00:14:58 -04:00
Tom Rothamel 3938c6ca94 Add viewport arrowkeys to the controller. 2016-06-07 00:12:55 -04:00
Tom Rothamel 4ffcd5861a Allow a viewport with arrowkeys True to share focus. 2016-06-07 00:09:26 -04:00
Tom Rothamel c7716deb46 Allow focuses with x=0 to be focused. 2016-06-07 00:08:36 -04:00
Tom Rothamel 486f935769 Merge branch 'master' of https://github.com/Nolanlemahn/renpy into Nolanlemahn-master 2016-06-06 22:02:59 -04:00
Kevin Turner fb190105da Add {alpha} to text_tags dict
Prevents {alpha} from being incorrectly identified as an invalid text tag during Lint scans.
2016-06-06 21:46:17 -04:00
Tom Rothamel 059f5a92ac gui: Two window support. 2016-06-06 01:53:21 -04:00
Tom Rothamel 990a76e529 Merge branch 'local-labels' of https://github.com/caryoscelus/renpy into caryoscelus-local-labels 2016-06-05 21:10:17 -04:00
Tom Rothamel bf7a4945bc Force the movie channel to be a movie channel.
It was possible to use renpy.register_channel to redefine the movie
channel, but not set movie=True. (For example, Sunrider: Liberation
Day did this.)
2016-06-04 22:56:25 -04:00
Tom Rothamel b217362484 Remove _ from an image_word_regexp.
We want it to be parsed as a simple expression so the translator can see it.
2016-06-04 21:08:13 -04:00
Tom Rothamel eb1b7bbedf Merge pull request #922 from Shizmob/master
Use proper API for determining if screen is showing in Show().
2016-06-04 14:59:39 -04:00
Tom Rothamel 9dc65f19bb Only take memory profiles in developer mode. 2016-06-04 11:09:39 -04:00
Tom Rothamel 679f4ec4f1 Center the presplash on HighDPI windows screens.
Fixes #919.
2016-06-03 17:35:31 -04:00
Tom Rothamel bab7caec95 Add a continue button to the launcher input screen.
Fixes #950.
2016-06-02 23:55:55 -04:00
Tom Rothamel afd0685302 InputValue improvements.
* The default input values now take a returnable field, that controls
  if a value is returned when enter is pressed.
* ScreenVariableInputValue has been fixed.
2016-06-02 23:53:16 -04:00
Tom Rothamel 93a55fcc86 Document extracting and merging string translations. 2016-06-02 01:13:24 -04:00
Tom Rothamel 4c966b4789 Reset the default input value on each interaction.
This is the commit from hell, since my computer crashed during it,
due to a disconnected sdd. orz.
2016-06-01 23:46:21 -04:00
Tom Rothamel 14ef634f8a UI for translation merging. 2016-06-01 02:20:24 -04:00
Tom Rothamel 1789403654 translation: Merge command. 2016-05-31 22:44:33 -04:00
Tom Rothamel df79b06aba Update the variable viewer. 2016-05-31 02:09:05 -04:00
Tom Rothamel 1b8d1be10d Update the developer menu. 2016-05-30 22:56:44 -04:00
Tom Rothamel d91a52b0da Fix detection of a useable android SDK. 2016-05-30 20:00:33 -04:00
Tom Rothamel 510615c9c5 Update parse error screen. 2016-05-30 16:21:45 -04:00
Tom Rothamel 174738696e Update the default updater screen. 2016-05-30 16:12:04 -04:00
Tom Rothamel 30076846c0 screens: Update _inspect_style. 2016-05-29 23:20:32 -04:00
Tom Rothamel de200d995d screen: Use sides for a standard fullscreen layout. 2016-05-29 23:04:04 -04:00
Tom Rothamel bbc0f70f19 Work on the style inspector. 2016-05-29 13:09:59 -04:00
Tom Rothamel 25d515ac6e Tweak the look of the gl screen. 2016-05-29 12:54:55 -04:00
Tom Rothamel 6f4b2eb99b Add new styling to safe mode screen. 2016-05-29 03:27:30 -04:00
Tom Rothamel 74be547f7a errorhandlong: Add a base_bar to the scrollbar. 2016-05-28 15:49:49 -04:00
Tom Rothamel dee47412df Update exception handling to match the new gui. 2016-05-28 15:06:03 -04:00
Tom Rothamel 742f9b229a errorhandling: Run the style code twice.
This will be used to adjust the styles to the size of the screen,
once that is known.
2016-05-27 23:32:54 -04:00
Tom Rothamel 264c5fba80 Pick better default sizes for error screens. 2016-05-27 23:06:04 -04:00
Tom Rothamel 271a6259a5 translate: String extraction gui. 2016-05-26 23:22:52 -04:00
Tom Rothamel 83612fdce7 translation: Extract strings into a file. 2016-05-26 21:06:12 -04:00
Tom Rothamel 873c91bfdb translation: Move things to the right file. 2016-05-26 21:05:55 -04:00
Tom Rothamel 748fbaba23 translate: Move common generation out into its own label. 2016-05-26 20:25:48 -04:00
Tom Rothamel ecc6afb3fb translate: Allow translate screen to generate translations. 2016-05-26 20:08:02 -04:00
Tom Rothamel e35b962fbf Translate screen. 2016-05-26 01:49:01 -04:00
Tom Rothamel b806818f6b Fix include. 2016-05-26 00:39:07 -04:00
Tom Rothamel b2e3326748 Break translation.rpy out into 3 files. 2016-05-24 21:50:05 -04:00
Tom Rothamel 4192e9d3e9 Store the locations of string translations. 2016-05-24 21:29:19 -04:00
Tom Rothamel 6d772c6065 gui: Add the ability to change and update the gui.
This lets one change the colors, and optionally update gui.rpy
and change sizes.
2016-05-23 22:08:15 -04:00
Tom Rothamel 4ac8c46073 Do not overwrite main_menu.png and game_menu.png. 2016-05-23 21:02:24 -04:00
Tom Rothamel 50b480fd82 Merge pull request #947 from xavi-mat/master
change link to old wiki
2016-05-23 19:37:04 -04:00
Tom Rothamel db6ce95bc7 Remove debug print. 2016-05-22 23:10:20 -04:00
Tom Rothamel 82b4d18b02 Fix repr in code generation. 2016-05-22 23:09:24 -04:00
Tom Rothamel 35e1f72d67 Add ScreenVariableValue.
This is a bar value that controls a screen variable.
2016-05-22 22:31:13 -04:00
xavi-mat c0a40ec51f change link to old wiki
The Quickstart had a link to the download page of the old wiki.
2016-05-22 22:41:49 +02:00
Tom Rothamel f0b219624b gui: Preview color selection. 2016-05-22 15:58:30 -04:00
Tom Rothamel ef70b36a95 gui: Support creating new projects. 2016-05-22 01:31:48 -04:00
Tom Rothamel 96565accd9 Ask about the gui size. 2016-05-21 16:45:01 -04:00
Tom Rothamel 17d893b4b0 gui: Color selection scheme. 2016-05-20 23:26:30 -04:00
Tom Rothamel 6a66d51f20 Allow a Color to be used as a displayable. 2016-05-20 23:26:11 -04:00
Tom Rothamel a855d9153e Color swatches. 2016-05-20 00:30:07 -04:00
Tom Rothamel 8489affbca Ask if we want to create a new or old game. 2016-05-19 22:41:01 -04:00
Tom Rothamel 6fda701cf3 Allow editing of gui.rpy. 2016-05-18 22:02:12 -04:00
Tom Rothamel 3a47c23ab7 Create all launcher tmp files under launcher/tmp.
This should make it easier to put projects on dropbox and so on,
without letting temporary files take up space.
2016-05-18 20:56:59 -04:00
Tom Rothamel 89c6369435 Redefine the movie channel late in init.
This gives time for the creator to set config.hw_video to false
before the channel is set up.
2016-05-17 20:31:40 -04:00
Tom Rothamel 4d35917b84 Merge pull request #944 from susnux/master
Improve the buildsystem (setup.py)
2016-05-17 20:21:33 -04:00
Tom Rothamel 0ac147914e gui: Comment, organize, and improve. 2016-05-16 23:05:21 -04:00
Tom Rothamel 17b1fa020e gui: Rewrite and rename images to make use of [prefix_]. 2016-05-16 22:39:21 -04:00
Ferdinand Thiessen c1f05b09a4 Improve the buildsystem (setup.py)
* Allow libav* libsw* headers in ffmpeg subdirectory
  (done by some distribution like openSUSE)
* Also search in lib64 and lib32 for libraries
2016-05-16 14:55:38 +02:00
Tom Rothamel 3278c51ac7 Fix duplicate. 2016-05-16 01:00:14 -04:00
Tom Rothamel eb6bd19290 prefix search: Documentation 2016-05-15 20:51:45 -04:00
Tom Rothamel c7913ca1c3 prefix search: Search images as well as files
It seems less likely to be used than an image directly, but
still possible, so might as well support it.
2016-05-15 20:48:50 -04:00
Tom Rothamel 9319366992 prefix search: insensitive states use idle_ prefixes
The idea behind this change is that it's pretty common to
indicate idleness by a text color change, and it's better
to just reuse the idle_ prefixed-image if no insensitive
one exists, rather than erroring out.
2016-05-15 20:44:00 -04:00
Tom Rothamel f4c619908c Add base_bar style property.
This lets one set left_bar/right_bar or top_bar/bottom_bar at the
same time, which should make slider and scrollbar code look a
lot cleaner.
2016-05-15 12:44:42 -04:00
Tom Rothamel f332f614b4 Allow dynamic images to take [prefix_].
This is replaced by a search list of style images, which are
searched until a file exists.
2016-05-14 21:54:36 -04:00
Tom Rothamel bf52cd2120 duplicate: Fix Displayable._copy(). 2016-05-14 21:12:04 -04:00
Tom Rothamel 82d9ef8d32 prefix_: Generate the list of style prefixes to search. 2016-05-14 16:59:24 -04:00
Tom Rothamel 8554201acb Duplicate and apply prefixes to displayable style properties. 2016-05-14 16:28:40 -04:00
Tom Rothamel 007894c2be Rename Displayable.parameterize -> ._duplicate.
After a long time of having parameterize mutate and take on
additional meaning, it makes sense to rename the method
to describe what it does - duplicate displayables that
do not take user input. It also supplies arguments to
those displayables as necessary.

Fixes #936.
2016-05-13 21:54:29 -04:00
Tom Rothamel 4faa887174 Only duplicate a container if a child is duplicated. 2016-05-13 20:35:00 -04:00
Tom Rothamel a0f23025dc parameters: Properly set Container.child when duplicated. 2016-05-13 20:28:53 -04:00
Tom Rothamel 4726fd648f parameters: Button should not be parameterized. 2016-05-13 00:46:20 -04:00
Tom Rothamel 2af73eb0bc Remove default name.
This makes placeholders work properly.
2016-05-13 00:05:40 -04:00
Tom Rothamel 49e3b4dc7a parameterize: Return status from find_target.
This prevents placeholders from always displaying.
2016-05-12 23:59:58 -04:00
Tom Rothamel 4ddcb3e49c parameters: Add to other places. 2016-05-12 23:49:44 -04:00
Tom Rothamel b0dec2047b Parameterize takes a Parameters object. 2016-05-12 22:50:04 -04:00
Tom Rothamel c48ef7132e parameters: Merge. 2016-05-12 21:42:01 -04:00
Tom Rothamel 2c086aaaf1 Change Displayable._get_parameterized to ._target.
This is used to get the ultimate target of one or more
ImageReferences, especially if that target is a displayable.

This used to be a lot more complicated, but since going forwards,
all ImageReferences will be parameterized, it makes sense to
use a simpler name and semantics for the method.
2016-05-11 23:15:25 -04:00
Tom Rothamel 5c19936d5f Fix typo. 2016-05-10 19:54:49 -04:00
Tom Rothamel 8ad3365f42 Document x/ypan, x/ytile transform properties. 2016-05-10 19:54:04 -04:00
Tom Rothamel a88b61d98a Add xtile and ytile transform properties. 2016-05-10 19:39:15 -04:00
Tom Rothamel 45fc56aae3 Add xpan and ypan. 2016-05-10 10:27:30 -04:00
Tom Rothamel 4775799268 Add renpy.get_refresh_rate()
This returns the refresh rate of the underlying monitor, which
allows games (especially those that use nearest-neighbor) to
create movements that are synchronized with the speed of the
underlying monitor.
2016-05-05 21:17:00 -04:00
Tom Rothamel b6b086f963 Remove obsolete version check. 2016-05-05 20:40:47 -04:00
Tom Rothamel 46a237a3ba gui: Add a separate color for interface text. 2016-05-03 23:09:27 -04:00
Tom Rothamel 9f9fe980a9 gui: Add a size group to the navigation buttons. 2016-05-03 22:15:46 -04:00
Tom Rothamel 2fb5820f2d Remove debug print. 2016-05-03 22:02:59 -04:00
Tom Rothamel e6e656f8d0 Add support for horizontal scrolling via mousewheel to viewports.
Fixes #928.
2016-05-03 21:55:22 -04:00
Tom Rothamel c264025f1c gui: Place the confirm screen above other screens. 2016-05-02 22:03:18 -04:00
Tom Rothamel c7d69778d5 gui: Ensure guisupport works. 2016-05-02 22:02:37 -04:00
Tom Rothamel 8f7218f46e gui: Remove all the gui.SCREAMING.
We went from a small number of constants to a larger number of
config-like variables, so it makes sense to have them follow
the casing convention of config variables.
2016-05-02 21:55:39 -04:00
Tom Rothamel 7426bbcc62 gui: Change Insets to Borders.
Insets were defined as part of the gui. Borders are defined as
part of Ren'Py proper. gui.Frame went away, as we can now use
plain-old Frame with a Borders object as the second parameter.
2016-05-02 21:38:42 -04:00
Tom Rothamel 1556c3f7a2 Hide the progress text from self-voicing. 2016-05-02 21:08:29 -04:00
Tom Rothamel 2b5816abc1 Add the number of newly seen translates to _progress.
Fixes #933, more or less.
2016-05-02 20:45:51 -04:00
Tom Rothamel 86497f01d1 gui: Use gui.Insets to store inset and padding information. 2016-05-01 23:46:09 -04:00
Tom Rothamel 9dde07217b Add padding and margin style properties.
These let us pass tuples into these parameters, which should make
gui code that much cleaner.
2016-05-01 22:14:17 -04:00
Tom Rothamel 3f2bac0a0e gui: Generate scrollbar files in subdirectories. 2016-05-01 12:12:27 -04:00
Tom Rothamel a38d921d82 gui: Update naming of buttons and frames. 2016-05-01 01:17:26 -04:00
Tom Rothamel e5edf19226 gui: Replace darken images with overlay images.
The overlay images "bake in" the separator lines, where necessary,
making it easier to replace the separator lines with more interesting
ones.
2016-05-01 00:11:15 -04:00
Tom Rothamel d2aa858927 gui: Use bar size abstraction variables in phone mode. 2016-04-30 20:52:40 -04:00
Tom Rothamel cce4afef66 Enter game menu when entering developer screens.
This gets rid of various overlays that only make sense in-game.

Fixes #932.
2016-04-30 15:16:12 -04:00
Tom Rothamel 0624bfcbb7 Ensure we find the icon template. 2016-04-29 21:22:21 -04:00
Tom Rothamel 8851102e26 gui: Indirect frames and slider sizes.
This is in keeping with the idea that it should be possible to
accomplish basic customization with just image files and
defines.
2016-04-29 21:21:30 -04:00
Tom Rothamel b033bf0877 gui: Introduce gui.Frame.
This is a Frame that takes its border sizes from variables
defined in the GUI namespace.
2016-04-29 21:11:52 -04:00
Tom Rothamel 62facbbe4f gui: Add a padding setting. 2016-04-28 21:18:43 -04:00
Tom Rothamel 957eba4e82 Exclude older themes when a new gui is used.
Fixes #930.
2016-04-28 19:49:15 -04:00
Tom Rothamel 8449464d7a Make window auto hide window before call screen is run.
Fixes #929.
2016-04-28 18:46:49 -04:00
Tom Rothamel eac29c4878 Avoid making backups when testing the gui. 2016-04-28 18:34:24 -04:00
Tom Rothamel dd17c3145d gui: Default say_label to ACCENT_COLOR.
This seems less boring than white.
2016-04-28 00:37:37 -04:00
Tom Rothamel 1333114ea5 Add config.window.
This is a variable that sets the default for window hide/show/auto.
2016-04-28 00:26:21 -04:00
Tom Rothamel b52445a297 itch: Integrate with ConsoleCommand. 2016-04-27 22:04:13 -04:00
Tom Rothamel 175433c32a Add a way of running commands in a console window.
This is way harder than it should be to do in a cross-platform
fashion.
2016-04-27 22:01:50 -04:00
Tom Rothamel b6a23e897b itch: Generate an upload script. 2016-04-27 00:01:19 -04:00
Tom Rothamel 6bb5902eab itch: Take the project name from build.itch_project. 2016-04-26 23:08:58 -04:00
Tom Rothamel dce2b86206 itch: Search for butler. 2016-04-26 22:22:59 -04:00
Tom Rothamel 18335c2e17 gui: Generate and use a default window icon. 2016-04-25 23:05:55 -04:00
Tom Rothamel 0218270b0d Remove the use of config.windows_icon.
Was the last time this was useful Windows 2000?
2016-04-25 19:51:22 -04:00
Tom Rothamel 839e1584c3 gui: Mark name for translation. 2016-04-24 21:18:49 -04:00
Tom Rothamel 93263d4a26 Deal with BOMs in comment translations. 2016-04-24 21:17:34 -04:00
Tom Rothamel 5540612998 gui: New default options.rpy. 2016-04-24 20:45:55 -04:00
Tom Rothamel 40f09f6082 Add the preferences namspace.
This lets us set default values for preferences directly, using
a statement like:

    default preferences.text_cps = 100
2016-04-24 20:44:11 -04:00
Tom Rothamel 54a6545dfa Support using the define statemen to set config.save_directory.
This previously required using the weird python early syntax.
We can hide some of that complexity by moving the weirdness
into the define statement itself.
2016-04-24 19:10:04 -04:00
Tom Rothamel d77925cc9a gui: New options file.
The idea is to simplify things, and remove redundant options,
as much as possible.
2016-04-24 19:09:20 -04:00
Tom Rothamel 498ff4b398 Default config.window_title to config.name.
This means that the creator will only need to set the game's name
in a single place.
2016-04-24 18:52:34 -04:00
Tom Rothamel 405158010c Fix sense of test. 2016-04-24 18:51:59 -04:00
Tom Rothamel 49820ee286 Use build.name to generate build.directory_name and .executable_name. 2016-04-24 17:19:28 -04:00
Tom Rothamel cda4c52383 Comment last change so I can see why I made it. 2016-04-24 16:23:04 -04:00
Tom Rothamel 1e5d56329a Treat non-laid-out text as taking zero time.
If it's not laid out, it hasn't been drawn recently, and so the
text isn't animating and there's no reason to wait for the
animation to complete.

Fixes #905.
2016-04-24 15:58:50 -04:00
Tom Rothamel 47ce5f8725 Ignore a saved physical size when the gui size changes.
Fixes #907.
2016-04-23 23:14:31 -04:00
Tom Rothamel 11e6a98307 Move confirm screen strings into the gui module.
Fixes #923.
2016-04-23 17:07:27 -04:00
caryoscelus 66cc0518fd document local labels 2016-04-23 14:30:46 +03:00
caryoscelus 2af80160d5 local labels: replace '.' to '_' in translations 2016-04-23 13:11:46 +03:00
caryoscelus 63dee62959 local labels: forbid global name mismatch in declarations
prevent this from working:

    label g1:
    label g2.l:
        ...
2016-04-23 13:11:46 +03:00
caryoscelus 2613451a46 add local/nested labels support
This allows to have 'local' labels with short names without
name collisions. Such labels are prefixed by '.' (e.g. .local_label)
and can be referenced directly in current global label context or
from any context by using full form 'global_label.local_label'
2016-04-23 13:11:46 +03:00
Tom Rothamel 96da230234 gui: Codegen colors, and add light colors. 2016-04-23 00:18:39 -04:00
Tom Rothamel 739af5df85 Start work on the light theme. 2016-04-22 23:42:43 -04:00
Tom Rothamel 0007af39a0 Various fixups to gui code generation. 2016-04-22 22:28:14 -04:00
Shiz 76a534d3a4 Use proper API for determining if screen is showing in Show(). 2016-04-22 12:42:55 +02:00
Tom Rothamel 84176f4fab gui: Land renpy/interface_7 into Ren'Py proper. 2016-04-21 23:04:00 -04:00
Tom Rothamel 256976b7e5 Finer-grained control over code/image updates. 2016-04-21 22:39:47 -04:00
Tom Rothamel 099983a33f Merge pull request #921 from Shizmob/master
Clarify error when unable to find platform files.
2016-04-21 10:53:55 -04:00
Tom Rothamel 8d4293cf50 Merge pull request #918 from XelaPy/patch-1
Index Fix in UDD Doc
2016-04-20 23:44:29 -04:00
Tom Rothamel f62f813de8 Merge pull request #920 from Shizmob/master
Add "selected" and "sensitive" options to buttons to manually control such.
2016-04-20 23:24:03 -04:00
Tom Rothamel 57bbc231ee Add the Confirm action.
This is an action that prompts the user for confirmation of
an action.

Fixes #917.
2016-04-20 23:21:53 -04:00
Tom Rothamel 8412a6b11c Expose renpy.is_selected and renpy.is_sensitive. 2016-04-20 21:41:57 -04:00
Shiz c0352d953b Clarify error when unable to find platform files. 2016-04-20 15:53:24 +02:00
Shiz 9e9e2ae6b9 Add "selected" and "sensitive" options to buttons to manually control these. 2016-04-20 15:52:47 +02:00
Xela 7131959726 Index Fix in UDD Doc
The upper def visit() like still looks badly indented.
2016-04-20 07:43:33 +03:00
Tom Rothamel 67b011d140 Add a way of counting missing translations. 2016-04-19 22:10:54 -04:00
Tom Rothamel aefa6cc1b1 gui: Translate comments on generation. 2016-04-19 21:36:19 -04:00
Tom Rothamel 64c553354e Fix indentation. 2016-04-19 20:33:01 -04:00
Tom Rothamel 3c9f85aa73 gui: Translate with the launcher. 2016-04-19 20:07:14 -04:00
Tom Rothamel f9195f2550 Change how we generate comments.
The comments will now not contain newlines. Instead, we'll let the
translator automatically wrap the lines, and add spaces ourself.
2016-04-19 19:50:36 -04:00
Tom Rothamel da2cf5b34d Check in missing file. 2016-04-19 19:13:17 -04:00
Tom Rothamel 2ca535335e Search the path for zsync if it doesn't exist. 2016-04-19 19:04:44 -04:00
Tom Rothamel 04cf8137bb Add pig latin filter.
This seems like a good idea to test interface translations, and
also because I'm quite under the weather.
2016-04-18 20:17:13 -04:00
Tom Rothamel 2bbba39efd Fix finnish translation. 2016-04-18 20:13:38 -04:00
Tom Rothamel 1c42f7ed69 Merge pull request #911 from xavi-mat/master
Update Spanish template translation
2016-04-17 23:40:09 -04:00
Tom Rothamel 675f6b93cc Minor fixes to translation. 2016-04-17 22:24:13 -04:00
Tom Rothamel 5e9eb01ec8 Merge branch 'master' of https://github.com/Diapolo10/renpy into Diapolo10-master 2016-04-17 22:23:16 -04:00
Diapolo10 d7bce32eb3 Updated the Finnish translation 2016-04-17 16:31:34 +03:00
xavi-mat 2fbc2ea49c Update common.rpy
New translated strings
2016-04-17 15:00:53 +02:00
xavi-mat 3e4f49671a Update options.rpy
Delete config.developer = True
2016-04-17 14:59:37 +02:00
Diapolo10 30434c0c15 Better translations 2016-04-17 13:37:14 +03:00
Diapolo10 4d67a5b43f Improved translations 2016-04-17 13:26:18 +03:00
Diapolo10 220c256418 Fixed a broken translation 2016-04-17 13:24:59 +03:00
Diapolo10 47d0c17451 Fixed a problem with a broken translation.
The translation for "Teemaa ei voitu vaihtaa. Kenties options.rpy:tä muutettiin liikaa." (line 1) was on the wrong string.
2016-04-17 13:18:16 +03:00
Tom Rothamel 2538d85604 gui: Translate translatable strings.
For example, if we have a Japanese transation for "Rollback",
when we encounter _("Rollback") in gui.rpy, we will replace it
with its translation.
2016-04-16 23:55:06 -04:00
Tom Rothamel 6b69bb507c Make the code generator more generic.
Since we're going to use it to generate options.rpy and script.rpy.
2016-04-16 23:38:09 -04:00
Tom Rothamel fc2a191bb3 Allow a language to be explicitly given to translate_string. 2016-04-16 22:58:33 -04:00
Tom Rothamel a4c99336c3 Make passing two_window and side_image to the say screen optional.
This makes the arguments to the say screen simpler.
2016-04-15 22:35:43 -04:00
Tom Rothamel 970efedd9c Reset the gui store after it is updated.
This ensures that we won't save the store during changes caused
by translation code.

Fixes #908.
2016-04-14 23:51:16 -04:00
Tom Rothamel 705d444522 Remove translation TODOs. 2016-04-14 22:04:58 -04:00
Tom Rothamel b5666983a8 Additional translations. 2016-04-14 22:00:13 -04:00
Tom Rothamel f6abb1f02e Generate translations of comments beginning with ##. 2016-04-13 22:15:04 -04:00
Tom Rothamel 28ca4672aa Add config.translate_files.
This is intended for internal use, and lets the launcher provide an
additional set of files to the translation system. (The main goal
here is to let it grab translations from the GUI.)
2016-04-13 19:58:53 -04:00
Tom Rothamel 4c4019aa0a gui: Generate gui.HOVER_COLOR. 2016-04-12 21:15:42 -04:00
Tom Rothamel 870447df9d gui: Image generation uses correct muted_color. 2016-04-12 21:00:16 -04:00
Tom Rothamel 02fdd9e9cc Framework for updating defines. 2016-04-12 20:48:43 -04:00
Tom Rothamel 6b0ae68b0c Add Color.hexcode. 2016-04-12 17:36:23 -04:00
Tom Rothamel 581dad016f gui: Codegen the gui.init line. 2016-04-12 09:53:43 -04:00
Tom Rothamel 406641790d Code generation framework, eliminate gui.scale. 2016-04-12 00:19:42 -04:00
Tom Rothamel 6e493ee3bf gui: Integrate image generation with launcher.
This includes the addition of a new launcher command line that
generates the gui.
2016-04-11 23:20:06 -04:00
Tom Rothamel e7fdbf8bf4 Merge pull request #906 from EdwardBetts/patch-1
use % formatter
2016-04-10 18:31:22 -04:00
Edward Betts edee377f2a use % formatter 2016-04-10 15:15:52 +01:00
Tom Rothamel c875bdb7bc Start integrating gui7 stuff with the launcher. 2016-04-10 08:53:28 -04:00
Tom Rothamel 1666469e11 Remove debug print. 2016-04-09 10:23:05 -04:00
Tom Rothamel 4133841acc Ignore default properties in the style inspector.
We now do it by ignoring the base of the inheritance, rather than
looking for specific names.
2016-04-09 10:20:24 -04:00
Tom Rothamel da69add0e5 launcher: Remove the need for tls to call make_style_backup.
We now do this automatically using config.change_language_callbacks.
2016-04-08 17:04:44 -04:00
Tom Rothamel 3bdd4a32ab Style reset for nvl-mode styles. 2016-04-08 01:10:28 -04:00
Tom Rothamel 1aad764708 Move gui init and style reset in Ren'Py.
This simplifies the gui code.
2016-04-06 21:59:15 -04:00
Tom Rothamel 150b78f4ae Clean the gui named store when changing languages. 2016-04-06 20:37:45 -04:00
Tom Rothamel 9bf4c09a53 Avoid running translate None statements when the language is not None.
Now that we've comitted to backing up the gui namspace, the
rationale for this is gone.
2016-04-06 00:02:47 -04:00
Tom Rothamel 14c415b9fd Defer styles and change the order of translate style blocks.
The mofivation behind this is that we want translate code to be
able to use a translate python statement to update a couple of
variables that control fonts and sizes, rather than having to
update every style that uses the font or size.

To make this work, we add a way of deferring style statements
until after the translate python code has run, and change
the order of translate python and style code.
2016-04-05 23:57:02 -04:00
Tom Rothamel 1d08c8182b Vietnamese make style backup. 2016-04-04 20:38:23 -04:00
Tom Rothamel c95718410f Fix various code warnings. 2016-04-04 20:26:05 -04:00
Tom Rothamel 6e85050ca8 Resize renders after axis-aligned clipping.
We don't want to do this resizing on surfaces, since a surface
containing Text can overhang its Render. But once that's done,
we want to ensure the Renders are the correct size, so
main_render_at_point works.

Fixes #887.
2016-04-03 23:20:37 -04:00
Tom Rothamel f7db343b46 Merge branch 'master' of github.com:renpy/renpy 2016-04-03 17:03:58 -04:00
Tom Rothamel d1ce0b3d13 Merge pull request #897 from caryoscelus/translate_window
translate window caption
2016-04-03 17:03:46 -04:00
caryoscelus a99afa3f8f translate window caption 2016-04-03 20:47:11 +03:00
Tom Rothamel bb23ce3aaf Add pygame_sdl2 install_headers to README.
Fixes #876, more or less.
2016-04-03 13:30:45 -04:00
Tom Rothamel 5385b1cad2 Checksum script. 2016-04-02 14:18:03 -04:00
Tom Rothamel d3110ba922 Fix translation files. 2016-04-02 13:45:31 -04:00
Tom Rothamel 1ceb3cf0fd Vietnamese launcher and tutorial translations.
Contributed by Thuong nguyen huu.
2016-04-02 13:44:09 -04:00
Tom Rothamel e8143c7b06 Fix typo in tutorial. 2016-04-02 10:50:48 -04:00
Tom Rothamel 9c156bff8f Merge pull request #894 from Shizmob/patch-1
Support pre-6.11 games that overwrite config.layers.
2016-04-01 17:27:51 -04:00
Shiz 26388b7c3b Support pre-6.11 games that overwrite config.layers.
Prior to 6.11, screens weren't a thing and as such there wasn't a "screens" layer.
If games before this time unwisely overwrote the entirety of config.layers,
the screens layer would go missing, leading to all kinds of nasty and unexpected
behaviour later on. An example of a game that can be ran on modern Ren'Py
with this fix is Digital: A Love Story by Christine Love.
2016-04-01 23:24:46 +02:00
Tom Rothamel 27e02046e8 Fix stable link to license. 2016-03-31 23:06:00 -04:00
Tom Rothamel b17bc2776e viewport: Ignore drags when not focused.
Fixes #892.x
2016-03-31 23:00:49 -04:00
Tom Rothamel f8a10b9d8a bar: Ignore events.
When a bar handles events, it should not then pass them on
to other screen elements to handle.
2016-03-31 22:57:53 -04:00
Tom Rothamel 22d581085c Add support for a user-defined CTC screen. 2016-03-31 22:05:31 -04:00
Tom Rothamel 118d39d83b Add mobile as a supported variant.
This variant is used on android and ios.
2016-03-29 22:42:54 -04:00
Tom Rothamel 61fcb278b7 Fix problems with spacing in side. 2016-03-29 01:32:10 -04:00
Tom Rothamel 5a9b244a58 Bars respect {x,y}minimum.
And hence size, area, etc. Previously, they would fail if in a
veiwport.
2016-03-27 23:55:15 -04:00
Tom Rothamel f9a15b5092 Fix box_wrap.
We no longer box wrap if the children are exactly the same size
as the box.
2016-03-27 22:45:13 -04:00
Tom Rothamel cfb93e7b84 Document immersive mode.
So I don't forget.
2016-03-27 11:46:46 -04:00
Tom Rothamel 074d34773f Screens can now take a list of variants. 2016-03-27 10:48:16 -04:00
Tom Rothamel a968a4ee71 Pass MenuEntries to the menu screen.
This lets us get rid of all tuple destructuring in the
gui.
2016-03-26 16:48:01 -04:00
Tom Rothamel d9a7998d90 Supply objects to the nvl screen.
Objects with fields are more readable and extensible than the
previous use of tuples.
2016-03-26 12:26:43 -04:00
Tom Rothamel 5bdb6901a1 Add config.after_load_callbacks. 2016-03-26 11:20:24 -04:00
Tom Rothamel 114b5a0919 Document history. 2016-03-26 11:05:29 -04:00
Tom Rothamel c46942606c Document _history and _history_list. 2016-03-25 20:29:24 -04:00
Tom Rothamel 0245953746 Add the _menu variable. 2016-03-25 20:29:12 -04:00
Tom Rothamel 4b71bd4cdf Bump to 6.99.1, restore name. 2016-03-25 20:16:22 -04:00
Tom Rothamel 0ca1c108fe Rename History to HistoryEntry. 2016-03-23 23:04:22 -04:00
Tom Rothamel 6dd0d1015f Document history config variables. 2016-03-23 21:36:59 -04:00
Tom Rothamel dcd5f18e30 Keep history. (aka a Log or Readback)
This adds the _history variable, which contains one History
object for each line of dialogue shown to the player. It
also adds the following variables:

* _history
* config.history_length
* config.history_callbacks
2016-03-23 21:31:02 -04:00
Tom Rothamel 82a180d209 Re-enable list compression.
Fixes #881.
2016-03-23 20:10:52 -04:00
Tom Rothamel 1884b6d4fc Move the notify screen to -1500.
This makes it easier for games to override it.
2016-03-22 23:02:10 -04:00
Tom Rothamel 6324c2b25c Update changelog. 2016-03-21 22:23:02 -04:00
Tom Rothamel 2e1a839c96 Fix name. 2016-03-21 01:24:09 -04:00
Tom Rothamel 9cb85414e3 Update docs. 2016-03-21 01:23:53 -04:00
Tom Rothamel 92978ef5ee Give a new release subtitle.
The old one is aimed a pre-7, which this isn't.
2016-03-21 00:49:15 -04:00
Tom Rothamel 193a6e80ad Fix translations. 2016-03-21 00:23:35 -04:00
Tom Rothamel 7f8e8389ab Add greek translation of the launcher.
Contributed by George Economidis.
2016-03-21 00:18:29 -04:00
Tom Rothamel 34705d7620 Merge pull request #872 from jackmcbarn/imagepriority
Document the change to the default image init priority
2016-03-20 23:44:59 -04:00
Tom Rothamel be23649bba Disable list compression for the time being. 2016-03-20 23:41:28 -04:00
Tom Rothamel afbacf6007 Limit to one sound per auto-channel when skipping.
This prevents cacophony from resulting as many sounds play at once.

Fixes #874.
2016-03-19 17:18:16 -04:00
Tom Rothamel 0b6b601109 Allow run.sh to be called from outside the Ren'Py directory. 2016-03-19 10:58:59 -04:00
Tom Rothamel 48a87e8aa4 Rename the yesno_prompt screen to 'confirm'.
With the usual level of backwards-compatibility.
2016-03-19 10:40:24 -04:00
Tom Rothamel ba09ba402a Add a style named "empty".
This is initialized to the same things as default, but should
generally not be changed. It's used when we want a new style
that doesn't inherit from anything else.
2016-03-19 10:22:31 -04:00
Tom Rothamel 0c8b02024f Improve source distribution.
* Renpy.py is given a shebang in the source tarball.
* Update inforation is excluded from the source tarball.

Fixes #869.
2016-03-18 22:59:23 -04:00
Tom Rothamel 8d5932ad56 Fix the missing-modules error so it works. 2016-03-17 21:12:23 -04:00
Tom Rothamel 84f98da817 Remove x-bit from renpy.py.
Per discussion on #869.
2016-03-17 21:00:44 -04:00
Tom Rothamel 113616101a Remove shebang and unused code.
The shebang is removed per discussion on #869.
2016-03-17 20:57:29 -04:00
Tom Rothamel 0a8f12801c Remove nvl-mode documentation obsoleted by the new gui. 2016-03-16 21:06:55 -04:00
Tom Rothamel fce1d8ccbc Add config.nvl_list_length.
This limits the length of nvl_list, allowing us to emulate an
infinitely-long nvl-mode window.
2016-03-16 21:06:24 -04:00
Tom Rothamel 82b2070fb4 Fix tyop. 2016-03-15 21:40:34 -04:00
Tom Rothamel 5e98cf8433 vpgrid: Example. 2016-03-15 21:35:31 -04:00
Tom Rothamel 1c2552b53a vpgrid: Document. (needs example) 2016-03-15 01:40:18 -04:00
Tom Rothamel 42bbb8a4e7 vpgrid: Implement xfill, yfill, and placement. 2016-03-14 23:57:25 -04:00
Tom Rothamel e9cbfb9700 Optimize VPGrid rendering.
Now it only renders displayables that are partially on screen.
2016-03-14 02:26:48 -04:00
Tom Rothamel c9411a23c6 Add VPGrid.
This is a new displayable that combines a viewport and a
grid, allowing the information from the viewport to control
which grid elements are rendered.

(That's the theory. We still have to finish optimizing it.)
2016-03-14 01:52:42 -04:00
Tom Rothamel 9991674815 Break Viewport.render into two methods.
This will make the subclassing of Viewport by VPGrid easier.
2016-03-13 21:51:43 -04:00
Tom Rothamel aaff672927 Move viewport-related code into its own file. 2016-03-13 12:11:45 -04:00
Tom Rothamel ede7cca0fa List rollback compressions.
This recognizes stack and queue-like patterns, and compresses them
in the rollback log to only include changes.
2016-03-13 01:53:53 -05:00
Tom Rothamel 1571351e7d Add support for compressing rollbacks.
For now, this is intended to be used to compress queue-like lists,
but it could be used for other things as well in the future.
2016-03-12 12:34:59 -05:00
Tom Rothamel 7be87c570e Add style_group support for style_group in transcluded blocks. 2016-03-11 23:34:39 -05:00
Tom Rothamel d7a682ec44 Allow use statement transcludes to take style_prefix. 2016-03-11 23:28:02 -05:00
Jackmcbarn ffe455e55a Restore the new image init priority, and document the change 2016-03-11 14:43:09 -05:00
Tom Rothamel d74e8c388e Fix style regression.
The problems was that if we had a labels with the "foo_prompt" style,
we were using "label_text" rather than "foo_prompt_text".
2016-03-11 00:40:23 -05:00
Tom Rothamel 5ab212439b GamepadExists is always true in developer mode.
It's probably not a good idea to hide part of the UI during
development.
2016-03-11 00:27:46 -05:00
Tom Rothamel 2fdc3697c0 The Help() action uses the help screen. 2016-03-11 00:23:26 -05:00
Tom Rothamel 8cb5446bc0 Gamepad-related screen functions and actions. 2016-03-11 00:15:47 -05:00
Tom Rothamel 0b46157f6d Help can use ShowMenu to show the help screens. 2016-03-10 23:47:17 -05:00
Tom Rothamel 1082344eaf Use a permalink to the license. 2016-03-10 19:38:14 -05:00
Jackmcbarn aafd7d90f2 Restore default image init priority to 990
When init offset support was added in commit 679f9e31, the default image init
priority was changed from 500 to 990. This changes it back.
2016-03-10 18:23:20 -05:00
Tom Rothamel c3979d3092 Expose Ren'Py version and license as fields of Ren'Py.
This allows them to be included in the About page of the GUI.
2016-03-09 23:31:33 -05:00
Tom Rothamel 0e7d1300df Log and ignore errors that occur while initializing controllers. 2016-03-09 21:42:43 -05:00
Tom Rothamel 8d3f774d0a Bump version. 2016-03-08 16:20:41 -05:00
Tom Rothamel 679f9e31e6 Add the init offset statement.
This provides a way of giving a consistent offset to every statement
in a file.
2016-03-06 23:01:20 -05:00
Tom Rothamel 2aea72eaf2 Check in docs. 2016-03-06 23:01:13 -05:00
Tom Rothamel 60a6804021 Https support for docs. 2016-03-06 17:21:47 -05:00
Tom Rothamel c094c315e3 Default to (and fix) _overlay_screens = None
This implements the proper behavior of the overlay screens appearing
and disappearing with the overlay - and hence, having the appearance
of being in-game only.
2016-03-06 00:14:21 -05:00
Tom Rothamel 2d3d7b73d6 Consider store.suppress_overlay when suppressing overlays. 2016-03-06 00:13:52 -05:00
Tom Rothamel f973448aa5 Rename style_group to style_prefix, add style_suffix.
Style_prefix is a better name, as it makes the puropose of the
property more apparent. Style_suffix makes it possible to write
screen code that both uses custom styles and can be reused with
style prefixes.

Fixes #868. Fixes #743.
2016-03-05 23:49:59 -05:00
Tom Rothamel ed09741ca0 Check that the file page is legal each time the game starts.
This deals with an instance of corruption that was reported.
2016-03-05 22:21:20 -05:00
Tom Rothamel 9edc45aff8 Update .gitignore. 2016-03-04 23:20:22 -05:00
Tom Rothamel c00933ac86 Use a default page name if empty while not editing. 2016-03-04 23:17:18 -05:00
Tom Rothamel ff40cc8a2c Check for image names beginning with dashes in the image statement.
This is better than checking for it in renpy.image, as the latter
can cause problems if things in the images directory have filenames
that have a - in them.
2016-03-04 22:28:07 -05:00
Tom Rothamel 0c3996dbbb Place the caret pos at the end of an input when it changes or becomes editable. 2016-03-04 00:50:52 -05:00
Tom Rothamel e163a56cca Add FilePageNameInputValue.
This is an input value that stores a name for the current file page,
suitable for use in the new GUI.
2016-03-04 00:41:43 -05:00
Tom Rothamel 3929511af6 More InputValue improvements.
* When get_text changes, the contents of the input also changes.
* If InputValue.editable is False, editing is disabled.
2016-03-04 00:31:47 -05:00
Tom Rothamel f7bbceaaf5 Add InputValues: Field, Dict, and ScreenVariable
This is the same set we have with data actions.
2016-03-03 23:04:54 -05:00
Tom Rothamel 0d779002bc Use InputValues to handle Input focus.
At most one InputValue can be focused at a time. This is enforced
by Ren'Py, and can be used along with buttons to handle switching
between multiple Inputs.
2016-03-03 22:37:47 -05:00
Tom Rothamel 0638d31cfc Add the concept of an input value.
This is similar to a bar value, except it's taken by an input,
rather than a bar. An input value has:

* A method that returns a default value for the input.
* A method that is called when the input text changes.
* A method that is called when the user presses enter.
* A method that's called to determine if the input should be
  considered editable.

InputValue objects also have methods that return actions that
enable, disable, and toggle editing.
2016-03-03 00:20:55 -05:00
Tom Rothamel 0fb53ebb42 Add the key_events style property.
This determines if key events are propagated through a button
or not.
2016-03-02 23:19:42 -05:00
Tom Rothamel 3c8722c775 Do not pass key events through buttons. 2016-03-02 22:07:34 -05:00
Tom Rothamel eae7026ba9 Update changelog. 2016-03-01 23:01:53 -05:00
Tom Rothamel 3de4713ef2 Add config.speaking_attribute.
This is a function that adds an attribute to the image of the
speaking character while the character is speaking, and removes
that attribute once speaking is finished.
2016-03-01 22:43:21 -05:00
Tom Rothamel e71c98af15 Improve error handling.
* Allow reloading when an exception occurs during the init phase.
* Log double exceptions.
2016-03-01 22:07:02 -05:00
Tom Rothamel a5f0ec40b1 Fix display of errror messages during the init phase.
This was due to the new side image code leaving variables
uninitialized.
2016-03-01 21:35:42 -05:00
Tom Rothamel 2291fe7722 Fix subtraction of attributes from images. 2016-03-01 21:35:05 -05:00
Tom Rothamel 34fe9e0aed Allow dashes in the middle of an image name component.
Apparently, a number of games used this, despite it never being
documented.
2016-03-01 19:02:51 -05:00
Tom Rothamel 64c2c24258 Ensure config.developer is False during init code.
We (apparently) need the robustness to be able to handle errors
that occur during initial script parsing.
2016-03-01 18:44:35 -05:00
Tom Rothamel b523d7105a Changelog the recent audio changes. 2016-02-29 23:03:11 -05:00
Tom Rothamel 1972760e16 audio: Add AudioPositionValue
This is a value that shows the playback position relative to the
total duration of a channel.
2016-02-29 22:59:28 -05:00
Tom Rothamel 48fe0f12b4 audio: Add renpy.music.get_duration()
This is a function that returns the length of the currently-playing
audio file in a channel.
2016-02-29 22:43:19 -05:00
Tom Rothamel 974071a790 audio: Return the audio position relative to the start of the file. 2016-02-29 22:22:24 -05:00
Tom Rothamel 511dd74b5c ffmedia: Take into account skip when computing file duration. 2016-02-29 21:27:43 -05:00
Tom Rothamel 7a7c57c43f Change the name to "To the nines." 2016-02-28 11:57:39 -05:00
Tom Rothamel a2d21e924b Update docs. 2016-02-28 11:57:11 -05:00
Tom Rothamel ffdbcd2550 Update license.
Fixes #860.
2016-02-27 23:13:29 -05:00
Tom Rothamel 66331a1d6c Update changelog and generate docs. 2016-02-27 23:11:23 -05:00
Tom Rothamel 79ebca6ec2 tutorial: Use new-style Movie displayable. 2016-02-27 21:40:21 -05:00
Tom Rothamel bc6996c90e Document the audio namespace. 2016-02-27 21:31:53 -05:00
Tom Rothamel 1e4bf112e7 Apply normal placement rules to images included via {image}. 2016-02-27 16:49:58 -05:00
Tom Rothamel 6934d06296 audio: Ignore playback specifier when linting music and sound. 2016-02-27 10:09:19 -05:00
Tom Rothamel 48aea15e59 The play and queue statements eval filenames in the audio namespace.
Fixes #863.
2016-02-27 09:52:51 -05:00
Tom Rothamel c23f248fac Document multiple movies. 2016-02-27 00:27:19 -05:00
Tom Rothamel 92bd264543 Movie documentation. 2016-02-27 00:24:43 -05:00
Tom Rothamel caae39a989 Document audio changes. 2016-02-26 22:31:15 -05:00
Tom Rothamel f24864b9f2 Detect and report the use of Movie and a hardware video channel. 2016-02-26 21:52:08 -05:00
Tom Rothamel 2abee24ad6 Prevent type error when timing text that hasn't been rendered.
Fixes #862.
2016-02-26 00:31:03 -05:00
Tom Rothamel 68b8211892 video: Fix regression preventing fullscreen playback.
Introduced in c424bd39a4.
2016-02-24 21:15:41 -05:00
Tom Rothamel 505149777f video: Properly detect fullscreen video playback.
Due to changes, we were detecting the use of the movie channel by
a Movie displayable as a fullscreen movie, which meant a different
code path was in use and it didn't work.
2016-02-24 21:08:40 -05:00
Tom Rothamel c424bd39a4 video: Allow videos to play on mobile platforms.
This allows software playback to be used to play movie sprites
on mobile platforms.
2016-02-24 01:25:45 -05:00
Tom Rothamel 01996eff67 Ensure display.draw is always initialized.
It seems unlikely, but another crash caused this to fail once,
so let's ensure it always works.
2016-02-23 23:03:21 -05:00
Tom Rothamel 2d8c03b5f8 ffmedia: Remove obsolete ffdecode.c. 2016-02-23 17:51:57 -05:00
Tom Rothamel 0956099f5e ffmedia: Introduce the idea of a movie (vs an audio-only) channel.
The idea is that we can play a movie file on an audio channel,
and only get the audio soundtrack.

Fixes #852.
2016-02-22 21:45:18 -05:00
Tom Rothamel e89739329f audio: Add config.play_channel.
This is the channel used by renpy.play to play sound effects,
including the hover and activate sounds.

Fixes #859.
2016-02-22 20:36:32 -05:00
Tom Rothamel e866c8c475 Add renpy.music.get_pos()
Per http://lemmasoft.renai.us/forums/viewtopic.php?p=403544#p403544
2016-02-22 01:09:02 -05:00
Tom Rothamel b642a2f980 audio: "<silence to 3>" -> "<silence 3>"
Fixes #858.
2016-02-22 00:40:52 -05:00
Tom Rothamel d337744c10 Remove debug print. 2016-02-22 00:33:02 -05:00
Tom Rothamel faafcc9daf audio: Do not queue zero-length audio.
This prevents "<silence to 0>" from giving a 1-periodic-cycle
delay before playing the next bit of audio.
2016-02-22 00:31:20 -05:00
Tom Rothamel 638ceae6c2 ffmedia: Allow audio to be zero-length. 2016-02-22 00:27:26 -05:00
Tom Rothamel d795660faf audio: Allow an anonymous audio channel.
This is a channel that doesn't play or queue sounds, but creates
a new channel and plays the sound on that. This is useful for
games and interface sounds, where we don't want to stop the
already playing sound because we're playing something new.

Fixes #838.
2016-02-21 22:47:13 -05:00
Tom Rothamel a8314e599c Use memset instead of bzero.
Fixes a warning.
2016-02-21 21:59:55 -05:00
Tom Rothamel f5866a5722 Make quiet configurable. 2016-02-21 21:59:39 -05:00
Tom Rothamel 64a14c7f50 audio: Verbose syntax for audio playback.
We use a clause-based syntax, which both is a lot more readable,
and may be extended with other clauses in the near future.

This also adds a silence clause, which allows us to use
"<silence to 10>" to play 10s of silence, which fixes #847.
2016-02-21 21:43:02 -05:00
Tom Rothamel 32860cd594 audio: Add a file containing only silence.
Ren'Py will be able to play this back for a specified duration,
allowing "<silence to 10>" to be a thing.
2016-02-21 21:08:33 -05:00
Tom Rothamel fe4409d23a Remove debug prints. 2016-02-21 16:51:54 -05:00
Tom Rothamel d3998e0268 audio: Pause -> PauseAudio
Since Pause was already a transition. ^_^;
2016-02-21 16:40:45 -05:00
Tom Rothamel 4e61f0fc2d ffmedia: Init/ref/unref packets.
Using av_packet_init for packets (especially those on the stack)
has to be done, as it fixes a very subtle crash due to uninitialized
data in the packets.

Moving to ref and unref gets rid of deprecation warnings, and
also makes packet memory management easier to understand.
2016-02-21 16:40:16 -05:00
Tom Rothamel 344e61dfcf audio: config.sound_sample_rate = 48000 2016-02-20 15:02:15 -05:00
Tom Rothamel d193fcafa2 audio: Support different partial play for inital playback, loops.
The idea is that we want a simple syntax - "<,10->foo.ogg" - to be
able to play an intro once, and then play a repeated section.
2016-02-20 14:57:26 -05:00
Tom Rothamel d2e0ead025 audio: Support pausing/unpausing channels.
Fixes #851.
2016-02-20 12:55:52 -05:00
Tom Rothamel ceeebe783e Suppress overlay/underlay during reload.
Fixes #856.
2016-02-19 23:26:02 -05:00
Tom Rothamel a3180ab96d Support config.developer = "auto"
This - the new default - causes Ren'Py to detect if the game has
been packaged, and set config.developer appropriately.
2016-02-19 23:05:19 -05:00
Tom Rothamel 5d6bd2dd69 Movie: Use a replacement image if movies can't be played.
Fixes #844.
2016-02-19 00:06:30 -05:00
Tom Rothamel a61b06ecdc Convert image-name strings to unicode.
This matches the behavior of older versions of Ren'Py.
2016-02-18 22:33:40 -05:00
Tom Rothamel ffd1bb68b1 Use a high protocol when saving persistent.
It should make the file smaller with no downside.
2016-02-18 21:42:45 -05:00
Tom Rothamel 5770915e5f Ignore partial playback when determining if audio has been seen.
Fixes #853.
2016-02-17 23:01:20 -05:00
Tom Rothamel d6924b9cc0 Only give -std=gnu99 to c files. 2016-02-17 00:35:31 -05:00
Tom Rothamel 159717a1fc ffmedia: Remove a pair of debug prints. 2016-02-16 23:52:41 -05:00
Tom Rothamel 22a75a3ae2 Merge branch 'new-audio' 2016-02-16 23:44:44 -05:00
Tom Rothamel f6daad68ac Document available package formats. 2016-02-16 19:46:37 -05:00
Tom Rothamel 5276d0de10 Support including a variant name in the release directory. 2016-02-16 00:18:29 -05:00
Tom Rothamel 16f57a6861 Only block_rollback when the language changes.
Fixes #854.
2016-02-14 23:28:43 -05:00
Tom Rothamel f84c9351d7 ffmedia: Rapidly decode frames while the queue is not empty.
This is necessary for video seek to work, as we need to rapidly
skip past the frames dropped while decoding from the keyframe
to the first real frame.
2016-02-14 17:27:40 -05:00
Tom Rothamel 6336812237 ffmedia: Ensure video decode can't starve audio decode.
Previously, it could if decode took so long frames were being
dequeued/dropped faster than they could be decoded.
2016-02-12 22:35:15 -05:00
Tom Rothamel 0876a46d4b ffmedia: Allocate SDL_Surfaces in the main (rendering) thread.
This prevents potential crashes caused by SDL not being thread-safe,
especially when it comes to the format refcount. When multiple threads
were allocating Surfaces, the refcount could fail to increment,
causing a double-free when the refcount came all the way down.
2016-02-12 21:57:47 -05:00
Tom Rothamel e297aec8f0 Do not read file objects when checking reachability.
This prevents us from locking up with no further info if a
blocking file (say, stdin) winds up some place that can
be reached.
2016-02-12 03:24:22 -05:00
Tom Rothamel 854126dea7 Document config.movie_mixer. 2016-02-11 22:56:24 -05:00
Tom Rothamel 52d55134ed ffmedia: Auto-register movie channels. 2016-02-11 19:36:26 -05:00
Tom Rothamel 7ea2084e3e Do not read file objects when checking reachability.
This prevents us from locking up with no further info if a
blocking file (say, stdin) winds up some place that can
be reached.
2016-02-11 00:37:46 -05:00
Tom Rothamel c6275388da ffmedia: Synchronize video display and frame dropping. [doc]
When multiple videos are playing, we need them to play in lockstep,
to ensure that frames stay in sync. (This is especially important
for video sprites, to ensure the color and alpha images have the
same pts.)

When multiple movies are playing, Ren'Py now checks that there is a
frame available from every playing movie before reading the frame from
any movie. As long as the movies have the same framerate, they should
always remain in lockstep.

Framedropping now works by dropping all frames that should be
displayed before the time the last frame was actually displayed.
This ensures that framedropping is consistent on all playing
movies. (Again, assuming the framerates are the same.)
2016-02-10 01:12:30 -05:00
Tom Rothamel 4414c997f3 Take into account slow_cps when computing AFM time.
Previously, this only took into account the number of characters
involved. Now, we read the actual time it will take to display
the text out of the Text object.
2016-02-09 19:20:29 -05:00
Tom Rothamel 8942d96cc1 ffmedia: Expose a video_ready function.
Doesn't do anything yet, but will determine if there is a frame
ready to go on the video channels - allowing us to dequeue from
all channels at once.
2016-02-09 01:06:32 -05:00
Tom Rothamel 6668810820 Merge branch 'master' into new-audio 2016-02-08 20:12:30 -05:00
Tom Rothamel f034050b24 Stop edgescroll when the mouse leaves a viewport. 2016-02-08 19:25:54 -05:00
Tom Rothamel 6b52614bfb If video gets behind by more that 5s, kill it.
This stops the video packet queue from leaking memory.
2016-02-08 01:13:49 -05:00
Tom Rothamel a3a4a24a0c ffmedia: Skip frames when too far behind. 2016-02-07 21:38:24 -05:00
Tom Rothamel 3d56b2cb63 ffmedia: Debug - adjustable speed and pq counting. 2016-02-07 21:06:40 -05:00
Tom Rothamel f456b2f96a ffmedia: Accept ranges of time in movies and video. 2016-02-07 02:55:13 -05:00
Tom Rothamel e36b26d393 Compile with a modern C standard. 2016-02-07 01:48:17 -05:00
Tom Rothamel 1bb2bdae3c renpysound support for audio cropping. 2016-02-06 23:15:32 -05:00
Tom Rothamel 7fa95e4c5b ffmedia: Skip video frames before ms->skip. 2016-02-05 23:17:38 -05:00
Tom Rothamel dd468810a9 video: 1ms sleep if no event when video is playing.
This should yield good frame accuracy while preventing us from
pegging a CPU core.

This needs #849, and fixes #846.
2016-02-05 00:40:45 -05:00
Tom Rothamel 973847f448 ffmedia: Properly close an rwops-wrapper.
This stops a problem that can manifest as a segfault or memory leak.
2016-02-05 00:02:44 -05:00
Tom Rothamel bb32202520 ffmedia: Close codecs. 2016-02-04 22:33:38 -05:00
Tom Rothamel 185dd0b110 video: Only update channel_movie if we can play a movie. 2016-02-04 22:11:57 -05:00
Tom Rothamel 3de9f15ce6 videosprite: Ensure color and mask videos are in sync.
To do this, we have to always grab a frame from each at the same
time, and this includes the frames we grab in video.frequent().
2016-02-04 01:04:41 -05:00
Tom Rothamel a11957f782 videosprite: Apply mask surface. 2016-02-03 23:38:48 -05:00
Tom Rothamel a6d7ab053b ffmedia: Ensure multiple frames are rendered at the same time.
This means maintaining a global current time for ffmedia that
is updated once per frame. This makes it possible to play back
two streams in sync, which is necessary for videosprites.
2016-02-03 23:28:12 -05:00
Tom Rothamel 965959bf68 videosprite: Play a mask file at the same time as the main file. 2016-02-03 23:01:38 -05:00
Tom Rothamel f2a38ce2c9 ffmedia: Add an empty audio track to video files without one.
This makes it possible to play back videos that do not have an
audio track.
2016-02-03 22:32:41 -05:00
Tom Rothamel cebc553ea0 Add support for movie-backed sprites. 2016-02-03 21:42:03 -05:00
Tom Rothamel 4556235c46 Merge branch 'master' into new-audio 2016-02-03 19:20:34 -05:00
Tom Rothamel ce75ca9074 Prevent segfault if Displayable.render return a non-Render.
We report a meaningful message instead.
2016-02-03 18:46:07 -05:00
Tom Rothamel 0fe9a20243 ffmedia: Render movie with size=None. 2016-02-03 18:29:37 -05:00
Tom Rothamel b42535db5a ffmedia: Reimplement movie displayable: 2016-02-03 00:51:53 -05:00
Tom Rothamel ce633f41fa ffmedia: Display fullscreen video using the software renderer. 2016-02-02 09:11:22 -05:00
Tom Rothamel c3e464311e ffmedia: Display video. 2016-02-02 09:11:01 -05:00
Tom Rothamel e7fd5c6ab5 Only include string in image specifiers.
Including a string as as part of an image components prevents us
from parsing a say statement.
2016-02-01 13:04:00 -05:00
Tom Rothamel 69329aebd8 ffmedia: Add video surfaces to a queue. 2016-02-01 09:11:40 -05:00
Tom Rothamel f86a580f90 Also allow simple expressions in image names.
Fixes a regression introduced in 004a278898
that was preventing

    show text "Hello, world."

from being parsed.
2016-02-01 00:21:07 -05:00
Tom Rothamel 6f478be10f ffmedia: Allocate SDL_Surface and use SWS to copy the image to it.
This version of the code leaks memory like it's going out of
style.
2016-02-01 00:11:39 -05:00
Tom Rothamel 9ccc39cc59 Queue movies up in renpysound/ffmedia.
This is necessary to allow seamless playback, and won't cause
any problems once each MediaState has its own queue of surfaces.
2016-01-31 22:39:26 -05:00
Tom Rothamel 689a9aa1c6 ffmedia: Decode video into an AVFrame. 2016-01-31 22:18:45 -05:00
Tom Rothamel 15dbff0270 ffmedia: Ensure main thread can't block.
This is done by reducing how often the lock is held. The decode
thread now hold locks for short, constant amounts of time,
ensuring the main thread can always make progress.

Perhaps most notably, deallocation has been moved to the decode
thread, ensuring it can't block the main thread at all.
2016-01-31 17:17:20 -05:00
Tom Rothamel e78582fa01 ffmedia: Pass in sample surfaces. 2016-01-31 13:09:48 -05:00
Tom Rothamel 4f45fe24e3 Rename pysdlsound -> renpysound.
It's been a long time since we've been based on SDL_sound, and
the API is new-ish, so it's probably best to just use a new
package name.
2016-01-31 12:10:54 -05:00
Tom Rothamel a028d11296 Expose sample surfaces function. 2016-01-31 11:49:10 -05:00
Tom Rothamel bd404febe4 ffmedia: Handle close and deallocate. 2016-01-30 13:13:04 -05:00
Tom Rothamel ac11d53ebc ffmedia: Allow setting of playback start and end times. 2016-01-30 12:18:32 -05:00
Tom Rothamel e1ab60028a ffmedia: MediaPlayer -> MediaState
MediaPlayer is probably a better name for an eventual high-level
wrapper class.
2016-01-30 10:23:34 -05:00
Tom Rothamel 06301a98a2 ffmedia: Support audio duration. 2016-01-30 10:12:44 -05:00
Tom Rothamel 6ffffaa1cc Rename ffpy2 -> media. 2016-01-30 09:01:17 -05:00
Tom Rothamel 1ed8557069 Use a default channel layout if none is known. 2016-01-30 08:42:22 -05:00
Tom Rothamel f5e7c7ec4e ffpy2: Add audio playback support. 2016-01-30 00:28:15 -05:00
Tom Rothamel 8d1f1925c0 Merge branch 'master' into new-audio 2016-01-29 23:31:15 -05:00
Tom Rothamel cd8f87f739 Debug script. 2016-01-29 23:27:25 -05:00
Tom Rothamel 64d9ef3763 ffpy: Audio decode. 2016-01-29 21:52:30 -05:00
Tom Rothamel 38cd5ef4d5 ffpy2: Packet reading and handling. 2016-01-29 01:11:24 -05:00
Tom Rothamel 03c9cd8448 Start work on new audio/video code. 2016-01-28 23:42:41 -05:00
Tom Rothamel 6ec62402f3 Add libswresample to the list of Ren'Py build dependencies. 2016-01-28 20:38:20 -05:00
Tom Rothamel 753a579085 Link in libswresample when available.
It's necessary to work with ffmpeg 2.8.5 on iOS and Android, and
doesn't hurt elsewhere.
2016-01-28 01:06:18 -05:00
Tom Rothamel 58960441fd Update copyright for 2016. 2016-01-26 22:31:25 -05:00
Tom Rothamel 56fcc4b53e Self-voicing debug mode, accessed using shift+alt+D.
Also works pretty well with Ren'Py test mode.

Fixes #818, at least in intent.
2016-01-26 22:24:51 -05:00
Tom Rothamel f599f91a2e Merge pull request #831 from apoleon/typo
Fix a minor typo succesful -> successful
2016-01-26 20:19:19 -05:00
Tom Rothamel eef1cdabaf Merge pull request #830 from apoleon/big-endian
Fix FTBFS on Big-endian architectures.
2016-01-26 20:18:45 -05:00
Tom Rothamel 144266cae1 Merge pull request #829 from apoleon/ffmpeg
Replacing deprecated ffmpeg macros and functionality
2016-01-26 20:16:46 -05:00
Markus Koschany f7e647db77 typo 2016-01-27 00:49:31 +01:00
Markus Koschany d2f1e1c842 Fix FTBFS on Big-endian architectures. 2016-01-27 00:46:51 +01:00
Markus Koschany 4aac7ca5a5 ffmpeg 2016-01-27 00:43:37 +01:00
Tom Rothamel 2bd34c10ac Block rollback on language change.
This prevents changes in a translate python block from being rolled
back if the player rolls back the game.

Fixes #816.
2016-01-26 00:04:58 -05:00
Tom Rothamel 3977b5326e Translate internal self-voicing prompts. 2016-01-25 01:47:17 -05:00
Tom Rothamel c734c2fcc0 Fix build of pygame_sdl2. 2016-01-24 12:36:12 -05:00
Tom Rothamel 5416666f80 Update how we build pygame_sdl2. 2016-01-24 12:07:54 -05:00
Tom Rothamel 8d3dc4aa44 Merge pull request #826 from Shizmob/master
Add 'mixer <mixer> mute' and 'mixer <mixer> volume' Preference values.
2016-01-22 22:56:16 -05:00
Shiz 594e6690f9 Add 'mixer <mixer> mute' and 'mixer <mixer> volume' Preference values.
These values allow you to operate the mute and volume preferences on
any channel instead of only the pre-defined ones in the Preference
screen action.
2016-01-22 06:35:50 +01:00
Tom Rothamel 10a4d767f5 Color.replace_opacity is the better name.
As Shiz pointed out, it's more consistent with Color.opacity, which
already exists.
2016-01-22 00:03:38 -05:00
Tom Rothamel ff06416e79 Add {alpha=*.5} as to the {alpha} tag. 2016-01-21 23:46:34 -05:00
Tom Rothamel cf0f1f3e07 Merge pull request #825 from Shizmob/master
Add {alpha} text tag.
2016-01-21 23:38:24 -05:00
Shiz 3eff5aee93 Add {alpha} text tag.
This text tag can be used to just control the opacity of the
affected text. It takes a value between 0.0 and 1.0, corresponding
to invisible to fully opaque, respectively. Values can optionally
be prefixed by + or - to indicate a change in opacity, as opposed
to a total replacement.
2016-01-22 05:34:23 +01:00
Tom Rothamel 8b25847234 Generate a legal build.directory_name. 2016-01-21 22:09:57 -05:00
Tom Rothamel c0bcc6f905 Merge pull request #819 from dvarin/master
Fixed Drag.snap() animation to use delay
2016-01-20 20:59:16 -05:00
Tom Rothamel 48690da89e Tweak variable names a little. 2016-01-20 20:58:19 -05:00
Tom Rothamel 9cb83a6f69 Merge pull request #820 from vollschauer/master
Confirm EndReplay()
2016-01-20 19:55:30 -05:00
Tom Rothamel c271ae6fb4 Add persian template, courtesy of shahrzad666. 2016-01-20 19:52:13 -05:00
Tom Rothamel b3fe929760 Add config.reply_scope.
Use it to set _game_menu_screen to preferences on entering a replay,
so the player isn't confronted with a useless screen.

Fixes #823.
2016-01-20 01:02:06 -05:00
Tom Rothamel 004a278898 Allow image name components to begin with numbers.
Fixes #824.
2016-01-19 22:40:37 -05:00
Tom Rothamel 86ed69408b Remove HighDPI window positioning code.
Now that we've patched the SDL library to handle this, it's
unnecessary for Ren'Py to handle it directly, and doing so causes
problems. So out this code comes.
2016-01-18 22:45:27 -05:00
Tom Rothamel 407b838a60 test: More tutorial testcases. 2016-01-18 21:45:35 -05:00
Tom Rothamel 8f3ae7474d Test minigames. 2016-01-17 22:17:15 -05:00
Tom Rothamel 3951fae2c1 Show the currently-show menu on reload. 2016-01-17 14:50:00 -05:00
Tom Rothamel 934fc3a4a9 Translatable strftime implementation. 2016-01-17 14:46:55 -05:00
vollschauer 5108a0fd93 Confirm EndReplay() 2016-01-17 13:09:29 +01:00
Tom Rothamel 542008cf7a test: Test user interaction. 2016-01-16 23:52:25 -05:00
Tom Rothamel b7afdd6ff3 test: Move command. 2016-01-16 23:41:51 -05:00
Tom Rothamel a709c077a2 test: Fix drag. 2016-01-16 19:51:18 -05:00
Tom Rothamel 1a1f93e55d Get rid of warning when coverage is not installed. 2016-01-16 02:07:26 -05:00
Tom Rothamel 4bccd49a3f test: Start user interaction test cases. 2016-01-16 02:06:56 -05:00
Tom Rothamel 156378fb0d test: Drag statement. 2016-01-16 02:06:42 -05:00
Tom Rothamel 8d80d4f535 test: Fixes. 2016-01-16 02:02:06 -05:00
Tom Rothamel b57dfddabc Give better alt text viewport scrollbars. 2016-01-15 23:47:37 -05:00
Tom Rothamel a24566a120 test: Break focus code out into its own module.
Also, break the function up in half, so it's possible to get
multiple positions inside a displayable.
2016-01-15 23:27:42 -05:00
Tom Rothamel fa07ff4e61 test: Match patterns against default text. 2016-01-15 22:29:47 -05:00
Tom Rothamel 1d2763e2e7 Clean up Ren'Py.
Now that pydev 4.5 is out and does a good job of parsing cython,
we can get back to no pydev analysis errors.
2016-01-14 21:39:38 -05:00
Tom Rothamel 847350000f test: Scroll and expose more testcases. 2016-01-13 23:20:27 -05:00
Tom Rothamel 76695fb97b test: Make sure 1.0 focus is inside the button. 2016-01-13 23:11:57 -05:00
Tom Rothamel 34d6494a51 test: Support the pos clause for click and type. 2016-01-13 22:30:49 -05:00
Tom Rothamel 459c5bc142 test: Image operations and fonts. 2016-01-12 18:43:59 -05:00
Tom Rothamel d57b3f50bf test: Coverage test transitions. 2016-01-11 22:14:02 -05:00
Tom Rothamel 0ada23c1a8 test: More testcases. 2016-01-11 00:14:49 -05:00
Tom Rothamel b75399e620 test: Fix clicking after last changes. 2016-01-10 23:45:43 -05:00
Tom Rothamel 57cea7f37b test: Add the type statement, which types a string or key. 2016-01-10 23:16:37 -05:00
Tom Rothamel 22f6016e31 test: More tutorial tests. 2016-01-10 01:29:00 -05:00
Tom Rothamel 1f26a9b443 Release the mouse on test end. 2016-01-10 01:23:15 -05:00
Tom Rothamel 9176f8d125 test: Click non-standard buttons and when there is no default target. 2016-01-10 01:18:51 -05:00
Tom Rothamel 4c5bfef65a test: Simplest test cases for tutorial. 2016-01-10 00:26:29 -05:00
Tom Rothamel fe9e0ca6e2 test: Call statement. 2016-01-09 22:28:39 -05:00
Tom Rothamel cb3af6ae2e test: Jump statement. 2016-01-09 22:06:15 -05:00
Tom Rothamel 049be8b751 coverage: Tweak omitted files. 2016-01-09 14:43:22 -05:00
Tom Rothamel 178fcc0c21 coverage: Init statements do not execute. 2016-01-09 14:43:07 -05:00
Tom Rothamel 782b1f2dbb Make expensive loops nogil.
This prevents the coverage code from profiling them, which
makes collecting coverage practically fast.
2016-01-09 11:33:32 -05:00
Tom Rothamel 39717b42e3 test: When tracing is enabled, report coverage of Ren'Py statements. 2016-01-08 23:58:25 -05:00
Tom Rothamel ca06bf994f test: Omit files preventing html coverage generation. 2016-01-08 20:35:53 -05:00
Tom Rothamel fc4ded5edf test: Find executable lines in Ren'Py code. 2016-01-08 01:50:46 -05:00
Tom Rothamel c61cf81d79 test: Get the locations of Ren'Py statements.
This helps compute coverage.
2016-01-07 22:58:37 -05:00
Tom Rothamel 25614c5a7c test: Support running Ren'Py under coverage.py. 2016-01-06 22:48:37 -05:00
Carl a22fea8dd2 Fixed Drag.snap() animation 2016-01-05 21:00:54 -08:00
Tom Rothamel e680702e87 Fix type error.
-1 is not a valid value for an unsigned int, and since 0 is an
invalid texture name, we use that instead.

Fixes #778. (Well, not really, but we run on the new cython.)
2016-01-05 22:19:14 -05:00
Tom Rothamel f0ea180ab8 Add support for building Ren'Py with cython code coverage enabled. 2016-01-05 00:05:05 -05:00
Tom Rothamel f7422bbb26 test: Add the label statement. 2016-01-04 22:54:40 -05:00
Tom Rothamel 2d26a7519a test: Add assert statement. 2016-01-04 01:18:14 -05:00
Tom Rothamel 69e308d24f test: Add python statement to test language. 2016-01-04 00:45:54 -05:00
Tom Rothamel 1812c062da test: Detect a stuck testcase and report the line it's stuck at. 2016-01-03 23:06:43 -05:00
Tom Rothamel ecd36ecfed Call maximum_framerate during tests.
This should speed testing up, since some tests are limited to once
per screen draw.
2016-01-03 21:14:11 -05:00
Tom Rothamel 5ec293eec0 Make it possible to cancel maximum framerate mode. 2016-01-02 14:42:59 -05:00
Tom Rothamel c851a95cdd test: Add pause statement. 2016-01-02 13:44:00 -05:00
Tom Rothamel 23d64a01e7 test: Add "until" statement.
This lets one combine two testing clauses - for example,

    click until "Yes."

with the first one executing until the second one is ready to
execute, after which the second one executes once.
2016-01-01 23:49:20 -05:00
Tom Rothamel 1da4ecb5c9 Document renpy.run.
This function was previously exposed as renpy.run_action. It's now
properly documented and exposed as renpy.run, with the old name
left around as an alias.
2016-01-01 00:24:41 -05:00
Tom Rothamel 08e674e76a test: Add the run statement.
This allows an action to be run, exposing everything that actions
can to to tl. For example, a statement like:

    run Jump("mylabel")

causes the game to jump to mylabel. Actions are delayed until
all input has been processed before being run.
2016-01-01 00:15:11 -05:00
Tom Rothamel 382b648c14 test: Add test language and test command.
The test language is the language introduced by the testcase
statement, with commands that will help exercise Ren'Py and
games.

The test command is a command-line command that runs a named
testcase.
2015-12-31 23:41:02 -05:00
Tom Rothamel 8ed7178cd2 test: Add the testcase statement to the Ren'Py language. 2015-12-31 22:21:50 -05:00
Tom Rothamel 3426657df9 test: Move into its own package.
The code is large and getting larger, so it makes sense to put
it in its own package.
2015-12-31 17:54:48 -05:00
Tom Rothamel 01ba61df2e Remove test code. 2015-12-31 14:27:02 -05:00
Tom Rothamel ada76f677f test: Use tts/alt text to select what to click on. 2015-12-30 23:44:48 -05:00
Tom Rothamel ec6c041f19 Remove debug print. 2015-12-30 01:59:36 -05:00
Tom Rothamel f72801a4f6 Round all axis-aligned screen-resolution blits to pixels.
This should improve #814, and fix it entirely if a font is hinted
to align properly in vertical and horizontal directions.
2015-12-30 01:14:10 -05:00
Tom Rothamel 768f63ba64 Add adjust_spacing to sl2.
Fixes #815.
2015-12-29 19:41:53 -05:00
Tom Rothamel 29588c84c8 test: Deal with transitions and suppress_underlay. 2015-12-29 01:40:27 -05:00
Tom Rothamel 4623a49a6d test: Block AST node. 2015-12-27 12:56:34 -05:00
Tom Rothamel 4fe1dc6a57 test: Single execute method.
Rather than separate methods for the start of an interaction and then
periodically, we have a single method for each time the screen has
been drawn.
2015-12-27 09:42:58 -05:00
Tom Rothamel daaea0e597 Change Quit() to be smart about confirm.
Fixes #812.
2015-12-26 08:01:05 -05:00
Tom Rothamel f2d4cd349e Use start-<version> as the starting point of version queries.
This will eventally let us use <version> as the tak for releases,
and not 100s of revisions before.
2015-12-26 07:51:04 -05:00
Tom Rothamel f0f8ffebc0 Fix tyop. 2015-12-25 12:03:58 -05:00
Tom Rothamel 5f60c65331 Only rebuild styles if the language has changed.
This should improve the performance of load, since nearly 100% of
the time the language will stay the same when a load occurs, and
hence it's wasteful to rebuild styles and re-prepare screens when
that happens.
2015-12-25 00:30:02 -05:00
Tom Rothamel ad054a9ef6 Proactively rebuild screens when styles are rebuilt.
Outside of the init phase. This prevents screens from being run
twice - once at an old version, and once at the new - when
a style rebuild occurs.

This manifested in problems with the CTC indicator, since Character
would hang the CTC stuff on the Text object created by the old
screen version.

Fixes #811.
2015-12-25 00:29:50 -05:00
Tom Rothamel 1e54c27750 sl2: Avoid adding widgets from unlikely paths to screen.widgets.
This fixes a problem where Ren'Py would evaluate both the correct
path, and the other path as unlikely, and then use the widget
found on the unlikely path. This could result in Character picking
up the wrong widget with the what id, preventing CTC from
working.
2015-12-25 00:29:44 -05:00
Tom Rothamel d79313e4ed Show text all-at-once after a rollback or load.
Fixes #810.
2015-12-24 15:20:33 -05:00
Tom Rothamel 34bf2d9b9b test: Interpreter and event framework. 2015-12-24 01:57:08 -05:00
Tom Rothamel bcdfe1beaf test: Define AST node. 2015-12-23 23:36:49 -05:00
Tom Rothamel 6dfc43c601 test: Add file and hooks for functional test framework. 2015-12-22 23:27:54 -05:00
Tom Rothamel 40806a164b Update docs. 2015-12-22 01:19:36 -05:00
Tom Rothamel 6fbfc49fe8 Fix docs. 2015-12-22 01:19:10 -05:00
Tom Rothamel f09ed13bae Purchases should not be consumable by default. 2015-12-21 21:33:12 -05:00
Tom Rothamel b4e67cd89f Pass through the voice tag.
Fixes #807, hopefully for real this time.
2015-12-19 22:33:22 -05:00
Tom Rothamel 96fd83a68e Fix small layout issue.
Fixes #808.
2015-12-18 22:01:29 -05:00
Tom Rothamel 2b6e6f1c4c Respect the tag argument to the voice function.
Fixes #807.
2015-12-17 18:51:03 -05:00
Tom Rothamel 1b8c44e9e8 Add renpy.is_start_interact. 2015-12-16 22:50:24 -05:00
Tom Rothamel 91e48fa575 Apply emphasize audio in the right place.
Since emphasize audio controls the same volume control as
renpy.music.set_volume, we only want to have it adjust those
volumes if it's enabled.

Fixes #806.
2015-12-15 09:07:50 -05:00
Tom Rothamel 628a3da3ce Update changelog. 2015-12-12 16:30:48 -05:00
Tom Rothamel e1c7bdcee1 Document PushMove. 2015-12-11 23:38:28 -05:00
Tom Rothamel 82214456fb Add a config variable to disable the rollback side. 2015-12-11 18:41:57 -05:00
Tom Rothamel 50eb09fd81 Edit the previous commit, renaming variables to config.default_<mixer>_volume. 2015-12-10 21:28:02 -05:00
Tom Rothamel 4d175cc14e Merge pull request #803 from vollschauer/master
Configuration variables for audio volumes
2015-12-10 21:10:56 -05:00
vollschauer a6022f6ab6 Update config.rst
Configuration variables for audio volumes (documentation)
2015-12-10 07:39:45 +01:00
Tom Rothamel cbbfe499b2 Add PushMove transitions to the tutorial. 2015-12-09 23:43:43 -05:00
Tom Rothamel 173005eb5c Merge pull request #800 from BlackDragonHunt/pushmove
Add a PushMove transition.
2015-12-09 20:10:44 -05:00
Tom Rothamel a9e56b0884 Merge pull request #801 from BlackDragonHunt/extractdialogue
Improvements to the extract dialogue system.
2015-12-09 20:10:09 -05:00
vollschauer fbc635fdde Configuration variables for audio volumes 2015-12-09 23:12:57 +01:00
Tom Rothamel 19242a53cf Do not include None in the language list.
Fixes #802.
2015-12-09 08:14:25 -05:00
BlackDragonHunt 766084c716 Improvements to the extract dialogue system. It now offers the option to strip tags or not (instead of it being the default), escape special characters, and export translatable strings in addition to the dialogue. 2015-12-09 04:33:24 -06:00
BlackDragonHunt 9235058e0d Add the PushMove transition. 2015-12-09 04:32:46 -06:00
Tom Rothamel ca8b5fba84 Add config.tag_zorder. 2015-12-08 19:04:55 -05:00
Tom Rothamel 6aa5ad03c9 Merge pull request #799 from Kuroonehalf/master
Added argument to QuickLoad() to control confirm prompt
2015-12-08 15:11:18 -05:00
Kuroonehalf a92f7e25c3 Another small rewording. 2015-12-08 20:10:04 +00:00
Kuroonehalf 0ed97b043f Tweak to the quickload() modification
- Also updated "confirm" description for FileLoad().
2015-12-08 20:03:16 +00:00
Kuroonehalf 3eec8290dc Added argument to QuickLoad() to control confirm prompt 2015-12-08 19:25:30 +00:00
Tom Rothamel bc0024c687 Fix timing of re-shown ATL.
Fixes: http://lemmasoft.renai.us/forums/viewtopic.php?f=51&t=30279&p=395255#p395255
2015-12-07 22:35:16 -05:00
Tom Rothamel 28a062ac9d Enter maximum framerate mode when Steam wants us to.
This helps ensure the Steam overlay will not be choppy. Fixes #796.
2015-12-06 08:18:11 -05:00
Tom Rothamel 3259198e81 Add renpy.maximum_framerate.
This new API makes it possible to boost the framerate to the maximum level for a defined
amount of time. It only makes sense if a third-party overlay - steam - needs us to increase
the framerate for some reason.
2015-12-06 08:04:45 -05:00
Tom Rothamel b924996681 Initialize translations after cleaning stores on load.
This ensures translation-specific variables become set.

Fixes #797.
2015-12-05 08:55:27 -05:00
Tom Rothamel 150ac90e80 Translate python-only languages are real languages. 2015-12-04 22:18:11 -05:00
Tom Rothamel 1b5a906d22 Support maximization on most platforms.
Now that we separate out the initial window size from other window sizes,
we can support maximization properly. Only Windows Vista and 7 have
performance problems with maximized windows, so we treat only those
OSes specially.

This fixes #798, since maximization was broken in gnome.
2015-12-03 11:49:06 -05:00
Tom Rothamel 50ad3bc1f8 Make renpy.windows store the windows version number.
This makes it more accessible, so we can use it to change Ren'Py behavior
in more circumstances.
2015-12-03 10:23:14 -05:00
Tom Rothamel 6708c643b2 Do not adjust window placement on win 8.1 or less.
This matches OS behavior.
2015-12-02 21:47:55 -05:00
Tom Rothamel 36ec5640c9 Document config.rollback_side_size. 2015-12-01 05:36:39 -05:00
Tom Rothamel db5968724e Merge branch 'release-6.99.8' 2015-11-30 09:24:45 -05:00
Tom Rothamel 888db7bbe3 Windows DPI scaling improvements.
* Better take title bar into account.
* Limit window to head size.
* Center window in head.
* Config variables to better control.
2015-11-30 08:48:21 -05:00
Tom Rothamel 2f3cb995a1 Implement the rollback side feature.
This is a feature, intended for mobile, that lets one rollback
by touching the left or right side of the screen. (Think of it
like paging around on a kindle.)
2015-11-29 22:49:09 -05:00
Tom Rothamel 09059b78c8 Initialize a preference controling touch rollback. 2015-11-29 22:04:39 -05:00
Tom Rothamel 5c1f020786 Bump version to 6.99.9. 2015-11-29 17:08:45 -05:00
Tom Rothamel d3dbc5b076 Document the limitation on android transparency. 2015-11-28 22:06:41 -05:00
Tom Rothamel 99ddc07103 Ignore control characters in filenames when distributing.
On Mac OS X, the filename Icon\r is used for folder icons. This
filename can't be represented on windows, and so causes a crash.
2015-11-28 00:16:12 -05:00
Tom Rothamel dd2f3203dd Update changelog. 2015-11-27 22:49:50 -05:00
Tom Rothamel a7c4a74cfc Remove old code and license new file. 2015-11-27 22:38:28 -05:00
Tom Rothamel 118c7528a2 Update side image functionality.
It's now possible to apply a transform (and hence a transition)
when a side image changes. Different transforms can be used
when a the change is within a single character, versus a
change between characters.

Fixes #781.
2015-11-27 22:31:07 -05:00
Tom Rothamel c29e8c314f Restore state inside a loaded ImageReference.
This only matters when an ImageReference is saved and loaded again.
Since the target may have been given information (from the
default transform or a previously shown transform), we have to
propagate that information along to the target that is newly-found
after load.

Fixes #795.
2015-11-26 22:42:20 -05:00
Tom Rothamel da021a3808 Allow ATL properties to take strings.
This is mostly for debug.
2015-11-26 12:33:59 -05:00
Tom Rothamel d64d5a60ca Improve recompiles of existing games.
* Do not crash when recompiling and a .rpyc file exists in an archive.
* Do not delete orphan rpyc files when distributing.

Fixes #792.
2015-11-26 10:47:54 -05:00
Tom Rothamel 0836a54114 Update changelog. 2015-11-25 22:46:19 -05:00
Tom Rothamel 623ceda92b Merge pull request #790 from kalawore/master
update traditional_chinese translator
2015-11-25 22:15:59 -05:00
Tom Rothamel f3bb6e66df Merge pull request #773 from Rikxz/patch-1
Added deprecation warnings on UI Functions
2015-11-25 22:07:42 -05:00
Tom Rothamel 7c3101cb1c Update changelog. 2015-11-25 00:38:31 -05:00
Tom Rothamel 734c0507f4 Update docs, add easings. 2015-11-24 22:11:23 -05:00
kalawore 25a4284a12 update traditional_chinese translator 2015-11-24 23:54:00 +08:00
kalawore f7a0087995 update traditional_chinese translator 2015-11-24 23:38:50 +08:00
kalawore 8074fc825a update traditional_chinese translator 2015-11-24 23:32:34 +08:00
kalawore dfe8c3e395 Merge branch 'master' of https://github.com/kalawore/renpy 2015-11-24 23:18:18 +08:00
kalawore cc74793542 Merge remote-tracking branch 'refs/remotes/renpy/master' 2015-11-24 21:29:34 +08:00
Tom Rothamel baa6cc3c59 Add config.log_width. 2015-11-24 00:49:59 -05:00
Tom Rothamel b9176185f1 Add ATL warpers to their own namespace.
This allows them to be used in other code, while also letting them
use each other in their implementation.

Fixes #788.
2015-11-23 21:41:02 -05:00
Tom Rothamel f96bedb510 Disable SDL2 HighDPI on Windows.
This will help ensure compatibility with future versions of SDL
that do understand HighDPI, but don't expect us to be handling
it ourselves.
2015-11-23 00:53:47 -05:00
Tom Rothamel 4c8078b4d7 Actively center a highdpi window on windows.
Since SDL doesn't understand highdpi on windows, it was placing
the window offscreen. This prevents Ren'Py from popping up a
window that can't be moved.
2015-11-23 00:52:18 -05:00
Tom Rothamel 383bc6af46 Use HighDPI physical size directly.
This helps prevent problems that could occur with non-integer
scaling factors causing non-pixel-aligned screens.

Fixes #362.
2015-11-23 00:15:27 -05:00
Tom Rothamel 71fc31c1cb Windows-platform HighDPI support. 2015-11-22 23:49:20 -05:00
Tom Rothamel ea3a9d7e21 Ensure config.use_drawable_resolution = False works.
Fixes #787.
2015-11-22 19:38:55 -05:00
Tom Rothamel 4222ae2e49 Add config.tag_transform.
This provides a way to supply a default transform to an image
tag.
2015-11-21 22:57:00 -05:00
Tom Rothamel 9c4f7f0851 Update the 6.99.8 changelog. 2015-11-20 23:50:03 -05:00
kalawore 90473bdda2 Revert "update traditional_chinese translator"
This reverts commit ec3be878a8.
2015-11-19 18:38:13 +08:00
Tom Rothamel bb9b6ca08a Clear the mouse focus when saving windows.
Fixes #780.
2015-11-18 22:13:48 -05:00
Tom Rothamel 55400c17a8 Store what last changed the focus.
Either the keyboard or mouse. This will be used to determine if
losing a focus should unforcus the keyboard.
2015-11-17 23:43:52 -05:00
Tom Rothamel 256f3173da Add Nyaatrap's implementation of Robert Penner's easing functions
http://robertpenner.com/easing/
http://robertpenner.com/easing_terms_of_use.html
http://lemmasoft.renai.us/forums/viewtopic.php?f=51&t=35749
2015-11-16 23:18:19 -05:00
Tom Rothamel 179cd2ed6c Make Frame's parameters optional. 2015-11-15 11:57:20 -05:00
kalawore ec3be878a8 update traditional_chinese translator 2015-11-15 23:17:50 +08:00
kalawore cd328876d1 Merge remote-tracking branch 'refs/remotes/renpy/master' 2015-11-15 20:34:06 +08:00
Tom Rothamel df16435ae4 Add renpy.add_layer function.
This provides a good way to modify config.layers.
2015-11-15 00:55:30 -05:00
Tom Rothamel 5d108094a5 Document new config variables. 2015-11-14 22:32:32 -05:00
Tom Rothamel daf3f34705 Allow a default layer to be associated with an image tag.
This commit makes it possible to associated a layer with
an image tag. Show and hide operations associated with that
tag will take place on the given layer.

Fixes #782.
2015-11-14 17:39:30 -05:00
Tom Rothamel 0ba1eeb9be Support xminimum and yminimum in hbox and vbox.
And because these are supported, so is area, xsize, and ysize.
2015-11-13 21:50:14 -05:00
Tom Rothamel 3c613a8157 Add PlayCharacterVoice.
This is a function that plays a sound file on the voice channel
with the given voice tag. This makes it possible to preview the
voice with the volume that would be used.
2015-11-09 21:51:00 -05:00
Tom Rothamel 75e4cc0bb7 Do not adjust text in console inputs. 2015-11-08 22:29:08 -05:00
Tom Rothamel 17f722fc0b Tristate _overlay_screens. 2015-11-07 23:44:23 -05:00
Tom Rothamel 2563a8dbcb Add config.overlay_screens.
This is a list of screens to display when the overlay is enabled,
which is the normal mode of operation.
2015-11-07 23:42:23 -05:00
Tom Rothamel 794932f82e Allow renpy.get_screen to check multiple screens. 2015-11-07 22:49:53 -05:00
Tom Rothamel 2b9ebc974c Limit alpha to 0.0 - 1.0 2015-11-07 22:49:07 -05:00
Tom Rothamel 1ca9a696e2 Document ATL warper output range. 2015-11-07 22:48:45 -05:00
Tom Rothamel 02a9d4721c Do not restrict ATL interpolation to the 0-1 range. 2015-11-06 20:48:14 -05:00
Tom Rothamel 3a583da12d Do not add spurious spaces to the end of text lines.
This was caused by looking at the wrong type. Fixes #779.
2015-11-04 23:10:05 -05:00
Tom Rothamel acd7f792ab Fix the get_available_image functions. 2015-11-03 22:55:46 -05:00
Tom Rothamel d42ffed1e7 Add renpy.can_show. 2015-11-03 00:23:40 -05:00
Tom Rothamel 17f8e56b70 Add a couple of functions to get tags and attributes. 2015-11-02 23:28:09 -05:00
Tom Rothamel d1f3c9dc8a Bump version to 6.99.8. 2015-11-02 23:26:44 -05:00
Tom Rothamel d3db4b099b Update the changelog. 2015-11-01 20:26:50 -05:00
Tom Rothamel adc2c96e71 Check displayable identity when determining hyperlink focus.
Fixes #777.
2015-10-31 10:06:35 -04:00
Tom Rothamel a1b572da61 lint: More accurately match image names.
Ren'Py considers "eileen beach happy" equivalent to "eileen happy
beach", and so lint should too.

Fixes #775.
2015-10-30 22:21:11 -04:00
Tom Rothamel ed653831a0 Merge pull request #776 from SpikyCaterpillar/software-xorg-fullscreen
No longer try to reuse existing windows when switching video modes.
2015-10-30 19:04:45 -04:00
Tom Rothamel 8d6ec39c33 Defensively program achievement merges. 2015-10-30 18:46:55 -04:00
Spiky Caterpillar d83d2045b3 No longer try to reuse existing windows when switching video modes.
This fixes a bug where, if you're using the software renderer on Xorg on Debian Jessie,
switching into fullscreen produces an unusable screen (usually, a fullscreen window with
the current screen contents stuck on it; sometimes the game window scaled to full screen
but refusing to accept graphic updates (though clicks ARE passed through to the underlying
game), sometimes the game window drawn actual size in the upper left corner of the screen
with the rest of the screen occupied by the previous screen contents).  This bug was
seen on two different Jessie machines.
2015-10-30 07:01:01 -07:00
Tom Rothamel 229df03363 Fix translation whitespace. 2015-10-29 09:47:06 -04:00
Tom Rothamel 4d141b7bc2 Update traditional chinese translation.
Merge branch 'master' of https://github.com/kalawore/renpy
2015-10-29 09:35:35 -04:00
Tom Rothamel 219fccf588 Properly chain non-default translate blocks.
This fixes a regression that caused a translated block to be followed
by the untranslated version of the same block.
2015-10-28 19:49:58 -04:00
Tom Rothamel 5c92d6cfb7 Move handling of renpy.session["compile"]
... into a place where it's run after the game restarts, but before
the game is compiled.
2015-10-26 23:13:17 -04:00
Rikxz 9b77cba97e Added deprecation warnings on UI Functions 2015-10-25 19:29:30 -05:00
Tom Rothamel b3545fbce4 Fix bad fix. ;^_^ 2015-10-25 19:42:40 -04:00
Tom Rothamel c055d253c4 Fix typos. 2015-10-25 19:33:16 -04:00
Tom Rothamel c9a35bd23f Support consumable purchases on iOS.
Code contributed by Pavel & Winter Wolves. Apparently, Apple is
only allowing money cheats as consumables. How evil.
2015-10-25 18:00:53 -04:00
Tom Rothamel a0e7ab2b2b Fix last merge. 2015-10-25 10:49:56 -04:00
Tom Rothamel 194a79069b Merge pull request #772 from SpikyCaterpillar/master
SW rendering bugfix and minor changes
2015-10-25 10:42:27 -04:00
Spiky Caterpillar 936a0bf1e5 Bring the audio back 2015-10-25 04:44:58 -07:00
Spiky Caterpillar a0ab3c845f Fit bug where windows wouldn't redraw when exposed if you were using the
software renderer.  (Bug observed on Debian stable/testing mix, Xorg
using Radeon driver, RV380 video card)
2015-10-25 04:25:32 -07:00
Spiky Caterpillar d61e4adef7 Support home and end in text input fields. 2015-10-25 04:24:55 -07:00
Spiky Caterpillar a244516b81 Trying to sync my fork. 2015-10-25 04:21:50 -07:00
Tom Rothamel 717b133a0e Doc another bugfix. 2015-10-24 23:00:05 -04:00
Tom Rothamel be288feb13 Remove (another) debug raise. 2015-10-24 22:57:05 -04:00
Tom Rothamel 1df06a92b5 Update changelog for 6.99.7. 2015-10-24 22:56:08 -04:00
Tom Rothamel daee66a17e Various fixes to gamepad support. 2015-10-24 14:00:24 -04:00
Tom Rothamel 7ccc26276a Fix fix. 2015-10-23 22:32:20 -04:00
Tom Rothamel d7c3aadf62 Predict screens with all possible arguments.
Fixes #769.
2015-10-23 21:09:40 -04:00
Tom Rothamel 9831b68ac9 Merge pull request #764 from emmeken/custom-text-replace
Custom text replacement hook
2015-10-23 20:47:10 -04:00
Tom Rothamel bec4cabf8d Remove debug raise. 2015-10-23 20:32:09 -04:00
Tom Rothamel f64e050f9b pad: Expose gamepad calibration via the shift+G menu. 2015-10-23 00:20:43 -04:00
Tom Rothamel 33fda314a0 pad: Add calibration tool. 2015-10-23 00:09:57 -04:00
Tom Rothamel a4b8da9119 pad: Start work on gamepad calibration tool. 2015-10-22 22:34:01 -04:00
Nolanlemahn 6b1bb396f7 Add "arrowkeys" child to Viewport 2015-10-22 19:08:15 -07:00
Tom Rothamel 1bb51d6953 Drop direct OUYA support.
It should work, but with the standard controller.
2015-10-22 01:27:58 -04:00
Tom Rothamel 5fd7282fdd Add support of K_SELECT.
This is the SELECT button on Android remote controls, like the one
for Fire TV.
2015-10-22 00:08:21 -04:00
Tom Rothamel 27f8f5092f transform: Do not take state from self.
This can happen incidentally during a copy during hide. It's not
correct, and so we prevent it from happening.

Fixes #760.
2015-10-21 21:51:18 -04:00
Tom Rothamel 6d8562cf97 pad: Ignore gamepad events if the window is not keyboard focused.
Fixes #766.
2015-10-20 21:28:46 -04:00
Emmeken 8cfe83eab6 Added custom text replacement hook
This allows a custom function to for example replace '--' with em-dash
and '...' with an actual ellipsis character.
2015-10-20 12:30:01 +02:00
Tom Rothamel c87b4087b1 Limit framerate if vsync is broken.
If the user requests vsync yet vsync happens to be broken, we'll
consume 100% CPU. This can happen on a mac, for example when
the window is fully covered by another window. This code inserts
a sleep in that case.

Fixes #757.
2015-10-17 22:48:36 -04:00
Tom Rothamel f0258aa269 Fix creator defined statement documentation.
Lint works for me.

Fixes #763.
2015-10-17 21:08:36 -04:00
Tom Rothamel ed871863df Add the ability to quit w/o save on mobile backgrounded.
Requested by Mugenjohncel.
2015-10-16 20:29:45 -04:00
Tom Rothamel 31de7c5ef0 Fix problems with docs. 2015-10-15 23:48:19 -04:00
Tom Rothamel b1f59d9eaa di: Document. 2015-10-15 23:40:00 -04:00
Tom Rothamel 20c71c6312 Make SL2 image an alias for add.
This shouldn't change anything semantically, and lets us share
the di behavior.
2015-10-15 22:52:28 -04:00
Tom Rothamel b781769a0a id: Use the screen scope with SL2 add.
This lets us write:

    default weather = 'sunny'
    add "logo [weather]"
    textbutton "Make it Rain" action SetScreenVariable("weather", "rainy")

in SL2, and have it work properly.

This required a genericization of the way SL handles providing scopes to
displayables, especially Text.
2015-10-15 22:45:36 -04:00
Tom Rothamel d75417d081 di: Export DynamicImage into the default namespace.
While this will probably never be used, it's probably best to
have it and not use it.
2015-10-15 18:04:21 -04:00
Tom Rothamel 2a90549cb9 di: Check that dynamic images are enabled. 2015-10-15 18:00:11 -04:00
Tom Rothamel 158d798bb8 Compat fixes & changes.
* Fix compat with 6.99.5. This was actually causing problems when
  packaging 6.99.6 games.

* Compat dynamic images.
2015-10-14 23:52:14 -04:00
Tom Rothamel a46ee80ec6 Add DynamicImage.
This provides a way to write:

    image eileen = "eileen [mood]"

rather than a massive condition switch.
2015-10-14 23:22:44 -04:00
Tom Rothamel 093dc4e79c Disable skipping when leaving a replay.
Fixes #758.
2015-10-14 20:52:09 -04:00
Tom Rothamel 8a8240e2a0 Properly subsurfaces renders with clipping enabled.
Because of one of the changes made to support drawable-resolution
text, we would increase the size of Renders. When clipping was
involved, this could make the render too large, causing overlap.

This fixes a bug that affected the scrollbars in some of the
default themes.
2015-10-13 19:00:04 -04:00
Tom Rothamel 8e5fbb2ef5 launcher: Maintain adjustements when style restarts happen.
This allows one to scroll through the list of color schemes, at least
until the new gui replaces them.
2015-10-13 00:09:09 -04:00
Tom Rothamel eb3a203fdc Force an interaction restart when a style rebuild occurs.
This was assumed but not enforced, and the result is that screen
preparation was not occuring when it needed to.
2015-10-12 22:40:56 -04:00
Tom Rothamel 6ac39d096f text: Unscale hyperlink coordinates.
This fixes a problem where hyperlinks were not being unscaled
properly, and hence hyperlinks that were not in the top-left
of a Text block would not handle focus the correct way.
2015-10-12 00:21:36 -04:00
Tom Rothamel ae6060b31a Include uncommitted text when processing the enter key on text input.
Fixes #742, hopefully.
2015-10-12 00:09:42 -04:00
Tom Rothamel c08acaef56 Do not include update.json in android/ios builds. 2015-10-11 23:23:28 -04:00
Tom Rothamel e8f98816ab Fix file pages to work right with folders.
Fixes #756.
2015-10-11 21:15:01 -04:00
Tom Rothamel 7be67acb0c Track checkpoints even if rollback is disabled.
This is necessary for setting _rollback to False to work
properly. Before this, greedy rollbacks could go to the
first line with _rollback=False, since they would go
until just after the last checkpoint.

Fixes #740.
2015-10-10 23:30:31 -04:00
Tom Rothamel 03043c1250 Merge pull request #755 from emmeken/user-statement-prediction
Fix creator-defined statement prediction
2015-10-10 20:32:22 -04:00
Emmeken a5375963a9 Fix creator-defined statement prediction
UserStatement.predict uses the return value from UserStatement.call,
but until now UserStatement.call did not return anything.
2015-10-10 12:42:52 +02:00
Tom Rothamel e18f96b827 If opening in fullscreen mode fails, revert to a window. 2015-10-09 23:06:26 -04:00
Tom Rothamel 7b8fbf2e49 Use eval_who and narrator in default_empty_window.
Fixes #753.
2015-10-08 22:19:37 -04:00
Tom Rothamel d641bb1f54 Make transition optional for nvl show and nvl hide.
Fixes #510.
2015-10-08 19:41:42 -04:00
Tom Rothamel 91c46dab72 text: Preserve newlines in the presence of a FlagSegment.
Fixes #748.
2015-10-07 21:41:53 -04:00
Tom Rothamel e7cd340ec7 Add the adjust_spacing text style property.
This is used in inputs (and can be used with extend) to ensure that
text does not change spacing when it changes. However, when doing so
it's important that the creator ensure there's enough space for
the text at all reasonable resolutions.
2015-10-06 23:31:13 -04:00
Tom Rothamel 345276cacc text: Store spacing tweaks and use to fix underlines.
We had the problem that spacing tweaks would force characters to
the right, leaving space between the last character and this one.
This fix now stores these adjutments, and uses them to add an
extra pixel to underlines and strikeouts when necessary to
compensate for this kind of shift.
2015-10-05 23:25:41 -04:00
Tom Rothamel 089a6bccf2 Fix regression in Text.size()
Called the wrong function to unscale the result. Thansk to emmeken
for the fix. Fixes #752.
2015-10-04 23:49:42 -04:00
Tom Rothamel ddd9a702e5 Remove translation TODOS. 2015-10-04 17:17:42 -04:00
Tom Rothamel 4dceccc491 Change the launch key to f5. 2015-10-04 17:17:11 -04:00
Tom Rothamel 04c17a71a3 Merge pull request #741 from Diapolo10/update_finnish
Updated the Finnish translation
2015-10-04 17:14:55 -04:00
Tom Rothamel 4e381dcc22 Merge pull request #751 from ricpelo/launcher-hotkey
In Launcher, hotkey "r" runs the current project
2015-10-04 17:14:46 -04:00
Tom Rothamel 3f14961d0d Fix session["compile"]. 2015-10-03 23:28:40 -04:00
Tom Rothamel 4b867d4220 folders: Start work on file folders. 2015-10-03 01:52:44 -04:00
Ricardo Pérez cd9bac3052 In Launcher, hotkey "r" runs the current project 2015-10-01 15:17:48 +02:00
Tom Rothamel dec43b1f81 scriptedit: Add an api for retrieving the text of a line. 2015-09-30 23:35:33 -04:00
Tom Rothamel e408f297d9 linelog: Add the line log feature.
This is a way of retrieving the lines that have executed since the
last time the line log was cleared.
2015-09-30 23:08:31 -04:00
Tom Rothamel f0b90920bf gui: Display the skip_indicator screen if it exists. 2015-09-29 23:08:10 -04:00
Tom Rothamel fc7eccef70 Consider manual screen prediction to be slow prediction.
Since screens can be slow, and we need to take that into account.
2015-09-28 22:47:50 -04:00
Tom Rothamel 879fc8814c Defer prediction of the say screen.
This works better in the case where the say screen is complex
and hence slow.
2015-09-28 22:44:22 -04:00
Tom Rothamel 8a188c9c3f scriptedit: Avoid triggering the autoreloader. 2015-09-28 00:33:32 -04:00
Tom Rothamel 45e860458d scriptedit: Delete lines from files. 2015-09-28 00:10:02 -04:00
Tom Rothamel f22af1d7dc scriptedit: Remove the spurious Return statement from all_stmts. 2015-09-27 23:50:51 -04:00
Tom Rothamel 60371bead8 scriptedit: Remove code from the AST. 2015-09-27 23:34:31 -04:00
Tom Rothamel 89050fbac7 sl2: Avoid predicting unlikely loops.
These are loops inside an if block that currently evaluates to False.
In this case, we only evaluate the loop once, for performance
reasons.
2015-09-26 00:51:45 -04:00
Tom Rothamel 7ddb4bf602 Defer opening SubFiles until initial use.
This speeds up loading of assets from RPAs, since most Subfiles will
never be opened, but just passed to image/sound/etc. loading code.
2015-09-25 22:37:36 -04:00
Tom Rothamel 6fc1227cd3 Add the ability to add statements to a file.
This means opening the file, adding code to the right places,
and then updating the data structures so this can be done
repeatedly.
2015-09-25 00:50:57 -04:00
Tom Rothamel 49e544c5f1 Only add code loaded at init time to the lines data structure.
This prevents problems when generated code is added to the wrong
files and locations.
2015-09-25 00:50:23 -04:00
Tom Rothamel 5505cc53f0 Move the Line/lines data structure to scriptedit.
This is where most of the code that manipulates it will live.
2015-09-24 21:50:21 -04:00
Tom Rothamel 147b6c26de Merge branch 'release-6.99.6' 2015-09-22 20:53:01 -04:00
Tom Rothamel 984c0fcc29 Encode backup directory properly. 2015-09-22 20:52:25 -04:00
Tom Rothamel 8e1abf2b49 scriptedit: Add/adjust line numbers in the AST. 2015-09-22 00:22:07 -04:00
Tom Rothamel 76eb82f50b Start work on script editing support. 2015-09-21 23:29:46 -04:00
Tom Rothamel 6ed3affddf Fix ShowMenu()
It wasn't working when empty when used as the target of a button.
2015-09-20 22:59:02 -04:00
Tom Rothamel 8a32179792 Fix image fonts.
They don't need to be looked up using the scale.
2015-09-20 14:10:18 -04:00
Tom Rothamel b65c5de62d Add support for iconbuttons.
These are buttons that contain an icon and an optional caption.
We use these in the new gui a lot.
2015-09-20 00:15:48 -04:00
Tom Rothamel 8ec6174dc2 Move properties like action, hovered, etc. to button_properties.
This makes it easier to declare custom SL displayables that
wrap buttons.
2015-09-19 23:33:22 -04:00
Tom Rothamel 61dc7a33fa Document .add_prefix_style_properties.
Fixes a documentation problem.
2015-09-19 23:32:42 -04:00
Tom Rothamel 14c7a7d416 Extend fit_first to allow it to only adjust the width and height. 2015-09-18 23:44:47 -04:00
Tom Rothamel 906e4de0a5 Add renpy.get_widget_properties.
A function to get the properties passed to a widget. The main reason
for this is so that it can be passed to other widgets - for example,
the "who" widget's color can be used to set up a background.
2015-09-17 22:20:18 -04:00
Tom Rothamel 44ef126806 Bind bars to the gamepad. 2015-09-16 20:26:35 -04:00
Tom Rothamel 41a35618f4 Only count seen dialogue that's still in the game.
This makes the progress screen more accurate when the underlying
game changes.
2015-09-15 22:25:17 -04:00
Tom Rothamel d296d5c17c Bump version. 2015-09-15 00:22:04 -04:00
Tom Rothamel 21b9fc1453 Merge branch 'release-6.99.6' 2015-09-15 00:21:00 -04:00
Tom Rothamel 70bc84b394 Allow pad_ keysyms. 2015-09-14 21:06:55 -04:00
Tom Rothamel 04449bb37b Allow pad_ keysyms. 2015-09-14 20:44:19 -04:00
Tom Rothamel e1bb500e00 Merge branch 'release-6.99.6' 2015-09-14 01:39:05 -04:00
Tom Rothamel c54f3d4ce1 Add support for deleting tags. 2015-09-14 01:08:59 -04:00
Tom Rothamel a397f653d7 Generate .update.json files. 2015-09-14 00:57:42 -04:00
Tom Rothamel 0f8c0d30fd Allow AFM to advance through pauses. 2015-09-13 22:00:26 -04:00
javimat b77c540235 Update common.rpy 2015-09-13 15:34:48 -04:00
javimat e68986d59d Update Spanish translation of the template 2015-09-13 15:34:35 -04:00
Tom Rothamel 7541bc6f51 Properly blit text with outlined descenders.
Before, we wouldn't necessarily notice we were on the last line of
outlined text, and could fail to blit the very bottom of a line.
2015-09-13 15:34:25 -04:00
Tom Rothamel c6d003486c Fix color tint/shade. 2015-09-13 15:34:15 -04:00
javimat 08f8df326a Update common.rpy 2015-09-13 16:20:15 +02:00
javimat 702a4a8463 Update Spanish translation of the template 2015-09-13 10:57:23 +02:00
Tom Rothamel c77b0933c8 Properly blit text with outlined descenders.
Before, we wouldn't necessarily notice we were on the last line of
outlined text, and could fail to blit the very bottom of a line.
2015-09-12 22:47:05 -04:00
Tom Rothamel 46bdc6c703 Fix color tint/shade. 2015-09-11 22:54:04 -04:00
Tom Rothamel 4db4bc1836 Merge branch 'release-6.99.6' 2015-09-10 22:52:57 -04:00
Tom Rothamel 9e7e78ac79 Rescan script files after compile.
This prevents a crash that occured because the script files were
scanned before compile deleted unused rpyc files.
2015-09-10 20:45:17 -04:00
Tom Rothamel 671a76c184 text: Adjust line top and height to match adjusted text.
Fixes an issue where oversampled text would have descenders
cut off.
2015-09-10 20:03:29 -04:00
Tom Rothamel b2eb4d0783 text: Adjust line top and height to match adjusted text.
Fixes an issue where oversampled text would have descenders
cut off.
2015-09-09 23:47:05 -04:00
Tom Rothamel e0a7728f62 Fix lint issue w/ Korean translation. 2015-09-08 23:54:07 -04:00
Tom Rothamel 6bcca2e39c Allow define to set config and persistent variables.
Fixes #689 - ish.
2015-09-08 23:48:55 -04:00
Tom Rothamel 1fdce5897c Merge branch 'release-6.99.6' 2015-09-07 23:25:04 -04:00
Tom Rothamel a4bfc86668 Ensure make_style_backup is called in every translation. 2015-09-07 23:23:53 -04:00
Tom Rothamel 91e3f05093 Add renpy.session.
This is a place to store arbitrary data that persists through
restarts.
2015-09-07 12:51:08 -04:00
Tom Rothamel b095378f71 Represent lines in compiled files as objects. 2015-09-07 00:02:46 -04:00
Tom Rothamel 7ca8e480e0 render: Ensure subsurface remains within the pygame Surface. 2015-09-06 13:17:56 -04:00
Tom Rothamel 28e645720f render: Check the crop box is within the surface.
See: http://lemmasoft.renai.us/forums/viewtopic.php?p=385773#p385773
2015-09-05 22:20:25 -04:00
Tom Rothamel 40de88d213 Import pure-python packages from game/python-packages.
Fixes #731.
2015-09-05 21:46:40 -04:00
Tom Rothamel a4d54abf7c Deal with zero-width text. 2015-09-05 20:21:24 -04:00
Tom Rothamel 36b7d7813f text: Force absolutes to ints in scale_outline.
Makes sure everything else works.
2015-09-05 01:33:16 -04:00
Tom Rothamel 826cc817c8 text: Round oversampling down when scaling outlines. 2015-09-04 23:40:18 -04:00
Tom Rothamel 7ad0c85681 text: Support absolute sizing of outlines. 2015-09-04 21:58:53 -04:00
Tom Rothamel 122c974d95 text: Adjust spacing of drawable-res text to fill virtual-res box.
It's possible for drawable-res text to be bigger or smaller than
the virtual-res box. This can lead to ugliness in text layout, as
centered text will not be centered, margins will be uneven, etc.

This fix adds code that adjust glyph placement to ensure the
drawable glyphs fill the same place as the physical glyphs,
using techniques similar to kerning and line_spacing.
2015-09-03 23:37:35 -04:00
Tom Rothamel 4ce304afb6 Add the ability to draw a box where the virtual text goes. 2015-09-03 22:14:23 -04:00
Tom Rothamel 166929aaff Tweak to add script. 2015-09-02 21:47:02 -04:00
Tom Rothamel a6f97435a9 text: Adjust outline scaling.
The goal here is to retain the proportion of the various outlines, to
avoid the case where 1px and 2 px outlines, when scaled up by 1.5x,
become 1px and 3px, respectively.
2015-09-02 21:36:37 -04:00
Tom Rothamel 82afa0aa13 Fix rendering of fullscreen movies.
The size we had chosen to render at would not fill the screen,
previously.
2015-09-02 09:32:30 -04:00
Tom Rothamel 3a4f4e6ebd Better compute subsurface when blits go outside a Render.
Text drawn using the new rendering code can be drawn outside the
Render, due to the difference between virtual- and drawable-resolution
text layout. Subsurface would not crop to the intersection of the
crop-box and the render, which cut text off.

This changes to only crop to the crop-rect, which means that text
leaving the Render ist still drawn (as long as it's in the crop-rect).

See: http://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=31311&start=120#p385132
2015-09-01 23:44:50 -04:00
Tom Rothamel b6a420ed52 Remove debug code. 2015-09-01 23:17:32 -04:00
Tom Rothamel af6991ab0f Add functions to synchronize local and Steam achivements. 2015-08-31 21:26:56 -04:00
Tom Rothamel 6d6261fced Remove debug-disabling of the big new feature.
😅
2015-08-30 23:10:35 -04:00
Tom Rothamel 7462532a77 Use virtual text size to compute screen placement.
A problem with the new text code is that the text can change its
virtual size. This can cause other layouts to jump around as the
screen is scaled.

To fix this, this change renders text twice, first at the virtual
size, and then at the drawable size. The first pass is used to
compute line breaking, and to get the size of the final Render.
Once that's done, the drawable size is used to draw cleaner text.

Fixes #728.
2015-08-30 19:49:30 -04:00
Tom Rothamel 52776d93b1 Add RENPY_ANNOTATE_CYTHON environment variable.
When given, this causes cython annotations to be generated.
2015-08-30 19:27:43 -04:00
Tom Rothamel 9723153455 Update changelog. 2015-08-29 17:05:34 -04:00
Tom Rothamel 6cc4ac5d8c Ensure files in the archive are not listed as common files.
This was causing random problems, most notably will an archived
images/ directory.

Fixes #726.
2015-08-29 16:54:32 -04:00
Tom Rothamel 75d9cdfc5d Update help, document controller support.
Fixes #724.
2015-08-29 11:17:26 -04:00
Tom Rothamel 43abcd902d Update DejaVuSans and include/use -Bold.
6.99.6 is focusing on text rendering, and having better rendering of
bold really contributes to that.

Fixes #727.
2015-08-28 21:58:07 -04:00
Tom Rothamel e93e58c0df Include possibly-focusable displayables in the focus order.
A possibly-focusable thing is a button/bar/etc that is currently
insensitive, but might change to become sensitive in the future.
We want to have those things reserve their place in the focus
order, so the thing with focus doesn't lose focus when
something else becomes focusable.

Fixes #725, maybe. This is my best guess as to what's going on
there.
2015-08-28 19:43:19 -04:00
Tom Rothamel a52135893c Do not round locations when subpixel is enabled. 2015-08-27 22:01:22 -04:00
Tom Rothamel 1e0a10a852 Properly compare Matrix2Ds.
Floating point precisions issues strike again!
2015-08-27 21:49:52 -04:00
Tom Rothamel 35eb168c41 Revert "Scale text sizes only down."
This reverts commit 52a0b874a3.

It seems like it makes things worse, not better.
2015-08-27 21:11:07 -04:00
Tom Rothamel f53461c207 Render text using drawable-aligned bilinear interpolation.
This is another attempt to fix Nyaatrap's problem. It's now
easy to align to drawable - and even if this fails to fix
the problem because their card is broken, it should fall back
to a reasonable rendering.
2015-08-27 20:58:47 -04:00
Tom Rothamel 35806f1897 Fix scaling of the screen. 2015-08-27 00:42:03 -04:00
Tom Rothamel 0dd0f37ebd Draw the screen at the drawable resolution.
This is intended to fix an issue reported by Nyaatrap, here:
http://lemmasoft.renai.us/forums/viewtopic.php?p=384227#p384227

where the new text rendering code would cause artifacts. My guess
is the artifacts were caused by rounding errors that meant the
text images were not the correct size. By drawing the screen
at the drawable resolution, we attempt to eliminate these
errors.
2015-08-26 23:49:03 -04:00
Tom Rothamel 52a0b874a3 Scale text sizes only down.
This should help ensure that text does not expand, and hence reduce
problems caused by rescaling text.
2015-08-26 21:58:32 -04:00
Tom Rothamel 0d98166503 Do not error out when drawing ruby text outside the bounds of the
text.

This is almost always visually spurious, but can happen due to scaling
of of bounding boxes of ruby text. This prevents such scaling from
causing errors.
2015-08-26 21:08:47 -04:00
Tom Rothamel 112eeb00fd Properly expand LGPL. 2015-08-25 10:21:19 -04:00
Tom Rothamel 424e90eeeb Fix problems with GLDraw.is_pixel_opaque and IMAGEDISSOLVE.
The problem was that IMAGEDISSOLVE would cause a render-to-texture,
which would use the buffer that is_pixel_opaque had been drawing
to, causing a problem.

We check for this case, and try again - there should be no
render-to-texture the second time around, since all such
rendering has been done.
2015-08-25 00:41:54 -04:00
Tom Rothamel 1c2b5f3361 Allow ImageDissolves to be used directly as masks. 2015-08-24 23:50:48 -04:00
Tom Rothamel a38a6c8c1f Remove obsolete debug code. 2015-08-24 23:33:03 -04:00
Tom Rothamel 060ac47872 Add button to copy tracebacks/parse errors to the clipboard.
This should make posting errors easier. Fixes #722.

Right now, this is only supported on windows/mac. Linux should work,
but appears to be having problems - perhaps with the relatively
large text pastes.
2015-08-23 15:20:47 -04:00
Tom Rothamel a7ebac3006 Return full path to error files.
This ensure that code that uses the file finds the right file.
2015-08-23 15:19:24 -04:00
Tom Rothamel e256c168f9 Round scaled fonts down to the nearest integer size.
This tends to shrink fonts, rather than expanding them - which looks
a little nicer, as it prevents ugly overlaps.
2015-08-23 13:36:46 -04:00
Tom Rothamel af04859f97 Bold text requires antialiasing.
It doesn't seem to work without AA, it's not worth doing the work
for a more complete fix, given how little non-AA text is used.
2015-08-22 22:04:49 -04:00
Tom Rothamel 18a06e88db Remove align_to_drawable methods.
Nearest-neighbor mode does the same thing, more reliably.
2015-08-22 21:38:47 -04:00
Tom Rothamel 46798413ed Draw drawable-resolution non-subpixel textures in nearest-neighbor mode.
This is mostly used by drawable-resolution text. Before this change,
the text (which was not generally drawable-aligned) might have
been bilinearly interpolated, which is less than ideal.
2015-08-22 21:29:15 -04:00
Tom Rothamel feec3f0dbb Add config variable to disable the transparent title.
This is intended for Ren'Py dev purposes.
2015-08-22 19:22:09 -04:00
Tom Rothamel 3b3c691a23 Add align_to_drawable method to renderers.
This is a method that, given virtual coordinates, returns the virtual
coordinates of the closest point in drawable space. This will be used
to eventually drawable-align text, even if the natural blit point is
not an integer pixel.
2015-08-21 22:22:29 -04:00
Tom Rothamel 5a3de5660a Fix Text.__unicode__ crash.
Checked the wrong type, and hence would crash if a text included a
Displayable in it.
2015-08-21 22:07:26 -04:00
Tom Rothamel 59a1ca923d Search images/ for missing files.
This should fix a common newbie problem, and also make referencing
stuff in the images directory easier in displayables.
2015-08-20 19:59:04 -04:00
Tom Rothamel 04942b371b Read gamecontrollerdb, and list attached devices.
This should make more devices work, and provide a path for diagnosing
and fixing other devices.

Also, avoid re-initializing game controllers.
2015-08-19 22:10:48 -04:00
Tom Rothamel db6918927c Add gamecontrollerdb.txt
From https://github.com/gabomdq/SDL_GameControllerDB.
2015-08-19 21:00:17 -04:00
Tom Rothamel c235f2b598 Fix safe mode on Windows, remove for Linux.
Both had been broken, and there doesn't seem to be a way to fix it
on Linux - but it's less necessary there.
2015-08-18 19:52:44 -04:00
Tom Rothamel dc834779fb Fix multiple typo-like bugs.
Fixes #720, Fixes #721. Thank you emmeken for finding this.
2015-08-17 22:28:44 -04:00
Tom Rothamel 3386e9f0aa Update docs. 2015-08-16 23:55:14 -04:00
Tom Rothamel 9ad4b3b0a9 Update changelog. 2015-08-16 23:50:20 -04:00
Tom Rothamel 3a179cca2c Add pad_enabled to the safe mode/shift+G menu.
This lets us deal with a small number of computers that have problems
scanning for joysticks and gamepads.
2015-08-16 20:25:19 -04:00
Tom Rothamel 0d8f470af6 Add a hook for mapping pad events.
Since someone is going to ask for it, might as well add the ability to
support it now.
2015-08-16 20:18:27 -04:00
Tom Rothamel 01c7d1d328 Document gamepad bindings. 2015-08-16 20:04:00 -04:00
Tom Rothamel b63078f414 Allow At to take transforms with parameters.
Fixes #719.
2015-08-16 19:56:29 -04:00
Tom Rothamel 27aaa0aab9 Merge pull request #698 from pr-yanka/pr-yanka-patch-1
Pr yanka patch 1
2015-08-16 11:14:49 -04:00
Tom Rothamel 6bd1ab30e8 Merge pull request #717 from RangHo/master
Fixed common.rpy
2015-08-16 11:14:16 -04:00
Tom Rothamel 2fae816769 Wrap shown transforms in an ImageReference.
Fixes #695.

The problem is that Ren'Py had no way of telling Transforms created by
an at-list from those supplied to renpy.show as input. The result is
that we'd get a stack of transforms, and then change the child the
entire stack, which could cause repeats in the transform stack
(see the bug).

This is fixed by wrapping Transforms passed to renpy.show in an
ImageReference, which makes it clear which are on the "outside"
and which are on the "inside" of the at_list.
2015-08-15 20:53:12 -04:00
Tom Rothamel b03201a7e2 text: Remove buggy and pointless line. 2015-08-14 00:47:07 -04:00
Tom Rothamel 1cfb2a2cd8 backup: Fix crash with archived files. 2015-08-14 00:15:12 -04:00
RangHo Lee 5854ca77d7 Fixed common.rpy 2015-08-13 21:05:41 -07:00
Tom Rothamel 657fdd5efd Add a way to disable rpy backups. 2015-08-13 23:47:12 -04:00
Tom Rothamel c1ed41f82d Ren'Py will automatically backup .rpy files.
Backup is done if script_version.{rpy,rpyc,txt} is not present,
and at least one .rpy file has changed (as compared to the
corresponding .rpyc files).

Backups are placed in the "backups" directory underneath the
user-global saves directory.

Fixes #687.
2015-08-13 23:18:26 -04:00
Tom Rothamel b331e6f61b Controller: Fix dpad typo. 2015-08-12 23:08:51 -04:00
Tom Rothamel 21fe9c1094 Fix controller support. 2015-08-12 22:57:03 -04:00
Tom Rothamel 56bb1c8f15 Respect config.autosave_slots.
Fixes #711.
2015-08-12 22:37:06 -04:00
Diapolo10 02a6fa0c0f Updated the Finnish translation
I have updated the Finnish translation to the most recent version of
Ren'Py.
2015-08-12 19:53:46 +03:00
Tom Rothamel 48f1e1e9c8 Add config.after_replay_callback. 2015-08-11 09:11:26 -04:00
Tom Rothamel 0eddb65538 Fix mouse wheel support.
It was broken by the previous commit.
2015-08-10 23:24:20 -04:00
RangHo Lee cdbac9af62 Merge pull request #2 from renpy/master
Updating repo
2015-08-09 10:31:16 -07:00
Tom Rothamel 22a1bc60de Filter events at pygame level to only those Ren'Py uses.
There are cases (including joysticks and touch events) where SDL2
generates multiple events for every event we're interested in. For
example, it generates a touch and mouse event for each touch. We
filter events to the list of events we're interested in.
2015-08-09 09:56:01 -04:00
Tom Rothamel 53af0a28ee controller: pad_enabled preference. 2015-08-08 09:04:10 -04:00
Tom Rothamel 7e5078996a controller: Bind gamepad event names to Ren'Py event names.
This make it possible to play with the gamepad.
2015-08-08 08:59:09 -04:00
Tom Rothamel bafc714076 controller: Generate controller events. 2015-08-07 23:18:30 -04:00
Tom Rothamel acd7de7524 Support multiple names in an EVENTNAME event. 2015-08-06 22:59:15 -04:00
Tom Rothamel dc73a22849 Remove joystick support.
This is getting rid of the old code so it can be replaced with a
new system based on the SDL2 controller code.
2015-08-06 22:08:08 -04:00
Tom Rothamel bf8b7fece6 Use pygame_sdl2.event.register to allocate events. 2015-08-04 23:17:49 -04:00
Tom Rothamel eb3c2f541d Remove NoTransition, replace with Pause in docs.
Since NoTransition never existed, there's no need to add it, since
Pause does the same thing.

Fixes #709.
2015-08-03 22:13:33 -04:00
Tom Rothamel 73f0a85f70 Add new stuff to pyanalysis. 2015-08-03 22:09:41 -04:00
Tom Rothamel 8a16e1b018 Add NoTransition to the default store, since it was used in docs. 2015-08-03 22:06:03 -04:00
Tom Rothamel 9c65db7e6d Enable HighDPI on Desktop. (Retina macs.) 2015-08-03 22:02:30 -04:00
Tom Rothamel 3cd3f8ceee text: Fix include of displayables in oversampled/HighDPI text. 2015-08-02 08:44:57 -04:00
Tom Rothamel 5d3d3506be text: Scale text tags. 2015-08-01 12:06:30 -04:00
Tom Rothamel 1349ab7ad9 Make drawable resolution configurable. 2015-07-31 11:42:00 -04:00
Tom Rothamel 849c1eca2c text: Allow imagefonts to work with oversampled text. 2015-07-31 11:17:37 -04:00
Tom Rothamel ed0e68c7e1 Do not run overlay function during startup.
This fixes compatibility with older Ren'Py games, that might not
intialize the overlay until the splashscreen or game start.
2015-07-31 00:03:35 -04:00
Tom Rothamel 9198f4a610 Oversample text.
That is, render text at the drawable resolution rather than the
virtual resolution.
2015-07-30 23:52:53 -04:00
Tom Rothamel 1ebbcb32ef Document render_to_texture changes. 2015-07-30 23:52:40 -04:00
Tom Rothamel 31384e8b7f Remove now-invalid render_to_texture optimization.
Now that RTT textures are created at the drawable resolution,
it isn't valid to reuse a blitted texture instead of RTT-ing.
2015-07-29 23:49:06 -04:00
Tom Rothamel 00efc0086f Remove obsolete/unused code. 2015-07-29 23:48:52 -04:00
Tom Rothamel c6c1f45e0a Render-to-texture at the drawable resolution.
When an image is zoomed down and the drawable screen is bigger than
the virtual screen, Ren'Py will draw the additional information
present in the image. This information was being lost during RTT
operations that occured at the virtual resolution. (This usually
manifested as a blurry dissolve.)

Now, RTT occurs at the drawable resolution, and so the information
is shown to the player.

This also adds the information needed to render text at drawable
resolution.
2015-07-29 23:18:15 -04:00
Tom Rothamel 610565756a Make screenshot work with HighDPI. 2015-07-28 22:51:30 -04:00
Tom Rothamel 7e2df8223b Add RENPY_FAKE_HIGHDPI.
This is an environment variable that makes testing HighDPI more
convenient. For example, setting RENPY_FAKE_HIGHDPI=2 simulates
a 2x retina screen.
2015-07-28 22:46:13 -04:00
Tom Rothamel 749e99e0f3 Initial support for HighDPI/Retina on iOS. 2015-07-28 22:39:28 -04:00
Tom Rothamel 274d8cfc35 Merge pull request #702 from Rikxz/patch-1
Typofix on docstring
2015-07-28 00:23:47 -04:00
Tom Rothamel c1d3418a1b Disable the load screen while in replay. 2015-07-28 00:22:36 -04:00
Tom Rothamel e0dfd732af Fix typo. 2015-07-28 00:17:53 -04:00
Tom Rothamel 00e4d7d30e Predict icons. 2015-07-28 00:17:41 -04:00
Tom Rothamel d685425752 icon: Register as custom sl displayable.
This also fixed a few things about how we register custom sl
displayables.
2015-07-28 00:03:20 -04:00
Tom Rothamel 3b7c797e11 Add add_property_group to SL2. 2015-07-27 23:39:48 -04:00
Tom Rothamel a8a809702d Move SL2 properties to their own file. 2015-07-27 22:51:37 -04:00
Tom Rothamel 081c604d88 Automatically add ui and positional properties to sl2 displayables.
This removes a lot of redundant code.
2015-07-27 22:50:53 -04:00
Rikxz 1553c90e41 Typofix on docstring
"The programmatic equivalent of the show screen statement." became "The programmatic equivalent of the call screen statement." for def call_screen
2015-07-27 21:43:28 -05:00
Tom Rothamel 3298cdd5fe Add Icon class.
This is the start of a system that will use scalable and recolorable
icons to support the new GUIs.
2015-07-26 23:25:08 -04:00
Tom Rothamel 1a61d24568 Add Render.zoom. 2015-07-26 22:56:27 -04:00
Yana 4aeae19752 fixed previous commit 2015-07-26 12:23:58 +03:00
Yana 7bf315db29 fixed wrong translation
I am guarantee that it is correct now like russian user. ;)
2015-07-26 10:42:09 +03:00
Tom Rothamel 1b4044e2f9 Analyze [:] properly. 2015-07-25 13:06:27 -04:00
Tom Rothamel 0f5eb2e4ac Document renpy.register_sl_displatyable.
This is a way of creating a new screen language statement that
returns a creator-defined displayable.

This is necessary since register_sl_statement doesn't integrate
closely enough with SL to allow proper style handling while still
allowing the screen to be optimized.
2015-07-25 12:34:33 -04:00
Tom Rothamel 5835888c04 sl2: Do not reuse displayables if style_prefix changes. 2015-07-25 11:54:36 -04:00
Tom Rothamel e18af36f20 Frame now uses style.child if set.
This allows a Frame to be a top-level object that changes to
multiple images.
2015-07-25 11:51:38 -04:00
Tom Rothamel daecfc8d27 Add renpy.split_properties.
This is a function that can split properties based on a prefix.
2015-07-24 22:05:49 -04:00
Tom Rothamel 4784deb4a4 Allow style_group to be given to a screen.
This is the same as giving it to every top-level child of that
screen, but might be a bit more convenient.
2015-07-23 21:15:33 -04:00
Tom Rothamel b5a97a75e1 Support imagebuttons w/o a hover_image.
Fixes #690.
2015-07-22 19:01:02 -04:00
Tom Rothamel 6206427e1a Merge pull request #692 from caryoscelus/master
fix (py_)eval: allow evaling code objects
2015-07-22 11:02:34 -04:00
caryoscelus 03eee36de1 fix (py_)eval: allow evaling code objects
The reason for this is that otherwise eval function available in
.rpy files is not fully compatible with regular python eval.
2015-07-22 15:07:11 +03:00
Tom Rothamel dd1ca318e0 Document the Color class. 2015-07-22 00:06:10 -04:00
Tom Rothamel 691cdc0a7f Move Color into its own module.
Since it's getting kind of large.
2015-07-21 22:50:12 -04:00
Tom Rothamel 8d59605aa9 More Color methods, and some renaming. 2015-07-21 00:30:28 -04:00
Tom Rothamel c48baeb6a4 More color methods. 2015-07-21 00:26:22 -04:00
Tom Rothamel ddc1c490db Allow Colors to be multiplied by im.matrix-es. 2015-07-20 23:55:27 -04:00
Tom Rothamel f7914576aa More Color methods. 2015-07-20 23:45:32 -04:00
Tom Rothamel 27eb710a7c Add the Color class.
This is a class that represents a color. While functioning as a
tuple, it also has methods and properties that allows one to
convert to and frop other color systems.
2015-07-20 22:32:00 -04:00
Tom Rothamel 8c37a1e7d5 sl2: Displayables take "arguments" and "properties" parameters.
Fixes #675.
2015-07-19 22:05:42 -04:00
Tom Rothamel a9d67162e8 Bump version. 2015-07-19 22:02:09 -04:00
Tom Rothamel a5c815f889 Fix unmute preference. 2015-07-18 16:20:04 -04:00
Tom Rothamel ac272df001 Fix typo. 2015-07-17 21:24:58 -04:00
Tom Rothamel 89b344fb70 Add roles to changelog. 2015-07-17 21:24:29 -04:00
Tom Rothamel 77bf797d18 Add _get_voice_info() to the changelog. 2015-07-17 21:19:15 -04:00
Tom Rothamel 4887b172f6 Document _get_voice_info. 2015-07-17 20:56:06 -04:00
Tom Rothamel 10674b0426 Use nearest neighbor for DISSOLVE and IMAGEDISSOLVE. 2015-07-16 17:22:05 -04:00
Tom Rothamel d253606562 Add _get_voice_info().
This is a function that returns an object that represents the
voice that is being played.
2015-07-14 18:41:16 -04:00
Tom Rothamel 5da52a7ad2 Fix mute documentation. 2015-07-14 00:18:44 -04:00
Tom Rothamel af5c549bff Document config.adjust_view_size. 2015-07-14 00:10:12 -04:00
Tom Rothamel a6959a3743 Pass "<mixer> volume" value to SetMixer.
Fixes #685.
2015-07-13 22:09:34 -04:00
Tom Rothamel 8774e58b10 Re-ask for editor selection as necessary.
If the user is trying to edit a file but has selected the None
editor, they're probably questioning the wisdom of their initial
decision. Prompt again for their selection.
2015-07-13 21:03:21 -04:00
Tom Rothamel d111e05674 Fix tutorial translation ids. 2015-07-13 17:50:13 -04:00
Tom Rothamel 531f39d516 Merge pull request #684 from nxcrft/pull-1
Fix a typo.
2015-07-13 17:41:36 -04:00
Tom Rothamel 58ddd537aa Fix packaging of template games. 2015-07-13 17:39:26 -04:00
Konstantin Nikolayev 203b0f9710 Fix a typo. 2015-07-13 19:17:02 +03:00
RangHo Lee 71a2961ab3 Merge pull request #1 from renpy/master
Updating repo
2015-07-13 09:04:58 -07:00
Tom Rothamel c553d7206d Update changelog to include translations. 2015-07-12 18:58:25 -04:00
Tom Rothamel fdcb2142d6 Do not apply with None to layers that already have a transition.
Doing so will change what the transition applies to.

See: http://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=33077
2015-07-11 22:15:31 -04:00
Tom Rothamel 562651371d Move call to renpy.execute_default_statement out of common code.
It's already being called by call_replay, so this prevents it from
being called twice and causing an error.

Fixes #651.
2015-07-11 20:28:47 -04:00
Tom Rothamel be7ed3fb7e Merge pull request #674 from bbs3223474/master
Add simplified_chinese template.
2015-07-11 12:05:08 -04:00
Tom Rothamel 8ff7e6d6df Check in updated/fixed docs. 2015-07-10 22:55:53 -04:00
Tom Rothamel 859a4f316e Update changelog. 2015-07-10 22:52:55 -04:00
Tom Rothamel 7102e8788c Drop support for reloading on mobile platforms.
Reloading wouldn't do much, since the underlying files do not
change. Reloading also requires us to back up Ren'Py, which
is moderately expensive, so eliminating that reduces start
time.
2015-07-10 21:38:44 -04:00
bbs3223474 8909283061 Fix 2015-07-10 22:12:14 +08:00
bbs3223474 3215946b58 Complete translate all scripts 2015-07-09 22:30:27 +08:00
Tom Rothamel 6b4df749d2 Add Canvas.get_surface().
This provides an official method to get a pygame surface the user can
draw into.
2015-07-09 00:53:11 -04:00
Tom Rothamel 8caf6db689 Add Canvas.get_surface(). 2015-07-09 00:51:50 -04:00
Tom Rothamel 598ae2b07b Copy start times when copying a MultiBox.
This fixes a bug that prevented the children of a copied Fixed from
getting events.

see: http://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=32872
2015-07-09 00:38:20 -04:00
Tom Rothamel af8aaf176b Add config.nearest_neighbor.
Which enables nearest-neighbor filtering by default.
2015-07-08 22:59:17 -04:00
Tom Rothamel 01c0dcf7c5 Add the ATL update event.
This event is triggered when a screen is updated without being shown
or replacing another screen, such as when the game is loaded or when
styles or translations change.
2015-07-08 21:56:12 -04:00
bbs3223474 3c19c4d866 fix some problems 2015-07-09 09:49:29 +08:00
bbs3223474 5855c622a4 Translated and added statements 2015-07-08 11:59:00 +08:00
bbs3223474 77b6e739a2 Add functions and translate comments 2015-07-08 11:45:31 +08:00
Tom Rothamel 2e963045b4 New Mute actions and preferences.
* SetMute
* ToggleMute
* Preferences("all mute", ...)
2015-07-07 22:54:55 -04:00
Tom Rothamel 3e7476020f Various volume/mixer-related improvments.
* When muted, the volume returns 0
* Changing the volume to a non-zero value unmutes the mixer.
* Init all mixers.
* Get a list of mixer names.
2015-07-07 22:54:25 -04:00
bbs3223474 b1d84e3d51 Chinese translated 2015-07-07 16:27:51 +08:00
Tom Rothamel 35b22b1eee sl2: Various transclusion fixes.
The new interface execises transclusion, and bugs were found.
2015-07-04 22:42:15 -04:00
Tom Rothamel 52f6d70cf3 sl2: Add can take None, in which case nothing is added.
This allows code to take a displayable or None, without having to
be enclosed in an if statement - it makes customizing screens a
little easier.

Fixes #677.
2015-07-03 23:56:05 -04:00
Tom Rothamel 0ec79a2388 When backing up objects, pickle with HIGEST_PROTOCOL.
This is necessary to properly pickle objects that contain Styles.
2015-07-03 22:57:31 -04:00
Tom Rothamel c0ce6df88b iOS IAP fixes and improvements.
- Fixes purchasing, which was broken because the products weren't
  being validated on startup.

- Improves things in general - iOS will now only prompt for the
  username and password when the user actually enters the IAP
  screen.
2015-07-02 23:02:40 -04:00
Tom Rothamel 9c33391720 Add renpy.predicting().
A function that returns True if Ren'Py is currently predicting.
2015-07-02 23:02:18 -04:00
bbs3223474 47a6e827e2 Add simplified_chinese template.
I noticed that Ren'py did not have any simplified-chinese template in
GitHub, only one in our local blog, made by a Chinese guy who didn't
want to upload his work to GitHub. So I made a translation for free and
uploaded to Git.
2015-06-30 20:15:13 +08:00
Tom Rothamel 4b09cf1828 Add renpy.return_statement().it 2015-06-29 19:51:39 -04:00
Tom Rothamel 89e8d79b63 Fix syntax errors in Korean translation. 2015-06-29 09:28:25 -04:00
Tom Rothamel 3024d49a57 Prevent duplicate prints on iOS. 2015-06-28 22:48:17 -04:00
Tom Rothamel 275e6ddf8c Remove translation TODOs. 2015-06-27 15:50:30 -04:00
Tom Rothamel 9436cb8386 Merge pull request #673 from RangHo/master
added korean translation for tutorial
2015-06-27 15:46:40 -04:00
Tom Rothamel 593a37af83 Merge pull request #672 from bbs3223474/patch-1
Fix Chinese translation of "Nightly".
2015-06-27 15:45:49 -04:00
RangHo Lee abca0c4083 added new font file 2015-06-27 10:37:10 -07:00
RangHo Lee 5d70224fa7 translation completed 2015-06-27 10:34:46 -07:00
Huang Junjie e3e0e9338d Fix Nightly's translation 2015-06-27 14:30:39 +08:00
Tom Rothamel cbbd1b58c0 Add _dismiss_pause.
This controls if the user can dismiss pauses and transition
pauses.

Fixes #671.
2015-06-26 09:09:00 -04:00
Tom Rothamel e3509f1368 Add _skipping.
This is a store variable that enables skipping (defaulting) to
true, allowing skipping to be disable for portions of the
game.
2015-06-26 09:00:56 -04:00
Tom Rothamel 097d3973a0 Add config.minimum_presplash_time.
This lets the user ensure that the presplash image is shown for
an amount of time, so it doesn't need to be duplicated in the
splashscreen.
2015-06-25 23:18:24 -04:00
Tom Rothamel 8048c7d94a Kill of presplash at interface start.
This is after various expensive analyses take place.
2015-06-25 23:14:17 -04:00
Tom Rothamel a26a5bd42f Rewrite presplash to use pygame_sdl2.
This lets us get rid of the crazy old presplash system.
2015-06-25 23:02:40 -04:00
Tom Rothamel a9ca5b03de Detects loops of recursive styles.
Prevents a possible segfault.
2015-06-25 01:04:15 -04:00
Tom Rothamel 7de4bb96cd Only mark style as built on successful build.
This prevents Ren'Py from producing weird errors caused by a
half-built style, which can occur if the build takes place
in a try-except block.
2015-06-25 00:53:35 -04:00
Tom Rothamel 0484e3f091 Merge pull request #669 from asfdfdfd/focus_mask_callable_fix
Fix callables in focus_mask.
2015-06-24 22:04:41 -04:00
asfdfdfd e2ace16bfc Fix callables in focus_mask.
focus_mask tried to use callable as displayable.
2015-06-25 00:34:54 +03:00
Tom Rothamel b93a106c1c Allow Function to restart the interaction. (Defaults to true.)
Fixes #656.
2015-06-23 08:22:15 -04:00
Tom Rothamel b42a0a3b7a Avoid importing/including EasyDialogs.
We only use EasyDialogsWin, so there's no need for the other
package.

Fixes #665, hopefully.
2015-06-22 21:44:07 -04:00
RangHo Lee 29e4fe5616 remove period 2015-06-21 21:18:57 -07:00
RangHo Lee 70d2778754 added part of the korean translation for the tutorial game 2015-06-21 11:32:57 -07:00
Tom Rothamel 893a27fca4 Clean RAPT, rather than rebuilding it.
This generally speeds up the distro process.
2015-06-21 12:35:52 -04:00
Tom Rothamel 8ec1a6e17f Only use build_cache when distributing Ren'Py.
It really only makes sense when building Ren'Py, and for other
projects will slow things down for little benefit.
2015-06-21 01:25:48 -04:00
Tom Rothamel 979ae96475 Use hash.txt instead of version.txt.
This makes Ren'Py work with the new build caching code.
2015-06-21 01:20:56 -04:00
Tom Rothamel e035918f04 Avoid generating packages that haven't changed.
This massively speeds up the build process, since renios and the
editors usually don't change between releases.
2015-06-21 01:11:26 -04:00
Tom Rothamel b5eab3f362 [Rejected] Code to hash file lists to speed up build.
This doesn't seem to work well, since the file lists change too
much between builds for these optimizations to be useful.
2015-06-20 23:32:37 -04:00
Tom Rothamel 3a41ad4469 Include Ren'Py in SDK distributions.
Whoops. ;-)
2015-06-20 21:56:20 -04:00
Tom Rothamel e93a8a594b Stop documenting ios-presplash.
With the changes to iOS support made yesterday, the presplash
image is no longer displayed on iOS - the Launch Image should
suffice.
2015-06-20 15:09:23 -04:00
Tom Rothamel 16750f2437 Merge pull request #663 from caryoscelus/master
launcher: fix arabic front_page
2015-06-19 14:28:47 -04:00
caryoscelus dc2ba0eb7f launcher: fix arabic front_page 2015-06-19 19:31:14 +03:00
Tom Rothamel 707de937a2 Merge pull request #662 from renoa/patch-16
translated android.rpy and front_page
2015-06-19 08:58:24 -04:00
Renoa e407b8a59e Update front_page.rpy 2015-06-19 09:13:55 +03:00
Renoa 57e73ebc6e Update android.rpy
added arabic translation
2015-06-19 09:03:37 +03:00
Tom Rothamel 5259f93472 Allow the creator to select how fonts are hinted.
Closes #650.
2015-06-18 19:20:05 -04:00
Tom Rothamel 218bb0a42b Fix renpy.pop_call also showing up as pop_return in the docs. 2015-06-18 00:26:02 -04:00
Tom Rothamel 290cab6832 Add no-rapt option.
To slightly speed up build.
2015-06-18 00:22:41 -04:00
Tom Rothamel 9d98e8541e Fix overly-matching glob. 2015-06-17 22:36:38 -04:00
Tom Rothamel e2ff897bb7 Avoid compiling/distributing binaries for template games.
This shrinks the distro by a bit, and speeds up build.
2015-06-17 22:28:32 -04:00
Tom Rothamel ae4e58c657 Fix rmpersistent.
Moving the evaluation of arguments later meant persistent data
would be saved when the game quit. This fixes that by adding a
flag that controls if persistent data is saved.
2015-06-17 21:18:31 -04:00
Tom Rothamel a0e7822635 Analyze parameters once per screen.
Analyzing parameters multiple times caused the creation of a new
global_constant set each time. If that was changed by the
parameters, the analysis would never reach a fixed point,
causing an infinite loop.
2015-06-16 21:28:44 -04:00
Tom Rothamel e211f07d26 Add missing colon. 2015-06-16 11:44:45 -04:00
Tom Rothamel 4a264851ea Buy default, force recompile on build.
This will ensure that the various .rpyb files are emptied of legacy
code, and that they all reflect the version of Ren'Py the game
has been built with.

Fixes #660.
2015-06-15 22:28:40 -04:00
Tom Rothamel 5833e8d010 Merge pull request #661 from Zigmut/patch-1
Update updater.rpy
2015-06-15 16:07:24 -04:00
Zigmut ba36763539 Update updater.rpy
Update the french translation
2015-06-15 15:03:09 +02:00
Tom Rothamel 36e09691dc Various minor performance boosts.
At this point, the vast majority of the script load time is in the
unpickler - we're going to have to address that if we want the script
to load any faster.
2015-06-15 00:18:33 -04:00
Tom Rothamel 445f048ba8 Avoid storing next_node in a save. This prevents overly-large saves
when a context is saved.
2015-06-14 19:24:16 -04:00
Tom Rothamel f4bac1768f Merge pull request #654 from caryoscelus/master
add missing parentheses in setuplib.py and remove old README
2015-06-14 10:04:56 -04:00
Tom Rothamel caaf1e6a05 Remove call to pss.quit at exit.
This was causing pulseaudio to lock up in a rare circumstance, and
doesn't really do much positive good, as the audio system will
terminate as the process quits.

Closes #658.
2015-06-14 09:59:30 -04:00
Tom Rothamel f6c8ed43e5 Properly copy transcluded screens. 2015-06-13 21:36:13 -04:00
Tom Rothamel ed7546507d Fix tyop. 2015-06-13 21:35:59 -04:00
Tom Rothamel 97ddbf8e49 Allow CallException to be pickled.
This likely fixes the problem found in this thread:
http://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=32478
2015-06-13 21:26:50 -04:00
Spiky Caterpillar c4a134b432 Changes audio.py to work around an indefinite lockup that occurs if you
try to quit while Pulseaudio is locked.

To replicate the lockup:

startx as two different users.
Do something that locks the sound card as user1 (say, playing a pile of mp3s
through mpg321)
As the other user, start and then quit a Ren'Py game.

Result: strace will show the Ren'Py game sitting there waiting indefinitely
for a futex until such time as mpg321 releases the sound card.
2015-06-12 01:20:26 -07:00
Tom Rothamel 327482f9d1 Use the digest of the script files to invalidate screens.rpyb.
This makes the caching of the screen analysis relatively
safe - if the Ren'Py version or the screens/init code/whatever
changes, the analysis will be performed again.

(The only potential problem is if the creator conditions renpy.const
or renpy.pure on init code - and in that case, they deserve what's
going to happen.)
2015-06-11 23:06:35 -04:00
Tom Rothamel 729ce82bae Replace script_version.rpy(c) with script_version.txt.
This avoids a problem where script_version is created on distribution,
requiring Ren'Py to load it in, thus causing the various caches to
have to be updated and rewritten.
2015-06-11 21:50:35 -04:00
Tom Rothamel 0b450d9ace Improve sl2 performance.
This changes the way we execute SL2 to try and improve performance,
compared to the previous version. The two big changes are:

* Avoid copying screens just to analyze them, although we will
  load a copy of the cached analysis.

* Avoid copying screens that are used or transcluded - instead,
  we make two copies of the screen (one where the transclude is
  const, and one where it's not) and use the appropriate one.
2015-06-10 23:38:28 -04:00
Tom Rothamel 5736ce1a16 Actually sort screens for analysis/prep. 2015-06-10 23:28:29 -04:00
Tom Rothamel 74c840b8c6 Ensure prepare_screens calls analyze_screens when necessart.
That is, whenever at least one new screen comes into existence.
2015-06-09 18:38:29 -04:00
Tom Rothamel 06d371209c Topologically sort screens.
This allow us to prepare screens in a sensible order, such that
a dependency is prepared before the screens it depends on.
2015-06-09 18:26:12 -04:00
Tom Rothamel d2cbfd2a35 Cache analysis of screens.. 2015-06-09 00:32:28 -04:00
Tom Rothamel 57f4fe43be Break screen analysis out into its own phase. 2015-06-08 23:39:49 -04:00
Tom Rothamel ce8f837aee Argument parsing - probably. 2015-06-08 23:36:17 -04:00
Tom Rothamel ab45fc780d Analyze and prepare screen variants.
This change ensures that the variants are compiled all at once when
args.compile is true, which is necessary to ensure that all the code
is placed into the analysis and ast caches.
2015-06-08 22:01:31 -04:00
Tom Rothamel 64be59df5a Make a transcluded copy of each screen for analysis.
This allows screens to be analyzed completely independently
of each other. (This is intended to make caching the analyzed
screen possible.)
2015-06-07 23:28:03 -04:00
caryoscelus ccbe692e69 remove outdated README
build instruction is in main README.rst anyway
2015-06-07 15:53:15 +03:00
caryoscelus 4cd51dffc3 add missing parentheses in setuplib.py 2015-06-07 15:38:12 +03:00
Tom Rothamel 2260874891 Fix lint.
Lint needs to run while the list of statements still exists.
2015-06-07 00:59:13 -04:00
Tom Rothamel a1abfb9c1a Fix argument parsing fix. 2015-06-07 00:40:11 -04:00
Tom Rothamel fd6af5655a Fix argument parsing.
* The command was being placed into a list, causing a crash.
* Returning from main.main would cause a loop - we need to renpy.quit.
2015-06-06 22:23:05 -04:00
Tom Rothamel 9aa08acb92 Bump version to 6.99.5. 2015-06-06 22:22:03 -04:00
Tom Rothamel 0e255aca7f Index archives before scanning through them.
Fixes a problem that prevented Ren'Py from loading scripts from
archives.
2015-06-06 21:39:00 -04:00
Tom Rothamel c3a54e3854 Ensure every screen is analyzed at least once. 2015-06-05 23:16:52 -04:00
Tom Rothamel f24821d53b Argument handling improvements.
- Argument handling now occurs after screens are compiled.
- Commands that require a recompile now set args.compile.
2015-06-05 21:52:05 -04:00
Tom Rothamel 3d768959c6 Store analysis information in DeltaSets.
A DeltaSet stores the difference between its contents and an
underlying set. This makes the DeltaSet much smaller than the
backing set, making it easier to store and faster to pickle
and copy.
2015-06-04 22:28:33 -04:00
Tom Rothamel 03fcefe1a7 Avoid scanning the list of files multiple times. 2015-06-03 23:53:51 -04:00
Tom Rothamel 24037ed374 Avoid looping over all_stmts multiple times. 2015-06-03 23:51:06 -04:00
Tom Rothamel 1fe8615fdf Optimize taking the translation.
This saves another second or two.
2015-06-03 22:32:56 -04:00
Tom Rothamel 9030483ff6 Avoid creating temporaries when running Node.get_children.
This seems to save about a second.
2015-06-03 22:31:50 -04:00
Tom Rothamel 43980d614f On mobile, log startup times to stdout. 2015-06-03 21:56:56 -04:00
Tom Rothamel f3e306d987 Remove debug print. 2015-06-03 00:19:15 -04:00
Tom Rothamel 736d5b5749 Avoid (re)analyzing literals for constness.
A literal is always const, so by using ast.literal_eval to determine
what is literal, we can avoid some analysis.
2015-06-03 00:05:06 -04:00
Tom Rothamel e6f192523d Store pyanalysis ASTs in a file.
This prevents us from having to do expensive parsing at runtime.
2015-06-02 23:51:29 -04:00
Tom Rothamel 52dbf270bf Move bytecode.rpyb into the cache/ directory.
The cache directory is for generated files that speed up Ren'Py but
don't cause incorrect behavior when omitted, so it makes sense to
put bytecode.rpyb there.
2015-06-02 22:40:04 -04:00
Tom Rothamel de2b243690 Cache compilation to AST.
This is intended for performance reasons. In a large game, it
reduces the time it takes to prepare screens from 4s to 1s.
(And the interim results can be stored on disk, perhaps.)
2015-06-01 23:14:57 -04:00
Tom Rothamel 3e52e4d8d2 Add RENPY_RPYC_EXCEPTIONS.
This forces Ren'Py to report exceptions during RPYC load.
2015-06-01 22:04:13 -04:00
Tom Rothamel 243a4fe816 atl2: RawStatement inherits from object rather than Object
Until we need the upgradability Object provides, there's no
reason to pay its price in load time.
2015-06-01 22:02:18 -04:00
Tom Rothamel c687a1f522 Remove __setstate__ from AST nodes in favor of __new__.
This is for performance reasons. __new__ only needs to initialize
default values, while setstate has to initialize every value.
2015-05-31 11:24:24 -04:00
Tom Rothamel 634ec1d217 Then->than
Per miyod @ http://lemmasoft.renai.us/forums/viewtopic.php?f=32&t=32359
2015-05-31 10:03:54 -04:00
Tom Rothamel 9c922dea02 Comment out script performance test code. 2015-05-31 00:55:35 -04:00
Tom Rothamel 80924ee921 script: Store translation-transformed script in .rpyc file.
This (plus other changes) speeds up script loading.
2015-05-30 23:53:36 -04:00
Tom Rothamel c6ab27ab2a script: Introduce the rpyc2 format.
While rpyc1 only supported a single representation of the script,
rpyc2 supports multiple representations. This will make it possible to
store both the original script, and a transformed version of the
script - allowing us to avoid such transformations at runtime.
2015-05-30 21:51:04 -04:00
Tom Rothamel b9f83c1502 Include PyCode hashes in .rpyc files.
The prevents us from having to hash every PyCode after it is
loaded.
2015-05-30 15:51:23 -04:00
Tom Rothamel 68c1fbf0d2 Make the number of quicksave slots configurable.
While we're at it, document various aspects of the save system.

Fixes #648.
2015-05-29 19:32:54 -04:00
Tom Rothamel e2e165ce4b Add the init label statement.
This defines a label in an init parser context, so that
the style/image/define/etc statements inside will only
be run if the label is called.

This is intended to be part of the new theme system, allowing
a theme to be defined using style statements. It's not intended
for creator use.
2015-05-28 21:28:23 -04:00
Tom Rothamel 442cf570f9 Allow renpy.{invoke,call}_in_new_context to run at init time. 2015-05-28 21:28:03 -04:00
Tom Rothamel d81ea29ed8 Set build.exclude_empty_directories to False for Ren'Py itself.
This allows Ren'Py to distribute the empty images/ directories,
which we want to exist so that it can be added to new games.
2015-05-26 17:52:09 -04:00
Tom Rothamel 67d72bd1da Update changelog. 2015-05-24 17:07:15 -04:00
Tom Rothamel d0286a0c33 Fix re-rendering of Flatten.
Fixes #641 completely.
2015-05-24 16:50:45 -04:00
Tom Rothamel 372c302d37 Merge pull request #645 from baekansi/master
Update Korean translations
2015-05-24 02:23:55 -04:00
baekansi c5a9d011cc Update Korean translations 2015-05-24 13:46:54 +09:00
Tom Rothamel bb33778aba Only consider exact matches when using the images directory.
Fixes #644.
2015-05-23 22:54:50 -04:00
Tom Rothamel a41c83fc3a Fix next vs next_unlocked bug in gallery.
The sense of a test was inverted, making next go to the next
unlocked image, and next_unlocked go to the next image period.
2015-05-23 22:32:28 -04:00
Tom Rothamel 3f3b46c109 Account for outlines when allocating Text textures.
Fixes #639.
2015-05-22 22:28:23 -04:00
Tom Rothamel 838cbb2720 Avoid crash if Container.children and Container.offsets are out-of-sync.
Avoids #641.
2015-05-22 21:19:51 -04:00
Tom Rothamel 7f15147bf7 Never copy the Fixed containing a layer.
Fixes #640.
2015-05-22 21:06:51 -04:00
Tom Rothamel e232bab6f8 Eliminate 1-frame delay in passing inherited position.
Previously, positions would be inherited between frames, but
because the order was wrong, a 1-frame delay occured. This
meat that there would be a 1-frame lag between a transition,
and that transition wrapped in a second transition.

Now, the two transitions will run in lockstep.

Fixes #632.
2015-05-21 23:50:12 -04:00
Tom Rothamel ecadc55616 Guard against KeyError in TextureCore.deallocate()
Fixes #637.
2015-05-21 20:22:46 -04:00
Tom Rothamel 68962de022 Set SLUse.constant in the prepare method.
This fixes a screen analysis problem.
2015-05-21 00:13:11 -04:00
Tom Rothamel 41d601a391 Add Render.place()
This exposes Ren'Py's placement algorithm to cdds.
2015-05-20 21:36:16 -04:00
Tom Rothamel 53a4ad89bb Add lint warnings for redefinition of Ren'Py/python builtins.
Fixes #638.
2015-05-19 23:28:47 -04:00
Tom Rothamel 31dc28ee51 Log durations of various phases of the init process. 2015-05-18 21:35:33 -04:00
Tom Rothamel 3be1a2b6c1 On iOS, log log.txt output to stdout. 2015-05-18 21:34:36 -04:00
Tom Rothamel 8ad4a8ed1c Delay set_mode as long as possible on mobile.
This prevents a black screen from showing up for a long time
as the game initializes on slow mobile platforms.
2015-05-17 23:48:48 -04:00
Tom Rothamel 5319072cf6 Allow Drag.snap to take float positions.
Fixes the problem discussed at: http://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=32125
2015-05-16 22:35:55 -04:00
Tom Rothamel c4c82ff525 Fix translation typo.
Per http://lemmasoft.renai.us/forums/viewtopic.php?f=32&t=7858&p=371230#p365396
2015-05-16 19:26:11 -04:00
Tom Rothamel 90be953e7a android: Button for retrieving logcat info from the device. 2015-05-15 23:06:52 -04:00
Tom Rothamel 2409f7ceb8 Merge pull request #636 from tlm-2501/patch-1
Update rooms.rst
2015-05-14 18:30:34 -04:00
tlm-2501 e1c3e55198 Update rooms.rst 2015-05-15 00:43:46 +03:00
Tom Rothamel 2899f79c8a Fix support for unsanctioned translations.
Dialogue from untranslated blocks is now passed through the
translation mechanism.
2015-05-14 10:23:15 -04:00
Tom Rothamel e586410e78 Integrate subpixel, xoffset, and yoffset with Position.
This allows the offsets to work with LiveComposite, which is
a weird use case some people have.
2015-05-13 21:59:06 -04:00
Tom Rothamel 7192bcd164 Reorder init so that init_translations comes after clearing the store.
Otherwise, clearing the store wipes out the side effects of some of
the translation blocks.
2015-05-12 22:08:46 -04:00
Tom Rothamel c08848b7c5 Improve default statement.
The default statement now runs after all rollbacks, not just loads.

It also stores the names of the default variables that have already
been set - this will allow a default to override a builtin present
in a future Ren'Py version.

Lastly, it checks for multiple defaults for a single variable, and
errors out if it finds them.
2015-05-11 23:17:33 -04:00
Tom Rothamel 161533860a Allow report_traceback to decide what to do with most recent call.
There are some exceptions that are very unlikely to be internal
to Ren'Py, and hence it makes sense to report them as part of
the script code that logically triggered the exception.
2015-05-11 23:16:13 -04:00
Tom Rothamel c041eeed26 Run default statement after rollback.
This both covers the load case and the rollback case, and even cases
where we rollback before a load, which wasn't working before.
2015-05-11 00:18:48 -04:00
Tom Rothamel 6ab1b3af74 Update changelog. 2015-05-10 10:30:11 -04:00
Tom Rothamel 82f7673f56 pss: Quadratic.
The previous volume control was simply wrong, as we used the volume
as the exponent, which meant there was a hard floor of .1. Now, we
use volume ** 2 as the multiplier, which sounds right to me and
allows adjustment all the way down to zero.
2015-05-09 23:52:34 -04:00
Tom Rothamel ab952ffefb pss: Increase the volume resolution.
The previous default of 128 levels was insufficient to set the volume
of a channel to low but not off levels.
2015-05-09 23:51:41 -04:00
Tom Rothamel c6c551c7f5 Use Position with LiveComposite.
It's faster and smaller than Position.
2015-05-09 16:38:53 -04:00
Tom Rothamel a947e784a2 sl2: Document use-transclude and creator-defined sl statements. 2015-05-09 16:38:37 -04:00
Tom Rothamel 192f3a702b sl2: Document use-transclude and creator-defined sl statements. 2015-05-08 23:42:18 -04:00
Tom Rothamel b2c8ce8df3 sl2: Fix minor issues w/ custom statements. 2015-05-08 23:33:06 -04:00
Tom Rothamel 416d872a40 Fix formatting. 2015-05-08 18:31:15 -04:00
Tom Rothamel 7be1916b85 Add repeat to the gallery slideshow timer.
Allowing us to advance through multiple images as part of the
slideshow.

Fixes #621.
2015-05-07 22:26:25 -04:00
Tom Rothamel 6e46743d53 text: Expand blits properly, and include outlines.
Fixes #625.
2015-05-06 23:48:28 -04:00
Tom Rothamel 2b0ede0a12 Parameterize Transform children on call.
Fixes #622.
2015-05-06 21:28:15 -04:00
Tom Rothamel c211788e1c Log steam activity.
Hopefully, this will let us use log.txt to diagnose the problem
when steam support fails.
2015-05-05 22:24:37 -04:00
Tom Rothamel 0ebecfc6c0 Add DLC progress function, bump to version 2. 2015-05-05 22:24:22 -04:00
Tom Rothamel 5c7474f2bf Add renpy.write_log.
This function allows code to write into log.txt.
2015-05-05 22:23:35 -04:00
Tom Rothamel 0eafdf6fc3 Initialize persistent._iap_purchases.
This ensures that we do not error out on iOS, where we're not
allowed to automatically restore purchases on start.
2015-05-05 21:15:00 -04:00
Tom Rothamel e29877b5ea Remove shebang from top of main.rpy on iOS. 2015-05-05 11:16:49 -04:00
Tom Rothamel a815bfbceb Include version.txt in the renios build. 2015-05-04 23:22:04 -04:00
Tom Rothamel 03c394ae99 Blindly add dlc.
This lets the same code that adds dlc also update dlc, which can
be useful if the DLC goes out of date.
2015-05-04 18:22:11 -04:00
Tom Rothamel 70d81a2b92 Only restore on Android. 2015-05-03 22:00:32 -04:00
Tom Rothamel 7884b49c9e Check that the version of rapt and renios matches that of Ren'Py.
We've been having problems where rapt goes out of sync with Ren'Py.
This will detect that problem, and will prompt the user to upgrade
again if it happed.

At the very least, this should have the problem occur earlier, rather
than being a hard-to-diagnose Android problem.
2015-05-03 21:46:38 -04:00
Tom Rothamel 3b0f430344 Fix side_image documentation. 2015-05-03 13:15:22 -04:00
Tom Rothamel df792b05c7 sl2: Custom screen language statements. 2015-05-02 23:16:52 -04:00
Tom Rothamel 903dfaaf0c Fix documentation of the Set actions. 2015-05-02 09:55:48 -04:00
Tom Rothamel a127504d38 sl2: Add transclude statement. 2015-05-01 23:31:32 -04:00
kyouryuukunn d8154ea196 Merge pull request #623 from renpy/update_japanese
update japanese
2015-05-01 22:02:11 +09:00
kyouryuukunn d1492e110e update japanese 2015-05-01 21:56:23 +09:00
Tom Rothamel 5d5b159ca6 Ensure screens are prepared once on start.
Screen preparation is expensive, and needs to be done every time
styles are rebuilt. Previously, we had been rebuilding multiple
times in the start process. Now, on a normal start, we only
prepare once.

This required quite a bit of reorganization of init code, but
it should be worth it.
2015-05-01 00:22:03 -04:00
Tom Rothamel f771ff18be sl2: Copy screens when the use statement has a block.
Another step towards transcludes.
2015-04-30 23:40:18 -04:00
Tom Rothamel 6a2f062ed8 sl2: Parse use statements with blocks.
The first step towards transcluding the blocks.
2015-04-29 23:52:26 -04:00
Tom Rothamel 991d8a7683 Document the default statement. 2015-04-29 23:52:26 -04:00
Tom Rothamel 52068c32c9 Merge pull request #620 from Nolanlemahn/patch-3
Update demo_imageops.rpy
2015-04-29 21:40:52 -04:00
Nolanlemahn 2ceb298434 Update demo_imageops.rpy
A previous change moved "eileen_happy" to "eileen happy". (This commit resolves an IOError in the tutorial: "Image Operations".)
2015-04-28 21:43:55 -07:00
Tom Rothamel 59709e1bac Add the default statement.
This statement sets a variable after game start, iff it hasn't been
set already.

Implements #577, but we still need docs.
2015-04-27 23:26:44 -04:00
Tom Rothamel 161eaa27c2 Fix snapping of drags that aren't in a draggroup. 2015-04-27 21:37:38 -04:00
Tom Rothamel 55e8088c3c Bump version.
6.99.3 won't have any Ren'Py changes, but it fixes the accidental
packaging of a version of zipfile.pyo containing debug code.
2015-04-26 11:26:31 -04:00
Tom Rothamel 0e667b3188 Allow AlphaMask to mask focus_at_point.
Which makes focus work properly.
2015-04-25 00:10:09 -04:00
Tom Rothamel 24339e7a64 Fix is_pixel_opaque and IMAGEDISSOLVE/AlphaMask.
This fixes a problem when using AlphaMask with DragDrop or
as a button background.
2015-04-24 23:47:28 -04:00
Tom Rothamel 8d1142e0dc Use the built-in python with distribute.
This helps ensure that the OS will never recompile pyo files.
2015-04-23 21:59:48 -04:00
Tom Rothamel 43b4309aec Update changelog. 2015-04-22 20:10:31 -04:00
Tom Rothamel 52ba2f1b8b Changes to the behavior of #616.
The directory only opens on the build commands, not commands that
also update the device.

The list of files to copy is taken from RAPT.
2015-04-22 00:28:42 -04:00
Tom Rothamel 81284dcee5 Remove unnecessary argument. 2015-04-21 23:14:23 -04:00
Tom Rothamel 0004954f4d Merge pull request #616 from d3nzil/master
Copy Android distributions to distributions directory.
2015-04-21 22:16:00 -04:00
Lukáš 'denzil' Frolka 10616d9fed Copy Android build to distributions directory. 2015-04-21 10:59:36 +02:00
Tom Rothamel 2bf3049c23 Implement renpy.watch in terms of console.watch.
Fixes #615.
2015-04-20 21:52:23 -04:00
Tom Rothamel c30afc791b Support the activate_sound style property on Keymaps.
This also includes the sl2 key statement.
2015-04-19 21:42:37 -07:00
Tom Rothamel edda89750e Add an android icon for The Question. 2015-04-18 21:46:27 -04:00
Tom Rothamel b70a004f09 Update generated documentation. 2015-04-18 21:34:57 -04:00
Tom Rothamel e1ad973475 Update changelog. 2015-04-18 21:33:29 -04:00
Tom Rothamel bd082ea55e If a save's json is missing, assume extra_info/save_name is empty.
This fixes the bug here:

http://lemmasoft.renai.us/forums/viewtopic.php?p=367554#p367554
2015-04-17 22:20:00 -04:00
Tom Rothamel 7639325203 Fix typo.
Fixes #613.
2015-04-16 00:38:52 -04:00
Tom Rothamel 6ce7f2c62d Merge pull request #614 from Nolanlemahn/patch-2
Add renpy.reset_physical_size()
2015-04-15 20:35:13 -04:00
Nolanlemahn 64bc5f02db Add reset_physical_size
While this is trivial code, it just makes sense to me that Ren'Py has this (at least, as opposed to not having it).
2015-04-15 11:44:17 -07:00
Tom Rothamel e2b27696a9 Update current_screen when changing focus.
Previously, current_screen was not updated during focus operations.
This meant that in hovered and unhovered, actions like
SetScreenVariable could be applied to the wrong screen (basically,
whatever screen happened to be lying around after the event
processing or update cycle).

After this change, we track the current screen as we change focus,
and update current_screen appropriately.

Fixes #610.
2015-04-14 07:31:50 -04:00
Tom Rothamel 7e463c3356 Maintain a stack of current screens.
Using two functions centralizes the maintenance of the current
screen variable.
2015-04-14 07:30:53 -04:00
Tom Rothamel 9ee8e5573e list_files should not return saves.
There's no way returning a save is a good thing. There are functions
for that, and it could cause problems with code that looks at files
that may or may not be there.
2015-04-13 23:47:00 -04:00
Tom Rothamel 77c2178462 Do not use steam stats with the progress system.
Steam stats (get_int_stat and set_int_stat) have been unreliable on
windows. I'm not sure what the problem is, but this doesn't use
them.

I'll revisit this if it proves to be a steam problem.
2015-04-13 01:58:27 -04:00
Tom Rothamel 84156d2a3d Check for a version in the steam module. 2015-04-12 22:52:56 -04:00
Tom Rothamel 63f1f6c0bc Rewrite progress achievements.
In steam, to display progress, we have to update a progress stat
associated with an achievement. This new code does that as part
of the achievement system.
2015-04-12 00:20:31 -04:00
Tom Rothamel 4857cb789c Fix set_int_stat. 2015-04-12 00:20:22 -04:00
Tom Rothamel 40805225bd If the config.log logfile throws, give up. 2015-04-11 20:47:52 -04:00
Tom Rothamel 3773624ab0 Merge pull request #609 from evilantishad0w/master
add function to provide separate deterministic PRNG
2015-04-10 23:32:40 -04:00
evilantishad0w b2a02aa982 documentation for renpy.random.Random 2015-04-10 21:07:00 -06:00
evilantishad0w 010b3a3d2f function renamed
as per Tom
2015-04-10 21:04:00 -06:00
Tom Rothamel 9cb9d7c210 Allow renpy.random.x to be called from the init phase. 2015-04-10 23:00:51 -04:00
evilantishad0w 46afd62be7 add renpy.random.Pool generator 2015-04-10 20:33:38 -06:00
Tom Rothamel eac9ee5b02 Document ui.interact.
And self-flagellate for not realizing it was undocumented until now.
2015-04-10 22:03:10 -04:00
Tom Rothamel f316315456 Add the ui.screen_id function. 2015-04-10 21:11:40 -04:00
Tom Rothamel efb62b030a Merge pull request #608 from Nolanlemahn/master
Update 00start.rpy comments
2015-04-10 20:52:29 -04:00
Nolanlemahn 6ea65debb6 Update 00start.rpy comments
renpy.game.call_memory is deprecated/no longer in source.
2015-04-10 17:22:06 -07:00
Tom Rothamel 5823474904 Add the AlphaMask displayable.
This uses the alpha channel from a mask displayable to mask a child
displayable. While this could be done with AlphaDissolve, this is
a little more efficient. (And could plausibly be made much more
efficient.)
2015-04-09 22:14:31 -04:00
Tom Rothamel e4bd06f4e0 Android/iOS: Emulate on-screen keyboard. 2015-04-08 23:44:52 -04:00
Tom Rothamel 9c569a8716 Support a keyboard on the android/iOS emulator. 2015-04-08 23:27:47 -04:00
Tom Rothamel 3a35aca5ef Allow enter to continue. 2015-04-08 22:21:08 -04:00
Tom Rothamel a25c578b5f Ignore prediction exceptins during lint. 2015-04-08 19:45:52 -04:00
Tom Rothamel 6e01fbc52e Remove translation TODOs, add BOMs. 2015-04-08 10:25:43 -04:00
Tom Rothamel 571cd76f21 Update simplified chinese translation. 2015-04-08 10:24:35 -04:00
Tom Rothamel afa272bac3 Updates Simplified Chinese translation.
To version by zedraxlo at http://lemmasoft.renai.us/forums/viewtopic.php?f=32&t=31443.
2015-04-07 23:06:23 -04:00
Tom Rothamel 59e021d1d8 Update Roboto to v2.
Thanks to zedraxlo on lsf, http://lemmasoft.renai.us/forums/viewtopic.php?f=32&t=31443
2015-04-07 22:46:09 -04:00
Tom Rothamel a0af700b43 Merge pull request #597 from Beuc/patch-2
Skip all the ANGLE installation on mobile targets
2015-04-07 22:28:54 -04:00
Tom Rothamel c3d035a5ae Merge pull request #590 from caryoscelus/recompile-fix
Remove old .rpyc files on "Force Recompile"
2015-04-07 22:28:07 -04:00
Tom Rothamel 791e35d8fb Doc FileAction. 2015-04-07 22:27:07 -04:00
Tom Rothamel 2ab145ac19 Merge pull request #605 from caryoscelus/fileaction
Pass arguments from FileAction to FileSave/Load
2015-04-07 22:25:06 -04:00
Tom Rothamel 51ba6d932b Merge pull request #606 from RangHo/master
Add Korean translation for ios screen
2015-04-07 22:23:39 -04:00
Tom Rothamel 9fd33a16ac Placeholders mix properly with non-placeholders.
Previously, we'd consider the first undefined image to be shown to be
a placeholder background - even if a non-placeholder background was
already showing.

Fixes #602.
2015-04-07 22:21:24 -04:00
R.H. Lee 41bd5fa920 Add Korean translation for ios screen 2015-04-07 19:04:10 -07:00
Tom Rothamel df9e305639 Fix name_only.
Scoping changed with the introduction of stores, but say, predict_say,
and name_only didn't keep up. Moving them into common fixes things.

Fixes #604.
2015-04-06 22:03:59 -04:00
Tom Rothamel 6a54f8576c Add the RestartStatement action.
Fixes #603.
2015-04-06 18:28:59 -04:00
caryoscelus 9658283e58 Pass arguments from FileAction to FileSave/Load
FileSave/Load have some useful arguments, this
allows to use them throw generic FileAction
2015-04-06 18:18:30 +03:00
Tom Rothamel 689d33760f Fix Motion, Pan, and Move to work with Transform.
Transform may call get_position() before render(), so we have to,
when possible, compute the position in advance.
2015-04-06 00:01:45 -04:00
Tom Rothamel 9011554540 Merge pull request #601 from javimat/master
Update Italian template (by Corvo)
2015-04-05 12:19:14 -04:00
Tom Rothamel 6ec7ccbe6b Document renpy.get_at_list. 2015-04-05 10:59:24 -04:00
Tom Rothamel 94ba4e62e1 Preserve zorder when showing an image w/o explicit zorder.
Fixes #600.
2015-04-04 21:05:54 -04:00
javimat 9a3bc75241 Update Italian template
Update Italian template thanks to LSF user Corvo.
2015-04-04 19:43:42 +02:00
Tom Rothamel 3a27dfec9d Document image directory. 2015-04-02 21:46:07 -04:00
Tom Rothamel 00ee5d8eb3 Add main.py.
This is an alias to renpy.py that's used when renpy.py is hidden
by eclipse, which is necessary to ensure eclipse favors the renpy/
directory.
2015-04-02 21:19:39 -04:00
Tom Rothamel ce4086d58e Add empty images directories to the various templates. 2015-04-02 21:18:19 -04:00
Tom Rothamel 815a297ae2 Add images directory button. 2015-04-02 21:09:24 -04:00
Tom Rothamel 712306ffc3 Fix typo, per:
http://lemmasoft.renai.us/forums/viewtopic.php?p=365396#p365396
2015-04-02 10:48:37 -04:00
Tom Rothamel 33b802e749 The tutorial game should use the images directory. 2015-04-01 22:13:45 -04:00
Tom Rothamel b26ea78a4b Automatically define images in config.images_directory. 2015-04-01 22:13:05 -04:00
Tom Rothamel e9343befc0 API-rename renpy.image_exists to renpy.has_image. 2015-04-01 22:12:23 -04:00
Tom Rothamel d59dd71602 If zsync fails, try again with no input data.
This triggers a total download of the update. That's a pain and
consumes bandwidth, but it's what the user would have to do anyway
if the update fails.
2015-03-31 21:38:05 -04:00
Tom Rothamel b99e9d3afa Better support of oddly-named distros. 2015-03-31 10:05:30 -04:00
Tom Rothamel d5ee62fa13 Allow any version with a - in it. 2015-03-30 22:07:16 -04:00
Tom Rothamel b8e1d39e49 Bump version to 6.99.2. 2015-03-30 20:06:04 -04:00
Tom Rothamel 868d0afb60 renpy.get_shown_tags -> renpy.get_showing_tags
Present tense is better, since it only shows tags that are currently
showing.
2015-03-29 21:10:04 -04:00
Tom Rothamel b52a3ab75c Fix permissions. 2015-03-29 21:08:35 -04:00
Tom Rothamel 7d5ca94f4a Add renpy.get_shown_tags. 2015-03-29 21:07:59 -04:00
Tom Rothamel 7cce474ca8 Merge branch 'master' of github.com:renpy/renpy 2015-03-29 20:46:01 -04:00
Tom Rothamel 4a8c87f019 Merge pull request #596 from javimat/javimat-patch-1
update Spanish template and fix typo
2015-03-29 20:45:57 -04:00
Beuc 0cd3553099 Skip all the ANGLE installation on mobile targets 2015-03-30 00:21:03 +02:00
javimat f929d3fa3d Fix small typo 2015-03-29 22:32:57 +02:00
javimat 7f21671fc3 Update Spanish Template 2015-03-29 22:31:33 +02:00
Tom Rothamel 354862ba65 Add new functions to changelog. 2015-03-29 13:09:12 -04:00
Tom Rothamel 9e51fc584c Add MultiPersistent on Android, document as unsuppored on iOS.
Fixes #592.
2015-03-29 13:02:58 -04:00
Tom Rothamel 54f9cd752a MultiBox parameterization doesn't make sense for subclasses. 2015-03-29 12:34:06 -04:00
Tom Rothamel 3614d6659f Fix --no-tag. 2015-03-29 10:29:33 -04:00
Tom Rothamel 2bc3929540 Add renpy.load_surface, document renpy.load_texture.
Functions to turn image manipulators into Surfaces and Textures.
2015-03-28 22:35:37 -04:00
Tom Rothamel c050a2dbd7 Include style_common.pxi with source.
Fixes #594, when 6.99.1 is released.
2015-03-28 22:08:34 -04:00
kyouryuukunn 00c55c31a7 Merge pull request #595 from kyouryuukunn/update_japanese
update translation for japanese
2015-03-29 10:27:23 +09:00
kyouryuukunn f1cd67446b update translation for japanese 2015-03-29 10:23:52 +09:00
Daniel Luque 22f95f7d83 Merge pull request #593 from LuqueDaniel/update-es
Update spanish translation
2015-03-28 14:58:40 +01:00
Daniel Luque 8b6026cf7f Add new files to spanish translations 2015-03-28 14:33:29 +01:00
Daniel Luque d18232093d Update spanish translation 2015-03-28 14:31:13 +01:00
Tom Rothamel ce1bcb3535 Merge pull request #591 from Beuc/patch-1
Fix typo (missing end quote)
2015-03-27 17:57:28 -04:00
Tom Rothamel fc8fd41e90 Document ParameterizedText.
Also, various other doc fixes.
2015-03-27 17:50:56 -04:00
Beuc 3f23fa3606 Fix typo (missing end quote) 2015-03-27 22:44:00 +01:00
Tom Rothamel 023a8b9b47 Include .pyc and pyo files with rapt and renios.
This ensures that during an upgrade, the user winds up with compiled
files that match the new source files.
2015-03-26 21:44:39 -04:00
Tom Rothamel 04ed3ff098 Do not use accelerometers as joysticks. 2015-03-26 21:23:40 -04:00
Tom Rothamel 36a3ecbbd3 Bump version to 6.99.1. 2015-03-26 21:23:27 -04:00
Tom Rothamel 66fc3c47ae Push tags to server. 2015-03-26 12:09:27 -04:00
Tom Rothamel 6a730bbffc Fix name of pygame_sdl2 download. 2015-03-26 12:09:15 -04:00
Tom Rothamel 0b91488206 Update changelog. 2015-03-25 21:08:04 -04:00
Tom Rothamel ea8c3a69fb Distribute pygame_sdl2 with Ren'Py. 2015-03-25 20:58:41 -04:00
Tom Rothamel 324d637607 Use eval_who in lint, to access non-English character names.
See: http://lemmasoft.renai.us/forums/viewtopic.php?p=364118#p364118
2015-03-24 22:08:25 -04:00
Tom Rothamel daf7619e52 Return contains to compatibility with 6.99.
Since no detail of the API is too obscure to allow for changes.
2015-03-24 21:01:15 -04:00
caryoscelus 1914c1b6fe Rename old .rpyc to .rpyc.bak instead of removing 2015-03-24 05:58:22 +03:00
caryoscelus 4f9eabeb28 Only remove .rpyc when there's no .rpy 2015-03-24 05:53:31 +03:00
Tom Rothamel 80158aa151 Merge pull request #581 from renoa/patch-8
Update preferences.rpy
2015-03-23 22:36:01 -04:00
Tom Rothamel 907fc3f29e Merge pull request #582 from renoa/patch-9
Update front_page.rpy
2015-03-23 22:35:51 -04:00
Tom Rothamel b65089fbed Merge pull request #583 from renoa/patch-10
Update distribute_gui.rpy
2015-03-23 22:35:40 -04:00
Tom Rothamel c334aeece2 Merge pull request #584 from renoa/patch-11
Update common.rpy
2015-03-23 22:35:24 -04:00
Tom Rothamel b7be16b987 Merge pull request #585 from renoa/patch-12
Create choose_directory.rpy
2015-03-23 22:35:11 -04:00
Tom Rothamel c2f07ca7ca Merge pull request #586 from renoa/patch-13
Update android.rpy
2015-03-23 22:34:59 -04:00
Tom Rothamel 9b1c9ff25d Merge pull request #588 from renoa/patch-15
Update screens.rpy
2015-03-23 22:34:47 -04:00
Tom Rothamel f89191bbf9 Merge pull request #587 from renoa/patch-14
Create ios.rpy
2015-03-23 22:34:36 -04:00
caryoscelus 98120814da Remove old .rpyc files on "Force Recompile"
Otherwise, may fail in case there some orphaned (without .rpy) .rpyc
with same labels as in other scripts (usually happens on script rename).
2015-03-24 02:41:40 +03:00
Tom Rothamel 6af546147a Stop looping sounds on rollback and load.
The same logic that worked on sound channels now works on music
channels.

Fixes #578.
2015-03-22 23:06:07 -04:00
Tom Rothamel ff177be12c Fix interactions between uses_scope, copy_on_change, and nested constants.
Before this change, we only stored uses_scope on the outermost
constant displayable (in a constant subtree). But this meant that
in the copy_on_change case, only the outermost displayable in the
tree would be copied.

This fixes that, by recursively killing the constant stuff until
all the copy_on_change displayables that uses the changes scope
have been copied.
2015-03-22 21:52:27 -04:00
Renoa 3e6ddc46b6 Update screens.rpy
it creates errors if i don't comment out the font, i don't know why ><
2015-03-22 22:03:31 +03:00
Renoa 1094f693f0 Update distribute_gui.rpy
accidentally used " instead of '
2015-03-22 21:49:57 +03:00
Renoa f0efeede9a Create ios.rpy
create file
2015-03-22 21:43:21 +03:00
Renoa ecbe84ad39 Update android.rpy 2015-03-22 21:22:45 +03:00
Renoa 302fa846ca Create choose_directory.rpy
create new translation file not found in previous version of ren'py
2015-03-22 21:19:40 +03:00
Renoa 511d48f067 Update common.rpy 2015-03-22 21:17:10 +03:00
Renoa 5b0a6ede56 Update distribute_gui.rpy 2015-03-22 21:09:22 +03:00
Renoa cec6ebd9df Update front_page.rpy 2015-03-22 21:04:33 +03:00
Renoa cd3b7c1239 Update preferences.rpy 2015-03-22 21:00:59 +03:00
Tom Rothamel 86f759c80f Pass original name when showing screens.
Screens can be hidden by name or tag, so we have to pass both.

See: Sunrider Academy, after going to the courtyard.
2015-03-21 23:23:36 -04:00
Tom Rothamel 7ce97dbaeb Preserve st when re-showing a screen.
The renpy.show_screen function treats re-showing a screen as an
update, not a show. To preserve this fiction, we keep st on the
re-shown screen.

See: http://lemmasoft.renai.us/forums/viewtopic.php?p=363556#p363556
2015-03-21 13:33:38 -04:00
Tom Rothamel 0b317c4c24 sl2: Propagate fails up through displayables. 2015-03-21 12:23:34 -04:00
Tom Rothamel 4c6fd3c8fa Allow ffdecode to call the size method of rwops.
This seems to be used by the ogg code to get an accurate size
for the ogg file. Now that the size code exists and is fast, we can
call it.
2015-03-21 11:32:38 -04:00
Tom Rothamel f5cc5e5829 Modify run.sh to build pygame_sdl2 if it exists. 2015-03-21 11:30:54 -04:00
Tom Rothamel f284d82f9d Check for reasonable audio duration, reject if not.
This fixes a crash in sunrider academy due to a file with a duration
long enough to cause the computed duration to go negative.
2015-03-21 11:01:57 -04:00
Tom Rothamel 8c1f6c7701 Update build documentation.
Fixes #564.
2015-03-20 22:55:11 -04:00
Tom Rothamel 82d40f75f5 Add the python2.7 directory to the include path. 2015-03-20 22:54:30 -04:00
Tom Rothamel a755b04ab1 Search the virtualenv for pygame_sdl2 headers. 2015-03-20 22:26:14 -04:00
Tom Rothamel 8c5fcc9a95 Add Finnish translation.
The translation was contributed by Diapolo10, as #576, but was
merged manually.

Close #576.
2015-03-19 21:58:20 -04:00
Tom Rothamel 6625a46dcb Add BOM, remove TODO on first line of file. 2015-03-19 21:56:34 -04:00
Tom Rothamel c7b7e26c33 Fix incorrect example in docs. 2015-03-19 09:35:24 -04:00
Tom Rothamel 45c61c4972 config.default_keymap should be a dict. 2015-03-18 20:29:42 -04:00
Tom Rothamel b944591ec7 If a keybinding is unknown, use a default keymap.
This deals with cases where a creator has assigned to config.keymap,
but Ren'Py has introduced a new mandatory keybinding.
2015-03-18 19:19:57 -04:00
Tom Rothamel 3c3c8c7933 Preserve StoreModule identity through reloads.
This means that if we do "import store" in a pure-python module,
store will refer to the same (now-correct) object before and
after the reload.
2015-03-18 19:05:41 -04:00
Tom Rothamel e0207369c3 SLDisplayables can't become constant if a child fails.
We don't want to mark a tree of displayables constant if a displayable
in that tree throws an error during prediction, since the tree will
be incomplete. (This is possible if the displayables in the tree
access missing non-parameter data, like a Text that interpolates a
missing variable.)

We propagate such fails up the tree of contexts, and do not allow
a SLDisplayable to become constant if a failure has occured.
2015-03-17 23:25:28 -04:00
Tom Rothamel 40de615c66 Document alternate property on imagebutton, textbutton, and hotspot.
Added the property to hotspot, as it it was already supported by the
various buttons.

Fixes #575.
2015-03-17 22:21:04 -04:00
Tom Rothamel 53c50b1e00 SnowBlossom fast should only occur if st == 0.
It's possible for the number of particles to drop to 0 if all
particles fall off the screen, but we don't want to do the fast
behavior in that case - only during the initial show, when st is 0.

Fixes #572.
2015-03-17 22:12:34 -04:00
Tom Rothamel 95f39c725f Allow key modifier prefixes to occur in any order. 2015-03-15 22:15:36 -04:00
Tom Rothamel 0e251e1bf4 Make repeat_ an explicit keysym prefix on repeated keys.
This means that for event handling to respond to a repeated key,
Ren'Py has to expect it - preventing things like a toggling tab
key from slowing down skipping.
2015-03-15 21:44:42 -04:00
Tom Rothamel cd136bc6a0 Report error on bad rwops. 2015-03-15 21:44:35 -04:00
Tom Rothamel b66ede5e19 Merge pull request #563 from LuqueDaniel/small-change
Replace "Show edit buttons" string.
2015-03-14 18:27:02 -04:00
Tom Rothamel ba7d4e6582 Support opening all files as subfiles for testing purposes. 2015-03-11 23:28:57 -04:00
Tom Rothamel bda9f96f28 Image location picker: Copy rectangle/position to clipboard.
Fixes #568.
2015-03-10 11:12:19 -04:00
Tom Rothamel 2f77e1fd4a Avoid running Steam callbacks.
For some reason, SteamAPI_RunCallbacks() crashes after a callback has
been run, on Windows only. This happens both with our callbacks, and
with those registered using CCallback.

Since callbacks don't add much in normal use cases, and hours of
work didn't lead to a fix, I've disabled the callback support.
2015-03-09 21:21:40 -07:00
Tom Rothamel 3d4ef2df96 Increase skip speed. 2015-03-08 12:46:48 -04:00
Tom Rothamel 2b20ef7834 Work on call stack corruption.
- Pop return blindly pops things - which prevents problems if the return
  label doesn't exist.
- When config.developer is true, we monitor for and try to fix call stack
  corruption.
- When config.developer is false, we try to survive call stack corruption,
  although this may lead to other errors.
2015-03-08 12:14:03 -04:00
Tom Rothamel e4fe7f3586 Limit the size of the textures we render to.
When using the FBO, we'd use the largest textures available,
even when the data was only large enough to fill a small portion
of those textures.
2015-03-07 16:17:09 -05:00
Tom Rothamel 7cfc6ad1ba Wrap dictionary and set comprehensions to support rollback.
Thanks to rivvil for noticing the problem and contributing the
fix.
2015-03-07 10:24:49 -05:00
Tom Rothamel 57c27cfde4 Do not block lint. 2015-03-07 10:24:41 -05:00
Tom Rothamel 3ceec0b62d Properly analyze nested imagemaps.
If an imagemap statement is non-constant, neither are its hotspot
children. We need to re-evaluate the hotspot children whenever
the non-constant imagemap changes.

Fixes #567.
2015-03-06 23:56:48 -05:00
Tom Rothamel fe1d1e5499 Respect xysize/xminimum/yminimum on Solid and Frame. 2015-03-06 22:59:39 -05:00
Tom Rothamel ca944b5089 Ignore ignored TIMEEVENTS.
Ignoring a TIMEEVENT is probably a mistake, but doing so previously
caused a TIMEEVENT to be posted, which would stop redraws from
happening entirely.
2015-03-05 23:15:08 -05:00
Tom Rothamel 92163cd704 Drag should only ignore relevant events.
Notably, it shouldn't ignore TIMEEVENT.
2015-03-05 23:12:19 -05:00
Tom Rothamel edfd705a52 alt+shift+I inspects all layers. 2015-03-05 21:55:01 -05:00
Tom Rothamel 4a1557edf3 Include rectangle in imagemap hash.
Fixes #566, and probably many of our ongoing problems.
2015-03-04 21:06:06 -05:00
Tom Rothamel 4c55cab9fc Detect and report potential infinite loop.
We define an IL as 10 seconds of no interactions. (60s during the
init phase.)

Fixes #565.
2015-03-04 17:12:33 -05:00
Tom Rothamel 8a9eb86bac Use file data, rather than modification time, in imagemap cache.
This should fix a longstanding problem where changes to files
might not be reflected in the imagemap cache.
2015-03-03 22:20:48 -05:00
Tom Rothamel 077c7818ec Use the copy RTT on PC platforms.
Until we switch to one FBO-per-size, the FBO RTT doesn't improve
performance much, and it causes problems with older Nvidia drivers
on windows.
2015-03-03 21:02:11 -05:00
Tom Rothamel 136db345c9 Add support for manually failing GL or ANGLE.
For testing purposes.
2015-03-02 21:54:14 -05:00
Tom Rothamel 31b711b672 Re-enable HW video.
Accidentally shipped with it defaulting to off.
2015-03-01 22:13:32 -05:00
Tom Rothamel 7aeed18720 Tell RAPT we're Ren'Py. 2015-03-01 17:31:05 -05:00
Tom Rothamel 7da86f27e9 Fix missing argument. 2015-02-28 12:46:45 -05:00
Tom Rothamel e851096b77 Only skip during a TIMEEVENT.
This prevents a sufficiently fast skip time from consuming the KEYDOWN
events that might be used to end skipping.
2015-02-27 22:30:35 -05:00
Tom Rothamel 91cdebd401 Take execution state even if the ATL has finished. 2015-02-27 21:27:37 -05:00
Daniel Luque 0fbdd3b68f Replace "Show edit buttons" string.
Change "Show edit buttons" string to "Show edit file section".
2015-02-27 15:47:28 +01:00
Tom Rothamel 939034a481 RawChild takes ATL, not a displayable.x 2015-02-27 09:29:24 -05:00
Tom Rothamel 4ae3092877 Fix an issue with constant transforms. 2015-02-26 23:59:08 -05:00
Tom Rothamel db23bd0f91 Make ALL_EVENTS a dense set.
This saves the memory required to store the list version of ALL_EVENTS,
and the time required to search through it.
2015-02-26 23:30:07 -05:00
Tom Rothamel 5e0de94e9a Implement LiveCrop and LiveComposite in terms of Transforms.
Transforms are the preferred path for many things.
2015-02-26 23:23:12 -05:00
Tom Rothamel cdfbfcd481 Recompile non-constant ATL at execution.
This fixes a problem reported where ATL was being compiled at screen
prediction time - which might be before variables used by the ATL block
have finished updating.

The fix was to compile non-constant ATL twice - first, during ATL
prediction, and then again once the ATL is ready to execute for
real.

PM: http://lemmasoft.renai.us/forums/ucp.php?i=pm&mode=view&f=0&p=163661
2015-02-26 23:17:49 -05:00
Tom Rothamel 5d49b6b75b Better reprs for Image, ImageReference, and ATLTransform.
This helps tell them apart while debugging.
2015-02-26 23:17:03 -05:00
Tom Rothamel f9a7b7dc21 Remove texture from texture cache when it leaves the image cache. 2015-02-25 09:32:30 -05:00
Tom Rothamel 61b7550157 Memory profiling improvements.
* Do not double count surfaces.
* Display a banner while performing profiling operations.
2015-02-25 09:32:30 -05:00
kyouryuukunn fc7fcc8db9 Merge pull request #562 from kyouryuukunn/update_japanese
update japanese
2015-02-25 16:15:38 +09:00
kyouryuukunn 2cdb8adb64 update japanese 2015-02-25 16:13:38 +09:00
Tom Rothamel a22b406f46 Check timestamps for correctness. 2015-02-24 19:30:19 -05:00
Tom Rothamel cff0b43f96 Add renpy.copy_save.
A function that copies saves around.
2015-02-23 21:57:12 -05:00
Tom Rothamel 0a2bee8a78 Add a memory profiling key. 2015-02-23 21:57:12 -05:00
Tom Rothamel 0e53af427f Merge pull request #560 from javimat/master
Update Spanish Translations
2015-02-23 18:14:14 -05:00
Tom Rothamel 3120b5e438 Use FBOs on any platform where an FBO is available.
Hopefully, this will prevent the "flopping" problem people have been
seeing on Android.
2015-02-22 11:24:15 -05:00
Tom Rothamel 01689fc02a Input should only ignore keys that generate text input.
This means that when escape is pressed while editing, we'll be taken
to the game menu. (Ditto for pageup and rollback, etc.)
2015-02-22 11:09:12 -05:00
Tom Rothamel afc9a2d97c If the user closes the onscreen keyboard, reopen it. 2015-02-21 22:28:09 -05:00
Tom Rothamel df5d891ee7 Add config.missing_label_callback.
This is a function that can replace missing labels with other labels.

Fixes #561.
2015-02-21 21:57:44 -05:00
Tom Rothamel d7ba76f44f atl: Parameterize (reset) children when showing them.
Fixes #557.
2015-02-20 22:38:34 -05:00
Tom Rothamel 10cda2103f Copy Fixeds when they're parameterized.
Parameterization (a terrible name) is used to reset transforms. In
cases where a single transform should be reset, a Fixed full of
tranforms should be replaced with a Fixed full of reset transforms.

(This is especially true for Fixeds created as part of a multiple
contains block in an ATL transform.)
2015-02-20 22:35:51 -05:00
Tom Rothamel 616cdbd218 atl: Contains block should only create a fixed if 2 or more.
This mirrors the behavior of the rest of Ren'Py, and makes the
contains block statement mirror the contains expression statement.
2015-02-20 22:06:06 -05:00
Tom Rothamel 2199a4db1c Focus_mask should be true by default for drags.
This restores compatibility with the behavior of 6.18.3.
2015-02-19 23:15:02 -05:00
Tom Rothamel c4b673099f Allow drags to go partially offscreen. 2015-02-19 22:53:11 -05:00
Tom Rothamel c61b01ee0c Simplify/fix PNG writing. 2015-02-18 23:31:23 -05:00
Tom Rothamel 24f26acea4 Work around a problem with the NSUrl.path property on iOS.
On 7.0, it's a method. On 8.0, it's a property. I don't get why,
 but this defensively codes around it.
2015-02-17 19:42:45 -05:00
Tom Rothamel f4e5e0f297 Allow use of the integrated GPU on macs.
Controlled by build.allow_integrated_gpu variable.
2015-02-17 19:14:20 -05:00
javimat a78d9bbccf Update common.rpy 2015-02-17 11:59:46 +01:00
javimat 89ec94a72b Update common.rpy in Spanish tl of Launcher 2015-02-17 11:56:38 +01:00
javimat cf495ac494 Update Spanish Template 2015-02-17 11:51:13 +01:00
Tom Rothamel 0eb54ef113 Fix missing word in LGPL name. 2015-02-16 22:42:54 -05:00
Tom Rothamel 3043543901 Fix tagging. 2015-02-16 21:16:36 -05:00
Tom Rothamel 6f56cbb12e Adjust tagging. 2015-02-16 21:14:19 -05:00
Tom Rothamel a7542015ab Remove translaton TODOs. 2015-02-16 21:07:07 -05:00
Tom Rothamel 3e20a92c80 More reliable read of sums. 2015-02-15 23:23:59 -05:00
Tom Rothamel 93812b4a1b Deal with potentially corrupt sums file.
For some reason, on my mac, the sums file is getting corrupted.
2015-02-15 22:47:59 -05:00
Tom Rothamel 4f3a0c546f Remove debug print. 2015-02-15 21:19:08 -05:00
Tom Rothamel 097978b044 This code is obsolete with pygame_sdl2. 2015-02-15 20:57:35 -05:00
Tom Rothamel da041e5170 Properly classify renios. 2015-02-15 20:57:18 -05:00
Tom Rothamel 9b626fe039 On windows, use the Ren'Py executable to relaunch if it exists. 2015-02-15 16:35:36 -05:00
Tom Rothamel c51db4ce64 Fix tagging, tag all projects. 2015-02-15 16:32:50 -05:00
Tom Rothamel 01b66c6197 Remove quit and maximize keybindings.
These are redundant on SDL2, which will synthesize more appropriate
system events from the platform-specific keypresses. This redundancy
can cause problems - when we first synthesize a quit event from
alt-F4, and then get the real QUIT, we behave incorrectly.

Fixes #554.
2015-02-14 22:55:02 -05:00
Tom Rothamel 2a31925ef7 Change the icon of lib/windows-i686/<game>.exe
This is the icon that's used when the game is pinned to the
windows taskbar.
2015-02-14 20:25:41 -05:00
Tom Rothamel 9480b544fb Predict main_menu while in the splashscreen.
Fixes #503.
2015-02-13 22:35:14 -05:00
Tom Rothamel 8c989bb684 Prevent renpy.stop_predict_screen from throwing exceptions.
We now ignore the case where we stop predicting a screen that
wasn't being predicted. Previously, we threw an exception.
2015-02-13 22:33:28 -05:00
Tom Rothamel d9dd895775 Remove leftover call. 2015-02-12 23:40:57 -05:00
Tom Rothamel a149858701 Add iOS documentation. 2015-02-12 23:39:41 -05:00
Tom Rothamel 3a1105935c Include gesture function docs. 2015-02-12 23:38:33 -05:00
Tom Rothamel c5fa5ca98b Ignore unknown KEYDOWN events in input.
This prevents them from triggering Keymap events when an input
is present.
2015-02-12 21:19:37 -05:00
Tom Rothamel e40e780834 Document gestures. 2015-02-11 17:27:26 -05:00
Tom Rothamel 5f23501413 Remove default gestures (except for progress).
At least until we can think about what sort of gestures we want in an
iOS game.
2015-02-11 17:25:44 -05:00
Tom Rothamel 0631221d98 Allow config.dispatch_gesture to end an interaction. 2015-02-11 17:25:25 -05:00
Tom Rothamel 87fc8b0468 Merge achievements when persistent data is changed. 2015-02-10 18:39:28 -05:00
Tom Rothamel b6d16ef601 Document the achievement system. 2015-02-10 18:25:11 -05:00
Tom Rothamel 72704eb945 Fixes to steam support; do not distribute by default. 2015-02-09 22:41:27 -05:00
Tom Rothamel 23c202e25f Write changelog. 2015-02-09 22:18:22 -05:00
Tom Rothamel 253cf2a5c7 Bump version to 6.99, add name. 2015-02-08 21:16:12 -05:00
Tom Rothamel dfce28b881 Merge pull request #549 from evilantishad0w/editfunctoggle
add toggle to show/hide "Edit File" section
2015-02-08 21:06:21 -05:00
Tom Rothamel 013cfdadea Build fribidi on Android. 2015-02-08 20:52:01 -05:00
evilantishad0w 71545e6d3a cleaned toggle code up a bit 2015-02-08 17:26:21 -07:00
Tom Rothamel 8282084f48 Allow resize on ANGLE. 2015-02-08 15:16:08 -05:00
Tom Rothamel 5d53028f62 Revise license and help.
This includes a better compliance notice and a revised list of
software licenses and repositories.
2015-02-08 12:34:57 -05:00
Tom Rothamel c43f364eab Ignore spurious resize events.
Windows seems to generate a spurious 1x1 resize event after leaving
fullscreen, and the occasional spurious (though correct) resize when
entering and leaving fullscreen mode.

We use the size of the window to debounce these events.

Fixes #382.
2015-02-07 23:53:28 -05:00
Tom Rothamel 93b25e9627 Use the desktop resolution when going fullscreen.
This works a lot better.
2015-02-07 21:42:27 -05:00
Tom Rothamel 3051687b4c Enable ZIP64 - allows packaging of large games. 2015-02-07 13:58:10 -05:00
Tom Rothamel 94cca9458b Use renpy.exe as gamename.exe.
Now that they differ, we want to use the Ren'Py-specific name.

Fixes #547.
2015-02-07 13:52:23 -05:00
Tom Rothamel c63e58f170 Fix analysis of ATL.
Analyzing ATL would crash old pre-ATL games. Also, we weren't
analyzing some atl clauses.
2015-02-07 00:07:02 -05:00
Tom Rothamel 3aa40537e9 Cleanups for #498.
The l_checkbox_box style change allows checkboxes to take up multiple
lines, but may need to be localized for different translations.
2015-02-06 19:45:52 -05:00
Tom Rothamel 495fa5512c Merge pull request #498 from Neurone/master
Let choose to developer if strings need to be empty while generating translations
2015-02-06 19:39:12 -05:00
Tom Rothamel f561b1ce04 Merge pull request #502 from tlm-2501/master
Added a Russian translation for the tutorial game
2015-02-06 19:37:13 -05:00
Tom Rothamel 7def90322f Translate last error message in updater.
Adds to #534. Languages that use a different word order can use a
translaton like "Unknown type {1} while unpacking {0}."
2015-02-06 19:33:00 -05:00
Tom Rothamel 75c8861de9 Merge pull request #534 from javimat/master
Add translation function _() in Update 00updater.rpy error messages
2015-02-06 19:31:57 -05:00
Tom Rothamel 9b5de49aae Viewport takes xminimum, xmaximum.
Fixes #458.
2015-02-06 19:00:05 -05:00
Tom Rothamel 3e5197f909 doc: Document _return as part of input.
Fixes #506.
2015-02-05 21:18:57 -05:00
Tom Rothamel 152ba2d7e5 doc: Document nvl show and nvl hide.
fixes #510.
2015-02-05 21:14:36 -05:00
Tom Rothamel 1d4d093a88 lint: Allow side-only image attributes.
This prevents spurious lint warnings. Fixes #545.
2015-02-05 21:02:17 -05:00
Tom Rothamel 955e02ce26 add_from: Integrate with launcher.
Enabled by default, this should mitigate or fix the "could not find
return label" problem.

Fixes #530.
2015-02-04 21:01:03 -05:00
evilantishad0w b499d95390 add toggle to show/hide "Edit File" section
Many power users have no need for the edit shortcuts in the launcher,
and in projects with a large number of script files hitting "edit all
script files" by accident can be annoying
2015-02-04 12:35:27 -07:00
Tom Rothamel df36d206d3 add_from: Implement the add_from command.
This should help long-term games manage changes to calls and return
sites.
2015-02-03 23:25:50 -05:00
Tom Rothamel 9af5e19054 add_from: Store the start and end of each logical line.
This makes editing the files possible, since we now know where we can
insert new clauses at the end of a statement.

As part of this commit, we change how we remove CR from the file,
so we can get unicode-byte accurate locations within the file.
2015-02-03 23:17:02 -05:00
Tom Rothamel 8492045273 Keep the Pass when introducing a From statement. 2015-02-03 19:08:48 -05:00
Tom Rothamel 49a3b15816 Never play voice during a with statement. 2015-02-02 21:32:11 -05:00
Tom Rothamel f015bb7b81 Mouseareas should not activate during a focus grab. 2015-02-02 19:00:33 -05:00
Tom Rothamel 44aa9c6fc8 replay: True/False locked was inverted.
Fixes #356.
2015-02-01 23:11:59 -05:00
Tom Rothamel d4eebdff49 Only load textures that are predicted or used.
Fixes #532.
2015-02-01 09:48:37 -05:00
Tom Rothamel f42572c1f8 Avoid double-copy of surfaces in sw renderer.
This also makes the load_texture semantics the same as those on the
GL side.
2015-02-01 09:47:53 -05:00
Tom Rothamel 356c6e346a Insert a Return at the end of each file.
Fixes #490.
2015-02-01 08:59:01 -05:00
Tom Rothamel 22eb62afff Add a precheck pass to lint.
This lets us try to resolve forward references. For now, this is
limited to tags used in image statemets that are used in hide
blocks.

Fixes #505.
2015-01-31 23:17:01 -05:00
Tom Rothamel 7d17c87ed0 Use shutil.copyfile with saves.
Fixes #543.
2015-01-31 21:46:51 -05:00
Tom Rothamel 7c8e93a046 Add set manipulation actions.
AddToSet, RemoveFromSet, and ToggleSetMembership allow one to
manipulate sets and lists-as-sets.
2015-01-30 20:21:51 -05:00
Tom Rothamel 86d250079b data: Fix equality for the names of screen variables. 2015-01-30 17:14:33 -05:00
Tom Rothamel b2cb51a61b transform: Function is called at the start of each interaction.
Fixes #523.
2015-01-29 21:27:54 -05:00
Tom Rothamel 4cfe681d00 transform: Properly proxy transform_anchor
Fixes #522.
2015-01-29 21:24:46 -05:00
Tom Rothamel c670a25f8b android: Fsencode strings passed to popen.
Fixes #526.
2015-01-29 20:06:40 -05:00
Tom Rothamel db5ee1e91f Merge pull request #539 from Nolanlemahn/master
Update copyright notices and scripts for 2015
2015-01-28 17:40:40 -05:00
Nolanlemahn ca1f1f1032 Update the copyright notices in the file headers for 2015. 2015-01-28 11:22:22 -08:00
Nolanlemahn 32800f1c48 Update copyright scripts for 2015 2015-01-28 11:21:31 -08:00
Tom Rothamel 66544cd4b2 text: Document custom text tags
Fixes #513.
2015-01-26 23:51:05 -05:00
Tom Rothamel 94df2f93b7 text: Add custom text tags to lint. 2015-01-26 22:30:20 -05:00
Tom Rothamel 4c1269c62e text: Add improved custom text tags.
These new text tags process the token list, which makes it possible
to change tags and text to other things. (For example, we are now
able to make a rot13 text tag.)
2015-01-26 22:15:18 -05:00
Tom Rothamel a94989eb06 Add high-level achievements API. 2015-01-25 22:36:24 -05:00
Tom Rothamel 0cc2df8800 steam: User account functions. 2015-01-25 18:27:40 -05:00
kyouryuukunn d62f28d849 Merge pull request #536 from kyouryuukunn/update_japanese_template
Update japanese template
2015-01-25 10:56:17 +09:00
kyouryuukunn 31de055d6f update japanese translation 2015-01-25 10:53:11 +09:00
Tom Rothamel a3daed1409 steam: Add indicate_achievement_progress. 2015-01-24 20:47:24 -05:00
Tom Rothamel d7ccd581ae steam: add INT stats. 2015-01-24 20:38:28 -05:00
kyouryuukunn f559367d6a update japanese 2015-01-25 10:21:12 +09:00
Tom Rothamel 064d24e838 steam: Default the notification popup to the top-right. 2015-01-24 20:17:31 -05:00
Tom Rothamel ec894fc458 steam: Bind more overlay functions. 2015-01-24 20:06:55 -05:00
Tom Rothamel 845f802a59 steam: Bind apps and overlay. 2015-01-24 19:41:54 -05:00
Tom Rothamel 6680a16db6 Fix typo in field name. 2015-01-24 15:38:08 -05:00
Tom Rothamel d838a3d07a steam: Support floating-point stats. 2015-01-23 22:22:27 -05:00
Tom Rothamel 1e35f405fb steam: Production quality init/achievements. 2015-01-23 21:52:35 -05:00
Tom Rothamel 9900bf6ecc steam: Generic approach to Steam callbacks.
And when we say generic, we mean it. This uses a C++ template that
can bind C functions to Steam callbacks.
2015-01-23 21:51:50 -05:00
Tom Rothamel ab36e3d59a Add support for registering a list of periodic callbacks.
For example, steam uses this to run its callbacks.
2015-01-23 21:50:26 -05:00
Tom Rothamel d370760071 Code to demonstrate binding a Steam callback. 2015-01-22 21:12:35 -05:00
Tom Rothamel 0310e60b1c Add _renpysteam module.
For now, this just initializes steam, to prove the linking is correct.
2015-01-21 22:23:28 -05:00
Tom Rothamel 54614e2b83 steam: Add support for building c++ extensions. 2015-01-21 22:20:01 -05:00
Tom Rothamel 92032f123b iap: Update Android support. 2015-01-21 22:15:25 -05:00
Tom Rothamel f799dfcb31 Doc fix. 2015-01-18 23:20:07 -05:00
Tom Rothamel 99698fdd06 iap: Add the ability to query the price from the server. 2015-01-18 23:19:48 -05:00
Tom Rothamel 4bf0b7ca67 iap: iOS: Purchase, restore purchases, and defer purchases. 2015-01-18 20:51:56 -05:00
javimat 685fd09a75 Update 00updater.rpy
Add the translation function _() to `raise UpdateError` strings because they are showed to the end user.

Don't know how this can be done in line 1030: `raise UpdateError("While unpacking {}, unknown type {}.".format(info.name, info.type))`
2015-01-17 12:02:28 +01:00
Tom Rothamel 75825e7c2c iap: Set and validate product identifiers. 2015-01-17 05:05:25 -05:00
Tom Rothamel 052ec96f54 iap: Start work on iOS. 2015-01-16 23:17:37 -05:00
Tom Rothamel a4ab8fa083 Control log-to-stdout via a config variable. 2015-01-16 23:17:11 -05:00
Tom Rothamel 75e5a29470 Do not error out if a slot doesn't exist.
Fixes #493.
2015-01-14 17:32:00 -05:00
Tom Rothamel 04db67cad7 Do not pass parent's style prefix to Bar or Drag.
Fixes #500.
2015-01-14 17:27:15 -05:00
Tom Rothamel 0550a85716 When an error occurs while loading an image, report the image. 2015-01-13 08:56:19 -05:00
Tom Rothamel 91d5f6cc21 Add context manager that changes exception_info. 2015-01-13 08:55:59 -05:00
Tom Rothamel 82433d3dc0 Add ios presplash to build, allow Android to use .png. 2015-01-12 21:44:04 -05:00
Tom Rothamel 663cac933f Deal with audio with an initial PTS.
We were ignoring an initial PTS on the video track, but not the
audio. This could cause the two tracks to go out of sync.
2015-01-12 21:43:28 -05:00
Tom Rothamel 520ff08595 Prevent segfault when audio stream is unknown.
More accurately, prevent a segfault from occuring when we know
that an audio stream exists, but we are unable to create the
codec for it.
2015-01-11 10:54:53 -05:00
Tom Rothamel 95e12cab07 tts: Add clipboard voicing. 2015-01-10 21:29:21 -05:00
Tom Rothamel 52093520fd Do not pop open the text editor on Android configuration fail. 2015-01-10 11:59:47 -05:00
Tom Rothamel f92e459801 Remove debug print. 2015-01-10 00:22:14 -05:00
Tom Rothamel b8d08dda5a gesture: Implement support for gestures on touchscreen devices. 2015-01-09 23:05:58 -05:00
Tom Rothamel f8453fc4fd Optionally, log gl function names before each call.
This makes it possible to debug crashes in GL code.
2015-01-08 22:37:53 -05:00
Tom Rothamel c5c3a57f9d Log to stdout on mobile platforms.
The various mobile platfors redirect stdout to places that are more
visible than the filesystem.
2015-01-08 22:37:21 -05:00
Tom Rothamel 83245c7432 Parameterize children of Sprites.
This ensures that Transforms used as children of Sprites maintain
their own state (or more precisely, all Transforms added in a
single frame will have a state different than Transforms from
other frames).

Fixes #529.
2015-01-07 21:45:07 -05:00
Tom Rothamel 5715bdec00 Return False when checking if unknown items have been purchased. 2015-01-07 18:09:06 -05:00
Tom Rothamel c57253cfce Fix divide-by-zero.
Fixes #521.
2015-01-07 18:07:59 -05:00
Tom Rothamel 85fa790711 Add _progress screen.
Accessed by shift+alt+P, this easter egg of a screen show how much
of the game has been played through.
2015-01-05 21:41:46 -05:00
Tom Rothamel c379dd6bc3 Drags now support focus_mask. 2015-01-05 21:41:18 -05:00
Tom Rothamel e42d04ad9e Always use a max-size window on iOS and Android.
Letting the system choose means we can't be caught by unfortunate
rotations.
2015-01-05 20:40:00 -05:00
Tom Rothamel f361f7d0ef Do not force a big window on the desktop.
Some mobile code was leaking over to the desktop side.
2015-01-04 11:52:44 -05:00
Tom Rothamel 69bd85f98f Update docs. 2015-01-03 18:18:31 -05:00
Tom Rothamel b4cee2db25 Automatically maintain the text input state and text rectangle. 2015-01-03 18:07:14 -05:00
Tom Rothamel b16e7ebf8e Compat for renpy.styleclass.
Fixes #518.
2015-01-02 21:59:41 -05:00
Tom Rothamel 4f9dcd4fdc Stroke both font borders when creating outlines.
Previously we only stroked the outside border. This caused problems
when a portion of the character had an interior border on the
outside.

For example, we encountered a ? character where the top
part was outside and the bottom part was inside - it seems to
have something to do with the clockwise/counterclockwise order
of the font's control points.
2015-01-02 21:38:11 -05:00
Tom Rothamel 3dc33d4238 Add support for IME-based text editing to Input. 2015-01-02 21:06:29 -05:00
Tom Rothamel aa16b64225 Add support for n-thickness underlines to {u}. 2015-01-02 20:27:34 -05:00
Tom Rothamel f93d3b9fc9 Fix parsing of word-like operators in simple_expressions. 2015-01-02 20:12:38 -05:00
Tom Rothamel 250103bf4e Deal with empty unicode events. 2015-01-01 14:01:30 -05:00
Tom Rothamel bc6767bdf4 Ignore key events when an IME is in use. 2015-01-01 14:00:56 -05:00
Tom Rothamel 15a6b39a40 Add support for double-underline.
This isn't user-exposed, it's just for IME use.
2015-01-01 14:00:08 -05:00
Tom Rothamel 83352e3e29 Input uses TEXTINPUT events, if possible. 2015-01-01 00:20:00 -05:00
Tom Rothamel c8c52477c9 When on mac, allow the user to try to launch Xcode. 2014-12-31 20:41:47 -05:00
Tom Rothamel 042ae30b62 Sanitize Xcode identifiers. 2014-12-31 20:29:28 -05:00
Tom Rothamel b9f3bbe950 Distribute Ren'Py files into ios apps. 2014-12-31 00:40:51 -05:00
Tom Rothamel 2fd1416ce4 Interface for Xcode project creation. 2014-12-30 23:43:54 -05:00
Tom Rothamel 722c99ed04 Select/Open Xcode projects directory. 2014-12-29 23:16:33 -05:00
Tom Rothamel b59c94ad7f Factor the directory chooser into its own function. 2014-12-29 22:51:43 -05:00
Tom Rothamel 547a504f7b Add iOS launcher UI. 2014-12-28 22:35:04 -05:00
Tom Rothamel 51a168c12f Add the ability to emulate iOS devices. 2014-12-28 22:34:43 -05:00
Tom Rothamel 3573a42ef7 Factor mobile build stuff common to android/ios into own file. 2014-12-28 18:33:24 -05:00
Tom Rothamel 23d69c7c8e android: Add the ability to launch after the build. 2014-12-27 21:15:31 -05:00
Tom Rothamel 77e44a5ab5 Use pysdlsound on all platforms, including Android. 2014-12-26 23:37:45 -05:00
Tom Rothamel b892ca4791 Merge pull request #517 from evilantishad0w/master
added "suspend_rollback()" functionality
2014-12-26 18:13:16 -05:00
evilantishad0w 4775d4f082 removed extraneous line
^^;;
2014-12-26 14:11:49 -07:00
Tom Rothamel 2148a68df8 Remove legacy SDL_VIDEODRIVER setting.
Fixes a problem when upgrading Ren'Py from 6.18.
2014-12-26 16:06:28 -05:00
evilantishad0w 52a8fd1b63 changed to suspend_rollback(), fixes 2014-12-26 13:20:47 -07:00
evilantishad0w 422db61d71 add renpy.rollback_skip()
Add functionality to skip a block of code in rollback, used to prevent
rollback during a minigame or other similar event
2014-12-26 12:46:31 -07:00
Tom Rothamel 749462beec Make hardware video optional. 2014-12-25 16:29:59 -05:00
Tom Rothamel 8726c6d50b Select device variants on iOS. 2014-12-24 15:10:36 -05:00
Tom Rothamel 6ae531e893 Protect against crashes due to no player existing. 2014-12-24 15:06:10 -05:00
Tom Rothamel dc117ffbe1 Remove a debug print. 2014-12-23 23:24:55 -05:00
Tom Rothamel 40e3eaaf64 Add an iOS video player. 2014-12-23 23:09:37 -05:00
Tom Rothamel 72e4607e82 Factor the android video player out into its own class. 2014-12-23 23:09:15 -05:00
Tom Rothamel cfdaa95bea Pause native and android audio and video on suspend. 2014-12-22 21:52:56 -05:00
Tom Rothamel 2be0638602 Fix build on iOS. 2014-12-22 21:52:47 -05:00
Tom Rothamel 6ec5a0c122 Support resize on mobile platforms. 2014-12-18 21:28:26 -05:00
Tom Rothamel fd1902ecd2 Package renios. 2014-12-17 23:03:09 -05:00
Tom Rothamel ec77844b1a Bump version. 2014-12-17 23:02:57 -05:00
Tom Rothamel 8c238ae4ff Optionally accept the path to pygame_sdl2 to use for the build. 2014-12-16 23:13:42 -05:00
Tom Rothamel 4c909922d4 Properly make prefixed_all_properties public. 2014-12-16 22:21:46 -05:00
Tom Rothamel 8358539667 Make new modules findable by modulefinder. 2014-12-15 23:37:07 -05:00
Tom Rothamel 5c87617652 Replace some android tests with mobile device tests. 2014-12-14 22:16:17 -05:00
Tom Rothamel a102a7dca9 Use fbo to render-to-texture on iOS.
This also includes changing rtt_fbo to retrieve the default
framebuffer, rather than using fbo 0 (as documented by GL).
2014-12-14 22:02:13 -05:00
Tom Rothamel a2e8758965 On iOS, log to stdout.
So xcode gets it, rather than it becoming unaccessable.
2014-12-14 21:57:22 -05:00
Tom Rothamel 5914e9317c Find the iOS save directory. 2014-12-14 18:29:17 -05:00
Tom Rothamel 094dbe7386 Fixes to support GL on iOS. 2014-12-13 23:50:11 -05:00
Tom Rothamel 84debf31c7 Remove recursive imports in the style code. 2014-12-13 23:49:41 -05:00
Tom Rothamel 5afacd4dec The enum is not defined in GLES2. 2014-12-13 23:48:45 -05:00
Tom Rothamel 4221eb049f Move android detect to renpy module, add renpy.mobile.
The latter is a flag that determines if we're on android or ios,
inclusive. (These platforms tend to behave similarly, and different
from the desktop platforms.)
2014-12-13 23:45:14 -05:00
Tom Rothamel 4971ff139f Fix renpy.style.StyleCore.__setattr__.
It was using the wrong variable name.
2014-12-12 00:18:10 -05:00
Tom Rothamel e5a50b4b4d Remove renpy.styleclass entirely.
Its functionality has been split over the many renpy.styledata modules.
2014-12-12 00:17:31 -05:00
Tom Rothamel 5222a47b9d Break stylepropertyfunctions.pxi up into ten pyx files.
The hope is this will allow faster independent compilation.
2014-12-11 23:51:25 -05:00
Tom Rothamel 98afd6402c Only generate python properties for unprefixed style properties.
To reduce the size of the compiled library, we replace the use of
python properties for prefixed style properties with the __setattr__
and __delattr__ methods.

This shouldn't have much performance impact, as sets of style
properties should only occur in init code.
2014-12-10 23:13:21 -05:00
Tom Rothamel 24fdc18a47 Start breaking styleclass.pyx up into renpy.styledata.
This should eventually make compilation faster.
2014-12-10 21:46:58 -05:00
Tom Rothamel e5632b27b2 Changes to make build on iOS. 2014-12-09 19:24:40 -05:00
Tom Rothamel 14db5d588f Add support for android on pygame_sdl2. 2014-12-09 19:24:18 -05:00
Tom Rothamel dbb990c0f7 Merge pull request #504 from tlm-2501/patch-1
Merge "Update language_basics.rst" from tlm-2501/patch-1
2014-12-01 21:07:18 -05:00
Tom Rothamel a34bed7e11 Implement android/iOS lifecycle. 2014-11-30 22:22:54 -05:00
Tom Rothamel 7c61befcb0 import pygame_sdl2 as pygame, instead of import pygame.
This is intended to make autocomplete use pygame_sdl2 when
legacy names exist.
2014-11-30 19:29:57 -05:00
Tom Rothamel 9381c7399b Do not run desktop-only code when playing android video. 2014-11-30 17:15:13 -05:00
tlm-2501 439365977f Update language_basics.rst
Fixed escape sequences -- backslashes weren't escaped, as a result they were not visible.
2014-11-30 01:38:41 +03:00
Tom Rothamel 5b3a7bf02e Import _android_sound. 2014-11-29 11:41:43 -05:00
Tom Rothamel 1be45fb2d4 Android keybindings. 2014-11-29 11:40:28 -05:00
Tom Rothamel a327517cf8 Link against png16. 2014-11-29 11:38:47 -05:00
Tom Rothamel f9204ad5a0 Set GL_ALPHA_SIZE to 8 on all GL platforms (incl. Android). 2014-11-29 01:48:23 -05:00
Tom Rothamel 5b5a7ab907 Fix a a problem where we free an unallocated object. 2014-11-28 23:18:44 -05:00
Tom Rothamel 634bb3ad64 Use the new approach to get the activity. 2014-11-28 22:18:26 -05:00
Tom Rothamel 329d8d3ee1 Move gl1 functions into their own file.
Now that we're wrapping the GL functions, all the functions in gl.pyx
have to exist. The gl1 functions are missing on GLES2 systems, which
means they can't exist in a file we use there. Hence breaking things
up into two files.
2014-11-28 21:59:04 -05:00
tlm 24c7e845c3 Added a Russian translation for the tutorial game 2014-11-26 20:39:04 +03:00
Tom Rothamel 3f01f49da3 Link android against SDL2. 2014-11-23 22:28:37 -05:00
Tom Rothamel 6d7c28560c gl: Error checks controlled by RENPY_GL_CHECK_ERRORS. 2014-11-19 22:38:13 -05:00
Lapalissiano 23931a5676 Ignored virtualenv 'env' folder 2014-11-20 04:07:54 +01:00
Giuseppe Bertone b4dd9f6878 Fixed tab; 2014-11-20 03:20:10 +01:00
Giuseppe Bertone 2903b81360 Empty strings are now optional while exporting strings for translation, and you can use a specific option in the preference panel to activate this behavior (default is false); 2014-11-20 03:17:52 +01:00
Tom Rothamel 942cf82354 gl: Add function name to gl error messages. 2014-11-18 22:21:54 -05:00
Tom Rothamel 4dcdd1ad65 gl: Check for errors after every call. 2014-11-17 23:31:04 -05:00
Tom Rothamel a2a3c284a3 Initialize angle under pygame_sdl2. 2014-11-16 00:25:10 -05:00
Tom Rothamel 4497d5e30f Use the single-file pygame_sdl2 C api. 2014-11-16 00:24:46 -05:00
Tom Rothamel 9c5e037db6 Merge branch 'master' into sdl2 2014-11-15 23:10:15 -05:00
Tom Rothamel 2b6c7941d6 Do not predict labels that do not exist.
Fixes #491.
2014-11-14 19:52:13 -05:00
Tom Rothamel 4e11d77258 We no longer need to force windib. (Which no longer exists.) 2014-11-12 21:48:31 -05:00
Tom Rothamel 9791e379e3 Build w/ SDL2 on Windows.
For now, ANGLE is disabled. At some point, we'll try to use SDL to
initialize it.
2014-11-11 09:59:01 -05:00
Tom Rothamel b59dc7906c Only copy ANGLE files if they're out of date. 2014-11-11 00:08:00 -05:00
Tom Rothamel 253726c433 Merge branch 'master' into sdl2 2014-11-07 22:22:34 -05:00
Tom Rothamel 06e3a75515 Add \[ as a way of escaping [.
This just replaces \[ with [[, which continues to work.

Fixes #489.
2014-11-07 22:21:21 -05:00
Tom Rothamel 2925e1e64f nogil_copy should copy without using the alpha channel. 2014-11-07 22:15:02 -05:00
Tom Rothamel ead574ae6b Report a traceback when pysdlsound fails to import. 2014-11-06 23:02:37 -05:00
Tom Rothamel 1f4d4cd974 Zero out the audio buffer before mixing samples into it.
This is necessary for SDL 2.
2014-11-06 20:49:05 -05:00
Tom Rothamel 2deaf3689a RWOpsFromPythonThreaded -> RWOpsFromPython
In pygame_sdl2, rwops is always threadsafe.
2014-11-05 23:59:39 -05:00
kalawore 2847f42707 add templates traditional_chinese translation 2014-08-18 21:52:20 +08:00
kalawore 28872407c3 Update traditional Chinese 2014-08-06 20:04:12 +08:00
kalawore ab7adb8b3a Merge github.com:renpy/renpy 2014-07-20 15:36:40 +08:00
kalawore e70be78e65 Signed-off-by: kalawore <kalawore@outlook.com> 2014-07-19 15:49:42 +08:00
kalawore cd95838191 Add Chinese_Traditional Translation 2014-07-14 16:36:51 +08:00
995 changed files with 116719 additions and 29148 deletions
+13
View File
@@ -0,0 +1,13 @@
[run]
plugins = renpycoverage
[report]
omit =
keywords.py
style.pxd
*pygame_sdl2*
*.rpyc
*/game/*
*style_*_functions.pyx
renpy/gl/gl.pyx
renpy/gl/gl1.pyx
+27 -5
View File
@@ -10,13 +10,16 @@
saves
tmp
cache
env
log.txt
/errors.txt
/traceback.txt
errors.txt
traceback.txt
styles.txt
/gui/game/gui
/android
/build
/dist
@@ -34,6 +37,7 @@ styles.txt
/.pydevproject
/.pydevproject.bak
/.project
/.cproject
/.settings
/LICENSE.txt
/templates/english/README.html
@@ -43,12 +47,30 @@ styles.txt
/renpy/angle/*.pxd
/renpy-ppc.zip
/module/build
/module/gen
/module/gen*
/editra
/launcher/game/theme
/launcher/game/script_version.rpy
dl
/dl
renpy/vc_version.py
.externalToolBuilders
rapt
/rapt
/evil
/iaptest
/pygame_sdl2
/renios
/steam_appid.txt
/.coverage
/id
/interface_7
/htmlcov
/the_question/.android.json
/WINDOWS.rst
/*-all/
/*-win/
/*-mac/
/*-linux*/
/*-dists/
doc-web
+2
View File
@@ -0,0 +1,2 @@
[pep8]
ignore=E123,E20,E22,E501,E702,E266,E265,E262
+25 -10
View File
@@ -49,30 +49,45 @@ Building the modules requires you have the many dependencies installed on
your system. On Ubuntu and Debian, these dependencies can be installed with
the command::
apt-get install python-dev python-pygame libavcodec-dev libavformat-dev \
libavresample-dev libfreetype6-dev libglew1.6-dev libsdl1.2-dev \
libsdl-image1.2-dev libfribidi-dev libswscale-dev libesd0-dev libpulse-dev
Other platforms may have an equivalent command. Otherwise, you'll need to
build `renpy-deps <https://github.com/renpy/renpy-deps>`_.
apt-get install virtualenvwrapper python-dev libavcodec-dev libavformat-dev \
libavresample-dev libswresample-dev libswscale-dev libfreetype6-dev libglew1.6-dev \
libfribidi-dev libsdl2-dev libsdl2-image-dev libsdl2-gfx-dev \
libsdl2-mixer-dev libsdl2-ttf-dev libjpeg-turbo8-dev
We strongly suggest installing the Ren'Py modules into a Python
virtualenv. `This page <http://dabapps.com/blog/introduction-to-pip-and-virtualenv-python/>`_
describes how to install pip and the virtualenv tool, and set up a new virtualenv.
virtualenv. To create a new virtualenv, open a new terminal and run::
mkvirtualenv renpy
To return to this virtualenv later, run::
workon renpy
After activating the virtualenv, install cython::
pip install -U cython
Then, install pygame_sdl2 by running the following commands::
git clone https://www.github.com/renpy/pygame_sdl2
pushd pygame_sdl2
python fix_virtualenv.py $VIRTUAL_ENV
python setup.py install
python setup.py install_headers
popd
Next, set RENPY_DEPS_INSTALL To a \::-separated list of paths containing the
dependencies, and RENPY_CYTHON to the name of the cython command::
export RENPY_DEPS_INSTALL=/usr::/usr/lib/x86_64-linux-gnu/
export RENPY_DEPS_INSTALL="/usr::/usr/lib/x86_64-linux-gnu/"
export RENPY_CYTHON=cython
Finally, change into the `modules` directory, and run::
Finally, use setup.py in the Ren'Py ``module`` directory to compile and
install the modules that support Ren'Py::
pushd module
python setup.py install
popd
Ren'Py will be installed into the activated virtualenv. It can then be run
using the command::
+62 -21
View File
@@ -1,15 +1,25 @@
#!/usr/bin/env python
#!/usr/bin/env python2
from __future__ import print_function
import argparse
import os
import subprocess
import sys
from renpy import version_tuple #@UnresolvedImport
from renpy import version_tuple # @UnresolvedImport
SOURCE = [
"/home/tom/ab/renpy",
"/home/tom/ab/android/",
"/home/tom/ab/android/python-for-android",
"/home/tom/ab/ripe/renios",
"/home/tom/ab/renpy-deps",
"/home/tom/ab/pygame_sdl2",
]
version = ".".join(str(i) for i in version_tuple)
short_version = ".".join(str(i) for i in version_tuple[:3])
print "Version", version
print("Version", version)
ap = argparse.ArgumentParser()
@@ -17,9 +27,39 @@ ap.add_argument("--release", action="store_true")
ap.add_argument("--prerelease", action="store_true")
ap.add_argument("--experimental", action="store_true")
ap.add_argument("--no-tag", "-n", action="store_true")
ap.add_argument("--push-tags", action="store_true")
ap.add_argument("--delete-tag")
args = ap.parse_args()
if args.release:
subprocess.check_call([ "/home/tom/ab/renpy/scripts/checksums.py", "/home/tom/ab/renpy/dl/" + short_version ])
if args.delete_tag:
for i in SOURCE:
os.chdir(i)
if i == SOURCE[0]:
tag = args.delete_tag
else:
tag = "renpy-" + args.delete_tag
subprocess.call([ "git", "tag", "-d", tag, ])
sys.exit(0)
if args.push_tags:
for i in SOURCE:
os.chdir(i)
if subprocess.call([ "git", "push", "--tags" ]):
print("Tags not pushed: {}".format(os.getcwd()))
sys.exit(1)
print("Pushed tags.")
sys.exit(0)
if args.release:
links = [ "release", "prerelease", "experimental" ]
tag = True
@@ -33,23 +73,28 @@ else:
links = [ ]
tag = False
if args.no_tag:
tag = False
def check_dirty():
if args.no_tag:
return
if tag:
for i in SOURCE:
os.chdir(i)
if subprocess.check_call([ "git", "diff", "--quiet", "HEAD" ]):
print "Directory not checked in: {}".format(os.getcwd())
sys.exit(1)
if subprocess.call([ "git", "diff", "--quiet", "HEAD" ]):
print("Directory not checked in: {}".format(os.getcwd()))
sys.exit(1)
os.chdir("/home/tom/ab/renpy")
check_dirty()
for i in SOURCE:
os.chdir("/home/tom/ab/renpy/android")
check_dirty()
os.chdir(i)
if i == SOURCE[0]:
tag = version
else:
tag = "renpy-" + version
subprocess.check_call([ "git", "tag", "-a", tag, "-m", "Tagging Ren'Py + " + version + " release." ])
if not args.no_tag:
subprocess.check_call([ "git", "tag", "-a", "rapt-" + version, "-m", "Tagging RAPT release." ])
os.chdir("/home/tom/ab/renpy/dl")
@@ -58,11 +103,7 @@ for i in links:
os.unlink(i)
os.symlink(short_version, i)
os.chdir("/home/tom/ab/renpy")
if tag and not args.no_tag:
cmd = [ "git", "tag", "-a", version, "-m", "Ren'Py " + version ]
subprocess.check_call(cmd)
os.chdir("/home/tom/ab/website")
subprocess.check_call("./upload.sh")
print("Version", version)
+1 -1
View File
@@ -1,2 +1,2 @@
lib\windows-i686\python.exe -OO renpy.py
lib\windows-i686\python.exe -OO renpy.py tutorial
pause
Executable
+11
View File
@@ -0,0 +1,11 @@
#!/bin/bash
if [ -z "$RENPY_COVERAGE" ]; then
echo "$0 needs to be run with RENPY_COVERAGE set, probably in a virtualenv."
exit 1
fi
./run.sh --build || exit 1
coverage run renpy.py "$@"
coverage html
xdg-open htmlcov/index.html
Executable
+10
View File
@@ -0,0 +1,10 @@
#!/bin/bash
# This builds out of date modules using the default C compiler, and then
# runs them.
ROOT="$(dirname $(realpath $0))"
export RENPY_GDB="gdb --args"
. "$ROOT/run.sh" "$@"
+59 -46
View File
@@ -1,6 +1,7 @@
#!/home/tom/bin/renpython -O
#!/home/tom/ab/renpy/lib/linux-x86_64/python -O
# Builds a distribution of Ren'Py.
from __future__ import print_function
import sys
import os
@@ -8,10 +9,13 @@ import compileall
import shutil
import subprocess
import argparse
import glob
if not sys.flags.optimize:
raise Exception("Optimization disabled.")
ROOT = os.path.dirname(os.path.abspath(__file__))
def copy_tutorial_file(src, dest):
"""
Copies a file from src to dst. Lines between "# tutorial-only" and
@@ -45,9 +49,16 @@ def main():
ap = argparse.ArgumentParser()
ap.add_argument("version")
ap.add_argument("--fast", action="store_true")
ap.add_argument("--pygame", action="store", default=None)
ap.add_argument("--no-rapt", action="store_true")
ap.add_argument("--variant", action="store")
ap.add_argument("--sign", action="store_true")
args = ap.parse_args()
if args.sign:
os.environ["RENPY_MAC_IDENTITY"] = "Developer ID Application: Tom Rothamel (XHTE5H7Z79)"
# Revision updating is done early, so we can do it even if the rest
# of the program fails.
@@ -55,16 +66,15 @@ def main():
# file has changed, bump it by 1.
import renpy
match_version = ".".join(str(i) for i in renpy.version_tuple[:2]) #@UndefinedVariable
zip_version = ".".join(str(i) for i in renpy.version_tuple[:3]) #@UndefinedVariable
match_version = ".".join(str(i) for i in renpy.version_tuple[:2]) # @UndefinedVariable
s = subprocess.check_output([ "git", "describe", "--tags", "--dirty", "--match", match_version ])
s = subprocess.check_output([ "git", "describe", "--tags", "--dirty", "--match", "start-" + match_version ])
parts = s.strip().split("-")
if len(parts) <= 2:
if len(parts) <= 3:
vc_version = 0
else:
vc_version = int(parts[1])
vc_version = int(parts[2])
if parts[-1] == "dirty":
vc_version += 1
@@ -73,24 +83,27 @@ def main():
f.write("vc_version = {}".format(vc_version))
try:
reload(sys.modules['renpy.vc_version']) #@UndefinedVariable
reload(sys.modules['renpy.vc_version']) # @UndefinedVariable
except:
import renpy.vc_version # @UnusedImport
import renpy.vc_version # @UnusedImport
reload(sys.modules['renpy'])
# Check that the versions match.
full_version = ".".join(str(i) for i in renpy.version_tuple) #@UndefinedVariable
if args.version != "renpy-experimental" \
and not args.version.startswith("renpy-nightly-") \
and not full_version.startswith(args.version):
full_version = renpy.version_only # @UndefinedVariable
if "-" not in args.version \
and not full_version.startswith(args.version):
raise Exception("The command-line and Ren'Py versions do not match.")
os.environ['RENPY_BUILD_VERSION'] = args.version
# The destination directory.
destination = os.path.join("dl", args.version)
print "Version {} ({})".format(args.version, full_version)
if args.variant:
destination += "-" + args.variant
print("Version {} ({})".format(args.version, full_version))
# Perhaps autobuild.
if "RENPY_BUILD_ALL" in os.environ:
@@ -103,42 +116,29 @@ def main():
# Compile all the python files.
compileall.compile_dir("renpy/", ddir="renpy/", force=1, quiet=1)
# Generate launcher/game/script_version.rpy
with open("launcher/game/script_version.rpy", "w") as f:
f.write("init -999 python:\n")
f.write(" config.script_version = {!r}\n".format(renpy.version_tuple[:3])) # @UndefinedVariable
# Compile the various games.
if not args.fast:
for i in [ 'tutorial', 'launcher', 'the_question' ] + glob.glob("templates/*"):
print "Compiling", i
for i in [ 'tutorial', 'launcher', 'the_question' ]:
print("Compiling", i)
subprocess.check_call(["./renpy.sh", i, "quit" ])
# Kick off the rapt build.
if not args.fast:
out = open("/tmp/rapt_build.txt", "wb")
print("Building RAPT.")
print("Cleaning RAPT.")
android = os.path.abspath("android")
sys.path.insert(0, os.path.join(ROOT, "rapt", "buildlib"))
rapt_build = subprocess.Popen([
os.path.join(android, "build_renpy.sh"),
"renpy",
ROOT,
],
cwd = android,
stdout=out,
stderr=out)
import rapt.interface # @UnresolvedImport
import rapt.build # @UnresolvedImport
code = rapt_build.wait()
interface = rapt.interface.Interface()
rapt.build.distclean(interface)
if code:
print "RAPT build failed. The output is in /tmp/rapt_build.txt."
sys.exit(1)
else:
print "RAPT build succeeded."
print("Compiling RAPT and renios.")
compileall.compile_dir("rapt/buildlib/", ddir="rapt/buildlib/", quiet=1)
compileall.compile_dir("renios/buildlib/", ddir="renios/buildlib/", quiet=1)
if not os.path.exists(destination):
os.makedirs(destination)
@@ -167,7 +167,7 @@ def main():
destination,
]
print
print()
subprocess.check_call(cmd)
# Sign the update.
@@ -178,12 +178,21 @@ def main():
os.path.join(destination, "updates.json"),
])
# Package pygame_sdl2.
if not args.fast:
subprocess.check_call([
"pygame_sdl2/setup.py",
"-q",
"egg_info",
"--tag-build",
"-for-renpy-" + args.version,
"sdist",
"-d",
os.path.abspath(destination)
])
# Write 7z.exe.
sdk = "renpy-{}-sdk".format(zip_version)
if args.version.startswith("renpy-nightly-"):
sdk = args.version + "-sdk"
sdk = "renpy-{}-sdk".format(args.version)
if not args.fast:
@@ -231,7 +240,11 @@ def main():
if os.path.exists(sdk + ".7z.exe"):
os.unlink(sdk + ".7z.exe")
print
print()
if not (args.fast or args.sign):
print("For a final-ish release, remember to use --sign so we're signed on the mac.")
if __name__ == "__main__":
main()
+467
View File
@@ -0,0 +1,467 @@
################################################################################
## Initialization
################################################################################
## The init offset statement causes the init code in this file to run before
## init code in any other file.
init offset = -2
## Calling gui.init resets the styles to sensible default values, and sets the
## width and height of the game.
init python:
gui.init(1280, 720)
################################################################################
## GUI Configuration Variables
################################################################################
## Colors ######################################################################
##
## The colors of text in the interface.
## An accent color used throughout the interface to label and highlight
## text.
define gui.accent_color = "#00b8c3"
## The color used for a text button when it is neither selected nor hovered.
define gui.idle_color = "#555555"
## The small color is used for small text, which needs to be
## brighter/darker to achieve the same effect.
define gui.idle_small_color = "#aaaaaa"
## The color that is used for buttons and bars that are hovered.
define gui.hover_color = Color(gui.accent_color).tint(.6)
## 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.
define gui.selected_color = "#ffffff"
## The color used for a text button when it cannot be selected.
define gui.insensitive_color = "#55555580"
## 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.
define gui.muted_color = "#004e49"
define gui.hover_muted_color = "#006e75"
## The colors used for dialogue and menu choice text.
define gui.text_color = "#ffffff"
define gui.interface_text_color = "#ffffff"
## Fonts and Font Sizes ########################################################
## The font used for in-game text.
define gui.default_font = "DejaVuSans.ttf"
## The font used for character names.
define gui.name_font = "DejaVuSans.ttf"
## The font used for out-of-game text.
define gui.interface_font = "DejaVuSans.ttf"
## The size of normal dialogue text.
define gui.text_size = gui.scale(22)
## The size of character names.
define gui.name_text_size = gui.scale(30)
## The size of text in the game's user interface.
define gui.interface_text_size = gui.scale(24)
## The size of labels in the game's user interface.
define gui.label_text_size = gui.scale(28)
## The size of text on the notify screen.
define gui.notify_text_size = gui.scale(16)
## The size of the game's title.
define gui.title_text_size = gui.scale(50)
## Main and Game Menus #########################################################
## The images used for the main and game menus.
define gui.main_menu_background = "gui/main_menu.png"
define gui.game_menu_background = "gui/game_menu.png"
## Should we show the name and version of the game?
define gui.show_name = True
## Dialogue ####################################################################
##
## These variables control how dialogue is displayed on the screen one line
## at a time.
## The height of the textbox containing dialogue.
define gui.textbox_height = gui.scale(185)
## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is
## center, and 1.0 is the bottom.
define gui.textbox_yalign = 1.0
## 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.
define gui.name_xpos = gui.scale(240)
define gui.name_ypos = gui.scale(0)
## 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.
define gui.name_xalign = 0.0
## The width, height, and borders of the box containing the character's
## name, or None to automatically size it.
define gui.namebox_width = None
define gui.namebox_height = None
## The borders of the box containing the character's name, in left, top,
## right, bottom order.
define gui.namebox_borders = Borders(5, 5, 5, 5)
## If True, the background of the namebox will be tiled, if False, the background
## if the namebox will be scaled.
define gui.namebox_tile = False
## 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.
define gui.text_xpos = gui.scale(268)
define gui.text_ypos = gui.scale(50)
## The maximum width of dialogue text, in pixels.
define gui.text_width = gui.scale(744)
## 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.
define gui.text_xalign = 0.0
## Buttons #####################################################################
##
## These variables, along with the image files in gui/button, control aspects
## of how buttons are displayed.
## The width and height of a button, in pixels. If None, Ren'Py computes a size.
define gui.button_width = None
define gui.button_height = gui.scale(36)
## The borders on each side of the button, in left, top, right, bottom order.
define gui.button_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
## If True, the background image will be tiled. If False, the background image
## will be linearly scaled.
define gui.button_tile = False
## The font used by the button.
define gui.button_text_font = gui.interface_font
## The size of the text used by the button.
define gui.button_text_size = gui.interface_text_size
## The color of button text in various states.
define gui.button_text_idle_color = gui.idle_color
define gui.button_text_hover_color = gui.hover_color
define gui.button_text_selected_color = gui.selected_color
define gui.button_text_insensitive_color = gui.insensitive_color
## The horizontal alignment of the button text. (0.0 is left, 0.5 is center,
## 1.0 is right).
define gui.button_text_xalign = 0.0
## 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.
##
## These customizations are used by the default interface:
define gui.radio_button_borders = Borders(gui.scale(25), gui.scale(4), gui.scale(4), gui.scale(4))
define gui.check_button_borders = Borders(gui.scale(25), gui.scale(4), gui.scale(4), gui.scale(4))
define gui.confirm_button_text_xalign = 0.5
define gui.page_button_borders = Borders(gui.scale(10), gui.scale(4), gui.scale(10), gui.scale(4))
define gui.quick_button_borders = Borders(gui.scale(10), gui.scale(4), gui.scale(10), gui.scale(0))
define gui.quick_button_text_size = gui.scale(14)
define gui.quick_button_text_idle_color = gui.idle_small_color
define gui.quick_button_text_selected_color = gui.accent_color
## 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.
# define gui.navigation_button_width = 250
## Choice Buttons ##############################################################
##
## Choice buttons are used in the in-game menus.
define gui.choice_button_width = gui.scale(790)
define gui.choice_button_height = None
define gui.choice_button_tile = False
define gui.choice_button_borders = Borders(gui.scale(100), gui.scale(5), gui.scale(100), gui.scale(5))
define gui.choice_button_text_font = gui.default_font
define gui.choice_button_text_size = gui.text_size
define gui.choice_button_text_xalign = 0.5
define gui.choice_button_text_idle_color = "#cccccc"
define gui.choice_button_text_hover_color = "#ffffff"
## File Slot Buttons ###########################################################
##
## 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.
## The save slot button.
define gui.slot_button_width = gui.scale(276)
define gui.slot_button_height = gui.scale(206)
define gui.slot_button_borders = Borders(gui.scale(10), gui.scale(10), gui.scale(10), gui.scale(10))
define gui.slot_button_text_size = gui.scale(14)
define gui.slot_button_text_xalign = 0.5
define gui.slot_button_text_idle_color = gui.idle_small_color
## The width and height of thumbnails used by the save slots.
define config.thumbnail_width = gui.scale(256)
define config.thumbnail_height = gui.scale(144)
## The number of columns and rows in the grid of save slots.
define gui.file_slot_cols = 3
define gui.file_slot_rows = 2
## Positioning and Spacing #####################################################
##
## These variables control the positioning and spacing of various user interface
## elements.
## The position of the left side of the navigation buttons, relative
## to the left side of the screen.
define gui.navigation_xpos = gui.scale(40)
## The vertical position of the skip indicator.
define gui.skip_ypos = gui.scale(10)
## The vertical position of the notify screen.
define gui.notify_ypos = gui.scale(45)
## The spacing between menu choices.
define gui.choice_spacing = gui.scale(22)
## Buttons in the navigation section of the main and game menus.
define gui.navigation_spacing = gui.scale(4)
## Controls the amount of spacing between preferences.
define gui.pref_spacing = gui.scale(10)
## Controls the amount of spacing between preference buttons.
define gui.pref_button_spacing = gui.scale(0)
## The spacing between file page buttons.
define gui.page_spacing = gui.scale(0)
## The spacing between file slots.
define gui.slot_spacing = gui.scale(10)
## Frames ######################################################################
##
## These variables control the look of frames that can contain user interface
## components when an overlay or window is not present.
## Generic frames that are introduced by player code.
define gui.frame_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
## The frame that is used as part of the confirm screen.
define gui.confirm_frame_borders = Borders(gui.scale(40), gui.scale(40), gui.scale(40), gui.scale(40))
## The frame that is used as part of the skip screen.
define gui.skip_frame_borders = Borders(gui.scale(16), gui.scale(5), gui.scale(50), gui.scale(5))
## The frame that is used as part of the notify screen.
define gui.notify_frame_borders = Borders(gui.scale(16), gui.scale(5), gui.scale(40), gui.scale(5))
## Should frame backgrounds be tiled?
define gui.frame_tile = False
## Bars, Scrollbars, and Sliders ###############################################
##
## These control the look and size of bars, scrollbars, and sliders.
##
## The default GUI only uses sliders and vertical scrollbars.
## All of the other bars are only used in creator-written code.
## The height of horizontal bars, scrollbars, and sliders. The width of
## vertical bars, scrollbars, and sliders.
define gui.bar_size = gui.scale(36)
define gui.scrollbar_size = gui.scale(12)
define gui.slider_size = gui.scale(30)
## True if bar images should be tiled. False if they should be linearly scaled.
define gui.bar_tile = False
define gui.scrollbar_tile = False
define gui.slider_tile = False
## Horizontal borders.
define gui.bar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
define gui.scrollbar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
define gui.slider_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
## Vertical borders.
define gui.vbar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
define gui.vscrollbar_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
define gui.vslider_borders = Borders(gui.scale(4), gui.scale(4), gui.scale(4), gui.scale(4))
## What to do with unscrollable scrollbars in the gui. "hide" hides them, while
## None shows them.
define gui.unscrollable = "hide"
## History #####################################################################
##
## The history screen displays dialogue that the player has already dismissed.
## The number of blocks of dialogue history Ren'Py will keep.
define config.history_length = 250
## The height of a history screen entry, or None to make the height variable
## at the cost of performance.
define gui.history_height = gui.scale(140)
## The position, width, and alignment of the label giving the name of the
## speaking character.
define gui.history_name_xpos = 150
define gui.history_name_ypos = 0
define gui.history_name_width = gui.scale(150)
define gui.history_name_xalign = 1.0
## The position, width, and alignment of the dialogue text.
define gui.history_text_xpos = gui.scale(170)
define gui.history_text_ypos = gui.scale(5)
define gui.history_text_width = gui.scale(740)
define gui.history_text_xalign = 0.0
## NVL-Mode ###################################################################
##
## The NVL-mode screen displays the dialogue spoken by NVL-mode characters.
## The borders of the background of the NVL-mode background window.
define gui.nvl_borders = Borders(0, gui.scale(10), 0, gui.scale(20))
## The height of an NVL-mode entry. Set this to None to have the entries
## dynamically adjust height.
define gui.nvl_height = gui.scale(115)
## The spacing between NVL-mode entries when gui.nvl_height is None, and
## between NVL-mode entries and an NVL-mode menu.
define gui.nvl_spacing = gui.scale(10)
## The position, width, and alignment of the label giving the name of the
## speaking character.
define gui.nvl_name_xpos = gui.scale(430)
define gui.nvl_name_ypos = 0
define gui.nvl_name_width = gui.scale(150)
define gui.nvl_name_xalign = 1.0
## The position, width, and alignment of the dialogue text.
define gui.nvl_text_xpos = gui.scale(450)
define gui.nvl_text_ypos = gui.scale(8)
define gui.nvl_text_width = gui.scale(590)
define gui.nvl_text_xalign = 0.0
## The position, width, and alignment of nvl_thought text (the text said by
## the nvl_narrator character.)
define gui.nvl_thought_xpos = gui.scale(240)
define gui.nvl_thought_ypos = gui.scale(0)
define gui.nvl_thought_width = gui.scale(780)
define gui.nvl_thought_xalign = 0.0
## The position of nvl menu_buttons.
define gui.nvl_button_xpos = gui.scale(450)
define gui.nvl_button_xalign = 0.0
## Localization ################################################################
## 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
define gui.language = "unicode"
################################################################################
## Mobile devices
################################################################################
init python:
## This increases the size of the quick buttons to make them easier to
## touch on tablets and phones.
if renpy.variant("touch"):
gui.quick_button_borders = Borders(gui.scale(40), gui.scale(14), gui.scale(40), gui.scale(0))
## This changes the size and spacing of various GUI elements to ensure
## they are easily visible on phones.
if renpy.variant("small"):
## Font sizes.
gui.text_size = gui.scale(30)
gui.name_text_size = gui.scale(36)
gui.notify_text_size = gui.scale(25)
gui.interface_text_size = gui.scale(36)
gui.button_text_size = gui.scale(34)
gui.label_text_size = gui.scale(36)
## Adjust the location of the textbox.
gui.textbox_height = gui.scale(240)
gui.name_xpos = gui.scale(80)
gui.text_xpos = gui.scale(90)
gui.text_width = gui.scale(1100)
## Change the size and spacing of items in the game menu.
gui.choice_button_width = gui.scale(1240)
gui.navigation_spacing = gui.scale(20)
gui.pref_button_spacing = gui.scale(10)
gui.history_height = gui.scale(190)
gui.history_text_width = gui.scale(690)
## File button layout.
gui.file_slot_cols = 2
gui.file_slot_rows = 2
## NVL-mode.
gui.nvl_height = gui.scale(170)
gui.nvl_name_width = gui.scale(305)
gui.nvl_name_xpos = gui.scale(325)
gui.nvl_text_width = gui.scale(915)
gui.nvl_text_xpos = gui.scale(345)
gui.nvl_text_ypos = gui.scale(5)
gui.nvl_thought_width = gui.scale(1240)
gui.nvl_thought_xpos = gui.scale(20)
gui.nvl_button_width = gui.scale(1240)
gui.nvl_button_xpos = gui.scale(20)
## Quick buttons.
gui.quick_button_text_size = gui.scale(20)
+30
View File
@@ -0,0 +1,30 @@
init -100 python in gui:
def scale(n):
return int(n)
init 100 python in gui:
if not renpy.mobile:
from store import config
import sys
import os
sys.path.insert(0, os.path.join(config.renpy_base, "launcher", "game"))
from gui7.parameters import GuiParameters
from gui7.images import ImageGenerator
from gui7 import generate_gui
p = GuiParameters(
config.gamedir, config.gamedir,
config.screen_width, config.screen_height,
accent_color, "#000000", False, None,
True, False, False, "gui")
p.skip_backup = True
generate_gui(p)
_skip_backup = True
_gui_images()
+206
View File
@@ -0,0 +1,206 @@
## This file contains options that can be changed to customize your
## game.
##
## Lines beginning with two '#' marks are comments, and you shouldn't
## uncomment them. Lines beginning with a single '#' mark are
## commented-out code, and you may want to uncomment them when
## appropriate.
## Basics ######################################################################
## A human-readable name of the game. This is used to set the default
## window title, and shows up in the interface and error reports.
##
## The _() surrounding the string marks it as eligible for translation.
define config.name = _("Ren'Py 7 Default GUI")
## Determines if the title given above is shown on the main menu
## screen. Set this to False to hide the title.
define gui.show_name = True
## The version of the game.
define config.version = "1.0"
## Text that is placed on the game's about screen. To insert a blank line
## between paragraphs, write \n\n.
define gui.about = _("")
## A short name for the game used for executables and directories in the
## built distribution. This must be ASCII-only, and must not contain
## spaces, colons, or semicolons.
define build.name = "gui"
## Sounds and music ############################################################
## These three variables control which mixers are shown to the player
## by default. Setting one of these to False will hide the appropriate
## mixer.
define config.has_sound = True
define config.has_music = True
define config.has_voice = True
## To allow the user to play a test sound on the sound or voice channel,
## uncomment a line below and use it to set a sample sound to play.
# define config.sample_sound = "sample-sound.ogg"
# define config.sample_voice = "sample-voice.ogg"
## Uncomment the following line to set an audio file that will be played
## while the player is at the main menu. This file will continue playing
## into the game, until it is stopped or another file is played.
# define config.main_menu_music = "main-menu-theme.ogg"
## Transitions #################################################################
##
## These variables set transitions that are used when certain events occur.
## Each variable should be set to a transition, or None to indicate that
## no transition should be used.
## Entering or exiting the game menu.
define config.enter_transition = dissolve
define config.exit_transition = dissolve
## A transition that is used after a game has been loaded.
define config.after_load_transition = None
## Used when entering the main menu after the game has ended.
define config.end_game_transition = None
## A variable to set the transition used when the game starts
## does not exist. Instead, use a with statement after showing
## the initial scene.
## Window management ###########################################################
##
## This controls when the dialogue window is displayed. If "show", it is always
## displayed. If "hide", it is only displayed when dialogue is present. If
## "auto", the window is hidden before scene statements and shown again
## once dialogue is displayed.
##
## After the game has started, this can be changed with the "window show",
## "window hide", and "window auto" statements.
define config.window = "auto"
## Transitions used to show and hide the dialogue window
define config.window_show_transition = Dissolve(.2)
define config.window_hide_transition = Dissolve(.2)
## Preference defaults #########################################################
## Controls the default text speed. The default, 0, is infinite, while any
## other number is the number of characters per second to type out.
default preferences.text_cps = 0
## The default auto-forward delay. Larger numbers lead to longer waits,
## with 0 to 30 being the valid range.
default preferences.afm_time = 15
## Save directory ##############################################################
##
## Controls the platform-specific place Ren'Py will place the save
## files for this game. The save files will be placed in:
##
## Windows: %APPDATA\RenPy\<config.save_directory>
##
## Macintosh: $HOME/Library/RenPy/<config.save_directory>
##
## Linux: $HOME/.renpy/<config.save_directory>
##
## This generally should not be changed, and if it is, should always be a
## literal string, not an expression.
define config.save_directory = "gui-7"
## Icon ########################################################################
##
## The icon displayed on the taskbar or dock.
define config.window_icon = "gui/window_icon.png"
## Build configuration #########################################################
##
## This section controls how Ren'Py turns your project into distribution
## files.
init python:
## The following functions take file patterns. File patterns are case-
## insensitive, and matched against the path relative to the base
## directory, with and without a leading /. If multiple patterns match,
## the first is used.
##
## In a pattern:
##
## / is the directory separator.
##
## * matches all characters, except the directory separator.
##
## ** matches all characters, including the directory separator.
##
## For example, "*.txt" matches txt files in the base directory, "game/**.ogg"
## matches ogg files in the game directory or any of its subdirectories, and
## "**.psd" matches psd files anywhere in the project.
## Classify files as None to exclude them from the built distributions.
build.classify('**~', None)
build.classify('**.bak', None)
build.classify('**/.**', None)
build.classify('**/#**', None)
build.classify('**/thumbs.db', None)
## To archive files, classify them as 'archive'.
# build.classify('game/**.png', 'archive')
# build.classify('game/**.jpg', 'archive')
## Files matching documentation patterns are duplicated in a mac app
## build, so they appear in both the app and the zip file.
build.documentation('*.html')
build.documentation('*.txt')
## 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.
# define build.google_play_key = "..."
## The username and project name associated with an itch.io project,
## separated by a slash.
# define build.itch_project = "renpytom/test-project"
+1472
View File
File diff suppressed because it is too large Load Diff
+35
View File
@@ -0,0 +1,35 @@
# The script of the game goes in this file.
# Declare characters used by this game. The color argument colorizes the
# name of the character.
define e = Character("Eileen")
# The game starts here.
label start:
# Show a background. This uses a placeholder by default, but you can
# add a file (named either "bg room.png" or "bg room.jpg") to the
# images directory to show it.
scene bg room
# This shows a character sprite. A placeholder is used, but you can
# replace it by adding a file named "eileen happy.png" to the images
# directory.
show eileen happy
# These display lines of dialogue.
"Hello, world."
e "You've created a new Ren'Py game."
e "Once you add a story, pictures, and music, you can release it to the world!"
# This ends the game.
return
+14
View File
@@ -0,0 +1,14 @@
testcase default:
"Start"
pause .6
# Test rollback
"Hello, World."
"Back"
# Test history.
click
click
"History"
+1
View File
@@ -0,0 +1 @@
{ "type" : "hidden" }
+148 -102
View File
@@ -2,131 +2,177 @@
<head>
<title>README</title>
<style>
BODY {
background: #fff;
color: #444;
padding-left: 20%;
padding-top: 1em;
padding-bottom: 1em;
padding-right: 20%;
font-family: sans-serif;
line-height: 1.6em;
background: #fff;
color: #444;
padding-left: 20%;
padding-top: 1em;
padding-bottom: 1em;
padding-right: 20%;
font-family: sans-serif;
line-height: 1.6em;
}
DT {
font-weight: bold;
margin-top: .33em;
font-weight: bold;
margin-top: .33em;
}
H2 {
color: #000;
margin-left: -2.5em;
color: #000;
margin-left: -2.5em;
}
H3 {
color: #000;
margin-left: -1.5em;
color: #000;
margin-left: -1.5em;
}
.editsection {
display: none;
display: none;
}
</style>
</head>
<body>
<div id="renpy_help"></div>
<h2>Basic Help</h2>
<p>
To advance through the game, <tt>left-click</tt> or press the <tt>space</tt> or <tt>enter</tt> keys. When at a menu,
<tt>left-click</tt> to make a choice, or use the arrow keys to select a choice and <tt>enter</tt> to activate it.
</p>
<h3>Game Menu</h3>
<p>
When playing a game, <tt>right-click</tt> or press the <tt>escape</tt> key to enter the game menu. The game menu
gives the following choices:
</p>
<dl>
<dt>Return</dt>
<dd>Returns to the game.</dd>
<dt>Save Game</dt>
<dd>Allows you to save a game by clicking on a save slot.</dd>
<dt>Load Game</dt>
<dd>Allows you to load a game by clicking on a save slot. Clicking on "Auto" accesses the automatic save slots.</dd>
<dt>Preferences</dt>
<dd>
Changes the game preferences (options/configuration):
<dl>
<dt>Display</dt>
<dd>Switches between fullscreen and windowed mode.</dd>
<dt>Transitions</dt>
<dd>Controls the display of transitions between game screens.</dd>
<dt>Text Speed</dt>
<dd>Controls the rate at which text displays. The further to the right this slider is, the faster the text
will display. All the way to the right causes text to be shown instantly.</dd>
<dt>Joystick</dt>
<dd>Lets you control the game using a joystick.</dd>
<dt>Skip</dt>
<dd>Chooses between skipping messages that have been already seen (in any play through the game), and
skipping all messages.</dd>
<dt>Begin Skipping</dt>
<dd>Returns to the game, while skipping.</dd>
<dt>After Choices</dt>
<dd>Controls if skipping stops upon reaching a menu.</dd>
<dt>Auto-Forward Time</dt>
<dd>Controls automatic advance. The further to the left this slider is, the shorter the amount of time
before the game advances. All the way to the right means text will never auto-forward.</dd>
<dt>Music, Sound, and Voice Volume</dt>
<dd>Controls the volume of the Music, Sound effect, and Voice channels, respectively. The further to the
right these are, the louder the volume.</dd>
</dl>
</dd>
<dt>Main Menu</dt>
<dd>Returns to the main menu, ending the current game.</dd>
<dt>Help</dt>
<dd>Shows this help screen.</dd>
<dt>Quit</dt>
<dd>Exits the game; the game will be closed and ended.</dd>
</dl>
<h3>Key and Mouse Bindings</h3>
<dl>
<dt>Left-click, Enter</dt>
<dd>Advances through the game, activates menu choices, buttons, and sliders.</dd>
<dt>Space</dt>
<dd>Advances through the game, but does not activate choices.</dd>
<dt>Arrow Keys</dt>
<dd>Navigates between menu choices, buttons, and sliders.</dd>
<dt>Ctrl</dt>
<dd>Causes skipping to occur while the ctrl key is held down.</dd>
<dt>Tab</dt>
<dd>Toggles skipping, causing it to occur until tab is pressed again.</dd>
<dt>Mousewheel-Up, PageUp</dt>
<dd>Causes rollback to occur. Rollback reverses the game back in time, showing prior text and even allowing
menu choices to be changed.</dd>
<dt>Mousewheel-Down, PageDown</dt>
<dd>Causes rollforward to occur, canceling out a previous rollback.</dd>
<dt>Right-click, Escape</dt>
<dd>Enters the game menu. When in the game menu, returns to the game.</dd>
<dt>Middle-click, H</dt>
<dd>Hides the text window and other transient displays.</dd>
<dt>F</dt>
<dd>Toggles fullscreen mode</dd>
<dt>S</dt>
<dd>Takes a screenshot, saving it in a file named screenshotxxxx.png, where xxxx is a serial number.</dd>
<dt>Alt-M, Command-H</dt>
<dd>Hides (iconifies) the window.</dd>
<dt>Alt-F4, Command-Q</dt>
<dd>Quits the game.</dd>
<dt>Delete</dt>
<dd>When a save slot is selected, deletes that save slot.</dd>
<dt>v</dt>
<dd>
Toggles self-voicing mode, which reads text to the user using an os-supplied speech synthesizer. For more
information, please read the <a href="http://www.renpy.org/doc/html/self_voicing.html">self-voicing</a>
documentation.
</dd>
<dt>Shift+C</dt>
<dd>Toggles clipboard-voicing mode, which copies text to the clipboard so it can be read by a screen reader.</dd>
</dl>
<p><a name="Basic_Help" id="Basic_Help"></a></p>
<h2><span class="editsection">[<a href="/w/index.php?title=renpy/Help&amp;action=edit&amp;section=1" title="Edit section: Basic Help">edit</a>]</span> <span class="mw-headline">Basic Help</span></h2>
<p>To advance through the game, <tt>left-click</tt> or press the <tt>space</tt> or <tt>enter</tt> keys. When at a menu, <tt>left-click</tt> to make a choice, or use the arrow keys to select a choice and <tt>enter</tt> to activate it.</p>
<p><a name="Game_Menu" id="Game_Menu"></a></p>
<h3><span class="editsection">[<a href="/w/index.php?title=renpy/Help&amp;action=edit&amp;section=2" title="Edit section: Game Menu">edit</a>]</span> <span class="mw-headline">Game Menu</span></h3>
<p>When playing a game, <tt>right-click</tt> or press the <tt>escape</tt> key to enter the game menu. The game menu gives the following choices:</p>
<dl>
<dt>Return</dt>
<dd>Returns to the game.</dd>
<dt>Save Game</dt>
<dd>Allows you to save a game by clicking on a save slot.</dd>
<dt>Load Game</dt>
<dd>Allows you to load a game by clicking on a save slot. Clicking on "Auto" accesses the automatic save slots.</dd>
<dt>Preferences</dt>
<dd>Changes the game preferences (options/configuration):
<dl>
<dt>Display</dt>
<dd>Switches between fullscreen and windowed mode.</dd>
<dt>Transitions</dt>
<dd>Controls the display of transitions between game screens.</dd>
<dt>Text Speed</dt>
<dd>Controls the rate at which text displays. The further to the right this slider is, the faster the text will display. All the way to the right causes text to be shown instantly.</dd>
<dt>Joystick</dt>
<dd>Lets you control the game using a joystick.</dd>
<dt>Skip</dt>
<dd>Chooses between skipping messages that have been already seen (in any play through the game), and skipping all messages.</dd>
<dt>Begin Skipping</dt>
<dd>Returns to the game, while skipping.</dd>
<dt>After Choices</dt>
<dd>Controls if skipping stops upon reaching a menu.</dd>
<dt>Auto-Forward Time</dt>
<dd>Controls automatic advance. The further to the left this slider is, the shorter the amount of time before the game advances. All the way to the right means text will never auto-forward.</dd>
<dt>Music, Sound, and Voice Volume</dt>
<dd>Controls the volume of the Music, Sound effect, and Voice channels, respectively. The further to the right these are, the louder the volume.</dd>
</dl>
</dd>
</dl>
<dl>
<dt>Main Menu</dt>
<dd>Returns to the main menu, ending the current game.</dd>
<dt>Help</dt>
<dd>Shows this help screen.</dd>
<dt>Quit</dt>
<dd>Exits the game; the game will be closed and ended.</dd>
</dl>
<p><a name="Key_and_Mouse_Bindings" id="Key_and_Mouse_Bindings"></a></p>
<h3><span class="editsection">[<a href="/w/index.php?title=renpy/Help&amp;action=edit&amp;section=3" title="Edit section: Key and Mouse Bindings">edit</a>]</span> <span class="mw-headline">Key and Mouse Bindings</span></h3>
<dl>
<dt>Left-click, Enter</dt>
<dd>Advances through the game, activates menu choices, buttons, and sliders.</dd>
<dt>Space</dt>
<dd>Advances through the game, but does not activate choices.</dd>
<dt>Arrow Keys</dt>
<dd>Selects menu choices, buttons, and sliders.</dd>
<dt>Ctrl</dt>
<dd>Causes skipping to occur while the ctrl key is held down.</dd>
<dt>Tab</dt>
<dd>Toggles skipping, causing it to occur until tab is pressed again.</dd>
<dt>Mousewheel-Up, PageUp</dt>
<dd>Causes rollback to occur. Rollback reverses the game back in time, showing prior text and even allowing menu choices to be changed.</dd>
<dt>Mousewheel-Down, PageDown</dt>
<dd>Causes rollforward to occur, cancelling out a previous rollback.</dd>
<dt>Right-click, Escape</dt>
<dd>Enters the game menu. When in the game menu, returns to the game.</dd>
<dt>Middle-click, H</dt>
<dd>Hides the text window and other transient displays.</dd>
<dt>F</dt>
<dd>Toggles fullscreen mode</dd>
<dt>S</dt>
<dd>Takes a screenshot, saving it in a file named screenshotxxxx.png, where xxxx is a serial number.</dd>
<dt>Alt-M, Command-H</dt>
<dd>Hides (iconifies) the window.</dd>
<dt>Alt-F4, Command-Q</dt>
<dd>Quits the game.</dd>
<dt>Delete</dt>
<dd>When a save slot is selected, deletes that save slot.</dd>
<dt>v</dt>
<dd>Toggles self-voicing mode, which reads text to the user using an os-supplied
speech synthesizer. For more information, please read the <a href="http://www.renpy.org/dev-doc/html/self_voicing.html">self-voicing</a>
documentation.</dd>
</dl>
<p><a name="Legal_Notice" id="Legal_Notice"></a></p>
<h2><span class="editsection">[<a href="/w/index.php?title=renpy/Help&amp;action=edit&amp;section=4" title="Edit section: Legal Notice">edit</a>]</span> <span class="mw-headline">Legal Notice</span></h2>
<p>This game uses source code from a number of open source projects. For a list, and a location where the source code can be downloaded from, please view the LICENSE.txt file in the renpy directory, or visit <a href="http://www.renpy.org/wiki/renpy/License" class="external free" title="http://www.renpy.org/wiki/renpy/License" rel="nofollow">http://www.renpy.org/wiki/renpy/License</a> .</p>
<h3>Controller Support and Bindings</h3>
<p>
This game should automatically detect and use game controllers supported by
SDL2. Other controllers can be configured using third-party configuration tools
like the <a href="http://www.generalarcade.com/gamepadtool/">SDL2 Gampad Tool</a>
</p>
<p>
A small number of systems may have problems using detected game controllers. Should
that happen, hold down shift as the game starts, and disable the controller support.
</p>
<p>The following bindings are used:</p>
<dl>
<dt>Right Trigger, A (Bottom Button)</dt>
<dd>Advances through the game, activates menu choices, buttons, and sliders.</dd>
<dt>Guide, Start</dt>
<dd>Enters the game menu. When in the game menu, returns to the game.</dd>
<dt>Directional Pad, Analog Sticks</dt>
<dd>Navigates between menu choices, buttons, and sliders.</dd>
<dt>Left Trigger, Left Shoulder, Back</dt>
<dd>Causes rollback to occur. Rollback reverses the game back in time, showing prior text and even allowing
menu choices to be changed.</dd>
<dt>Right Shoulder</dt>
<dd>Causes rollforward to occur, canceling out a previous rollback.</dd>
<dt>Y (Top Button)</dt>
<dd>Hides the text window and other transient displays.</dd>
</dl>
<h2>Legal Notice</h2>
<p>
This program contains free software licensed under a number of licenses, including the GNU Lesser Public License. A
complete list of software is available at <a href="http://www.renpy.org/doc/html/license.html">http://www.renpy.org/doc/html/license.html</a>.
</p>
</body>
</html>
+2 -1
View File
@@ -20,6 +20,7 @@ Based upon STDWIN dialogs with the same names and functions.
"""
from __future__ import division
from __future__ import print_function
import os
@@ -1029,7 +1030,7 @@ def test():
argv = GetArgv(optionlist=optionlist, commandlist=commandlist, addoldfile=0)
Message("Command line: %s"%' '.join(argv))
for i in range(len(argv)):
print 'arg[%d] = %r' % (i, argv[i])
print(('arg[%d] = %r' % (i, argv[i])))
ok = AskYesNoCancel("Do you want to proceed?")
ok = AskYesNoCancel("Do you want to identify?", yes="Identify", no="No")
if ok > 0:
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -42,7 +42,7 @@ screen about:
textbutton _("View license") action interface.OpenLicense() xalign 0.5
textbutton _("Back") action Jump("front_page") style "l_left_button"
textbutton _("Return") action Jump("front_page") style "l_left_button"
label about:
call screen about
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
+110 -216
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -43,15 +43,18 @@ init python:
PLAY_KEYS_TEXT = _("Opens the file containing the Google Play keys in the editor.\n\nThis is only needed if the application is using an expansion APK. Read the documentation for more details.")
BUILD_TEXT = _("Builds the Android package.")
BUILD_AND_INSTALL_TEXT = _("Builds the Android package, and installs it on an Android device connected to your computer.")
BUILD_INSTALL_AND_LAUNCH_TEXT = _("Builds the Android package, installs it on an Android device connected to your computer, then launches the app on your device.")
CONNECT_TEXT = _("Connects to an Android device running ADB in TCP/IP mode.")
DISCONNECT_TEXT = _("Disconnects from an Android device running ADB in TCP/IP mode.")
LOGCAT_TEXT = _("Retrieves the log from the Android device and writes it to a file.")
import subprocess
import re
import os
import json
import glob
def find_rapt():
@@ -61,12 +64,11 @@ init python:
RAPT_PATH = os.path.join(config.renpy_base, "rapt")
if os.path.isdir(RAPT_PATH):
if os.path.isdir(RAPT_PATH) and check_hash_txt("rapt"):
import sys
sys.path.insert(0, os.path.join(RAPT_PATH, "buildlib"))
else:
RAPT_PATH = None
RAPT_PATH is None
find_rapt()
@@ -79,6 +81,8 @@ init python:
import rapt.install_sdk
import rapt.plat
import rapt.interface
rapt.plat.renpy = True
else:
rapt = None
@@ -91,7 +95,7 @@ init python:
return ANDROID_NO_RAPT
if renpy.windows and not "JAVA_HOME" in os.environ:
return ANDROID_NO_JDK
if not os.path.exists(rapt.plat.path("android-sdk/extras/google/play_licensing")):
if not os.path.exists(rapt.plat.path("android-sdk/platforms/" + rapt.plat.target)):
return ANDROID_NO_SDK
if not os.path.exists(rapt.plat.path("android.keystore")):
return ANDROID_NO_KEY
@@ -131,184 +135,6 @@ init python:
else:
return None
class AndroidInterface(object):
def __init__(self):
self.process = None
self.filename = project.current.temp_filename("android.txt")
self.info_msg = ""
with open(self.filename, "w"):
pass
def log(self, msg):
with open(self.filename, "a") as f:
f.write("\n")
f.write(msg)
f.write("\n")
def info(self, prompt):
self.info_msg = prompt
interface.processing(prompt, pause=False)
self.log(prompt)
def yesno(self, prompt, submessage=None):
return interface.yesno(prompt, submessage=submessage)
def yesno_choice(self, prompt, default=None):
choices = [ (True, "Yes"), (False, "No") ]
return interface.choice(prompt, choices, default)
def terms(self, url, prompt):
submessage = _("{a=%s}%s{/a}") % (url, url)
if not interface.yesno(prompt, submessage=submessage):
self.fail("You must accept the terms and conditions to proceed.", edit=False)
def input(self, prompt, empty=None):
if empty is None:
empty = ''
while True:
rv = interface.input(_("QUESTION"), prompt, default=empty, cancel=Jump("android"))
rv = rv.strip()
if rv:
return rv
def choice(self, prompt, choices, default):
return interface.choice(prompt, choices, default, cancel=Jump("android"))
def fail(self, prompt, edit=True):
self.log(prompt)
prompt = re.sub(r'(http://\S+)', r'{a=\1}\1{/a}', prompt)
# Open android.txt in the editor.
if edit:
editor.EditAbsolute(self.filename)()
interface.error(prompt, label="android")
def success(self, prompt):
self.log(prompt)
interface.info(prompt, pause=False)
def final_success(self, prompt):
self.log(prompt)
interface.info(prompt, label="android")
def run_yes_thread(self):
import time
try:
while self.run_yes:
self.process.stdin.write('y\n')
self.process.stdin.flush()
time.sleep(.2)
except:
import traceback
traceback.print_exc()
def call(self, cmd, cancel=False, use_path=False, yes=False):
print
print " ".join(cmd)
self.cmd = cmd
f = open(self.filename, "a")
f.write("\n\n\n")
if cancel:
cancel_action = self.cancel
else:
cancel_action = None
startupinfo = None
if renpy.windows:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
self.yes_thread = None
try:
interface.processing(self.info_msg, show_screen=True, cancel=cancel_action)
kwargs = { }
if yes:
kwargs["stdin"] = subprocess.PIPE
try:
self.process = subprocess.Popen(cmd, cwd=RAPT_PATH, stdout=f, stderr=f, startupinfo=startupinfo, **kwargs)
except:
import traceback
traceback.print_exc(file=f)
raise
if yes:
import threading
self.run_yes = True
self.yes_thread = threading.Thread(target=self.run_yes_thread)
self.yes_thread.daemon = True
self.yes_thread.start()
renpy.call_screen("android_process", interface=self)
finally:
f.close()
interface.hide_screen()
if yes and self.yes_thread:
self.run_yes = False
self.yes_thread.join()
self.process = None
self.yes_thread = None
def check_process(self):
rv = self.process.poll()
if rv is not None:
if rv:
raise subprocess.CalledProcessError(rv, self.cmd)
else:
return True
def download(self, url, dest):
try:
d = Downloader(url, dest)
cancel_action = [ d.cancel, Jump("android") ]
interface.processing(self.info_msg, show_screen=True, cancel=cancel_action, bar_value=DownloaderValue(d))
ui.timer(.1, action=d.check, repeat=True)
ui.interact()
finally:
interface.hide_screen()
def background(self, f):
try:
t = threading.Thread(target=f)
t.start()
interface.processing(self.info_msg, show_screen=True)
while t.is_alive():
renpy.pause(0)
t.join(0.25)
finally:
interface.hide_screen()
def cancel(self):
if self.process:
self.process.terminate()
renpy.jump("android")
class AndroidBuild(Action):
"""
@@ -321,22 +147,6 @@ init python:
def __call__(self):
renpy.jump(self.label)
class LaunchEmulator(Action):
def __init__(self, emulator, variants):
self.emulator = emulator
self.variants = variants
def __call__(self):
env = {
"RENPY_EMULATOR" : self.emulator,
"RENPY_VARIANT" : self.variants,
}
p = project.current
p.launch(env=env)
def update_android_json(p, gui):
"""
Updates .android.json to include the google play information.
@@ -372,7 +182,7 @@ init python:
with open(filename, "w") as f:
json.dump(android_json, f)
def android_build(command, p=None, gui=True):
def android_build(command, p=None, gui=True, launch=False, destination=None, opendir=False):
"""
This actually builds the package.
"""
@@ -389,7 +199,7 @@ init python:
if gui:
reporter = distribute.GuiReporter()
rapt_interface = AndroidInterface()
rapt_interface = MobileInterface("android")
else:
reporter = distribute.TextReporter()
rapt_interface = rapt.interface.Interface()
@@ -403,8 +213,57 @@ init python:
report_success=False,
)
def finished(files, destination=destination):
source_dir = rapt.plat.path("bin")
try:
destination_dir = destination
# Use default destination if not configured
if gui and destination is None:
build = p.dump['build']
destination = build["destination"]
if destination != "-dists":
parent = os.path.dirname(p.path)
destination_dir = os.path.join(parent, destination)
except:
destination_dir = None
dir_to_open = source_dir
if destination_dir is not None:
reporter.info(_("Copying Android files to distributions directory."))
try:
os.makedirs(destination_dir)
except:
pass
try:
for i in files:
shutil.copy(i, renpy.fsencode(destination_dir))
dir_to_open = destination_dir
except:
import traceback
traceback.print_exc()
pass
if opendir:
store.OpenDirectory(dir_to_open)()
with interface.nolinks():
rapt.build.build(rapt_interface, dist, command)
rapt.build.build(rapt_interface, dist, command, launch=launch, finished=finished)
# The android support can stick unicode into os.environ. Fix that.
init 100 python:
@@ -468,18 +327,19 @@ screen android:
frame style "l_indent":
has vbox
has hbox:
spacing 15
textbutton _("Phone"):
action LaunchEmulator("touch", "small phone touch android")
action LaunchEmulator("touch", "small phone touch android mobile")
hovered tt.Action(PHONE_TEXT)
textbutton _("Tablet"):
action LaunchEmulator("touch", "medium tablet touch android")
action LaunchEmulator("touch", "medium tablet touch android mobile")
hovered tt.Action(TABLET_TEXT)
textbutton _("Television / OUYA"):
action LaunchEmulator("tv", "small tv ouya android")
textbutton _("Television"):
action LaunchEmulator("tv", "small tv android mobile")
hovered tt.Action(OUYA_TEXT)
@@ -514,6 +374,10 @@ screen android:
action AndroidIfState(state, ANDROID_OK, AndroidBuild("android_build_and_install"))
hovered tt.Action(BUILD_AND_INSTALL_TEXT)
textbutton _("Build, Install & Launch"):
action AndroidIfState(state, ANDROID_OK, AndroidBuild("android_build_install_and_launch"))
hovered tt.Action(BUILD_INSTALL_AND_LAUNCH_TEXT)
add SPACER
add SEPARATOR2
@@ -537,6 +401,10 @@ screen android:
action AndroidIfState(state, ANDROID_OK, Jump("android_disconnect"))
hovered tt.Action(DISCONNECT_TEXT)
textbutton _("Logcat"):
action AndroidIfState(state, ANDROID_NO_KEY, Jump("logcat"))
hovered tt.Action(LOGCAT_TEXT)
# Right side.
frame:
@@ -560,7 +428,7 @@ screen android:
text AndroidStateText(state)
textbutton _("Back") action Jump("front_page") style "l_left_button"
textbutton _("Return") action Jump("front_page") style "l_left_button"
label android:
@@ -576,7 +444,7 @@ label android_installsdk:
python:
with interface.nolinks():
rapt.install_sdk.install_sdk(AndroidInterface())
rapt.install_sdk.install_sdk(MobileInterface("android"))
jump android
@@ -584,14 +452,20 @@ label android_installsdk:
label android_configure:
python:
rapt.configure.configure(AndroidInterface(), project.current.path)
project.current.update_dump(force=True)
rapt.configure.configure(
MobileInterface("android", edit=False),
project.current.path,
default_name=project.current.dump.get("name", None),
default_version=project.current.dump.get("version", None))
jump android
label android_build:
$ android_build([ 'release' ])
$ android_build([ 'release' ], opendir=True)
jump android
@@ -602,6 +476,13 @@ label android_build_and_install:
jump android
label android_build_install_and_launch:
$ android_build([ 'release', 'install' ], launch=True)
jump android
label android_connect:
python hide:
@@ -641,7 +522,7 @@ label android_connect:
persistent.connect_address = address
rapt_interface = AndroidInterface()
rapt_interface = MobileInterface("android")
rapt.build.connect(rapt_interface, address)
jump android
@@ -650,23 +531,36 @@ label android_disconnect:
python hide:
rapt_interface = AndroidInterface()
rapt_interface = MobileInterface("android")
rapt.build.disconnect(rapt_interface)
jump android
label logcat:
python hide:
interface = MobileInterface("android", filename="logcat.txt")
interface.info(_("Retrieving logcat information from device."))
interface.call([ rapt.plat.adb, "logcat", "-d" ], cancel=True)
interface.open_editor()
jump android
init python:
def android_build_command():
ap = renpy.arguments.ArgumentParser()
ap.add_argument("project", help="The path to the project directory.")
ap.add_argument("command", help="Commands to pass to ant. (Try 'release' 'install'.)", nargs='+')
ap.add_argument("android_project", help="The path to the project directory.")
ap.add_argument("ant_commands", help="Commands to pass to ant. (Try 'release' 'install'.)", nargs='+')
ap.add_argument("--launch", action="store_true", help="Launches the app after build and install compete.")
ap.add_argument("--destination", "--dest", default=None, action="store", help="The directory where the packaged files should be placed.")
args = ap.parse_args()
p = project.Project(args.project)
p = project.Project(args.android_project)
android_build(args.command, p=p, gui=False)
android_build(args.ant_commands, p=p, gui=False, launch=args.launch, destination=args.destination)
return False
+5 -5
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -48,7 +48,7 @@ init python in archiver:
# A fixed key minimizes difference between archive versions.
self.key = 0x42424242
padding = "RPA-3.0 XXXXXXXXXXXXXXXX XXXXXXXX\n"
padding = b"RPA-3.0 XXXXXXXXXXXXXXXX XXXXXXXX\n"
self.f.write(padding)
def add(self, name, path):
@@ -63,14 +63,14 @@ init python in archiver:
dlen = len(data)
# Pad.
padding = "Made with Ren'Py."
padding = b"Made with Ren'Py."
self.f.write(padding)
offset = self.f.tell()
self.f.write(data)
self.index[name].append((offset ^ self.key, dlen ^ self.key, ""))
self.index[name].append((offset ^ self.key, dlen ^ self.key, b""))
def close(self):
@@ -79,7 +79,7 @@ init python in archiver:
self.f.write(dumps(self.index, HIGHEST_PROTOCOL).encode("zlib"))
self.f.seek(0)
self.f.write("RPA-3.0 %016x %08x\n" % (indexoff, self.key))
self.f.write(b"RPA-3.0 %016x %08x\n" % (indexoff, self.key))
self.f.close()
+31 -22
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -23,13 +23,17 @@
# http://www.csn.ul.ie/~caolan/publink/winresdump/winresdump/doc/pefile.html
# Contains a reasonable description of the format.
from __future__ import print_function
import struct
import sys
import array
import pefile # @UnresolvedImport
import pefile # @UnresolvedImport
# This class performs various operations on memory-loaded binary files,
# including modifications.
class BinFile(object):
def set_u32(self, addr, value):
@@ -74,11 +78,11 @@ class BinFile(object):
def tostring(self):
return self.a.tostring()
def substring(self, start, len): #@ReservedAssignment
def substring(self, start, len): # @ReservedAssignment
return self.a[start:start+len].tostring()
def __init__(self, data):
self.a = array.array('B')
self.a = array.array(b'B')
self.a.fromstring(data)
##############################################################################
@@ -89,6 +93,8 @@ class BinFile(object):
resource_virtual = 0
# This parses a data block out of the resources.
def parse_data(bf, offset):
bf.seek(offset)
data_offset = bf.u32()
@@ -102,16 +108,18 @@ def parse_data(bf, offset):
for _i in range(data_len):
l.append(chr(bf.u8()))
return (code_page, "".join(l))
return (code_page, b"".join(l))
# This parses a resource directory.
def parse_directory(bf, offset):
bf.seek(offset)
char = bf.u32() #@UnusedVariable
timedate = bf.u32() #@UnusedVariable
major = bf.u16() #@UnusedVariable
minor = bf.u16() #@UnusedVariable
char = bf.u32() # @UnusedVariable
timedate = bf.u32() # @UnusedVariable
major = bf.u16() # @UnusedVariable
minor = bf.u16() # @UnusedVariable
n_named = bf.u16()
n_id = bf.u16()
@@ -143,32 +151,33 @@ def parse_directory(bf, offset):
def show_resources(d, prefix):
if not isinstance(d, dict):
print prefix, "Codepage", d[0], "length", len(d[1])
print(prefix, "Codepage", d[0], "length", len(d[1]))
return
for k in d:
print prefix, k
print(prefix, k)
show_resources(d[k], prefix + " ")
##############################################################################
# These functions repack the resources into a new resource segment. Here,
# the offset is relative to the start of the resource segment.
class Packer(object):
def pack(self, d):
self.data = ""
self.data = b""
self.data_offset = 0
self.entries = ""
self.entries = b""
self.entries_offset = 0
head = self.pack_dict(d, 0)
self.data = ""
self.data = b""
self.data_offset = len(head) + len(self.entries)
self.entries = ""
self.entries = b""
self.entries_offset = len(head)
return self.pack_dict(d, 0) + self.entries + self.data
@@ -178,7 +187,7 @@ class Packer(object):
l = len(s)
s = s.encode("utf-16le")
self.data += struct.pack("<H", l) + s + "\0\0"
self.data += struct.pack("<H", l) + s + b"\0\0"
return rv
@@ -188,7 +197,7 @@ class Packer(object):
rv = len(self.entries) + self.entries_offset
if len(self.data) % 2:
self.data += "P"
self.data += b"P"
daddr = len(self.data) + self.data_offset
@@ -208,7 +217,7 @@ class Packer(object):
offset += len(rv) + (len(name_entries) + len(id_entries)) * 8
rest = ""
rest = b""
for (name, value) in name_entries + id_entries:
if isinstance(name, unicode):
@@ -229,6 +238,8 @@ class Packer(object):
##############################################################################
# This loads in an icon file, and returns a dictionary that is suitable for
# use in the resources of an exe file.
def load_icon(fn):
f = BinFile(file(fn, "rb").read())
@@ -259,7 +270,6 @@ def load_icon(fn):
rv[3][i + 1] = { 0 : (1252, f.substring(offset, size)) }
group += struct.pack("BBBBHHIH", width, height, colors, reserved,
planes, bpp, size, i + 1)
@@ -279,7 +289,7 @@ def change_icons(oldexe, icofn):
pe = pefile.PE(oldexe)
for s in pe.sections:
if s.Name == ".rsrc\0\0\0":
if s.Name == b".rsrc\0\0\0":
rsrc_section = s
break
else:
@@ -311,7 +321,7 @@ def change_icons(oldexe, icofn):
if len(rsrc) % alignment:
pad = alignment - (len(rsrc) % alignment)
padding = "RENPYVNE" * (pad / 8 + 1)
padding = b"RENPYVNE" * (pad / 8 + 1)
padding = padding[:pad]
rsrc += padding
@@ -346,4 +356,3 @@ if __name__ == "__main__":
f = file(sys.argv[3], "wb")
f.write(change_icons(sys.argv[1], sys.argv[2]))
f.close()
+111
View File
@@ -0,0 +1,111 @@
# Copyright 2004-2016 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.
init python:
def directory_is_writable(path):
test = os.path.join(path, "renpy test do not use")
try:
if os.path.isdir(test):
os.rmdir(test)
os.mkdir(test)
os.rmdir(test)
return True
except:
return False
def choose_directory(path):
"""
Pops up a directory chooser.
`path`
The directory that is selected by default. If None, config.renpy_base
is selected.
Returns a (path, is_default) tuple, where path is the chosen directory,
and is_default is true if and only if it was chosen by default mechanism
rather than user choice.
"""
if path:
default_path = path
else:
try:
default_path = os.path.dirname(os.path.abspath(config.renpy_base))
except:
default_path = os.path.abspath(config.renpy_base)
if EasyDialogs:
choice = EasyDialogs.AskFolder(defaultLocation=default_path, wanted=unicode)
if choice is not None:
path = choice
else:
path = None
else:
try:
cmd = [ "/usr/bin/python", os.path.join(config.gamedir, "tkaskdir.py"), renpy.fsencode(default_path) ]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
choice = p.stdout.read()
code = p.wait()
except:
import traceback
traceback.print_exc()
code = 0
choice = ""
path = None
interface.error(_("Ren'Py was unable to run python with tkinter to choose the directory. Please install the python-tk or tkinter package."), label=None)
if code:
interface.error(_("Ren'Py was unable to run python with tkinter to choose the directory. Please install the python-tk or tkinter package."), label=None)
elif choice:
path = choice.decode("utf-8")
is_default = False
if path is None:
path = default_path
is_default = True
path = renpy.fsdecode(path)
if (not os.path.isdir(path)) or (not directory_is_writable(path)):
interface.error(_("The selected projects directory is not writable."))
path = default_path
is_default = True
if is_default and (not directory_is_writable(path)):
path = os.path.expanduser("~")
return path, is_default
+22 -7
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -345,8 +345,7 @@ init python:
global style_backup
style_backup = renpy.style.backup()
translate None python:
make_style_backup()
config.change_language_callbacks.append(make_style_backup)
screen theme_demo:
@@ -398,9 +397,23 @@ init -2 python:
style.soundtest_button.xalign = 1.0
screen choose_theme:
default scheme_yadjustment = ui.adjustment()
default theme_yadjustment = ui.adjustment()
default first = True
python:
if first:
theme_yinitial_value = theme_yinitial()
scheme_yinitial_value = scheme_yinitial()
else:
theme_yinitial_value = None
scheme_yinitial_value = None
first = False
frame:
style_group "l"
style "l_root"
@@ -426,8 +439,9 @@ screen choose_theme:
viewport:
scrollbars "vertical"
yinitial theme_yinitial()
mousewheel True
yadjustment theme_yadjustment
yinitial theme_yinitial_value
has vbox
@@ -451,7 +465,8 @@ screen choose_theme:
viewport:
scrollbars "vertical"
mousewheel True
yinitial scheme_yinitial()
yadjustment scheme_yadjustment
yinitial scheme_yinitial_value
has vbox
@@ -476,7 +491,7 @@ screen choose_theme:
use theme_demo
textbutton _("Back") action Jump("front_page") style "l_left_button"
textbutton _("Return") action Jump("front_page") style "l_left_button"
textbutton _("Continue") action Return(True) style "l_right_button"
+84
View File
@@ -0,0 +1,84 @@
# Copyright 2004-2016 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.
init python:
class ConsoleCommand():
"""
This runs a series of console commands in an OS-provided
console window. This is done by creating a shell script
or batch file as appropriate, then using an OS-approved
method to run that file.
"""
def __init__(self):
if renpy.macintosh:
fn = "console.command"
nl = "\n"
prefix = "#!/bin/bash"
elif renpy.windows:
fn = "console.bat"
nl = "\r\n"
prefix = "@echo off"
else:
fn = "console.sh"
nl = "\n"
prefix = "#!/bin/bash"
self.fn = project.current.temp_filename(fn)
self.f = open(self.fn, "wb")
self.nl = nl
self.f.write(renpy.fsencode(prefix) + nl)
def add(self, *args):
"""
Adds a command to be run.
"""
args = [ '"{}"'.format(renpy.fsencode(i)) for i in args]
self.f.write(" ".join(args) + self.nl)
def run(self):
"""
Runs the queued up commands.
"""
if renpy.windows:
self.add("pause")
elif renpy.linux:
self.add("echo", "Press enter to close this window...")
self.add("read")
self.f.close()
os.chmod(self.fn, 0o755)
if renpy.windows:
subprocess.Popen([ renpy.fsencode(self.fn) ], console=True)
elif renpy.macintosh:
subprocess.Popen([ "open", "-a", "Terminal", renpy.fsencode(self.fn) ])
else:
subprocess.Popen([ "x-terminal-emulator", "-e", renpy.fsencode(self.fn) ])
interface.interaction(_("INFORMATION"), _("The command is being run in a new operating system console window."), pause=2.5)
+577 -113
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
@@ -50,6 +50,7 @@ init python in distribute:
import re
import plistlib
import time
import shutil
match_cache = { }
@@ -111,6 +112,25 @@ init python in distribute:
return False
def hash_file(fn):
"""
Returns the hash of `fn`.
"""
sha = hashlib.sha256()
with open(renpy.fsencode(fn), "rb") as f:
while True:
data = f.read(8 * 1024 * 1024)
if not data:
break
sha.update(data)
return sha.hexdigest()
class File(object):
"""
Represents a file that we can distribute.
@@ -149,6 +169,31 @@ init python in distribute:
def copy(self):
return File(self.name, self.path, self.directory, self.executable)
def hash(self, hash, distributor):
"""
Update hash with information about this entry.
"""
key = (self.name, self.path, self.directory, self.executable)
hash.update(repr(key))
if self.path is None:
return
if self.directory:
return
if self.name == "update/current.json":
return
if self.path in distributor.hash_cache:
digest = distributor.hash_cache[self.path]
else:
digest = hash_file(self.path)
distributor.hash_cache[self.path] = digest
hash.update(digest)
class FileList(list):
"""
@@ -261,6 +306,67 @@ init python in distribute:
return rv
def mac_lib_transform(self, app, duplicate):
"""
Moves the mac lib into position. If duplicate is set, the
Creates a new file list that has lib/darwin-x86_64 and lib/pythonlib2.7
copied into the mac app, the latter iff it's not duplicated elsewhere.
"""
for f in list(self):
if f.name.startswith("lib/darwin-x86_64/lib/python2.7"):
name = app + "/Contents/MacOS/lib/darwin-x86_64/Lib" + f.name[31:]
elif f.name.startswith("lib/pythonlib2.7") and (not duplicate):
name = app + "/Contents/MacOS/lib/darwin-x86_64/Lib" + f.name[16:]
elif f.name.startswith("lib/darwin-x86_64"):
name = app + "/Contents/MacOS/" + f.name
else:
continue
new = f.copy()
new.name = name
self.append(new)
if not duplicate:
self.remove(f)
self.sort()
def hash(self, distributor):
"""
Returns a hex digest representing this file list.
"""
sha = hashlib.sha256()
for f in sorted(self, key=lambda a : a.name):
f.hash(sha, distributor)
return sha.hexdigest()
def split_by_prefix(self, prefix):
"""
Returns two filelists, one that contains all the files starting with prefix,
and one tht contains all other files.
"""
yes = FileList()
no = FileList()
for f in self:
if f.name.startswith(prefix):
yes.append(f)
else:
no.append(f)
return yes, no
class Distributor(object):
"""
@@ -300,6 +406,23 @@ init python in distribute:
If true, we report that the build succeeded.
"""
# A map from a package to a unique update version hash.
self.update_versions = { }
# Map from destination file with extension to (that file's hash,
# hash of the file list)
self.build_cache = { }
# A map from file to its hash.
self.hash_cache = { }
# A map from a list of file lists and formats to a single integrated
# file list with transforms applied.
self.file_list_cache = { }
# Status reporter.
self.reporter = reporter
if packagedest is not None:
if packages is None or len(packages) != 1:
raise Exception("Packagedest requires a single package be given.")
@@ -318,7 +441,9 @@ init python in distribute:
# dictionaries.
data = project.data
project.update_dump(force=True, gui=False)
self.reporter.info(_("Scanning project files..."))
project.update_dump(force=True, gui=False, compile=project.data['force_recompile'])
if project.dump.get("error", False):
raise Exception("Could not get build data from the project. Please ensure the project runs.")
@@ -350,10 +475,9 @@ init python in distribute:
except:
pass
self.packagedest = packagedest
self.load_build_cache()
# Status reporter.
self.reporter = reporter
self.packagedest = packagedest
self.include_update = build['include_update']
self.build_update = self.include_update and build_update
@@ -382,9 +506,6 @@ init python in distribute:
self.log.close()
return
# add the game.
self.reporter.info(_("Scanning project files..."))
self.scan_and_classify(project.path, build["base_patterns"])
if noarchive:
@@ -399,13 +520,15 @@ init python in distribute:
# Add Python (with the same name as our executables)
self.add_python()
# Build the mac app.
# Build the mac app and windows exes.
self.add_mac_files()
self.add_windows_files()
# Add generated/special files.
if not build['renpy']:
self.add_renpy_files()
self.add_windows_files()
if build['renpy']:
self.add_renpy_distro_files()
else:
self.add_renpy_game_files()
# Assign the x-bit as necessary.
self.mark_executable()
@@ -420,6 +543,7 @@ init python in distribute:
for p in build_packages:
for f in p["formats"]:
self.make_package(
p["name"],
f,
@@ -431,12 +555,14 @@ init python in distribute:
p["name"],
"update",
p["file_lists"],
dlc=False)
dlc=p["dlc"])
if self.build_update:
self.finish_updates(build_packages)
if not packagedest:
self.save_build_cache()
# Finish up.
self.log.close()
@@ -446,8 +572,6 @@ init python in distribute:
if open_directory:
store.OpenDirectory(self.destination)()
def scan_and_classify(self, directory, patterns):
"""
Walks through the `directory`, finds files and directories that
@@ -464,6 +588,11 @@ init python in distribute:
"""
def walk(name, path):
# Ignore ASCII control characters, like (Icon\r on the mac).
if re.search('[\x00-\x19]', name):
return
is_dir = os.path.isdir(path)
if is_dir:
@@ -500,6 +629,48 @@ init python in distribute:
for fn in os.listdir(directory):
walk(fn, os.path.join(directory, fn))
def rescan(self, oldlist, directory):
"""
Scans `directory`, and produces a filelist from it. Returns the
produced filelist.
`oldlist`
Is a filelist. If a file has the xbit set in the oldlist, it
has the xbit set in the new list.
"""
executable = set()
for f in oldlist:
if f.executable:
executable.add(f.name)
rv = FileList()
def walk(name, path):
# Ignore ASCII control characters, like (Icon\r on the mac).
if re.search('[\x00-\x19]', name):
return
is_dir = os.path.isdir(path)
f = File(name, path, is_dir, name in executable)
rv.append(f)
if is_dir:
for fn in os.listdir(path):
walk(
name + "/" + fn,
os.path.join(path, fn),
)
for fn in os.listdir(directory):
walk(fn, os.path.join(directory, fn))
return rv
def temp_filename(self, name):
self.project.make_tmp()
return os.path.join(self.project.tmp, name)
@@ -529,6 +700,20 @@ init python in distribute:
for fl in file_list:
self.file_lists[fl].append(f)
def add_directory(self, file_list, name):
"""
Adds an empty directory to the file lists.
"""
if isinstance(file_list, basestring):
file_list = file_list.split()
f = File(name, None, True, False)
for fl in file_list:
self.file_lists[fl].append(f)
def ignore_archives(self, archives):
"""
Ignore archiving commands by adding the files that would be in
@@ -576,26 +761,58 @@ init python in distribute:
self.add_file(file_list, "game/" + arcfn, arcpath)
def add_renpy_files(self):
def add_renpy_game_files(self):
"""
Add Ren'Py-generic files to the project.
Add Ren'Py file to the game.
"""
SCRIPT_VERSION_RPY = os.path.join(config.gamedir, "script_version.rpy")
SCRIPT_VERSION_RPYC = os.path.join(config.gamedir, "script_version.rpyc")
LICENSE_TXT = os.path.join(config.renpy_base, "LICENSE.txt")
if os.path.exists(SCRIPT_VERSION_RPY):
if not os.path.exists(os.path.join(self.project.path, "game", "script_version.rpy")):
self.add_file("all", "game/script_version.rpy", SCRIPT_VERSION_RPY)
if os.path.exists(SCRIPT_VERSION_RPYC):
if not os.path.exists(os.path.join(self.project.path, "game", "script_version.rpyc")):
self.add_file("all", "game/script_version.rpyc", SCRIPT_VERSION_RPYC)
if os.path.exists(LICENSE_TXT):
self.add_file("renpy", "renpy/LICENSE.txt", LICENSE_TXT)
if (not os.path.exists(os.path.join(self.project.path, "game", "script_version.rpy"))) and \
(not os.path.exists(os.path.join(self.project.path, "game", "script_version.rpyc"))):
script_version_txt = self.temp_filename("script_version.txt")
with open(script_version_txt, "w") as f:
f.write(repr(renpy.renpy.version_tuple[:-1]))
self.add_file("all", "game/script_version.txt", script_version_txt)
def add_file_list_hash(self, list_name):
"""
Hashes a file list, then adds that file to the Ren'Py distribution.
"""
tfn = self.temp_filename(list_name + "_hash.txt")
with open(tfn, "w") as tf:
tf.write(self.file_lists[list_name].hash(self))
self.add_file("binary", "launcher/game/" + list_name + "_hash.txt", tfn)
self.add_file(list_name, list_name + "/hash.txt", tfn)
def add_renpy_distro_files(self):
"""
Add additional files to Ren'Py.
"""
self.add_file_list_hash("rapt")
self.add_file_list_hash("renios")
tmp_fn = self.temp_filename("renpy.py")
with open(os.path.join(config.renpy_base, "renpy.py"), "rb") as f:
data = f.read()
with open(tmp_fn, "wb") as f:
f.write("#!/usr/bin/env python2\n")
f.write(data)
self.add_file("source_only", "renpy.py", tmp_fn, True)
def write_plist(self):
@@ -630,6 +847,9 @@ init python in distribute:
],
)
if self.build.get('allow_integrated_gpu', False):
plist["NSSupportsAutomaticGraphicsSwitching"] = True
rv = self.temp_filename("Info.plist")
plistlib.writePlist(plist, rv)
return rv
@@ -663,10 +883,10 @@ init python in distribute:
os.path.join(config.renpy_base, "lib/darwin-x86_64/pythonw"),
True)
self.add_file(
windows,
"lib/windows-i686/" + self.executable_name + ".exe",
os.path.join(config.renpy_base, "lib/windows-i686/pythonw.exe"))
# self.add_file(
# windows,
# "lib/windows-i686/" + self.executable_name + ".exe",
# os.path.join(config.renpy_base, "lib/windows-i686/renpy.exe"))
def add_mac_files(self):
"""
@@ -680,6 +900,10 @@ init python in distribute:
contents = self.app + "/Contents"
self.add_directory(filelist, self.app)
self.add_directory(filelist, contents)
self.add_directory(filelist, contents + "/MacOS")
plist_fn = self.write_plist()
self.add_file(filelist, contents + "/Info.plist", plist_fn)
self.add_file(filelist, contents + "/MacOS/" + self.executable_name, os.path.join(config.renpy_base, "renpy.sh"))
@@ -692,27 +916,54 @@ init python in distribute:
else:
icon_fn = default_fn
self.add_file(filelist, contents + "/Resources/icon.icns", icon_fn)
resources = contents + "/Resources"
self.add_directory(filelist, resources)
self.add_file(filelist, resources + "/icon.icns", icon_fn)
self.add_directory(filelist, contents + "/MacOS/lib")
self.add_directory(filelist, contents + "/MacOS/lib/darwin-x86_64")
self.add_directory(filelist, contents + "/MacOS/lib/darwin-x86_64/Lib")
self.add_directory(filelist, contents + "/MacOS/lib/darwin-x86_64/Modules")
sfn = self.temp_filename("Setup")
with open(sfn, "wb") as f:
pass
self.add_file(filelist, contents + "/MacOS/lib/darwin-x86_64/Modules/Setup", sfn)
self.file_lists[filelist].mac_lib_transform(self.app, self.build['renpy'])
def add_windows_files(self):
"""
Adds windows-specific files.
"""
if self.build['renpy']:
windows = 'binary'
else:
windows = 'windows'
icon_fn = os.path.join(self.project.path, "icon.ico")
old_exe_fn = os.path.join(config.renpy_base, "renpy.exe")
old_main_fn = os.path.join(config.renpy_base, "lib/windows-i686/renpy.exe")
if os.path.exists(icon_fn):
exe_fn = self.temp_filename("renpy.exe")
main_fn = self.temp_filename("main.exe")
with open(exe_fn, "wb") as f:
f.write(change_icons(old_exe_fn, icon_fn))
with open(main_fn, "wb") as f:
f.write(change_icons(old_main_fn, icon_fn))
else:
exe_fn = old_exe_fn
main_fn = old_main_fn
self.add_file("windows", "renpy.exe", exe_fn)
self.add_file(windows, self.exe, exe_fn)
self.add_file(windows, "lib/windows-i686/" + self.exe, main_fn)
def mark_executable(self):
"""
@@ -737,9 +988,7 @@ init python in distribute:
parts = fn.split('/')
p = parts[0]
if p == "renpy.exe":
p = self.exe
elif p == "renpy.sh":
if p == "renpy.sh":
p = self.sh
elif p == "renpy.py":
p = self.py
@@ -751,6 +1000,137 @@ init python in distribute:
for f in l:
f.name = rename_one(f.name)
def run(self, message, command, **kwargs):
"""
Runs a command.
"""
self.reporter.info(message)
cmd = [ renpy.fsencode(i.format(**kwargs)) for i in command ]
# print "\"" + "\" \"".join(cmd) + "\""
try:
import sys, os
isatty = os.isatty(sys.stdin.fileno())
except:
isatty = False
if isatty:
subprocess.check_call(cmd)
else:
subprocess.check_call(cmd, stdout=self.log, stderr=subprocess.STDOUT)
def sign_app(self, fl, appzip):
"""
Signs the mac app contained in appzip.
"""
identity = self.build.get('mac_identity', None)
if identity is None:
return fl
# Figure out where it goes.
if appzip:
dn = "sign.app-standalone"
else:
dn = "sign.app-crossplatform"
dn = self.temp_filename(dn)
if os.path.exists(dn):
shutil.rmtree(dn)
# Unpack the app.
pkg = DirectoryPackage(dn)
for i, f in enumerate(fl):
self.reporter.progress(_("Unpacking the Macintosh application for signing..."), i, len(fl))
if f.directory:
pkg.add_directory(f.name, f.path)
else:
pkg.add_file(f.name, f.path, f.executable)
pkg.close()
# Sign the mac app.
self.run(
_("Signing the Macintosh application...\n(This may take a long time.)"),
self.build["mac_codesign_command"],
identity=identity,
app=os.path.join(dn, self.app),
)
# Rescan the signed app.
fl = self.rescan(fl, dn)
return fl
def make_dmg(self, volname, sourcedir, dmg):
"""
Packages `sourcedir` as a dmg.
"""
identity = self.build.get('mac_identity', None)
if identity is None:
raise Exception("Creating an unsigned DMG is not supported. Please set build.mac_identity.")
self.run(
_("Creating the Macintosh DMG..."),
self.build["mac_create_dmg_command"],
identity=identity,
volname=volname,
sourcedir=sourcedir,
dmg=dmg,
)
self.run(
_("Signing the Macintosh DMG..."),
self.build["mac_codesign_dmg_command"],
identity=identity,
volname=volname,
sourcedir=sourcedir,
dmg=dmg,
)
def prepare_file_list(self, format, file_lists):
"""
Prepares a master list of files, given the format and file lists.
This also takes care of the mac transforms, and signing the app
if necessary.
"""
macapp = (format in { "app-zip", "app-directory", "app-dmg" })
key = (macapp, tuple(file_lists))
if key in self.file_list_cache:
return self.file_list_cache[key].copy()
fl = FileList.merge([ self.file_lists[i] for i in file_lists ])
fl = fl.copy()
fl.sort()
if self.build.get("exclude_empty_directories", True):
fl = fl.filter_empty()
if macapp:
fl = fl.mac_transform(self.app, self.documentation_patterns)
app, rest = fl.split_by_prefix(self.app)
if app:
app = self.sign_app(app, macapp)
fl = FileList.merge([ app, rest ])
self.file_list_cache[key] = fl
return fl.copy()
def make_package(self, variant, format, file_lists, dlc=False):
"""
Creates a package file in the projects directory.
@@ -760,9 +1140,7 @@ init python in distribute:
part of the file and directory names.
`format`
The format things will be packaged in. This should be one of "zip", "tar.bz2", or
"update".
The format things will be packaged in. See the table of formats below.
`file_lists`
A string containing a space-separated list of file_lists to include in this
package.
@@ -773,15 +1151,42 @@ init python in distribute:
filename = self.base_name + "-" + variant
path = os.path.join(self.destination, filename)
# A map from the name of the format, to the options that will be
# used with it. The fields are:
#
# - The extension used.
# - Is this a directory based format?
# - Should the directory be turned into a dmg?
# - Should a directory name be prepended?
FORMATS = {
"update" : (".update", False, False, False),
"tar.bz2" : (".tar.bz2", False, False, True),
"zip" : (".zip", False, False, True),
"directory" : ("", True, False, False),
"dmg" : ("-dmg", True, True, True),
"app-zip" : (".zip", False, False, False),
"app-directory" : ("-app", True, False, False),
"app-dmg" : ("-app-dmg", True, True, False),
}
if format not in FORMATS:
raise Exception("Format %r is unknown." % format)
ext, directory, dmg, prepend = FORMATS[format]
mac_identity = self.build.get('mac_identity', None)
if dmg and (mac_identity is None):
return
if self.packagedest:
path = self.packagedest
fl = FileList.merge([ self.file_lists[i] for i in file_lists ])
fl = fl.copy()
fl.sort()
if self.build.get("exclude_empty_directories", True):
fl = fl.filter_empty()
fl = self.prepare_file_list(format, file_lists)
# Write the update information.
update_files = [ ]
@@ -797,80 +1202,103 @@ init python in distribute:
if i.executable:
update_xbit.append(i.name)
update = { variant : { "version" : self.update_version, "pretty_version" : self.pretty_version, "files" : update_files, "directories" : update_directories, "xbit" : update_xbit } }
self.update_versions[variant] = fl.hash(self)
if self.include_update and not dlc:
update_fn = os.path.join(self.destination, filename + ".update.json")
update = { variant : { "version" : self.update_versions[variant], "files" : update_files, "directories" : update_directories, "xbit" : update_xbit } }
update_fn = os.path.join(self.destination, filename + ".update.json")
if self.include_update and (variant not in [ 'ios', 'android', 'source']) and (not format.startswith("app-")):
with open(update_fn, "wb") as f:
json.dump(update, f)
json.dump(update, f, indent=2)
fl.append(File("update", None, True, False))
fl.append(File("update/current.json", update_fn, False, False))
# The mac transform.
if format == "app-zip":
fl = fl.mac_transform(self.app, self.documentation_patterns)
if (not dlc) or (format == "update"):
fl.append(File("update", None, True, False))
fl.append(File("update/current.json", update_fn, False, False))
# If we're not an update file, prepend the directory.
if (not dlc) and format != "update" and format != "directory":
if (not dlc) and prepend:
fl.prepend_directory(filename)
if format == "tar.bz2":
path += ".tar.bz2"
pkg = TarPackage(path, "w:bz2")
elif format == "update":
path += ".update"
pkg = TarPackage(path, "w", notime=True)
elif format == "zip" or format == "app-zip":
path += ".zip"
pkg = ZipPackage(path)
elif format == "directory":
pkg = DirectoryPackage(path)
# The path to the DMG, if we're going to make one.
dmg_path = path + ".dmg"
for i, f in enumerate(fl):
self.reporter.progress(_("Writing the [variant] [format] package."), i, len(fl), variant=variant, format=format)
full_filename = filename + ext
path += ext
if f.directory:
pkg.add_directory(f.name, f.path)
if self.build['renpy']:
fl_hash = fl.hash(self)
else:
fl_hash = '<not building renpy>'
file_hash, old_fl_hash = self.build_cache.get(full_filename, ("", ""))
if directory or old_fl_hash != fl_hash:
if format == "tar.bz2":
pkg = TarPackage(path, "w:bz2")
elif format == "update":
pkg = TarPackage(path, "w", notime=True)
elif format == "zip" or format == "app-zip":
pkg = ZipPackage(path)
elif directory:
pkg = DirectoryPackage(path)
for i, f in enumerate(fl):
self.reporter.progress(_("Writing the [variant] [format] package."), i, len(fl), variant=variant, format=format)
if f.directory:
pkg.add_directory(f.name, f.path)
else:
pkg.add_file(f.name, f.path, f.executable)
self.reporter.progress_done()
pkg.close()
if format == "update":
# Build the zsync file.
self.reporter.info(_("Making the [variant] update zsync file."), variant=variant)
cmd = [
updater.zsync_path("zsyncmake"),
"-z",
# -u url to gzipped data - not a local filename!
"-u", filename + ".update.gz",
"-o", os.path.join(self.destination, filename + ".zsync"),
os.path.abspath(path),
]
subprocess.check_call([ renpy.fsencode(i) for i in cmd ])
# Build the sums file. This is a file with an adler32 hash of each 64k block
# of the zsync file. It's used to help us determine how much of the file is
# downloaded.
with open(path, "rb") as src:
with open(renpy.fsencode(os.path.join(self.destination, filename + ".sums")), "wb") as sums:
while True:
data = src.read(65536)
if not data:
break
sums.write(struct.pack("<I", zlib.adler32(data) & 0xffffffff))
if self.include_update and not self.build_update and not dlc:
os.unlink(update_fn)
if not directory:
file_hash = hash_file(path)
else:
pkg.add_file(f.name, f.path, f.executable)
file_hash = ""
self.reporter.progress_done()
pkg.close()
if format == "update":
# Build the zsync file.
self.reporter.info(_("Making the [variant] update zsync file."), variant=variant)
cmd = [
updater.zsync_path("zsyncmake"),
"-z",
# -u url to gzipped data - not a local filename!
"-u", filename + ".update.gz",
"-o", os.path.join(self.destination, filename + ".zsync"),
os.path.abspath(path),
]
subprocess.check_call([ renpy.fsencode(i) for i in cmd ])
# Build the sums file. This is a file with an adler32 hash of each 64k block
# of the zsync file. It's used to help us determine how much of the file is
# downloaded.
with open(path, "rb") as src:
with open(renpy.fsencode(os.path.join(self.destination, filename + ".sums")), "wb") as sums:
while True:
data = src.read(65536)
if not data:
break
sums.write(struct.pack("I", zlib.adler32(data) & 0xffffffff))
if self.include_update and not self.build_update and not dlc:
os.unlink(update_fn)
if dmg:
self.make_dmg(filename, path, dmg_path)
shutil.rmtree(path)
if file_hash:
self.build_cache[full_filename] = (file_hash, fl_hash)
def finish_updates(self, packages):
"""
@@ -883,21 +1311,25 @@ init python in distribute:
index = { }
def add_variant(variant):
fn = renpy.fsencode(os.path.join(self.destination, self.base_name + "-" + variant + ".update"))
with open(fn, "rb") as f:
digest = hashlib.sha256(f.read()).hexdigest()
digest = self.build_cache[self.base_name + "-" + variant + ".update"][0]
sums_size = os.path.getsize(self.destination + "/" + self.base_name + "-" + variant + ".sums")
index[variant] = {
"version" : self.update_version,
"version" : self.update_versions[variant],
"pretty_version" : self.pretty_version,
"digest" : digest,
"zsync_url" : self.base_name + "-" + variant + ".zsync",
"sums_url" : self.base_name + "-" + variant + ".sums",
"sums_size" : sums_size,
"json_url" : self.base_name + "-" + variant + ".update.json",
}
os.unlink(fn)
fn = renpy.fsencode(os.path.join(self.destination, self.base_name + "-" + variant + ".update"))
if os.path.exists(fn):
os.unlink(fn)
for p in packages:
if p["update"]:
@@ -905,9 +1337,41 @@ init python in distribute:
fn = renpy.fsencode(os.path.join(self.destination, "updates.json"))
with open(fn, "wb") as f:
json.dump(index, f)
json.dump(index, f, indent=2)
def save_build_cache(self):
if not self.build['renpy']:
return
fn = renpy.fsencode(os.path.join(self.destination, ".build_cache"))
with open(fn, "wb") as f:
for k, v in self.build_cache.items():
l = "\t".join([k, v[0], v[1]]) + "\n"
f.write(l.encode("utf-8"))
def load_build_cache(self):
if not self.build['renpy']:
return
fn = renpy.fsencode(os.path.join(self.destination, ".build_cache"))
if not os.path.exists(fn):
return
with open(fn, "rb") as f:
for l in f:
if not l:
continue
l = l.decode("utf-8").rstrip()
l = l.split("\t")
self.build_cache[l[0]] = (l[1], l[2])
os.unlink(fn)
def dump(self):
for k, v in sorted(self.file_lists.items()):
print
+45 -5
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -191,8 +191,12 @@ screen build_distributions:
has vbox
textbutton _("Edit options.rpy") action editor.Edit("game/options.rpy", check=True)
textbutton _("Add from clauses to calls, once") action Jump("add_from")
textbutton _("Refresh") action Jump("build_distributions")
add HALF_SPACER
textbutton _("Upload to itch.io") action Jump("itch")
# Right side.
frame:
@@ -219,14 +223,45 @@ screen build_distributions:
$ description = pkg["description"]
textbutton "[description!q]" action PackageToggle(pkg["name"]) style "l_checkbox"
add SPACER
add SPACER
add HALF_SPACER
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Options:")
add HALF_SPACER
if project.current.dump["build"]["include_update"]:
textbutton _("Build Updates") action DataToggle("build_update") style "l_checkbox"
textbutton _("Add from clauses to calls") action DataToggle("add_from") style "l_checkbox"
textbutton _("Force Recompile") action DataToggle("force_recompile") style "l_checkbox"
textbutton _("Back") action Jump("front_page") style "l_left_button"
textbutton _("Build") action Jump("distribute") style "l_right_button"
textbutton _("Return") action Jump("front_page") style "l_left_button"
textbutton _("Build") action Jump("start_distribute") style "l_right_button"
label add_from_common:
python:
interface.processing(_("Adding from clauses to call statements that do not have them."))
project.current.launch([ "add_from" ], wait=True)
return
label add_from:
call add_from_common
jump build_distributions
label start_distribute:
if project.current.data["add_from"]:
call add_from_common
jump distribute
label build_update_dump:
python:
@@ -252,7 +287,12 @@ label build_missing:
interface.yesno(_("Your project does not contain build information. Would you like to add build information to the end of options.rpy?"), yes=Return(True), no=Jump("front_page"))
build_info = DEFAULT_BUILD_INFO.replace("PROJECTNAME", project.current.name)
project_name = project.current.name
project_name = project_name.replace(" ", "_")
project_name = project_name.replace(":", "")
project_name = project_name.replace(";", "")
build_info = DEFAULT_BUILD_INFO.replace("PROJECTNAME", project_name)
with open(os.path.join(project.current.path, "game", "options.rpy"), "a") as f:
f.write(build_info)
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+4 -4
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -238,13 +238,13 @@ init 1 python in editor:
if i.name == persistent.editor:
if i.installed and i.name in editors:
ei = editors[i.name]
os.environ["RENPY_EDIT_PY"] = renpy.fsencode(os.path.abspath(ei.filename))
os.environ[b"RENPY_EDIT_PY"] = renpy.fsencode(os.path.abspath(ei.filename))
error_message = i.error_message
break
else:
persistent.editor = None
os.environ.pop("RENPY_EDIT_PY", None)
os.environ.pop(b"RENPY_EDIT_PY", None)
renpy.editor.init()
@@ -297,7 +297,7 @@ init 1 python in editor:
if not set_editor:
return True
if persistent.editor:
if persistent.editor and persistent.editor != "None":
return True
return renpy.invoke_in_new_context(renpy.call_screen, "editor")
Binary file not shown.
Binary file not shown.
+23 -13
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -88,7 +88,7 @@ screen front_page:
has hbox:
xfill True
text "PROJECTS:" style "l_label_text" size 36 yoffset 10
text _("PROJECTS:") style "l_label_text" size 36 yoffset 10
textbutton _("refresh"):
xalign 1.0
@@ -121,8 +121,6 @@ screen front_page:
left_margin (HALF_INDENT)
action Jump("new_project")
# Project section - on right.
if project.current is not None:
@@ -130,6 +128,7 @@ screen front_page:
if project.current is not None:
textbutton _("Launch Project") action project.Launch() style "l_right_button"
key "K_F5" action project.Launch()
@@ -195,20 +194,24 @@ screen front_page_project:
textbutton _("game") action OpenDirectory("game")
textbutton _("base") action OpenDirectory(".")
# textbutton _("images") action OpenDirectory("game/images") style "l_list"
textbutton _("images") action OpenDirectory("game/images")
textbutton _("gui") action OpenDirectory("game/gui")
# textbutton _("save") action None style "l_list"
vbox:
if persistent.show_edit_funcs:
label _("Edit File") style "l_label_small"
label _("Edit File") style "l_label_small"
frame style "l_indent":
has vbox
frame style "l_indent":
has vbox
textbutton "script.rpy" action editor.Edit("game/script.rpy", check=True)
textbutton "options.rpy" action editor.Edit("game/options.rpy", check=True)
textbutton "screens.rpy" action editor.Edit("game/screens.rpy", check=True)
textbutton _("All script files") action editor.EditAll()
textbutton "script.rpy" action editor.Edit("game/script.rpy", check=True)
textbutton "options.rpy" action editor.Edit("game/options.rpy", check=True)
textbutton "gui.rpy" action editor.Edit("game/gui.rpy", check=True)
textbutton "screens.rpy" action editor.Edit("game/screens.rpy", check=True)
textbutton _("All script files") action editor.EditAll()
add SPACER
add SEPARATOR
@@ -229,7 +232,13 @@ screen front_page_project:
has vbox
textbutton _("Check Script (Lint)") action Jump("lint")
textbutton _("Change Theme") action Jump("choose_theme")
if project.current.exists("game/gui.rpy"):
textbutton _("Change/Update GUI") action Jump("change_gui")
else:
textbutton _("Change Theme") action Jump("choose_theme")
textbutton _("Delete Persistent") action Jump("rmpersistent")
textbutton _("Force Recompile") action Jump("force_recompile")
@@ -242,6 +251,7 @@ screen front_page_project:
textbutton _("Build Distributions") action Jump("build_distributions")
textbutton _("Android") action Jump("android")
textbutton _("iOS") action Jump("ios")
textbutton _("Generate Translations") action Jump("translate")
textbutton _("Extract Dialogue") action Jump("extract_dialogue")
+430
View File
@@ -0,0 +1,430 @@
# Copyright 2004-2016 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.
define gui.project_system_font = None
define gui.asian = False
init -1 python:
import gui7
from gui7 import translate_define, translate_copy, translate_code
import os
from store import config
def translate_font(language, font, path=None):
"""
Selects the font file that is used when translating `language`.
`font`
Is the name of the font file used for both the launcher and
the new GUI template. This should be a string giving the name
of the font file.
`path`
The path to the font file, relative to the launcher's game
directory. If not given, defaults to fonts.
"""
if path is None:
path = "fonts"
fullfont = path + "/" + font
def callback():
gui.REGULAR_FONT = fullfont
gui.LIGHT_FONT = fullfont
gui.REGULAR_BOLD = True
style._default.font = fullfont
style.default.font = fullfont
gui.system_font = fullfont
gui.project_system_font = font
config.language_callbacks[language].append(callback)
gui7.translate_copy(language, fullfont, font)
gui7.translate_define(language, "gui.default_font", repr(font))
gui7.translate_define(language, "gui.name_font", repr(font))
gui7.translate_define(language, "gui.interface_font", repr(font))
for fn in [ "gui.rpy", "options.rpy", "screens.rpy" ]:
fn = os.path.join(config.renpy_base, "gui", "game", fn)
if os.path.exists(fn):
config.translate_files.append(fn)
config.translate_comments = config.translate_files
DARK_COLORS = [
"#0099cc",
"#99ccff",
"#66cc00",
"#cccc00",
"#cc6600",
# "#cc3300",
"#0066cc",
"#9933ff",
"#00cc99",
"#cc0066",
"#cc0000",
]
LIGHT_COLORS = [
"#003366", # Dark Blue
"#0099ff", # Light Blue
"#336600", # Green
"#000000", # Black
"#cc6600", # Orange
"#000066", # Darkest Blue
"#660066", # Purple
"#006666", # Dark Green
"#cc0066", # Pinkish
"#990000", # Red
]
# LIGHT_COLORS = DARK_COLORS
COLOR_OPTIONS = [
(i, "#000000", False) for i in DARK_COLORS
] + [
(i, "#ffffff", True) for i in LIGHT_COLORS
]
screen gui_swatches():
grid 5 4:
for accent, bg, light in COLOR_OPTIONS:
frame:
style "empty"
xysize (85, 60)
add Color(accent).replace_hsv_saturation(.25).replace_value(.5)
if light:
add Color(bg).opacity(.9)
else:
add Color(bg).opacity(.8)
button:
style "empty"
if light:
selected_background "#000"
else:
selected_background "#fff"
xpadding 3
ypadding 3
xmargin 10
ymargin 10
action SetVariable("gui_color", (accent, bg, light))
idle_child Solid(accent)
hover_child Solid(Color(accent).tint(.6))
screen gui_demo(accent, boring, light, display):
$ p = gui7.GuiParameters(
"-",
"-",
1280,
720,
accent,
boring,
light,
None,
False,
False,
False,
"-"
)
frame:
style "empty"
add p.menu_color
if light:
add Solid(p.boring_color.opacity(.9))
else:
add Solid(p.boring_color.opacity(.8))
frame:
style "empty"
xpadding 10
ypadding 10
has vbox
text _("Display"):
style "empty"
font (gui.system_font or "DejaVuSans.ttf")
color p.accent_color
size 24
for i in [ _("Window"), _("Fullscreen"), _("Planetarium") ]:
textbutton i:
action (None if i == "Planetarium" else SetScreenVariable("display", i))
style "empty"
text_style "empty"
text_font (gui.system_font or "DejaVuSans.ttf")
text_size 24
text_color p.idle_color
text_hover_color p.hover_color
text_selected_color p.selected_color
text_insensitive_color p.insensitive_color
xmargin 4
ymargin 4
left_padding 21
selected_background Solid(p.accent_color, xsize=5)
null height 30
text _("Text Speed"):
style "empty"
color p.accent_color
size 24
font (gui.system_font or "DejaVuSans.ttf")
bar:
value ScreenVariableValue("value", 1.0)
style "empty"
base_bar Solid(p.muted_color)
hover_base_bar Solid(p.hover_muted_color)
thumb Solid(p.accent_color, xsize=10)
hover_thumb Solid(p.hover_color, xsize=10)
ysize 30
screen choose_gui_color():
default display = "Window"
default value = 0.5
frame:
style_group "l"
style "l_root"
window:
has vbox
label _("Select Accent and Background Colors")
frame:
style "l_indent"
has hbox:
yfill True
frame:
style "l_default"
xsize 425
has vbox
text _("Please click on the color scheme you wish to use, then click Continue. These colors can be changed and customized later.")
add SPACER
use gui_swatches()
# Preview
frame:
xsize 350
style "l_default"
background Frame(PATTERN, 0, 0, tile=True)
xpadding 5
ypadding 5
xfill True
yfill True
xmargin 20
bottom_margin 6
use gui_demo(gui_color[0], gui_color[1], gui_color[2], display)
textbutton _("Return") action Jump("front_page") style "l_left_button"
if gui_color:
textbutton _("Continue") action Return(True) style "l_right_button"
label change_gui:
python:
gui_new = False
gui_replace_images = True
gui_update_code = True
gui_replace_code = False
project.current.update_dump(True)
gui_size = tuple(project.current.dump["size"])
project_dir = project.current.path
project_name = project.current.name
mode = interface.choice(
_("{b}Warning{/b}\nContinuing will overwrite customized bar, button, save slot, scrollbar, and slider images.\n\nWhat would you like to do?"),
[
("change", _("Choose new colors, then regenerate image files.")),
("regenerate", _("Regenerate the image files using the colors in gui.rpy.")),
],
None,
cancel=Jump("front_page"),
)
if mode == "change":
jump gui_project_common
else:
jump gui_generate_images
label new_gui_project:
python:
gui_new = True
project_name = interface.input(
_("PROJECT NAME"),
_("Please enter the name of your project:"),
filename=True,
cancel=Jump("front_page"))
project_name = project_name.strip()
if not project_name:
interface.error(_("The project name may not be empty."))
project_dir = os.path.join(persistent.projects_directory, project_name)
if project.manager.get(project_name) is not None:
interface.error(_("[project_name!q] already exists. Please choose a different project name."), project_name=project_name)
if os.path.exists(project_dir):
interface.error(_("[project_dir!q] already exists. Please choose a different project name."), project_dir=project_dir)
gui_replace_images = True
gui_replace_code = True
gui_update_code = True
label gui_project_size:
python:
gui_size = interface.choice(
_("What resolution should the project use? Although Ren'Py can scale the window up and down, this is the initial size of the window, the size at which assets should be drawn, and the size at which the assets will be at their sharpest.\n\nThe default of 1280x720 is a reasonable compromise."),
[
((1066, 600), "1066x600"),
((1280, 720), "1280x720"),
((1920, 1080), "1920x1080"),
],
(1280, 720),
cancel=Jump("front_page"),
)
label gui_project_common:
$ gui_color = (DARK_COLORS[0], "#000000", False)
call screen choose_gui_color
python hide:
width, height = gui_size
accent, boring, light = gui_color
prefix = os.path.join(project_dir, "game")
if not os.path.isdir(prefix) and not gui_new:
interface.error("{} does not appear to be a Ren'Py game.".format(prefix))
template = os.path.join(config.renpy_base, "gui", "game")
if not os.path.isdir(template):
interface.error("{} does not appear to be a Ren'Py game.".format(template))
p = gui7.GuiParameters(
prefix,
template,
width,
height,
accent,
boring,
light,
_preferences.language,
gui_replace_images,
gui_replace_code,
gui_update_code,
project_name,
)
if gui_new:
interface.processing(_("Creating the new project..."))
else:
interface.processing(_("Updating the project..."))
with interface.error_handling("creating a new project"):
gui7.generate_gui(p)
# Activate the project.
with interface.error_handling("activating the new project"):
project.manager.scan()
project.Select(project.manager.get(project_name))()
if gui_new:
call update_renpy_strings
python hide:
if gui.project_system_font:
with open(os.path.join(project.current.gamedir, "tl/None/common.rpym"), "ab") as f:
f.write("define gui.system_font = {!r}\r\n".format(gui.project_system_font))
label gui_generate_images:
python:
interface.processing(_("Updating the project..."))
project.current.launch([ 'gui_images' ])
jump front_page
+97
View File
@@ -0,0 +1,97 @@
# Copyright 2004-2016 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 gui7.code import CodeGenerator, translate_define, translate_copy, translate_code
from gui7.images import ImageGenerator
from gui7.parameters import GuiParameters
import renpy.arguments
import os
def generate_gui(p):
ImageGenerator(p).generate_all()
CodeGenerator(p).generate_gui("gui.rpy", defines=True)
CodeGenerator(p).generate_gui("screens.rpy")
CodeGenerator(p).generate_code("options.rpy")
CodeGenerator(p).copy_script("script.rpy")
CodeGenerator(p).copy_files()
images = os.path.join(p.prefix, "images")
if not os.path.exists(images):
os.mkdir(images)
def generate_gui_command():
ap = renpy.arguments.ArgumentParser()
ap.add_argument("target", action="store", help="The game into which the generated gui should be placed.")
ap.add_argument("--width", default=1280, action="store", type=int, help="The width of the generated gui.")
ap.add_argument("--height", default=720, action="store", type=int, help="The height of the generated gui.")
ap.add_argument("--accent", default="#00b8c3", action="store", help="The accent color used throughout the gui.")
ap.add_argument("--boring", default="#000000", action="store", help="The boring color used for the gui background.")
ap.add_argument("--light", default=False, action="store_true", help="True if this is considered a light theme.")
ap.add_argument("--template", default="gui", action="store", help="The template directory containing source code.")
ap.add_argument("--language", default=None, action="store", help="The language to translate strings and comments to.")
ap.add_argument("--start", default=False, action="store_true", help="Starts a new project, replacing images and code.")
ap.add_argument("--replace-images", default=False, action="store_true", help="True if existing images should be overwritten.")
ap.add_argument("--replace-code", default=False, action="store_true", help="True if an existing gui.rpy file should be overwritten.")
ap.add_argument("--update-code", default=False, action="store_true", help="True if an existing gui.rpy file should be update.")
args = ap.parse_args()
if args.start:
args.replace_images = True
args.replace_code = True
args.update_code = True
prefix = os.path.join(args.target, "game")
if not os.path.isdir(prefix):
ap.error("{} does not appear to be a Ren'Py game.".format(prefix))
template = os.path.join(args.template, "game")
if not os.path.isdir(template):
ap.error("{} does not appear to be a Ren'Py game.".format(template))
p = GuiParameters(
prefix,
template,
args.width,
args.height,
args.accent,
args.boring,
args.light,
args.language,
args.replace_images,
args.replace_code,
args.update_code,
os.path.basename(args.target),
)
generate_gui(p)
renpy.arguments.register_command("generate_gui", generate_gui_command)
+425
View File
@@ -0,0 +1,425 @@
# Copyright 2004-2016 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 unicode_literals
import os
import codecs
import re
import math
import textwrap
import collections
import shutil
import renpy
class Define(object):
def __init__(self, name, value, comment):
self.name = name
self.value = value
self.comment = comment
# A map from language name to a list of defines.
language_defines = collections.defaultdict(list)
def translate_define(language, name, value, comment=None):
"""
This function should be called to register the value of a define that is
set when generating code in `language`.
`name`
A string giving the name of the define.
`value`
A string giving the value of the define. Be sure to quote it properly,
or use repr().
`comment`
If not None, a comment that will be generated before the define. The
comment will only be generated if the define does not exist in
gui.rpy. There is no need to use "## ", as the comment will be
added and wrapped automatically.
"""
language_defines[language].append(Define(name, value, comment))
# A map from a language name to a list of (src, dst) pairs. Each represents a
# file that is copied into place.
language_copies = collections.defaultdict(list)
def translate_copy(language, src, dst):
"""
This function should be called to copy a file from `src` to `dst`
when generating code in `language`.
`src`
A path, relative to the launcher game directory.
`dst`
A path, relative to the game directory of the new game.
"""
language_copies[language].append((src, dst))
# A map from language name and filename to code that should be added to the
# end of a newly-generated file.
language_code = collections.defaultdict(list)
def translate_code(language, filename, code):
"""
This function can be called to include a block of code verbatim
into `file` when a game is generated in `language`.
"""
language_code[language, filename].extend([''] + code.split("\n"))
class CodeGenerator(object):
"""
This is used to generate and update the GUI code.
"""
def __init__(self, parameters):
"""
Generates or updates gui.rpy.
"""
self.p = parameters
def load_template(self, filename):
target = os.path.join(self.p.prefix, filename)
if os.path.exists(target) and not self.p.replace_code:
template = target
else:
template = os.path.join(self.p.template, filename)
with codecs.open(template, "r", "utf-8") as f:
self.lines = [ i.rstrip().replace(u"\ufeff", "") for i in f ]
def remove_scale(self):
def scale(m):
original = int(m.group(1))
scaled = int(math.ceil(original * self.p.scale))
return str(scaled)
lines = [ ]
for l in self.lines:
l = re.sub(r'gui.scale\((.*?)\)', scale, l)
lines.append(l)
self.lines = lines
def update_size(self):
gui_init = "gui.init({}, {})".format(self.p.width, self.p.height)
lines = [ ]
for l in self.lines:
l = re.sub(r'gui.init\(.*?\)', gui_init, l)
lines.append(l)
self.lines = lines
def update_defines(self, replacements, additions=[]):
"""
Replaces define statements in gui.rpy.
"""
replacements = dict(replacements)
for d in additions:
replacements[d.name] = d.value
seen = set()
lines = [ ]
for l in self.lines:
m = re.match('^(\s*)define (.*?) =', l)
if m:
indent = m.group(1)
variable = m.group(2)
if variable in replacements:
l = "{}define {} = {}".format(indent, variable, replacements[variable])
seen.add(variable)
lines.append(l)
for d in additions:
if d.name in seen:
continue
seen.add(d.name)
lines.append("")
if d.comment:
for s in textwrap.wrap(d.comment):
lines.append("## " + s)
lines.append("define {} = {}".format(d.name, d.value))
self.lines = lines
def update_gui_defines(self):
"""
Replaces define statements in gui.rpy.
"""
replacements = {
'gui.accent_color' : repr(self.p.accent_color.hexcode),
'gui.selected_color' : repr(self.p.selected_color.hexcode),
'gui.hover_color' : repr(self.p.hover_color.hexcode),
'gui.muted_color' : repr(self.p.muted_color.hexcode),
'gui.hover_muted_color' : repr(self.p.hover_muted_color.hexcode),
'gui.title_color' : repr(self.p.title_color.hexcode),
'gui.idle_color' : repr(self.p.idle_color.hexcode),
'gui.idle_small_color' : repr(self.p.idle_small_color.hexcode),
'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),
}
self.update_defines(replacements, language_defines[self.p.language])
def update_options_defines(self):
"""
Replaces define statements in options.rpy.
"""
def quote(s):
s = s.replace("\\", "\\\\")
s = s.replace("\"", "\\\"")
return '"' + s + '"'
replacements = {
'config.name' : "_({})".format(quote(self.p.name)),
'build.name' : quote(self.p.simple_name),
'config.save_directory' : quote(self.p.savedir),
}
self.update_defines(replacements)
def write_target(self, filename):
target = os.path.join(self.p.prefix, filename)
if os.path.exists(target):
backup = 1
while True:
bfn = "{}.{}.bak".format(target, backup)
if not os.path.exists(bfn):
break
backup += 1
if not self.p.skip_backup:
os.rename(target, bfn)
with codecs.open(target, "w", "utf-8") as f:
f.write(u"\ufeff")
for l in self.lines:
f.write(l + "\r\n")
def translate_strings(self):
def replace(m):
s = eval(m.group(1))
s = renpy.translation.translate_string(s, language=self.p.language)
s = renpy.translation.quote_unicode(s)
quote = m.group(1)[0]
s = u"_({}{}{})".format(quote, s, quote)
return s
lines = [ ]
for l in self.lines:
l = re.sub(ur'_\((\".*?\")\)', replace, l)
l = re.sub(ur'_\((\'.*?\')\)', replace, l)
lines.append(l)
self.lines = lines
def translate_comments(self):
lines = [ ]
comment = [ ]
indent = ""
for l in self.lines:
m = re.match(r'^(\s*## )(.*)', l.rstrip())
if m:
indent = m.group(1)
c = m.group(2)
if comment:
c = c.strip()
comment.append(c)
else:
if comment:
s = "## " + ' '.join(comment)
if s.endswith("#"):
hashpad = True
s = s.rstrip('# ')
else:
hashpad = False
s = renpy.translation.translate_string(s, language=self.p.language)
m = re.match(r'## ([ *]*)(.*)', s)
prefix = m.group(1)
empty = ' ' * len(prefix)
rest = m.group(2)
len_prefix = len(indent) + len(prefix)
len_wrap = 80 - len_prefix
import store.gui
for i, s in enumerate(renpy.text.extras.textwrap(rest, len_wrap, store.gui.asian)):
if i == 0:
s = indent + prefix + s
else:
s = indent + empty + s
if hashpad and len(s) < 79:
s = s + " " + "#" * (79 - len(s))
lines.append(s)
comment = [ ]
lines.append(l)
self.lines = lines
def copy_files(self):
for src, dst in language_copies[self.p.language]:
src = os.path.join(renpy.config.gamedir, src)
dst = os.path.join(self.p.prefix, dst)
if os.path.exists(dst):
continue
dstdir = os.path.dirname(dst)
if not os.path.exists(dstdir):
os.makedirs(dstdir, 0o777)
shutil.copy(src, dst)
def copy_script(self, name):
dst = os.path.join(self.p.prefix, name)
if os.path.exists(dst):
return
language = renpy.store._preferences.language # @UndefinedVariable
if language is None:
language = "None"
src = os.path.join(renpy.config.gamedir, "tl", language, name + "m")
if not os.path.exists(src):
src = os.path.join(self.p.template, name)
shutil.copy(src, dst)
def add_code(self, fn):
if not self.p.replace_code:
return
self.lines.extend(language_code[self.p.language, fn])
def generate_gui(self, fn, defines=False):
if not self.p.update_code:
return
self.load_template(fn)
if defines:
self.update_gui_defines()
if self.p.replace_code:
self.remove_scale()
self.update_size()
self.translate_strings()
self.translate_comments()
self.add_code(fn)
self.write_target(fn)
def generate_code(self, fn):
target = os.path.join(self.p.prefix, fn)
if os.path.exists(target):
return
self.load_template(fn)
self.translate_strings()
self.translate_comments()
self.update_options_defines()
self.add_code(fn)
self.write_target(fn)
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

+443
View File
@@ -0,0 +1,443 @@
# Copyright 2004-2016 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.
import pygame_sdl2
import os
from renpy.store import config
import renpy.display
class ImageGenerator(object):
def __init__(self, parameters):
pygame_sdl2.image.init()
self.p = p = parameters
self.width = p.width
self.height = p.height
self.scale = p.scale
self.accent_color = p.accent_color
self.boring_color = p.boring_color
self.hover_color = p.hover_color
self.muted_color = p.muted_color
self.hover_muted_color = p.hover_muted_color
self.menu_color = p.menu_color
self.prefix = os.path.join(p.prefix, "gui", "")
try:
os.mkdir(self.prefix, 0o777)
except:
pass
self.full_width = self.width / self.scale
self.full_height = self.height / self.scale
self.overwrite = p.replace_images
def scale_int(self, n):
rv = int(n * self.scale)
if rv < 1:
rv = 1
return rv
def rescale_template(self, t):
rv = [ ]
for pos, opacity in t:
rv.append((pos * self.scale, opacity))
return rv
def generate_line(self, template):
size = int(max(i[0] for i in template))
rv = [ ]
right_pos, right_value = template[0]
for i in range(size):
if i == right_pos:
rv.append(right_value)
continue
while i >= right_pos:
left_pos = right_pos
left_value = right_value
right_pos, right_value = template.pop(0)
done = 1.0 * (i - left_pos) / (right_pos - left_pos)
rv.append(left_value + done * (right_value - left_value))
return rv
def crop_line(self, line, size):
"""
Crops the center `size` pixels out of `line`.
"""
if len(line) <= size:
return line
start = (len(line) - size) // 2
return line[start:start + size ]
def save(self, s, filename, overwrite=True):
fn = self.prefix + filename + ".png"
dn = os.path.dirname(fn)
try:
os.makedirs(dn, 0o777)
except:
pass
if os.path.exists(fn):
if not overwrite:
return
if not self.overwrite:
return
index = 1
while True:
bfn = u"{}.{}.bak".format(fn, index)
if not os.path.exists(bfn):
break
index += 1
if not self.p.skip_backup:
os.rename(fn, bfn)
import cStringIO
sio = cStringIO.StringIO()
renpy.display.module.save_png(s, sio, 3)
with open(fn, "wb") as f:
f.write(sio.getvalue())
def make_surface(self, width, height):
return pygame_sdl2.Surface((width, height), pygame_sdl2.SRCALPHA)
def generate_image(self, filename, xtmpl, ytmpl, color=(0, 0, 0, 255)):
r, g, b, a = color
xtmpl = self.rescale_template(xtmpl)
ytmpl = self.rescale_template(ytmpl)
xline = self.generate_line(xtmpl)
yline = self.generate_line(ytmpl)
xline = self.crop_line(xline, self.width)
yline = self.crop_line(yline, self.height)
s = self.make_surface(len(xline), len(yline))
for x, xv in enumerate(xline):
for y, yv in enumerate(yline):
v = xv * yv
s.set_at((x, y), (r, g, b, int(a * v)))
self.save(s, filename)
def generate_textbox(self):
XSIZE = self.full_width
XINSIDE = (XSIZE - 744) // 2
YSIZE = 185
YBORDER = 5
X = [
(0, 0.0),
(XINSIDE, 1.0),
(XSIZE - XINSIDE, 1.0),
(XSIZE, 0.0),
]
Y = [
(0, 0.0),
(YBORDER, 1.0),
(YSIZE, 1.0),
]
self.generate_image("textbox", X, Y, self.boring_color.opacity(.8))
YSIZE = 240
YBORDER = 5
X = [ (0, 1.0), (self.full_width, 1.0) ]
Y = [
(0, 0.0),
(YBORDER, 1.0),
(YSIZE, 1.0),
]
self.generate_image("phone/textbox", X, Y, self.boring_color.opacity(.8))
width = self.scale_int(300)
height = self.scale_int(36)
s = self.make_surface(width, height)
self.save(s, "namebox")
def generate_nvl(self):
XSIZE = self.full_width
XINSIDE = (XSIZE - 800) // 2
YSIZE = self.full_height
X = [
(0, 0.0),
(XINSIDE, 1.0),
(XSIZE - XINSIDE, 1.0),
(XSIZE, 0.0),
]
Y = [
(0, 1.0),
(YSIZE, 1.0),
]
self.generate_image("nvl", X, Y, self.boring_color.opacity(.8))
X = [
(0, 1.0),
(XSIZE, 1.0),
]
Y = [
(0, 1.0),
(YSIZE, 1.0),
]
self.generate_image("phone/nvl", X, Y, self.boring_color.opacity(.8))
def generate_choice_button(self):
XSIZE = 790
XINSIDE = 100
YSIZE = 35
YBORDER = 3
X = [
(0, 0.0),
(XINSIDE, 1.0),
(XSIZE - XINSIDE, 1.0),
(XSIZE, 0.0),
]
Y = [
(0, 0.0),
(YBORDER, 1.0),
(YSIZE - YBORDER, 1.0),
(YSIZE, 0.0),
]
self.generate_image("button/choice_idle_background", X, Y, self.boring_color.opacity(.8))
self.generate_image("button/choice_hover_background", X, Y, self.accent_color.opacity(.95))
def generate_overlay(self):
width = self.scale_int(280)
phone_width = self.scale_int(340)
game_y = self.scale_int(120)
game_height = self.scale_int(570)
line_width = self.scale_int(3)
if self.p.light:
opacity = 0.9
else:
opacity = 0.8
# Main menu.
mm = self.make_surface(self.width, self.height)
mm.subsurface((0, 0, width, self.height)).fill(self.boring_color.opacity(opacity))
mm.subsurface((width - line_width, 0, line_width, self.height)).fill(self.accent_color)
self.save(mm, "overlay/main_menu")
mm = self.make_surface(self.width, self.height)
mm.subsurface((0, 0, phone_width, self.height)).fill(self.boring_color.opacity(opacity))
mm.subsurface((phone_width - line_width, 0, line_width, self.height)).fill(self.accent_color)
self.save(mm, "phone/overlay/main_menu")
# Game menu.
gm = self.make_surface(self.width, self.height)
gm.fill(self.boring_color.opacity(opacity))
gm.subsurface((width - line_width, game_y, line_width, game_height)).fill(self.accent_color)
self.save(gm, "overlay/game_menu")
gm = self.make_surface(self.width, self.height)
gm.fill(self.boring_color.opacity(opacity))
gm.subsurface((phone_width - line_width, game_y, line_width, game_height)).fill(self.accent_color)
self.save(gm, "phone/overlay/game_menu")
# Confirm.
gm = self.make_surface(self.width, self.height)
gm.fill(self.boring_color.opacity(.6))
self.save(gm, "overlay/confirm")
def generate_frame(self):
width = self.scale_int(600)
height = self.scale_int(250)
border = self.scale_int(3)
s = self.make_surface(width, height)
s.fill(self.accent_color)
s.subsurface((border, border, width - 2 * border, height - 2 * border)).fill(self.boring_color)
self.save(s, "frame")
def generate_quick_buttons(self):
width = self.scale_int(100)
height = self.scale_int(30)
s = self.make_surface(width, height)
self.save(s, "button/quick_idle_background")
self.save(s, "button/quick_hover_background")
def generate_skip(self):
XSIZE = 240
XRIGHT = 50
YSIZE = 43
X = [
(0, 1.0),
(XSIZE - XRIGHT, 1.0),
(XSIZE, 0.0),
]
Y = [
(0, 1.0),
(YSIZE, 1.0),
]
self.generate_image("skip", X, Y, self.boring_color.opacity(.8))
def generate_notify(self):
XSIZE = 922
XRIGHT = 50
YSIZE = 43
X = [
(0, 1.0),
(XSIZE - XRIGHT, 1.0),
(XSIZE, 0.0),
]
Y = [
(0, 1.0),
(YSIZE, 1.0),
]
self.generate_image("notify", X, Y, self.boring_color.opacity(.8))
def generate_icon(self):
icon_fn = os.path.join(config.renpy_base, "launcher", "game", "gui7", "icon.png")
icon = pygame_sdl2.image.load(icon_fn)
width, height = icon.get_size()
surf = pygame_sdl2.Surface((width, height), pygame_sdl2.SRCALPHA)
ro, go, bo, _ao = tuple(self.accent_color)
ro -= 23
go -= 23
bo -= 23
for y in range(height):
for x in range(width):
r, g, b, a = icon.get_at((x, y))
r = max(0, min(r + ro, 255))
g = max(0, min(g + go, 255))
b = max(0, min(b + bo, 255))
surf.set_at((x, y), (r, g, b, a))
self.save(surf, "window_icon", overwrite=False)
def generate_menus(self):
s = self.make_surface(self.width, self.height)
s.fill(self.menu_color)
self.save(s, "main_menu", overwrite=False)
self.save(s, "game_menu", overwrite=False)
def generate_all(self):
self.generate_textbox()
self.generate_choice_button()
self.generate_overlay()
self.generate_frame()
self.generate_nvl()
self.generate_quick_buttons()
self.generate_skip()
self.generate_notify()
self.generate_menus()
self.generate_icon()
if __name__ == "__main__":
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("prefix")
ap.add_argument("width", type=int)
ap.add_argument("height", type=int)
args = ap.parse_args()
ImageGenerator(args.prefix, args.width, args.height).generate_all()
+110
View File
@@ -0,0 +1,110 @@
# Copyright 2004-2016 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
from renpy.store import Color
import time
# The target width used in templates.
WIDTH = 1280
HEIGHT = 720
class GuiParameters(object):
"""
This represents the parameters to the gui. This is used to initialize
the ImageGenerator and CodeGenerator objects to a consistent set of
parameters.
"""
def __init__(self, prefix, template, width, height, accent, boring, light, language, replace_images, replace_code, update_code, name=None):
self.prefix = prefix
self.template = template
self.width = width
self.height = height
self.scale = min(1.0 * width / WIDTH, 1.0 * height / HEIGHT)
self.accent_color = Color(accent)
self.boring_color = Color(boring)
# tint = n * color + (1-n) * white
# shade = n * color + (1-n) * black
self.light = light
if light:
self.hover_color = self.accent_color # .tint(.95)
self.muted_color = self.accent_color.tint(.6)
self.hover_muted_color = self.accent_color.tint(.4)
else:
self.hover_color = self.accent_color.tint(.6)
self.muted_color = self.accent_color.shade(.4)
self.hover_muted_color = self.accent_color.shade(.6)
self.menu_color = self.accent_color.replace_hsv_saturation(.25).replace_value(.5)
self.title_color = self.accent_color.replace_hsv_saturation(.5).replace_value(1.0)
if light:
self.selected_color = Color("#555555")
self.idle_color = Color("#aaaaaa")
self.idle_small_color = Color("#888888")
self.text_color = Color("#404040")
self.choice_color = Color("#cccccc")
else:
self.selected_color = Color("#ffffff")
self.idle_color = Color("#555555")
self.idle_small_color = Color("#aaaaaa")
self.text_color = Color("#ffffff")
self.choice_color = Color("#cccccc")
self.insensitive_color = self.idle_color.replace_opacity(.5)
self.language = language
if replace_code:
update_code = True
self.replace_images = replace_images
self.replace_code = replace_code
self.update_code = update_code
self.skip_backup = False
name = name or ''
self.name = name
GOOD_CHARACTERS = "123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMMOPQRSTUVWXYZ-_"
simple_name = "".join(i for i in name if i in GOOD_CHARACTERS).encode("ascii")
if not simple_name:
simple_name = "game"
self.simple_name = simple_name
self.savedir = self.simple_name + "-" + str(int(time.time()))
+9 -3
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -197,16 +197,19 @@ screen common:
label title text_color title_color style "l_info_label"
if back:
textbutton _("Back") action back style "l_left_button"
textbutton _("Return") action back style "l_left_button"
elif cancel:
textbutton _("Cancel") action cancel style "l_left_button"
if continue_:
textbutton _("Continue") action continue_ style "l_right_button"
key "input_enter" action continue_
screen launcher_input:
default value = default
frame:
style "l_root"
@@ -222,7 +225,7 @@ screen launcher_input:
add SPACER
input style "l_default" size 24 xalign 0.5 default default color INPUT_COLOR
input style "l_default" value ScreenVariableInputValue("value", returnable=True) size 24 xalign 0.5 color INPUT_COLOR
if filename:
add SPACER
@@ -233,6 +236,9 @@ screen launcher_input:
if cancel:
textbutton _("Cancel") action cancel style "l_left_button"
textbutton _("Continue") action Return(value) style "l_right_button"
init python in interface:
import traceback
+374
View File
@@ -0,0 +1,374 @@
# Copyright 2004-2016 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.
init python:
IOS_NO_RENIOS = 0
IOS_NO_DIRECTORY = 1
IOS_NO_PROJECT = 2
IOS_OK = 3
IOS_NO_RENIOS_TEXT = _("To build iOS packages, please download renios, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher.")
IOS_NO_DIRECTORY_TEXT = _("The directory in where Xcode projects will be placed has not been selected. Choose 'Select Directory' to select it.")
IOS_NO_PROJECT_TEXT = _("There is no Xcode project corresponding to the current Ren'Py project. Choose 'Create Xcode Project' to create one.")
IOS_OK_TEXT = _("An Xcode project exists. Choose 'Update Xcode Project' to update it with the latest game files, or use Xcode to build and install it.")
IPHONE_TEXT = _("Attempts to emulate an iPhone.\n\nTouch input is emulated through the mouse, but only when the button is held down.")
IPAD_TEXT = _("Attempts to emulate an iPad.\n\nTouch input is emulated through the mouse, but only when the button is held down.")
IOS_SELECT_DIRECTORY_TEXT = _("Selects the directory where Xcode projects will be placed.")
IOS_CREATE_PROJECT_TEXT = _("Creates an Xcode project corresponding to the current Ren'Py project.")
IOS_UPDATE_PROJECT_TEXT = _("Updates the Xcode project with the latest game files. This must be done each time the Ren'Py project changes.")
IOS_XCODE_TEXT = _("Opens the Xcode project in Xcode.")
IOS_OPEN_DIRECTORY_TEXT = _("Opens the directory containing Xcode projects.")
def find_renios():
global RENIOS_PATH
candidates = [ ]
RENIOS_PATH = os.path.join(config.renpy_base, "renios")
if os.path.isdir(RENIOS_PATH) and check_hash_txt("renios"):
import sys
sys.path.insert(0, os.path.join(RENIOS_PATH, "buildlib"))
else:
RENIOS_PATH = None
find_renios()
if RENIOS_PATH:
import renios.create
def IOSState():
if not RENIOS_PATH:
return IOS_NO_RENIOS
elif not persistent.xcode_projects_directory:
return IOS_NO_DIRECTORY
elif not os.path.exists(xcode_project()):
return IOS_NO_PROJECT
else:
return IOS_OK
def IOSStateText(state):
if state == IOS_NO_RENIOS:
return IOS_NO_RENIOS_TEXT
elif state == IOS_NO_DIRECTORY:
return IOS_NO_DIRECTORY_TEXT
elif state == IOS_NO_PROJECT:
return IOS_NO_PROJECT_TEXT
else:
return IOS_OK_TEXT
def IOSIfState(state, needed, action):
"""
If `state` is `needed` or better, `action` is returned. Otherwise,
returns None, disabling the button.
"""
if state >= needed:
return action
else:
return None
xcode_name_cache = { }
def xcode_name(s):
"""
Returns a version of `s` that's safe to use in Xcode.
"""
if s in xcode_name_cache:
return xcode_name_cache[s]
s = re.sub(r'[^\w\-\.]', '', s)
xcode_name_cache[s] = s
return s
def xcode_project(p=None):
"""
Return the path to the Xcode project corresponding to `p`, or the current
project if `p` is None
"""
if p is None:
p = project.current
if persistent.xcode_projects_directory is None:
raise Exception("The Xcode projects directory has not been set.")
return os.path.join(persistent.xcode_projects_directory, xcode_name(p.name))
def ios_create(p=None, gui=True):
dest = xcode_project(p)
if os.path.exists(dest):
interface.yesno(_("The Xcode project already exists. Would you like to rename the old project, and replace it with a new one?"), no=Jump("ios"))
i = 0
while True:
i += 1
backup = dest + "." + str(i)
if not os.path.exists(backup):
break
os.rename(dest, backup)
iface = MobileInterface("ios")
renios.create.create_project(iface, dest)
ios_populate(p, gui=gui)
def ios_populate(p=None, gui=True):
"""
This actually builds the package.
"""
import shutil
if p is None:
p = project.current
dist = os.path.join(xcode_project(p), "base")
if os.path.exists(dist):
shutil.rmtree(dist)
if gui:
reporter = distribute.GuiReporter()
else:
reporter = distribute.TextReporter()
distribute.Distributor(p,
reporter=reporter,
packages=[ 'ios' ],
build_update=False,
noarchive=True,
packagedest=dist,
report_success=False,
)
main_fn = os.path.join(dist, "main.py")
for fn in os.listdir(dist):
if fn.endswith(".py"):
py_fn = os.path.join(dist, fn)
break
else:
raise Exception("Could not find a .py file.")
with open(py_fn, "r") as py_f:
with open(main_fn, "w") as main_f:
for l in py_f:
if l.startswith("#!"):
continue
main_f.write(l)
os.unlink(py_fn)
def launch_xcode():
dist = xcode_project(None)
base = os.path.basename(dist)
xcodeproj = "{}/{}.xcodeproj".format(dist, base)
subprocess.call([ 'open', renpy.fsencode(xcodeproj) ])
screen ios:
default tt = Tooltip(None)
$ state = IOSState()
frame:
style_group "l"
style "l_root"
window:
has vbox
label _("iOS: [project.current.name!q]")
add HALF_SPACER
hbox:
# Left side.
frame:
style "l_indent"
xmaximum ONEHALF
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Emulation:")
add HALF_SPACER
frame style "l_indent":
has hbox:
spacing 15
textbutton _("iPhone"):
action LaunchEmulator("ios-touch", "small phone touch ios mobile")
hovered tt.Action(IPHONE_TEXT)
textbutton _("iPad"):
action LaunchEmulator("ios-touch", "medium tablet touch ios mobile")
hovered tt.Action(IPAD_TEXT)
add SPACER
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Build:")
add HALF_SPACER
frame style "l_indent":
has vbox
textbutton _("Select Xcode Projects Directory"):
action IOSIfState(state, IOS_NO_DIRECTORY, Jump("select_xcode_projects_directory"))
hovered tt.Action(IOS_SELECT_DIRECTORY_TEXT)
textbutton _("Create Xcode Project"):
action IOSIfState(state, IOS_NO_PROJECT, Jump("create_xcode_project"))
hovered tt.Action(IOS_CREATE_PROJECT_TEXT)
textbutton _("Update Xcode Project"):
action IOSIfState(state, IOS_NO_PROJECT, Jump("update_xcode_project"))
hovered tt.Action(IOS_UPDATE_PROJECT_TEXT)
if renpy.macintosh:
textbutton _("Launch Xcode"):
action IOSIfState(state, IOS_OK, launch_xcode)
hovered tt.Action(IOS_XCODE_TEXT)
# textbutton _("Configure"):
# action AndroidIfState(state, ANDROID_NO_CONFIG, Jump("android_configure"))
# hovered tt.Action(CONFIGURE_TEXT)
#
# textbutton _("Build Package"):
# action AndroidIfState(state, ANDROID_OK, AndroidBuild("android_build"))
# hovered tt.Action(BUILD_TEXT)
#
# textbutton _("Build & Install"):
# action AndroidIfState(state, ANDROID_OK, AndroidBuild("android_build_and_install"))
# hovered tt.Action(BUILD_AND_INSTALL_TEXT)
#
# textbutton _("Build, Install & Launch"):
# action AndroidIfState(state, ANDROID_OK, AndroidBuild("android_build_install_and_launch"))
# hovered tt.Action(BUILD_INSTALL_AND_LAUNCH_TEXT)
add SPACER
add SEPARATOR2
frame:
style "l_indent"
has vbox
text _("Other:")
add HALF_SPACER
frame style "l_indent":
has vbox
textbutton _("Open Xcode Projects Directory"):
action IOSIfState(state, IOS_NO_PROJECT, OpenDirectory(persistent.xcode_projects_directory, absolute=True))
hovered tt.Action(IOS_OPEN_DIRECTORY_TEXT)
# Right side.
frame:
style "l_indent"
xmaximum ONEHALF
xfill True
has vbox
add SEPARATOR2
frame:
style "l_indent"
has vbox
add SPACER
if tt.value:
text tt.value
else:
text IOSStateText(state)
textbutton _("Return") action Jump("front_page") style "l_left_button"
label ios:
if RENIOS_PATH is None:
$ interface.yesno(_("Before packaging iOS apps, you'll need to download renios, Ren'Py's iOS support. Would you like to download renios now?"), no=Jump("front_page"))
$ add_dlc("renios", restart=True)
call screen ios
label select_xcode_projects_directory:
python hide:
interface.interaction(_("XCODE PROJECTS DIRECTORY"), _("Please choose the Xcode Projects Directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"))
path, is_default = choose_directory(persistent.xcode_projects_directory)
if is_default:
interface.info(_("Ren'Py has set the Xcode Projects Directory to:"), "[path!q]", path=path)
persistent.xcode_projects_directory = path
jump ios
label create_xcode_project:
$ ios_create(None, True)
jump ios
label update_xcode_project:
$ ios_populate(None, True)
jump ios
+130
View File
@@ -0,0 +1,130 @@
# Copyright 2004-2016 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.
init python:
def find_itch_butler():
import os
if renpy.windows:
rv = os.path.join(os.environ.get("APPDATA", ""), "Roaming", "itch", "bin", "butler.exe")
if not os.path.exists(rv):
rv = os.path.join(os.environ.get("APPDATA", ""), "itch", "bin", "butler.exe")
elif renpy.macintosh:
rv = os.path.join(os.environ.get("HOME", ""), "Library", "Application Support", "itch", "bin", "butler")
else:
rv = os.path.join(os.environ.get("HOME", ""), ".config", "itch", "bin", "butler")
if not os.path.exists(rv):
return None
return rv
label itch:
call build_update_dump
python hide:
build = project.current.dump["build"]
destination = build["destination"]
parent = os.path.dirname(project.current.path)
destination = os.path.join(parent, destination)
version = build["version"]
if not os.path.exists(destination):
interface.error(
_("The built distributions could not be found. Please choose 'Build' and try again."),
label="build_distributions"
)
# A list of full filename, channel tuples.
files = [ ]
for fn in os.listdir(destination):
fn = os.path.join(destination, fn)
if fn.endswith("-all.zip"):
channel = "all"
elif fn.endswith("-win.zip"):
channel = "win"
elif fn.endswith("-mac.zip"):
channel = "mac"
# Butler doesn't seem to support .bz2s yet.
# elif fn.endswith("-linux.tar.bz2"):
# channel = "linux"
else:
continue
files.append((fn, channel))
if not os.path.exists(destination):
interface.error(
_("No uploadable files were found. Please choose 'Build' and try again."),
label="build_distributions"
)
butler = find_itch_butler()
if not butler:
interface.error(
_("The butler program was not found."),
_("Please install the itch.io app, which includes butler, and try again."),
label="build_distributions"
)
itch_project = project.current.dump["build"].get("itch_project", None)
if itch_project is None or ("/" not in itch_project):
interface.error(
_("The name of the itch project has not been set."),
_("Please {a=https://itch.io/game/new}create your project{/a}, then add a line like \n{vspace=5}define build.itch_project = \"user-name/game-name\"\n{vspace=5} to options.rpy."),
label="build_distributions"
)
cc = ConsoleCommand()
for filename, channel in files:
cc.add(
butler,
"push",
filename,
itch_project + ":" + build["version"] + "-" + channel,
)
cc.run()
jump build_distributions
+258
View File
@@ -0,0 +1,258 @@
# Copyright 2004-2016 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.
# This file contains mobile build things that are shared by the android
# and iOS builds.
init -1 python:
def check_hash_txt(module):
fn1 = module + "_hash.txt"
fn2 = renpy.fsencode(os.path.join(config.renpy_base, module, "hash.txt"))
# No hash file? We're in dev mode - ignore.
if not renpy.loadable(fn1):
return True
hash1 = renpy.file(fn1).read()
if not os.path.exists(fn2):
return False
hash2 = open(fn2).read()
return hash1.strip() == hash2.strip()
class LaunchEmulator(Action):
def __init__(self, emulator, variants):
self.emulator = emulator
self.variants = variants
def __call__(self):
env = {
"RENPY_EMULATOR" : self.emulator,
"RENPY_VARIANT" : self.variants,
}
p = project.current
p.launch(env=env)
class MobileInterface(object):
"""
This is used to interface between the launcher and RAPT/RENIOS.
"""
def __init__(self, platform, edit=True, filename=None):
"""
`platform`
The name of the platform we're using for. Used for libraries,
cancel labels, and logfiles.
`edit`
If true, we launch the log file in the editor on failure.
"""
self.platform = platform
self.edit = edit
self.process = None
if filename is None:
filename = platform + ".txt"
self.filename = project.current.temp_filename(filename)
self.info_msg = ""
with open(self.filename, "w"):
pass
def log(self, msg):
with open(self.filename, "a") as f:
f.write("\n")
f.write(msg)
f.write("\n")
def info(self, prompt):
self.info_msg = prompt
interface.processing(prompt, pause=False)
self.log(prompt)
def yesno(self, prompt, submessage=None):
return interface.yesno(prompt, submessage=submessage)
def yesno_choice(self, prompt, default=None):
choices = [ (True, "Yes"), (False, "No") ]
return interface.choice(prompt, choices, default)
def terms(self, url, prompt):
submessage = _("{a=%s}%s{/a}") % (url, url)
if not interface.yesno(prompt, submessage=submessage):
self.fail("You must accept the terms and conditions to proceed.", edit=False)
def input(self, prompt, empty=None):
if empty is None:
empty = ''
while True:
rv = interface.input(_("QUESTION"), prompt, default=empty, cancel=Jump("android"))
rv = rv.strip()
if rv:
return rv
def choice(self, prompt, choices, default):
return interface.choice(prompt, choices, default, cancel=Jump("android"))
def fail(self, prompt, edit=True):
self.log(prompt)
prompt = re.sub(r'(http://\S+)', r'{a=\1}\1{/a}', prompt)
# Open android.txt in the editor.
if edit and self.edit:
self.open_editor()
interface.error(prompt, label="android")
def open_editor(self):
editor.EditAbsolute(self.filename)()
def success(self, prompt):
self.log(prompt)
interface.info(prompt, pause=False)
def final_success(self, prompt):
self.log(prompt)
interface.info(prompt, label="android")
def run_yes_thread(self):
import time
try:
while self.run_yes:
self.process.stdin.write('y\n')
self.process.stdin.flush()
time.sleep(.2)
except:
import traceback
traceback.print_exc()
def call(self, cmd, cancel=False, use_path=False, yes=False):
cmd = [ renpy.fsencode(i) for i in cmd ]
self.cmd = cmd
f = open(self.filename, "a")
f.write("\n\n\n")
if cancel:
cancel_action = self.cancel
else:
cancel_action = None
startupinfo = None
if renpy.windows:
startupinfo = subprocess.STARTUPINFO()
startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
self.yes_thread = None
try:
interface.processing(self.info_msg, show_screen=True, cancel=cancel_action)
kwargs = { }
if yes:
kwargs["stdin"] = subprocess.PIPE
try:
self.process = subprocess.Popen(cmd, cwd=renpy.fsencode(RAPT_PATH), stdout=f, stderr=f, startupinfo=startupinfo, **kwargs)
except:
import traceback
traceback.print_exc(file=f)
raise
if yes:
import threading
self.run_yes = True
self.yes_thread = threading.Thread(target=self.run_yes_thread)
self.yes_thread.daemon = True
self.yes_thread.start()
renpy.call_screen("android_process", interface=self)
finally:
f.close()
interface.hide_screen()
if yes and self.yes_thread:
self.run_yes = False
self.yes_thread.join()
self.process = None
self.yes_thread = None
def check_process(self):
rv = self.process.poll()
if rv is not None:
if rv:
raise subprocess.CalledProcessError(rv, self.cmd)
else:
return True
def download(self, url, dest):
try:
d = Downloader(url, dest)
cancel_action = [ d.cancel, Jump(self.platform) ]
interface.processing(self.info_msg, show_screen=True, cancel=cancel_action, bar_value=DownloaderValue(d))
ui.timer(.1, action=d.check, repeat=True)
ui.interact()
finally:
interface.hide_screen()
def background(self, f):
try:
t = threading.Thread(target=f)
t.start()
interface.processing(self.info_msg, show_screen=True)
while t.is_alive():
renpy.pause(0)
t.join(0.25)
finally:
interface.hide_screen()
def cancel(self):
if self.process:
self.process.terminate()
renpy.jump(self.platform)
+2 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -257,7 +257,7 @@ screen navigation:
xalign 0.5
yalign 0.5
textbutton _("Back") action Jump("front_page") style "l_left_button"
textbutton _("Return") action Jump("front_page") style "l_left_button"
textbutton _("Launch Project") action project.Launch() style "l_right_button"
label navigation:
+59 -9
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -25,6 +25,56 @@ init python:
import time
import re
def check_language_support():
language = _preferences.language
new = False
legacy = False
# Check for a translation of the words "New GUI Interface".
if (language is None) or (__("New GUI Interface") != "New GUI Interface"):
new = True
try:
if (language is None) or os.path.exists(os.path.join(config.renpy_base, "templates", language)):
legacy = True
except:
pass
if new and legacy:
store.language_support = _("Both interfaces have been translated to your language.")
elif new:
store.language_support = _("Only the new GUI has been translated to your language.")
elif legacy:
store.language_support = _("Only the legacy theme interface has been translated to your language.")
else:
store.language_support = _("Neither interface has been translated to your language.")
label new_project:
if persistent.projects_directory is None:
call choose_projects_directory
if persistent.projects_directory is None:
$ interface.error(_("The projects directory could not be set. Giving up."))
python:
check_language_support()
gui_kind = interface.choice(
_("Which interface would you like to use? The new GUI has a modern look, supports wide screens and mobile devices, and is easier to customize. Legacy themes might be necessary to work with older example code.\n\n[language_support!t]\n\nIf in doubt, choose the new GUI, then click Continue on the bottom-right."),
[ ( 'new_gui_project', _("New GUI Interface") ), ( 'new_theme_project', _("Legacy Theme Interface")) ],
"new_gui_project",
cancel=Jump("front_page"),
)
renpy.jump(gui_kind)
screen select_template:
default result = project.manager.get("english")
@@ -58,17 +108,11 @@ screen select_template:
text _("Please select a template to use for your new project. The template sets the default font and the user interface language. If your language is not supported, choose 'english'.")
textbutton _("Back") action Jump("front_page") style "l_left_button"
textbutton _("Return") action Jump("front_page") style "l_left_button"
textbutton _("Continue") action Return(result) style "l_right_button"
label new_project:
if persistent.projects_directory is None:
call choose_projects_directory
if persistent.projects_directory is None:
$ interface.error(_("The projects directory could not be set. Giving up."))
label new_theme_project:
python hide:
@@ -118,6 +162,12 @@ label new_project:
with open(fn, "wb") as f:
f.write(options.encode("utf-8"))
font = template.data.get("font", None)
if font is not None:
src = os.path.join(config.gamedir, "fonts", font)
dst = os.path.join(project_dir, "game", "tl", "None", font)
shutil.copy(src, dst)
# Activate the project.
with interface.error_handling("activating the new project"):
project.manager.scan()
+155 -116
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -19,30 +19,30 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
## This file contains some of the options that can be changed to customize
## your Ren'Py game. It only contains the most common options... there
## is quite a bit more customization you can do.
##
## Lines beginning with two '#' marks are comments, and you shouldn't
## uncomment them. Lines beginning with a single '#' mark are
## commented-out code, and you may want to uncomment them when
## appropriate.
# This file contains some of the options that can be changed to customize
# your Ren'Py game. It only contains the most common options... there
# is quite a bit more customization you can do.
#
# Lines beginning with two '#' marks are comments, and you shouldn't
# uncomment them. Lines beginning with a single '#' mark are
# commented-out code, and you may want to uncomment them when
# appropriate.
init -1 python hide:
## Should we enable the use of developer tools? This should be
## set to False before the game is released, so the user can't
## cheat using developer tools.
# Should we enable the use of developer tools? This should be
# set to False before the game is released, so the user can't
# cheat using developer tools.
config.developer = True
## These control the width and height of the screen.
# These control the width and height of the screen.
config.screen_width = 800
config.screen_height = 600
## This controls the title of the window, when Ren'Py is
## running in a window.
# This controls the title of the window, when Ren'Py is
# running in a window.
config.window_title = u"Ren'Py Launcher"
@@ -51,135 +51,135 @@ init -1 python hide:
config.name = "Ren'Py Launcher"
config.version = renpy.version().split()[1]
#########################################
#####################
# Themes
## We then want to call a theme function. themes.roundrect is
## a theme that features the use of rounded rectangles. It's
## the only theme we currently support.
##
## The theme function takes a number of parameters that can
## customize the color scheme.
# We then want to call a theme function. themes.roundrect is
# a theme that features the use of rounded rectangles. It's
# the only theme we currently support.
#
# The theme function takes a number of parameters that can
# customize the color scheme.
theme.roundrect(
## Theme: Roundrect
## Color scheme: Basic Blue
# Theme: Roundrect
# Color scheme: Basic Blue
## The color of an idle widget face.
# The color of an idle widget face.
widget = "#003c78",
## The color of a focused widget face.
# The color of a focused widget face.
widget_hover = "#0050a0",
## The color of the text in a widget.
# The color of the text in a widget.
widget_text = "#c8ffff",
## The color of the text in a selected widget. (For
## example, the current value of a preference.)
# The color of the text in a selected widget. (For
# example, the current value of a preference.)
widget_selected = "#ffffc8",
## The color of a disabled widget face.
# The color of a disabled widget face.
disabled = "#404040",
## The color of disabled widget text.
# The color of disabled widget text.
disabled_text = "#c8c8c8",
## The color of informational labels.
# The color of informational labels.
label = "#ffffff",
## The color of a frame containing widgets.
# The color of a frame containing widgets.
frame = "#6496c8",
## The background of the main menu. This can be a color
## beginning with '#', or an image filename. The latter
## should take up the full height and width of the screen.
# The background of the main menu. This can be a color
# beginning with '#', or an image filename. The latter
# should take up the full height and width of the screen.
mm_root = "#dcebff",
## The background of the game menu. This can be a color
## beginning with '#', or an image filename. The latter
## should take up the full height and width of the screen.
# The background of the game menu. This can be a color
# beginning with '#', or an image filename. The latter
# should take up the full height and width of the screen.
gm_root = "#dcebff",
## If this is True, the in-game window is rounded. If False,
## the in-game window is square.
# If this is True, the in-game window is rounded. If False,
# the in-game window is square.
rounded_window = False,
## And we're done with the theme. The theme will customize
## various styles, so if we want to change them, we should
## do so below.
# And we're done with the theme. The theme will customize
# various styles, so if we want to change them, we should
# do so below.
)
#########################################
## Help.
#####################
# Help.
## This lets you configure the help option on the Ren'Py menus.
## It may be:
## - A label in the script, in which case that label is called to
## show help to the user.
## - A file name relative to the base directory, which is opened in a
## web browser.
## - None, to disable help.
# This lets you configure the help option on the Ren'Py menus.
# It may be:
# - A label in the script, in which case that label is called to
# show help to the user.
# - A file name relative to the base directory, which is opened in a
# web browser.
# - None, to disable help.
config.help = "README.html"
#########################################
## Transitions.
#####################
# Transitions.
## Used when entering the game menu from the game.
# Used when entering the game menu from the game.
config.enter_transition = None
## Used when exiting the game menu to the game.
# Used when exiting the game menu to the game.
config.exit_transition = None
## Used between screens of the game menu.
# Used between screens of the game menu.
config.intra_transition = None
## Used when entering the game menu from the main menu.
# Used when entering the game menu from the main menu.
config.main_game_transition = None
## Used when returning to the main menu from the game.
# Used when returning to the main menu from the game.
config.game_main_transition = None
## Used when entering the main menu from the splashscreen.
# Used when entering the main menu from the splashscreen.
config.end_splash_transition = None
## Used when entering the main menu after the game has ended.
# Used when entering the main menu after the game has ended.
config.end_game_transition = None
## Used when a game is loaded.
# Used when a game is loaded.
config.after_load_transition = None
## Used when the window is shown.
# Used when the window is shown.
config.window_show_transition = None
## Used when the window is hidden.
# Used when the window is hidden.
config.window_hide_transition = None
#########################################
## This is the name of the directory where the game's data is
## stored. (It needs to be set early, before any other init code
## is run, so the persistent information can be found by the init code.)
#####################
# This is the name of the directory where the game's data is
# stored. (It needs to be set early, before any other init code
# is run, so the persistent information can be found by the init code.)
python early:
config.save_directory = "launcher-4"
init -1 python hide:
#########################################
## Default values of Preferences.
#####################
# Default values of Preferences.
## Note: These options are only evaluated the first time a
## game is run. To have them run a second time, delete
## game/saves/persistent
# Note: These options are only evaluated the first time a
# game is run. To have them run a second time, delete
# game/saves/persistent
## Should we start in fullscreen mode?
# Should we start in fullscreen mode?
config.default_fullscreen = False
## The default text speed in characters per second. 0 is infinite.
# The default text speed in characters per second. 0 is infinite.
config.default_text_cps = 0
#########################################
## More customizations can go here.
#####################
# More customizations can go here.
config.sound = False
config.quit_action = Quit(confirm=False)
@@ -188,53 +188,72 @@ init -1 python hide:
config.windows_icon = "images/logo32.png"
config.has_autosave = False
config.log_enable = False
config.mouse_hide_time = 86400 * 366
config.mouse_hide_time = None
_game_menu_screen = None
config.underlay = [
renpy.Keymap(
screenshot = _screenshot,
reload_game = _reload_game,
developer = _developer,
quit = renpy.quit_event,
iconify = renpy.iconify,
help = _help,
choose_renderer = renpy.curried_call_in_new_context("_choose_renderer"),
console = _console.enter,
profile_once = _profile_once,
memory_profile = _memory_profile,
self_voicing = Preference("self voicing", "toggle"),
clipboard_voicing = Preference("clipboard voicing", "toggle"),
debug_voicing = Preference("debug voicing", "toggle"),
progress_screen = _progress_screen,
),
]
]
config.rollback_enabled = False
translate None python:
config.rtl = False
## This section controls how to build Ren'Py. (Building the launcher is how
## we build Ren'Py distributions.)
# This section controls how to build Ren'Py. (Building the launcher is how
# we build Ren'Py distributions.)
init python:
## We're building Ren'Py tonight.
# We're building Ren'Py tonight.
build.renpy = True
## The version number that's supplied to the updater.
# The version number that's supplied to the updater.
build.version = "Ren'Py {}".format(config.version)
## The name that's used for directories and archive files. For example, if
## this is 'mygame-1.0', the windows distribution will be in the
## directory 'mygame-1.0-win', in the 'mygame-1.0-win.zip' file.
# The name that's used for directories and archive files. For example, if
# this is 'mygame-1.0', the windows distribution will be in the
# directory 'mygame-1.0-win', in the 'mygame-1.0-win.zip' file.
if 'RENPY_NIGHTLY' in os.environ:
build.directory_name = os.environ['RENPY_NIGHTLY']
if 'RENPY_BUILD_VERSION' in os.environ:
build.directory_name = "renpy-" + os.environ['RENPY_BUILD_VERSION']
else:
build.directory_name = "renpy-" + config.version.rsplit('.', 1)[0]
## The name that's uses for executables - the program that users will run
## to start the game. For example, if this is 'mygame', then on Windows,
## users can click 'mygame.exe' to start the game.
# The name that's uses for executables - the program that users will run
# to start the game. For example, if this is 'mygame', then on Windows,
# users can click 'mygame.exe' to start the game.
build.executable_name = "renpy"
## If True, Ren'Py will include update information into packages. This
## allows the updater to run.
# If True, Ren'Py will include update information into packages. This
# allows the updater to run.
build.include_update = True
## Clear out various file patterns.
# Allow empty directories, so we can distribute the images directory.
build.exclude_empty_directories = False
# Mac signing options.
import os
build.mac_identity = os.environ.get("RENPY_MAC_IDENTITY", None)
build.mac_codesign_command = [ "/home/tom/ab/renpy-deps/mac/mac_sign_client.sh", "{identity}", "{app}" ]
build.mac_create_dmg_command = [ "/home/tom/ab/renpy-deps/mac/mac_dmg_client.sh", "{identity}", "{volname}", "{sourcedir}", "{dmg}" ]
build.mac_codesign_dmg_command = [ "/bin/true" ]
# Clear out various file patterns.
build.renpy_patterns = [ ]
build.early_base_patterns = [ ]
build.base_patterns = [ ]
@@ -243,15 +262,24 @@ init python:
# We don't need to clear out the executable patterns, since they're
# correct for Ren'Py.
## Now, add the Ren'Py distribution in using classify_renpy.
build.classify_renpy("rapt/**", "rapt")
# Now, add the Ren'Py distribution in using classify_renpy.
build.classify_renpy("**~", None)
build.classify_renpy("**/#*", None)
build.classify_renpy("**/thumbs.db", None)
build.classify_renpy("**/.*", None)
build.classify_renpy("rapt/**", "rapt")
build.classify_renpy("renios/prototype/base/", None)
build.classify_renpy("renios/prototype/prototype.xcodeproj/*.xcworkspace/", None)
build.classify_renpy("renios/prototype/prototype.xcodeproj/xcuserdata/", None)
build.classify_renpy("renios/prototype/**", "renios")
build.classify_renpy("renios/buildlib/**", "renios")
build.classify_renpy("renios/ios.py", "renios")
build.classify_renpy("renios/version.txt", "renios")
build.classify_renpy("renios/", "renios")
build.classify_renpy("**.old", None)
build.classify_renpy("**.new", None)
build.classify_renpy("**.bak", None)
@@ -266,28 +294,33 @@ init python:
# main source.
def source_and_binary(pattern):
def source_and_binary(pattern, source="source", binary="binary"):
"""
Classifies source and binary files beginning with `pattern`.
.pyo, .rpyc, .rpycm, and .rpyb go into binary, everything
else goes into source.
"""
build.classify_renpy(pattern + ".pyo", "binary")
build.classify_renpy(pattern + ".rpyc", "binary")
build.classify_renpy(pattern + ".rpymc", "binary")
build.classify_renpy(pattern + ".rpyb", "binary")
build.classify_renpy(pattern, "source")
build.classify_renpy(pattern + "/**.pyo", binary)
build.classify_renpy(pattern + "/**.rpyc", binary)
build.classify_renpy(pattern + "/**.rpymc", binary)
build.classify_renpy(pattern + "/**/cache/*", binary)
build.classify_renpy("renpy.py", "source")
source_and_binary("renpy/**")
build.classify_renpy(pattern + "/**", source)
build.classify_renpy("renpy.py", "binary")
source_and_binary("renpy")
# games.
build.classify_renpy("launcher/game/theme/", None)
source_and_binary("launcher/**")
source_and_binary("templates/**")
source_and_binary("the_question/**")
source_and_binary("tutorial/**")
build.classify_renpy("gui/game/gui/", None)
source_and_binary("launcher")
source_and_binary("templates", binary=None)
source_and_binary("gui", binary=None)
source_and_binary("the_question")
source_and_binary("tutorial")
# docs.
build.classify_renpy("doc/", "source")
@@ -305,16 +338,18 @@ init python:
build.classify_renpy("module/*.py*", "source")
build.classify_renpy("module/include/", "source")
build.classify_renpy("module/include/*.pxd", "source")
build.classify_renpy("module/include/*.pxi", "source")
build.classify_renpy("module/pysdlsound/", "source")
build.classify_renpy("module/pysdlsound/*.py", "source")
build.classify_renpy("module/pysdlsound/*.pyx", "source")
# all-platforms binary.
build.classify_renpy("lib/**/_renpysteam*", None)
build.classify_renpy("lib/**/*steam_api*", None)
build.classify_renpy("lib/*/renpy", None)
build.classify_renpy("lib/*/renpy.exe", None)
build.classify_renpy("lib/**", "binary")
build.classify_renpy("renpy.sh", "binary")
build.classify_renpy("renpy.exe", "binary")
# renpy.app is now built from scratch from distribute.rpy.
# jedit rules.
@@ -335,12 +370,16 @@ init python:
# Packages.
build.packages = [ ]
build.package("sdk", "zip tar.bz2", "source binary")
build.package("source", "tar.bz2", "source", update=False)
build.package("sdk", "zip tar.bz2 dmg", "source binary")
build.package("source", "tar.bz2", "source source_only", update=False)
build.package("jedit", "zip", "jedit", dlc=True)
build.package("editra-linux", "tar.bz2", "editra-all editra-linux", dlc=True)
build.package("editra-mac", "zip", "editra-all editra-mac", dlc=True)
build.package("editra-windows", "zip", "editra-all editra-windows", dlc=True)
build.package("rapt", "zip", "rapt", dlc=True)
build.package("renios", "zip", "renios", dlc=True)
# Enable the special launcher translation mode.
define config.translate_launcher = True
+26 -12
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -107,7 +107,28 @@ init python in distribute:
"""
def __init__(self, filename):
self.zipfile = ZipFile(filename, "w", zipfile.ZIP_DEFLATED)
self.zipfile = ZipFile(filename, "w", zipfile.ZIP_DEFLATED, True)
def get_date_time(self, path):
"""
Gets the datetime for a file. If the time doesn't exist or is
weird, use the current time instead.
"""
try:
s = os.stat(path)
rv = time.gmtime(s.st_mtime)[:6]
# Check that the time is sensible.
if rv[0] < 2000:
rv = None
except:
rv = None
if rv is None:
rv = time.gmtime()[:6]
return rv
def add_file(self, name, path, xbit):
@@ -115,13 +136,7 @@ init python in distribute:
raise Exception("path for " + name + " must not be None.")
zi = zipfile.ZipInfo(name)
try:
s = os.stat(path)
zi.date_time = time.gmtime(s.st_mtime)[:6]
except:
zi.date_time = time.gmtime()[:6]
zi.date_time = self.get_date_time(path)
zi.compress_type = zipfile.ZIP_DEFLATED
zi.create_system = 3
@@ -137,9 +152,7 @@ init python in distribute:
return
zi = zipfile.ZipInfo(name + "/")
s = os.stat(path)
zi.date_time = time.gmtime(s.st_mtime)[:6]
zi.date_time = self.get_date_time(path)
zi.compress_type = zipfile.ZIP_STORED
zi.create_system = 3
zi.external_attr = (long(0040755) << 16) | 0x10
@@ -209,6 +222,7 @@ init python in distribute:
def add_file(self, name, path, xbit):
fn = os.path.join(self.path, name)
shutil.copy2(path, fn)
if xbit:
+5 -4
View File
@@ -41,6 +41,8 @@ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
OF SUCH DAMAGE.
"""
from __future__ import print_function
__revision__ = "$LastChangedRevision: 63 $"
__author__ = 'Ero Carrera'
__version__ = '1.2.10-%d' % int( __revision__[21:-2] )
@@ -1668,7 +1670,7 @@ class PE:
"""
for warning in self.__warnings:
print '>', warning
print('>', warning)
def full_load(self):
@@ -3251,7 +3253,7 @@ class PE:
def print_info(self):
"""Print all the PE header information in a human readable from."""
print self.dump_info()
print(self.dump_info())
def dump_info(self, dump=None):
@@ -3930,5 +3932,4 @@ class PE:
if __name__ == "__main__":
import sys
pe = PE(sys.argv[1])
print pe
print(pe)
+6 -2
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -25,6 +25,9 @@ init python:
config.gl_enable = persistent.gl_enable
if persistent.show_edit_funcs is None:
persistent.show_edit_funcs = True
if persistent.windows_console is None:
persistent.windows_console = False
@@ -168,6 +171,7 @@ screen preferences:
textbutton _("Hardware rendering") style "l_checkbox" action ToggleField(persistent, "gl_enable")
textbutton _("Show templates") style "l_checkbox" action ToggleField(persistent, "show_templates")
textbutton _("Show edit file section") style "l_checkbox" action ToggleField(persistent, "show_edit_funcs")
textbutton _("Large fonts") style "l_checkbox" action [ ToggleField(persistent, "large_print"), renpy.utter_restart ]
if renpy.windows:
@@ -222,7 +226,7 @@ screen preferences:
textbutton tlname action Language(tlvalue) style "l_list"
textbutton _("Back") action Jump("front_page") style "l_left_button"
textbutton _("Return") action Jump("front_page") style "l_left_button"
label projects_directory_preference:
call choose_projects_directory
+91 -79
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -22,9 +22,9 @@
# Code that manages projects.
init python:
try:
if renpy.windows:
import EasyDialogsWin as EasyDialogs
except:
else:
EasyDialogs = None
import os
@@ -53,7 +53,10 @@ init python in project:
class Project(object):
def __init__(self, path):
def __init__(self, path, name=None):
if name is None:
name = os.path.basename(path)
while path.endswith("/"):
path = path[:-1]
@@ -61,11 +64,7 @@ init python in project:
if not os.path.exists(path):
raise Exception("{} does not exist.".format(path))
# The name of the project.
if path.endswith(".app/Contents/Resources/autorun"):
self.name = os.path.basename(path[:-len(".app/Contents/Resources/autorun")])
else:
self.name = os.path.basename(path)
self.name = name
# The path to the project.
self.path = path
@@ -120,7 +119,23 @@ init python in project:
data = self.data
data.setdefault("build_update", False)
data.setdefault("packages", [ "all" ])
data.setdefault("packages", [ "pc", "mac" ])
data.setdefault("add_from", True)
data.setdefault("force_recompile", True)
if "renamed_all" not in data:
dp = data["packages"]
if "all" in dp:
dp.remove("all")
if "pc" not in dp:
dp.append("pc")
if "mac" not in dp:
dp.append("mac")
data["renamed_all"] = True
def make_tmp(self):
"""
@@ -131,10 +146,10 @@ init python in project:
if self.tmp and os.path.isdir(self.tmp):
return
tmp = os.path.join(self.path, "tmp")
tmp = os.path.join(config.renpy_base, "tmp", self.name)
try:
os.mkdir(tmp)
os.makedirs(tmp)
except:
pass
@@ -210,19 +225,24 @@ init python in project:
environ = dict(os.environ)
environ.update(env)
for k in environ:
environ[k] = renpy.fsencode(environ[k])
encoded_environ = { }
for k, v in environ.items():
if v is None:
continue
encoded_environ[renpy.fsencode(k)] = renpy.fsencode(v)
# Launch the project.
cmd = [ renpy.fsencode(i) for i in cmd ]
p = subprocess.Popen(cmd, env=environ)
p = subprocess.Popen(cmd, env=encoded_environ)
if wait:
if p.wait():
interface.error(_("Launching the project failed."), _("Please ensure that your project launches normally before running this command."))
def update_dump(self, force=False, gui=True):
def update_dump(self, force=False, gui=True, compile=False):
"""
If the dumpfile does not exist, runs Ren'Py to create it. Otherwise,
loads it in iff it's newer than the one that's already loaded.
@@ -235,7 +255,10 @@ init python in project:
if gui:
interface.processing(_("Ren'Py is scanning the project..."))
self.launch(["quit"], wait=True)
if compile:
self.launch(["compile", "--keep-orphan-rpyc" ], wait=True)
else:
self.launch(["quit"], wait=True)
if not os.path.exists(dump_filename):
self.dump["error"] = True
@@ -323,6 +346,13 @@ init python in project:
return rv
def exists(self, fn):
"""
Returns true if the file exists in the game.
"""
return os.path.exists(os.path.join(self.path, fn))
class ProjectManager(object):
"""
@@ -373,6 +403,33 @@ init python in project:
self.projects.sort(key=lambda p : p.name.lower())
self.templates.sort(key=lambda p : p.name.lower())
def find_basedir(self, d):
"""
Try to find a project basedir in d.
"""
def has_game(dn):
return os.path.isdir(os.path.join(dn, "game"))
if has_game(d):
return d
dn = os.path.join(d, "Contents", "Resources", "autorun")
if has_game(dn):
return dn
for dn in os.listdir(d):
if not dn.endswith(".app"):
continue
dn = os.path.join(d, dn, "Contents", "Resources", "autorun")
if has_game(dn):
return dn
return None
def scan_directory(self, d):
"""
Scans for projects in directories directly underneath `d`.
@@ -393,21 +450,21 @@ init python in project:
if not os.path.isdir(ppath):
continue
autorun = os.path.join(ppath, "Contents", "Resources", "autorun")
if os.path.exists(autorun):
ppath = autorun
try:
ppath = self.find_basedir(ppath)
except:
continue
# A project has either a game/ directory, or a project.json
# file.
if (not os.path.isdir(os.path.join(ppath, "game"))) and (not os.path.exists(os.path.join(ppath, "project.json"))):
if ppath is None:
continue
if ppath in self.scanned:
continue
self.scanned.add(ppath)
# We have a project directory, so create a Project.
p = Project(ppath)
p = Project(ppath, pdir)
project_type = p.data.get("type", "normal")
@@ -544,6 +601,11 @@ init python in project:
if isinstance(persistent.projects_directory, str):
persistent.projects_directory = renpy.fsdecode(persistent.projects_directory)
init 10 python:
if persistent.projects_directory is not None:
if not directory_is_writable(persistent.projects_directory):
persistent.projects_directory = None
###############################################################################
# Code to choose the projects directory.
@@ -553,62 +615,12 @@ label choose_projects_directory:
interface.interaction(_("PROJECTS DIRECTORY"), _("Please choose the projects directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"), _("This launcher will scan for projects in this directory, will create new projects in this directory, and will place built projects into this directory."),)
path = persistent.projects_directory
path, is_default = choose_directory(persistent.projects_directory)
if path:
default_path = path
else:
try:
default_path = os.path.dirname(os.path.abspath(config.renpy_base))
except:
default_path = os.path.abspath(config.renpy_base)
if EasyDialogs:
choice = EasyDialogs.AskFolder(defaultLocation=default_path, wanted=unicode)
if choice is not None:
path = choice
else:
path = None
else:
try:
cmd = [ "/usr/bin/python", os.path.join(config.gamedir, "tkaskdir.py"), renpy.fsencode(default_path) ]
p = subprocess.Popen(cmd, stdout=subprocess.PIPE)
choice = p.stdout.read()
code = p.wait()
except:
import traceback
traceback.print_exc()
code = 0
choice = ""
path = None
interface.error(_("Ren'Py was unable to run python with tkinter to choose the projects directory. Please install the python-tk or tkinter package."), label=None)
if code:
interface.error(_("Ren'Py was unable to run python with tkinter to choose the projects directory. Please install the python-tk or tkinter package."), label=None)
elif choice:
path = choice.decode("utf-8")
if path is None:
path = default_path
if is_default:
interface.info(_("Ren'Py has set the projects directory to:"), "[path!q]", path=path)
path = renpy.fsdecode(path)
if os.path.isdir(path):
persistent.projects_directory = path
else:
path = os.path.abspath(config.renpy_base)
persistent.projects_directory = path
project.manager.scan()
@@ -622,7 +634,7 @@ init python:
args = ap.parse_args()
persistent.projects_directory = args.projects
persistent.projects_directory = renpy.fsdecode(args.projects)
renpy.save_persistent()
return False
@@ -633,7 +645,7 @@ init python:
ap = renpy.arguments.ArgumentParser()
args = ap.parse_args()
print persistent.projects_directory
print renpy.fsencode(persistent.projects_directory)
return False
+229 -205
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
@@ -19,8 +19,22 @@
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
init -1:
# Fonts.
define gui.LIGHT_FONT = "fonts/Roboto-Light.ttf"
define gui.REGULAR_FONT = "fonts/Roboto-Regular.ttf"
# Used to scale the size of fonts.
define gui.FONT_SCALE = 1.0
# Should places where the regular font used be bolded?
define gui.REGULAR_BOLD = False
init -1 python:
config.defer_styles = True
# The color of non-interactive text.
TEXT = "#545454"
@@ -63,12 +77,6 @@ init -1 python:
# The color of input text.
INPUT_COLOR = "#d86b45"
# FONTS/WEIGHTS
LIGHT = "Roboto-Light.ttf"
REGULAR = "Roboto-Regular.ttf"
if persistent.large_print:
LIGHT = REGULAR
init 1 python:
@@ -80,8 +88,18 @@ init 1 python:
if persistent.large_print and n < 18:
n = 18
n = int(n * gui.FONT_SCALE)
return n
def light_font():
if persistent.large_print:
return gui.REGULAR_FONT
return gui.LIGHT_FONT
def regular_font():
return gui.REGULAR_FONT
INDENT = 20
HALF_INDENT = 10
@@ -104,240 +122,246 @@ init 1 python:
def checkbox(full, color):
if full:
return im.Twocolor("images/checkbox_full.png", color, color, yalign=0.5)
return im.Twocolor("images/checkbox_full.png", color, color, style="l_checkbox_box")
else:
return im.Twocolor("images/checkbox_empty.png", color, color, yalign=0.5)
init 1:
# The default style.
style l_default is default:
font LIGHT
color TEXT
idle_color IDLE
hover_color HOVER
size size(18)
style l_text is l_default
style l_button is l_default
style l_button_text is l_default:
insensitive_color DISABLED
selected_font REGULAR
# A small button, used at the bottom of the screen.
style l_link is l_default
style l_link_text is l_default:
size size(14)
font LIGHT
# Action buttons on the bottom of the screen.
style l_right_button is l_default:
xalign 1.0
ypos 600 - 128 + 12
left_margin 8 + INDENT
right_margin 10 + INDENT
style l_right_button_text is l_default:
size size(30)
style l_left_button is l_right_button:
xalign 0.0
style l_left_button_text is l_right_button_text
return im.Twocolor("images/checkbox_empty.png", color, color, style="l_checkbox_box")
# The root frame. This contains everything but the bottom navigation,
# and buttons.
style l_root is l_default:
background BACKGROUND
xpadding 10
top_padding 64
bottom_padding 128
# An inner window.
style l_window is l_default:
background WINDOW
left_padding 6
xfill True
yfill True
# The default style.
style l_default is default:
font light_font()
color TEXT
idle_color IDLE
hover_color HOVER
size size(18)
# Normal size labels.
style l_label is l_default:
xfill True
top_padding 10
bottom_padding 8
bottom_margin 12
background SEPARATOR
style l_text is l_default
style l_label_text is l_default:
size size(24)
xpos INDENT
yoffset 6
style l_button is l_default
style l_button_text is l_default:
insensitive_color DISABLED
selected_font regular_font()
selected_bold gui.REGULAR_BOLD
style l_label_small is l_default:
xfill True
bottom_padding 8
bottom_margin HALF_SPACER_HEIGHT
background SEPARATOR
# A small button, used at the bottom of the screen.
style l_link is l_default
style l_link_text is l_default:
size size(14)
font light_font()
# Small labels.
style l_label_small_text is l_default:
xpos INDENT
yoffset 6
size size(20)
# Action buttons on the bottom of the screen.
style l_right_button is l_default:
xalign 1.0
ypos 600 - 128 + 12
left_margin 8 + INDENT
right_margin 10 + INDENT
# Alternate labels. This nests inside an l_label, and gives a button
# or label that's nested inside another label.
style l_right_button_text is l_default:
size size(30)
style l_alternate is l_default:
xalign 1.0
yalign 1.0
yoffset 4
right_margin INDENT
style l_left_button is l_right_button:
xalign 0.0
style l_alternate_text is l_default:
size size(14)
font LIGHT
text_align 1.0
style l_left_button_text is l_right_button_text
style l_small_button is l_button
style l_small_button_text is l_button_text:
size size(14)
# The root frame. This contains everything but the bottom navigation,
# and buttons.
style l_root is l_default:
background BACKGROUND
xpadding 10
top_padding 64
bottom_padding 128
style l_small_text is l_text:
size size(14)
# An inner window.
style l_window is l_default:
background WINDOW
left_padding 6
xfill True
yfill True
# Indents its contents.
style l_indent is l_default:
left_margin INDENT
# Normal size labels.
style l_label is l_default:
xfill True
top_padding 10
bottom_padding 8
bottom_margin 12
background SEPARATOR
# Indents its contents and pads vertically.
style l_indent_margin is l_indent:
ymargin 6
style l_label_text is l_default:
size size(24)
xpos INDENT
yoffset 6
# Lists.
style l_list is l_default:
left_padding HALF_INDENT
xfill True
selected_background REVERSE_IDLE
selected_hover_background REVERSE_HOVER
style l_label_small is l_default:
xfill True
bottom_padding 8
bottom_margin HALF_SPACER_HEIGHT
background SEPARATOR
style l_list_text is l_default:
idle_color IDLE
hover_color HOVER
selected_idle_color REVERSE_TEXT
selected_hover_color REVERSE_TEXT
insensitive_color DISABLED
# Small labels.
style l_label_small_text is l_default:
xpos INDENT
yoffset 6
size size(20)
style l_list2 is l_list:
left_padding (HALF_INDENT + INDENT)
# Alternate labels. This nests inside an l_label, and gives a button
# or label that's nested inside another label.
style l_list2_text is l_list_text
style l_alternate is l_default:
xalign 1.0
yalign 1.0
yoffset 4
right_margin INDENT
# Scrollbar.
style l_vscrollbar is l_default:
thumb Fixed(
Solid(SCROLLBAR_IDLE, xmaximum=8, xalign=0.5),
Image("images/vscrollbar_center.png", xalign=0.5, yalign=0.5),
xmaximum = SCROLLBAR_SIZE)
hover_thumb Fixed(
Solid(SCROLLBAR_HOVER, xmaximum=8, xalign=0.5),
Image("images/vscrollbar_center.png", xalign=0.5, yalign=0.5),
xmaximum = SCROLLBAR_SIZE)
xmaximum SCROLLBAR_SIZE
bar_vertical True
bar_invert True
unscrollable "hide"
style l_alternate_text is l_default:
size size(14)
font light_font()
text_align 1.0
# Information window.
style l_info_vbox is vbox:
yalign 0.5
xalign 0.5
xfill True
style l_small_button is l_button
style l_info_frame is l_default:
ypadding 21
xfill True
background Fixed(
INFO_WINDOW,
Frame(PATTERN, 0, 0, tile=True, ymaximum=5, yalign=0.0, yoffset=8),
Frame(PATTERN, 0, 0, tile=True, ymaximum=5, yalign=1.0, yoffset=-8),
)
yminimum 180
ypos 75
style l_small_button_text is l_button_text:
size size(14)
style l_info_label is l_default:
xalign 0.5
ypos 75
yanchor 1.0
yoffset 12
style l_small_text is l_text:
size size(14)
style l_info_label_text is l_default:
size size(36)
# Indents its contents.
style l_indent is l_default:
left_margin INDENT
style l_info_text is l_default:
xalign 0.5
# Indents its contents and pads vertically.
style l_indent_margin is l_indent:
ymargin 6
style l_info_button is l_button:
xalign 0.5
xmargin 50
# Lists.
style l_list is l_default:
left_padding HALF_INDENT
xfill True
selected_background REVERSE_IDLE
selected_hover_background REVERSE_HOVER
style l_info_button_text is l_button_text:
text_align 0.5
layout "subtitle"
style l_list_text is l_default:
idle_color IDLE
hover_color HOVER
selected_idle_color REVERSE_TEXT
selected_hover_color REVERSE_TEXT
insensitive_color DISABLED
# Progress bar.
style l_progress_frame is l_default:
background Frame(PATTERN, 0, 0, tile=True)
ypadding 5
style l_list2 is l_list:
left_padding (HALF_INDENT + INDENT)
style l_progress_bar is l_default:
left_bar REVERSE_IDLE
right_bar Null()
ymaximum 24
style l_list2_text is l_list_text
# Navigation.
style l_navigation_button is l_button:
size_group "navigation"
right_margin INDENT
top_margin 3
# Scrollbar.
style l_vscrollbar is l_default:
thumb Fixed(
Solid(SCROLLBAR_IDLE, xmaximum=8, xalign=0.5),
Image("images/vscrollbar_center.png", xalign=0.5, yalign=0.5),
xmaximum = SCROLLBAR_SIZE)
hover_thumb Fixed(
Solid(SCROLLBAR_HOVER, xmaximum=8, xalign=0.5),
Image("images/vscrollbar_center.png", xalign=0.5, yalign=0.5),
xmaximum = SCROLLBAR_SIZE)
xmaximum SCROLLBAR_SIZE
bar_vertical True
bar_invert True
unscrollable "hide"
style l_navigation_button_text is l_button_text:
size size(14)
font REGULAR
# Information window.
style l_info_vbox is vbox:
yalign 0.5
xalign 0.5
xfill True
style l_navigation_text is l_text:
size size(14)
font LIGHT
color TEXT
style l_info_frame is l_default:
ypadding 21
xfill True
background Fixed(
INFO_WINDOW,
Frame(PATTERN, 0, 0, tile=True, ymaximum=5, yalign=0.0, yoffset=8),
Frame(PATTERN, 0, 0, tile=True, ymaximum=5, yalign=1.0, yoffset=-8),
)
yminimum 180
ypos 75
# Checkboxes.
style l_checkbox is l_button:
left_padding INDENT
background checkbox(False, IDLE)
hover_background checkbox(False, HOVER)
selected_idle_background checkbox(True, IDLE)
selected_hover_background checkbox(True, HOVER)
insensitive_background checkbox(False, DISABLED)
style l_info_label is l_default:
xalign 0.5
ypos 75
yanchor 1.0
yoffset 12
style l_checkbox_text is l_button_text:
selected_font LIGHT
style l_info_label_text is l_default:
size size(36)
# Lines up with a checkbox.
style l_nonbox is l_button:
xpadding INDENT
style l_info_text is l_default:
xalign 0.5
style l_nonbox_text is l_button_text:
selected_font LIGHT
style l_info_button is l_button:
xalign 0.5
xmargin 50
# Projects list.
style l_projects is l_default:
background PROJECTS_WINDOW
style l_info_button_text is l_button_text:
text_align 0.5
layout "subtitle"
style hyperlink_text:
size size(18)
font LIGHT
color IDLE
hover_color HOVER
# Progress bar.
style l_progress_frame is l_default:
background Frame(PATTERN, 0, 0, tile=True)
ypadding 5
style l_progress_bar is l_default:
left_bar REVERSE_IDLE
right_bar Null()
ymaximum 24
# Navigation.
style l_navigation_button is l_button:
size_group "navigation"
right_margin INDENT
top_margin 3
style l_navigation_button_text is l_button_text:
size size(14)
font regular_font()
style l_navigation_text is l_text:
size size(14)
font light_font()
color TEXT
# Checkboxes.
style l_checkbox is l_button:
left_padding INDENT
background checkbox(False, IDLE)
hover_background checkbox(False, HOVER)
selected_idle_background checkbox(True, IDLE)
selected_hover_background checkbox(True, HOVER)
insensitive_background checkbox(False, DISABLED)
style l_checkbox_box:
yanchor 0.5
ypos 11
style l_checkbox_text is l_button_text:
selected_font light_font()
selected_bold False
# Lines up with a checkbox.
style l_nonbox is l_button:
xpadding INDENT
style l_nonbox_text is l_button_text:
selected_font light_font()
# Projects list.
style l_projects is l_default:
background PROJECTS_WINDOW
style hyperlink_text:
size size(18)
font light_font()
color IDLE
hover_color HOVER
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
+112
View File
@@ -0,0 +1,112 @@
init python:
TEST_PROJECTS = u"/tmp/renpy-moé"
import shutil
testcase default:
call new_project
call translate_project
call extract_dialogue
"Delete Persistent"
"Force Recompile"
call build_project
"quit"
testcase new_project:
python:
if os.path.exists(TEST_PROJECTS):
shutil.rmtree(TEST_PROJECTS)
os.mkdir(TEST_PROJECTS, 0o777)
persistent.projects_directory = TEST_PROJECTS
"refresh"
"Create New Project"
# Kind of interface
"New GUI Interface"
"Continue"
# Name
type "Test Project"
"Continue"
# Size
"1280x720"
"Continue"
# Color Selection
"Continue"
testcase choose_colors:
"Change/Update GUI"
"Choose new colors"
"Continue"
"Continue"
"Change/Update GUI"
"Regenerate the"
"Continue"
testcase translate_project:
"Generate Translations"
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type BACKSPACE
type "piglatin"
"Generate Translations"
"Continue"
"Generate Translations"
"Extract String Translations"
"Continue"
"Generate Translations"
"Merge String Translations"
"Continue"
"Generate Translations"
"Update Default"
testcase build_project:
"Build Distributions"
"Build"
testcase extract_dialogue_common:
"Extract Dialogue"
"Strip text tags"
"Escape quotes"
"Extract all"
testcase extract_dialogue:
call extract_dialogue_common
"Tab-delimited"
"Continue"
"Continue"
call extract_dialogue_common
"Text Only"
"Continue"
"Continue"
+1 -1
View File
@@ -1,4 +1,4 @@
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
+1 -1
View File
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# Copyright 2004-2014 Tom Rothamel <pytom@bishoujo.us>
# Copyright 2004-2016 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
-23
View File
@@ -1,23 +0,0 @@
translate arabic strings:
# game/add_file.rpy:7
old "FILENAME"
new "اسم الملف"
# game/add_file.rpy:7
old "Enter the name of the script file to create."
new "إختر اسم لملف الحوار الذي سيتم تكوينه"
# game/add_file.rpy:10
old "The filename must have the .rpy extension."
new "يجب ان ينتهي اسم الملف بالصيغة .rpy"
# game/add_file.rpy:18
old "The file already exists."
new "هذا الملف موجود مسبقاً"
# game/add_file.rpy:21
old "# Ren'Py automatically loads all script files ending with .rpy. To use this\n# file, define a label and jump to it from another file.\n"
new "رينباي يقوم بتشغيل الملفات المنتهية بـ .rpy تلقائياً. لكي تستعمل هذا الملف, اختر له تبويب وافتحه عبر ملف آخر."
-164
View File
@@ -1,164 +0,0 @@
# : Translation updated at 2013-11-17 23:18
translate arabic strings:
# game/android.rpy:12
old "To build Android packages, please download RAPT (from {a=http://www.renpy.org/dl/android}here{/a}), unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher."
new "لتجهيز اللعبة للعمل على اجهزة اندرويد يمكنك تحميل الحزمة الخاصة بذلك {a=http://www.renpy.org/dl/android}here{/a}) و فك الضغط عنها, ثم نسخها إلى مجلد رينباي الرئيسي ثم إعادة فتح هذا المشغِّل."
# game/android.rpy:13
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 موجوده, لكنك تحتاج لتنصيب Android SDK قبل ان تبدأ بتجهيز حزم للعمل على اندرويد. الرجاء اختيار تنصيب Android SDK لتستطيع ذلك."
# game/android.rpy:14
old "RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore."
new "حزمة اندرويد RAPT موجوده, لكن المفتاح لم يتم تجهيزه. الرجاء تكوين مفتاح جديد او استرجاع android.keystore"
# game/android.rpy:15
old "The current project has not been configured. Use \"Configure\" to configure it before building."
new "المشروع الحالي لم يتم تجهيز إعدادته. الرجاء اختيار \"Configure\" لتقوم بتجهيزها قبل بناء الحزمة."
# game/android.rpy:16
old "Choose \"Build\" to build the current project, or attach an Android device and choose \"Build & Install\" to build and install it on the device."
new "قم باختيار زر \"Build\" لتقوم بتجهيز المشروع الحالي إلى حزمة قابلة للعمل على اندرويد. او قم بربط جهاز اندرويد و اختيار \"Build & Install\" ليتم تنصيبها مباشرة على الجهاز المطلوب."
# game/android.rpy:18
old "Attempts to emulate an Android phone.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "يقوم بمحاكاة جهاز اندرويد هاتفي محمول. \n\n خاصية اللمس يتم محاكاتها عبر مؤشر الفأره, لكن فقط حين يكون زر الفأره مضغوطاً. زر الخروج يقوم باستدعاء نافذة القائمة الرئيسية, و PageUp هو زر العودة إلى الوراء."
# game/android.rpy:19
old "Attempts to emulate an Android tablet.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "يقوم بمحاكاة جهاز اندرويد تابلت. \n\n خاصية اللمس يتم محاكاتها عبر مؤشر الفأره, لكن فقط حين يكون زر الفأره مضغوطاً. زر الخروج يقوم باستدعاء نافذة القائمة الرئيسية, و PageUp هو زر العودة إلى الوراء"
# game/android.rpy:20
old "Attempts to emulate an OUYA 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 "يقوم بمحاكاة جهاز Ouya. \n\n يد التحكم تتم محاكاتها بأزرار الإتجاهات, زر الإدخال يحاكي select, زر الخروج يحاكي زر menu, و PageUp يحاكي زر العودة."
# game/android.rpy:22
old "Downloads and installs the Android SDK and supporting packages. Optionally, generates the keys required to sign the package."
new "يقوم بتحميل و تنصيب Android SDK والحزم المساندة لها. يعطيك خيار تكوين المفاتيح المطلوبة لتتمكن من استعمال الحزمة."
# game/android.rpy:23
old "Configures the package name, version, and other information about this project."
new "يقوم بتجهيز إعدادات الحزمة, رقم النسخة, و معلومات أخرى تتعلق بهذا المشروع."
# game/android.rpy:24
old "Opens the file containing the Google Play keys in the editor.\n\nThis is only needed if the application is using an expansion APK. Read the documentation for more details."
new "يفتح الملف الخاص بمعلومات مفتاح Google Play في محرر النصوص. \n\n هذه الخطوة غير مطلوبة إلا لو كان البرنامج يحتاج إحدى الحوم المساندة expansion APK. الرجاء الإطلاع على ملفات المساعدة للحصول على المزيد من المعلومات."
# game/android.rpy:25
old "Builds the Android package."
new "يقوم ببناء حزمة للأندرويد."
# game/android.rpy:26
old "Builds the Android package, and installs it on an Android device connected to your computer."
new "يقوم ببناء حزمة للأندرويد, ثم يقوم بتنصيبها على جهاز أندرويد المتصل بحاسوبك."
# game/android.rpy:142
old "{a=%s}%s{/a}"
new "{a=%s}%s{/a}"
# game/android.rpy:361
old "Android: [project.current.name!q]"
new "أندرويد: [project.current.name!q]"
# game/android.rpy:381
old "Emulation:"
new "محاكاة"
# game/android.rpy:389
old "Phone"
new "هاتف"
# game/android.rpy:393
old "Tablet"
new "تابلت/ لوحي"
# game/android.rpy:397
old "Television / OUYA"
new "تلفزيون / OUYA"
# game/android.rpy:409
old "Build:"
new ""
# game/android.rpy:417
old "Install SDK & Create Keys"
new "تنصيب SDK و اختلاق مفاتيح"
# game/android.rpy:421
old "Configure"
new "إعدادات"
# game/android.rpy:425
old "Build Package"
new "بناء الحزمة"
# game/android.rpy:429
old "Build & Install"
new "بناء و تنصيب"
# : Translation updated at 2014-04-17 13:01
translate arabic strings:
# game/android.rpy:30
old "To build Android packages, please download RAPT, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher."
new "لبناء ملفات الأندرويد, الرجاء تحميل RAPT, ثم فك الضغط عن الملف ووضعه في مجلد رينباي. قد تحتاج لإعادة تشغيل رينباي ليعمل بشكل صحيح."
# game/android.rpy:31
old "A 32-bit Java 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/index.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "تحتاج لنسخة برمجية من جافا تعتمد الـ 32-بت لتستطيع إنشاء ملفات الأندرويد على نظام الوندوز. حزمة JDK تختلف عن JRE, قد تكون الجافا لديك موجوده لكنها تفتقد الـ JDK. \n\n الرجاء {a=http://www.oracle.com/technetwork/java/javase/downloads/index.html}تحميل و تنصيب JDK{/a} ثم إعادة تشغيل رينباي"
# game/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 "يحاول محاكاة نظام تلفزيوني للأندرويد مثل جهاز OUYA او Fire TV. \n\n يتم تخطيط الأزرار لعصا التحكم لتناسب ازرار جهاز التحكم عن بعد. Controller 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."
# game/android.rpy:47
old "Connects to an Android device running ADB in TCP/IP mode."
new "يتصل بجهاز أندرويد يعمل على نظام ADB عن طريق TCP/IP mode"
# game/android.rpy:48
old "Disconnects from an Android device running ADB in TCP/IP mode."
new "يفصل الاتصال عن جهاز أندرويد يعمل على نظام ADB عن طريق TCP/IP mode"
# game/android.rpy:516
old "Other:"
new "آخر:"
# game/android.rpy:524
old "Remote ADB Connect"
new "الإتصال عن بعد عن طريق ADB"
# game/android.rpy:528
old "Remote ADB Disconnect"
new "قطع إتصال ADB عن بعد"
# game/android.rpy:561
old "Before packaging Android apps, you'll need to download RAPT, the Ren'Py Android Packaging Tool. Would you like to download RAPT now?"
new "قبل ان تصتطيع إنشاء ملفات للأندرويد, عليك ان تقوم بتحميل ملفات RAPT الخاصة بتحويل ملفات رينباي للأندرويد. هل تريد ان تقوم بتحميل الحزمة الآن؟"
# game/android.rpy:608
old "Remote ADB Address"
new "عنوان ADB عن بعد"
# game/android.rpy:609
old "Please enter the IP address and port number to connect to, in the form \"192.168.1.143:5555\". Consult your device's documentation to determine if it supports remote ADB, and if so, the address and port to use."
new "الرجاء إدخال عنوان الأي بي ورقم المنفذ المطلوب للإتصال, على شكل \"192.168.1.143:5555\". الرجاء العودة لدليل المستخدم الخاص بجهازك لتعرف إن كان يدعم الإتصال عن بعد للـ ADB و إن كان قادراً على ذلك, ستجد العنوان و المنفذ المطلوبان."
# game/android.rpy:619
old "Invalid remote ADB address"
new "عنوان ِADB خاطيء"
# game/android.rpy:619
old "The address must contain one exactly one ':'."
new "العنوان يجب ان يحتوي على علامة ':' واحده فقط لا غير"
# game/android.rpy:623
old "The host may not contain whitespace."
new "الخادم يجب ان لا يحتوي على مساحات فارغة"
# game/android.rpy:629
old "The port must be a number."
new "يجب ان يكون العنوان مكون من أرقام فقط"
-43
View File
@@ -1,43 +0,0 @@
translate arabic strings:
# game/choose_theme.rpy:274
old "Could not change the theme. Perhaps options.rpy was changed too much."
new "لم يتمكن رينباي من تغيير المظهر, ربما ملف options.rpy قد تغير بشكل كبير"
# game/choose_theme.rpy:332
old "Display"
new "عرض"
# game/choose_theme.rpy:333
old "Window"
new "نافذة"
# game/choose_theme.rpy:334
old "Fullscreen"
new "ملء الشاشة"
# game/choose_theme.rpy:335
old "Planetarium"
new "Planetarium"
# game/choose_theme.rpy:342
old "Sound Volume"
new "مستوى الصوت"
# game/choose_theme.rpy:376
old "Choose Theme"
new "إختر المظهر"
# game/choose_theme.rpy:389
old "Theme"
new "المظهر"
# game/choose_theme.rpy:413
old "Color Scheme"
new "توليفة الألوان"
# game/choose_theme.rpy:444
old "Continue"
new "استمرار"
+270 -463
View File
@@ -1,528 +1,335 @@
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# renpy/common/00action_file.rpy:118
# 00action_file.rpy:26
old "{#weekday}Monday"
new "{#weekday}Monday"
# 00action_file.rpy:26
old "{#weekday}Tuesday"
new "{#weekday}Tuesday"
# 00action_file.rpy:26
old "{#weekday}Wednesday"
new "{#weekday}Wednesday"
# 00action_file.rpy:26
old "{#weekday}Thursday"
new "{#weekday}Thursday"
# 00action_file.rpy:26
old "{#weekday}Friday"
new "{#weekday}Friday"
# 00action_file.rpy:26
old "{#weekday}Saturday"
new "{#weekday}Saturday"
# 00action_file.rpy:26
old "{#weekday}Sunday"
new "{#weekday}Sunday"
# 00action_file.rpy:37
old "{#weekday_short}Mon"
new "{#weekday_short}Mon"
# 00action_file.rpy:37
old "{#weekday_short}Tue"
new "{#weekday_short}Tue"
# 00action_file.rpy:37
old "{#weekday_short}Wed"
new "{#weekday_short}Wed"
# 00action_file.rpy:37
old "{#weekday_short}Thu"
new "{#weekday_short}Thu"
# 00action_file.rpy:37
old "{#weekday_short}Fri"
new "{#weekday_short}Fri"
# 00action_file.rpy:37
old "{#weekday_short}Sat"
new "{#weekday_short}Sat"
# 00action_file.rpy:37
old "{#weekday_short}Sun"
new "{#weekday_short}Sun"
# 00action_file.rpy:47
old "{#month}January"
new "{#month}January"
# 00action_file.rpy:47
old "{#month}February"
new "{#month}February"
# 00action_file.rpy:47
old "{#month}March"
new "{#month}March"
# 00action_file.rpy:47
old "{#month}April"
new "{#month}April"
# 00action_file.rpy:47
old "{#month}May"
new "{#month}May"
# 00action_file.rpy:47
old "{#month}June"
new "{#month}June"
# 00action_file.rpy:47
old "{#month}July"
new "{#month}July"
# 00action_file.rpy:47
old "{#month}August"
new "{#month}August"
# 00action_file.rpy:47
old "{#month}September"
new "{#month}September"
# 00action_file.rpy:47
old "{#month}October"
new "{#month}October"
# 00action_file.rpy:47
old "{#month}November"
new "{#month}November"
# 00action_file.rpy:47
old "{#month}December"
new "{#month}December"
# 00action_file.rpy:63
old "{#month_short}Jan"
new "{#month_short}Jan"
# 00action_file.rpy:63
old "{#month_short}Feb"
new "{#month_short}Feb"
# 00action_file.rpy:63
old "{#month_short}Mar"
new "{#month_short}Mar"
# 00action_file.rpy:63
old "{#month_short}Apr"
new "{#month_short}Apr"
# 00action_file.rpy:63
old "{#month_short}May"
new "{#month_short}May"
# 00action_file.rpy:63
old "{#month_short}Jun"
new "{#month_short}Jun"
# 00action_file.rpy:63
old "{#month_short}Jul"
new "{#month_short}Jul"
# 00action_file.rpy:63
old "{#month_short}Aug"
new "{#month_short}Aug"
# 00action_file.rpy:63
old "{#month_short}Sep"
new "{#month_short}Sep"
# 00action_file.rpy:63
old "{#month_short}Oct"
new "{#month_short}Oct"
# 00action_file.rpy:63
old "{#month_short}Nov"
new "{#month_short}Nov"
# 00action_file.rpy:63
old "{#month_short}Dec"
new "{#month_short}Dec"
# 00action_file.rpy:235
old "%b %d, %H:%M"
new "%b %d, %H:%M"
# : Translation updated at 2013-04-30 07:54
# 00action_file.rpy:820
old "Quick save complete."
new "تم الحفظ السريع"
translate arabic strings:
# renpy/common/00gltest.rpy:50
old "Graphics Acceleration"
new "تسريع الرسومات"
# renpy/common/00gltest.rpy:54
old "Automatically Choose"
new "إختر بشكل اوتوماتيكي"
# renpy/common/00gltest.rpy:59
old "Force Angle/DirectX Renderer"
new "فرض استعمال محركات Angle/DirectX"
# renpy/common/00gltest.rpy:63
old "Force OpenGL Renderer"
new "فرض استعمال محركات OpenGL"
# renpy/common/00gltest.rpy:67
old "Force Software Renderer"
new "فرض استعمال المحركات البرمجية software renderer"
# renpy/common/00gltest.rpy:73
old "Changes will take effect the next time this program is run."
new "سيتم تفعيل التغييرات في المرة القادمة التي تفتح فيها البرنامج"
# renpy/common/00gltest.rpy:77
old "Quit"
new "خروج"
# renpy/common/00gltest.rpy:82
old "Return"
new "عودة"
# renpy/common/00gltest.rpy:112
old "Performance Warning"
new "تحذير عن الأداء"
# renpy/common/00gltest.rpy:117
old "This computer is using software rendering."
new "هذا الجهاز يستعمل software rendering"
# renpy/common/00gltest.rpy:119
old "This computer is not using shaders."
new "هذا الجهاز لا يستعمل shaders"
# renpy/common/00gltest.rpy:121
old "This computer is displaying graphics slowly."
new "هذا الجهاز يستعرض الرسوميات بشكل بطيء"
# renpy/common/00gltest.rpy:123
old "This computer has a problem displaying graphics: [problem]."
new "هذا الجهاز يواجه مشكلة في استعراض الرسوميات [problem]"
# renpy/common/00gltest.rpy:128
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
new "محركات الرسوميات قد تكون قديمة او لا تعمل بشكل صحيح. قد يسبب ذلك بطء او اخطاء في الاستعراض, القيام بتحديث directX قد يساعد في حل المشكلة."
# renpy/common/00gltest.rpy:130
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new " محركات الرسوميات قد تكون قديمة او لا تعمل بشكل صحيح. قد يسبب ذلك بطء او اخطاء في الاستعراض."
# renpy/common/00gltest.rpy:135
old "Update DirectX"
new "تحديث DirectX"
# renpy/common/00gltest.rpy:141
old "Continue, Show this warning again"
new "استمرار, الرجاء عرض هذا التحذير في المرة الثادمة ايضاً"
# renpy/common/00gltest.rpy:145
old "Continue, Don't show warning again"
new "استمرار, لا تعرض هذا التحذير مرة اخرى"
# renpy/common/00gltest.rpy:171
old "Updating DirectX."
new "يتم تحديث DirectX"
# renpy/common/00gltest.rpy:175
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
new "يتم الآن تنصيب DirectX, قد يبدأ ذلك بشكل مصغر في شريط المهام. الرجاء اتباع التعليمات لاكمال التنصيب."
# renpy/common/00gltest.rpy:179
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
new "{b}ملاحظة:{/b} مايكروسوفت دايركت أكس يقوم تلقائياً بتنصيب شريط بينق Bing toolbar. إذا لم ترغب بذلك الرجاء القيام بإلغاء تحديد خانة الاختيار"
# renpy/common/00gltest.rpy:183
old "When setup finishes, please click below to restart this program."
new "حيثن ينتهي التنصيب, الرجاء الضغط ادناه لإعادة تشغيل البرنامج"
# renpy/common/00gltest.rpy:185
old "Restart"
new "إعادة تشغيل"
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# renpy/common/00keymap.rpy:167
old "Saved screenshot as %s."
new "تم حفظ الصورة كـ %s"
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# renpy/common/00layout.rpy:421
# 00gui.rpy:227
old "Are you sure?"
new "هل انت متأكد؟"
# renpy/common/00layout.rpy:422
# 00gui.rpy:228
old "Are you sure you want to delete this save?"
new "هل انت متأكد من رغبتك في حذف خانة الحفظ هذه؟"
# renpy/common/00layout.rpy:423
# 00gui.rpy:229
old "Are you sure you want to overwrite your save?"
new "هل انت متأكد من رغبتك في الحفظ على هذه الخانة؟"
# renpy/common/00layout.rpy:424
# 00gui.rpy:230
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "الاسترجاع سيضيع كل ما فعلته منذ خانة الحفظ السابقة. \n هل انت متأكد من رغبتك في الاسترجاع إلى هذه النقطة؟"
# renpy/common/00layout.rpy:425
# 00gui.rpy:231
old "Are you sure you want to quit?"
new "هل انت متأكد من رغبتك في الخروج؟"
# renpy/common/00layout.rpy:426
# 00gui.rpy:232
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "هل انت متأكد من رغبتك في العودة للقائمة الرئيسية؟ \n كل ما لم تقم بحفظة سيضيع."
# : Translation updated at 2013-04-30 07:54
# 00gui.rpy:233
old "Are you sure you want to end the replay?"
new "Are you sure you want to end the replay?"
translate arabic strings:
# renpy/common/00library.rpy:77
old "Skip Mode"
new "وضع التسريع"
# renpy/common/00library.rpy:80
old "Fast Skip Mode"
new "وضع التسريع السريع"
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# renpy/common/00updater.rpy:1258
old "Updater"
new "برنامج التحديث"
# renpy/common/00updater.rpy:1267
old "This program is up to date."
new "هذه النسخة هي الأحدث"
# renpy/common/00updater.rpy:1269
old "[u.version] is available. Do you want to install it?"
new "النسخة [u.version] متوفرة, هل ترغب في تنصيبها؟"
# renpy/common/00updater.rpy:1271
old "Preparing to download the updates."
new "يتم التجهيز لتحميل البرنامج من الانترنت"
# renpy/common/00updater.rpy:1273
old "Downloading the updates."
new "يتم تنزيل التحديثات"
# renpy/common/00updater.rpy:1275
old "Unpacking the updates."
new "يتم فك الضغط عن التحديثات"
# renpy/common/00updater.rpy:1279
old "The updates have been installed. The program will restart."
new "تم التحديث.. سيتم إعادة تشغيل البرنامج."
# renpy/common/00updater.rpy:1281
old "The updates have been installed."
new "تم التحديث."
# renpy/common/00updater.rpy:1283
old "The updates were cancelled."
new "تم إلغاء التحديث."
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# renpy/common/_compat/gamemenu.rpym:180
old "Empty Slot."
new "خانة فارغة"
# renpy/common/_compat/gamemenu.rpym:337
old "Previous"
new "السابق"
# renpy/common/_compat/gamemenu.rpym:344
old "Next"
new "التالي"
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# renpy/common/_compat/preferences.rpym:411
old "Joystick Mapping"
new "خيارات عصى التحكم"
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# renpy/common/_errorhandling.rpym:408
old "An exception has occurred."
new "حصل استثناء"
# renpy/common/_errorhandling.rpym:434
old "Rollback"
new "تراجع"
# renpy/common/_errorhandling.rpym:436
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "يقوم بالتراجع لنقطة سابقة لكي تستطيع اختيار شيء آخر"
# renpy/common/_errorhandling.rpym:439
old "Ignore"
new "تجاهل"
# renpy/common/_errorhandling.rpym:441
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "يتجاهل الاستثناء مما يستمح لك بالاستمرار. قد يسبب هذا المزيد من الاخطاء."
# renpy/common/_errorhandling.rpym:444
old "Reload"
new "إعادة المحاولة"
# renpy/common/_errorhandling.rpym:446
old "Reloads the game from disk, saving and restoring game state if possible."
new "يعيد تشغيل اللعبة من القرص الصلب, مع محاولة استعمادة آخر نقطة وحفظها عند الإستطاعة."
# renpy/common/_errorhandling.rpym:448
old "Open Traceback"
new "قراءة التقرير"
# renpy/common/_errorhandling.rpym:450
old "Opens the traceback.txt file in a text editor."
new "يفتح تقرير الخطأ في برنامج الملفات النصية."
# renpy/common/_errorhandling.rpym:456
old "Quits the game."
new "يخرج من اللعبة."
# renpy/common/_errorhandling.rpym:483
old "Parsing the script failed."
new "حصل خطأ أثناء تشغيل النص."
# renpy/common/_errorhandling.rpym:510
old "Open Parse Errors"
new "يفتح قائمة اخطاء التشغيل."
# renpy/common/_errorhandling.rpym:512
old "Opens the errors.txt file in a text editor."
new "يفتح ملف errors.txt في برنامج الملفات النصية"
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# renpy/common/_layout/classic_load_save.rpym:152
old "a"
new "a"
# renpy/common/_layout/classic_load_save.rpym:161
old "q"
new "q"
# : Translation updated at 2013-11-17 23:18
translate arabic strings:
# renpy/common/00action_file.rpy:587
old "Quick save complete."
new "تم الحفظ السريع بنجاح"
# : Translation updated at 2013-11-17 23:18
translate arabic strings:
# renpy/common/00gallery.rpy:521
old "Image [index] of [count] locked."
new "يوجد عدد صور [index] من أصل [count] مقفل"
# renpy/common/00gallery.rpy:539
old "prev"
new "السابق"
# renpy/common/00gallery.rpy:540
old "next"
new "التالي"
# renpy/common/00gallery.rpy:541
old "slideshow"
new "عرض الشرائح"
# renpy/common/00gallery.rpy:542
old "return"
new "العودة"
# : Translation updated at 2013-11-17 23:18
translate arabic strings:
# renpy/common/00layout.rpy:427
# 00gui.rpy:234
old "Are you sure you want to begin skipping?"
new "هل أنت متأكد من رغبتك في البدء بالتسريع؟"
# renpy/common/00layout.rpy:428
# 00gui.rpy:235
old "Are you sure you want to skip to the next choice?"
new "هل انت متأكد من رغبتك في التسريع حتى الخيار التالي؟"
# renpy/common/00layout.rpy:429
old "Are you sure you want to skip to unseen dialogue or the next choice?"
new "هل انت متأكد من رغبتك في تسريع الخيارات و الحوار الذي لم يسبق لك قرائته؟"
# 00gui.rpy:236
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "Are you sure you want to skip unseen dialogue to the next choice?"
# : Translation updated at 2014-04-17 13:01
# 00keymap.rpy:250
old "Saved screenshot as %s."
new "تم حفظ الصورة كـ %s"
translate arabic strings:
# 00library.rpy:142
old "Self-voicing disabled."
new "Self-voicing disabled."
# renpy/common/00console.rpy:179
old "%(version)s console, originally by Shiz, C, and delta.\n"
new ""
# 00library.rpy:143
old "Clipboard voicing enabled. "
new "Clipboard voicing enabled. "
# renpy/common/00console.rpy:180
old "Press <esc> to exit console. Type help for help.\n"
new "إضغط زر الخروج لإغلاق لوحة التحكم, اكتب كلمة help للمساعدة"
# 00library.rpy:144
old "Self-voicing enabled. "
new "Self-voicing enabled. "
# renpy/common/00console.rpy:184
old "Ren'Py script enabled."
new "لغة برمحة رينباي متاحه"
# 00library.rpy:179
old "Skip Mode"
new "وضع التسريع"
# renpy/common/00console.rpy:186
old "Ren'Py script disabled."
new "لغة برمجة رينباي غير متاحه"
# 00library.rpy:262
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 "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}."
# renpy/common/00console.rpy:392
old "help: show this help"
new "مساعده: عرض هذه المساعده"
# 00preferences.rpy:422
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "تشغيل الأصوات من الحافظة مفعّل. إضغط لإيقافه زريّ: Shift+C"
# renpy/common/00console.rpy:397
old "commands:\n"
new "أوامر: \n"
# 00preferences.rpy:424
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
# renpy/common/00console.rpy:407
old " <renpy script statement>: run the statement\n"
new "<renpy script statement>: عرض الأوامر\n"
# 00preferences.rpy:426
old "Self-voicing enabled. Press 'v' to disable."
new "التكلّم التلقائي مفعَل. لإيقافه إضغط زر V"
# renpy/common/00console.rpy:409
old " <python expression or statement>: run the expression or statement"
new " <python expression or statement>: عرض التعبير او الأوامر"
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
new "Contacting App Store\nPlease Wait..."
# renpy/common/00console.rpy:417
old "clear: clear the console history"
new "clear: مسح تاريخ لوحة التحكم"
# 00updater.rpy:367
old "The Ren'Py Updater is not supported on mobile devices."
new "تحديث برنامج رينباي غير مدعوم على الأجهزة المحمولة."
# renpy/common/00console.rpy:421
old "exit: exit the console"
new "exit: الخروج من لوحة التحكم"
# 00updater.rpy:486
old "An error is being simulated."
new "يتم محاكاة خطأ الآن."
# renpy/common/00console.rpy:429
old "load <slot>: loads the game from slot"
new "استرجاع <slot>: يقوم باسترجاع اللعب من نقطة الحفظ"
# 00updater.rpy:662
old "Either this project does not support updating, or the update status file was deleted."
new "هذا المشروع لا يدعم التحديث، أو أن ملف حالة نسخة البرنامج محذوفة."
# renpy/common/00console.rpy:442
old "save <slot>: saves the game in slot"
new "حفظ <slot>: يقوم بحفظ اللعب في نقطة الحفظ"
# 00updater.rpy:676
old "This account does not have permission to perform an update."
new "هذا الحساب ليست لديه الصلاحية ليقوم بالتحديث."
# renpy/common/00console.rpy:453
old "reload: reloads the game, refreshing the scripts"
new "reload: يعيد تشغيل اللعبة مع عرض التغييرات في النص"
# 00updater.rpy:679
old "This account does not have permission to write the update log."
new " هذا الحساب ليست لديه الصلاحية ليكتب ملف التحديث."
# renpy/common/00console.rpy:461
old "watch <expression>: watch a python expression"
new "مشاهده <expression>: يقوم بعرض تبيرات بايثون"
# 00updater.rpy:704
old "Could not verify update signature."
new "لم نتمكن من التحقق من توقيع التحديث update signature."
# renpy/common/00console.rpy:470
old "unwatch <expression>: stop watching an expression"
new "unwatch <expression>: يقوم بإيقاف تعبير بايثون"
# 00updater.rpy:975
old "The update file was not downloaded."
new "لم يتم تحميل ملف التحديث."
# renpy/common/00console.rpy:478
old "unwatchall: stop watching all expressions"
new "unwatchall: يقوم بإيقاف كل تعبيرات بايثون"
# 00updater.rpy:993
old "The update file does not have the correct digest - it may have been corrupted."
new "ملف التحديث لا يحتوي على المختصرات الصحيحة - قد يكون معطوباً."
# renpy/common/00console.rpy:484
old "jump <label>: jumps to label"
new "jump <label>: يقفز للعنوان"
# 00updater.rpy:1049
old "While unpacking {}, unknown type {}."
new "عند فك الحزمة {}، نوع مجهول {}."
# : Translation updated at 2014-04-17 13:01
# 00updater.rpy:1393
old "Updater"
new "برنامج التحديث"
translate arabic strings:
# 00updater.rpy:1404
old "This program is up to date."
new "هذه النسخة هي الأحدث"
# renpy/common/00keymap.rpy:332
old "Autoreload"
new "إعادة التحميل تلقائياً"
# 00updater.rpy:1406
old "[u.version] is available. Do you want to install it?"
new "النسخة [u.version] متوفرة, هل ترغب في تنصيبها؟"
# : Translation updated at 2014-04-17 13:01
# 00updater.rpy:1408
old "Preparing to download the updates."
new "يتم التجهيز لتحميل البرنامج من الانترنت"
translate arabic strings:
# 00updater.rpy:1410
old "Downloading the updates."
new "يتم تنزيل التحديثات"
# renpy/common/_developer/developer.rpym:65
old "Developer Menu"
new "قائمة المبرمج"
# 00updater.rpy:1412
old "Unpacking the updates."
new "يتم فك الضغط عن التحديثات"
# renpy/common/_developer/developer.rpym:67
old "Reload Game (Shift+R)"
new "إعادة تشغيل اللعبة (Shift+R)"
# 00updater.rpy:1416
old "The updates have been installed. The program will restart."
new "تم التحديث.. سيتم إعادة تشغيل البرنامج."
# renpy/common/_developer/developer.rpym:69
old "Console (Shift+O)"
new "لوحة التحكم (Shift+O)"
# 00updater.rpy:1418
old "The updates have been installed."
new "تم التحديث."
# renpy/common/_developer/developer.rpym:71
old "Variable Viewer"
new "مستعرض الأوامر"
# 00updater.rpy:1420
old "The updates were cancelled."
new "تم إلغاء التحديث."
# renpy/common/_developer/developer.rpym:73
old "Theme Test"
new "اختبار القوالب"
# 00gallery.rpy:563
old "Image [index] of [count] locked."
new "يوجد عدد صور [index] من أصل [count] مقفل"
# renpy/common/_developer/developer.rpym:75
old "Image Location Picker"
new "مكان الصور المطلوبة"
# 00gallery.rpy:583
old "prev"
new "السابق"
# renpy/common/_developer/developer.rpym:77
old "Filename List"
new "قائمة اسماء الملفات"
# 00gallery.rpy:584
old "next"
new "التالي"
# renpy/common/_developer/developer.rpym:81
old "Show Image Load Log"
new "عرض قائمة الصور "
# 00gallery.rpy:585
old "slideshow"
new "عرض الشرائح"
# renpy/common/_developer/developer.rpym:84
old "Hide Image Load Log"
new "إخفاء قائمة الصور"
# renpy/common/_developer/developer.rpym:149
old "No variables have changed since the game started."
new "لم يتم تغيير اي من الأوامر منذ ان بدأت اللعبة"
# renpy/common/_developer/developer.rpym:152
old "Return to the developer menu"
new "العودة للوحة المبرمج"
# renpy/common/_developer/developer.rpym:272
old "{b}Missing Images{/b}"
new "{b}صور مفقودة{/b}"
# renpy/common/_developer/developer.rpym:424
old "Rectangle: %r"
new "مثلث: %r"
# renpy/common/_developer/developer.rpym:429
old "Mouse position: %r"
new "مكان المؤشر: %r"
# renpy/common/_developer/developer.rpym:431
old "Right-click or escape to quit."
new "إضغط بالزر الايمن او إضغط زر الخروح للإغلاق"
# renpy/common/_developer/developer.rpym:482
old "Done"
new "تم"
# : Translation updated at 2014-04-17 13:01
translate arabic strings:
# renpy/common/_developer/inspector.rpym:43
old "Displayable Inspector"
new "اختبار المستعرضات"
# renpy/common/_developer/inspector.rpym:49
old "Nothing to inspect."
new "لا يوجد شيء ليتم اختباره"
# renpy/common/_developer/inspector.rpym:58
old "Size"
new "حجم"
# renpy/common/_developer/inspector.rpym:63
old "Style"
new "مظهر"
# renpy/common/_developer/inspector.rpym:123
old "Inspecting Styles of [displayable_name!q]"
new "يتم اختبار المظهر الخاص بـ [displayable_name!q]"
# renpy/common/_developer/inspector.rpym:135
old "displayable:"
new "مستعرضات"
# renpy/common/_developer/inspector.rpym:142
old " (no properties affect the displayable)"
new " (لا توجد اي مؤثرات على هذا المستعرض)"
# renpy/common/_developer/inspector.rpym:144
old " (default properties omitted)"
new " (تم استبعاد تأثير المؤثرات القياسية)"
# renpy/common/_developer/inspector.rpym:174
old "<repr() failed>"
new "<repr() failed>"
# Translation updated at 2014-09-30 23:01
translate arabic strings:
# renpy/common/_developer/inspector.rpym:80
old "Location"
new "الموقع"
# 00gallery.rpy:586
old "return"
new "العودة"
+179
View File
@@ -0,0 +1,179 @@
translate arabic strings:
# _developer/developer.rpym:38
old "Developer Menu"
new "قائمة المبرمج"
# _developer/developer.rpym:43
old "Reload Game (Shift+R)"
new "إعادة تشغيل اللعبة (Shift+R)"
# _developer/developer.rpym:45
old "Console (Shift+O)"
new "لوحة التحكم (Shift+O)"
# _developer/developer.rpym:47
old "Variable Viewer"
new "مستعرض الأوامر"
# _developer/developer.rpym:49
old "Theme Test"
new "اختبار القوالب"
# _developer/developer.rpym:51
old "Image Location Picker"
new "مكان الصور المطلوبة"
# _developer/developer.rpym:53
old "Filename List"
new "قائمة اسماء الملفات"
# _developer/developer.rpym:57
old "Show Image Load Log"
new "عرض قائمة الصور "
# _developer/developer.rpym:60
old "Hide Image Load Log"
new "إخفاء قائمة الصور"
# _developer/developer.rpym:95
old "Nothing to inspect."
new "لا يوجد شيء ليتم اختباره"
# _developer/developer.rpym:217
old "Return to the developer menu"
new "العودة للوحة المبرمج"
# _developer/developer.rpym:373
old "Rectangle: %r"
new "مثلث: %r"
# _developer/developer.rpym:378
old "Mouse position: %r"
new "مكان المؤشر: %r"
# _developer/developer.rpym:383
old "Right-click or escape to quit."
new "إضغط بالزر الايمن او إضغط زر الخروح للإغلاق"
# _developer/developer.rpym:412
old "Rectangle copied to clipboard."
new "تم نسخ المربع إلى الحافظة."
# _developer/developer.rpym:415
old "Position copied to clipboard."
new "تم نسخ الموضع إلى الحافظة."
# _developer/developer.rpym:524
old "✔ "
new "✔ "
# _developer/developer.rpym:527
old "✘ "
new "✘ "
# _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}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
new "اختبار المستعرضات"
# _developer/inspector.rpym:61
old "Size"
new "حجم"
# _developer/inspector.rpym:65
old "Style"
new "مظهر"
# _developer/inspector.rpym:71
old "Location"
new "الموقع"
# _developer/inspector.rpym:122
old "Inspecting Styles of [displayable_name!q]"
new "يتم اختبار المظهر الخاص بـ [displayable_name!q]"
# _developer/inspector.rpym:139
old "displayable:"
new "مستعرضات"
# _developer/inspector.rpym:145
old " (no properties affect the displayable)"
new " (لا توجد اي مؤثرات على هذا المستعرض)"
# _developer/inspector.rpym:147
old " (default properties omitted)"
new " (تم استبعاد تأثير المؤثرات القياسية)"
# _developer/inspector.rpym:185
old "<repr() failed>"
new "<repr() failed>"
# 00console.rpy:182
old "Press <esc> to exit console. Type help for help.\n"
new "إضغط زر الخروج لإغلاق لوحة التحكم, اكتب كلمة help للمساعدة"
# 00console.rpy:186
old "Ren'Py script enabled."
new "لغة برمحة رينباي متاحه"
# 00console.rpy:188
old "Ren'Py script disabled."
new "لغة برمجة رينباي غير متاحه"
# 00console.rpy:398
old "help: show this help"
new "مساعده: عرض هذه المساعده"
# 00console.rpy:403
old "commands:\n"
new "أوامر: \n"
# 00console.rpy:413
old " <renpy script statement>: run the statement\n"
new "<renpy script statement>: عرض الأوامر\n"
# 00console.rpy:415
old " <python expression or statement>: run the expression or statement"
new " <python expression or statement>: عرض التعبير او الأوامر"
# 00console.rpy:423
old "clear: clear the console history"
new "clear: مسح تاريخ لوحة التحكم"
# 00console.rpy:427
old "exit: exit the console"
new "exit: الخروج من لوحة التحكم"
# 00console.rpy:435
old "load <slot>: loads the game from slot"
new "استرجاع <slot>: يقوم باسترجاع اللعب من نقطة الحفظ"
# 00console.rpy:448
old "save <slot>: saves the game in slot"
new "حفظ <slot>: يقوم بحفظ اللعب في نقطة الحفظ"
# 00console.rpy:459
old "reload: reloads the game, refreshing the scripts"
new "reload: يعيد تشغيل اللعبة مع عرض التغييرات في النص"
# 00console.rpy:467
old "watch <expression>: watch a python expression"
new "مشاهده <expression>: يقوم بعرض تبيرات بايثون"
# 00console.rpy:493
old "unwatch <expression>: stop watching an expression"
new "unwatch <expression>: يقوم بإيقاف تعبير بايثون"
# 00console.rpy:519
old "unwatchall: stop watching all expressions"
new "unwatchall: يقوم بإيقاف كل تعبيرات بايثون"
# 00console.rpy:536
old "jump <label>: jumps to label"
new "jump <label>: يقفز للعنوان"
-52
View File
@@ -1,52 +0,0 @@
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# game/distribute.rpy:333
old "Nothing to do."
new "لا شيء لإنجازه"
# game/distribute.rpy:337
old "Scanning project files..."
new "يتم فحص الملفات..."
# game/distribute.rpy:344
old "Scanning Ren'Py files..."
new "يتم فحص ملفات رينباي..."
# game/distribute.rpy:494
old "Archiving files..."
new "يتم أرشفة الملفات..."
# game/distribute.rpy:745
old "Writing the [variant] [format] package."
new "يتم كتابة ملفات [variant] [format]"
# game/distribute.rpy:758
old "Making the [variant] update zsync file."
new "Making the [variant] update zsync file."
# game/distribute.rpy:854
old "Processed {b}[complete]{/b} of {b}[total]{/b} files."
new "تم انهاء {b}[complete]{/b} من عدد {b}[total]{/b} من الملفات."
# game/distribute.rpy:915
old "All packages have been built.\n\nDue to the presence of permission information, unpacking and repacking the Linux and Macintosh distributions on Windows is not supported."
new "تم الإنتهاء من تكوين رزمة البيانات لنشر اللعبة. بسبب اختلاف نظام الملفات في الأنظمة التشغيلية ماك و لينوكس, لا يمكن فك الضغط عن الرزمة الخاصة بتلك الأنظمة على نظام وندوز."
# : Translation updated at 2013-11-17 23:18
translate arabic strings:
# game/distribute.rpy:358
old "No packages are selected, so there's nothing to do."
new "لم يتم اختيار اي حزمة, لم يحصل اي شيء."
# : Translation updated at 2014-04-17 13:01
translate arabic strings:
# game/distribute.rpy:335
old "Building distributions failed:\n\nThe build.directory_name variable may not include the space, colon, or semicolon characters."
new "فشل بناء ملفات النشر. build.directory_name يجب أن لا يحتوي على مساحات فارغة, فواصل, او فواصل منقوطة في إسم المجلد "
@@ -1,47 +0,0 @@
translate arabic strings:
# game/distribute_gui.rpy:139
old "Build Distributions: [project.current.name!q]"
new "تجميع الملفات تجهيزاً للنشر: [project.current.name!q]"
# game/distribute_gui.rpy:154
old "Directory Name:"
new "اسم المجلد:"
# game/distribute_gui.rpy:158
old "Executable Name:"
new "اسم الملف التشغيلي:"
# game/distribute_gui.rpy:167
old "Actions:"
new "الأوامر:"
# game/distribute_gui.rpy:175
old "Edit options.rpy"
new "تحرير options.rpy"
# game/distribute_gui.rpy:176
old "Refresh"
new "إعادة تحميل"
# game/distribute_gui.rpy:193
old "Build Packages:"
new "بناء الرزمة البيانية:"
# game/distribute_gui.rpy:208
old "Build Updates"
new "بناء تحديثات:"
# game/distribute_gui.rpy:212
old "Build"
new "بناء"
# game/distribute_gui.rpy:219
old "Errors were detected when running the project. Please ensure the project runs without errors before building distributions."
new "تم ايجاد بعض الاخطاء في المشروع. الرجاء التأكد من خلو المشروع من الأخطاء قبل نشره بشكل نهائي."
# game/distribute_gui.rpy:236
old "Your project does not contain build information. Would you like to add build information to the end of options.rpy?"
new "مشروعك يخلو من معلومات النشر, هل ترغب في إضافة هذه المعلومات في نهاية ملف options.rpy؟"
-64
View File
@@ -1,64 +0,0 @@
# Translation updated at 2013-04-30 07:54
translate arabic strings:
# game/editor.rpy:120
old "{b}Recommended.{/b} A beta editor with an easy to use interface and features that aid in development, such as spell-checking. Editra currently lacks the IME support required for Chinese, Japanese, and Korean text input."
new "{b}نقترح.{/b} محرر نص له واجهة سهلة الاستعمال ويعين على كتابة النصوص البرمجية يفضل برنامج يحتوي على مدقق لغوي. Editraحالياً لا يدعم اللغات الأجنبية مثل اللغه الكورية و الصينية و اليابانية."
# game/editor.rpy:121
old "{b}Recommended.{/b} A beta editor with an easy to use interface and features that aid in development, such as spell-checking. Editra currently lacks the IME support required for Chinese, Japanese, and Korean text input. On Linux, Editra requires wxPython."
new "{b}نقترح.{/b} محرر نص له واجهة سهلة الاستعمال ويعين على كتابة النصوص البرمجية يفضل برنامج يحتوي على مدقق لغوي. Editraحالياً لا يدعم اللغات الأجنبية مثل اللغه الكورية و الصينية و اليابانية. على نظام لينوكس, Editra يحتاج wxPython."
# game/editor.rpy:137
old "The may have occured because wxPython is not installed on this system."
new "قد يكون السبب ان wxPython غير موجود على هذا الجهاز."
# game/editor.rpy:144
old "Up to 22 MB download required."
new "مطلوب تحميل ملف بحجم 22 ميغا بايت."
# game/editor.rpy:157
old "1.8 MB download required."
new "مطلوب تحميل ملف بحجم 1.8 ميغا بايت."
# game/editor.rpy:158
old "This may have occured because Java is not installed on this system."
new "قد يكون السبب ان الجافا غير موجوده على هذا الجهاز."
# game/editor.rpy:327
old "An exception occured while launching the text editor:\n[exception!q]"
new "حصل استثناء اثناء فتح المحرر: \n[exception!q]"
# game/editor.rpy:378
old "Select Editor"
new "الرجاء اختيار المحرر"
# game/editor.rpy:393
old "A text editor is the program you'll use to edit Ren'Py script files. Here, you can select the editor Ren'Py will use. If not already present, the editor will be automatically downloaded and installed."
new "محرر النصوص هو برنامج يساعدك على تعديل ملفات رينباي البرمجية والحوار. هنا, يمكنك اختيار المحرر الذي سيستعلمه رينباي. إذا لم يكن لديك مسبقاً, سيتم تحميله و تنصيبه بشكل اوتوماتيكي."
# game/editor.rpy:415
old "Cancel"
new "إلغاء الامر"
# Translation updated at 2013-11-17 23:18
translate arabic strings:
# game/editor.rpy:137
old "This may have occured because wxPython is not installed on this system."
new "قد يكون سبب ذلك ان wxPython غير موجود في نظام التشغيل لديك"
# game/editor.rpy:155
old "A mature editor that requires Java."
new "محرر متخصص يستعمل لغة جافا"
# game/editor.rpy:164
old "Invokes the editor your operating system has associated with .rpy files."
new "يقوم بفتح البرنامج المسؤول عن تحرير ملفات .rpy في نظامك التشغيلي"
# game/editor.rpy:180
old "Prevents Ren'Py from opening a text editor."
new "يمنع رينباي من فتح اي محرر نصوص"
+179
View File
@@ -0,0 +1,179 @@
translate arabic strings:
# 00gltest.rpy:64
old "Graphics Acceleration"
new "تسريع الرسومات"
# 00gltest.rpy:70
old "Automatically Choose"
new "إختيار اوتوماتيكي"
# 00gltest.rpy:75
old "Force Angle/DirectX Renderer"
new "فرض الزاوية/دايركت × ومحركاته"
# 00gltest.rpy:79
old "Force OpenGL Renderer"
new "فرض محرك OpenGL"
# 00gltest.rpy:83
old "Force Software Renderer"
new "فرض محركات البرامج"
# 00gltest.rpy:93
old "Enable"
new "Enable"
# 00gltest.rpy:109
old "Changes will take effect the next time this program is run."
new "التغييرات سيتم تطبيقها في المرة القادمة تفتح البرنامج"
# 00gltest.rpy:141
old "Performance Warning"
new "تحذير تشغيلي"
# 00gltest.rpy:146
old "This computer is using software rendering."
new "هذا الحاسوب يستعمل محركات البرامج software rendering"
# 00gltest.rpy:148
old "This computer is not using shaders."
new "هذا الحاسوب لا يستعمل اي shaders"
# 00gltest.rpy:150
old "This computer is displaying graphics slowly."
new "هذا الحاسوب يستعرض الرسوميات بشكل بطيء"
# 00gltest.rpy:152
old "This computer has a problem displaying graphics: [problem]."
new "هذا الحاسوب يواجه مشكلة في عرض الرسوميات [problem]"
# 00gltest.rpy:157
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
new "محركات الرسوميات قد تكون قديمة او لا تعمل بشكل صحيح. قد يسبب ذلك بطء او اخطاء في الاستعراض, القيام بتحديث directX قد يساعد في حل المشكلة."
# 00gltest.rpy:159
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new " محركات الرسوميات قد تكون قديمة او لا تعمل بشكل صحيح. قد يسبب ذلك بطء او اخطاء في الاستعراض."
# 00gltest.rpy:164
old "Update DirectX"
new "تحديث DirectX"
# 00gltest.rpy:170
old "Continue, Show this warning again"
new "استمرار, الرجاء عرض هذا التحذير في المرة الثادمة ايضاً"
# 00gltest.rpy:174
old "Continue, Don't show warning again"
new "استمرار, لا تعرض هذا التحذير مرة اخرى"
# 00gltest.rpy:192
old "Updating DirectX."
new "يتم تحديث DirectX"
# 00gltest.rpy:196
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
new "يتم الآن تنصيب DirectX, قد يبدأ ذلك بشكل مصغر في شريط المهام. الرجاء اتباع التعليمات لاكمال التنصيب."
# 00gltest.rpy:200
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
new "{b}ملاحظة:{/b} مايكروسوفت دايركت أكس يقوم تلقائياً بتنصيب شريط بينق Bing toolbar. إذا لم ترغب بذلك الرجاء القيام بإلغاء تحديد خانة الاختيار"
# 00gltest.rpy:204
old "When setup finishes, please click below to restart this program."
new "حيثن ينتهي التنصيب, الرجاء الضغط ادناه لإعادة تشغيل البرنامج"
# 00gltest.rpy:206
old "Restart"
new "إعادة تشغيل"
# 00gamepad.rpy:32
old "Select Gamepad to Calibrate"
new "Select Gamepad to Calibrate"
# 00gamepad.rpy:35
old "No Gamepads Available"
new "No Gamepads Available"
# 00gamepad.rpy:54
old "Calibrating [name] ([i]/[total])"
new "Calibrating [name] ([i]/[total])"
# 00gamepad.rpy:58
old "Press or move the [control!r] [kind]."
new "Press or move the [control!r] [kind]."
# 00gamepad.rpy:66
old "Skip (A)"
new "Skip (A)"
# 00gamepad.rpy:69
old "Back (B)"
new "Back (B)"
# _errorhandling.rpym:495
old "Open Traceback"
new "قراءة التقرير"
# _errorhandling.rpym:497
old "Opens the traceback.txt file in a text editor."
new "يفتح تقرير الخطأ في برنامج الملفات النصية."
# _errorhandling.rpym:499
old "Copy to Clipboard"
new "Copy to Clipboard"
# _errorhandling.rpym:501
old "Copies the traceback.txt file to the clipboard."
new "Copies the traceback.txt file to the clipboard."
# _errorhandling.rpym:519
old "An exception has occurred."
new "حصل استثناء"
# _errorhandling.rpym:538
old "Rollback"
new "تراجع"
# _errorhandling.rpym:540
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "يقوم بالتراجع لنقطة سابقة لكي تستطيع اختيار شيء آخر"
# _errorhandling.rpym:543
old "Ignore"
new "تجاهل"
# _errorhandling.rpym:545
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "يتجاهل الاستثناء مما يستمح لك بالاستمرار. قد يسبب هذا المزيد من الاخطاء."
# _errorhandling.rpym:548
old "Reload"
new "إعادة المحاولة"
# _errorhandling.rpym:550
old "Reloads the game from disk, saving and restoring game state if possible."
new "يعيد تشغيل اللعبة من القرص الصلب, مع محاولة استعمادة آخر نقطة وحفظها عند الإستطاعة."
# _errorhandling.rpym:560
old "Quits the game."
new "يخرج من اللعبة."
# _errorhandling.rpym:582
old "Parsing the script failed."
new "حصل خطأ أثناء تشغيل النص."
# _errorhandling.rpym:606
old "Open Parse Errors"
new "يفتح قائمة اخطاء التشغيل."
# _errorhandling.rpym:608
old "Opens the errors.txt file in a text editor."
new "يفتح ملف errors.txt في برنامج الملفات النصية"
# _errorhandling.rpym:612
old "Copies the errors.txt file to the clipboard."
new "Copies the errors.txt file to the clipboard."
-116
View File
@@ -1,116 +0,0 @@
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# game/front_page.rpy:79
old "+ Create New Project"
new "+ إبدأ مشروعاً جديداً"
# game/front_page.rpy:90
old "Launch Project"
new "تشغيل المشروع"
# game/front_page.rpy:111
old "Tutorial"
new "الدليل العملي"
# game/front_page.rpy:112
old "The Question"
new "السؤال"
# game/front_page.rpy:128
old "Active Project"
new "المشروع الحالي"
# game/front_page.rpy:136
old "Open Directory"
new "فتح مجلد"
# game/front_page.rpy:141
old "game"
new "اللعبة"
# game/front_page.rpy:142
old "base"
new "المشروع كله"
# game/front_page.rpy:148
old "Edit File"
new "تحرير ملف"
# game/front_page.rpy:156
old "All script files"
new "جميع الملفات النصية"
# game/front_page.rpy:165
old "Navigate Script"
new "مهام إضافية"
# game/front_page.rpy:176
old "Check Script (Lint)"
new "فحص الملف (لينت)"
# game/front_page.rpy:177
old "Change Theme"
new "تغيير المظهر"
# game/front_page.rpy:178
old "Delete Persistent"
new "حذف الملفات المؤقتة"
# game/front_page.rpy:186
old "Build Distributions"
new "تجميع المشروع للنشر"
# game/front_page.rpy:188
old "Generate Translations"
new "تجهيز ملفات للترجمة"
# game/front_page.rpy:204
old "Checking script for potential problems..."
new "يتم فحص الملفات لأي اخطاء محتملة..."
# game/front_page.rpy:219
old "Deleting persistent data..."
new "يتم الآن حذف الملفات المؤقتة "
# : Translation updated at 2013-11-17 23:18
translate arabic strings:
# game/front_page.rpy:204
old "Android"
new "أندرويد"
# game/front_page.rpy:206
old "Extract Dialogue"
new "استخراج النص"
# : Translation updated at 2014-04-17 13:01
translate arabic strings:
# game/front_page.rpy:144
old "[p.name!q] (template)"
new "[p.name!q] (template)"
# Translation updated at 2014-09-30 23:01
translate arabic strings:
# game/front_page.rpy:35
old "Open [text] directory."
new "فتح المجلد [text]"
# game/front_page.rpy:150
old "Select project [text]."
new "اختر المشروع [text]"
# game/front_page.rpy:234
old "Force Recompile"
new "إعادة حزم الملفات"
# game/front_page.rpy:285
old "Recompiling all rpy files into rpyc files..."
new "يتم إعادة حزم الملفات من صيغة rpy إلى rpyc..."
+411
View File
@@ -0,0 +1,411 @@
translate arabic strings:
# gui.rpy:2
old "## Initialization"
new "## Initialization"
# gui.rpy:5
old "## The init offset statement causes the init code in this file to run before init code in any other file."
new "## The init offset statement causes the init code in this file to run before init code in any other file."
# gui.rpy:9
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
new "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
# gui.rpy:21
old "## Colors"
new "## Colors"
# gui.rpy:23
old "## The colors of text in the interface."
new "## The colors of text in the interface."
# gui.rpy:25
old "## An accent color used throughout the interface to label and highlight text."
new "## An accent color used throughout the interface to label and highlight text."
# gui.rpy:29
old "## The color used for a text button when it is neither selected nor hovered."
new "## The color used for a text button when it is neither selected nor hovered."
# gui.rpy:32
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
new "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
# gui.rpy:36
old "## The color that is used for buttons and bars that are hovered."
new "## The color that is used for buttons and bars that are hovered."
# gui.rpy:39
old "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
new "## 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."
# gui.rpy:43
old "## The color used for a text button when it cannot be selected."
new "## The color used for a text button when it cannot be selected."
# gui.rpy:46
old "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
new "## 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."
# gui.rpy:51
old "## The colors used for dialogue and menu choice text."
new "## The colors used for dialogue and menu choice text."
# gui.rpy:56
old "## Fonts and Font Sizes"
new "## Fonts and Font Sizes"
# gui.rpy:58
old "## The font used for in-game text."
new "## The font used for in-game text."
# gui.rpy:61
old "## The font used for character names."
new "## The font used for character names."
# gui.rpy:64
old "## The font used for out-of-game text."
new "## The font used for out-of-game text."
# gui.rpy:67
old "## The size of normal dialogue text."
new "## The size of normal dialogue text."
# gui.rpy:70
old "## The size of character names."
new "## The size of character names."
# gui.rpy:73
old "## The size of text in the game's user interface."
new "## The size of text in the game's user interface."
# gui.rpy:76
old "## The size of labels in the game's user interface."
new "## The size of labels in the game's user interface."
# gui.rpy:79
old "## The size of text on the notify screen."
new "## The size of text on the notify screen."
# gui.rpy:82
old "## The size of the game's title."
new "## The size of the game's title."
# gui.rpy:86
old "## Main and Game Menus"
new "## Main and Game Menus"
# gui.rpy:88
old "## The images used for the main and game menus."
new "## The images used for the main and game menus."
# gui.rpy:92
old "## Should we show the name and version of the game?"
new "## Should we show the name and version of the game?"
# gui.rpy:96
old "## Dialogue"
new "## Dialogue"
# gui.rpy:98
old "## These variables control how dialogue is displayed on the screen one line at a time."
new "## These variables control how dialogue is displayed on the screen one line at a time."
# gui.rpy:101
old "## The height of the textbox containing dialogue."
new "## The height of the textbox containing dialogue."
# gui.rpy:104
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 "## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is center, and 1.0 is the bottom."
# gui.rpy:109
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 "## 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."
# gui.rpy:114
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 "## 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."
# gui.rpy:118
old "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
new "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
# gui.rpy:123
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
new "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
# gui.rpy:132
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 "## 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."
# gui.rpy:138
old "## The maximum width of dialogue text, in pixels."
new "## The maximum width of dialogue text, in pixels."
# gui.rpy:141
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 "## 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."
# gui.rpy:146
old "## Buttons"
new "## Buttons"
# gui.rpy:148
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
new "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
# gui.rpy:151
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
new "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
# gui.rpy:155
old "## The borders on each side of the button, in left, top, right, bottom order."
new "## The borders on each side of the button, in left, top, right, bottom order."
# gui.rpy:158
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
new "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
# gui.rpy:162
old "## The font used by the button."
new "## The font used by the button."
# gui.rpy:165
old "## The size of the text used by the button."
new "## The size of the text used by the button."
# gui.rpy:179
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 "## 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."
# gui.rpy:183
old "## These customizations are used by the default interface:"
new "## These customizations are used by the default interface:"
# gui.rpy:198
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 "## 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."
# gui.rpy:205
old "## Choice Buttons"
new "## Choice Buttons"
# gui.rpy:207
old "## Choice buttons are used in the in-game menus."
new "## Choice buttons are used in the in-game menus."
# gui.rpy:220
old "## File Slot Buttons"
new "## File Slot Buttons"
# 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 "## 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."
# gui.rpy:226
old "## The save slot button."
new "## The save slot button."
# gui.rpy:234
old "## The width and height of thumbnails used by the save slots."
new "## The width and height of thumbnails used by the save slots."
# gui.rpy:238
old "## The number of columns and rows in the grid of save slots."
new "## The number of columns and rows in the grid of save slots."
# gui.rpy:243
old "## Positioning and Spacing"
new "## Positioning and Spacing"
# gui.rpy:245
old "## These variables control the positioning and spacing of various user interface elements."
new "## These variables control the positioning and spacing of various user interface elements."
# gui.rpy:248
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
new "## The position of the left side of the navigation buttons, relative to the left side of the screen."
# gui.rpy:252
old "## The vertical position of the skip indicator."
new "## The vertical position of the skip indicator."
# gui.rpy:255
old "## The vertical position of the notify screen."
new "## The vertical position of the notify screen."
# gui.rpy:258
old "## The spacing between menu choices."
new "## The spacing between menu choices."
# gui.rpy:261
old "## Buttons in the navigation section of the main and game menus."
new "## Buttons in the navigation section of the main and game menus."
# gui.rpy:264
old "## Controls the amount of spacing between preferences."
new "## Controls the amount of spacing between preferences."
# gui.rpy:267
old "## Controls the amount of spacing between preference buttons."
new "## Controls the amount of spacing between preference buttons."
# gui.rpy:270
old "## The spacing between file page buttons."
new "## The spacing between file page buttons."
# gui.rpy:273
old "## The spacing between file slots."
new "## The spacing between file slots."
# gui.rpy:277
old "## Frames"
new "## Frames"
# gui.rpy:279
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
new "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
# gui.rpy:282
old "## Generic frames that are introduced by player code."
new "## Generic frames that are introduced by player code."
# gui.rpy:285
old "## The frame that is used as part of the confirm screen."
new "## The frame that is used as part of the confirm screen."
# gui.rpy:288
old "## The frame that is used as part of the skip screen."
new "## The frame that is used as part of the skip screen."
# gui.rpy:291
old "## The frame that is used as part of the notify screen."
new "## The frame that is used as part of the notify screen."
# gui.rpy:294
old "## Should frame backgrounds be tiled?"
new "## Should frame backgrounds be tiled?"
# gui.rpy:298
old "## Bars, Scrollbars, and Sliders"
new "## Bars, Scrollbars, and Sliders"
# gui.rpy:300
old "## These control the look and size of bars, scrollbars, and sliders."
new "## These control the look and size of bars, scrollbars, and sliders."
# gui.rpy:302
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written code."
new "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written code."
# gui.rpy:305
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
new "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
# gui.rpy:311
old "## True if bar images should be tiled. False if they should be linearly scaled."
new "## True if bar images should be tiled. False if they should be linearly scaled."
# gui.rpy:316
old "## Horizontal borders."
new "## Horizontal borders."
# gui.rpy:321
old "## Vertical borders."
new "## Vertical borders."
# gui.rpy:326
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
new "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
# gui.rpy:331
old "## History"
new "## History"
# gui.rpy:333
old "## The history screen displays dialogue that the player has already dismissed."
new "## The history screen displays dialogue that the player has already dismissed."
# gui.rpy:335
old "## The number of blocks of dialogue history Ren'Py will keep."
new "## The number of blocks of dialogue history Ren'Py will keep."
# gui.rpy:338
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
new "## The height of a history screen entry, or None to make the height variable at the cost of performance."
# gui.rpy:342
old "## The position, width, and alignment of the label giving the name of the speaking character."
new "## The position, width, and alignment of the label giving the name of the speaking character."
# gui.rpy:349
old "## The position, width, and alignment of the dialogue text."
new "## The position, width, and alignment of the dialogue text."
# gui.rpy:356
old "## NVL-Mode"
new "## NVL-Mode"
# gui.rpy:358
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
new "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
# gui.rpy:360
old "## The borders of the background of the NVL-mode background window."
new "## The borders of the background of the NVL-mode background window."
# gui.rpy:363
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
new "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
# gui.rpy:367
old "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
new "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
# gui.rpy:384
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
new "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
# gui.rpy:391
old "## The position of nvl menu_buttons."
new "## The position of nvl menu_buttons."
# gui.rpy:403
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
new "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
# gui.rpy:409
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
new "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
# gui.rpy:413
old "## Font sizes."
new "## Font sizes."
# gui.rpy:421
old "## Adjust the location of the textbox."
new "## Adjust the location of the textbox."
# gui.rpy:427
old "## Change the size and spacing of items in the game menu."
new "## Change the size and spacing of items in the game menu."
# gui.rpy:436
old "## File button layout."
new "## File button layout."
# gui.rpy:440
old "## NVL-mode."
new "## NVL-mode."
# gui.rpy:456
old "## Quick buttons."
new "## Quick buttons."
-90
View File
@@ -1,90 +0,0 @@
translate arabic strings:
# game/interface.rpy:89
old "Documentation"
new "المستندات المرفقة"
# game/interface.rpy:90
old "Ren'Py Website"
new "موقع رينباي"
# game/interface.rpy:91
old "Ren'Py Games List"
new "قائمة ألعاب رينباي"
# game/interface.rpy:92
old "About"
new "معلومات"
# game/interface.rpy:99
old "update"
new "تحديث"
# game/interface.rpy:101
old "preferences"
new "خيارات"
# game/interface.rpy:102
old "quit"
new "خروج"
# game/interface.rpy:149
old "Yes"
new "نعم"
# game/interface.rpy:151
old "No"
new "لا"
# game/interface.rpy:181
old "Due to package format limitations, non-ASCII file and directory names are not allowed."
new "بسبب محدودية التجميع, الاحرف الغير لاتينيه غير مسموح بها في اسم الملف او المجلدات"
# game/interface.rpy:183
old "[title]"
new "[title]"
# game/interface.rpy:248
old "ERROR"
new "خطأ"
# game/interface.rpy:280
old "While [what!q], an error occured:"
new "حصل خطأ أثناء [what!q]"
# game/interface.rpy:281
old "[exception!q]"
new "[exception!q]"
# game/interface.rpy:298
old "Text input may not contain the {{ or [[ characters."
new "لا يمكن استعمال الرمزان {{ و ]] هنا"
# game/interface.rpy:303
old "File and directory names may not contain / or \\."
new "غير مسموح ان يحتوي اسم الملف او المجلد على الرمزان / أو \\"
# game/interface.rpy:309
old "File and directory names must consist of ASCII characters."
new "اسم الملف و المجلدات التي تحتويه يجب ان تكون مكتوبة بأحرف ASCII "
# game/interface.rpy:330
old "INFORMATION"
new "معلومات"
# game/interface.rpy:373
old "PROCESSING"
new "يتم إجراء العمليات"
# game/interface.rpy:390
old "QUESTION"
new "سؤال"
translate arabic strings:
# game/interface.rpy:451
old "CHOICE"
new "إختيار"
File diff suppressed because it is too large Load Diff
-71
View File
@@ -1,71 +0,0 @@
translate arabic strings:
# game/navigation.rpy:150
old "Navigate: [project.current.name]"
new "الذهاب إلى: [project.current.name]"
# game/navigation.rpy:159
old "Order: "
new "الترتيب:"
# game/navigation.rpy:160
old "alphabetical"
new "أبجدي"
# game/navigation.rpy:162
old "by-file"
new "ملف ملف"
# game/navigation.rpy:164
old "natural"
new "طبيعي"
# game/navigation.rpy:168
old "refresh"
new "إعادة تحميل"
# game/navigation.rpy:176
old "Category:"
new "فئة:"
# game/navigation.rpy:178
old "files"
new "ملفات"
# game/navigation.rpy:179
old "labels"
new "وسم"
# game/navigation.rpy:180
old "defines"
new "تحديد"
# game/navigation.rpy:181
old "transforms"
new "التحول"
# game/navigation.rpy:182
old "screens"
new "النوافذ"
# game/navigation.rpy:183
old "callables"
new "ما يمكن استجلابه"
# game/navigation.rpy:184
old "TODOs"
new "TODOs"
# game/navigation.rpy:223
old "+ Add script file"
new "+إضافة ملف نص"
# game/navigation.rpy:231
old "No TODO comments found.\n\nTo create one, include \"# TODO\" in your script."
new "No TODO comments found.\n\nTo create one, include \"# TODO\" in your script."
# game/navigation.rpy:238
old "The list of names is empty."
new "قائمة الأسماء فارغة"
-48
View File
@@ -1,48 +0,0 @@
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# game/new_project.rpy:22
old "Choose Project Template"
new "الرجاء اختيار تصميم المظهر للمشروع"
# game/new_project.rpy:40
old "Please select a template to use for your new project. Ren'Py ships with a default template that creates an English-language game with standard screens."
new "الرجاء اختيار التصميم الذي ترغبه لمشروعك الجديد. رينباي يأتي بعدة تصاميم قياسية يمكنك التعديل عليها لاحقاً."
# game/new_project.rpy:55
old "PROJECT NAME"
new "اسم المشروع"
# game/new_project.rpy:56
old "Please enter the name of your project:"
new "الرجاء اختيار اسم لمشروعك الجديد"
# game/new_project.rpy:62
old "The project name may not be empty."
new "لا يمكن ان يكون اسم المشروع فارغاً"
# game/new_project.rpy:67
old "[project_name!q] already exists. Please choose a different project name."
new "الاسم [project_name!q] يوجد مسبقاً, الرجاء اختيار اسم مختلف."
# game/new_project.rpy:70
old "[project_dir!q] already exists. Please choose a different project name."
new "[project_dir!q] يوجد مسبقاً, الرجاء اختيار اسم مختلف."
# : Translation updated at 2013-11-17 23:18
translate arabic strings:
# game/new_project.rpy:40
old "Please select a template to use for your new project. The template sets the default font and the user interface language. If your language is not supported, choose 'english'."
new "الرجاء اختيار القالب المطلوب للمشروع الجديد. هذه القوالب تقوم بتجهيز اتجاه النص و اللغه المستخدمة في الواجهة لتسهل عملية البدء. إذا لم تكن لغتك مدعومة الرجاء اختيار اللغة الانجليزية."
# : Translation updated at 2014-04-17 13:01
translate arabic strings:
# game/new_project.rpy:71
old "The projects directory could not be set. Giving up."
new "لم يتم تحديد مجلد المشاريع, سيتم الإلغاء"
+27
View File
@@ -0,0 +1,27 @@
translate arabic strings:
# _layout/classic_joystick_preferences.rpym:94
old "Joystick Mapping"
new "خيارات عصى التحكم"
# _layout/classic_load_save.rpym:138
old "Empty Slot."
new "خانة فارغة"
# _layout/classic_load_save.rpym:170
old "a"
new "a"
# _layout/classic_load_save.rpym:179
old "q"
new "q"
# _compat/gamemenu.rpym:355
old "Previous"
new "السابق"
# _compat/gamemenu.rpym:362
old "Next"
new "التالي"
+195
View File
@@ -0,0 +1,195 @@
translate arabic strings:
# options.rpy:1
old "## This file contains options that can be changed to customize your game."
new "## This file contains options that can be changed to customize your game."
# options.rpy:4
old "## Lines beginning with two '#' marks are comments, and you shouldn't uncomment them. Lines beginning with a single '#' mark are commented-out code, and you may want to uncomment them when appropriate."
new "## Lines beginning with two '#' marks are comments, and you shouldn't uncomment them. Lines beginning with a single '#' mark are commented-out code, and you may want to uncomment them when appropriate."
# options.rpy:10
old "## Basics"
new "## Basics"
# options.rpy:12
old "## A human-readable name of the game. This is used to set the default window title, and shows up in the interface and error reports."
new "## A human-readable name of the game. This is used to set the default window title, and shows up in the interface and error reports."
# options.rpy:15
old "## The _() surrounding the string marks it as eligible for translation."
new "## The _() surrounding the string marks it as eligible for translation."
# options.rpy:17
old "Ren'Py 7 Default GUI"
new "Ren'Py 7 Default GUI"
# options.rpy:20
old "## Determines if the title given above is shown on the main menu screen. Set this to False to hide the title."
new "## Determines if the title given above is shown on the main menu screen. Set this to False to hide the title."
# options.rpy:26
old "## The version of the game."
new "## The version of the game."
# options.rpy:31
old "## Text that is placed on the game's about screen. To insert a blank line between paragraphs, write \\n\\n."
new "## Text that is placed on the game's about screen. To insert a blank line between paragraphs, write \\n\\n."
# options.rpy:37
old "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
new "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
# options.rpy:44
old "## Sounds and music"
new "## Sounds and music"
# options.rpy:46
old "## These three variables control which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
new "## These three variables control which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
# options.rpy:55
old "## To allow the user to play a test sound on the sound or voice channel, uncomment a line below and use it to set a sample sound to play."
new "## To allow the user to play a test sound on the sound or voice channel, uncomment a line below and use it to set a sample sound to play."
# options.rpy:62
old "## Uncomment the following line to set an audio file that will be played while the player is at the main menu. This file will continue playing into the game, until it is stopped or another file is played."
new "## Uncomment the following line to set an audio file that will be played while the player is at the main menu. This file will continue playing into the game, until it is stopped or another file is played."
# options.rpy:69
old "## Transitions"
new "## Transitions"
# options.rpy:71
old "## These variables set transitions that are used when certain events occur. Each variable should be set to a transition, or None to indicate that no transition should be used."
new "## These variables set transitions that are used when certain events occur. Each variable should be set to a transition, or None to indicate that no transition should be used."
# options.rpy:75
old "## Entering or exiting the game menu."
new "## Entering or exiting the game menu."
# options.rpy:81
old "## A transition that is used after a game has been loaded."
new "## A transition that is used after a game has been loaded."
# options.rpy:86
old "## Used when entering the main menu after the game has ended."
new "## Used when entering the main menu after the game has ended."
# options.rpy:91
old "## A variable to set the transition used when the game starts does not exist. Instead, use a with statement after showing the initial scene."
new "## A variable to set the transition used when the game starts does not exist. Instead, use a with statement after showing the initial scene."
# options.rpy:96
old "## Window management"
new "## Window management"
# options.rpy:98
old "## This controls when the dialogue window is displayed. If \"show\", it is always displayed. If \"hide\", it is only displayed when dialogue is present. If \"auto\", the window is hidden before scene statements and shown again once dialogue is displayed."
new "## This controls when the dialogue window is displayed. If \"show\", it is always displayed. If \"hide\", it is only displayed when dialogue is present. If \"auto\", the window is hidden before scene statements and shown again once dialogue is displayed."
# options.rpy:103
old "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
new "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
# options.rpy:109
old "## Transitions used to show and hide the dialogue window"
new "## Transitions used to show and hide the dialogue window"
# options.rpy:115
old "## Preference defaults"
new "## Preference defaults"
# options.rpy:117
old "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
new "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
# options.rpy:123
old "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
new "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
# options.rpy:129
old "## Save directory"
new "## Save directory"
# options.rpy:131
old "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
new "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
# options.rpy:134
old "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
new "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
# options.rpy:136
old "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
new "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
# options.rpy:138
old "## Linux: $HOME/.renpy/<config.save_directory>"
new "## Linux: $HOME/.renpy/<config.save_directory>"
# options.rpy:140
old "## This generally should not be changed, and if it is, should always be a literal string, not an expression."
new "## This generally should not be changed, and if it is, should always be a literal string, not an expression."
# options.rpy:146
old "## Icon ########################################################################'"
new "## Icon ########################################################################'"
# options.rpy:148
old "## The icon displayed on the taskbar or dock."
new "## The icon displayed on the taskbar or dock."
# options.rpy:153
old "## Build configuration"
new "## Build configuration"
# options.rpy:155
old "## This section controls how Ren'Py turns your project into distribution files."
new "## This section controls how Ren'Py turns your project into distribution files."
# options.rpy:160
old "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
new "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
# options.rpy:165
old "## In a pattern:"
new "## In a pattern:"
# options.rpy:167
old "## / is the directory separator."
new "## / is the directory separator."
# options.rpy:169
old "## * matches all characters, except the directory separator."
new "## * matches all characters, except the directory separator."
# options.rpy:171
old "## ** matches all characters, including the directory separator."
new "## ** matches all characters, including the directory separator."
# options.rpy:173
old "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
new "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
# options.rpy:177
old "## Classify files as None to exclude them from the built distributions."
new "## Classify files as None to exclude them from the built distributions."
# options.rpy:185
old "## To archive files, classify them as 'archive'."
new "## To archive files, classify them as 'archive'."
# options.rpy:190
old "## Files matching documentation patterns are duplicated in a mac app build, so they appear in both the app and the zip file."
new "## Files matching documentation patterns are duplicated in a mac app build, so they appear in both the app and the zip file."
# options.rpy:196
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 "## 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."
# options.rpy:203
old "## The username and project name associated with an itch.io project, separated by a slash."
new "## The username and project name associated with an itch.io project, separated by a slash."
-84
View File
@@ -1,84 +0,0 @@
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# game/preferences.rpy:40
old "Launcher Preferences"
new "خيارات برنامج التشغيل"
# game/preferences.rpy:61
old "Projects Directory:"
new "دليل المشاريع:"
# game/preferences.rpy:68
old "[persistent.projects_directory!q]"
new "[persistent.projects_directory!q]"
# game/preferences.rpy:70
old "Not Set"
new "غير محدد"
# game/preferences.rpy:84
old "Text Editor:"
new "محرر الملفات النصية:"
# game/preferences.rpy:106
old "Update Channel:"
new "مصدر التحديثات:"
# game/preferences.rpy:126
old "Navigation Options:"
new "خيارات استعراض المجلدات"
# game/preferences.rpy:130
old "Include private names"
new "تضمين الأسماء الخاصة"
# game/preferences.rpy:131
old "Include library names"
new "تضمين اسماء المكتبات"
# game/preferences.rpy:141
old "Launcher Options:"
new "خيارات برنامج التشغيل:"
# game/preferences.rpy:145
old "Hardware rendering"
new "الإستعراض بواسطة قطع الجهاز الداخلية"
# game/preferences.rpy:148
old "Console output"
new "الإستعراض بواسطة البرمجيات المتوفرة"
# game/preferences.rpy:169
old "Open launcher project"
new "فتح الواجهة التشغيلية كمشروع"
# game/preferences.rpy:183
old "Language:"
new "اللغة:"
# Translation updated at 2014-04-17 13:01
translate arabic strings:
# game/preferences.rpy:164
old "Show templates"
new "عرض القوالب"
# Translation updated at 2014-09-30 23:01
translate arabic strings:
# game/preferences.rpy:91
old "Projects directory: [text]"
new "مجلد المشاريع [text]"
# game/preferences.rpy:114
old "Text editor: [text]"
new "محرر النصوص [text]"
# game/preferences.rpy:171
old "Large fonts"
new "خط كبير"
-68
View File
@@ -1,68 +0,0 @@
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# game/project.rpy:196
old "Ren'Py is scanning the project..."
new "رينباي يقوم بفحص المشروع"
# game/project.rpy:485
old "PROJECTS DIRECTORY"
new "سياق مجلدات المشاريع"
# game/project.rpy:485
old "Please choose the projects directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"
new "الرجاء اختيار نسق المشاريع من الصفحة الخاصة بذلك. \n{b}قد تكون النافذة ظهرت خلف هذه النافذة.{/b}"
# game/project.rpy:485
old "This launcher will scan for projects in this directory, will create new projects in this directory, and will place built projects into this directory."
new "سيقوم البرنامج بفحص المجلد هذا لإيجاد المشاريع السابقة, أو ليضع المشاريع الجديده فيه, و ايضاً لوضع المشاريع المنتهيه عند تجهيزها للنشر."
# game/project.rpy:525
old "Ren'Py was unable to run python with tkinter to choose the projects directory."
new "رينباي لم يستطع تشغيل برمجيات بايثون للبحث عن مجلد المشاريع."
# game/project.rpy:529
old "Ren'Py has set the projects directory to:"
new "رينباي قام بتحديد مجلد المشاريع إلى المكان التالي:"
# : Translation updated at 2014-04-17 13:01
translate arabic strings:
# game/project.rpy:48
old "After making changes to the script, press shift+R to reload your game."
new "عند إجراء أي تغييرات في ملف الحوار, يمكنك ضغط shift+R لترى التغييرات داخل اللعبة"
# game/project.rpy:49
old "Press shift+O (the letter) to access the console."
new "إضغط shift+O للدخول على لوحة التحكم"
# game/project.rpy:50
old "Press shift+D to access the developer menu."
new "إضغط shift+D للدخول على لوحة تحكم المبرمج"
# game/project.rpy:219
old "Launching the project failed."
new "لم تنجح محاولة إقلاع المشروع"
# game/project.rpy:219
old "Please ensure that your project launches normally before running this command."
new "الرجاء التأكد من سلامة إقلاع المشروع قبل تشغيل هذا الأمر البرمجي"
# game/project.rpy:516
old "Launching"
new "جاري الإقلاع"
# game/project.rpy:585
old "Ren'Py was unable to run python with tkinter to choose the projects directory. Please install the python-tk or tkinter package."
new "رينباي لم يتمكن من تشغيل بايثون مع tkinter لكي يختار مجلد المشاريع, الرجاء تنصيب Python-tk او tkinter"
# Translation updated at 2014-09-30 23:01
translate arabic strings:
# game/project.rpy:47
old "Have you backed up your projects recently?"
new "هل قمت بعمل نسخة احتياطية من مشاريعك مؤخراً؟"
+643
View File
@@ -0,0 +1,643 @@
translate arabic strings:
# screens.rpy:9
old "## Styles"
new "## Styles"
# screens.rpy:87
old "## In-game screens"
new "## In-game screens"
# screens.rpy:91
old "## Say screen"
new "## Say screen"
# screens.rpy:93
old "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
new "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
# screens.rpy:98
old "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
new "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
# screens.rpy:102
old "## https://www.renpy.org/doc/html/screen_special.html#say"
new "## https://www.renpy.org/doc/html/screen_special.html#say"
# screens.rpy:169
old "## Input screen"
new "## Input screen"
# screens.rpy:171
old "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
new "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
# screens.rpy:174
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
new "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
# screens.rpy:177
old "## http://www.renpy.org/doc/html/screen_special.html#input"
new "## http://www.renpy.org/doc/html/screen_special.html#input"
# screens.rpy:205
old "## Choice screen"
new "## Choice screen"
# screens.rpy:207
old "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, is a list of objects, each with caption and action fields."
new "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, is a list of objects, each with caption and action fields."
# screens.rpy:211
old "## http://www.renpy.org/doc/html/screen_special.html#choice"
new "## http://www.renpy.org/doc/html/screen_special.html#choice"
# screens.rpy:221
old "## When this is true, menu captions will be spoken by the narrator. When false, menu captions will be displayed as empty buttons."
new "## When this is true, menu captions will be spoken by the narrator. When false, menu captions will be displayed as empty buttons."
# screens.rpy:244
old "## Quick Menu screen"
new "## Quick Menu screen"
# screens.rpy:246
old "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
new "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
# screens.rpy:261
old "Back"
new "عودة"
# screens.rpy:262
old "History"
new "History"
# screens.rpy:263
old "Skip"
new "تخطي"
# screens.rpy:264
old "Auto"
new "تلقائي"
# screens.rpy:265
old "Save"
new "حفظ"
# screens.rpy:266
old "Q.Save"
new "حفظ سريع"
# screens.rpy:267
old "Q.Load"
new "استرجاع سريع"
# screens.rpy:268
old "Prefs"
new "خيارات"
# screens.rpy:271
old "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
new "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
# screens.rpy:291
old "## Navigation screen"
new "## Navigation screen"
# screens.rpy:293
old "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
new "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
# screens.rpy:308
old "Start"
new "Start"
# screens.rpy:316
old "Load"
new "Load"
# screens.rpy:318
old "Preferences"
new "خيارات"
# screens.rpy:322
old "End Replay"
new "End Replay"
# screens.rpy:326
old "Main Menu"
new "القائمة الرئيسية"
# screens.rpy:328
old "About"
new "معلومات"
# screens.rpy:332
old "## Help isn't necessary or relevant to mobile devices."
new "## Help isn't necessary or relevant to mobile devices."
# screens.rpy:333
old "Help"
new "مساعدة"
# screens.rpy:335
old "## The quit button is banned on iOS and unnecessary on Android."
new "## The quit button is banned on iOS and unnecessary on Android."
# screens.rpy:336
old "Quit"
new "خروج"
# screens.rpy:350
old "## Main Menu screen"
new "## Main Menu screen"
# screens.rpy:352
old "## Used to display the main menu when Ren'Py starts."
new "## Used to display the main menu when Ren'Py starts."
# screens.rpy:354
old "## http://www.renpy.org/doc/html/screen_special.html#main-menu"
new "## http://www.renpy.org/doc/html/screen_special.html#main-menu"
# screens.rpy:369
old "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
new "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
# screens.rpy:413
old "## Game Menu screen"
new "## Game Menu screen"
# screens.rpy:415
old "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
new "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
# screens.rpy:418
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
new "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
# screens.rpy:476
old "Return"
new "عودة"
# screens.rpy:539
old "## About screen"
new "## About screen"
# screens.rpy:541
old "## This screen gives credit and copyright information about the game and Ren'Py."
new "## This screen gives credit and copyright information about the game and Ren'Py."
# screens.rpy:544
old "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
new "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
# screens.rpy:551
old "## This use statement includes the game_menu screen inside this one. The vbox child is then included inside the viewport inside the game_menu screen."
new "## This use statement includes the game_menu screen inside this one. The vbox child is then included inside the viewport inside the game_menu screen."
# screens.rpy:561
old "Version [config.version!t]\n"
new "Version [config.version!t]\n"
# screens.rpy:563
old "## gui.about is usually set in options.rpy."
new "## gui.about is usually set in options.rpy."
# screens.rpy:567
old "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
new "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
# screens.rpy:570
old "## This is redefined in options.rpy to add text to the about screen."
new "## This is redefined in options.rpy to add text to the about screen."
# screens.rpy:582
old "## Load and Save screens"
new "## Load and Save screens"
# screens.rpy:584
old "## These screens are responsible for letting the player save the game and load it again. Since they share nearly everything in common, both are implemented in terms of a third screen, file_slots."
new "## These screens are responsible for letting the player save the game and load it again. Since they share nearly everything in common, both are implemented in terms of a third screen, file_slots."
# screens.rpy:588
old "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
new "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
# screens.rpy:607
old "Page {}"
new "Page {}"
# screens.rpy:607
old "Automatic saves"
new "Automatic saves"
# screens.rpy:607
old "Quick saves"
new "Quick saves"
# screens.rpy:613
old "## This ensures the input will get the enter event before any of the buttons do."
new "## This ensures the input will get the enter event before any of the buttons do."
# screens.rpy:629
old "## The grid of file slots."
new "## The grid of file slots."
# screens.rpy:649
old "{#file_time}%A, %B %d %Y, %H:%M"
new "{#file_time}%A, %B %d %Y, %H:%M"
# screens.rpy:649
old "empty slot"
new "empty slot"
# screens.rpy:657
old "## Buttons to access other pages."
new "## Buttons to access other pages."
# screens.rpy:666
old "<"
new "<"
# screens.rpy:668
old "{#auto_page}A"
new "{#auto_page}A"
# screens.rpy:670
old "{#quick_page}Q"
new "{#quick_page}Q"
# screens.rpy:676
old ">"
new ">"
# screens.rpy:711
old "## Preferences screen"
new "## Preferences screen"
# screens.rpy:713
old "## The preferences screen allows the player to configure the game to better suit themselves."
new "## The preferences screen allows the player to configure the game to better suit themselves."
# screens.rpy:716
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
new "## https://www.renpy.org/doc/html/screen_special.html#preferences"
# screens.rpy:738
old "Display"
new "عرض"
# screens.rpy:739
old "Window"
new "نافذة"
# screens.rpy:740
old "Fullscreen"
new "ملء الشاشة"
# screens.rpy:744
old "Rollback Side"
new "Rollback Side"
# screens.rpy:745
old "Disable"
new "Disable"
# screens.rpy:746
old "Left"
new "Left"
# screens.rpy:747
old "Right"
new "Right"
# screens.rpy:752
old "Unseen Text"
new "Unseen Text"
# screens.rpy:753
old "After Choices"
new "بعد الإختيار"
# screens.rpy:754
old "Transitions"
new "التأثيرات البصرية"
# screens.rpy:756
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
new "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
# screens.rpy:767
old "Text Speed"
new "سرعة النص"
# screens.rpy:771
old "Auto-Forward Time"
new "وقت التسريع التلقائي"
# screens.rpy:778
old "Music Volume"
new "مستوى الموسيقى"
# screens.rpy:785
old "Sound Volume"
new "مستوى الأصوات"
# screens.rpy:791
old "Test"
new "تجربة"
# screens.rpy:795
old "Voice Volume"
new "مستوى صوت الكلام"
# screens.rpy:806
old "Mute All"
new "Mute All"
# screens.rpy:882
old "## History screen"
new "## History screen"
# screens.rpy:884
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 "## 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."
# screens.rpy:888
old "## https://www.renpy.org/doc/html/history.html"
new "## https://www.renpy.org/doc/html/history.html"
# screens.rpy:894
old "## Avoid predicting this screen, as it can be very large."
new "## Avoid predicting this screen, as it can be very large."
# screens.rpy:905
old "## This lays things out properly if history_height is None."
new "## This lays things out properly if history_height is None."
# screens.rpy:914
old "## Take the color of the who text from the Character, if set."
new "## Take the color of the who text from the Character, if set."
# screens.rpy:921
old "The dialogue history is empty."
new "The dialogue history is empty."
# screens.rpy:965
old "## Help screen"
new "## Help screen"
# screens.rpy:967
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 "## 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."
# screens.rpy:986
old "Keyboard"
new "Keyboard"
# screens.rpy:987
old "Mouse"
new "Mouse"
# screens.rpy:990
old "Gamepad"
new "Gamepad"
# screens.rpy:1003
old "Enter"
new "Enter"
# screens.rpy:1004
old "Advances dialogue and activates the interface."
new "Advances dialogue and activates the interface."
# screens.rpy:1007
old "Space"
new "Space"
# screens.rpy:1008
old "Advances dialogue without selecting choices."
new "Advances dialogue without selecting choices."
# screens.rpy:1011
old "Arrow Keys"
new "Arrow Keys"
# screens.rpy:1012
old "Navigate the interface."
new "Navigate the interface."
# screens.rpy:1015
old "Escape"
new "Escape"
# screens.rpy:1016
old "Accesses the game menu."
new "Accesses the game menu."
# screens.rpy:1019
old "Ctrl"
new "Ctrl"
# screens.rpy:1020
old "Skips dialogue while held down."
new "Skips dialogue while held down."
# screens.rpy:1023
old "Tab"
new "Tab"
# screens.rpy:1024
old "Toggles dialogue skipping."
new "Toggles dialogue skipping."
# screens.rpy:1027
old "Page Up"
new "Page Up"
# screens.rpy:1028
old "Rolls back to earlier dialogue."
new "Rolls back to earlier dialogue."
# screens.rpy:1031
old "Page Down"
new "Page Down"
# screens.rpy:1032
old "Rolls forward to later dialogue."
new "Rolls forward to later dialogue."
# screens.rpy:1036
old "Hides the user interface."
new "Hides the user interface."
# screens.rpy:1040
old "Takes a screenshot."
new "Takes a screenshot."
# screens.rpy:1044
old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
new "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
# screens.rpy:1050
old "Left Click"
new "Left Click"
# screens.rpy:1054
old "Middle Click"
new "Middle Click"
# screens.rpy:1058
old "Right Click"
new "Right Click"
# screens.rpy:1062
old "Mouse Wheel Up\nClick Rollback Side"
new "Mouse Wheel Up\nClick Rollback Side"
# screens.rpy:1066
old "Mouse Wheel Down"
new "Mouse Wheel Down"
# screens.rpy:1073
old "Right Trigger\nA/Bottom Button"
new "Right Trigger\nA/Bottom Button"
# screens.rpy:1074
old "Advance dialogue and activates the interface."
new "Advance dialogue and activates the interface."
# screens.rpy:1078
old "Roll back to earlier dialogue."
new "Roll back to earlier dialogue."
# screens.rpy:1081
old "Right Shoulder"
new "Right Shoulder"
# screens.rpy:1082
old "Roll forward to later dialogue."
new "Roll forward to later dialogue."
# screens.rpy:1085
old "D-Pad, Sticks"
new "D-Pad, Sticks"
# screens.rpy:1089
old "Start, Guide"
new "Start, Guide"
# screens.rpy:1090
old "Access the game menu."
new "Access the game menu."
# screens.rpy:1093
old "Y/Top Button"
new "Y/Top Button"
# screens.rpy:1096
old "Calibrate"
new "Calibrate"
# screens.rpy:1124
old "## Additional screens"
new "## Additional screens"
# screens.rpy:1128
old "## Confirm screen"
new "## Confirm screen"
# screens.rpy:1130
old "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
new "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
# screens.rpy:1133
old "## http://www.renpy.org/doc/html/screen_special.html#confirm"
new "## http://www.renpy.org/doc/html/screen_special.html#confirm"
# screens.rpy:1137
old "## Ensure other screens do not get input while this screen is displayed."
new "## Ensure other screens do not get input while this screen is displayed."
# screens.rpy:1161
old "Yes"
new "نعم"
# screens.rpy:1162
old "No"
new "لا"
# screens.rpy:1164
old "## Right-click and escape answer \"no\"."
new "## Right-click and escape answer \"no\"."
# screens.rpy:1191
old "## Skip indicator screen"
new "## Skip indicator screen"
# screens.rpy:1193
old "## The skip_indicator screen is displayed to indicate that skipping is in progress."
new "## The skip_indicator screen is displayed to indicate that skipping is in progress."
# screens.rpy:1196
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
new "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
# screens.rpy:1208
old "Skipping"
new "Skipping"
# screens.rpy:1215
old "## This transform is used to blink the arrows one after another."
new "## This transform is used to blink the arrows one after another."
# screens.rpy:1247
old "## Notify screen"
new "## Notify screen"
# screens.rpy:1249
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 "## The notify screen is used to show the player a message. (For example, when the game is quicksaved or a screenshot has been taken.)"
# screens.rpy:1252
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
new "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
# screens.rpy:1286
old "## NVL screen"
new "## NVL screen"
# screens.rpy:1288
old "## This screen is used for NVL-mode dialogue and menus."
new "## This screen is used for NVL-mode dialogue and menus."
# screens.rpy:1290
old "## http://www.renpy.org/doc/html/screen_special.html#nvl"
new "## http://www.renpy.org/doc/html/screen_special.html#nvl"
# screens.rpy:1301
old "## Displays dialogue in either a vpgrid or the vbox."
new "## Displays dialogue in either a vpgrid or the vbox."
# screens.rpy:1314
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
new "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
# screens.rpy:1344
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
new "## This controls the maximum number of NVL-mode entries that can be displayed at once."
# screens.rpy:1406
old "## Mobile Variants"
new "## Mobile Variants"
# screens.rpy:1413
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 "## 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."
# screens.rpy:1429
old "Menu"
new "Menu"
+21
View File
@@ -0,0 +1,21 @@
# You can place the script of your game in this file.
# Declare images below this line, using the image statement.
# eg. image eileen happy = "eileen_happy.png"
# Declare characters used by this game.
define e = Character('إيلين', color="#c8ffc8")
init python:
if not persistent.default_language_set:
persistent.default_language_set = True
_preferences.language = "arabic"
# The game starts here.
label start:
e "لقد بدأت حكاية رينباي جديدة."
e "كل ما عليك فعله هو إضافة نصوص و صور و إرسالها للعالم!"
return
+8 -15
View File
@@ -1,17 +1,10 @@
translate arabic python:
al = "DejaVuSans.ttf"
style.l_default.font = al
style.l_default.size = 16
style.l_button_text.selected_font = al
style.l_button_text.selected_bold = True
style.l_link_text.font = al
style.l_alternate_text.font = al
style.l_navigation_button_text.font = al
style.l_navigation_text.font = al
style.l_navigation_text.bold = True
style.l_checkbox_text.selected_font = al
style.l_nonbox_text.selected_font = al
style.hyperlink_text.font = al
make_style_backup()
translate arabic python:
gui.REGULAR_FONT = "DejaVuSans.ttf"
gui.LIGHT_FONT = "DejaVuSans.ttf"
gui.FONT_SCALE = .9
gui.REGULAR_BOLD = True
config.rtl = True
init python:
translate_define("arabic", "config.rtl", "True")
-38
View File
@@ -1,38 +0,0 @@
translate arabic strings:
# game/translations.rpy:10
old "Create or Update Translations"
new "صنع او تحديث الترجمات"
# game/translations.rpy:10
old "Please enter the name of the language for which you want to create or update translations."
new "الرجاء كتابة اسم اللغة التي ستقوم بالترجمة إليها و الضغط على زر انتر"
# game/translations.rpy:15
old "The language name can not be the empty string."
new "لا يمكن ان يكون اسم اللغة فارغاً"
# game/translations.rpy:26
old "Ren'Py is generating translations...."
new "يقوم رينباي بتصنيع ملفات الترجمة..."
# game/translations.rpy:30
old "Ren'Py has finished generating [language] translations."
new "انتهى رينباي من صناعة ملفات الترجمة إلى [language]"
translate arabic strings:
# game/translations.rpy:44
old "What format would you like for the extracted dialogue?"
new "ما هي الصيغة التي تريدها للنص المستخرج؟"
# game/translations.rpy:56
old "Ren'Py is extracting dialogue...."
new "رينباي يقوم باستخراج الحوار إلى ملف نص"
# game/translations.rpy:60
old "Ren'Py has finished extracting dialogue. The extracted dialogue can be found in dialogue.[format] in the base directory."
new "رينباي انتهى من استخراج الحوار. الحوار المستخرج يوجد الآن في [format] في المجلد الرئيسي"
-100
View File
@@ -1,100 +0,0 @@
# : Translation updated at 2013-04-30 07:54
translate arabic strings:
# game/updater.rpy:54
old "Select Update Channel"
new "الرجاء اختيار طريقة التحديث"
# game/updater.rpy:65
old "The update channel controls the version of Ren'Py the updater will download. Please select an update channel:"
new "طريقة التحديث تحدد لبرنامج رينباي اي المواقع يستخدم لإيجاد النسخ الجديدة. الرجاء اختيار الطريقة التي تناسبك."
# game/updater.rpy:70
old "Release"
new "نسخة مكتملة"
# game/updater.rpy:76
old "{b}Recommended.{/b} The version of Ren'Py that should be used in all newly-released games."
new "{b}موصى به.{/b} نسخة رينباي التي يفضل استعمالها مع كل الالعاب الجديدة."
# game/updater.rpy:81
old "Prerelease"
new "نسخة مبدأية"
# game/updater.rpy:87
old "A preview of the next version of Ren'Py that can be used for testing and taking advantage of new features, but not for final releases of games."
new "عينة من نسخة رينباي القادمة تسمح لك بتجربة الإضافات الجديدة. لا ننصح باستعمالها لصناعة ألعاب معدة للنشر."
# game/updater.rpy:93
old "Experimental"
new "نسخة تجريبية"
# game/updater.rpy:99
old "Experimental versions of Ren'Py. You shouldn't select this channel unless asked by a Ren'Py developer."
new "النسخ التجريبية من رينباي. الأفضل ألا تستعمل هذه النسخ إلا لو طلب منك ذلك احد مبرمجي رينباي"
# game/updater.rpy:119
old "An error has occured:"
new "حصل خطأ:"
# game/updater.rpy:121
old "Checking for updates."
new "يتم البحث عن تحديثات."
# game/updater.rpy:123
old "Ren'Py is up to date."
new "نسخة رينباي التي لديك هي الأحدث."
# game/updater.rpy:125
old "[u.version] is now available. Do you want to install it?"
new "النسخة [u.version] متوفرة, هل ترغب في تنصيبها؟"
# game/updater.rpy:127
old "Preparing to download the update."
new "يتم التجهيز لتنزيل التحديث."
# game/updater.rpy:129
old "Downloading the update."
new "يتم تنزيل التحديث."
# game/updater.rpy:131
old "Unpacking the update."
new "يتم فك الضغط عن التحديث."
# game/updater.rpy:133
old "Finishing up."
new "اللمسات النهائية."
# game/updater.rpy:135
old "The update has been installed. Ren'Py will restart."
new "تم تنصيب التحديثات بنجاح, سيتم إعادة تشغيل رينباي الآن."
# game/updater.rpy:137
old "The update has been installed."
new "تم تنصيب التحديثات."
# game/updater.rpy:139
old "The update was cancelled."
new "تم إلغاء التحديث."
# game/updater.rpy:156
old "Ren'Py Update"
new "تحديثات رينباي."
# game/updater.rpy:162
old "Proceed"
new "استمرار."
# : Translation updated at 2014-04-17 13:01
translate arabic strings:
# game/updater.rpy:129
old "Nightly"
new "مسائي"
# game/updater.rpy:135
old "The bleeding edge of Ren'Py development. This may have the latest features, or might not run at all."
new "أحدث نسخة طازجة من رينباي التجريبي, قد يحتوي على آخر مستجدات رينباي و قد لا يعمل مطلقاً"
+335
View File
@@ -0,0 +1,335 @@
translate finnish strings:
# 00action_file.rpy:26
old "{#weekday}Monday"
new "{#weekday}Maanatai"
# 00action_file.rpy:26
old "{#weekday}Tuesday"
new "{#weekday}Tiistai"
# 00action_file.rpy:26
old "{#weekday}Wednesday"
new "{#weekday}Keskiviikko"
# 00action_file.rpy:26
old "{#weekday}Thursday"
new "{#weekday}Torstai"
# 00action_file.rpy:26
old "{#weekday}Friday"
new "{#weekday}Perjantai"
# 00action_file.rpy:26
old "{#weekday}Saturday"
new "{#weekday}Lauantai"
# 00action_file.rpy:26
old "{#weekday}Sunday"
new "{#weekday}Sunnuntai"
# 00action_file.rpy:37
old "{#weekday_short}Mon"
new "{#weekday_short}Ma"
# 00action_file.rpy:37
old "{#weekday_short}Tue"
new "{#weekday_short}Ti"
# 00action_file.rpy:37
old "{#weekday_short}Wed"
new "{#weekday_short}Ke"
# 00action_file.rpy:37
old "{#weekday_short}Thu"
new "{#weekday_short}To"
# 00action_file.rpy:37
old "{#weekday_short}Fri"
new "{#weekday_short}Pe"
# 00action_file.rpy:37
old "{#weekday_short}Sat"
new "{#weekday_short}La"
# 00action_file.rpy:37
old "{#weekday_short}Sun"
new "{#weekday_short}Su"
# 00action_file.rpy:47
old "{#month}January"
new "{#month}Tammikuu"
# 00action_file.rpy:47
old "{#month}February"
new "{#month}Helmikuu"
# 00action_file.rpy:47
old "{#month}March"
new "{#month}Maaliskuu"
# 00action_file.rpy:47
old "{#month}April"
new "{#month}Huhtikuu"
# 00action_file.rpy:47
old "{#month}May"
new "{#month}Toukokuu"
# 00action_file.rpy:47
old "{#month}June"
new "{#month}Kesäkuu"
# 00action_file.rpy:47
old "{#month}July"
new "{#month}Heinäkuu"
# 00action_file.rpy:47
old "{#month}August"
new "{#month}Elokuu"
# 00action_file.rpy:47
old "{#month}September"
new "{#month}Syyskuu"
# 00action_file.rpy:47
old "{#month}October"
new "{#month}Lokakuu"
# 00action_file.rpy:47
old "{#month}November"
new "{#month}Marraskuu"
# 00action_file.rpy:47
old "{#month}December"
new "{#month}Joulukuu"
# 00action_file.rpy:63
old "{#month_short}Jan"
new "{#month_short}Tammi"
# 00action_file.rpy:63
old "{#month_short}Feb"
new "{#month_short}Helmi"
# 00action_file.rpy:63
old "{#month_short}Mar"
new "{#month_short}Maalis"
# 00action_file.rpy:63
old "{#month_short}Apr"
new "{#month_short}Huhti"
# 00action_file.rpy:63
old "{#month_short}May"
new "{#month_short}Touko"
# 00action_file.rpy:63
old "{#month_short}Jun"
new "{#month_short}Kesä"
# 00action_file.rpy:63
old "{#month_short}Jul"
new "{#month_short}Heinä"
# 00action_file.rpy:63
old "{#month_short}Aug"
new "{#month_short}Elo"
# 00action_file.rpy:63
old "{#month_short}Sep"
new "{#month_short}Syys"
# 00action_file.rpy:63
old "{#month_short}Oct"
new "{#month_short}Loka"
# 00action_file.rpy:63
old "{#month_short}Nov"
new "{#month_short}Marras"
# 00action_file.rpy:63
old "{#month_short}Dec"
new "{#month_short}Joulu"
# 00action_file.rpy:235
old "%b %d, %H:%M"
new "%b %d, %H:%M"
# 00action_file.rpy:820
old "Quick save complete."
new "Pikatallennus suoritettu."
# 00gui.rpy:227
old "Are you sure?"
new "Oletko varma?"
# 00gui.rpy:228
old "Are you sure you want to delete this save?"
new "Oletko varma, että haluat poistaa tämän tallennuksen?"
# 00gui.rpy:229
old "Are you sure you want to overwrite your save?"
new "Oletko varma, että haluat korvata tallennuksen uudella?"
# 00gui.rpy:230
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "Lataamalla tallennuksen menetät tallentamattoman edistyksen.\nOletko varma, että haluat tehdä näin?"
# 00gui.rpy:231
old "Are you sure you want to quit?"
new "Haluatko varmasti lopettaa?"
# 00gui.rpy:232
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "Haluatko varmasti palata päävalikkoon?\nMenetät kaikki tallentamattomat tiedot."
# 00gui.rpy:233
old "Are you sure you want to end the replay?"
new "Oletko varma, että haluat lopettaa tämän uusinnan?"
# 00gui.rpy:234
old "Are you sure you want to begin skipping?"
new "Oletko varma, että haluat alkaa dialogin sivuuttamisen?"
# 00gui.rpy:235
old "Are you sure you want to skip to the next choice?"
new "Oletko varma, että haluat siirtyä suoraan seuraavaan valintaan?"
# 00gui.rpy:236
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "Are you sure you want to skip unseen dialogue to the next choice?"
# 00keymap.rpy:250
old "Saved screenshot as %s."
new "Näytönkaappaus tallennettu nimellä %s."
# 00library.rpy:142
old "Self-voicing disabled."
new "Tietokoneen ääninäyttely lopetettu."
# 00library.rpy:143
old "Clipboard voicing enabled. "
new "Leikepöydän ääneen toisto käytössä. "
# 00library.rpy:144
old "Self-voicing enabled. "
new "Ääneen toisto poissa käytöstä."
# 00library.rpy:179
old "Skip Mode"
new "Ylihyppäystila"
# 00library.rpy:262
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 "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}."
# 00preferences.rpy:422
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "Leikepöydän ääneen toisto käytössä. Paina 'shift+C' lopettaaksesi."
# 00preferences.rpy:424
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Tietokoneen ääninäyttely sanoisi \"[renpy.display.tts.last]\". Paina 'alt+shift+V' lopettaaksesi."
# 00preferences.rpy:426
old "Self-voicing enabled. Press 'v' to disable."
new "Tietokoneen ääninäyttely käytössä. Paina 'v' lopettaaksesi."
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
new "Contacting App Store\nPlease Wait..."
# 00updater.rpy:367
old "The Ren'Py Updater is not supported on mobile devices."
new "Mobiililaitteet eivät tue Ren'Py Updater -toimintoa."
# 00updater.rpy:486
old "An error is being simulated."
new "Simuloidaan havaittua ongelmaa."
# 00updater.rpy:662
old "Either this project does not support updating, or the update status file was deleted."
new "Tämä projekti ei tue päivittämistä tai päivityksen statustiedosto poistettiin."
# 00updater.rpy:676
old "This account does not have permission to perform an update."
new "Tällä käyttäjällä ei ole oikeutta päivityksen suorittamiseen."
# 00updater.rpy:679
old "This account does not have permission to write the update log."
new "Tällä käyttäjällä ei ole oikeutta kirjoittaa dataa päivityslokiin."
# 00updater.rpy:704
old "Could not verify update signature."
new "Päivityksen allekirjoitusta ei voitu vahvistaa."
# 00updater.rpy:975
old "The update file was not downloaded."
new "Päivitystiedostoa ei ladattu."
# 00updater.rpy:993
old "The update file does not have the correct digest - it may have been corrupted."
new "Päivitystiedosto ei sisällä oikeaa tiivistelmää - se on saattanut korruptoitua."
# 00updater.rpy:1049
old "While unpacking {}, unknown type {}."
new "Purettaessa {}, tuntematon tyyppi {}."
# 00updater.rpy:1393
old "Updater"
new "Päivittäjä"
# 00updater.rpy:1404
old "This program is up to date."
new "Käytät jo uuinta versiota."
# 00updater.rpy:1406
old "[u.version] is available. Do you want to install it?"
new "[u.version] on saatavilla. Haluatko asentaa sen?"
# 00updater.rpy:1408
old "Preparing to download the updates."
new "Valmistellaan päivitysten lataamista."
# 00updater.rpy:1410
old "Downloading the updates."
new "Ladataan päivityksiä."
# 00updater.rpy:1412
old "Unpacking the updates."
new "Puretaan päivityksiä."
# 00updater.rpy:1416
old "The updates have been installed. The program will restart."
new "Päivitykset on asennettu. Ohjelma käynnistyy nyt uudelleen."
# 00updater.rpy:1418
old "The updates have been installed."
new "Päivitykset on asennettu."
# 00updater.rpy:1420
old "The updates were cancelled."
new "Päivitykset peruttiin."
# 00gallery.rpy:563
old "Image [index] of [count] locked."
new "[index]. kuva [count]:stä on lukittu"
# 00gallery.rpy:583
old "prev"
new "edellinen"
# 00gallery.rpy:584
old "next"
new "seuraava"
# 00gallery.rpy:585
old "slideshow"
new "diaesitys"
# 00gallery.rpy:586
old "return"
new "palaa"
+179
View File
@@ -0,0 +1,179 @@
translate finnish strings:
# _developer/developer.rpym:38
old "Developer Menu"
new "Kehittäjävalikko"
# _developer/developer.rpym:43
old "Reload Game (Shift+R)"
new "Käynnistä peli uudelleen (Shift+R)"
# _developer/developer.rpym:45
old "Console (Shift+O)"
new "Konsoli (Shift+O)"
# _developer/developer.rpym:47
old "Variable Viewer"
new "Muuttujat"
# _developer/developer.rpym:49
old "Theme Test"
new "Teematesti"
# _developer/developer.rpym:51
old "Image Location Picker"
new "Kuvan sijainnin selvitin"
# _developer/developer.rpym:53
old "Filename List"
new "Tiedostonimilista"
# _developer/developer.rpym:57
old "Show Image Load Log"
new "Näytä kuvanlatausloki"
# _developer/developer.rpym:60
old "Hide Image Load Log"
new "Piilota kuvanlatausloki"
# _developer/developer.rpym:95
old "Nothing to inspect."
new "Ei tutkittavaa."
# _developer/developer.rpym:217
old "Return to the developer menu"
new "Palaa kehittäjävalikkoon"
# _developer/developer.rpym:373
old "Rectangle: %r"
new "Suorakulmio: %r"
# _developer/developer.rpym:378
old "Mouse position: %r"
new "Hiiren sijainti: %r"
# _developer/developer.rpym:383
old "Right-click or escape to quit."
new "Paina Esc tai hiiren oikeaa näppäintä poistuaksesi."
# _developer/developer.rpym:412
old "Rectangle copied to clipboard."
new "Suorakulmio kopioitu leikepöydälle."
# _developer/developer.rpym:415
old "Position copied to clipboard."
new "Sijainti kopioitu leikepöydälle."
# _developer/developer.rpym:524
old "✔ "
new "✔ "
# _developer/developer.rpym:527
old "✘ "
new "✘ "
# _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}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}"
# _developer/inspector.rpym:38
old "Displayable Inspector"
new "Näkyvien objektien tutkija"
# _developer/inspector.rpym:61
old "Size"
new "Koko"
# _developer/inspector.rpym:65
old "Style"
new "Tyyli"
# _developer/inspector.rpym:71
old "Location"
new "Sijainti"
# _developer/inspector.rpym:122
old "Inspecting Styles of [displayable_name!q]"
new "Tutkitaan [displayable_name!q]n tyylejä"
# _developer/inspector.rpym:139
old "displayable:"
new "näkyvä objekti:"
# _developer/inspector.rpym:145
old " (no properties affect the displayable)"
new " (mitkään ominaisuudet eivät vaikuta objektiin)"
# _developer/inspector.rpym:147
old " (default properties omitted)"
new " (perusominaisuudet sivuutettu)"
# _developer/inspector.rpym:185
old "<repr() failed>"
new "<repr() epäonnistui>"
# 00console.rpy:182
old "Press <esc> to exit console. Type help for help.\n"
new "Paina <esc> poistuaksesi konsolista. Käytä komentoa help saadaksesi apua."
# 00console.rpy:186
old "Ren'Py script enabled."
new "Ren'Py-skriptikieli käytössä."
# 00console.rpy:188
old "Ren'Py script disabled."
new "Ren'Py-skriptikieli poissa käytöstä."
# 00console.rpy:398
old "help: show this help"
new "help: näytä tämä apuviesti"
# 00console.rpy:403
old "commands:\n"
new "komennot:\n"
# 00console.rpy:413
old " <renpy script statement>: run the statement\n"
new " <renpy script-väite>: suorita väite\n"
# 00console.rpy:415
old " <python expression or statement>: run the expression or statement"
new " <python-ekspressio tai väite>: suorita ekspressio tai väite"
# 00console.rpy:423
old "clear: clear the console history"
new "clear: tyhjennä konsolin historia"
# 00console.rpy:427
old "exit: exit the console"
new "exit: poistu konsolista"
# 00console.rpy:435
old "load <slot>: loads the game from slot"
new "load <tallennuspaikka>: lataa pelin halutusta tallennuspaikasta"
# 00console.rpy:448
old "save <slot>: saves the game in slot"
new "save <tallennuspaikka>: tallentaa pelin tallennuspaikkaan"
# 00console.rpy:459
old "reload: reloads the game, refreshing the scripts"
new "reload: lataa pelin uudelleen, päivittäen skriptit"
# 00console.rpy:467
old "watch <expression>: watch a python expression"
new "watch <ekspressio>: tarkkaile python-ekspressiota"
# 00console.rpy:493
old "unwatch <expression>: stop watching an expression"
new "unwatch <ekspressio>: lakkaa tarkkailemasta ekspressiota"
# 00console.rpy:519
old "unwatchall: stop watching all expressions"
new "unwatchall: lopeta kaikkien ekspressioiden tarkkailu"
# 00console.rpy:536
old "jump <label>: jumps to label"
new "jump <tunnus>: hyppää 'script.rpy'-tiedosto(i)ssa olevaan, tunnuksella merkittyyn kohtaan"
+179
View File
@@ -0,0 +1,179 @@
translate finnish strings:
# 00gltest.rpy:64
old "Graphics Acceleration"
new "Grafiikkakiihdytys"
# 00gltest.rpy:70
old "Automatically Choose"
new "Valitse automaattisesti"
# 00gltest.rpy:75
old "Force Angle/DirectX Renderer"
new "Pakota Angle/DirectX-renderöinti"
# 00gltest.rpy:79
old "Force OpenGL Renderer"
new "Pakota OpenGL-renderöinti"
# 00gltest.rpy:83
old "Force Software Renderer"
new "Pakota Software-renderöinti"
# 00gltest.rpy:93
old "Enable"
new "Ota käyttöön"
# 00gltest.rpy:109
old "Changes will take effect the next time this program is run."
new "Muutokset tulevat voimaan, kun käynnistät ohjelman uudelleen."
# 00gltest.rpy:141
old "Performance Warning"
new "Suorituskyvyn varoitus"
# 00gltest.rpy:146
old "This computer is using software rendering."
new "Tietokone käyttää software-renderöintiä."
# 00gltest.rpy:148
old "This computer is not using shaders."
new "Tietokone ei käytä varjostuksia."
# 00gltest.rpy:150
old "This computer is displaying graphics slowly."
new "Tietokone näyttää grafiikkaa hitaasti."
# 00gltest.rpy:152
old "This computer has a problem displaying graphics: [problem]."
new "Tietokoneella on ongelmia grafiikan näyttämisessä: [problem]."
# 00gltest.rpy:157
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
new "Sen grafiikka-ajurit voivat olla vanhentuneita tai ne saattavat toimia väärin. Tämä voi johtaa hitaaseen tai väärään grafiikan esittämiseen. DirectX:n päivittäminen saattaa korjata ongelman."
# 00gltest.rpy:159
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new "Sen grafiikka-ajurit voivat olla vanhentuneita tai ne saattavat toimia väärin. Tämä voi johtaa hitaaseen tai väärään grafiikan esittämiseen."
# 00gltest.rpy:164
old "Update DirectX"
new "Päivitä DirectX"
# 00gltest.rpy:170
old "Continue, Show this warning again"
new "Jatka, näytä tämä varoitus uudelleen"
# 00gltest.rpy:174
old "Continue, Don't show warning again"
new "Jatka, älä näytä tätä varoitusta enää uudelleen"
# 00gltest.rpy:192
old "Updating DirectX."
new "Päivitetään DirectX:ää."
# 00gltest.rpy:196
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
new "DirectX:n verkkoasennus on alkanut. Se voi olla aluksi minimisoituna työkalupalkilla. Seuraa ohjeita asentaaksesi DirectX:n."
# 00gltest.rpy:200
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
new "{b}Huomaa:{/b} Microsoftin DirectX verkkoasennusohjelma asentaa, oletusarvoisesti, Bing-työkalupalkin. Jos et halua tätä työkalupalkkia, poista valinta oikeasta laatikosta."
# 00gltest.rpy:204
old "When setup finishes, please click below to restart this program."
new "Kun asennus on valmis, klikkaa alhaalta käynnistääksesi tämän ohjelman uudelleen."
# 00gltest.rpy:206
old "Restart"
new "Käynnistä uudelleen"
# 00gamepad.rpy:32
old "Select Gamepad to Calibrate"
new "Valitse kalibroitava peliohjain"
# 00gamepad.rpy:35
old "No Gamepads Available"
new "Peliohjaimia ei havaittu"
# 00gamepad.rpy:54
old "Calibrating [name] ([i]/[total])"
new "Kalibroidaan [name] ([i]/[total])"
# 00gamepad.rpy:58
old "Press or move the [control!r] [kind]."
new "Paina tai liikuta [control!r] [kind]."
# 00gamepad.rpy:66
old "Skip (A)"
new "Ohita (A)"
# 00gamepad.rpy:69
old "Back (B)"
new "Takaisin (B)"
# _errorhandling.rpym:495
old "Open Traceback"
new "Avaa virheenjäljitystoiminto"
# _errorhandling.rpym:497
old "Opens the traceback.txt file in a text editor."
new "Avaa traceback.txt-tiedoston tekstieditorissa."
# _errorhandling.rpym:499
old "Copy to Clipboard"
new "Kopioi leikepöydälle"
# _errorhandling.rpym:501
old "Copies the traceback.txt file to the clipboard."
new "Kopioi traceback.txt-tiedoston leikepöydälle."
# _errorhandling.rpym:519
old "An exception has occurred."
new "Odottamaton virhe on tapahtunut."
# _errorhandling.rpym:538
old "Rollback"
new "Palaa edelliseen tilaan"
# _errorhandling.rpym:540
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "Yrittää palata aikaisempaan tilaan, antaen sinun tallentaa tai tehdä eri valinnan."
# _errorhandling.rpym:543
old "Ignore"
new "Sivuuta"
# _errorhandling.rpym:545
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "Sivuuttaa poikkeuksen, antaen sinun jatkaa. Tämä johtaa usein uusiin virheisiin."
# _errorhandling.rpym:548
old "Reload"
new "Lataa uudelleen"
# _errorhandling.rpym:550
old "Reloads the game from disk, saving and restoring game state if possible."
new "Lataa pelin uudelleen muistista, tallentaen ja palauttaen pelitilan jos mahdollista."
# _errorhandling.rpym:560
old "Quits the game."
new "Lopettaa pelin."
# _errorhandling.rpym:582
old "Parsing the script failed."
new "Skriptin jäsennys epäonnistui."
# _errorhandling.rpym:606
old "Open Parse Errors"
new "Avaa jäsennysvirheet"
# _errorhandling.rpym:608
old "Opens the errors.txt file in a text editor."
new "Avaa errors.txt-tiedoston tekstieditorissa."
# _errorhandling.rpym:612
old "Copies the errors.txt file to the clipboard."
new "Kopioi errors.txt-tiedoston leikepöydälle."
+411
View File
@@ -0,0 +1,411 @@
translate finnish strings:
# gui.rpy:2
old "## Initialization"
new "## Initialization"
# gui.rpy:5
old "## The init offset statement causes the init code in this file to run before init code in any other file."
new "## The init offset statement causes the init code in this file to run before init code in any other file."
# gui.rpy:9
old "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
new "## Calling gui.init resets the styles to sensible default values, and sets the width and height of the game."
# gui.rpy:21
old "## Colors"
new "## Colors"
# gui.rpy:23
old "## The colors of text in the interface."
new "## The colors of text in the interface."
# gui.rpy:25
old "## An accent color used throughout the interface to label and highlight text."
new "## An accent color used throughout the interface to label and highlight text."
# gui.rpy:29
old "## The color used for a text button when it is neither selected nor hovered."
new "## The color used for a text button when it is neither selected nor hovered."
# gui.rpy:32
old "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
new "## The small color is used for small text, which needs to be brighter/darker to achieve the same effect."
# gui.rpy:36
old "## The color that is used for buttons and bars that are hovered."
new "## The color that is used for buttons and bars that are hovered."
# gui.rpy:39
old "## The color used for a text button when it is selected but not focused. A button is selected if it is the current screen or preference value."
new "## 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."
# gui.rpy:43
old "## The color used for a text button when it cannot be selected."
new "## The color used for a text button when it cannot be selected."
# gui.rpy:46
old "## Colors used for the portions of bars that are not filled in. These are not used directly, but are used when re-generating bar image files."
new "## 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."
# gui.rpy:51
old "## The colors used for dialogue and menu choice text."
new "## The colors used for dialogue and menu choice text."
# gui.rpy:56
old "## Fonts and Font Sizes"
new "## Fonts and Font Sizes"
# gui.rpy:58
old "## The font used for in-game text."
new "## The font used for in-game text."
# gui.rpy:61
old "## The font used for character names."
new "## The font used for character names."
# gui.rpy:64
old "## The font used for out-of-game text."
new "## The font used for out-of-game text."
# gui.rpy:67
old "## The size of normal dialogue text."
new "## The size of normal dialogue text."
# gui.rpy:70
old "## The size of character names."
new "## The size of character names."
# gui.rpy:73
old "## The size of text in the game's user interface."
new "## The size of text in the game's user interface."
# gui.rpy:76
old "## The size of labels in the game's user interface."
new "## The size of labels in the game's user interface."
# gui.rpy:79
old "## The size of text on the notify screen."
new "## The size of text on the notify screen."
# gui.rpy:82
old "## The size of the game's title."
new "## The size of the game's title."
# gui.rpy:86
old "## Main and Game Menus"
new "## Main and Game Menus"
# gui.rpy:88
old "## The images used for the main and game menus."
new "## The images used for the main and game menus."
# gui.rpy:92
old "## Should we show the name and version of the game?"
new "## Should we show the name and version of the game?"
# gui.rpy:96
old "## Dialogue"
new "## Dialogue"
# gui.rpy:98
old "## These variables control how dialogue is displayed on the screen one line at a time."
new "## These variables control how dialogue is displayed on the screen one line at a time."
# gui.rpy:101
old "## The height of the textbox containing dialogue."
new "## The height of the textbox containing dialogue."
# gui.rpy:104
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 "## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is center, and 1.0 is the bottom."
# gui.rpy:109
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 "## 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."
# gui.rpy:114
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 "## 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."
# gui.rpy:118
old "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
new "## The width, height, and borders of the box containing the character's name, or None to automatically size it."
# gui.rpy:123
old "## The borders of the box containing the character's name, in left, top, right, bottom order."
new "## The borders of the box containing the character's name, in left, top, right, bottom order."
# gui.rpy:127
old "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
new "## If True, the background of the namebox will be tiled, if False, the background if the namebox will be scaled."
# gui.rpy:132
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 "## 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."
# gui.rpy:138
old "## The maximum width of dialogue text, in pixels."
new "## The maximum width of dialogue text, in pixels."
# gui.rpy:141
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 "## 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."
# gui.rpy:146
old "## Buttons"
new "## Buttons"
# gui.rpy:148
old "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
new "## These variables, along with the image files in gui/button, control aspects of how buttons are displayed."
# gui.rpy:151
old "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
new "## The width and height of a button, in pixels. If None, Ren'Py computes a size."
# gui.rpy:155
old "## The borders on each side of the button, in left, top, right, bottom order."
new "## The borders on each side of the button, in left, top, right, bottom order."
# gui.rpy:158
old "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
new "## If True, the background image will be tiled. If False, the background image will be linearly scaled."
# gui.rpy:162
old "## The font used by the button."
new "## The font used by the button."
# gui.rpy:165
old "## The size of the text used by the button."
new "## The size of the text used by the button."
# gui.rpy:179
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 "## 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."
# gui.rpy:183
old "## These customizations are used by the default interface:"
new "## These customizations are used by the default interface:"
# gui.rpy:198
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 "## 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."
# gui.rpy:205
old "## Choice Buttons"
new "## Choice Buttons"
# gui.rpy:207
old "## Choice buttons are used in the in-game menus."
new "## Choice buttons are used in the in-game menus."
# gui.rpy:220
old "## File Slot Buttons"
new "## File Slot Buttons"
# 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 "## 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."
# gui.rpy:226
old "## The save slot button."
new "## The save slot button."
# gui.rpy:234
old "## The width and height of thumbnails used by the save slots."
new "## The width and height of thumbnails used by the save slots."
# gui.rpy:238
old "## The number of columns and rows in the grid of save slots."
new "## The number of columns and rows in the grid of save slots."
# gui.rpy:243
old "## Positioning and Spacing"
new "## Positioning and Spacing"
# gui.rpy:245
old "## These variables control the positioning and spacing of various user interface elements."
new "## These variables control the positioning and spacing of various user interface elements."
# gui.rpy:248
old "## The position of the left side of the navigation buttons, relative to the left side of the screen."
new "## The position of the left side of the navigation buttons, relative to the left side of the screen."
# gui.rpy:252
old "## The vertical position of the skip indicator."
new "## The vertical position of the skip indicator."
# gui.rpy:255
old "## The vertical position of the notify screen."
new "## The vertical position of the notify screen."
# gui.rpy:258
old "## The spacing between menu choices."
new "## The spacing between menu choices."
# gui.rpy:261
old "## Buttons in the navigation section of the main and game menus."
new "## Buttons in the navigation section of the main and game menus."
# gui.rpy:264
old "## Controls the amount of spacing between preferences."
new "## Controls the amount of spacing between preferences."
# gui.rpy:267
old "## Controls the amount of spacing between preference buttons."
new "## Controls the amount of spacing between preference buttons."
# gui.rpy:270
old "## The spacing between file page buttons."
new "## The spacing between file page buttons."
# gui.rpy:273
old "## The spacing between file slots."
new "## The spacing between file slots."
# gui.rpy:277
old "## Frames"
new "## Frames"
# gui.rpy:279
old "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
new "## These variables control the look of frames that can contain user interface components when an overlay or window is not present."
# gui.rpy:282
old "## Generic frames that are introduced by player code."
new "## Generic frames that are introduced by player code."
# gui.rpy:285
old "## The frame that is used as part of the confirm screen."
new "## The frame that is used as part of the confirm screen."
# gui.rpy:288
old "## The frame that is used as part of the skip screen."
new "## The frame that is used as part of the skip screen."
# gui.rpy:291
old "## The frame that is used as part of the notify screen."
new "## The frame that is used as part of the notify screen."
# gui.rpy:294
old "## Should frame backgrounds be tiled?"
new "## Should frame backgrounds be tiled?"
# gui.rpy:298
old "## Bars, Scrollbars, and Sliders"
new "## Bars, Scrollbars, and Sliders"
# gui.rpy:300
old "## These control the look and size of bars, scrollbars, and sliders."
new "## These control the look and size of bars, scrollbars, and sliders."
# gui.rpy:302
old "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written code."
new "## The default GUI only uses sliders and vertical scrollbars. All of the other bars are only used in creator-written code."
# gui.rpy:305
old "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
new "## The height of horizontal bars, scrollbars, and sliders. The width of vertical bars, scrollbars, and sliders."
# gui.rpy:311
old "## True if bar images should be tiled. False if they should be linearly scaled."
new "## True if bar images should be tiled. False if they should be linearly scaled."
# gui.rpy:316
old "## Horizontal borders."
new "## Horizontal borders."
# gui.rpy:321
old "## Vertical borders."
new "## Vertical borders."
# gui.rpy:326
old "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
new "## What to do with unscrollable scrollbars in the gui. \"hide\" hides them, while None shows them."
# gui.rpy:331
old "## History"
new "## History"
# gui.rpy:333
old "## The history screen displays dialogue that the player has already dismissed."
new "## The history screen displays dialogue that the player has already dismissed."
# gui.rpy:335
old "## The number of blocks of dialogue history Ren'Py will keep."
new "## The number of blocks of dialogue history Ren'Py will keep."
# gui.rpy:338
old "## The height of a history screen entry, or None to make the height variable at the cost of performance."
new "## The height of a history screen entry, or None to make the height variable at the cost of performance."
# gui.rpy:342
old "## The position, width, and alignment of the label giving the name of the speaking character."
new "## The position, width, and alignment of the label giving the name of the speaking character."
# gui.rpy:349
old "## The position, width, and alignment of the dialogue text."
new "## The position, width, and alignment of the dialogue text."
# gui.rpy:356
old "## NVL-Mode"
new "## NVL-Mode"
# gui.rpy:358
old "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
new "## The NVL-mode screen displays the dialogue spoken by NVL-mode characters."
# gui.rpy:360
old "## The borders of the background of the NVL-mode background window."
new "## The borders of the background of the NVL-mode background window."
# gui.rpy:363
old "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
new "## The height of an NVL-mode entry. Set this to None to have the entries dynamically adjust height."
# gui.rpy:367
old "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
new "## The spacing between NVL-mode entries when gui.nvl_height is None, and between NVL-mode entries and an NVL-mode menu."
# gui.rpy:384
old "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
new "## The position, width, and alignment of nvl_thought text (the text said by the nvl_narrator character.)"
# gui.rpy:391
old "## The position of nvl menu_buttons."
new "## The position of nvl menu_buttons."
# gui.rpy:403
old "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
new "## This increases the size of the quick buttons to make them easier to touch on tablets and phones."
# gui.rpy:409
old "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
new "## This changes the size and spacing of various GUI elements to ensure they are easily visible on phones."
# gui.rpy:413
old "## Font sizes."
new "## Font sizes."
# gui.rpy:421
old "## Adjust the location of the textbox."
new "## Adjust the location of the textbox."
# gui.rpy:427
old "## Change the size and spacing of items in the game menu."
new "## Change the size and spacing of items in the game menu."
# gui.rpy:436
old "## File button layout."
new "## File button layout."
# gui.rpy:440
old "## NVL-mode."
new "## NVL-mode."
# gui.rpy:456
old "## Quick buttons."
new "## Quick buttons."
File diff suppressed because it is too large Load Diff
+27
View File
@@ -0,0 +1,27 @@
translate finnish strings:
# _layout/classic_joystick_preferences.rpym:94
old "Joystick Mapping"
new "Peliohjaimen näppäinten asetus"
# _layout/classic_load_save.rpym:138
old "Empty Slot."
new "Tyhjä paikka."
# _layout/classic_load_save.rpym:170
old "a"
new "a"
# _layout/classic_load_save.rpym:179
old "q"
new "q"
# _compat/gamemenu.rpym:355
old "Previous"
new "Edellinen"
# _compat/gamemenu.rpym:362
old "Next"
new "Seuraava"
+195
View File
@@ -0,0 +1,195 @@
translate finnish strings:
# options.rpy:1
old "## This file contains options that can be changed to customize your game."
new "## This file contains options that can be changed to customize your game."
# options.rpy:4
old "## Lines beginning with two '#' marks are comments, and you shouldn't uncomment them. Lines beginning with a single '#' mark are commented-out code, and you may want to uncomment them when appropriate."
new "## Lines beginning with two '#' marks are comments, and you shouldn't uncomment them. Lines beginning with a single '#' mark are commented-out code, and you may want to uncomment them when appropriate."
# options.rpy:10
old "## Basics"
new "## Basics"
# options.rpy:12
old "## A human-readable name of the game. This is used to set the default window title, and shows up in the interface and error reports."
new "## A human-readable name of the game. This is used to set the default window title, and shows up in the interface and error reports."
# options.rpy:15
old "## The _() surrounding the string marks it as eligible for translation."
new "## The _() surrounding the string marks it as eligible for translation."
# options.rpy:17
old "Ren'Py 7 Default GUI"
new "Ren'Py 7 Default GUI"
# options.rpy:20
old "## Determines if the title given above is shown on the main menu screen. Set this to False to hide the title."
new "## Determines if the title given above is shown on the main menu screen. Set this to False to hide the title."
# options.rpy:26
old "## The version of the game."
new "## The version of the game."
# options.rpy:31
old "## Text that is placed on the game's about screen. To insert a blank line between paragraphs, write \\n\\n."
new "## Text that is placed on the game's about screen. To insert a blank line between paragraphs, write \\n\\n."
# options.rpy:37
old "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
new "## A short name for the game used for executables and directories in the built distribution. This must be ASCII-only, and must not contain spaces, colons, or semicolons."
# options.rpy:44
old "## Sounds and music"
new "## Sounds and music"
# options.rpy:46
old "## These three variables control which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
new "## These three variables control which mixers are shown to the player by default. Setting one of these to False will hide the appropriate mixer."
# options.rpy:55
old "## To allow the user to play a test sound on the sound or voice channel, uncomment a line below and use it to set a sample sound to play."
new "## To allow the user to play a test sound on the sound or voice channel, uncomment a line below and use it to set a sample sound to play."
# options.rpy:62
old "## Uncomment the following line to set an audio file that will be played while the player is at the main menu. This file will continue playing into the game, until it is stopped or another file is played."
new "## Uncomment the following line to set an audio file that will be played while the player is at the main menu. This file will continue playing into the game, until it is stopped or another file is played."
# options.rpy:69
old "## Transitions"
new "## Transitions"
# options.rpy:71
old "## These variables set transitions that are used when certain events occur. Each variable should be set to a transition, or None to indicate that no transition should be used."
new "## These variables set transitions that are used when certain events occur. Each variable should be set to a transition, or None to indicate that no transition should be used."
# options.rpy:75
old "## Entering or exiting the game menu."
new "## Entering or exiting the game menu."
# options.rpy:81
old "## A transition that is used after a game has been loaded."
new "## A transition that is used after a game has been loaded."
# options.rpy:86
old "## Used when entering the main menu after the game has ended."
new "## Used when entering the main menu after the game has ended."
# options.rpy:91
old "## A variable to set the transition used when the game starts does not exist. Instead, use a with statement after showing the initial scene."
new "## A variable to set the transition used when the game starts does not exist. Instead, use a with statement after showing the initial scene."
# options.rpy:96
old "## Window management"
new "## Window management"
# options.rpy:98
old "## This controls when the dialogue window is displayed. If \"show\", it is always displayed. If \"hide\", it is only displayed when dialogue is present. If \"auto\", the window is hidden before scene statements and shown again once dialogue is displayed."
new "## This controls when the dialogue window is displayed. If \"show\", it is always displayed. If \"hide\", it is only displayed when dialogue is present. If \"auto\", the window is hidden before scene statements and shown again once dialogue is displayed."
# options.rpy:103
old "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
new "## After the game has started, this can be changed with the \"window show\", \"window hide\", and \"window auto\" statements."
# options.rpy:109
old "## Transitions used to show and hide the dialogue window"
new "## Transitions used to show and hide the dialogue window"
# options.rpy:115
old "## Preference defaults"
new "## Preference defaults"
# options.rpy:117
old "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
new "## Controls the default text speed. The default, 0, is infinite, while any other number is the number of characters per second to type out."
# options.rpy:123
old "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
new "## The default auto-forward delay. Larger numbers lead to longer waits, with 0 to 30 being the valid range."
# options.rpy:129
old "## Save directory"
new "## Save directory"
# options.rpy:131
old "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
new "## Controls the platform-specific place Ren'Py will place the save files for this game. The save files will be placed in:"
# options.rpy:134
old "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
new "## Windows: %APPDATA\\RenPy\\<config.save_directory>"
# options.rpy:136
old "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
new "## Macintosh: $HOME/Library/RenPy/<config.save_directory>"
# options.rpy:138
old "## Linux: $HOME/.renpy/<config.save_directory>"
new "## Linux: $HOME/.renpy/<config.save_directory>"
# options.rpy:140
old "## This generally should not be changed, and if it is, should always be a literal string, not an expression."
new "## This generally should not be changed, and if it is, should always be a literal string, not an expression."
# options.rpy:146
old "## Icon ########################################################################'"
new "## Icon ########################################################################'"
# options.rpy:148
old "## The icon displayed on the taskbar or dock."
new "## The icon displayed on the taskbar or dock."
# options.rpy:153
old "## Build configuration"
new "## Build configuration"
# options.rpy:155
old "## This section controls how Ren'Py turns your project into distribution files."
new "## This section controls how Ren'Py turns your project into distribution files."
# options.rpy:160
old "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
new "## The following functions take file patterns. File patterns are case- insensitive, and matched against the path relative to the base directory, with and without a leading /. If multiple patterns match, the first is used."
# options.rpy:165
old "## In a pattern:"
new "## In a pattern:"
# options.rpy:167
old "## / is the directory separator."
new "## / is the directory separator."
# options.rpy:169
old "## * matches all characters, except the directory separator."
new "## * matches all characters, except the directory separator."
# options.rpy:171
old "## ** matches all characters, including the directory separator."
new "## ** matches all characters, including the directory separator."
# options.rpy:173
old "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
new "## For example, \"*.txt\" matches txt files in the base directory, \"game/**.ogg\" matches ogg files in the game directory or any of its subdirectories, and \"**.psd\" matches psd files anywhere in the project."
# options.rpy:177
old "## Classify files as None to exclude them from the built distributions."
new "## Classify files as None to exclude them from the built distributions."
# options.rpy:185
old "## To archive files, classify them as 'archive'."
new "## To archive files, classify them as 'archive'."
# options.rpy:190
old "## Files matching documentation patterns are duplicated in a mac app build, so they appear in both the app and the zip file."
new "## Files matching documentation patterns are duplicated in a mac app build, so they appear in both the app and the zip file."
# options.rpy:196
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 "## 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."
# options.rpy:203
old "## The username and project name associated with an itch.io project, separated by a slash."
new "## The username and project name associated with an itch.io project, separated by a slash."
+643
View File
@@ -0,0 +1,643 @@
translate finnish strings:
# screens.rpy:9
old "## Styles"
new "## Styles"
# screens.rpy:87
old "## In-game screens"
new "## In-game screens"
# screens.rpy:91
old "## Say screen"
new "## Say screen"
# screens.rpy:93
old "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
new "## The say screen is used to display dialogue to the player. It takes two parameters, who and what, which are the name of the speaking character and the text to be displayed, respectively. (The who parameter can be None if no name is given.)"
# screens.rpy:98
old "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
new "## This screen must create a text displayable with id \"what\", as Ren'Py uses this to manage text display. It can also create displayables with id \"who\" and id \"window\" to apply style properties."
# screens.rpy:102
old "## https://www.renpy.org/doc/html/screen_special.html#say"
new "## https://www.renpy.org/doc/html/screen_special.html#say"
# screens.rpy:169
old "## Input screen"
new "## Input screen"
# screens.rpy:171
old "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
new "## This screen is used to display renpy.input. The prompt parameter is used to pass a text prompt in."
# screens.rpy:174
old "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
new "## This screen must create an input displayable with id \"input\" to accept the various input parameters."
# screens.rpy:177
old "## http://www.renpy.org/doc/html/screen_special.html#input"
new "## http://www.renpy.org/doc/html/screen_special.html#input"
# screens.rpy:205
old "## Choice screen"
new "## Choice screen"
# screens.rpy:207
old "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, is a list of objects, each with caption and action fields."
new "## This screen is used to display the in-game choices presented by the menu statement. The one parameter, items, is a list of objects, each with caption and action fields."
# screens.rpy:211
old "## http://www.renpy.org/doc/html/screen_special.html#choice"
new "## http://www.renpy.org/doc/html/screen_special.html#choice"
# screens.rpy:221
old "## When this is true, menu captions will be spoken by the narrator. When false, menu captions will be displayed as empty buttons."
new "## When this is true, menu captions will be spoken by the narrator. When false, menu captions will be displayed as empty buttons."
# screens.rpy:244
old "## Quick Menu screen"
new "## Quick Menu screen"
# screens.rpy:246
old "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
new "## The quick menu is displayed in-game to provide easy access to the out-of-game menus."
# screens.rpy:261
old "Back"
new "Takaisin"
# screens.rpy:262
old "History"
new "History"
# screens.rpy:263
old "Skip"
new "Skip"
# screens.rpy:264
old "Auto"
new "Auto"
# screens.rpy:265
old "Save"
new "Save"
# screens.rpy:266
old "Q.Save"
new "Q.Save"
# screens.rpy:267
old "Q.Load"
new "Q.Load"
# screens.rpy:268
old "Prefs"
new "Prefs"
# screens.rpy:271
old "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
new "## This code ensures that the quick_menu screen is displayed in-game, whenever the player has not explicitly hidden the interface."
# screens.rpy:291
old "## Navigation screen"
new "## Navigation screen"
# screens.rpy:293
old "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
new "## This screen is included in the main and game menus, and provides navigation to other menus, and to start the game."
# screens.rpy:308
old "Start"
new "Start"
# screens.rpy:316
old "Load"
new "Load"
# screens.rpy:318
old "Preferences"
new "Preferences"
# screens.rpy:322
old "End Replay"
new "End Replay"
# screens.rpy:326
old "Main Menu"
new "Main Menu"
# screens.rpy:328
old "About"
new "Tietoja"
# screens.rpy:332
old "## Help isn't necessary or relevant to mobile devices."
new "## Help isn't necessary or relevant to mobile devices."
# screens.rpy:333
old "Help"
new "Help"
# screens.rpy:335
old "## The quit button is banned on iOS and unnecessary on Android."
new "## The quit button is banned on iOS and unnecessary on Android."
# screens.rpy:336
old "Quit"
new "Poistu"
# screens.rpy:350
old "## Main Menu screen"
new "## Main Menu screen"
# screens.rpy:352
old "## Used to display the main menu when Ren'Py starts."
new "## Used to display the main menu when Ren'Py starts."
# screens.rpy:354
old "## http://www.renpy.org/doc/html/screen_special.html#main-menu"
new "## http://www.renpy.org/doc/html/screen_special.html#main-menu"
# screens.rpy:369
old "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
new "## The use statement includes another screen inside this one. The actual contents of the main menu are in the navigation screen."
# screens.rpy:413
old "## Game Menu screen"
new "## Game Menu screen"
# screens.rpy:415
old "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
new "## This lays out the basic common structure of a game menu screen. It's called with the screen title, and displays the background, title, and navigation."
# screens.rpy:418
old "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
new "## The scroll parameter can be None, or one of \"viewport\" or \"vpgrid\". When this screen is intended to be used with one or more children, which are transcluded (placed) inside it."
# screens.rpy:476
old "Return"
new "Palaa"
# screens.rpy:539
old "## About screen"
new "## About screen"
# screens.rpy:541
old "## This screen gives credit and copyright information about the game and Ren'Py."
new "## This screen gives credit and copyright information about the game and Ren'Py."
# screens.rpy:544
old "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
new "## There's nothing special about this screen, and hence it also serves as an example of how to make a custom screen."
# screens.rpy:551
old "## This use statement includes the game_menu screen inside this one. The vbox child is then included inside the viewport inside the game_menu screen."
new "## This use statement includes the game_menu screen inside this one. The vbox child is then included inside the viewport inside the game_menu screen."
# screens.rpy:561
old "Version [config.version!t]\n"
new "Version [config.version!t]\n"
# screens.rpy:563
old "## gui.about is usually set in options.rpy."
new "## gui.about is usually set in options.rpy."
# screens.rpy:567
old "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
new "Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]"
# screens.rpy:570
old "## This is redefined in options.rpy to add text to the about screen."
new "## This is redefined in options.rpy to add text to the about screen."
# screens.rpy:582
old "## Load and Save screens"
new "## Load and Save screens"
# screens.rpy:584
old "## These screens are responsible for letting the player save the game and load it again. Since they share nearly everything in common, both are implemented in terms of a third screen, file_slots."
new "## These screens are responsible for letting the player save the game and load it again. Since they share nearly everything in common, both are implemented in terms of a third screen, file_slots."
# screens.rpy:588
old "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
new "## https://www.renpy.org/doc/html/screen_special.html#save https://www.renpy.org/doc/html/screen_special.html#load"
# screens.rpy:607
old "Page {}"
new "Sivu {}"
# screens.rpy:607
old "Automatic saves"
new "Automaattiset tallennukset"
# screens.rpy:607
old "Quick saves"
new "Pikatallennukset"
# screens.rpy:613
old "## This ensures the input will get the enter event before any of the buttons do."
new "## This ensures the input will get the enter event before any of the buttons do."
# screens.rpy:629
old "## The grid of file slots."
new "## The grid of file slots."
# screens.rpy:649
old "{#file_time}%A, %B %d %Y, %H:%M"
new "{#file_time}%A, %B %d %Y, %H:%M"
# screens.rpy:649
old "empty slot"
new "empty slot"
# screens.rpy:657
old "## Buttons to access other pages."
new "## Buttons to access other pages."
# screens.rpy:666
old "<"
new "<"
# screens.rpy:668
old "{#auto_page}A"
new "{#auto_page}A"
# screens.rpy:670
old "{#quick_page}Q"
new "{#quick_page}Q"
# screens.rpy:676
old ">"
new ">"
# screens.rpy:711
old "## Preferences screen"
new "## Preferences screen"
# screens.rpy:713
old "## The preferences screen allows the player to configure the game to better suit themselves."
new "## The preferences screen allows the player to configure the game to better suit themselves."
# screens.rpy:716
old "## https://www.renpy.org/doc/html/screen_special.html#preferences"
new "## https://www.renpy.org/doc/html/screen_special.html#preferences"
# screens.rpy:738
old "Display"
new "Näyttö"
# screens.rpy:739
old "Window"
new "Ikkuna"
# screens.rpy:740
old "Fullscreen"
new "Koko näyttö"
# screens.rpy:744
old "Rollback Side"
new "Rollback Side"
# screens.rpy:745
old "Disable"
new "Poista käytöstä"
# screens.rpy:746
old "Left"
new "Left"
# screens.rpy:747
old "Right"
new "Right"
# screens.rpy:752
old "Unseen Text"
new "Unseen Text"
# screens.rpy:753
old "After Choices"
new "After Choices"
# screens.rpy:754
old "Transitions"
new "Transitions"
# screens.rpy:756
old "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
new "## Additional vboxes of type \"radio_pref\" or \"check_pref\" can be added here, to add additional creator-defined preferences."
# screens.rpy:767
old "Text Speed"
new "Text Speed"
# screens.rpy:771
old "Auto-Forward Time"
new "Auto-Forward Time"
# screens.rpy:778
old "Music Volume"
new "Music Volume"
# screens.rpy:785
old "Sound Volume"
new "Äänenvoimakkuus"
# screens.rpy:791
old "Test"
new "Test"
# screens.rpy:795
old "Voice Volume"
new "Voice Volume"
# screens.rpy:806
old "Mute All"
new "Mute All"
# screens.rpy:882
old "## History screen"
new "## History screen"
# screens.rpy:884
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 "## 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."
# screens.rpy:888
old "## https://www.renpy.org/doc/html/history.html"
new "## https://www.renpy.org/doc/html/history.html"
# screens.rpy:894
old "## Avoid predicting this screen, as it can be very large."
new "## Avoid predicting this screen, as it can be very large."
# screens.rpy:905
old "## This lays things out properly if history_height is None."
new "## This lays things out properly if history_height is None."
# screens.rpy:914
old "## Take the color of the who text from the Character, if set."
new "## Take the color of the who text from the Character, if set."
# screens.rpy:921
old "The dialogue history is empty."
new "The dialogue history is empty."
# screens.rpy:965
old "## Help screen"
new "## Help screen"
# screens.rpy:967
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 "## 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."
# screens.rpy:986
old "Keyboard"
new "Keyboard"
# screens.rpy:987
old "Mouse"
new "Mouse"
# screens.rpy:990
old "Gamepad"
new "Peliohjain"
# screens.rpy:1003
old "Enter"
new "Enter"
# screens.rpy:1004
old "Advances dialogue and activates the interface."
new "Advances dialogue and activates the interface."
# screens.rpy:1007
old "Space"
new "Space"
# screens.rpy:1008
old "Advances dialogue without selecting choices."
new "Advances dialogue without selecting choices."
# screens.rpy:1011
old "Arrow Keys"
new "Arrow Keys"
# screens.rpy:1012
old "Navigate the interface."
new "Navigate the interface."
# screens.rpy:1015
old "Escape"
new "Escape"
# screens.rpy:1016
old "Accesses the game menu."
new "Accesses the game menu."
# screens.rpy:1019
old "Ctrl"
new "Ctrl"
# screens.rpy:1020
old "Skips dialogue while held down."
new "Skips dialogue while held down."
# screens.rpy:1023
old "Tab"
new "Tab"
# screens.rpy:1024
old "Toggles dialogue skipping."
new "Toggles dialogue skipping."
# screens.rpy:1027
old "Page Up"
new "Page Up"
# screens.rpy:1028
old "Rolls back to earlier dialogue."
new "Rolls back to earlier dialogue."
# screens.rpy:1031
old "Page Down"
new "Page Down"
# screens.rpy:1032
old "Rolls forward to later dialogue."
new "Rolls forward to later dialogue."
# screens.rpy:1036
old "Hides the user interface."
new "Hides the user interface."
# screens.rpy:1040
old "Takes a screenshot."
new "Takes a screenshot."
# screens.rpy:1044
old "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
new "Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}."
# screens.rpy:1050
old "Left Click"
new "Left Click"
# screens.rpy:1054
old "Middle Click"
new "Middle Click"
# screens.rpy:1058
old "Right Click"
new "Right Click"
# screens.rpy:1062
old "Mouse Wheel Up\nClick Rollback Side"
new "Mouse Wheel Up\nClick Rollback Side"
# screens.rpy:1066
old "Mouse Wheel Down"
new "Mouse Wheel Down"
# screens.rpy:1073
old "Right Trigger\nA/Bottom Button"
new "Right Trigger\nA/Bottom Button"
# screens.rpy:1074
old "Advance dialogue and activates the interface."
new "Advance dialogue and activates the interface."
# screens.rpy:1078
old "Roll back to earlier dialogue."
new "Roll back to earlier dialogue."
# screens.rpy:1081
old "Right Shoulder"
new "Right Shoulder"
# screens.rpy:1082
old "Roll forward to later dialogue."
new "Roll forward to later dialogue."
# screens.rpy:1085
old "D-Pad, Sticks"
new "D-Pad, Sticks"
# screens.rpy:1089
old "Start, Guide"
new "Start, Guide"
# screens.rpy:1090
old "Access the game menu."
new "Access the game menu."
# screens.rpy:1093
old "Y/Top Button"
new "Y/Top Button"
# screens.rpy:1096
old "Calibrate"
new "Kalibroi"
# screens.rpy:1124
old "## Additional screens"
new "## Additional screens"
# screens.rpy:1128
old "## Confirm screen"
new "## Confirm screen"
# screens.rpy:1130
old "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
new "## The confirm screen is called when Ren'Py wants to ask the player a yes or no question."
# screens.rpy:1133
old "## http://www.renpy.org/doc/html/screen_special.html#confirm"
new "## http://www.renpy.org/doc/html/screen_special.html#confirm"
# screens.rpy:1137
old "## Ensure other screens do not get input while this screen is displayed."
new "## Ensure other screens do not get input while this screen is displayed."
# screens.rpy:1161
old "Yes"
new "Kyllä"
# screens.rpy:1162
old "No"
new "Ei"
# screens.rpy:1164
old "## Right-click and escape answer \"no\"."
new "## Right-click and escape answer \"no\"."
# screens.rpy:1191
old "## Skip indicator screen"
new "## Skip indicator screen"
# screens.rpy:1193
old "## The skip_indicator screen is displayed to indicate that skipping is in progress."
new "## The skip_indicator screen is displayed to indicate that skipping is in progress."
# screens.rpy:1196
old "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
new "## https://www.renpy.org/doc/html/screen_special.html#skip-indicator"
# screens.rpy:1208
old "Skipping"
new "Skipping"
# screens.rpy:1215
old "## This transform is used to blink the arrows one after another."
new "## This transform is used to blink the arrows one after another."
# screens.rpy:1247
old "## Notify screen"
new "## Notify screen"
# screens.rpy:1249
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 "## The notify screen is used to show the player a message. (For example, when the game is quicksaved or a screenshot has been taken.)"
# screens.rpy:1252
old "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
new "## https://www.renpy.org/doc/html/screen_special.html#notify-screen"
# screens.rpy:1286
old "## NVL screen"
new "## NVL screen"
# screens.rpy:1288
old "## This screen is used for NVL-mode dialogue and menus."
new "## This screen is used for NVL-mode dialogue and menus."
# screens.rpy:1290
old "## http://www.renpy.org/doc/html/screen_special.html#nvl"
new "## http://www.renpy.org/doc/html/screen_special.html#nvl"
# screens.rpy:1301
old "## Displays dialogue in either a vpgrid or the vbox."
new "## Displays dialogue in either a vpgrid or the vbox."
# screens.rpy:1314
old "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
new "## Displays the menu, if given. The menu may be displayed incorrectly if config.narrator_menu is set to True, as it is above."
# screens.rpy:1344
old "## This controls the maximum number of NVL-mode entries that can be displayed at once."
new "## This controls the maximum number of NVL-mode entries that can be displayed at once."
# screens.rpy:1406
old "## Mobile Variants"
new "## Mobile Variants"
# screens.rpy:1413
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 "## 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."
# screens.rpy:1429
old "Menu"
new "Menu"
+1
View File
@@ -0,0 +1 @@
-10
View File
@@ -1,10 +0,0 @@
translate french strings:
# game/about.rpy:21
old "[version!q]"
new "[version!q]"
# game/about.rpy:25
old "View license"
new "Voir la licence"
-22
View File
@@ -1,22 +0,0 @@
translate french strings:
# game/add_file.rpy:7
old "FILENAME"
new "NOM DU FICHIER"
# game/add_file.rpy:7
old "Enter the name of the script file to create."
new "Entrez le nom du fichier de script à créer."
# game/add_file.rpy:10
old "The filename must have the .rpy extension."
new "Le fichier doit avoir l'extension .rpy."
# game/add_file.rpy:18
old "The file already exists."
new "Le fichier éxiste déjà."
# game/add_file.rpy:21
old "# Ren'Py automatically loads all script files ending with .rpy. To use this\n# file, define a label and jump to it from another file.\n"
new "Ren'Py charge automatiquement tous les fichiers de script finissant par .rpy. Pour utiliser ce ficher\n#, définissez un label et faites un «jump» vers lui depuis un autre fichier.\n"
-101
View File
@@ -1,101 +0,0 @@
translate french strings:
# game/android.rpy:12
old "To build Android packages, please download RAPT (from {a=http://www.renpy.org/dl/android}here{/a}), unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher."
new "Pour construire les paquets Android, téléchargez RAPT (depuis {a=http://www.renpy.org/dl/android}here{/a}), dézippé le, et placez le dans le répertoire de Ren'Py. Puis, redémarrez Ren'Py."
# game/android.rpy:13
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 construire les paquets Android. Choisissez \"installer le kit de développement et créer les clés\" pour cela"
# game/android.rpy:14
old "RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore."
new "RAPT a été installé, mais aucune clé n'a été configurée. Créez une nouvelle clé, ou restaurez android.keystore."
# game/android.rpy:15
old "The current project has not been configured. Use \"Configure\" to configure it before building."
new "Le projet courant n'a pas été configuré. Choisissez \"Configurer\' pour effectuer la configuration."
# game/android.rpy:16
old "Choose \"Build\" to build the current project, or attach an Android device and choose \"Build & Install\" to build and install it on the device."
new "Choisissez \"Construire\" pour construire le projet courant, ou connecté un appareil Android et choisissez \"Construire et Installer\" pour l'installer sur l'appareil."
# game/android.rpy:18
old "Attempts to emulate an Android phone.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "Tentative d'émulation d'un téléphone Android.\n\nLe touché est émulé via la souris, mails uniquement lorsque le bouton est pressé. La barre d'espace correspond au bouton menu, et la touche PageUp correspond au bouton retour."
# game/android.rpy:19
old "Attempts to emulate an Android tablet.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "Tentative d'émulation d'une tablette Android.\n\nLe touché est émulé via la souris, mails uniquement lorsque le bouton est pressé. La barre d'espace correspond au bouton menu, et la touche PageUp correspond au bouton retour."
# game/android.rpy:20
old "Attempts to emulate an OUYA 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 OUYA.\n\nLe pad est émulé via les flèches du clavier. La touche Entrée correspond au bouton select, la barre d'espace au bouton menu, et la touche PageUp correspond au bouton retour."
# game/android.rpy:22
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."
# game/android.rpy:23
old "Configures the package name, version, and other information about this project."
new "Configure le nom du packet, sa version et d'autres informations à propos de ce projet."
# game/android.rpy:24
old "Opens the file containing the Google Play keys in the editor.\n\nThis is only needed if the application is using an expansion APK. Read the documentation for more details."
new "Ouvre le fichier contenant les clés Google Play dans l'éditeur.\n\nCela est nécessaire uniquement si l'application utilise une expansion APK. Référez-vous à la documentation pour plus d'informations."
# game/android.rpy:25
old "Builds the Android package."
new "Construire le paquet Android."
# game/android.rpy:26
old "Builds the Android package, and installs it on an Android device connected to your computer."
new "Construire le paquet Android, et l'installer sur l'appareil Android connecté à votre ordinateur."
# game/android.rpy:142
old "{a=%s}%s{/a}"
new "{a=%s}%s{/a}"
# game/android.rpy:361
old "Android: [project.current.name!q]"
new "Android: [project.current.name!q]"
# game/android.rpy:381
old "Emulation:"
new "Émulateur:"
# game/android.rpy:389
old "Phone"
new "Téléphone"
# game/android.rpy:393
old "Tablet"
new "Tablette"
# game/android.rpy:397
old "Television / OUYA"
new "Télévision / OUYA"
# game/android.rpy:409
old "Build:"
new "Construire:"
# game/android.rpy:417
old "Install SDK & Create Keys"
new "Installer le kit de développement et créer les clés"
# game/android.rpy:421
old "Configure"
new "Configurer"
# game/android.rpy:425
old "Build Package"
new "Construire le paquet"
# game/android.rpy:429
old "Build & Install"
new "Construire et installer"
# game/android.rpy:13
old "A 32-bit Java 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/index.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "Un Kit de Développement Java (JDK) 32 bits est nécessaire pour construire les paquets pour Android depuis Windows. Le JDK n'est pas la même chose que le JRE, il est possible que Java soit installé sur votre machine sans le JDK.\n\n{a=http://www.oracle.com/technetwork/java/javase/downloads/index.html}Téléchargez et installez le JDK{/a}, puis relancer le lanceur Ren'Py."
-41
View File
@@ -1,41 +0,0 @@
translate french strings:
# game/choose_theme.rpy:274
old "Could not change the theme. Perhaps options.rpy was changed too much."
new "Impossible de changer le thème. Peut être que options.rpy a été trop modifié."
# game/choose_theme.rpy:332
old "Display"
new "Affichage"
# game/choose_theme.rpy:333
old "Window"
new "Fenêtre"
# game/choose_theme.rpy:334
old "Fullscreen"
new "Plein écran"
# game/choose_theme.rpy:335
old "Planetarium"
new "Planetarium"
# game/choose_theme.rpy:342
old "Sound Volume"
new "Volume sonore"
# game/choose_theme.rpy:376
old "Choose Theme"
new "Choisir un thème"
# game/choose_theme.rpy:389
old "Theme"
new "Thème"
# game/choose_theme.rpy:413
old "Color Scheme"
new "Agencement des couleurs"
# game/choose_theme.rpy:444
old "Continue"
new "Continuer"
+276 -222
View File
@@ -1,281 +1,335 @@
translate french strings:
translate french strings:
# renpy/common/00updater.rpy:1258
old "Updater"
new "Programme de mise à jour"
# 00action_file.rpy:26
old "{#weekday}Monday"
new "{#weekday}Monday"
# renpy/common/00updater.rpy:1267
old "This program is up to date."
new "Ce programme est à jour."
# 00action_file.rpy:26
old "{#weekday}Tuesday"
new "{#weekday}Tuesday"
# renpy/common/00updater.rpy:1269
old "[u.version] is available. Do you want to install it?"
new "La version [u.version]. Voulez-vous l'installer ?"
# 00action_file.rpy:26
old "{#weekday}Wednesday"
new "{#weekday}Wednesday"
# renpy/common/00updater.rpy:1271
old "Preparing to download the updates."
new "Préparation du téléchargement de la mise à jour."
# 00action_file.rpy:26
old "{#weekday}Thursday"
new "{#weekday}Thursday"
# renpy/common/00updater.rpy:1273
old "Downloading the updates."
new "Téléchargement de la mise à jour."
# 00action_file.rpy:26
old "{#weekday}Friday"
new "{#weekday}Friday"
# renpy/common/00updater.rpy:1275
old "Unpacking the updates."
new "Dépaquetage de la mise à jour."
# 00action_file.rpy:26
old "{#weekday}Saturday"
new "{#weekday}Saturday"
# renpy/common/00updater.rpy:1279
old "The updates have been installed. The program will restart."
new "La mise à jour a bien été effectuée. Le programme va redémarrer."
# 00action_file.rpy:26
old "{#weekday}Sunday"
new "{#weekday}Sunday"
# renpy/common/00updater.rpy:1281
old "The updates have been installed."
new "La mise à jour a bien été effectuée."
# 00action_file.rpy:37
old "{#weekday_short}Mon"
new "{#weekday_short}Mon"
# renpy/common/00updater.rpy:1283
old "The updates were cancelled."
new "La mise à jour a été annullée."
# 00action_file.rpy:37
old "{#weekday_short}Tue"
new "{#weekday_short}Tue"
# renpy/common/_layout/classic_load_save.rpym:120
old "Empty Slot."
new "Emplacement vide."
# 00action_file.rpy:37
old "{#weekday_short}Wed"
new "{#weekday_short}Wed"
# renpy/common/_layout/classic_load_save.rpym:152
old "a"
new "a"
# 00action_file.rpy:37
old "{#weekday_short}Thu"
new "{#weekday_short}Thu"
# renpy/common/_layout/classic_load_save.rpym:161
old "q"
new "q"
# 00action_file.rpy:37
old "{#weekday_short}Fri"
new "{#weekday_short}Fri"
# renpy/common/_layout/classic_joystick_preferences.rpym:76
old "Joystick Mapping"
new "Joystick"
# 00action_file.rpy:37
old "{#weekday_short}Sat"
new "{#weekday_short}Sat"
# renpy/common/00layout.rpy:421
old "Are you sure?"
new "Êtes-vous sûr ?"
# 00action_file.rpy:37
old "{#weekday_short}Sun"
new "{#weekday_short}Sun"
# renpy/common/00layout.rpy:422
old "Are you sure you want to delete this save?"
new "Êtes-vous sûr de vouloir supprimer cette sauvegarde ?"
# 00action_file.rpy:47
old "{#month}January"
new "{#month}January"
# renpy/common/00layout.rpy:423
old "Are you sure you want to overwrite your save?"
new "Êtes-vous sûr de vouloir écraser cette sauvegarde ?"
# 00action_file.rpy:47
old "{#month}February"
new "{#month}February"
# renpy/common/00layout.rpy:424
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "En effectuant ce chargement, vous perderez votre avancement non sauvegardé.\nÊtes-vous sûr de vouloire faire ça ?"
# 00action_file.rpy:47
old "{#month}March"
new "{#month}March"
# renpy/common/00layout.rpy:425
old "Are you sure you want to quit?"
new "Êtes-vous sûr de vouloir quitter ?"
# 00action_file.rpy:47
old "{#month}April"
new "{#month}April"
# renpy/common/00layout.rpy:426
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "Êtes-vous sûr de vouloir retourner au menu principal ?\nVous perdrez votre avancement non sauvegardé."
# 00action_file.rpy:47
old "{#month}May"
new "{#month}May"
# renpy/common/00keymap.rpy:167
old "Saved screenshot as %s."
new "La capture d'écran a été enregistrée en tant que %s"
# 00action_file.rpy:47
old "{#month}June"
new "{#month}June"
# renpy/common/00gltest.rpy:50
old "Graphics Acceleration"
new "Accélération graphique"
# 00action_file.rpy:47
old "{#month}July"
new "{#month}July"
# renpy/common/00gltest.rpy:54
old "Automatically Choose"
new "Choix automatique"
# 00action_file.rpy:47
old "{#month}August"
new "{#month}August"
# renpy/common/00gltest.rpy:59
old "Force Angle/DirectX Renderer"
new "Forcer le rendu Angle/DirectX"
# 00action_file.rpy:47
old "{#month}September"
new "{#month}September"
# renpy/common/00gltest.rpy:63
old "Force OpenGL Renderer"
new "Forcer le rendu OpenGL"
# 00action_file.rpy:47
old "{#month}October"
new "{#month}October"
# renpy/common/00gltest.rpy:67
old "Force Software Renderer"
new "Forcer le rendu logiciel"
# 00action_file.rpy:47
old "{#month}November"
new "{#month}November"
# renpy/common/00gltest.rpy:73
old "Changes will take effect the next time this program is run."
new "Les changement seront pris en compte au prochin démarrage du programme."
# 00action_file.rpy:47
old "{#month}December"
new "{#month}December"
# renpy/common/00gltest.rpy:77
old "Quit"
new "Quitter"
# 00action_file.rpy:63
old "{#month_short}Jan"
new "{#month_short}Jan"
# renpy/common/00gltest.rpy:82
old "Return"
new "Retour"
# 00action_file.rpy:63
old "{#month_short}Feb"
new "{#month_short}Feb"
# renpy/common/00gltest.rpy:112
old "Performance Warning"
new "Avertissement sur les performances"
# 00action_file.rpy:63
old "{#month_short}Mar"
new "{#month_short}Mar"
# renpy/common/00gltest.rpy:117
old "This computer is using software rendering."
new "Cet ordinateur utilise le rendu logiciel."
# 00action_file.rpy:63
old "{#month_short}Apr"
new "{#month_short}Apr"
# renpy/common/00gltest.rpy:119
old "This computer is not using shaders."
new "Cet ordinateur n'utilise pas les shaders."
# 00action_file.rpy:63
old "{#month_short}May"
new "{#month_short}May"
# renpy/common/00gltest.rpy:121
old "This computer is displaying graphics slowly."
new "Cet ordinateur affiche lentement les graphismes."
# 00action_file.rpy:63
old "{#month_short}Jun"
new "{#month_short}Jun"
# renpy/common/00gltest.rpy:123
old "This computer has a problem displaying graphics: [problem]."
new "Cet ordinateur rencontre des difficultés à afficher les graphismes: [problem]."
# 00action_file.rpy:63
old "{#month_short}Jul"
new "{#month_short}Jul"
# renpy/common/00gltest.rpy:128
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
new "Les pilotes graphiques ne semblent pas à jour ou dysfonctionnent. Cela peut entraîner des ralentissements ou de mauvais affichages. Mettre à jour DirectX pourraît régler ce problème."
# 00action_file.rpy:63
old "{#month_short}Aug"
new "{#month_short}Aug"
# renpy/common/00gltest.rpy:130
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new "Les pilotes graphiques ne semblent pas à jour ou dysfonctionnent. Cela peut entraîner des ralentissements ou de mauvais affichages."
# 00action_file.rpy:63
old "{#month_short}Sep"
new "{#month_short}Sep"
# renpy/common/00gltest.rpy:135
old "Update DirectX"
new "Mettre à jour DirectX"
# 00action_file.rpy:63
old "{#month_short}Oct"
new "{#month_short}Oct"
# renpy/common/00gltest.rpy:141
old "Continue, Show this warning again"
new "Continer, Afficher cet avertissement la prochaine fois."
# 00action_file.rpy:63
old "{#month_short}Nov"
new "{#month_short}Nov"
# renpy/common/00gltest.rpy:145
old "Continue, Don't show warning again"
new "Continer, Ne plus afficher cet avertissement."
# 00action_file.rpy:63
old "{#month_short}Dec"
new "{#month_short}Dec"
# renpy/common/00gltest.rpy:171
old "Updating DirectX."
new "Mettre à jour de DirectX en cours"
# renpy/common/00gltest.rpy:175
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
new "La mise à jour de DirectX a débutée. Elle est sans doute minimisée dans la bare de tâche. Merci de suivre les instructions pour installer DirectX."
# renpy/common/00gltest.rpy:179
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
new "{b}Note:{/b} le programme d'installation de Microsoft's DirectX va, par defaut, installer la barre d'outils Bing. Si vous ne voulez pas de cette barre, décochez la case appropriée."
# renpy/common/00gltest.rpy:183
old "When setup finishes, please click below to restart this program."
new "Lorsque l'instllation sera terminée, cliquez ci-dessous pour redémarrer ce programme."
# renpy/common/00gltest.rpy:185
old "Restart"
new "Redémarrer"
# renpy/common/_errorhandling.rpym:408
old "An exception has occurred."
new "Une exception a été levée."
# renpy/common/_errorhandling.rpym:434
old "Rollback"
new "Revenir en arrière"
# renpy/common/_errorhandling.rpym:436
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "Tenter de revenir en arrière, vous permet de sauvegarder ou de faire un autre choix."
# renpy/common/_errorhandling.rpym:439
old "Ignore"
new "Ignorer"
# renpy/common/_errorhandling.rpym:441
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "Ignorer l'exception vous permet de continuer. Cela entraîne généralement des erreurs additionelles."
# renpy/common/_errorhandling.rpym:444
old "Reload"
new "Recharger"
# renpy/common/_errorhandling.rpym:446
old "Reloads the game from disk, saving and restoring game state if possible."
new "Recharger le jeu depuis le disque dur and tenter de restaurer le jeu dans l'état actuel."
# renpy/common/_errorhandling.rpym:448
old "Open Traceback"
new "Ouvrir la pile d'appel"
# renpy/common/_errorhandling.rpym:450
old "Opens the traceback.txt file in a text editor."
new "Ouvrir traceback.txt dans un éditeur de texte."
# renpy/common/_errorhandling.rpym:456
old "Quits the game."
new "Quitter le jeu."
# renpy/common/_errorhandling.rpym:483
old "Parsing the script failed."
new "L'analyse du script a échouée."
# renpy/common/_errorhandling.rpym:510
old "Open Parse Errors"
new "Ouvrir les erreurs d'analyse."
# renpy/common/_errorhandling.rpym:512
old "Opens the errors.txt file in a text editor."
new "Ouvrir errors.txt dans un éditeur de texte."
# renpy/common/00action_file.rpy:118
# 00action_file.rpy:235
old "%b %d, %H:%M"
new "%b %d, %H:%M"
# renpy/common/_compat/gamemenu.rpym:337
old "Previous"
new "Précédent"
# 00action_file.rpy:820
old "Quick save complete."
new "Sauvegarde rapide effectuée."
# renpy/common/_compat/gamemenu.rpym:344
old "Next"
new "Suivant"
# 00gui.rpy:227
old "Are you sure?"
new "Êtes-vous sûr ?"
# renpy/common/00library.rpy:77
# 00gui.rpy:228
old "Are you sure you want to delete this save?"
new "Êtes-vous sûr de vouloir supprimer cette sauvegarde ?"
# 00gui.rpy:229
old "Are you sure you want to overwrite your save?"
new "Êtes-vous sûr de vouloir écraser cette sauvegarde ?"
# 00gui.rpy:230
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "Le chargement entraînera la perte des données non sauvegardées.\nÊtes-vous sûr de vouloir faire cela ?"
# 00gui.rpy:231
old "Are you sure you want to quit?"
new "Êtes-vous sûr de vouloir quitter ?"
# 00gui.rpy:232
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "Êtes-vous sûr de vouloir retourner au menu principal ?\nVous perdrez les données non sauvegardées."
# 00gui.rpy:233
old "Are you sure you want to end the replay?"
new "Are you sure you want to end the replay?"
# 00gui.rpy:234
old "Are you sure you want to begin skipping?"
new "Êtes-vous sûr de vouloir commencer à sauter ?"
# 00gui.rpy:235
old "Are you sure you want to skip to the next choice?"
new "Êtes-vous sûr de vouloir sauter jusqu'au prochain choix ?"
# 00gui.rpy:236
old "Are you sure you want to skip unseen dialogue to the next choice?"
new "Are you sure you want to skip unseen dialogue to the next choice?"
# 00keymap.rpy:250
old "Saved screenshot as %s."
new "Sauvez cette capture d'écran sous le nom %s."
# 00library.rpy:142
old "Self-voicing disabled."
new "Self-voicing disabled."
# 00library.rpy:143
old "Clipboard voicing enabled. "
new "Clipboard voicing enabled. "
# 00library.rpy:144
old "Self-voicing enabled. "
new "Self-voicing enabled. "
# 00library.rpy:179
old "Skip Mode"
new "Mode rapide"
new "Mode saut"
# renpy/common/00library.rpy:80
old "Fast Skip Mode"
new "Mode très rapide"
# 00library.rpy:262
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 "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}."
# renpy/common/00gallery.rpy:521
# 00preferences.rpy:422
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "Clipboard voicing enabled. Press 'shift+C' to disable."
# 00preferences.rpy:424
old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
new "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable."
# 00preferences.rpy:426
old "Self-voicing enabled. Press 'v' to disable."
new "Self-voicing enabled. Press 'v' to disable."
# 00iap.rpy:217
old "Contacting App Store\nPlease Wait..."
new "Contacting App Store\nPlease Wait..."
# 00updater.rpy:367
old "The Ren'Py Updater is not supported on mobile devices."
new "The Ren'Py Updater is not supported on mobile devices."
# 00updater.rpy:486
old "An error is being simulated."
new "An error is being simulated."
# 00updater.rpy:662
old "Either this project does not support updating, or the update status file was deleted."
new "Either this project does not support updating, or the update status file was deleted."
# 00updater.rpy:676
old "This account does not have permission to perform an update."
new "This account does not have permission to perform an update."
# 00updater.rpy:679
old "This account does not have permission to write the update log."
new "This account does not have permission to write the update log."
# 00updater.rpy:704
old "Could not verify update signature."
new "Could not verify update signature."
# 00updater.rpy:975
old "The update file was not downloaded."
new "The update file was not downloaded."
# 00updater.rpy:993
old "The update file does not have the correct digest - it may have been corrupted."
new "The update file does not have the correct digest - it may have been corrupted."
# 00updater.rpy:1049
old "While unpacking {}, unknown type {}."
new "While unpacking {}, unknown type {}."
# 00updater.rpy:1393
old "Updater"
new "Mise à jour"
# 00updater.rpy:1404
old "This program is up to date."
new "Ce programme est à jour."
# 00updater.rpy:1406
old "[u.version] is available. Do you want to install it?"
new "[u.version] est disponible. Voulez-vous l'installer ?"
# 00updater.rpy:1408
old "Preparing to download the updates."
new "Préparation au téléchargement de la mise à jour."
# 00updater.rpy:1410
old "Downloading the updates."
new "Téléchargement de la mise à jour."
# 00updater.rpy:1412
old "Unpacking the updates."
new "Dépaquetage de la mise à jour."
# 00updater.rpy:1416
old "The updates have been installed. The program will restart."
new "La mise à jour a été installée. Le programme va redémarrer."
# 00updater.rpy:1418
old "The updates have been installed."
new "La mise à jour a été installée."
# 00updater.rpy:1420
old "The updates were cancelled."
new "La mise à jour a été annulée."
# 00gallery.rpy:563
old "Image [index] of [count] locked."
new "Image [index] sur [count] verrouillée."
new "Image [index] sur [count] bloquée."
# renpy/common/00gallery.rpy:539
# 00gallery.rpy:583
old "prev"
new "précédent"
new "prec."
# renpy/common/00gallery.rpy:540
# 00gallery.rpy:584
old "next"
new "suivant"
new "suiv."
# renpy/common/00gallery.rpy:541
# 00gallery.rpy:585
old "slideshow"
new "diaporama"
# renpy/common/00gallery.rpy:542
# 00gallery.rpy:586
old "return"
new "retour"
# renpy/common/00layout.rpy:427
old "Are you sure you want to begin skipping?"
new "Êtes-vous sûr de vouloir commencer à sauter certaines étapes ?"
# renpy/common/00layout.rpy:428
old "Are you sure you want to skip to the next choice?"
new "Êtes-vous sûr de vouloir sauter le prochain choix ?"
# renpy/common/00layout.rpy:429
old "Are you sure you want to skip to unseen dialogue or the next choice?"
new "Êtes-vous sûr de vouloir sauter des dialogues non lus or le prochain choix ?"
# renpy/common/00action_file.rpy:587
old "Quick save complete."
new "Sauvegarde rapide effectuée."

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