Compare commits

...

365 Commits

Author SHA1 Message Date
Tom Rothamel 34eee81a55 StoreDict and StoreModule classes. 2011-10-23 22:04:36 -04:00
Tom Rothamel bec2a832ea Type out text at the full framerate. 2011-10-20 19:26:15 -04:00
Tom Rothamel 6d86238f0a Bump version. 2011-10-18 22:02:59 -04:00
Tom Rothamel 758d5bad17 Disable substitutions in the launcher. 2011-10-18 21:54:17 -04:00
Tom Rothamel 291ff22366 Fix crash in font searching. 2011-10-16 22:37:38 -04:00
Tom Rothamel f4f0b8f8ce On Android, clear out multiple up or down events. 2011-10-15 14:49:45 -04:00
Tom Rothamel b8abc5aa16 Build docs, bump version. 2011-10-13 01:05:20 -04:00
Tom Rothamel 28fd3c9c89 Fix crash when loading in a created style. 2011-10-13 00:20:19 -04:00
Tom Rothamel 2c94cd19f6 Fix problems with QuickSave and QuickLoad. 2011-10-12 22:53:27 -04:00
Tom Rothamel 8add2bca63 Fix the creation of small solid textures on the software renderer. 2011-10-10 23:33:30 -04:00
Tom Rothamel 77041374ea Fix slow text, bump version. 2011-10-09 10:06:19 -04:00
Tom Rothamel 3d54904e89 Sphinx fixes. 2011-10-08 12:18:34 -04:00
Tom Rothamel a9d1f16cd8 shift+G gets people to the graphics menu. 2011-10-08 10:38:46 -04:00
Tom Rothamel 0439b22269 Bump version. 2011-10-06 17:54:46 -04:00
Tom Rothamel 3fe8abf25c Fix jumps from called screens. 2011-10-06 17:54:04 -04:00
Tom Rothamel 04299ac0f5 Fix distributed files, bump version, add build test script. 2011-10-06 08:22:35 -04:00
Tom Rothamel 96397ea768 Bump version. 2011-10-05 18:58:48 -04:00
Tom Rothamel 6580b36e35 Fix bugs in init phase error handling. 2011-10-04 23:33:49 -04:00
Tom Rothamel 4af4384dac Text's __init__ method can't use styles, since they're not built yet. 2011-10-04 23:29:26 -04:00
Tom Rothamel ebaaf0b242 Perform early binding on text substitutions. 2011-10-02 20:58:51 -04:00
Tom Rothamel bea36e2aa2 Doc fix to CDDs. 2011-10-02 15:14:10 -04:00
Tom Rothamel 247ec17be3 Tweaks to DX update phrasing. 2011-10-02 10:30:06 -04:00
Tom Rothamel 577c378517 Doc fixes. 2011-09-30 17:00:20 -04:00
Tom Rothamel 52e631f229 Make scissor box placement more correct, to prevent artifacts on the
sides of Frames.
2011-09-29 23:56:35 -04:00
Tom Rothamel f8307f725e Fix the scissor test to work with non-default projections, like the one
the mouse uses.
2011-09-29 17:20:45 -04:00
Tom Rothamel c13fbcaab2 Set config.auto_save_extra_info. 2011-09-29 00:31:52 -04:00
Tom Rothamel 6c4eff321e But for convenience, do a with None on a JumpException. 2011-09-28 22:38:33 -04:00
Tom Rothamel 54b8b73d45 Call screen only does a with None if it returns. 2011-09-28 22:35:28 -04:00
Tom Rothamel 0e88b7629e Ensure the software renderer calls init. 2011-09-28 18:20:24 -04:00
Tom Rothamel 012f148622 Fix transition per_interact handling. 2011-09-27 21:57:31 -04:00
Tom Rothamel 56a20cc877 Fix timer repeat bug, from http://lemmasoft.renai.us/forums/viewtopic.php?f=8&t=12023 2011-09-27 20:13:30 -04:00
Tom Rothamel b8df922459 Doc fixes. 2011-09-27 20:09:02 -04:00
Tom Rothamel 896232d308 Properly handle newlines in rpt files. 2011-09-27 20:02:31 -04:00
Tom Rothamel 0207327ded Doc fixes, thanks to Koichi Akabe. 2011-09-27 19:07:16 -04:00
Tom Rothamel e6815a3a4f Deal with buggy fonts w/ positive descenders. 2011-09-26 22:38:38 -04:00
Tom Rothamel 179bbaea92 Fixes to text vertical layout. 2011-09-26 22:13:21 -04:00
Tom Rothamel c7889bc7a2 Don't clip the mouse cursor. 2011-09-25 22:00:45 -04:00
Tom Rothamel ce9ecd124a Fix segfault bug. 2011-09-25 21:19:35 -04:00
Tom Rothamel 426a12d50c Use the existence of ANGLE to decide if we should use the fixed function
renderer, or fall back to ANGLE/DX.
2011-09-25 18:38:48 -04:00
Tom Rothamel eefd0ed728 Prioritize gl2 over angle over gl1 over software. 2011-09-24 23:31:41 -04:00
Tom Rothamel 6604043df0 Deactivate attribute arrays when they're not going to be used. 2011-09-20 22:53:24 -04:00
Tom Rothamel a3271bb290 Distribute sound.pyx. 2011-09-18 14:52:12 -04:00
Tom Rothamel aeed3598a1 Bump versions. 2011-09-18 14:00:56 -04:00
Tom Rothamel 4b43986a6c Allow auto-created styles to be loaded. 2011-09-18 13:58:08 -04:00
Tom Rothamel 4f79180a8e Prefer the copy RTT to the FBO one, because FBOs seem to trigger
crashes on a regular basis.
2011-09-18 13:31:42 -04:00
Tom Rothamel a635c4c35c Update changelog. 2011-09-11 12:37:58 -04:00
Tom Rothamel afc42f4ed3 Make error handling more robust. 2011-09-11 12:35:22 -04:00
Tom Rothamel 547accfd44 Allow user-defined statements to take blocks. 2011-09-11 11:34:00 -04:00
Tom Rothamel ccb51c7a26 Fix lint w/ non-English characters in the what part of a say statement. 2011-09-11 09:35:45 -04:00
Tom Rothamel 33190bba34 Update android build; add support for android assets. 2011-09-07 23:35:30 -04:00
Tom Rothamel b3147011d4 Only error out on bad text if config.developer is set. 2011-09-05 09:47:00 -04:00
Tom Rothamel 4c987901b6 Move to avlib. Deal with invalid frame sizes. Include posixpath on windows. 2011-09-05 09:42:37 -04:00
Tom Rothamel ce332b895f When text gets a non-string, non-displayable, trigger the error early. 2011-09-04 14:58:58 -04:00
Tom Rothamel 9b5823109f Guard more prediction. 2011-09-04 14:29:40 -04:00
Tom Rothamel 7a84fb8cdd Renamed from Low-Carb to Eye of the Storm. Thanks, Hurricane Irene. 2011-09-04 13:38:25 -04:00
Tom Rothamel 94c5c525a7 Allow ATL to interpolate None vs a tuple. 2011-09-04 13:19:53 -04:00
Tom Rothamel 0d25e419b4 Fixes. 2011-09-04 11:39:27 -04:00
Tom Rothamel b669f8363c More doc fixes. 2011-09-03 22:06:39 -04:00
Tom Rothamel 8e44aa6f88 More documentation. 2011-09-03 21:35:57 -04:00
Tom Rothamel 3ef70f862e Better format timed output. 2011-09-02 18:20:22 -04:00
Tom Rothamel e4d99edb65 Use RGBA to read pixels, even if we just want the alpha channel. This
is because GL_ALPHA isn't supported on GLES 2.
2011-09-02 08:59:37 -04:00
Tom Rothamel 5f611786dd Tweak compat version. 2011-09-02 07:45:28 -04:00
Tom Rothamel 657711a0a7 Change search style. 2011-09-01 21:01:39 -04:00
Tom Rothamel 0f1e6e7702 Update documentation. 2011-09-01 20:37:57 -04:00
Tom Rothamel e379ffae51 Include line number as part of the bytecode hash data. 2011-09-01 19:56:47 -04:00
Tom Rothamel b10d5e715c Use the advance, not the width, for image-based fonts.
Include .pyo files in an update iff there's no corresponding .py file.
2011-09-01 16:55:37 -04:00
Tom Rothamel 2f54637881 Flush logs after write. 2011-08-31 20:34:32 -04:00
Tom Rothamel eda1e01a71 Ignore more exceptions in displayables. 2011-08-31 17:07:42 -04:00
Tom Rothamel 8fdc4b8f58 Include utf_16_be, since it's used by the python compiler. 2011-08-31 15:28:15 -04:00
Tom Rothamel 3048825824 Only run iconified/restored code if we change states. 2011-08-30 22:04:50 -04:00
Tom Rothamel 704685c11a Bug fixing. 2011-08-30 19:30:33 -04:00
Tom Rothamel 7fba3a04da Try to fix reported encoding problem. 2011-08-30 17:35:59 -04:00
Tom Rothamel bfc57ecfc6 Fix off-by-one error in the blit outlining code. 2011-08-30 16:43:16 -04:00
Tom Rothamel c0dba7f121 Add a break point before a displayable. 2011-08-30 16:19:40 -04:00
Tom Rothamel ce3e63f3a5 Add latin encoding.
Fix windows build.
2011-08-27 23:47:19 -04:00
Tom Rothamel 0105503855 Quote urls properly. 2011-08-27 22:44:33 -04:00
Tom Rothamel 0d8525f1b1 Fix an exception in text.py, and one in logging. 2011-08-27 21:01:50 -04:00
Tom Rothamel bfd4a1e846 Reset the display when restoring on windows.
This fixes a bug where DirectX would leave a restored window blank, for
some reason.
2011-08-27 20:22:50 -04:00
Tom Rothamel c74343d2dd Use #-of-texture specific vertex shaders. 2011-08-27 16:11:43 -04:00
Tom Rothamel 6f7f545cd8 Document new text tags. 2011-08-26 21:43:48 -04:00
Tom Rothamel 303885776e Use RENPY_CYTHON to get the path to cython. 2011-08-26 21:17:03 -04:00
Tom Rothamel cabcf5b73c Fix compatibility. 2011-08-26 14:05:37 -04:00
Tom Rothamel a8a1972418 Don't update the file page when it's None. 2011-08-25 22:33:35 -04:00
Tom Rothamel 347778d8aa Revert {w} handling to be more similar to the way it was in 6.12, so
as to work better with NVL-mode.
2011-08-25 00:02:39 -04:00
Tom Rothamel 9646c951bb ANGLE should render to RGBA textures. 2011-08-24 12:45:23 -04:00
Tom Rothamel 7b4128f6b2 Don't transition off of a null that's been created without the ATL
script ever running.
2011-08-23 23:47:40 -04:00
Tom Rothamel 7ac623fc99 Fix problem with drawing an empty texture. Other fixes required to
build things.
2011-08-23 22:07:55 -04:00
Tom Rothamel e9328255b7 Pick a name: Low-Carb 2011-08-22 21:37:25 -04:00
Tom Rothamel 11ce47287b Make label take a scope. 2011-08-22 20:32:38 -04:00
Tom Rothamel a1ab25955d Make the tutorial game use new-style substitutions. 2011-08-22 20:08:40 -04:00
Tom Rothamel 3f59b82c2a Don't package bad filenames. 2011-08-22 19:30:17 -04:00
Tom Rothamel 0e6cded6cd Tweak what we distribute. 2011-08-22 19:28:34 -04:00
Tom Rothamel e18f73b317 Fix problem with empty lines in Text. 2011-08-22 19:15:00 -04:00
Tom Rothamel e65146503c Update license and changelog. 2011-08-20 21:53:42 -04:00
Tom Rothamel a6a5c65067 Make Ren'Py compile w/ ffmpeg-0.8.2. 2011-08-20 21:45:37 -04:00
Tom Rothamel afb58fa423 Offer the user the ability to install DirectX. 2011-08-20 17:08:07 -04:00
Tom Rothamel 8762636374 Document text overflow debugging. 2011-08-19 23:04:44 -04:00
Tom Rothamel d1b53fb56c Tweak wording. 2011-08-19 22:49:53 -04:00
Tom Rothamel c7b028b8cf Add missing files. 2011-08-19 22:42:07 -04:00
Tom Rothamel d0ee364a81 Document style preferences and image fonts. 2011-08-19 22:41:15 -04:00
Tom Rothamel a48fdc0d2c Remove minigame; fix uses of renpy.display.text; fix auto-unicode. 2011-08-18 12:05:58 -04:00
Tom Rothamel a464034fd0 More documentation. 2011-08-17 22:10:51 -04:00
Tom Rothamel 51955cae76 Add more indexes, start writing text documentation. 2011-08-17 21:42:35 -04:00
Tom Rothamel f2633d528e Translation update support. 2011-08-16 21:21:11 -04:00
Tom Rothamel 33090e1aa4 Document new text styles. 2011-08-16 20:36:24 -04:00
Tom Rothamel ffc801eaca Write changelog. 2011-08-16 19:16:52 -04:00
Tom Rothamel 49e77a1fa1 Add time_warp parameter to Dissolve and ImageDissolve. 2011-08-15 21:42:36 -04:00
Tom Rothamel 13c5ddc5fa Change the meaning of the auto-forward adjustment when default_afm_enable is
not None.
2011-08-15 21:25:44 -04:00
Tom Rothamel 1ee54eecbd Restore 6.11's xfill/yfill behavior. 2011-08-15 21:01:31 -04:00
Tom Rothamel b7ac285aeb Theme updates and color schemes from Aleema. 2011-08-15 13:57:06 -04:00
Tom Rothamel b6b50f1842 New themes, courtesy of Aleema. 2011-08-15 13:49:09 -04:00
Tom Rothamel d283792193 Add the quick menu to input and nvl-mode screens. 2011-08-14 09:46:45 -04:00
Tom Rothamel 0c5ccd267c Add quick menu to tutorial game. 2011-08-14 09:31:53 -04:00
Tom Rothamel 81108e2d26 Add image gallery. 2011-08-13 22:05:18 -04:00
Tom Rothamel 3c3590bafe Basic translation framework (no tool support). 2011-08-11 23:50:44 -04:00
Tom Rothamel b9e1120f69 New actions - SelectedIf, SetMixer, Rollback, and RollForward. 2011-08-11 20:18:41 -04:00
Tom Rothamel 9f943337bb Update the look of the documentation. 2011-08-11 17:48:49 -04:00
Tom Rothamel ab8964be1d Fix renpy.free_memory. 2011-08-11 15:41:17 -04:00
Tom Rothamel 37c1ba3926 Implement the caret style property. 2011-08-11 15:21:00 -04:00
Tom Rothamel 364d077c8a Allow frame borders to be assymetric. 2011-08-10 00:04:15 -04:00
Tom Rothamel 626f86b500 Fix an encoding problem. 2011-08-08 21:57:42 -04:00
Tom Rothamel d6488e4e7d Export renpy.easy.displayable as renpy.displayable. 2011-08-08 21:57:05 -04:00
Tom Rothamel 846abef17f Include platform in url. 2011-08-08 21:56:51 -04:00
Tom Rothamel 60e65a4d01 Automatically set the focus name of screens. 2011-08-08 20:47:39 -04:00
Tom Rothamel 4057365ff1 Allow newtext to react to style prefix changes. 2011-08-08 13:44:28 -04:00
Tom Rothamel f7d95e2791 Ensure that a transform always has a child after it has been copied,
since the copying code assumes the presence of a child when it updates
the state.

Other Cradle Song-inspired fixes.
2011-08-08 08:21:15 -04:00
Tom Rothamel db812e7f7b Implement style preferences. 2011-08-07 23:09:37 -04:00
Tom Rothamel 66e51bab0d Remove iliad support. 2011-08-07 20:46:29 -04:00
Tom Rothamel d0d82a5e22 Ren'Py always uses RGBA, with the software renderer translating that to the
screen format at texture load time.
2011-08-07 16:46:35 -04:00
Tom Rothamel 2d99e76007 Remove old-style scaling, in favor of a simple render-and-scale approach. 2011-08-07 14:30:04 -04:00
Tom Rothamel 102ff2145f Made setup.py report unnecessary files in gen. 2011-08-06 23:28:50 -04:00
Tom Rothamel 0e00282758 Merge Angle/DirectX support. 2011-08-06 23:22:43 -04:00
Tom Rothamel 337d12e490 Factor the performance test out into its own function, so creators can
call it whenever they want.
2011-08-06 23:19:05 -04:00
Tom Rothamel 916e125f4b Tweak language. 2011-08-06 22:59:31 -04:00
Tom Rothamel 752ef70000 Use framebuffer RTT by default when available. 2011-08-06 22:36:39 -04:00
Tom Rothamel b67c70dbe3 Add performance test.
Change how Ren'Py stores the renderer to use.

Add renpy.windows, renpy.macintosh, renpy.linux, and renpy.android
platform variables.
2011-08-06 22:31:05 -04:00
Tom Rothamel 8277ba6b5b Set the swap interval, although ANGLE doesn't seem to respect it. 2011-08-06 14:57:05 -04:00
Tom Rothamel 2db2a4a94d Fix windows build. 2011-08-06 14:20:02 -04:00
Tom Rothamel a477b862dd Eliminate the glenviron module. 2011-08-06 12:42:17 -04:00
Tom Rothamel 0a5cf3bcee Remove glshader now that everything from it has been moved into glenviron_shader. 2011-08-05 08:41:59 -04:00
Tom Rothamel 2d6e2bcd61 Accept dense packing from OpenGL when taking a screenshot - this allows us to take
screenshots from OpenGL ES.
2011-08-05 08:37:53 -04:00
Tom Rothamel 8d8b52dead Minor tweaks so things run on angle. 2011-08-05 07:13:03 -04:00
Tom Rothamel 3409759271 Refactor the way clipping occurs to be environ-specific. Use the shader to clip when
it's available.
2011-08-04 22:41:43 -04:00
Tom Rothamel 3109dad59b Angle now works on windows, even when the window changes. 2011-08-03 21:12:57 -04:00
Tom Rothamel 16c35e21f4 Transpose projection matrix, since OpenGL ES won't accept the option that
tells it to transpose for us.
2011-08-03 07:34:39 -04:00
Tom Rothamel 509b33477a Checkpoint progress - can open window, list version & extensions. 2011-08-02 23:08:23 -04:00
Tom Rothamel 4fcfdd24d1 Changes to allow things to build w/ ANGLE. 2011-08-02 12:39:20 -04:00
Tom Rothamel 473e8ea861 Redo glcompat.h so that it can handle GLES2. 2011-08-02 07:41:30 -04:00
Tom Rothamel 0bbbde3fb6 Fix RTT. 2011-08-01 23:58:33 -04:00
Tom Rothamel 0576bb71de Now mostly working (w/ transition problems). 2011-08-01 23:41:30 -04:00
Tom Rothamel e91d35abda Buggy as hell gles2-style shader. 2011-08-01 22:11:50 -04:00
Tom Rothamel da638df367 Generate angle code from gl code; tweak build system so they coexist. 2011-07-31 14:07:49 -04:00
Tom Rothamel bf8467aaa0 Move gl modules into their own package. 2011-07-30 22:09:27 -04:00
Tom Rothamel 3a8eea3223 Tweak bzrignore. 2011-07-30 21:32:02 -04:00
Tom Rothamel 566ed9bae6 Merge in changes from 6.12 branch. 2011-07-29 20:44:59 -04:00
Tom Rothamel 132341c9b5 Add versioning documentation. 2011-07-29 20:37:28 -04:00
Tom Rothamel 3f2a18a387 Add 6.12.2 information. 2011-07-29 19:48:06 -04:00
Tom Rothamel 296f940437 Update the docs. 2011-07-28 22:04:14 -04:00
Tom Rothamel dc7833e0fe End skipping on a game restart. 2011-07-28 21:59:26 -04:00
Tom Rothamel 7f38694341 Show mouse when quit_action runs. 2011-07-28 19:52:27 -04:00
Tom Rothamel 0a25f4e488 Fix lockup when a transition terminates early. 2011-07-28 19:13:29 -04:00
Tom Rothamel 88d5b6ea16 Make RENPY_SCALE_FAST work. 2011-07-27 22:23:00 -04:00
Tom Rothamel b775916a8d Fix doc bugs. 2011-07-27 16:06:55 -04:00
Tom Rothamel c1e4d3d598 Prospective patch for compiling w/ new ffmpeg 2011-07-27 15:58:52 -04:00
Tom Rothamel 2435b50e6d Have multipletransition handle timeevent. 2011-07-26 21:38:49 -04:00
Tom Rothamel 466c40f501 bump version. 2011-07-25 21:48:25 -04:00
Tom Rothamel e76f4205cb Try a different approach to how we deal with childless transforms. 2011-07-24 17:40:44 -04:00
Tom Rothamel 1961d467d9 Merge in newtext branch, which includes a rewrite of Text and also improvments
to the module build system.
2011-07-23 20:00:34 -04:00
Tom Rothamel 3cb9b3637d Fix quoting of text tags. 2011-07-23 19:43:53 -04:00
Tom Rothamel cf0232d24a Clean up code. 2011-07-23 18:58:51 -04:00
Tom Rothamel d1c786aa4a Remove oldtext. 2011-07-23 18:39:48 -04:00
Tom Rothamel 209b2b2099 Backwards compatibility and test cases. 2011-07-23 18:37:36 -04:00
Tom Rothamel efd378e71c Change defaults, bump version. 2011-07-22 13:33:05 -04:00
Tom Rothamel 50edf2ad83 Add backwards compatibility. 2011-07-22 13:27:28 -04:00
Tom Rothamel 27aae8a8f0 Hook newtext up to the screen language. 2011-07-21 21:13:27 -04:00
Tom Rothamel b07cae5959 Update Input to work with newtext. 2011-07-21 16:10:11 -04:00
Tom Rothamel f786704d9a Eliminate most uses of renpy.display.text. 2011-07-21 15:40:46 -04:00
Tom Rothamel 9f46f7a824 Text overflow detection. 2011-07-21 13:32:10 -04:00
Tom Rothamel 9b98a0f442 Make substitutions occur in Character. 2011-07-21 13:10:07 -04:00
Tom Rothamel 165c6886c1 Finish font TODOs. 2011-07-21 12:08:44 -04:00
Tom Rothamel c79f9f585b Displaying image fonts (with TODOs, still.) 2011-07-20 23:05:38 -04:00
Tom Rothamel 486ea3dc70 Start work on the new font module. 2011-07-20 22:29:14 -04:00
Tom Rothamel 765566acb0 Implement newline indent. 2011-07-20 06:47:28 -04:00
Tom Rothamel 06e06c3504 Continue integration/testing work. Can now begin to run the tutorial. 2011-07-18 22:36:29 -04:00
Tom Rothamel a16cf65808 Start hooking up newtext. 2011-07-17 21:22:59 -04:00
Tom Rothamel b65a5e6452 Redo build system to be simpler, and to automatically track dependencies. 2011-07-17 14:39:10 -04:00
Tom Rothamel ec88378641 Put newtext into its own package. 2011-07-17 12:15:09 -04:00
Tom Rothamel e22cc152d8 Finish substitutions and add to newtext. 2011-07-16 21:21:39 -04:00
Tom Rothamel db8adea231 Remove all symlinks from tree. 2011-07-16 10:55:00 -04:00
Tom Rothamel 7c7c92fe91 Add support for {_end} tag. 2011-07-15 22:29:23 -04:00
Tom Rothamel 7a8dec6afa State-machine-based formatter object. 2011-07-15 21:44:30 -04:00
Tom Rothamel 49637c2dbd Add a "nobreak" layout mode. 2011-07-14 21:54:25 -04:00
Tom Rothamel 51372d281a Finish implementing TeX linebreaking. 2011-07-14 21:37:13 -04:00
Tom Rothamel 3a4973ba20 Add support for RTL languages. 2011-07-14 21:12:30 -04:00
Tom Rothamel e447c6170b merge mainline 2011-07-14 11:28:51 -04:00
Tom Rothamel 90b25d3ea4 Remove symlink. 2011-07-13 00:49:14 -04:00
Tom Rothamel 951afa8799 screens: Only show joystick if a joystick exists (or we fake it). 2011-07-12 23:49:19 -04:00
Tom Rothamel 644243db31 Timer now can take a list of actions, rather than just a callable. Fixes lp:808546. 2011-07-10 21:41:44 -04:00
Tom Rothamel 212a1f0682 Document music_room. 2011-07-02 21:53:29 -04:00
Tom Rothamel d700cd9a97 Add music room. 2011-07-02 20:34:55 -04:00
Tom Rothamel 59d4ff87b8 Merge in fixes from the 6.12.1 branch. 2011-06-23 22:09:28 -04:00
Tom Rothamel 08641efd0c Force ATL transforms to be executed before they can be copied. This
prevents no child errors when the child is the first thing in the ATL.
2011-06-22 23:23:14 -04:00
Tom Rothamel 7c81554b39 Comment out parameterize for now. 2011-06-22 22:24:21 -04:00
Tom Rothamel 6fc1792436 Fix CTC-related problems. 2011-06-22 17:52:31 -04:00
Tom Rothamel c2855f7871 Use the correct definition for RENPY_THIRD_TEXTURE. 2011-06-22 16:13:17 -04:00
Tom Rothamel 5988076d56 Update documentation. 2011-06-22 13:54:50 -04:00
Tom Rothamel 4a0164fc7f Fix xfill/yfill fix. 2011-06-22 00:23:15 -04:00
Tom Rothamel 9bad334102 Ren'Py no longer captures gamepad input when not focused. 2011-06-21 23:19:27 -04:00
Tom Rothamel 4dfca9e6c1 Handle quit-during-error-handling by quitting. 2011-06-21 22:53:47 -04:00
Tom Rothamel 8b1dee04cd Fixes for the software renderer. 2011-06-20 22:32:33 -04:00
Tom Rothamel d856bd13be Pick a better window size on netbooks that use the software renderer. 2011-06-20 00:17:51 -04:00
Tom Rothamel e9d198109c ATL splines should deal with unknown properties, just like linear interpolation does. 2011-06-19 23:25:33 -04:00
Tom Rothamel aed19f9492 Add a NoRollback class, and make Particle inherit from it, to preserve
previous semantics.
2011-06-19 22:55:21 -04:00
Tom Rothamel 126c520d14 Fix bug with side images. 2011-06-19 14:45:29 -04:00
Tom Rothamel 6d23374f01 Use tablet/phone variants before None variant; also before touch variant. Add pc variant. 2011-06-19 13:56:40 -04:00
Tom Rothamel 6f0c5873c2 Call slow_done even if slow is set to False. This fixes a problem with CTC not showing up after a reload. 2011-06-19 12:32:36 -04:00
Tom Rothamel b8fb05f30f Give a more informative diagnostic for a menu caption followed by a block. 2011-06-19 08:45:05 -04:00
Tom Rothamel 925b53db58 Restore the behavior of xfill on vboxes and yfill on hboxes. 2011-06-19 08:35:37 -04:00
Tom Rothamel 99c1268051 Merge in fixes for gltexture. 2011-06-18 22:48:13 -04:00
Tom Rothamel 6be247e07d Make texwrap ignore RUBY_TOP glyphs. 2011-06-18 09:50:26 -04:00
Tom Rothamel dfa423b62d More performance and correctness fixes. 2011-06-16 22:58:28 -04:00
Tom Rothamel 49b95e1a8a Fix bugs in texture performance, including an ~5ms performance loss on texture loading. 2011-06-16 21:53:11 -04:00
Tom Rothamel 03eedca87c Much faster texwrap. (But is it fast enough for asian text?) 2011-06-16 16:04:59 -04:00
Tom Rothamel 4602f8b43a More optimizations. 2011-06-16 08:52:35 -04:00
Tom Rothamel 9b77f044ab Speed up the tex layout algorithm. (But it's still slow.) 2011-06-16 01:36:47 -04:00
Tom Rothamel 7200908ea9 newtext: tex wrapping algorith,. 2011-06-15 23:52:21 -04:00
Tom Rothamel b87827f53b newtext: Use unicode line breaking algorithm. 2011-06-15 12:57:14 -04:00
Tom Rothamel 173370b905 Generate linebreak data. 2011-06-15 09:51:31 -04:00
Tom Rothamel 628703aab3 newtext: Add asian annotation support. 2011-06-14 23:30:50 -04:00
Tom Rothamel 6bd014b9a6 Implement _start, cps text tags. 2011-06-13 10:14:11 -04:00
Tom Rothamel 7feff9e690 Add more test cases; fix code so they pass. 2011-06-12 22:16:33 -04:00
Tom Rothamel af300d118a newtext: Fix antialiasing and justification. 2011-06-11 23:54:22 -04:00
Tom Rothamel 25e74c5f79 Test case for newtext properties. 2011-06-11 15:24:14 -04:00
Tom Rothamel c63d860d1f Add support for alignment and justification. 2011-06-11 12:17:23 -04:00
Tom Rothamel 32db1082c0 newtext: Implement ruby, leading, and spacing. 2011-06-11 00:44:43 -04:00
Tom Rothamel 06193b4285 newtext: Less updates. 2011-06-10 20:26:00 -04:00
Tom Rothamel 1192c546a1 newtext: Add displayable support.
newtext: Add layout_cache.
2011-06-10 07:28:21 -04:00
Tom Rothamel ec3881d5c4 newtext: Add {space} and {vspace} tags. 2011-06-09 00:44:08 -04:00
Tom Rothamel 473ae87547 newtext: Add hyperlinks, underline, and strikethrough. 2011-06-08 15:58:01 -04:00
Tom Rothamel 6112741a6b newtext: Drawing/updating hyperlinks. 2011-06-08 11:24:50 -04:00
Tom Rothamel b68e23551a newtext: Figure out hyperlink areas. 2011-06-08 00:22:02 -04:00
Tom Rothamel 817bc804a6 newtext: separate initial and later layout steps.
newtext: fix multiple fonts from face.
2011-06-07 23:55:04 -04:00
Tom Rothamel 93976e043f Add support for bold. 2011-06-07 11:34:52 -04:00
Tom Rothamel 07b48bd353 newtext: Implement italics. 2011-06-07 01:19:55 -04:00
Tom Rothamel 6923507e74 newtext: get outlines working. 2011-06-06 15:30:27 -04:00
Tom Rothamel 5e1a260546 newtext: Compute the time the next character should be shown. 2011-06-06 13:10:50 -04:00
Tom Rothamel 63e2cc802c newtext: some fixes, calling it a night. 2011-06-06 01:13:10 -04:00
Tom Rothamel c4bdd4a800 newtext: First go at typing out text. 2011-06-05 23:55:16 -04:00
Tom Rothamel 0fdca7c146 newtext: cache font glyphs. 2011-06-01 14:00:39 -04:00
Tom Rothamel 0d35f3709b newtext: Fix line breaking, display text on screen, add profiling code. 2011-06-01 13:59:39 -04:00
Tom Rothamel b1e366a31f newtext: Working with outlines, and other bug fixes. 2011-06-01 00:43:14 -04:00
Tom Rothamel 922e5c0fbb newtext: Make ftfont use the over operation. 2011-05-31 01:37:27 -04:00
Tom Rothamel 11bc000a85 newtext: checkpoint @ writing text to a file. 2011-05-30 12:33:13 -04:00
Tom Rothamel 8ab9bb0e01 newtext: western-style character annotation and line-breaking. 2011-05-29 16:49:58 -04:00
Tom Rothamel ea83307012 Create the lists of glyphs. 2011-05-28 11:14:32 -04:00
Tom Rothamel df35b3f955 newtext: working tokenizer and segmenter. 2011-05-28 00:24:43 -04:00
Tom Rothamel b9b460e549 Rearrange code in preparation for newtext. 2011-05-28 00:22:52 -04:00
Tom Rothamel 91f78bee55 ftfont: rendering text to a surface. 2011-05-22 14:34:44 -04:00
Tom Rothamel a0833f0dd7 ftfont: Set unicode encoding. 2011-05-22 00:26:48 -04:00
Tom Rothamel b9a2c8d50c ftfont: init library
ftfont: open a face from a python file-like object.
2011-05-21 22:04:24 -04:00
Tom Rothamel dafd79d55b Merge fix for GLES devices. 2011-05-16 22:57:25 -04:00
Tom Rothamel 18808fffec Fix problems on GLES devices with only two textures, or that don't
have texture crossbar support.
2011-05-16 21:23:02 -04:00
Tom Rothamel 29ea80260f Don't error out if we has_screen an empty screen. 2011-05-15 16:28:16 -04:00
Tom Rothamel a61dd71833 Don't error out if we has_screen an empty screen. 2011-05-11 14:29:44 -04:00
Tom Rothamel e1b740eeff Allow shift+R when errorhandling. 2011-05-04 21:56:31 -04:00
Tom Rothamel c99e94e24d Properly initialize and deinitialize the environ and rtt objects. 2011-05-04 18:46:21 -04:00
Tom Rothamel 7141ae8478 Properly initialize and deinitialize the environ and rtt objects,
preventing a bug that caused a white screen to show up.
2011-05-04 17:36:18 -04:00
Tom Rothamel b10df22048 Init the GL environment in set_mode, so we can detect if we can't load shaders. 2011-05-03 13:07:15 -04:00
Tom Rothamel 986a5822bc Bump versions for 6.12.2. 2011-05-02 21:14:38 -04:00
Tom Rothamel 5f0057d3f8 Use the back buffer for screenshots. (Fixes a bug on Intel GPUs - hopefully.) 2011-05-01 12:06:58 -04:00
Tom Rothamel 8b64077881 Wave dead chickens over all-black screenshots. 2011-04-30 18:15:04 -04:00
Tom Rothamel 61c7e90f86 Clarify auto-population of config.archives. 2011-04-30 12:17:00 -04:00
Tom Rothamel 9ec2752883 By default, archives are searched in reverse asciiabetical order. 2011-04-29 00:06:37 -04:00
Tom Rothamel 192fe79839 Make viewport contents visible in style inspector. 2011-04-28 21:19:02 -04:00
Tom Rothamel 51e548d481 Properly display exceptions in init code. 2011-04-26 18:53:31 -04:00
Tom Rothamel 045077e983 Update doc version automatically. 2011-04-24 19:31:27 -04:00
Tom Rothamel 334195cc8f Implement config.say_attribute_transition. 2011-04-24 18:58:05 -04:00
Tom Rothamel 1d5696e10d Fix problems with invoking old-school yes/no prompts. 2011-04-24 18:27:27 -04:00
Tom Rothamel d4139d026a Clean out the say attributes at the end of an interaction. 2011-04-24 18:17:28 -04:00
Tom Rothamel 13520a7e23 Clear the screen on errors, to prevent erroneous displayables from
causing problems.
2011-04-24 16:57:59 -04:00
Tom Rothamel 49890f230a Reset image attributes on a failed say prediction. 2011-04-24 16:48:03 -04:00
Tom Rothamel 0bb8c545f0 Update changelog. 2011-04-24 09:53:07 -04:00
Tom Rothamel f7d799ea78 Remove legacy error handling. 2011-04-24 01:21:34 -04:00
Tom Rothamel c7cadc4097 Display parse errors in Ren'Py. 2011-04-24 01:16:34 -04:00
Tom Rothamel 583b4d79af Stop distributing CHANGELOG.txt, which is obsolete. 2011-04-23 17:52:43 -04:00
Tom Rothamel d58bea4f19 Document changes to say statement. 2011-04-23 17:51:39 -04:00
Tom Rothamel bacab075d8 Document android. 2011-04-23 17:29:46 -04:00
Tom Rothamel 46b4ca65eb Document transforms and transitions in python. 2011-04-23 17:03:33 -04:00
Tom Rothamel 783fdc120a Document transitions. 2011-04-23 12:52:29 -04:00
Tom Rothamel 4cce7d9523 Document transitions. 2011-04-23 00:31:25 -04:00
Tom Rothamel 065a1736f6 Document with statement. 2011-04-22 01:06:48 -04:00
Tom Rothamel 8f5119bb10 Be conservative on get_filename_line. 2011-04-22 00:18:30 -04:00
Tom Rothamel f5a9eb90ac glReadBuffer isn't in OpenGL ES. 2011-04-18 22:21:12 -04:00
Tom Rothamel 24f553dfec Take screenshots from the front buffer, since it's what the user is
seeing. Fixes a bug where screenshots could turn up black.
2011-04-18 22:14:29 -04:00
Tom Rothamel 47be57973e Fix bug with upgrading save games containing image references. 2011-04-18 20:58:34 -04:00
Tom Rothamel 23240e634a Documentation work. 2011-04-18 20:57:50 -04:00
Tom Rothamel c13438cee9 Add displaying images page to documentation. 2011-04-18 00:38:41 -04:00
Tom Rothamel 3e3cd634a0 Ren'Py no longer attempts to adjust the system level mixer controls, which
means that it's no longer possible to raise the volume from within Ren'Py.
Controlling the system volume exhibited bugs on all three platforms, including
hard-to-predict volume changes that affect other applications.
2011-04-17 15:06:42 -04:00
Tom Rothamel 72c5974efe Credit for bug. 2011-04-17 00:20:42 -04:00
Tom Rothamel 5832498bfe Do not merge TIMEEVENT with other events. (It rarely happens, and
it can lead to problems if the other event is ignored.)
2011-04-16 23:53:51 -04:00
Tom Rothamel 965418255d Make timers participate in rollback. Opens the gates for other displayables
to have rollback state, as well.
2011-04-16 23:47:36 -04:00
Tom Rothamel 317f981657 Fix bug with automatic images. 2011-04-16 17:53:57 -04:00
Tom Rothamel 8706c55260 Use the transform size property as the initial size of a render (fixes a
regression).
2011-04-16 17:43:14 -04:00
Tom Rothamel d29326065e Eliminate spurious PyDev warnings. 2011-04-16 17:38:44 -04:00
Tom Rothamel e5cdb1346d Future-proof ast.py. 2011-04-16 16:38:10 -04:00
Tom Rothamel 9b2ff06341 Add FullRestartException to the list of control exceptions. 2011-04-16 15:38:48 -04:00
Tom Rothamel 725382a378 Implement screen variants. Suppress more warnings. 2011-04-14 23:13:54 -04:00
Tom Rothamel 61c4cac28e Update Ren'Py to work w/ Honeycomb and tablets. 2011-04-14 21:31:22 -04:00
Tom Rothamel 05a0273995 Pre-release. 2011-04-08 22:40:11 -04:00
Tom Rothamel 5c30ed7ebe Minor changes for pre-release. 2011-04-08 22:31:21 -04:00
Tom Rothamel 32f7790b1f Update the changelog. 2011-04-07 21:54:15 -04:00
Tom Rothamel 0926618ed0 Allow Preference("display", 2.0) to set the screen size. 2011-04-07 21:44:06 -04:00
Tom Rothamel e4b8b3e726 Persist window size. 2011-04-07 12:20:07 -04:00
Tom Rothamel 0615b8432e Add tooltips.
Fix docs.
2011-04-05 23:10:20 -04:00
Tom Rothamel 88ad3fc1dd Censor tracebacks a bit better. 2011-04-05 22:13:22 -04:00
Tom Rothamel 4187cdafd4 Quote filenames in the image location picker. 2011-04-05 21:47:06 -04:00
Tom Rothamel 62d4323c95 Update style inspector. 2011-04-05 00:32:55 -04:00
Tom Rothamel 57f1fb6505 Make the renderer selection use the amie style. 2011-04-04 22:16:52 -04:00
Tom Rothamel c953a71e36 Added support for debugging text overflows. 2011-04-04 00:15:51 -04:00
Tom Rothamel db7075753d Improve logging. 2011-04-03 12:06:49 -04:00
Tom Rothamel f9709a429e Redo logging. 2011-04-03 11:32:39 -04:00
Tom Rothamel 3bc64e4af3 Ignore eclipse files. 2011-04-02 23:38:15 -04:00
Tom Rothamel 49cf9af762 Fix potential uninitialized variable bug. 2011-04-02 16:13:15 -04:00
Tom Rothamel ed14a0576a Fix bug in renpy.showing. 2011-04-02 10:55:44 -04:00
Tom Rothamel ec3a4ddb5a Debounce the VIDEORESIZE event - fixes duplicate mouse problem when
maximized on Linux.
2011-04-01 22:26:20 -04:00
Tom Rothamel 097479d0b0 Actions now can have an :method:Action.unhovered method. This method is
called when an action supplied as a `hovered` parameter loses focus.

Error handling now uses tooltips.
2011-03-31 11:54:33 -04:00
Tom Rothamel a995e3f542 Allow the user to ignore exceptions. 2011-03-31 00:56:38 -04:00
Tom Rothamel a0cfb8779d Change the AST nodes to call the new next_node function as early as
possible, so error recovery becomes plausible.
2011-03-31 00:25:29 -04:00
Tom Rothamel 3b137c3e54 Error handling at init time.
game.init_phase has been replaced with renpy.context().init_phase.
2011-03-30 21:46:05 -04:00
Tom Rothamel 50cc54840f Tweak look / spelling. 2011-03-30 00:42:03 -04:00
Tom Rothamel d9799ac5bb Good-looking error handling. 2011-03-29 23:55:02 -04:00
Tom Rothamel 64bf3f1b9c Add the box_wrap style property.
Fix many (bogus) errors reported by Eclipse, and a few minor real ones.
2011-03-29 00:07:09 -04:00
Tom Rothamel b791945564 Ren'Py now attempts to elide personal information from filenames. Where
possible, filenames are reported relative to the base or Ren'Py base
directories,  rather than the root of the filesystem.
2011-03-28 00:59:11 -04:00
Tom Rothamel a8cc7abfff Normalize error reporting.
Congratulations Deb and Mike!
2011-03-26 10:20:11 -04:00
Tom Rothamel fa15618437 Added the :func:SetScreenVariable and :func:ToggleScreenVariable actions.
These allow screen-local variables to be changed.
2011-03-26 09:40:36 -04:00
Tom Rothamel 844f7ac4d2 Indentation errors are now reported on the indented line, and not the line
preceding the erroneous indentation.
2011-03-26 00:21:50 -04:00
Tom Rothamel a43426bf64 Move the hyperlink functions into a style property. 2011-03-26 00:06:44 -04:00
Tom Rothamel 7015216392 merged 2011-03-25 16:00:16 -04:00
Tom Rothamel 5cc0dbbf08 Factor error handling out into its own file, which is loaded before anything else. 2011-03-25 11:03:25 -04:00
Tom Rothamel 98acd5b0f3 Insert basic exception interception. 2011-03-25 09:41:05 -04:00
Tom Rothamel 14f24424ea Restore merges. 2011-03-31 18:47:17 -04:00
Tom Rothamel 9483a7daa5 Back out changes. Release 6.12.0f. 2011-03-31 18:46:01 -04:00
Tom Rothamel 89d93544a7 Fix bug in new prediction. 2011-03-31 17:52:10 -04:00
Tom Rothamel af3a579122 merged 2011-03-24 22:32:39 -04:00
Tom Rothamel ae769272a6 merge changes 2011-03-24 22:31:55 -04:00
Tom Rothamel 5f08daa85a Fix problems w/ newer cython caused by no-longer-necessary forward
declaration.
2011-03-24 22:27:26 -04:00
Tom Rothamel 8fdec02557 Add the new internal (amie2) style. 2011-03-22 00:59:30 -04:00
Tom Rothamel f8cef3d339 Add the new internal (amie2) style. 2011-03-22 00:59:30 -04:00
Tom Rothamel d891dd290c Merge smartshow branch. 2011-03-21 00:11:56 -04:00
Tom Rothamel 0b366f6850 Document side_image. 2011-03-21 00:07:28 -04:00
Tom Rothamel 899bf47d34 Fix lint to work with screens. 2011-03-20 23:52:59 -04:00
Tom Rothamel 888c485186 Implement the new side image code. 2011-03-20 20:31:37 -04:00
Tom Rothamel dbbabbb2dc More eclipse annotations. 2011-03-20 14:17:39 -04:00
Tom Rothamel 7a38331f8c Fix/Annotate errors and warnings produced by PyDev. 2011-03-20 12:25:56 -04:00
Tom Rothamel 0dbcb352c9 Implement say with image attributes. 2011-03-19 21:29:38 -04:00
Tom Rothamel 1ab0b43202 Refactor images; Add image attributes. 2011-03-15 00:48:14 -04:00
Tom Rothamel 106d95e795 Implement keep_running_transform. 2011-03-06 15:18:55 -05:00
Tom Rothamel cf9005e457 Early work on keep_running_transform. 2011-03-05 11:32:57 -05:00
Tom Rothamel be7fd4fa13 Refactor image-like code out of image.py. 2011-03-01 23:23:00 -05:00
Tom Rothamel b0f848b089 Add xcenter and ycenter style and transform properties. 2011-02-23 23:42:33 -05:00
Tom Rothamel 07077e89b1 Add renpy.vibrate. 2011-02-21 23:26:14 -05:00
Tom Rothamel bc2a0451db Finish bumps to 6.12.1. 2011-02-15 22:19:46 -05:00
Tom Rothamel 4e38257900 Distribute bumps the vc_version file, which is read by __init__.py to
compute the advertised version.
2011-02-15 22:13:58 -05:00
Tom Rothamel f934838a59 Tree cleanup. 2011-02-15 21:43:19 -05:00
Tom Rothamel ee0fb68d60 Licenxe fixes. Better behavior for Frames with overly-big corners. 2011-02-08 20:32:39 -05:00
320 changed files with 44293 additions and 8234 deletions
+20 -27
View File
@@ -18,7 +18,7 @@ doc/reference
doc/shared.css
doc/tutorials
doc/www.renpy.org
testing
testing*
translations.rpy
launchertrans.rpy
jcc
@@ -64,37 +64,30 @@ msvcr90.dll
python26.dll
renpy.exe
lib/windows-x86
sphinx/source/inc/*
doc/*
updates/prerelease
module/render.c
module/_renpy.c
module/_renpy_pysdlgl.c
module/_renpybidi.c
module/sound.c
module/winmixer.c
module/accelerator.html
module/gldraw.html
module/glenviron_fixed.html
module/glenviron.html
module/glenviron_limited.html
module/glenviron_shader.html
module/glrtt_copy.html
module/glshader.html
module/gltexture.html
module/render.html
module/accelerator.c
module/gldraw.c
module/glenviron.c
module/glenviron_fixed.c
module/glenviron_limited.c
module/glenviron_shader.c
module/glrtt_copy.c
module/glshader.c
module/gltexture.c
module/gen
log.txt
lib/linux-x86
lib/python
lib/update-version.txt
sphinx/game/saves
tutorial/game/saves
doc
unparse.py
module/glrtt_fbo.c
module/glrtt_fbo.html
tutorial/game/cache
renpy.exe.log
renpy/vc_version.py
.pydevproject
.project
.settings
LICENSE.txt
template/README.html
the_question/README.html
tutorial/README.html
trace.txt
renpy/angle/*.pyx
renpy/angle/*.pxd
renpy-ppc.zip
-803
View File
@@ -1,803 +0,0 @@
=======
License
=======
Most of Ren'Py is covered by the terms of the following (MIT) license:
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.
Portions of Ren'Py are derived from code that is copyright using the
Lesser GNU Public License, so Ren'Py games must be distributed in a
manner that satisfies the LGPL.
Please see each individual source file for a list of copyright
holders. The artwork in the demo is released by various copyright
holders, under the same terms.
Ren'Py binaries include code from the following projects:
* Python (Python License)
* Pygame (LGPL)
* SDL (LGPL)
* SDL_image (LGPL)
* SDL_ttf (LGPL)
* SDL_mixer (LGPL)
* Freetype (LGPL)
* FFmpeg (LGPL)
* Fribidi (LGPL)
* jpeg (JPEG License)
* libpng (PNG license)
* zlib (Zlib License)
* bzip2 (Bzip2 License)
* pyobjc (MIT License)
* py2exe (MIT License)
* GLEW (Modified BSD, MIT)
* tegl (Modified BSD)
For the purpose of LGPL compliance, the source code to all LGPL
software we depend on is either in the Ren'Py package (available from
http://www.renpy.org/), or in the renpy-deps package
(http://www.renpy.org/dl/lgpl/). We believe compliance can be achieved
by including a copy of this license with every copy of Ren'Py you
distribute, and referring to it in your project's README file.
The default Ren'Py build distributes Ren'Py alongside jEdit, which is
licensed under the GNU GPL. The source code to jEdit is distributed as
part of the renpy-deps package (http://www.renpy.org/dl/lgpl/).
GNU Lesser General Public License
=================================
::
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is free for all its users.
This license, the Lesser General Public License, applies to some
specially designated software packages--typically libraries--of the
Free Software Foundation and other authors who decide to use it. You
can use it too, but we suggest you first think carefully about whether
this license or the ordinary General Public License is the better
strategy to use in any particular case, based on the explanations
below.
When we speak of free software, we are referring to freedom of use,
not price. Our General Public Licenses are designed to make sure that
you have the freedom to distribute copies of free software (and charge
for this service if you wish); that you receive source code or can get
it if you want it; that you can change the software and use pieces of
it in new free programs; and that you are informed that you can do
these things.
To protect your rights, we need to make restrictions that forbid
distributors to deny you these rights or to ask you to surrender these
rights. These restrictions translate to certain responsibilities for
you if you distribute copies of the library or if you modify it.
For example, if you distribute copies of the library, whether gratis
or for a fee, you must give the recipients all the rights that we gave
you. You must make sure that they, too, receive or can get the source
code. If you link other code with the library, you must provide
complete object files to the recipients, so that they can relink them
with the library after making changes to the library and recompiling
it. And you must show them these terms so they know their rights.
We protect your rights with a two-step method: (1) we copyright the
library, and (2) we offer you this license, which gives you legal
permission to copy, distribute and/or modify the library.
To protect each distributor, we want to make it very clear that
there is no warranty for the free library. Also, if the library is
modified by someone else and passed on, the recipients should know
that what they have is not the original version, so that the original
author's reputation will not be affected by problems that might be
introduced by others.
Finally, software patents pose a constant threat to the existence of
any free program. We wish to make sure that a company cannot
effectively restrict the users of a free program by obtaining a
restrictive license from a patent holder. Therefore, we insist that
any patent license obtained for a version of the library must be
consistent with the full freedom of use specified in this license.
Most GNU software, including some libraries, is covered by the
ordinary GNU General Public License. This license, the GNU Lesser
General Public License, applies to certain designated libraries, and
is quite different from the ordinary General Public License. We use
this license for certain libraries in order to permit linking those
libraries into non-free programs.
When a program is linked with a library, whether statically or using
a shared library, the combination of the two is legally speaking a
combined work, a derivative of the original library. The ordinary
General Public License therefore permits such linking only if the
entire combination fits its criteria of freedom. The Lesser General
Public License permits more lax criteria for linking other code with
the library.
We call this license the "Lesser" General Public License because it
does Less to protect the user's freedom than the ordinary General
Public License. It also provides other free software developers Less
of an advantage over competing non-free programs. These disadvantages
are the reason we use the ordinary General Public License for many
libraries. However, the Lesser license provides advantages in certain
special circumstances.
For example, on rare occasions, there may be a special need to
encourage the widest possible use of a certain library, so that it
becomes a de-facto standard. To achieve this, non-free programs must
be allowed to use the library. A more frequent case is that a free
library does the same job as widely used non-free libraries. In this
case, there is little to gain by limiting the free library to free
software only, so we use the Lesser General Public License.
In other cases, permission to use a particular library in non-free
programs enables a greater number of people to use a large body of
free software. For example, permission to use the GNU C Library in
non-free programs enables many more people to use the whole GNU
operating system, as well as its variant, the GNU/Linux operating
system.
Although the Lesser General Public License is Less protective of the
users' freedom, it does ensure that the user of a program that is
linked with the Library has the freedom and the wherewithal to run
that program using a modified version of the Library.
The precise terms and conditions for copying, distribution and
modification follow. Pay close attention to the difference between a
"work based on the library" and a "work that uses the library". The
former contains code derived from the library, whereas the latter must
be combined with the library in order to run.
GNU LESSER GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License Agreement applies to any software library or other
program which contains a notice placed by the copyright holder or
other authorized party saying it may be distributed under the terms of
this Lesser General Public License (also called "this License").
Each licensee is addressed as "you".
A "library" means a collection of software functions and/or data
prepared so as to be conveniently linked with application programs
(which use some of those functions and data) to form executables.
The "Library", below, refers to any such software library or work
which has been distributed under these terms. A "work based on the
Library" means either the Library or any derivative work under
copyright law: that is to say, a work containing the Library or a
portion of it, either verbatim or with modifications and/or translated
straightforwardly into another language. (Hereinafter, translation is
included without limitation in the term "modification".)
"Source code" for a work means the preferred form of the work for
making modifications to it. For a library, complete source code means
all the source code for all modules it contains, plus any associated
interface definition files, plus the scripts used to control
compilation and installation of the library.
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running a program using the Library is not restricted, and output from
such a program is covered only if its contents constitute a work based
on the Library (independent of the use of the Library in a tool for
writing it). Whether that is true depends on what the Library does
and what the program that uses the Library does.
1. You may copy and distribute verbatim copies of the Library's
complete source code as you receive it, in any medium, provided that
you conspicuously and appropriately publish on each copy an
appropriate copyright notice and disclaimer of warranty; keep intact
all the notices that refer to this License and to the absence of any
warranty; and distribute a copy of this License along with the
Library.
You may charge a fee for the physical act of transferring a copy,
and you may at your option offer warranty protection in exchange for a
fee.
2. You may modify your copy or copies of the Library or any portion
of it, thus forming a work based on the Library, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) The modified work must itself be a software library.
b) You must cause the files modified to carry prominent notices
stating that you changed the files and the date of any change.
c) You must cause the whole of the work to be licensed at no
charge to all third parties under the terms of this License.
d) If a facility in the modified Library refers to a function or a
table of data to be supplied by an application program that uses
the facility, other than as an argument passed when the facility
is invoked, then you must make a good faith effort to ensure that,
in the event an application does not supply such function or
table, the facility still operates, and performs whatever part of
its purpose remains meaningful.
(For example, a function in a library to compute square roots has
a purpose that is entirely well-defined independent of the
application. Therefore, Subsection 2d requires that any
application-supplied function or table used by this function must
be optional: if the application does not supply it, the square
root function must still compute square roots.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Library,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Library, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote
it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Library.
In addition, mere aggregation of another work not based on the Library
with the Library (or with a work based on the Library) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may opt to apply the terms of the ordinary GNU General Public
License instead of this License to a given copy of the Library. To do
this, you must alter all the notices that refer to this License, so
that they refer to the ordinary GNU General Public License, version 2,
instead of to this License. (If a newer version than version 2 of the
ordinary GNU General Public License has appeared, then you can specify
that version instead if you wish.) Do not make any other change in
these notices.
Once this change is made in a given copy, it is irreversible for
that copy, so the ordinary GNU General Public License applies to all
subsequent copies and derivative works made from that copy.
This option is useful when you wish to copy part of the code of
the Library into a program that is not a library.
4. You may copy and distribute the Library (or a portion or
derivative of it, under Section 2) in object code or executable form
under the terms of Sections 1 and 2 above provided that you accompany
it with the complete corresponding machine-readable source code, which
must be distributed under the terms of Sections 1 and 2 above on a
medium customarily used for software interchange.
If distribution of object code is made by offering access to copy
from a designated place, then offering equivalent access to copy the
source code from the same place satisfies the requirement to
distribute the source code, even though third parties are not
compelled to copy the source along with the object code.
5. A program that contains no derivative of any portion of the
Library, but is designed to work with the Library by being compiled or
linked with it, is called a "work that uses the Library". Such a
work, in isolation, is not a derivative work of the Library, and
therefore falls outside the scope of this License.
However, linking a "work that uses the Library" with the Library
creates an executable that is a derivative of the Library (because it
contains portions of the Library), rather than a "work that uses the
library". The executable is therefore covered by this License.
Section 6 states terms for distribution of such executables.
When a "work that uses the Library" uses material from a header file
that is part of the Library, the object code for the work may be a
derivative work of the Library even though the source code is not.
Whether this is true is especially significant if the work can be
linked without the Library, or if the work is itself a library. The
threshold for this to be true is not precisely defined by law.
If such an object file uses only numerical parameters, data
structure layouts and accessors, and small macros and small inline
functions (ten lines or less in length), then the use of the object
file is unrestricted, regardless of whether it is legally a derivative
work. (Executables containing this object code plus portions of the
Library will still fall under Section 6.)
Otherwise, if the work is a derivative of the Library, you may
distribute the object code for the work under the terms of Section 6.
Any executables containing that work also fall under Section 6,
whether or not they are linked directly with the Library itself.
6. As an exception to the Sections above, you may also combine or
link a "work that uses the Library" with the Library to produce a
work containing portions of the Library, and distribute that work
under terms of your choice, provided that the terms permit
modification of the work for the customer's own use and reverse
engineering for debugging such modifications.
You must give prominent notice with each copy of the work that the
Library is used in it and that the Library and its use are covered by
this License. You must supply a copy of this License. If the work
during execution displays copyright notices, you must include the
copyright notice for the Library among them, as well as a reference
directing the user to the copy of this License. Also, you must do one
of these things:
a) Accompany the work with the complete corresponding
machine-readable source code for the Library including whatever
changes were used in the work (which must be distributed under
Sections 1 and 2 above); and, if the work is an executable linked
with the Library, with the complete machine-readable "work that
uses the Library", as object code and/or source code, so that the
user can modify the Library and then relink to produce a modified
executable containing the modified Library. (It is understood
that the user who changes the contents of definitions files in the
Library will not necessarily be able to recompile the application
to use the modified definitions.)
b) Use a suitable shared library mechanism for linking with the
Library. A suitable mechanism is one that (1) uses at run time a
copy of the library already present on the user's computer system,
rather than copying library functions into the executable, and (2)
will operate properly with a modified version of the library, if
the user installs one, as long as the modified version is
interface-compatible with the version that the work was made with.
c) Accompany the work with a written offer, valid for at least
three years, to give the same user the materials specified in
Subsection 6a, above, for a charge no more than the cost of
performing this distribution.
d) If distribution of the work is made by offering access to copy
from a designated place, offer equivalent access to copy the above
specified materials from the same place.
e) Verify that the user has already received a copy of these
materials or that you have already sent this user a copy.
For an executable, the required form of the "work that uses the
Library" must include any data and utility programs needed for
reproducing the executable from it. However, as a special exception,
the materials to be distributed need not include anything that is
normally distributed (in either source or binary form) with the major
components (compiler, kernel, and so on) of the operating system on
which the executable runs, unless that component itself accompanies
the executable.
It may happen that this requirement contradicts the license
restrictions of other proprietary libraries that do not normally
accompany the operating system. Such a contradiction means you cannot
use both them and the Library together in an executable that you
distribute.
7. You may place library facilities that are a work based on the
Library side-by-side in a single library together with other library
facilities not covered by this License, and distribute such a combined
library, provided that the separate distribution of the work based on
the Library and of the other library facilities is otherwise
permitted, and provided that you do these two things:
a) Accompany the combined library with a copy of the same work
based on the Library, uncombined with any other library
facilities. This must be distributed under the terms of the
Sections above.
b) Give prominent notice with the combined library of the fact
that part of it is a work based on the Library, and explaining
where to find the accompanying uncombined form of the same work.
8. You may not copy, modify, sublicense, link with, or distribute
the Library except as expressly provided under this License. Any
attempt otherwise to copy, modify, sublicense, link with, or
distribute the Library is void, and will automatically terminate your
rights under this License. However, parties who have received copies,
or rights, from you under this License will not have their licenses
terminated so long as such parties remain in full compliance.
9. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Library or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Library (or any work based on the
Library), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Library or works based on it.
10. Each time you redistribute the Library (or any work based on the
Library), the recipient automatically receives a license from the
original licensor to copy, distribute, link with or modify the Library
subject to these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties with
this License.
11. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Library at all. For example, if a patent
license would not permit royalty-free redistribution of the Library by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Library.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply, and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
12. If the distribution and/or use of the Library is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Library under this License
may add an explicit geographical distribution limitation excluding those
countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
13. The Free Software Foundation may publish revised and/or new
versions of the Lesser General Public License from time to time.
Such new versions will be similar in spirit to the present version,
but may differ in detail to address new problems or concerns.
Each version is given a distinguishing version number. If the Library
specifies a version number of this License which applies to it and
"any later version", you have the option of following the terms and
conditions either of that version or of any later version published by
the Free Software Foundation. If the Library does not specify a
license version number, you may choose any version ever published by
the Free Software Foundation.
14. If you wish to incorporate parts of the Library into other free
programs whose distribution conditions are incompatible with these,
write to the author to ask for permission. For software which is
copyrighted by the Free Software Foundation, write to the Free
Software Foundation; we sometimes make exceptions for this. Our
decision will be guided by the two goals of preserving the free status
of all derivatives of our free software and of promoting the sharing
and reuse of software generally.
NO WARRANTY
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Libraries
If you develop a new library, and you want it to be of the greatest
possible use to the public, we recommend making it free software that
everyone can redistribute and change. You can do so by permitting
redistribution under these terms (or, alternatively, under the terms
of the ordinary General Public License).
To apply these terms, attach the following notices to the library.
It is safest to attach them to the start of each source file to most
effectively convey the exclusion of warranty; and each file should
have at least the "copyright" line and a pointer to where the full
notice is found.
<one line to give the library's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
You should also get your employer (if you work as a programmer) or
your school, if any, to sign a "copyright disclaimer" for the library,
if necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the
library `Frob' (a library for tweaking knobs) written by James
Random Hacker.
<signature of Ty Coon>, 1 April 1990
Ty Coon, President of Vice
That's all there is to it!
Python License
==============
::
1. This LICENSE AGREEMENT is between the Python Software Foundation
("PSF"), and the Individual or Organization ("Licensee") accessing and
otherwise using Python 2.3 software in source or binary form and its
associated documentation.
2. Subject to the terms and conditions of this License Agreement, PSF
hereby grants Licensee a nonexclusive, royalty-free, world-wide
license to reproduce, analyze, test, perform and/or display publicly,
prepare derivative works, distribute, and otherwise use Python 2.3
alone or in any derivative version, provided, however, that PSF's
License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
2001, 2002 Python Software Foundation; All Rights Reserved" are
retained in Python 2.3 alone or in any derivative version prepared by
Licensee.
3. In the event Licensee prepares a derivative work that is based on
or incorporates Python 2.3 or any part thereof, and wants to make
the derivative work available to others as provided herein, then
Licensee hereby agrees to include in any such work a brief summary of
the changes made to Python 2.3.
4. PSF is making Python 2.3 available to Licensee on an "AS IS"
basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.3 WILL NOT
INFRINGE ANY THIRD PARTY RIGHTS.
5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
2.3 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.3,
OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
6. This License Agreement will automatically terminate upon a material
breach of its terms and conditions.
7. Nothing in this License Agreement shall be deemed to create any
relationship of agency, partnership, or joint venture between PSF and
Licensee. This License Agreement does not grant permission to use PSF
trademarks or trade name in a trademark sense to endorse or promote
products or services of Licensee, or any third party.
8. By copying, installing or otherwise using Python 2.3, Licensee
agrees to be bound by the terms and conditions of this License
Agreement.
Jpeg License
============
::
In plain English:
1. We don't promise that this software works. (But if you find any bugs,
please let us know!)
2. You can use this software for whatever you want. You don't have to pay us.
3. You may not pretend that you wrote this software. If you use it in a
program, you must acknowledge somewhere in your documentation that
you've used the IJG code.
In legalese:
The authors make NO WARRANTY or representation, either express or implied,
with respect to this software, its quality, accuracy, merchantability, or
fitness for a particular purpose. This software is provided "AS IS", and you,
its user, assume the entire risk as to its quality and accuracy.
This software is copyright (C) 1991-1998, Thomas G. Lane.
All Rights Reserved except as specified below.
Permission is hereby granted to use, copy, modify, and distribute this
software (or portions thereof) for any purpose, without fee, subject to these
conditions:
(1) If any part of the source code for this software is distributed, then this
README file must be included, with this copyright and no-warranty notice
unaltered; and any additions, deletions, or changes to the original files
must be clearly indicated in accompanying documentation.
(2) If only executable code is distributed, then the accompanying
documentation must state that "this software is based in part on the work of
the Independent JPEG Group".
(3) Permission for use of this software is granted only if the user accepts
full responsibility for any undesirable consequences; the authors accept
NO LIABILITY for damages of any kind.
These conditions apply to any software derived from or based on the IJG code,
not just to the unmodified library. If you use our work, you ought to
acknowledge us.
Permission is NOT granted for the use of any IJG author's name or company name
in advertising or publicity relating to this software or products derived from
it. This software may be referred to only as "the Independent JPEG Group's
software".
We specifically permit and encourage the use of this software as the basis of
commercial products, provided that all warranty or liability claims are
assumed by the product vendor.
PNG License
===========
::
The PNG Reference Library is supplied "AS IS". The Contributing Authors
and Group 42, Inc. disclaim all warranties, expressed or implied,
including, without limitation, the warranties of merchantability and of
fitness for any purpose. The Contributing Authors and Group 42, Inc.
assume no liability for direct, indirect, incidental, special, exemplary,
or consequential damages, which may result from the use of the PNG
Reference Library, even if advised of the possibility of such damage.
Permission is hereby granted to use, copy, modify, and distribute this
source code, or portions hereof, for any purpose, without fee, subject
to the following restrictions:
1. The origin of this source code must not be misrepresented.
2. Altered versions must be plainly marked as such and must not
be misrepresented as being the original source.
3. This Copyright notice may not be removed or altered from any
source or altered source distribution.
The Contributing Authors and Group 42, Inc. specifically permit, without
fee, and encourage the use of this source code as a component to
supporting the PNG file format in commercial products. If you use this
source code in a product, acknowledgment is not required but would be
appreciated.
Zlib License
============
::
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
Bzip2 License
=============
::
This program, "bzip2", the associated library "libbzip2", and all
documentation, are copyright (C) 1996-2005 Julian R Seward. All
rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. The origin of this software must not be misrepresented; you must
not claim that you wrote the original software. If you use this
software in a product, an acknowledgment in the product
documentation would be appreciated but is not required.
3. Altered source versions must be plainly marked as such, and must
not be misrepresented as being the original software.
4. The name of the author may not be used to endorse or promote
products derived from this software without specific prior written
permission.
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ''AS IS'' AND ANY EXPRESS
OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Modified BSD License
====================
::
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* The name of the author may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
THE POSSIBILITY OF SUCH DAMAGE.
+1 -1
View File
@@ -9,7 +9,7 @@ rsync -av updates tom@onegeek.org:/home/tom/WWW.update/renpy/
mkdir ~/ab/website/renpy/dl/$1
cp dists/renpy-$1-* ~/ab/website/renpy/dl/$1
cp CHANGELOG.txt ~/ab/website/renpy/dl/$1
cp renpy-ppc.zip ~/ab/website/renpy/dl/$1
cd ~/ab/website
./upload.sh
+7
View File
@@ -0,0 +1,7 @@
#!/bin/bash
ln -s ../help.html tutorial/README.html
ln -s ../help.html the_question/README.html
ln -s ../help.html template/README.html
ln -s sphinx/source/license.rst LICENSE.txt
+2 -4
View File
@@ -3,7 +3,7 @@
import modulefinder
import shutil
from distutils.core import setup
import py2exe
import py2exe #@UnresolvedImport @UnusedImport
import sys
import zipfile
import traceback
@@ -27,7 +27,7 @@ def move_from_dist(fn):
os.rename("dist/" + fn, fn)
import renpy
renpy.setup_modulefinder(modulefinder)
renpy.setup_modulefinder(modulefinder) #@UndefinedVariable
def main():
@@ -49,7 +49,6 @@ def main():
'pygame.surfarray',
'pygame.mixer',
'pygame.mixer_music',
'pygame.font',
'_ssl',
'_hashlib',
'win32con',
@@ -59,7 +58,6 @@ def main():
'gettext',
'os2emxpath',
'macpath',
'posixpath',
],
'optimize' : 2,
} },
-2
View File
@@ -3,8 +3,6 @@
import collections
import glob
import re
import sys
import time
import os
# A map from string to filename, line number where the string is found.
+18 -1
View File
@@ -48,9 +48,21 @@ init -1210 python:
config.imagereference_respects_position = True
config.predict_screens = False
config.choice_screen_chosen = False
if version <= (6, 12, 0):
config.keep_running_transform = False
config.image_attributes = False
config.new_character_image_argument = False
config.save_physical_size = False
if version <= (6, 12, 2):
style.default.language = "western"
style.default.layout = "greedy"
config.old_substitutions = True
config.new_substitutions = False
config.broken_line_spacing = True
init 1210 python hide::
# This returns true if the script_version is <= the
@@ -103,3 +115,8 @@ init 1210 python hide::
for i in layout.compat_funcs:
i()
if config.hyperlink_styler or config.hyperlink_callback or config.hyperlink_focus:
style.default.hyperlink_functions = (config.hyperlink_styler, config.hyperlink_callback, config.hyperlink_focus)
+58
View File
@@ -24,6 +24,15 @@ init -1110:
transform truecenter:
xpos 0.5 xanchor 0.5 ypos 0.5 yanchor 0.5
transform topleft:
xpos 0.0 xanchor 0.0 ypos 0.0 yanchor 0.0
transform topright:
xpos 1.0 xanchor 1.0 ypos 0.0 yanchor 0.0
transform top:
xpos 0.5 xanchor 0.5 ypos 0.0 yanchor 0.0
# Offscreen positions for use with the move transition. Images at
# these positions are still shown (and consume
@@ -87,6 +96,55 @@ init -1110 python:
# This defines a family of move transitions.
def move_transitions(prefix, delay, time_warp=None, in_time_warp=None, out_time_warp=None, old=False, layers=[ 'master' ], **kwargs):
"""
:doc: transition_family
This defines a family of move transitions, similar to the move and ease
transitions. For a given `prefix`, this defines the transitions:
* *prefix*- A transition that takes `delay` seconds to move images that
changed positions to their new locations.
* *prefix*\ inleft, *prefix*\ inright, *prefix*\ intop, *prefix*\ inbottom - Transitions
that take `delay` seconds to move images that changed positions to their
new locations, with newly shown images coming in from the appropriate
side.
* *prefix*\ outleft, *prefix*\ outright, *prefix*\ outtop, *prefix*\ outbottom -
Transitions that take `delay` seconds to move images that changed
positions to their new locations, with newly hidden images leaving via
the appropriate side.
`time_warp`, `in_time_warp`, `out_time_warp`
Time warp functions that are given a time from 0.0 to 1.0 representing
the fraction of the move complete, and return a value in the same
range giving the fraction of a linear move that is complete.
This can be used to define functions that ease the images around,
rather than moving them at a constant speed.
The three argument are used for images remaining on the screen,
newly shown images, and newly hidden images, respectively.
`old`
If true, the transitions to move the old displayables, rather than the new ones.
`layers`
The layers the transition will apply to.
Additional keyword arguments are passed (indirectly) to the moves. The
most useful additional keyword argument is probably subpixel=True,
which causes a subpixel move to be used.
::
# This defines all of the pre-defined transitions beginning
# with "move".
init python:
define.move_transitions("move", 0.5)
"""
moves = {
"" : MoveTransition(
delay,
+329
View File
@@ -0,0 +1,329 @@
# Copyright 2004-2011 Tom Rothamel <pytom@bishoujo.us>
# See LICENSE.txt for license details.
init -1135 python:
class __GalleryAllPriorCondition(object):
def check(self, all_prior):
return all_prior
class __GalleryArbitraryCondition(object):
def __init__(self, condition):
self.condition = condition
def check(self, all_prior):
return eval(self.condition)
class __GalleryUnlockCondition(object):
def __init__(self, images):
self.images = images
def check(self, all_prior):
for i in self.images:
if not renpy.seen_image(i):
return False
return True
class __GalleryImage(object):
def __init__(self, gallery, displayables):
# The gallery object we belong to.
self.gallery = gallery
# A list of conditions for this image to be displayed.
self.conditions = [ ]
# A list of displayables to show.
self.displayables = displayables
# A list of transforms to apply to those displayables, or None
# to not apply a transform.
self.transforms = [ None ] * len(displayables)
def check_unlock(self, all_prior):
"""
Returns True if the image is unlocked.
"""
for i in self.conditions:
if not i.check(all_prior):
return False
return True
def show(self, locked, index, count):
"""
Shows this image when it's unlocked.
"""
renpy.transition(self.gallery.transition)
ui.saybehavior()
displayables = [ ]
for d, transform in zip(self.displayables, self.transforms):
if transform is not None:
d = transform(d)
else:
d = config.default_transform(d)
displayables.append(d)
renpy.show_screen("_gallery", locked=locked, index=index + 1, count=count, displayables=displayables, gallery=self.gallery)
ui.interact()
class __GalleryButton(object):
def __init__(self, gallery):
self.gallery = gallery
self.images = [ ]
self.conditions = [ ]
def check_unlock(self):
for i in self.conditions:
if not i.check(True):
return False
for i in self.images:
if i.check_unlock(False):
return True
return False
def show(self):
all_prior = True
for i, img in enumerate(self.images):
locked = not img.check_unlock(all_prior)
img.show(locked, i, len(self.images))
renpy.transition(self.gallery.transition)
class Gallery(object):
"""
:doc: gallery class
This class supports the creation of an image gallery by handling the
locking of images, providing an action that can show one or more images,
and a providing method that creates buttons that use that action.
.. attribute:: transition
The transition that is used when changing images.
.. attribute:: locked_button
The default displayable used by make_button for a locked button.
.. attribute:: hover_border
The default hover border used by make_button.
.. attribute:: idle_border
The default idle border used by make_button.
"""
transition = None
hover_border = None
idle_border = None
locked_button = None
def __init__(self):
# A map from button name (or image) to __GalleryButton object.
self.buttons = { }
self.button_ = None
self.image_ = None
self.unlockable = None
def button(self, name):
"""
:doc: gallery method
Creates a new button, named `name`.
`name`
The name of the button being created.
"""
self.button_ = __GalleryButton(self)
self.unlockable = self.button_
self.buttons[name] = self.button_
def image(self, *displayables):
"""
:doc: gallery method
Adds a new image to the current button, where an image consists
of one or more displayables.
"""
self.image_ = __GalleryImage(self, displayables)
self.button_.images.append(self.image_)
self.unlockable = self.image_
display = image
def transform(self, *transforms):
"""
:doc: gallery method
Applies transforms to the last image registered. This should be
called with the same number of transforms as the image has
displayables. The transforms are applied to the corresponding
displayables.
If a transform is None, the default transform is used.
"""
self.image_.transforms = transforms
def unlock(self, *images):
"""
:doc: gallery method
A condition that takes one or more image names as argument, and
is satisfied when all the named images have been seen by the
player. The image names should be given as strings.
"""
self.unlockable.conditions.append(__GalleryUnlockCondition(images))
def condition(self, expression):
"""
:doc: gallery method
A condition that is satisfied when an expression evaluates to true.
`expression`
A string giving a python expression.
"""
if not isinstance(expression, basestring):
raise Exception("Gallery condition must be a string containing an expression.")
self.unlockable.conditions.append(__GalleryArbitraryCondition(expression))
def allprior(self):
"""
:doc: gallery method
A condition that is true if all prior images associated with the
current button have been unlocked.
"""
self.unlockable.conditions.append(__GalleryAllPriorCondition())
def unlock_image(self, *images):
"""
:doc: gallery method
A convenience method that is equivalent to calling image and unlock
with the same parameters. This will cause an image to be displayed
if it has been seen before.
The images should be specified as strings giving image names.
"""
self.image(*images)
self.unlock(*images)
def Action(self, name):
"""
:doc: gallery method
An action that displays the images associated with the given button
name.
"""
if name not in self.buttons:
raise Exception("{0!r} is not a button defined in this gallery.".format(name))
b = self.buttons[name]
if b.check_unlock():
return ui.invokesinnewcontext(b.show)
else:
return None
def make_button(self, name, unlocked, locked=None, hover_border=None, idle_border=None, **properties):
"""
:doc: gallery method
This creates a button that displays the images associated with the given
button name.
`name`
The name of the button that will be created.
`unlocked`
A displayable that is displayed for this button when it is
unlocked.
`locked`
A displayable that is displayed for this button when it is
locked. If None, the locked_button field of the gallery
object is used instead.
`hover_border`
A displayable that is used to overlay this button when when
it is unlocked and has focus. If None, the hover_border
field of the gallery object is used.
`idle_border`
A displayable that is used to overlay this button when when
it is unlocked but unfocused. If None, the idle_border
field of the gallery object is used.
Additional keyword arguments become style properties of the
created button object.
"""
action = self.Action(name)
if locked is None:
locked = self.locked_button
if hover_border is None:
hover_border = self.hover_border
if idle_border is None:
idle_border = self.idle_border
return Button(action=action, child=unlocked, insensitive_child=locked, hover_foreground=hover_border, idle_foreground=idle_border, **properties)
init -1135:
# Displays a set of images in the gallery, or indicates that the images
# are locked. This is given the following arguments:
#
# locked
# True if the image is locked.
# displayables
# A list of transformed displayables that should be shown to the user.
# index
# A 1-based index of the image being shown.
# count
# The number of images attached to the current button.
# gallery
# The image gallery object.
screen _gallery:
if locked:
add "#000"
text "Image [index] of [count] locked." align (0.5, 0.5)
else:
for d in displayables:
add d
+273 -84
View File
@@ -5,35 +5,186 @@
# a system supports both.
init -1024:
screen _gl_test:
python hide:
import os
store.__dxwebsetup = os.path.join(config.renpy_base, "lib", "dxwebsetup.exe")
python:
class _SetRenderer(Action):
"""
Sets the preferred renderer to one of "auto", "angle", "gl", or
"sw".
"""
def __init__(self, renderer):
self.renderer = renderer
def __call__(self):
_preferences.renderer = self.renderer
renpy.restart_interaction()
def get_selected(self):
return _preferences.renderer == self.renderer
# This is displayed to ask the user to choose the renderer he or she
# wants to use. It takes no parameters, doesn't return anything, and
# is expected to call _SetRenderer actions and quit when done.
#
# This screen can be customized by the creator, provided the actions
# remain available.
screen _choose_renderer:
frame:
style_group ""
xalign .5
yalign .33
xpadding 20
ypadding 20
xmaximum 400
has vbox
label _("Graphics Acceleration")
null height 10
textbutton _("Automatically Choose"):
action _SetRenderer("auto")
xfill True
if renpy.renpy.windows:
textbutton _("Force Angle/DirectX Renderer"):
action _SetRenderer("angle")
xfill True
textbutton _("Force OpenGL Renderer"):
action _SetRenderer("gl")
xfill True
textbutton _("Force Software Renderer"):
action _SetRenderer("sw")
xfill True
null height 10
text _("Changes will take effect the next time this program is run.") substitute True
null height 10
textbutton _(u"Quit"):
action Quit(confirm=False)
xfill True
if not renpy.display.interface.safe_mode:
textbutton _("Return"):
action Return(0)
xfill True
# This is displayed when a display performance problem occurs.
#
# `problem` is the kind of problem that is occuring. It can be:
# - "sw" if the software renderer was selected.
# - "slow" if the performance test failed.
# - "fixed" if we're operating w/o shaders.
# - other things, added in the future.
#
# `url` is the url of a web page on renpy.org that will include
# info on troubleshooting display problems.
screen _performance_warning:
frame:
style_group ""
xalign .5
yalign .33
xpadding 20
ypadding 20
xmaximum 400
has vbox
label _(u"Graphics Acceleration")
label _("Performance Warning")
null height 10
textbutton _(u"Automatically Choose"):
size_group "gl"
action SetField(persistent, "_gl_test", "auto")
textbutton _(u"Prefer Software Renderer"):
size_group "gl"
action SetField(persistent, "_gl_test", "sw")
textbutton _(u"Prefer OpenGL Renderer"):
size_group "gl"
action SetField(persistent, "_gl_test", "gl")
if problem == "sw":
text _("This computer is using software rendering.")
elif problem == "fixed":
text _("This computer is not using shaders.")
elif problem == "slow":
text _("This computer is displaying graphics slowly.")
else:
text _("This computer has a problem displaying graphics: [problem].") substitute True
null height 10
if directx_update:
text _("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.")
else:
text _("Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display.")
if directx_update:
null height 10
textbutton _("Update DirectX"):
action directx_update
xfill True
null height 10
textbutton _("Continue, Show this warning again"):
action Return(True)
xfill True
textbutton _("Continue, Don't show warning again"):
action Return(False)
xfill True
null height 10
textbutton _("Quit"):
action Quit(confirm=False)
xfill True
# Used while a directx update is ongoing.
screen _directx_update:
frame:
style_group ""
xalign .5
yalign .33
xpadding 20
ypadding 20
xmaximum 400
has vbox
label _("Updating DirectX.")
null height 10
textbutton _(u"Continue"):
size_group "gl"
action Return(True)
text _("DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX.")
null height 10
text _("{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.")
null height 10
text _("When setup finishes, please click below to restart this program.")
textbutton _("Restart") action Return(True)
init -1024 python:
# The image that we fill the screen with in GL-test mode.
@@ -56,24 +207,30 @@ init -1024 python:
self.times = [ ]
self.success = False
renpy.renpy.display.log.write("- Target is {0} frames in {1} seconds.".format(frames, self.target))
def render(self, width, height, st, at):
rv = renpy.Render(width, height)
if self.success:
return rv
self.times.append(st)
renpy.redraw(self, 0)
renpy.renpy.log.info("Frame drawn at %f seconds." % st)
renpy.renpy.display.log.write("- Frame drawn at %f seconds." % st)
if len(self.times) >= self.frames:
frames_timing = self.times[-1] - self.times[-self.frames]
renpy.renpy.log.info("It took %f seconds to render %d frames.", frames_timing, self.frames)
renpy.renpy.display.log.write("- %f seconds to render %d frames.", frames_timing, self.frames)
if frames_timing <= self.target:
self.success = True
renpy.timeout(0)
rv = renpy.Render(width, height)
return rv
return rv
def event(self, ev, x, y, st):
@@ -84,93 +241,94 @@ init -1024 python:
return False
renpy.timeout(self.timeout - st)
def __gl_prefer_renderers(renderers):
"""
Forces the current renderer to be renderer, one of gl or sw.
"""
if renpy.display.prefer_renderers == renderers:
return
renpy.display.prefer_renderers = renderers
renpy.display_reset()
def __gl_prompt():
"""
Decides if we want to prompt the user to enable OpenGL mode.
If so, shows a screen that allows the user to alter the
OpenGL setting.
"""
if not renpy.display.interface.safe_mode:
return
__gl_prefer_renderers("sw")
renpy.call_screen("_gl_test")
renpy.display.interface.safe_mode = False
config.performance_test = True
def __gl_test():
"""
Makes the decision as to if we should use GL or SW mode.
"""
import os
if "RENPY_RENDERER" in os.environ:
return
# Our decision survives a restart.
# If we've entered safe mode, display the renderer choice screen.
# This screen will cause us to quit.
if _restart:
return
renpy.renpy.log.info("GL test mode: %s", persistent._gl_test)
# If GL is disabled, don't bother.
if not config.gl_enable:
return
__gl_prompt()
if renpy.display.interface.safe_mode:
renpy.call_in_new_context("_choose_renderer")
if persistent._gl_test == "gl":
__gl_prefer_renderers("gl,sw")
if not config.performance_test:
return
if persistent._gl_test == "sw":
__gl_prefer_renderers("sw")
_gl_performance_test()
def _gl_performance_test():
import os
if not _preferences.performance_test and "RENPY_PERFORMANCE_TEST" not in os.environ:
return
__gl_prefer_renderers("gl,sw")
# Don't bother on androuid - there's nothing the user can do.
if renpy.renpy.android:
return
renpy.renpy.display.log.write("Performance test:")
# This will cause the screen to start displaying.
ui.pausebehavior(0)
ui.interact(suppress_underlay=True, suppress_overlay=True)
# If GL is able to render FRAMES frames at FPS fps in less
# than DELAY seconds, we consider it to be operational, and
# continue in GL mode. Otherwise, we rever to software
# rendering mode.
FRAMES = 5
FPS = 15
DELAY = 1
# The problem we have.
problem = None
renderer_info = renpy.get_renderer_info()
# Software renderer check.
if config.renderer != "sw" and renderer_info["renderer"] == "sw":
problem = "sw"
renpy.transition(Dissolve(DELAY), always=True, force=True)
ui.add(__GLTest(FRAMES, FPS, DELAY))
result = ui.interact(suppress_overlay=True, suppress_underlay=True)
# Speed check.
if problem is None:
# The parameters of the performance test. If we do not hit FPS fps
# over FRAMES frames before DELAY seconds are up, we fail.
FRAMES = 5
FPS = 15
DELAY = 1.5
renpy.transition(Dissolve(DELAY), always=True, force=True)
ui.add(__GLTest(FRAMES, FPS, DELAY))
result = ui.interact(suppress_overlay=True, suppress_underlay=True)
if not result:
problem = "slow"
if result:
__gl_prefer_renderers("gl,sw")
# Lack of shaders check.
if problem is None:
if not "RENPY_GL_ENVIRON" in os.environ:
if renderer_info["renderer"] == "gl" and renderer_info["environ"] == "fixed":
problem = "fixed"
if problem is None:
return
if renpy.renpy.windows and os.path.exists(__dxwebsetup):
directx_update = Jump("_directx_update")
else:
__gl_prefer_renderers("sw")
directx_update = None
# Give the warning message to the user.
renpy.show_screen("_performance_warning", problem=problem, directx_update=directx_update, _transient=True)
result = ui.interact(suppress_overlay=True, suppress_underlay=True)
# Init-time code:
# Make a guess as to what modes we should be in.
if persistent._gl_test is None:
persistent._gl_test = "auto"
if persistent._gl_test == "sw":
renpy.display.prefer_renderers = "sw"
# Store the user's choice, and continue.
_preferences.performance_test = result
return
label _gl_test:
@@ -186,3 +344,34 @@ label _gl_test:
return
# We can assume we're on windows here. We're also always restart once we
# make it here.
label _directx_update:
if renpy.has_label("directx_update"):
jump expression "directx_update"
label _directx_update_main:
python hide:
import subprocess
import sys
# Start dxsetup. We have to go through start to ensure that UAC
# doesn't cause problems.
subprocess.Popen(["start", __dxwebsetup], shell=True)
renpy.show_screen("_directx_update")
ui.interact(suppress_overlay=True, suppress_underlay=True)
# Restart the current program.
subprocess.Popen(sys.argv)
renpy.quit()
label _choose_renderer:
scene expression "#000"
$ renpy.call_screen("_choose_renderer")
return
+12 -1
View File
@@ -375,6 +375,11 @@ init -1105 python hide:
layout.QUIT = u"Are you sure you want to quit?"
layout.MAIN_MENU = u"Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
@layout
def invoke_yesno_prompt(*args):
_enter_menu()
return layout.yesno_prompt(*args)
@layout
def yesno_screen(message, yes=None, no=None):
"""
@@ -414,10 +419,16 @@ init -1105 python hide:
return
if renpy.invoke_in_new_context(layout.yesno_prompt, None, message):
if renpy.invoke_in_new_context(layout.invoke_yesno_prompt, None, message):
if yes is not None:
yes()
else:
if no is not None:
no()
def __auto_save_extra_info():
return save_name
config.auto_save_extra_info = __auto_save_extra_info
+36 -64
View File
@@ -305,6 +305,7 @@ init -1180 python hide:
quit = renpy.quit_event,
iconify = renpy.iconify,
help = _help,
choose_renderer = renpy.curried_call_in_new_context("_choose_renderer"),
)
config.underlay = [ km ]
@@ -334,7 +335,7 @@ init -1180 python hide:
config.overlay_functions.append(skip_indicator)
# Hyperlink functions. Duplicated in _errorhandling.rpym.
def hyperlink_styler(target):
return style.hyperlink_text
@@ -348,8 +349,7 @@ init -1180 python hide:
else:
renpy.call_in_new_context(target)
config.hyperlink_styler = hyperlink_styler
config.hyperlink_callback = hyperlink_function
style.default.hyperlink_functions = (hyperlink_styler, hyperlink_function, None)
# Prediction of screens.
def predict():
@@ -477,47 +477,6 @@ init 1180 python:
_preferences.using_afm_enable = False
if config.developer:
def _inspector(l):
ui.add("#000")
ui.window(xmargin=20, ymargin=20, style='default')
ui.vbox()
ui.text("Style Inspector")
ui.text("")
if not l:
ui.text("Nothing to inspect.")
for depth, width, height, d in l:
s = d.style
while s:
if s.name:
break
if s.parent:
s = style.get(s.parent)
else:
break
name = s.name[0] + "".join([ "[%r]" % i for i in s.name[1:] ])
ui.text(" " * depth + u" \u2022 " + d.__class__.__name__ + " : " + name + " (%dx%d)" % (width, height))
ui.text("")
ui.text("(click to continue)")
ui.close()
ui.saybehavior()
ui.interact(suppress_overlay=True, suppress_underlay=True)
return
config.inspector = _inspector
##############################################################################
# Code that originated in 00gamemenu.rpy
@@ -602,27 +561,14 @@ init -1180 python:
ui.interact()
# Run at the end of init, to set up autosaving based on the user's
# choices.
init 1180 python:
if config.has_autosave:
config.autosave_slots = 10
else:
config.autosave_frequency = None
label _enter_menu:
python hide:
def _enter_menu():
renpy.movie_stop(only_fullscreen=True)
renpy.take_screenshot((config.thumbnail_width, config.thumbnail_height))
for i in config.menu_clear_layers:
renpy.scene(layer=i)
renpy.context()._menu = True
# This may be changed, if we are already in the main menu.
renpy.context()._menu = True
renpy.context()._main_menu = False
renpy.context_dynamic("main_menu")
renpy.context_dynamic("_window_subtitle")
@@ -639,11 +585,18 @@ label _enter_menu:
for i in config.clear_layers:
renpy.scene(layer=i)
return
# Run at the end of init, to set up autosaving based on the user's
# choices.
init 1180 python:
if config.has_autosave:
config.autosave_slots = 10
else:
config.autosave_frequency = None
# Factored this all into one place, to make our lives a bit easier.
label _enter_game_menu:
call _enter_menu from _call__enter_menu_2
$ _enter_menu()
$ renpy.transition(config.enter_transition)
@@ -839,7 +792,7 @@ label _invoke_main_menu:
# initialize it.
label _main_menu(_main_menu_screen="_main_menu_screen"):
call _enter_menu from _call__enter_menu_1
$ _enter_menu()
python:
renpy.dynamic("_load_prompt")
@@ -908,7 +861,7 @@ init 1180 python hide:
continue
# Reject if it already exists.
if name in renpy.exports.images:
if name in renpy.display.image.images:
continue
renpy.image(name, fn)
@@ -930,6 +883,25 @@ label _developer:
if not config.developer:
return
call _enter_menu from _call__enter_menu_4
$ _enter_menu()
jump expression "_developer_screen"
# Translations.
init -1180 python:
def _language_activate():
if persistent._language:
language = persistent._language
else:
language = "translations"
if renpy.loadable(language + ".rpt"):
config.translator = renpy.Translator(language)
else:
config.translator = None
_language_activate()
+221
View File
@@ -0,0 +1,221 @@
# Copyright 2004-2011 Tom Rothamel <pytom@bishoujo.us>
# See LICENSE.txt for license details.
# This file contains the code to implement Ren'Py's music room function,
# which consists of the ability to set up a playlist (the aforementioned
# "music room"), and then a series of actions that let the player
# navigate through the music room.
init -1135 python:
class __MusicRoomPlay(Action):
"""
The action returned by MusicRoom.Play when called with a file.
"""
def __init__(self, mr, filename):
self.mr = mr
self.filename = filename
self.selected = self.get_selected()
def __call__(self):
self.mr.play(self.filename, 0)
def get_sensitive(self):
return self.mr.is_unlocked(self.filename)
def get_selected(self):
return renpy.music.get_playing(self.mr.channel) == self.filename
def periodic(self, st):
if self.selected != self.get_selected():
renpy.restart_interaction()
return .1
class MusicRoom(object):
"""
:doc: music_room class
A music room that contains a series of songs that can be unlocked
by the user, and actions that can play entries from the list in
order.
"""
def __init__(self, channel="music", fadeout=0.0, fadein=0.0):
"""
`channel`
The channel that this music room will operate on.
`fadeout`
The number of seconds it takes to fade out the old
music when changing tracks.
`fadein`
The number of seconds it takes to fade in the new
music when changing tracks.
"""
self.channel = channel
self.fadeout = fadeout
self.fadein = fadein
# The list of strings giving the titles of songs that make up the
# playlist.
self.playlist = [ ]
# A set of filenames, so we can quickly check if a valid filename
# has been provided.
self.filenames = set()
# The set of songs that are always unlocked.
self.always_unlocked = set()
def add(self, filename, always_unlocked=False):
"""
:doc: music_room method
Adds the music file `filename` to this music room. The music room
will play unlocked files in the order that they are added to the
room.
`always_unlocked`
If true, the music file will be always unlocked. This allows
the file to show up in the music room before it has been
played in the game.
"""
self.playlist.append(filename)
self.filenames.add(filename)
if always_unlocked:
self.always_unlocked.add(filename)
def is_unlocked(self, filename):
"""
:doc: music_room method
Returns true if the filename has been unlocked (or is always
unlocked), and false if it is still locked.
"""
if filename in self.always_unlocked:
return True
return renpy.seen_audio(filename)
def unlocked_playlist(self):
"""
Returns a list of filenames in the playlist that have been
unlocked.
"""
return [ i for i in self.playlist if self.is_unlocked(i) ]
def play(self, filename=None, offset=0):
"""
Starts the music room playing. The file we start playing with is
selected in two steps.
If `filename` is an unlocked file, we start by playing it.
Otherwise, we start by playing the currently playing file, and if
that doesn't exist or isn't unlocked, we start with the first file.
We then apply `offset`. If `offset` is positive, we advance that many
files, otherwise we go back that many files.
The selected file is then played.
"""
playlist = self.unlocked_playlist()
if not playlist:
return
if filename is None:
filename = renpy.music.get_playing(channel=self.channel)
try:
idx = playlist.index(filename)
except ValueError:
idx = 0
idx = (idx + offset) % len(playlist)
playlist = playlist[idx:] + playlist[:idx]
renpy.music.play(playlist, channel=self.channel, fadeout=self.fadeout, fadein=self.fadein)
def stop(self):
"""
Stops the music from playing.
"""
renpy.music.stop(channel=self.channel, fadeout=self.fadeout)
def next(self):
"""
Plays the next file in the playlist.
"""
return self.play(None, 1)
def previous(self):
"""
Plays the previous file in the playlist.
"""
return self.play(None, -1)
def Play(self, filename=None):
"""
:doc: music_room method
Causes the music room to start playing. If `filename` is given, that
file begins playing. Otherwise, the currently playing file starts
over (if it's unlocked), or the first file starts playing.
If `filename` is given, buttons with this action will be insensitive
while `filename` is locked, and will be selected when `filename`
is playing.
"""
if filename is None:
return self.play
if filename not in self.filenames:
raise Exception("{0!r} is not a filename registered with this music room.".format(filename))
return __MusicRoomPlay(self, filename)
def Stop(self):
"""
:doc: music_room method
Stops the music.
"""
return self.stop
def Next(self):
"""
:doc: music_room method
An action that causes the music room to play the next unlocked file
in the playlist.
"""
return self.next
def Previous(self):
"""
:doc: music_room method
An action that causes the music room to play the previous unlocked
file in the playlist.
"""
return self.previous
+3 -1
View File
@@ -119,6 +119,7 @@ init -1100 python:
"""
widget_properties, dialogue = __nvl_screen_dialogue()
renpy.show_screen(screen_name, _transient=True, _widget_properties=widget_properties, dialogue=dialogue, **scope)
renpy.shown_window()
@@ -126,7 +127,7 @@ init -1100 python:
def nvl_show_core(who=None, what=None):
# Screen version.
# Screen version.
if renpy.has_screen("nvl"):
return __nvl_show_screen("nvl", items=[ ])
@@ -214,6 +215,7 @@ init -1100 python:
**properties)
def do_add(self, who, what):
if store.nvl_list is None:
store.nvl_list = [ ]
+304 -22
View File
@@ -159,8 +159,6 @@ init -1140 python:
def __call__(self):
renpy.notify(self.message)
class InvertSelected(Action):
"""
:doc: other_action
@@ -186,6 +184,7 @@ init -1140 python:
def predict(self):
self.action.predict()
def If(expression, true=None, false=None):
"""
@@ -201,6 +200,55 @@ init -1140 python:
return true
else:
return false
class SelectedIf(Action):
"""
:doc: other_action
This allows an expression to control if a button should be marked
as selected. It should be used as part of a list with one or more
actions. For example::
# The button is selected if mars_flag is True
textbutton "Marsopolis":
action [ Jump("mars"), SelectedIf(mars_flag) ]
"""
def __init__(self, expression):
self.expression = expression
def __call__(self):
return None
def get_selected(self):
return self.expression
def Rollback():
"""
:doc: other_action
This action causes a rollback to occur, when a rollback is possible.
Otherwise, nothing happens.
"""
return renpy.rollback
class RollForward(Action):
"""
:doc: other_action
This action causes a rollforward to occur, if a roll forward is
possible. Otherwise, it is insensitive.
"""
def __call__(self):
return renpy.roll_forward_info()
def get_sensitive(self):
return renpy.roll_forward_info() is not None
##########################################################################
# Menu-related actions.
@@ -459,6 +507,19 @@ init -1140 python:
def get_selected(self):
return self.dict[self.key] == self.value
def SetScreenVariable(name, value):
"""
:doc: data_action
Causes the variable `name` associated with the current screen to
be set to `value`.
"""
cs = renpy.current_screen()
if cs is not None:
return SetDict(cs.scope, name, value)
else:
return None
class ToggleField(Action):
"""
@@ -564,6 +625,24 @@ init -1140 python:
return rv
def ToggleScreenVariable(name, true_value=None, false_value=None):
"""
:doc: data_action
Toggles the value of the variable `name` in the current screen.
`true_value`
If not None, then this is the true value we use.
`false_value`
If not None, then this is the false value we use.
"""
cs = renpy.current_screen()
if cs is not None:
return ToggleDict(cs.scope, name, true_value=true_value, false_value=None)
else:
return None
##########################################################################
# Audio actions.
@@ -648,8 +727,31 @@ init -1140 python:
renpy.music.stop(channel=self.channel, **self.kwargs)
renpy.restart_interaction()
class SetMixer(Action):
"""
:doc: audio_action
Sets the volume of `mixer` to `value`.
`mixer`
The mixer to set the volume of. A string, usually one of
"music", "sfx", or "voice".
`value`
The value to set the volume to. A number between 0.0 and 1.0,
inclusive.
"""
def __init__(self, mixer, volume):
self.mixer = mixer
self.volume = volume
def __call__(self):
_preferences.set_volume(self.mixer, self.volume)
renpy.restart_interaction()
def get_selected(self):
return _preferences.get_volume(self.mixer) == self.volume
##########################################################################
# BarValues
@@ -764,14 +866,19 @@ init -1140 python:
This is used internally, for some preferences.
`style`
The styles of the bar created.
`offset`
An offset to add to the value.
"""
def __init__(self, object, field, range, max_is_zero=False, style="bar"):
offset = 0
def __init__(self, object, field, range, max_is_zero=False, style="bar", offset=0):
self.object = object
self.field = field
self.range = range
self.max_is_zero = max_is_zero
self.style = style
self.offset = offset
def changed(self, value):
@@ -781,12 +888,16 @@ init -1140 python:
else:
value = value + 1
value += self.offset
setattr(self.object, self.field, value)
def get_adjustment(self):
value = getattr(self.object, self.field)
value -= self.offset
if self.max_is_zero:
if value == 0:
value = self.range
@@ -987,18 +1098,23 @@ init -1140 python:
`newest`
If true, then this file will be marked as the newest save
file when it's saved. (Set this to false for a quicksave,
for example.)
file when it's saved.
`page`
The name of the page that it will be saved to.
`cycle`
If true, then saves on the supplied page will be cycled before
being shown to the user.
"""
def __init__(self, name, confirm=True, newest=True, page=None):
def __init__(self, name, confirm=True, newest=True, page=None, cycle=False):
self.name = name
self.confirm = confirm
self.page = page
self.newest = newest
self.page = page
self.cycle = cycle
def __call__(self):
@@ -1007,6 +1123,9 @@ init -1140 python:
fn = __filename(self.name, self.page)
if self.cycle:
renpy.renpy.loadsave.cycle_saves(self.page + "-", 10)
if renpy.scan_saved_game(fn):
if self.confirm:
layout.yesno_screen(layout.OVERWRITE_SAVE, FileSave(self.name, False, self.newest, self.page))
@@ -1016,6 +1135,9 @@ init -1140 python:
if self.newest:
persistent._file_newest = fn
if self.page is not None:
persistent._file_page = self.page
renpy.restart_interaction()
@@ -1041,12 +1163,16 @@ init -1140 python:
`confirm`
If true, prompt if loading the file will end the game.
`newest`
If true, the button is selected if this is the newest file.
"""
def __init__(self, name, confirm=True, page=None):
def __init__(self, name, confirm=True, page=None, newest=True):
self.name = name
self.confirm = confirm
self.page = page
self.newest = newest
def __call__(self):
@@ -1066,7 +1192,7 @@ init -1140 python:
return renpy.scan_saved_game(__filename(self.name, self.page))
def get_selected(self):
if not self.confirm:
if not self.confirm or not self.newest:
return False
return persistent._file_newest == __filename(self.name, self.page)
@@ -1137,15 +1263,7 @@ init -1140 python:
persistent._file_page = self.page
renpy.restart_interaction()
def get_sensitive(self):
if self.page == "auto" and not config.has_autosave:
return False
elif self.page == "quick" and not config.has_quicksave:
return False
else:
return True
def get_selected(self):
return self.page == persistent._file_page
@@ -1315,10 +1433,76 @@ init -1140 python:
def __call__(self):
renpy.take_screenshot()
def QuickSave(message="Quick save complete."):
"""
:doc: file_action
Performs a quick save.
`message`
A message to display to the user when the quick save finishes.
"""
return [
FileTakeScreenshot(),
FileSave(1, page="quick", confirm=False, cycle=True),
Notify("Quick save complete.") ]
def QuickLoad():
"""
:doc: file_action
Performs a quick load.
"""
return FileLoad(1, page="quick", confirm=True, newest=False)
##########################################################################
# Side Images
def SideImage(tag="side"):
"""
:doc: side_image_function
Returns the side image associated with the currently speaking character,
or a Null displayable if no such side image exists.
"""
name = renpy.get_side_image(tag)
if name is None:
return Null()
else:
return ImageReference(name)
##########################################################################
# Preferences Constructor
class __DisplayAction(Action):
def __init__(self, factor):
self.width = int(factor * config.screen_width)
self.height = int(factor * config.screen_height)
def __call__(self):
renpy.set_physical_size((self.width, self.height))
renpy.restart_interaction()
def get_sensitive(self):
if self.width == config.screen_width and self.height == config.screen_height:
return True
return renpy.get_renderer_info()["resizable"]
def get_selected(self):
if _preferences.fullscreen:
return False
return (self.width, self.height) == renpy.get_physical_size()
config.always_has_joystick = False
def Preference(name, value=None):
"""
:doc: preference_action
@@ -1332,7 +1516,8 @@ init -1140 python:
Actions that can be used with buttons and hotspots are:
* Preference("display", "fullscreen") - displays in fullscreen mode.
* Preference("display", "window") - displays in windowed mode.
* Preference("display", "window") - displays in windowed mode at 1x normal size.
* Preference("display", 2.0) - displays in windowed mode at 2.0x normal size.
* Preference("display", "toggle") - toggle display mode.
* Preference("transitions", "all") - show all transitions.
@@ -1372,6 +1557,10 @@ init -1140 python:
* Preference("voice mute", "enable") - Mute the voice mixer.
* Preference("voice mute", "disable") - Un-mute the voice mixer.
* Preference("voice mute", "toggle") - Toggle voice mute.
* Preference("music volume", 0.5) - Set the music volume.
* Preference("sound volume", 0.5) - Set the sound volume.
* Preference("volice volume", 0.5) - Set the voice volume.
Values that can be used with bars are:
@@ -1391,9 +1580,11 @@ init -1140 python:
if value == "fullscreen":
return SetField(_preferences, "fullscreen", True)
elif value == "window":
return SetField(_preferences, "fullscreen", False)
return __DisplayAction(1.0)
elif value == "toggle":
return ToggleField(_preferences, "fullscreen")
elif isinstance(value, (int, float)):
return __DisplayAction(value)
elif name == "transitions":
@@ -1415,7 +1606,10 @@ init -1140 python:
elif name == "joystick" or name == "joystick...":
return ShowMenu("joystick_preferences")
if renpy.display.joystick.enabled or config.always_has_joystick:
return ShowMenu("joystick_preferences")
else:
return None
elif name == "skip":
@@ -1451,7 +1645,12 @@ init -1140 python:
elif name == "auto-forward time":
if value is None:
return FieldValue(_preferences, "afm_time", range=40, max_is_zero=True, style="slider")
if config.default_afm_enable is None:
return FieldValue(_preferences, "afm_time", range=30.0, max_is_zero=True, style="slider")
else:
return FieldValue(_preferences, "afm_time", range=29.9, style="slider", offset=.1)
elif isinstance(value, int):
return SetField(_preferences, "afm_time", value)
@@ -1468,16 +1667,22 @@ init -1140 python:
if value is None:
return MixerValue('music')
else:
return SetMixer('music', value)
elif name == "sound volume":
if value is None:
return MixerValue('sfx')
else:
return SetMixer('sfx', value)
elif name == "voice volume":
if value is None:
return MixerValue('voice')
else:
return SetMixer('voice', value)
elif name == "music mute":
@@ -1513,7 +1718,84 @@ init -1140 python:
# What we do on a quit, by default.
config.quit_action = ui.gamemenus("_confirm_quit")
#########################################################################
class __TooltipAction(object):
def __init__(self, tooltip, value):
self.tooltip = tooltip
self.value = value
def __call__(self):
if self.tooltip.value != self.value:
self.tooltip.value = self.value
renpy.restart_interaction()
def unhovered(self):
if self.tooltip.value != self.tooltip.default:
self.tooltip.value = self.tooltip.default
renpy.restart_interaction()
class Tooltip(object):
"""
:doc: tooltips class
A tooltip object can be used to define a portion of a screen that is
updated when the mouse hovers an area.
A tooltip object has a ``value`` field, which is set to the `default`
value passed to the constructor when the tooltip is created. When
a button using an action creadted by the tooltip is hovered, the
value field changes to the value associated with the action.
"""
def __init__(self, default):
self.value = default
self.default = default
def Action(self, value):
"""
:doc: tooltips method
:name: Action
Returns an action that is generally used as the hovered property
of a button. When the button is hovered, the value field of this
tooltip is set to `value`. When the buttton loses focus, the
value field of this tooltip reverts to the default.
"""
return __TooltipAction(self, value)
action = Action
#########################################################################
class Language(Action):
"""
:doc: other_action
Changes the language of the game to `language`. A language change
causes the current statement to be restarted, and all contexts but
the outermost being exited.
`language`
A string giving the language to translate to, or None to use
the language given in the game script.
"""
def __init__(self, language):
self.language = language
def __call__(self):
persistent._language = self.language
_language_activate()
renpy.restart_interaction()
renpy.rollback(True, 0)
def get_selected(self):
return persistent._language == self.language
# This is used to ensure a fixed click-to-continue indicator is shown on
# its own layer.
screen _ctc:
+9 -1
View File
@@ -7,7 +7,8 @@
# Statements can be defined by calling renpy.statements.register. This
# function takes a string giving the keywords at the start of the
# statement, and then up to 4 functions defining the behavior of the
# statement: parse, execute, predict, and lint
# statement: parse, execute, predict, and lint. If given the keyword
# argument block=True, the statement will take a block.
#
# The parse function takes a lexer object as an argument, and is
# expected to return some parser data. The lexer has the following
@@ -31,6 +32,13 @@
# l.revert(o) - Given the object returned by l.checkpoint(), returns
# there.
#
# l.subblock_lexer() - Return a lexer that gives a sub-block for the
# block associated with the current statement.
# l.advance() - In a subblock lexer, advance to the next line. This needs
# to be called before the above functions can be called on the first line.
#
#
#
# The parse function is expected to return an object, which is passed
# to the other functions. Parse should call renpy.error with the error
# message to report an error.
+14 -2
View File
@@ -72,6 +72,7 @@ init -1200 python hide:
style.hyperlink = Style(style.default, help=None) # ignored
style.hyperlink_text = Style(style.default, help='hyperlinked text')
style.ruby_text = Style(style.default, help='ruby text')
style.viewport = Style(style.default, help='default style of viewports')
style.transform = Style(style.motion, help='default style of transforms')
@@ -130,7 +131,7 @@ init -1090 python:
# Text properties.
style.default.font = "DejaVuSans.ttf"
style.default.language = "western"
style.default.language = "unicode"
style.default.antialias = True
style.default.size = 22
style.default.color = (255, 255, 255, 255)
@@ -139,6 +140,7 @@ init -1090 python:
style.default.italic = False
style.default.underline = False
style.default.strikethrough = False
style.default.kerning = 0.0
style.default.drop_shadow = None
style.default.drop_shadow_color = (0, 0, 0, 255)
style.default.outlines = [ ]
@@ -149,11 +151,14 @@ init -1090 python:
style.default.first_indent = 0
style.default.rest_indent = 0
style.default.line_spacing = 0
style.default.layout = "greedy"
style.default.line_leading = 0
style.default.line_overlap_split = 0
style.default.layout = "tex"
style.default.subtitle_width = 0.9
style.default.slow_cps = None
style.default.slow_cps_multiplier = 1.0
style.default.slow_abortable = False
# style.default.hyperlink_functions (set in 00library.rpy)
# Window properties.
style.default.background = None
@@ -184,6 +189,7 @@ init -1090 python:
style.default.spacing = 0
style.default.first_spacing = None
style.default.box_layout = None
style.default.box_wrap = False
# Focus properties.
style.default.focus_mask = None
@@ -259,6 +265,11 @@ init -1090 python:
style.hyperlink_text.hover_color = "#0ff"
style.hyperlink_text.idle_color = "#08f"
# Ruby.
style.ruby_text.size = 22
style.ruby_text.xoffset = 0
style.default.ruby_style = style.ruby_text
# Bars.
style.default.bar_invert = False
style.default.bar_resizing = False
@@ -314,3 +325,4 @@ init -1090 python:
style.error_title.color = (255, 128, 128, 255)
style.error_body.color = (128, 128, 255, 255)
+173
View File
@@ -0,0 +1,173 @@
# Copyright 2004-2011 Tom Rothamel <pytom@bishoujo.us>
# See LICENSE.txt for license details.
# This file contains code for the style preferences system, which allows
# the user to define preferences that update styles.
init -1135 python:
# A map from preference name to list of (alternative, style, property, value)
# tuples.
__preferences = { }
# A map from preference name to the list of alternatives for that preference.
__alternatives = { }
# Are style preferences dirty? If so, we need to update them at the start of
# the next operation.
__dirty = True
# A map from preference name to alternative.
if persistent._style_preferences is None:
persistent._style_preferences = { }
def __register_style_preference(preference, alternative, style, property, value):
"""
:doc: style_preferences
:name: renpy.register_style_preference
Registers information about an alternative for a style preference.
`preference`
A string, the name of the style property.
`alternative`
A string, the name of the alternative.
`style`
The style that will be updated. This may be a style object or a string giving the style name.
`property`
A string giving the name of the style property that will be update.
`value`
The value that will be assigned to the style property.
"""
if preference not in __preferences:
__preferences[preference] = [ ]
__alternatives[preference] = [ ]
if alternative not in __alternatives:
__alternatives[preference].append(alternative)
__preferences[preference].append((alternative, style, property, value))
def __init():
"""
Called at the end of the init phase, to ensure that each preference
has a valid value.
"""
for preference, alternatives in __alternatives.iteritems():
alt = persistent._style_preferences.get(preference, None)
if alt not in alternatives:
persistent._style_preferences[preference] = alternatives[0]
def __update():
"""
Called at least once per interaction, to update the styles if necessary.
"""
global __dirty
if not __dirty:
return
for preference, alternatives in __preferences.iteritems():
alt = persistent._style_preferences.get(preference, None)
for alternative, style, property, value in alternatives:
if alternative == alt:
setattr(style, property, value)
renpy.style.rebuild()
__dirty = False
def __check(preference, alternative=None):
if preference not in __alternatives:
raise Exception("{0} is not a known style preference.".format(preference))
if alternative is not None:
if alternative not in __alternatives[preference]:
raise Exception("{0} is not a known alternative for style preference {1}.".format(alternative, preference))
def __set_style_preference(preference, alternative):
"""
:doc: style_preferences
:name: renpy.set_style_preference
Sets the selected alternative for the style preference.
`preference`
A string giving the name of the style preference.
`alternative`
A string giving the name of the alternative.
"""
global __dirty
__check(preference, alternative)
persistent._style_preferences[preference] = alternative
__dirty = True
renpy.restart_interaction()
def __get_style_preference(preference):
"""
:doc: style_preferences
:name: renpy.get_style_preference
Returns a string giving the name of the selected alternative for the named style preference.
`preference`
A string giving the name of the style preference.
"""
__check(preference)
return persistent._style_preferences[preference]
class StylePreference(Action):
"""
:doc: style_preferences
An action that causes `alternative` to become the selected alternative for the given style preference.
`preference`
A string giving the name of the style preference.
`alternative`
A string giving the name of the alternative.
"""
def __init__(self, preference, alternative):
__check(preference, alternative)
self.preference = preference
self.alternative = alternative
def __call__(self):
__set_style_preference(self.preference, self.alternative)
def get_selected(self):
return __get_style_preference(self.preference) == self.alternative
renpy.register_style_preference = __register_style_preference
renpy.set_style_preference = __set_style_preference
renpy.get_style_preference = __get_style_preference
config.interact_callbacks.append(__update)
init 1135 python:
__init()
+5 -1
View File
@@ -401,7 +401,11 @@ init -1110 python hide:
roundrect_based_theme("diamond", "_theme_diamond/d")
roundrect_based_theme("tv", "_theme_tv/t")
roundrect_based_theme("glow", "_theme_glow/g", None, "_outline.png")
roundrect_based_theme("regal", "_theme_regal/re")
roundrect_based_theme("crayon", "_theme_crayon/cry")
roundrect_based_theme("threeD", "_theme_threeD/th")
roundrect_based_theme("marker", "_theme_marker/ink")
roundrect_based_theme("austen", "_theme_austen/au")
@theme
def ancient():
+4 -4
View File
@@ -10,11 +10,11 @@ init python:
# The contents of the game menu choices.
config.game_menu = [
( "return", u"Return", ui.jumps("_return"), 'True'),
( "skipping", u"Begin Skipping", ui.jumps("_return_skipping"), 'config.allow_skipping and not renpy.context().main_menu'),
( "skipping", u"Begin Skipping", ui.jumps("_return_skipping"), 'config.allow_skipping and not renpy.context()._main_menu'),
( "prefs", u"Preferences", _intra_jumps("_prefs_screen", "intra_transition"), 'True' ),
( "save", u"Save Game", _intra_jumps("_save_screen", "intra_transition"), 'not renpy.context().main_menu' ),
( "save", u"Save Game", _intra_jumps("_save_screen", "intra_transition"), 'not renpy.context()._main_menu' ),
( "load", u"Load Game", _intra_jumps("_load_screen", "intra_transition"), 'True'),
( "mainmenu", u"Main Menu", lambda : _mainmenu_prompt(), 'not renpy.context().main_menu' ),
( "mainmenu", u"Main Menu", lambda : _mainmenu_prompt(), 'not renpy.context()._main_menu' ),
( "quit", u"Quit", lambda : _quit_prompt("quit"), 'True' ),
]
@@ -463,7 +463,7 @@ label _load_screen:
fn, exists = _file_picker("load", False )
if not renpy.context().main_menu and _load_prompt:
if not renpy.context()._main_menu and _load_prompt:
if _yesno_prompt("load", u"Loading will lose unsaved progress.\nAre you sure you want to do this?"):
renpy.load(fn)
else:
+89 -17
View File
@@ -2,30 +2,41 @@
# games.
screen _developer:
window style "gm_root"
frame:
style_group "_developer"
style_group ""
align (.025, .05)
has vbox:
first_spacing 10
has vbox
label "Developer Menu"
textbutton _(u"Return") action Return()
textbutton _(u"Reload Game (Shift + R)") action ui.callsinnewcontext("_save_reload_game")
textbutton _(u"Variable Viewer") action Jump("_debugger_screen")
textbutton _(u"Theme Test") action Jump("_theme_test")
textbutton _(u"Style Hierarchy") action Jump("_style_hierarchy")
textbutton _(u"Image Location Picker") action Jump("_image_location_picker")
textbutton _(u"Filename List") action Jump("_filename_list")
init python hide:
style._developer_button = Style(style.button)
style._developer_button.size_group = "_developer"
textbutton _(u"Reload Game (Shift+R)"):
action ui.callsinnewcontext("_save_reload_game")
size_group "developer"
textbutton _(u"Variable Viewer"):
action Jump("_debugger_screen")
size_group "developer"
textbutton _(u"Theme Test"):
action Jump("_theme_test")
size_group "developer"
textbutton _(u"Style Hierarchy"):
action Jump("_style_hierarchy")
size_group "developer"
textbutton _(u"Image Location Picker"):
action Jump("_image_location_picker")
size_group "developer"
textbutton _(u"Filename List"):
action Jump("_filename_list")
size_group "developer"
null height 15
textbutton _(u"Return"):
action Return()
size_group "developer"
label _developer_screen:
call screen _developer
@@ -444,7 +455,7 @@ label _image_location_picker:
for fn in image_files:
ui.button(clicked=ui.returns(fn), size_group="files", xminimum=1.0)
ui.text(fn, style="button_text", xalign=0.0)
ui.text(fn.replace("{", "{{"), style="button_text", xalign=0.0)
ui.close()
@@ -494,7 +505,68 @@ label _filename_list:
jump _developer_screen
# The style inspector.
screen _inspector:
zorder 1010
modal True
frame:
style_group ""
xfill True
yfill True
has vbox
label _("Style Inspector")
null height 20
if not tree:
text _("Nothing to inspect.")
else:
for depth, width, height, d in tree:
$ t = ( " " * depth +
u" \u2022 " +
d.__class__.__name__ + " : " +
"style=%s, " % (__format_style(d.style),) +
"size=(%dx%d)" % (width, height) )
text t
null height 20
text _("(Click to continue.)")
python:
ui.saybehavior()
init python:
def __format_style(s):
while s:
if s.name:
break
if s.parent:
s = style.get(s.parent)
else:
break
return s.name[0] + "".join([ "[%r]" % i for i in s.name[1:] ])
def __inspect(tree):
renpy.context_dynamic("_window")
store._window = False
renpy.exports.show_screen("_inspector", _transient=True, tree=tree)
renpy.ui.interact(mouse="screen", type="screen", suppress_overlay=True, suppress_underlay=True)
config.inspector = __inspect
init python:
config.underlay.append(im.Tile("_transparent_tile.png"))
+503
View File
@@ -0,0 +1,503 @@
# Copyright 2004-2011 Tom Rothamel <pytom@bishoujo.us>
# See LICENSE.txt for license details.
#
# This file contains the code for in-game Ren'Py error handling. It's a
# module (as opposed to a .rpy file) because that allows us to ensure
# that it is fully loaded or run before any other Ren'Py code runs.
# These styles define the look of the Ren'Py in-game interface (the
# amie2 look). Despite being defined here (so they're available for
# error handling), they may be used in other code, like the launcher.
init python:
# default
style._default = Style(None)
# Temporarily, until the real styles can be defined.
style.default = style._default
style.image = style._default
style.fixed = style._default
style._default.font = "DejaVuSans.ttf"
style._default.language = "unicode"
style._default.antialias = True
style._default.size = 14
style._default.color = "#111"
style._default.black_color = (0, 0, 0, 255)
style._default.bold = False
style._default.italic = False
style._default.underline = False
style._default.strikethrough = False
style._default.kerning = 0.0
style._default.drop_shadow = None
style._default.drop_shadow_color = (0, 0, 0, 255)
style._default.outlines = [ ]
style._default.minwidth = 0
style._default.text_align = 0
style._default.justify = False
style._default.text_y_fudge = 0
style._default.first_indent = 0
style._default.rest_indent = 0
style._default.line_spacing = 4
style._default.line_leading = 0
style._default.line_overlap_split = 0
style._default.layout = "tex"
style._default.subtitle_width = 0.9
style._default.slow_cps = None
style._default.slow_cps_multiplier = 1.0
style._default.slow_abortable = False
# Window properties.
style._default.background = None
style._default.xpadding = 0
style._default.ypadding = 0
style._default.xmargin = 0
style._default.ymargin = 0
style._default.xfill = False
style._default.yfill = False
style._default.xminimum = 0 # Includes margins and padding.
style._default.yminimum = 0 # Includes margins and padding.
# Placement properties.
style._default.xpos = None # 0
style._default.ypos = None # 0
style._default.xanchor = None # 0
style._default.yanchor = None # 0
style._default.xmaximum = None
style._default.ymaximum = None
style._default.xoffset = 0
style._default.yoffset = 0
style._default.subpixel = False
# Sound properties.
style._default.sound = None
# Box properties.
style._default.spacing = 0
style._default.first_spacing = None
style._default.box_layout = None
style._default.box_wrap = False
# Focus properties.
style._default.focus_mask = None
style._default.focus_rect = None
# Bar properties.
style._default.fore_bar = Null()
style._default.aft_bar = Null()
style._default.thumb = None
style._default.thumb_shadow = None
style._default.left_gutter = 0
style._default.right_gutter = 0
style._default.thumb_offset = 0
style._default.unscrollable = None
style._default.bar_invert = False
style._default.bar_vertical = False
# Misc.
style._default.activate_sound = None
style._default.clipping = False
##########################################################################
# frame
style._frame = Style(style._default)
style._frame.background = Frame("_theme_amie2/frame.png", 40, 40)
style._frame.xmargin = 10
style._frame.ymargin = 10
style._frame.xpadding = 20
style._frame.ypadding = 10
# text
style._text = Style(style._default)
# boxes/boxlike
style._fixed = Style(style._default)
style._hbox = Style(style._default)
style._vbox = Style(style._default)
style._grid = Style(style._default)
style._side = Style(style._default)
style._viewport = Style(style._default)
style._hbox.box_layout = 'horizontal'
style._vbox.box_layout = 'vertical'
style._viewport.clipping = True
# button
style._button = Style(style._default)
style._button_text = Style(style._default)
style._button.xpadding = 8
style._button.ypadding = 6
style._button.xoffset = -5
style._button.background = Frame("_theme_amie2/button.png", 10, 10)
style._button.hover_background = Frame("_theme_amie2/button_hover.png", 10, 10)
style._button_text.size = 16
style._button_text.color = "#111"
style._button_text.selected_color = "#11f"
style._button_text.xalign = 0.5
style._button_text.yoffset = 2
# label
style._label = Style(style._default)
style._label_text = Style(style._default)
style._label.bottom_margin = 5
style._label_text.size = 20
style._label_text.color = "#000"
# bar
style._bar = Style(style._default)
style._scrollbar = Style(style._bar)
style._vscrollbar = Style(style._bar)
style._bar.left_bar = Frame("_theme_amie2/bar.png", 10, 10)
style._bar.right_bar = Frame("_theme_amie2/bar.png", 10, 10)
style._bar.thumb = Frame("_theme_amie2/button.png", 10, 10)
style._bar.thumb_offset = 10
style._bar.left_gutter = 5
style._bar.right_gutter = 5
style._bar.unscrollable = "hide"
style._scrollbar.ymaximum = 20
style._vscrollbar.xmaximum = 20
style._vscrollbar.bar_vertical = True
style._vscrollbar.bar_invert = True
style._hyperlink = Style(style._default)
style._hyperlink.color = "#008"
style._hyperlink.hover_underline = True
# Early hyperlink support.
init python hide:
def hyperlink_styler(target):
return style._hyperlink
def hyperlink_function(target):
if target.startswith("http:"):
try:
import webbrowser
webbrowser.open(target)
except:
pass
if target.startswith("edit:"):
prefix, line, filename = target.split(":", 2)
line = int(line)
renpy.launch_editor([ filename ], line)
style._default.hyperlink_functions = (hyperlink_styler, hyperlink_function, None)
init python:
# Null translation function. This gets redefined once things start
# successfully.
def _(s):
return s
# This function is responsible for taking a traceback, and converting
# it to a string that can be shown with text.
def __format_traceback(s):
import re
lines = [ i.replace("{", "{{") for i in s.split("\n") ]
rv = [ "{b}" + lines[0] + "{/b}" ]
for i in lines[1:]:
if config.editor:
i = re.sub(r'(File "(.*)", line (\d+))', r'{a=edit:\3:\2}\1{/a}', i)
rv.append(i)
return "\n".join(rv)
def __format_parse_errors(s):
import re
rv = ""
lines = s.split("\n")
len_lines = len(lines)
ln = 0
while ln < len_lines:
line = lines[ln]
ln += 1
if ln < len_lines and lines[ln].endswith("^"):
highlight = len(lines[ln]) - 1
ln += 1
else:
highlight = -1
pos = 0
for c in line:
if pos == highlight:
rv += u"{color=#c00}\u2192{/color}"
highlight = -1
pos += 1
if c == "{":
rv += "{{"
else:
rv += c
if highlight > 0:
rv += u"{color=#c00}\u2190{/color}"
rv += "\n"
if config.editor:
rv = re.sub(r'(File "(.*)", line (\d+))', r'{a=edit:\3:\2}\1{/a}', rv)
return rv
# Opens the traceback.txt file in an editor.
def __open_traceback():
try:
if config.editor:
renpy.launch_editor([ 'traceback.txt' ], 1, transient=1)
else:
os.startfile('traceback.txt')
except:
pass
# Opens the errors.txt file in an editor.
def __open_parse_errors():
try:
if config.editor:
renpy.launch_editor([ 'errors.txt' ], 1, transient=1)
else:
os.startfile('errors.txt')
except:
pass
def __can_open_traceback():
if config.editor:
return True
import os
if hasattr(os, 'startfile'):
return True
return False
# The transform used for errors. ATL isn't ready yet.
def __transform_function(state, st, at):
done = min(st / .1, 1.0)
state.zoom = .5 + .5 * done
state.alpha = done
state.xalign = 0.5
state.yalign = 0.5
if done < 1.0:
return 0
else:
return None
__transform = Transform(function=__transform_function, style='_default')
class __TooltipAction(object):
def __init__(self, tooltip, value):
self.tooltip = tooltip
self.value = value
def __call__(self):
if self.tooltip.value != self.value:
self.tooltip.value = self.value
renpy.restart_interaction()
def unhovered(self):
if self.tooltip.value != self.tooltip.default:
self.tooltip.value = self.tooltip.default
renpy.restart_interaction()
class __Tooltip(object):
def __init__(self, default):
self.value = default
self.default = default
def action(self, value):
return __TooltipAction(self, value)
class __XScrollValue(BarValue):
def __init__(self, viewport):
self.viewport = viewport
def get_adjustment(self):
w = renpy.get_widget(None, self.viewport)
if not isinstance(w, Viewport):
raise Exception("The displayable with id %r is not declared, or not a viewport." % self.viewport)
return w.xadjustment
def get_style(self):
return "scrollbar", "vscrollbar"
class __YScrollValue(BarValue):
def __init__(self, viewport):
self.viewport = viewport
def get_adjustment(self):
w = renpy.get_widget(None, self.viewport)
if not isinstance(w, Viewport):
raise Exception("The displayable with id %r is not declared, or not a viewport." % self.viewport)
return w.yadjustment
def get_style(self):
return "scrollbar", "vscrollbar"
# The screen that is used for error handling.
screen _exception:
modal True
zorder 1090
default tt = __Tooltip("")
default fmt_short = __format_traceback(short)
default fmt_full = __format_traceback(full)
add Solid("#000")
frame:
style_group ""
xfill True
at __transform
has side "t c r b"
vbox:
label _("An exception has occurred.")
viewport:
id "viewport"
child_size (4000, None)
mousewheel True
has vbox
text fmt_short substitute False
text fmt_full substitute False
bar:
style "_vscrollbar"
value __YScrollValue("viewport")
vbox:
bar:
style "_scrollbar"
value __XScrollValue("viewport")
hbox:
box_wrap True
if rollback_action:
textbutton _("Rollback"):
action rollback_action
hovered tt.action(_("Attempts a roll back to a prior time, allowing you to save or choose a different choice."))
if ignore_action:
textbutton _("Ignore"):
action ignore_action
hovered tt.action(_("Ignores the exception, allowing you to continue. This often leads to additional errors."))
if config.developer:
textbutton _("Reload"):
action reload_action
hovered tt.action(_("Reloads the game from disk, saving and restoring game state if possible."))
if __can_open_traceback():
textbutton _("Open Traceback"):
action __open_traceback
hovered tt.action(_("Opens the traceback.txt file in a text editor."))
null width 30
textbutton _("Quit"):
action renpy.quit
hovered tt.action(_("Quits the game."))
# Tooltip.
text tt.value size 12
if config.developer and reload_action:
key "R" action reload_action
# The screen that is used for error handling.
screen _parse_errors:
modal True
zorder 1090
default tt = __Tooltip("")
default fmt_errors = __format_parse_errors(errors)
add Solid("#000")
frame:
style_group ""
xfill True
at __transform
has side "t c r b"
vbox:
label _("Parsing the script failed.")
viewport:
id "viewport"
child_size (None, None)
mousewheel True
has vbox
text fmt_errors
bar:
style "_vscrollbar"
value __YScrollValue("viewport")
vbox:
bar:
style "_scrollbar"
value __XScrollValue("viewport")
hbox:
box_wrap True
textbutton _("Reload"):
action reload_action
hovered tt.action(_("Reloads the game from disk, saving and restoring game state if possible."))
if __can_open_traceback():
textbutton _("Open Parse Errors"):
action __open_parse_errors
hovered tt.action(_("Opens the errors.txt file in a text editor."))
null width 30
textbutton _("Quit"):
action renpy.quit
hovered tt.action(_("Quits the game."))
# Tooltip.
text tt.value size 12
if config.developer and reload_action:
key "R" action reload_action
-8
View File
@@ -351,11 +351,3 @@ label load_screen:
continue
renpy.load(fn)
init python hide:
def auto_save_extra_info():
return save_name
config.auto_save_extra_info = auto_save_extra_info
-6
View File
@@ -352,9 +352,3 @@ label load_screen:
continue
renpy.load(fn)
init python hide:
def auto_save_extra_info():
return save_name
config.auto_save_extra_info = auto_save_extra_info
+2 -1
View File
@@ -6,6 +6,7 @@ init python hide:
layout.provides('yesno_prompt')
def yesno_prompt(screen, message):
return renpy.call_screen('yesno_prompt', message=message, yes_action=Return(True), no_action=Return(False))
rv = renpy.call_screen('yesno_prompt', message=message, yes_action=Return(True), no_action=Return(False))
return rv
layout.yesno_prompt = yesno_prompt
-7
View File
@@ -227,10 +227,3 @@ label load_screen:
continue
renpy.load(fn)
init python hide:
def auto_save_extra_info():
return save_name
config.auto_save_extra_info = auto_save_extra_info
Binary file not shown.

After

Width:  |  Height:  |  Size: 325 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 534 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 954 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 405 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 656 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 789 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 409 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 623 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 596 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 439 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 775 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 813 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 375 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 362 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 543 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 484 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 402 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 345 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 516 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 533 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 487 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 179 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 247 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 363 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 350 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 236 B

+77 -48
View File
@@ -5,7 +5,6 @@ import sys
import os
import zipfile
import tarfile
import time
import zlib
import compileall
import shutil
@@ -13,6 +12,7 @@ import subprocess
import makeupdate
import glob
import time
import argparse
zlib.Z_DEFAULT_COMPRESSION = 9
@@ -115,27 +115,50 @@ def tree(root):
def main():
if len(sys.argv) != 2:
print "Usage: %s <prefix>" % sys.argv[0]
return
ap = argparse.ArgumentParser()
ap.add_argument("--fast", action="store_true")
ap.add_argument("prefix")
args = ap.parse_args()
prefix = sys.argv[1]
shutil.copy("tutorial/game/screens.rpy", "template/game/screens.rpy")
# Update the update-version.txt file.
# Revision updating is done early, so we can do it even if the rest
# of the program fails.
# Determine the version. We grab the current revision, and if any
# file has changed, bump it by 1.
p = subprocess.Popen(["bzr", "revno"], stdout=subprocess.PIPE)
revno = p.stdout.read().strip() + "-" + str(time.time())
revno = p.stdout.read().strip()
revno = int(revno)
p.wait()
p = subprocess.Popen(["bzr", "status", "-V"], stdout=subprocess.PIPE)
status = p.stdout.read().strip()
p.wait()
if status:
revno += 1
# Write the revno to the necessary files.
f = file("lib/update-version.txt", "w")
f.write(revno + " base\n")
f.write("{revno}-{now} base\n".format(revno=revno, now=time.time()))
f.close()
f = file("renpy/vc_version.py", "w")
f.write("""\
# The version of Ren'Py reported by the version control software.
vc_version = {revno}
""".format(revno=revno))
f.close()
# Compile all the python files.
compileall.compile_dir("renpy/", ddir=prefix + "/renpy/", force=1)
prefix = args.prefix
os.environ['RENPY_PATH_ELIDE'] = '/home/tom/ab/renpy:' + prefix
# Copy over the screens, to keep them up to date.
shutil.copy("tutorial/game/screens.rpy", "template/game/screens.rpy")
# Compile all the python files.
compileall.compile_dir("renpy/", ddir="renpy/", force=1)
# os.environ['RENPY_PATH_ELIDE'] = '/home/tom/ab/renpy:' + prefix
# Chmod the mac app.
os.chmod("./renpy.app/Contents/MacOS/Ren'Py Launcher", 0755)
@@ -150,7 +173,7 @@ def main():
files = [ ]
more_files = [ ]
files.append("CHANGELOG.txt")
# files.append("CHANGELOG.txt")
files.append("LICENSE.txt")
files.extend(tree("common"))
files.extend(tree("launcher"))
@@ -162,12 +185,14 @@ def main():
more_files.extend(tree("lib/linux-x86"))
module_files = [
"*.c",
"*.h",
"*.py",
"*.pyx",
"README.txt",
"lib/pysdlsound/*.py",
"*.c",
"gen/*.c",
"*.h",
"*.py*",
"include/*.pxd",
"pysdlsound/*.py",
"pysdlsound/*.pyx",
]
for i in module_files:
@@ -190,38 +215,42 @@ def main():
files.sort()
more_files.sort()
# zipup("dists/" + prefix + "-win32.zip", prefix, files)
# print "----"
for fn in files + more_files:
if "~" in fn or "#" in fn:
raise Exception("Bad filename {0}.".format(fn))
zipup("dists/" + prefix + "-sdk.zip", prefix, files + more_files)
print "----"
tarup("dists/" + prefix + "-sdk.tar.bz2", prefix, files + more_files)
print "----"
tarup("dists/" + prefix + "-source.tar.bz2", prefix, files)
print "----"
# Make the 7zip.
os.chdir("dists")
os.system("unzip " + prefix + "-sdk.zip")
if not args.fast:
print "----"
tarup("dists/" + prefix + "-sdk.tar.bz2", prefix, files + more_files)
print "----"
tarup("dists/" + prefix + "-source.tar.bz2", prefix, files)
print "----"
try:
# Make the 7zip.
os.chdir("dists")
os.system("unzip " + prefix + "-sdk.zip")
try:
os.unlink(prefix + "-sdk.7z")
except:
pass
os.system("7z a " + prefix + "-sdk.7z " + prefix)
os.system("cat ../7z.sfx " + prefix + "-sdk.7z > " + prefix + "-sdk.7z.exe""")
os.unlink(prefix + "-sdk.7z")
except:
pass
os.system("7z a " + prefix + "-sdk.7z " + prefix)
os.system("cat ../7z.sfx " + prefix + "-sdk.7z > " + prefix + "-sdk.7z.exe""")
os.unlink(prefix + "-sdk.7z")
os.chdir("..")
if os.path.exists("updates/prerelease"):
shutil.rmtree("updates/prerelease")
os.rename("dists/" + prefix, "updates/prerelease")
os.unlink("updates/prerelease/lib/update-version.txt")
makeupdate.make_update("updates/prerelease", revno)
os.chdir("..")
if os.path.exists("updates/prerelease"):
shutil.rmtree("updates/prerelease")
os.rename("dists/" + prefix, "updates/prerelease")
os.unlink("updates/prerelease/lib/update-version.txt")
makeupdate.make_update("updates/prerelease", str(revno))
os.chmod("renpy.py", 0755)
print
+1
View File
@@ -1,3 +1,4 @@
#@PydevCodeAnalysisIgnore
"""Easy to use dialogs.
Message(msg) -- display a message and an OK button.
+7 -7
View File
@@ -42,7 +42,7 @@ class BinFile(object):
c = self.u16()
rv = u""
for i in range(c):
for _i in range(c):
rv += unichr(self.u16())
return rv
@@ -78,7 +78,7 @@ def parse_data(bf, offset):
l = [ ]
bf.seek(data_offset - resource_virtual)
for i in range(data_len):
for _i in range(data_len):
l.append(chr(bf.u8()))
return (code_page, "".join(l))
@@ -87,16 +87,16 @@ def parse_data(bf, offset):
def parse_directory(bf, offset):
bf.seek(offset)
char = bf.u32()
timedate = bf.u32()
major = bf.u16()
minor = bf.u16()
char = bf.u32() #@UnusedVariable
timedate = bf.u32() #@UnusedVariable
major = bf.u16() #@UnusedVariable
minor = bf.u16() #@UnusedVariable
n_named = bf.u16()
n_id = bf.u16()
entries = [ ]
for i in range(n_named + n_id):
for _i in range(n_named + n_id):
entries.append((bf.u32(), bf.u32()))
rv = { }
+3 -3
View File
@@ -1,4 +1,3 @@
import os
import os.path
import zipfile
import tarfile
@@ -373,7 +372,7 @@ def distribute(
extension is allowed by the game.
"""
for a, b in multi_files:
for _a, b in multi_files:
if b == "/game/" + fn:
return
@@ -398,8 +397,9 @@ def distribute(
win_files.append((rb + "Microsoft.VC90.CRT.manifest", "/Microsoft.VC90.CRT.manifest"))
win_files.append((rb + "lib", "/lib"))
win_files.append((rb + "lib/dxwebsetup.exe", "/lib/dxwebsetup.exe"))
win_files.extend(tree(rb + "lib/windows-x86", "/lib/windows-x86"))
if os.path.exists(project_path + "/icon.ico"):
file_data[rb + "renpy.exe"] = change_icon.change_icons(
rb + "renpy.exe",
+4
View File
@@ -103,6 +103,9 @@ init -1 python hide:
# Disable opengl.
config.gl_enable = False
# Disable logging.
config.log_enable = False
python early:
config.save_directory = "launcher-2"
@@ -130,3 +133,4 @@ init -1 python hide:
config.window_icon = "logo.png"
config.windows_icon = "logo32.png"
config.new_substitutions = False
+7 -6
View File
@@ -1,3 +1,5 @@
#@PydevCodeAnalysisIgnore
"""pefile, Portable Executable reader module
@@ -25,11 +27,9 @@ __version__ = '1.2.10-%d' % int( __revision__[21:-2] )
__contact__ = 'ero@dkbza.org'
import os
import struct
import time
import math
import re
import exceptions
import string
import array
@@ -844,9 +844,10 @@ class SectionStructure(Structure):
"""Check whether the section contains the file offset provided."""
if not self.PointerToRawData:
# bss and other sections containing only uninitialized data must have 0
# and do not take space in the file
return False
# bss and other sections containing only uninitialized data must have 0
# and do not take space in the file
return False
return self.PointerToRawData <= offset < self.PointerToRawData + self.SizeOfRawData
@@ -3183,7 +3184,7 @@ class PE:
try:
# If the RVA is invalid all would blow up. Some EXEs seem to be
# specially nasty and have an invalid RVA.
data = self.get_data(rva, 2)
self.get_data(rva, 2)
except PEFormatError, e:
return None
+1
View File
@@ -1,3 +1,4 @@
#@PydevCodeAnalysisIgnore
"""Common operations on Posix pathnames.
Instead of importing this module directly, import os and refer to
+2 -1
View File
@@ -1,3 +1,4 @@
init -999:
$ config.script_version = (6, 12, 0)
$ config.script_version = (6, 13, 7)
+184 -2
View File
@@ -5,8 +5,13 @@ init 1 python:
("Roundrect", "roundrect", "Basic Blue"),
("Bordered", "bordered", "Dramatic Flesh"),
("Diamond", "diamond", "Colorblind"),
("TV", "tv", "Fine China"),
("Regal", "regal", "Fine China"),
("Austen", "austen", "White Chocolate"),
("TV", "tv", "Old Polaroid"),
("3D", "threeD", "Colorblind"),
("Glow", "glow", "Really Red"),
("Marker", "marker", "Creamsicle"),
("Crayon", "crayon", "First Valentines"),
]
# This is a map from theme function to template text that sensibly calls
@@ -65,6 +70,11 @@ init 1 python:
theme_templates["diamond"] = theme_templates["roundrect"].replace("roundrect", "diamond")
theme_templates["tv"] = theme_templates["roundrect"].replace("roundrect", "tv")
theme_templates["glow"] = theme_templates["roundrect"].replace("roundrect", "glow")
theme_templates["regal"] = theme_templates["roundrect"].replace("roundrect", "regal")
theme_templates["crayon"] = theme_templates["roundrect"].replace("roundrect", "crayon")
theme_templates["threeD"] = theme_templates["roundrect"].replace("roundrect", "threeD")
theme_templates["marker"] = theme_templates["roundrect"].replace("roundrect", "marker")
theme_templates["austen"] = theme_templates["roundrect"].replace("roundrect", "austen")
# This is a map from theme name to the code needed to implement that
# theme.
@@ -288,5 +298,177 @@ init 1 python:
'widget': '#7AA27B',
'widget_hover': '#A3C7A3',
'widget_selected': '#ffffff',
'widget_text': '#CDE0CE'}}
'widget_text': '#CDE0CE'},
'Mint Chocolate': {'disabled': '#ffe69c',
'disabled_text': '#ddbc7e',
'frame': '#8ab395',
'gm_root': '#7a4229',
'label': '#7a4229',
'mm_root': '#7a4229',
'widget': '#ffe69c',
'widget_hover': '#f5c153',
'widget_selected': '#7a4229',
'widget_text': '#b5743a'},
'Parachute Pants': {'disabled': '#53c7bb',
'disabled_text': '#97d7bd',
'frame': '#457b9f',
'gm_root': '#37397f',
'label': '#cce2ae',
'mm_root': '#37397f',
'widget': '#53c7bb',
'widget_hover': '#97d7bd',
'widget_selected': '#37397f',
'widget_text': '#457b9f'},
'Strawberry Orchard': {'disabled': '#b3c292',
'disabled_text': '#525748',
'frame': '#d8ebae',
'gm_root': '#e7f3cb',
'label': '#525748',
'mm_root': '#e7f3cb',
'widget': '#525748',
'widget_hover': '#f45c73',
'widget_selected': '#ffce95',
'widget_text': '#e7f3cb'},
'Grape Jelly': {'disabled': '#81859a',
'disabled_text': '#5e2862',
'frame': '#8ea9b0',
'gm_root': '#5e2862',
'label': '#ffffff',
'mm_root': '#5e2862',
'widget': '#c45693',
'widget_hover': '#5e2862',
'widget_selected': '#e59eae',
'widget_text': '#ffffff'},
'Dreamscape': {'disabled': '#966077',
'disabled_text': '#c75f77',
'frame': '#836177',
'gm_root': '#c75f77',
'label': '#fefab6',
'mm_root': '#c75f77',
'widget': '#77a493',
'widget_hover': '#8accb3',
'widget_selected': '#c75f77',
'widget_text': '#ffffff'},
'Unrequited Love': {'disabled': '#dbe4dd',
'disabled_text': '#bd9ca9',
'frame': '#fffeed',
'gm_root': '#b38698',
'label': '#23000e',
'mm_root': '#b38698',
'widget': '#7fa1b3',
'widget_hover': '#b38698',
'widget_selected': '#fffeed',
'widget_text': '#ffffff'},
'Watermellon': {'disabled': '#f9cdad',
'disabled_text': '#fc9d9a',
'frame': '#f9cdad',
'gm_root': '#83af9b',
'label': '#fe4365',
'mm_root': '#83af9b',
'widget': '#fc9d9a',
'widget_hover': '#fe4365',
'widget_selected': '#e5fcc2',
'widget_text': '#ffffff'},
'City Lights': {'disabled': '#638e89',
'disabled_text': '#594f4f',
'frame': '#547980',
'gm_root': '#594f4f',
'label': '#e5fcc2',
'mm_root': '#594f4f',
'widget': '#45ada8',
'widget_hover': '#2e5860',
'widget_selected': '#e5fcc2',
'widget_text': '#9de0ad'},
'Vampire Bite': {'disabled': '#971140',
'disabled_text': '#bd4b40',
'frame': '#bd1550',
'gm_root': '#490a3d',
'label': '#f8ca00',
'mm_root': '#490a3d',
'widget': '#e97f02',
'widget_hover': '#f5a240',
'widget_selected': '#490a3d',
'widget_text': '#bd1550'},
'Underground Rave': {'disabled': '#57cdff',
'disabled_text': '#717be5',
'frame': '#04b4ff',
'gm_root': '#cd249b',
'label': '#000000',
'mm_root': '#cd249b',
'widget': '#8833ce',
'widget_hover': '#cd249b',
'widget_selected': '#b6d754',
'widget_text': '#000000'},
'Tree Frog': {'disabled': '#ffffff',
'disabled_text': '#1c140d',
'frame': '#cbe86b',
'gm_root': '#ffffff',
'label': '#1c140d',
'mm_root': '#ffffff',
'widget': '#1c140d',
'widget_hover': '#86827e',
'widget_selected': '#f2e9e1',
'widget_text': '#cbe86b'},
'Sun Kissed': {'disabled': '#ffffff',
'disabled_text': '#ec4c51',
'frame': '#f0874d',
'gm_root': '#f8c821',
'label': '#ffffff',
'mm_root': '#f8c821',
'widget': '#ec4c51',
'widget_hover': '#dc454a',
'widget_selected': '#f8c821',
'widget_text': '#ffffff'},
'Vintage Faded': {'disabled': '#b17d6f',
'disabled_text': '#8c4e3d',
'frame': '#ab7464',
'gm_root': '#935844',
'label': '#f7d3c8',
'mm_root': '#935844',
'widget': '#8c4e3d',
'widget_hover': '#734032',
'widget_selected': '#fcf5ed',
'widget_text': '#e2b9ad'},
'Vintage': {'disabled': '#883e35',
'disabled_text': '#b86258',
'frame': '#b86258',
'gm_root': '#a24637',
'label': '#ffffff',
'mm_root': '#a24637',
'widget': '#6c2921',
'widget_hover': '#832f26',
'widget_selected': '#ffc7c0',
'widget_text': '#fff4eb'},
'Earth Tones': {'disabled': '#12612f',
'disabled_text': '#2c6e44',
'frame': '#00551f',
'gm_root': '#6b4a27',
'label': '#ffffff',
'mm_root': '#568153',
'widget': '#ad8c31',
'widget_hover': '#568153',
'widget_selected': '#f2edc4',
'widget_text': '#ffffff'},
'Kindergarten': {'disabled': '#1ca4b2',
'disabled_text': '#22d5b3',
'frame': '#22d5b3',
'gm_root': '#ffeca6',
'label': '#ffffff',
'mm_root': '#ffeca6',
'widget': '#1781b1',
'widget_hover': '#12678e',
'widget_selected': '#f2edc4',
'widget_text': '#fdfbee'},
'Phone Operator': {'disabled': '#929292',
'disabled_text': '#ababab',
'frame': '#d2d2d2',
'gm_root': '#59667a',
'label': '#343e4d',
'mm_root': '#59667a',
'widget': '#59667a',
'widget_hover': '#343e4d',
'widget_selected': '#bed4f6',
'widget_text': '#ffffff'},
}
+2
View File
@@ -1,5 +1,6 @@
init python:
import urllib
import urllib2
import bz2
import os
@@ -71,6 +72,7 @@ init python:
bz = os.path.join(self.local, relative + ".new.bz2")
new = os.path.join(self.local, relative + ".new")
relative = urllib.quote(relative)
url = self.remote + "/" + relative + ".bz2"
try:
Binary file not shown.
+7 -4
View File
@@ -6,9 +6,10 @@ sys.path.append('/home/tom/ab/keys/')
import os
import bz2
import hashlib
import public
import private
import public #@UnresolvedImport
import private #@UnresolvedImport
import shutil
import time
def sha(s):
"""
@@ -40,6 +41,8 @@ def make_update(root, version):
for dir, dirs, files in os.walk(root):
all = set(dirs + files)
for fn in dirs + files:
path = os.path.join(dir, fn)
@@ -58,7 +61,7 @@ def make_update(root, version):
elif relpath.endswith(".rpyb.bz2"):
continue
elif relpath.endswith(".pyo.bz2"):
elif relpath.endswith(".pyo.bz2") and relpath.replace(".pyo", ".py") in all:
continue
elif relpath.endswith(".bz2"):
@@ -89,7 +92,7 @@ def make_update(root, version):
out.close()
f = file(os.path.join(root, "version"), "w")
f.write(version)
f.write(version + "-" + str(time.time()))
f.write("\n")
f.write("the latest Ren'Py pre-release")
f.close()
+24539
View File
File diff suppressed because it is too large Load Diff

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