Compare commits

...

52 Commits

Author SHA1 Message Date
Tom Rothamel 5c1f020786 Bump version to 6.99.9. 2015-11-29 17:08:45 -05:00
Tom Rothamel d3dbc5b076 Document the limitation on android transparency. 2015-11-28 22:06:41 -05:00
Tom Rothamel 99ddc07103 Ignore control characters in filenames when distributing.
On Mac OS X, the filename Icon\r is used for folder icons. This
filename can't be represented on windows, and so causes a crash.
2015-11-28 00:16:12 -05:00
Tom Rothamel dd2f3203dd Update changelog. 2015-11-27 22:49:50 -05:00
Tom Rothamel a7c4a74cfc Remove old code and license new file. 2015-11-27 22:38:28 -05:00
Tom Rothamel 118c7528a2 Update side image functionality.
It's now possible to apply a transform (and hence a transition)
when a side image changes. Different transforms can be used
when a the change is within a single character, versus a
change between characters.

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

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

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

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

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

Fixes #782.
2015-11-14 17:39:30 -05:00
Tom Rothamel 0ba1eeb9be Support xminimum and yminimum in hbox and vbox.
And because these are supported, so is area, xsize, and ysize.
2015-11-13 21:50:14 -05:00
Tom Rothamel 3c613a8157 Add PlayCharacterVoice.
This is a function that plays a sound file on the voice channel
with the given voice tag. This makes it possible to preview the
voice with the volume that would be used.
2015-11-09 21:51:00 -05:00
Tom Rothamel 75e4cc0bb7 Do not adjust text in console inputs. 2015-11-08 22:29:08 -05:00
Tom Rothamel 17f722fc0b Tristate _overlay_screens. 2015-11-07 23:44:23 -05:00
Tom Rothamel 2563a8dbcb Add config.overlay_screens.
This is a list of screens to display when the overlay is enabled,
which is the normal mode of operation.
2015-11-07 23:42:23 -05:00
Tom Rothamel 794932f82e Allow renpy.get_screen to check multiple screens. 2015-11-07 22:49:53 -05:00
Tom Rothamel 2b9ebc974c Limit alpha to 0.0 - 1.0 2015-11-07 22:49:07 -05:00
Tom Rothamel 1ca9a696e2 Document ATL warper output range. 2015-11-07 22:48:45 -05:00
Tom Rothamel 02a9d4721c Do not restrict ATL interpolation to the 0-1 range. 2015-11-06 20:48:14 -05:00
Tom Rothamel 3a583da12d Do not add spurious spaces to the end of text lines.
This was caused by looking at the wrong type. Fixes #779.
2015-11-04 23:10:05 -05:00
Tom Rothamel acd7f792ab Fix the get_available_image functions. 2015-11-03 22:55:46 -05:00
Tom Rothamel d42ffed1e7 Add renpy.can_show. 2015-11-03 00:23:40 -05:00
Tom Rothamel 17f8e56b70 Add a couple of functions to get tags and attributes. 2015-11-02 23:28:09 -05:00
Rikxz 9b77cba97e Added deprecation warnings on UI Functions 2015-10-25 19:29:30 -05:00
73 changed files with 3017 additions and 1607 deletions
+5
View File
@@ -529,6 +529,11 @@ init python in distribute:
"""
def walk(name, path):
# Ignore ASCII control characters, like (Icon\r on the mac).
if re.search('[\x00-\x19]', name):
return
is_dir = os.path.isdir(path)
if is_dir:
+1 -1
View File
@@ -238,7 +238,7 @@ init python in project:
interface.processing(_("Ren'Py is scanning the project..."))
if compile:
self.launch(["compile"], wait=True)
self.launch(["compile", "--keep-orphan-rpyc" ], wait=True)
else:
self.launch(["quit"], wait=True)
@@ -1,15 +1,15 @@
translate traditional_chinese strings:
# game/about.rpy:21
# game/about.rpy:39
old "[version!q]"
new "[version!q]"
# game/about.rpy:25
# game/about.rpy:43
old "View license"
new "檢視許可證"
# game/about.rpy:27
# game/about.rpy:45
old "Back"
new "返回"
@@ -1,23 +1,23 @@
translate traditional_chinese strings:
# game/add_file.rpy:7
# game/add_file.rpy:28
old "FILENAME"
new "檔案名稱"
# game/add_file.rpy:7
# game/add_file.rpy:28
old "Enter the name of the script file to create."
new "請輸入需要建立的腳本名稱。"
# game/add_file.rpy:10
# game/add_file.rpy:31
old "The filename must have the .rpy extension."
new "檔案名稱必須以 .rpy 為副檔名。"
# game/add_file.rpy:18
# game/add_file.rpy:39
old "The file already exists."
new "該檔已存在。"
# game/add_file.rpy:21
# game/add_file.rpy:42
old "# Ren'Py automatically loads all script files ending with .rpy. To use this\n# file, define a label and jump to it from another file.\n"
new "# Ren'Py 將自動載入以 .rpy 結尾的腳本。若要使用\n# 檔案,從其它檔案中定義一個標籤跳轉到該檔案。\n"
+133 -139
View File
@@ -1,161 +1,155 @@
translate traditional_chinese strings:
# game/android.rpy:13
old "A 32-bit Java Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=http://www.oracle.com/technetwork/java/javase/downloads/index.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "需要一個32位元的 Java 開發套件(JDK)來在 Windows 中建立 Android 套件。JDK 不同於 JRE,所以您可能有 Java 但不包含 JDK。\n\n請 {a=http://www.oracle.com/technetwork/java/javase/downloads/index.html} 下載和安裝 JDK{/a},然後重新啟動 Ren'Py 啟動器。"
# game/android.rpy:14
old "To build Android packages, please download RAPT (from {a=http://www.renpy.org/dl/android}here{/a}), unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher."
new "要建立 Android 套件,請下載 RAPT(從{a=http://www.renpy.org/dl/android}這裡{/a}下載),解壓縮到 Ren'Py 目錄下。然後重新啟動 Ren'Py 啟動器。"
# game/android.rpy:15
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
new "RAPT 已經安裝了,但是您還需要安裝 Android SDK 才可以建立 Android 套件。選擇安裝 SDK 來實現它。"
# game/android.rpy:16
old "RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore."
new "RAPT 已經安裝了,但是 KEY 尚未設定。請建立一個新的 KEY,或者恢複 android.keystore。"
# game/android.rpy:17
old "The current project has not been configured. Use \"Configure\" to configure it before building."
new "當前專案尚未配置。使用「設定」,在建設之前配置它。"
# game/android.rpy:18
old "Choose \"Build\" to build the current project, or attach an Android device and choose \"Build & Install\" to build and install it on the device."
new "選擇「建立」來建立當前專案,或者選擇「建立並安裝」來添加到一個 Android 裝置中建立並安裝。"
# game/android.rpy:20
old "Attempts to emulate an Android phone.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "模擬一臺 Android 手機。\n\n當按鈕被按下時,觸控輸入會模擬為滑鼠。Esc 按鍵映射為手機的選單鍵,PageUp 鍵映射為手機的返回鍵。"
# game/android.rpy:21
old "Attempts to emulate an Android tablet.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "模擬一個 Android 平板。\n\n當按鈕被按下時,觸控輸入會模擬為滑鼠。Esc 按鍵映射為平板的選單鍵,PageUp 鍵映射為平板的返回鍵。"
# game/android.rpy:22
old "Attempts to emulate an OUYA console.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "模擬一個 OUYA 控制器。\n\n控制器的按鍵映射為 OUYA 的方向鍵,確認鍵映射為 OUYA 的 select 按鍵,Esc 按鍵映射為 OUYA 的選單鍵,PageUp 按鍵被映射到 OUYA 的返回鍵。"
# game/android.rpy:24
old "Downloads and installs the Android SDK and supporting packages. Optionally, generates the keys required to sign the package."
new "下載和安裝 Android SDK 以及支援套件。可選擇性地設定產生金鑰來簽署套件。"
# game/android.rpy:25
old "Configures the package name, version, and other information about this project."
new "設定套件名稱,版本以及其它關於專案的資訊。"
# game/android.rpy:26
old "Opens the file containing the Google Play keys in the editor.\n\nThis is only needed if the application is using an expansion APK. Read the documentation for more details."
new "在編輯器中開啟包含 Google Play keys 的檔案。\n\n這是在應用程式需要一個擴展的 APK 套件時才需要。閱讀檔案來瞭解更多細節。"
# game/android.rpy:27
old "Builds the Android package."
new "建立 Android 套件。"
# game/android.rpy:28
old "Builds the Android package, and installs it on an Android device connected to your computer."
new "建立 Android 套件,並安裝到已連線到電腦的 Android 裝置中。"
# game/android.rpy:148
old "{a=%s}%s{/a}"
new "{a=%s}%s{/a}"
# game/android.rpy:371
old "Android: [project.current.name!q]"
new "Android [project.current.name!q]"
# game/android.rpy:391
old "Emulation:"
new "模擬:"
# game/android.rpy:399
old "Phone"
new "手機"
# game/android.rpy:403
old "Tablet"
new "平板"
# game/android.rpy:407
old "Television / OUYA"
new "電視/OUYA"
# game/android.rpy:419
old "Build:"
new "建立:"
# game/android.rpy:427
old "Install SDK & Create Keys"
new "安裝 SDK 並創建金鑰"
# game/android.rpy:431
old "Configure"
new "設定"
# game/android.rpy:516
old "Other:"
new "其他:"
# game/android.rpy:435
old "Build Package"
new "建立套件"
# game/android.rpy:439
old "Build & Install"
new "建立並安裝"
translate traditional_chinese strings:
# game/android.rpy:30
old "To build Android packages, please download RAPT, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher."
new "要建立 Android 套件,請下載 RAPT,解壓縮並將其放到 Ren'Py 目錄下然後重新啟動 Ren'Py 啟動器。"
new "要建立 Android 套件,請下載 RAPT解壓縮到 Ren'Py 目錄下然後重新啟動 Ren'Py 啟動器。"
# game/android.rpy:506
old "Before packaging Android apps, you'll need to download RAPT, the Ren'Py Android Packaging Tool. Would you like to download RAPT now?"
new "在包裝 Android 應用程式前,您必須下載 RAPT(Ren'Py Android Packaging Tool)Ren'Py 的 Android 包裝程式。您要現在下載 RAPT 嗎?"
# game/android.rpy:31
old "A 32-bit Java Development Kit is required to build Android packages on Windows. The JDK is different from the JRE, so it's possible you have Java without having the JDK.\n\nPlease {a=http://www.oracle.com/technetwork/java/javase/downloads/index.html}download and install the JDK{/a}, then restart the Ren'Py launcher."
new "需要一個 32 位元的 Java 開發套件(JDK)來在 Windows 中建立 Android 套件。JDK 不同於 JRE,所以您可能有 Java 但不包含 JDK。\n\n請 {a=http://www.oracle.com/technetwork/java/javase/downloads/index.html}下載并安裝 JDK{/a},然後重新啟動 Ren'Py 啟動器。"
# game/android.rpy:32
old "RAPT has been installed, but you'll need to install the Android SDK before you can build Android packages. Choose Install SDK to do this."
new "RAPT 已經安裝了,但是您還需要安裝 Android SDK 才可以建立 Android 套件。選擇安裝 SDK 來實現它。"
# game/android.rpy:33
old "RAPT has been installed, but a key hasn't been configured. Please create a new key, or restore android.keystore."
new "RAPT 已經安裝了,但是 KEY 尚未設定。請建立一個新的 KEY,或者恢複 android.keystore。"
# game/android.rpy:34
old "The current project has not been configured. Use \"Configure\" to configure it before building."
new "當前專案尚未配置。使用「設定」,在建設之前配置它。"
# game/android.rpy:35
old "Choose \"Build\" to build the current project, or attach an Android device and choose \"Build & Install\" to build and install it on the device."
new "選擇「建立」來建立當前專案,或者選擇「建立 & 安裝」來添加到一個 Android 裝置中建立並安裝。"
# game/android.rpy:37
old "Attempts to emulate an Android phone.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "模擬一臺 Android 手機。\n\n當按鈕被按下時,觸控輸入會模擬為滑鼠。Esc 按鍵映射為手機的選單鍵,PageUp 鍵映射為手機的返回鍵。"
# game/android.rpy:38
old "Attempts to emulate an Android tablet.\n\nTouch input is emulated through the mouse, but only when the button is held down. Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "模擬一個 Android 平板。\n\n當按鈕被按下時,觸控輸入會模擬為滑鼠。Esc 按鍵映射為平板的選單鍵,PageUp 鍵映射為平板的返回鍵。"
# game/android.rpy:39
old "Attempts to emulate a televison-based Android console, like the OUYA or Fire TV.\n\nController input is mapped to the arrow keys, Enter is mapped to the select button, Escape is mapped to the menu button, and PageUp is mapped to the back button."
new "模擬一臺基於 Android 電視,例如 OUYA 或 Fire TV。\n\n控制器的按鍵映射為 OUYA 的方向鍵,確認鍵映射為 OUYA 的 select 按鍵,Esc 按鍵映射為 OUYA 的選單鍵,PageUp 按鍵被映射到 OUYA 的返回鍵。"
new "模擬一臺基於 Android 電視, OUYA 或 TV。\n\n控制器的輸入按鍵映射為方向鍵,Enter 按鍵映射為 select 按鍵,Esc 按鍵映射為選單鍵,PageUp 按鍵被映射返回鍵。"
# game/android.rpy:524
old "Remote ADB Connect"
new "遠端 ADB 連接"
# game/android.rpy:41
old "Downloads and installs the Android SDK and supporting packages. Optionally, generates the keys required to sign the package."
new "下載和安裝 Android SDK 以及支援套件。可選擇性地設定產生的 keys 來簽署套件。"
# game/android.rpy:528
old "Remote ADB Disconnect"
new "斷開遠端 ADB 連接"
# game/android.rpy:42
old "Configures the package name, version, and other information about this project."
new "設定套件名稱,版本以及其它關於專案的資訊。"
# game/android.rpy:608
old "Remote ADB Address"
new "遠端 ADB 位址"
# game/android.rpy:43
old "Opens the file containing the Google Play keys in the editor.\n\nThis is only needed if the application is using an expansion APK. Read the documentation for more details."
new "在編輯器中開啟包含 Google Play keys 的檔案。\n\n這是在應用程式需要一個擴展的 APK 套件時才需要。閱讀檔案來瞭解更多細節。"
# game/android.rpy:609
old "Please enter the IP address and port number to connect to, in the form \"192.168.1.143:5555\". Consult your device's documentation to determine if it supports remote ADB, and if so, the address and port to use."
new "\"192.168.1.143:5555\" 是連接裝置的 IP 位址和埠的輸入形式。請鍵入裝置的 IP 位址和埠來連接。注意,確保裝置支援遠端 ADB,然後鍵入位址和埠來使用。"
# game/android.rpy:44
old "Builds the Android package."
new "建立 Android 套件。"
# game/android.rpy:619
old "Invalid remote ADB address"
new "遠端 ADB 位址無效"
# game/android.rpy:45
old "Builds the Android package, and installs it on an Android device connected to your computer."
new "建立 Android 套件,並安裝到已連線到電腦的 Android 裝置中。"
# game/android.rpy:619
old "The address must contain one exactly one ':'."
new "位址必須包含一個精確的 ':'。"
# game/android.rpy:46
old "Builds the Android package, installs it on an Android device connected to your computer, then launches the app on your device."
new "建立 Android 套件,並安裝到已連線到電腦的 Android 裝置中,然後啟動您的裝置上的應用程式。"
# game/android.rpy:623
old "The host may not contain whitespace."
new "主機位址不能包含空格。"
# game/android.rpy:629
old "The port must be a number."
new "埠必須是數位。"
# game/android.rpy:47
# game/android.rpy:48
old "Connects to an Android device running ADB in TCP/IP mode."
new "在 TCP/IP 模式下運行 ADB Android 裝置。"
# game/android.rpy:48
# game/android.rpy:49
old "Disconnects from an Android device running ADB in TCP/IP mode."
new "在 TCP/IP 模式下運行 ADB Android 裝置,並斷開連接。"
# game/android.rpy:253
old "Android: [project.current.name!q]"
new "Android: [project.current.name!q]"
# game/android.rpy:273
old "Emulation:"
new "模擬:"
# game/android.rpy:282
old "Phone"
new "手機"
# game/android.rpy:286
old "Tablet"
new "平板"
# game/android.rpy:290
old "Television"
new "電視"
# game/android.rpy:302
old "Build:"
new "建立:"
# game/android.rpy:310
old "Install SDK & Create Keys"
new "安裝 SDK & 創建 Keys"
# game/android.rpy:314
old "Configure"
new "設定"
# game/android.rpy:318
old "Build Package"
new "建立套件"
# game/android.rpy:322
old "Build & Install"
new "建立 & 安裝"
# game/android.rpy:326
old "Build, Install & Launch"
new "建立,安裝 & 啟動"
# game/android.rpy:337
old "Other:"
new "其他:"
# game/android.rpy:345
old "Remote ADB Connect"
new "遠端 ADB 連接"
# game/android.rpy:349
old "Remote ADB Disconnect"
new "斷開遠端 ADB 連接"
# game/android.rpy:382
old "Before packaging Android apps, you'll need to download RAPT, the Ren'Py Android Packaging Tool. Would you like to download RAPT now?"
new "在包裝 Android 應用程式前,您須下載 RAPT(Ren'Py Android Packaging Tool)Ren'Py 的 Android 包裝程式。您要現在下載 RAPT 嗎?"
# game/android.rpy:435
old "Remote ADB Address"
new "遠端 ADB 位址"
# game/android.rpy:435
old "Please enter the IP address and port number to connect to, in the form \"192.168.1.143:5555\". Consult your device's documentation to determine if it supports remote ADB, and if so, the address and port to use."
new "「192.168.1.143:5555」是連接裝置的 IP 位址和埠的輸入形式。請鍵入裝置的 IP 位址和埠來連接。注意,確保裝置支援遠端 ADB,然後鍵入位址和埠來使用。"
# game/android.rpy:447
old "Invalid remote ADB address"
new "遠端 ADB 位址無效"
# game/android.rpy:447
old "The address must contain one exactly one ':'."
new "位址必須包含一個精確的 ':'。"
# game/android.rpy:451
old "The host may not contain whitespace."
new "主機位址不能包含空格。"
# game/android.rpy:457
old "The port must be a number."
new "埠必須是數位。"
@@ -0,0 +1,7 @@
translate traditional_chinese strings:
# game/choose_directory.rpy:73
old "Ren'Py was unable to run python with tkinter to choose the directory. Please install the python-tk or tkinter package."
new "Ren'Py 無法運行 python 的 tkinter 來選擇專案目錄。請安裝 python-tk 或 tkinter。"
@@ -1,43 +1,43 @@
translate traditional_chinese strings:
# game/choose_theme.rpy:274
# game/choose_theme.rpy:303
old "Could not change the theme. Perhaps options.rpy was changed too much."
new "無法更介面主題。Options.rpy 也許改變了太多。"
new "無法更介面主題。Options.rpy 也許改變了太多。"
# game/choose_theme.rpy:332
# game/choose_theme.rpy:368
old "Display"
new "Display"
# game/choose_theme.rpy:333
# game/choose_theme.rpy:369
old "Window"
new "Window"
# game/choose_theme.rpy:334
# game/choose_theme.rpy:370
old "Fullscreen"
new "Fullscreen"
# game/choose_theme.rpy:335
# game/choose_theme.rpy:371
old "Planetarium"
new "Planetarium"
# game/choose_theme.rpy:342
# game/choose_theme.rpy:378
old "Sound Volume"
new "Sound Volume"
# game/choose_theme.rpy:376
# game/choose_theme.rpy:412
old "Choose Theme"
new "Choose Theme"
# game/choose_theme.rpy:389
# game/choose_theme.rpy:425
old "Theme"
new "介面主題"
# game/choose_theme.rpy:413
# game/choose_theme.rpy:449
old "Color Scheme"
new "色彩配置"
# game/choose_theme.rpy:444
# game/choose_theme.rpy:480
old "Continue"
new "繼續"
+410 -349
View File
@@ -1,328 +1,21 @@
translate traditional_chinese strings:
# renpy/common/00action_file.rpy:118
# renpy/common/00action_file.rpy:142
old "%b %d, %H:%M"
new "%%m月%d日, %H:%M"
new "%m月%d日, %H:%M"
translate traditional_chinese strings:
# renpy/common/00gltest.rpy:50
old "Graphics Acceleration"
new "圖形加速"
# renpy/common/00gltest.rpy:54
old "Automatically Choose"
new "自動選擇"
# renpy/common/00gltest.rpy:59
old "Force Angle/DirectX Renderer"
new "強制 Angle/DirectX 渲染"
# renpy/common/00gltest.rpy:63
old "Force OpenGL Renderer"
new "強制 OpenGL 渲染"
# renpy/common/00gltest.rpy:67
old "Force Software Renderer"
new "強制軟體渲染"
# renpy/common/00gltest.rpy:73
old "Changes will take effect the next time this program is run."
new "更改將會在下次啟動程式時生效。"
# renpy/common/00gltest.rpy:77
old "Quit"
new "離開"
# renpy/common/00gltest.rpy:82
old "Return"
new "返回"
# renpy/common/00gltest.rpy:112
old "Performance Warning"
new "效能警告"
# renpy/common/00gltest.rpy:117
old "This computer is using software rendering."
new "該電腦正在使用軟體渲染。"
# renpy/common/00gltest.rpy:119
old "This computer is not using shaders."
new "該電腦沒有使用著色器"
# renpy/common/00gltest.rpy:121
old "This computer is displaying graphics slowly."
new "該電腦圖形顯示緩慢。"
# renpy/common/00gltest.rpy:123
old "This computer has a problem displaying graphics: [problem]."
new "該電腦圖形顯示出錯:[problem]。"
# renpy/common/00gltest.rpy:128
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
new "目前的圖形驅動程式版本可能過舊或者運作不正確。這樣會導致圖形顯示緩慢或者錯誤。升級 DirectX 可能會解決該問題。"
# renpy/common/00gltest.rpy:130
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new "目前圖形驅動程式版本可能過舊或者運作不正確。這樣會導致圖形顯示緩慢或者錯誤。"
# renpy/common/00gltest.rpy:135
old "Update DirectX"
new "更新 DirectX"
# renpy/common/00gltest.rpy:141
old "Continue, Show this warning again"
new "繼續,下次再顯示該警告"
# renpy/common/00gltest.rpy:145
old "Continue, Don't show warning again"
new "繼續,不再顯示該警告"
# renpy/common/00gltest.rpy:171
old "Updating DirectX."
new "正在更新 DirectX。"
# renpy/common/00gltest.rpy:175
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
new "DirectX 線上安裝已啟動。將會最小化到狀態列中。請按照說明安裝 DirectX。"
# renpy/common/00gltest.rpy:179
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
new "{b}警告:{/b} Microsoft's DirectX 線上安裝程式會預設安裝 Bing 瀏覽器工具列。如果您不需要安裝這個工具列,請取消勾選對應選項。"
# renpy/common/00gltest.rpy:183
old "When setup finishes, please click below to restart this program."
new "當安裝完成後請點選下方來重新啟動應用程式。"
# renpy/common/00gltest.rpy:185
old "Restart"
new "重新啟動"
translate traditional_chinese strings:
# renpy/common/00keymap.rpy:167
old "Saved screenshot as %s."
new "儲存螢幕截圖為 %s。"
translate traditional_chinese strings:
# renpy/common/00layout.rpy:439
old "Are you sure?"
new "是否確認?"
# renpy/common/00layout.rpy:443
old "Are you sure you want to quit?"
new "您確定您要離開嗎?"
# renpy/common/00layout.rpy:444
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "您確定您想回到標題畫面嗎?\n這將使您失去所有未儲存的進度。"
# renpy/common/00layout.rpy:441
old "Are you sure you want to overwrite your save?"
new "您確定您要覆寫您的存檔?"
# renpy/common/00layout.rpy:442
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "載入將會失去所有未儲存的進度。\n您確定您要這麼做嗎?"
# renpy/common/00layout.rpy:440
old "Are you sure you want to delete this save?"
new "您確定您要刪掉這份存檔嗎?"
translate traditional_chinese strings:
# renpy/common/00library.rpy:77
old "Skip Mode"
new "跳過對話模式"
# renpy/common/00library.rpy:80
old "Fast Skip Mode"
new "快速跳過對話模式"
translate traditional_chinese strings:
# renpy/common/00updater.rpy:1258
old "Updater"
new "更新"
# renpy/common/00updater.rpy:1267
old "This program is up to date."
new "該程式已是最新版本。"
# renpy/common/00updater.rpy:1269
old "[u.version] is available. Do you want to install it?"
new "[u.version] 已釋出。是否確認安裝?"
# renpy/common/00updater.rpy:1271
old "Preparing to download the updates."
new "正在準備下載更新。"
# renpy/common/00updater.rpy:1273
old "Downloading the updates."
new "正在下載更新。"
# renpy/common/00updater.rpy:1275
old "Unpacking the updates."
new "解壓縮更新檔案。"
# renpy/common/00updater.rpy:1279
old "The updates have been installed. The program will restart."
new "該更新檔案已安裝,程式將會重新啟動。"
# renpy/common/00updater.rpy:1281
old "The updates have been installed."
new "已完成更新。"
# renpy/common/00updater.rpy:1283
old "The updates were cancelled."
new "已取消更新。"
translate traditional_chinese strings:
# renpy/common/_compat/gamemenu.rpym:180
old "Empty Slot."
new "空白欄位"
# renpy/common/_compat/gamemenu.rpym:337
old "Previous"
new "上一頁"
# renpy/common/_compat/gamemenu.rpym:344
old "Next"
new "下一頁"
translate traditional_chinese strings:
# renpy/common/_compat/preferences.rpym:411
old "Joystick Mapping"
new "遊戲桿映射"
translate traditional_chinese strings:
# renpy/common/_errorhandling.rpym:408
old "An exception has occurred."
new "發生一個異常狀況。"
# renpy/common/_errorhandling.rpym:434
old "Rollback"
new "回滾"
# renpy/common/_errorhandling.rpym:436
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "嘗試回滾到先前的狀態,使您可以存檔或者選擇不同選項。"
# renpy/common/_errorhandling.rpym:439
old "Ignore"
new "忽略"
# renpy/common/_errorhandling.rpym:441
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "忽略異常,讓您可以繼續。這通常會產生額外的錯誤。"
# renpy/common/_errorhandling.rpym:444
old "Reload"
new "重新載入"
# renpy/common/_errorhandling.rpym:446
old "Reloads the game from disk, saving and restoring game state if possible."
new "從硬碟重新載入遊戲,請您儲存遊戲狀態。"
# renpy/common/_errorhandling.rpym:448
old "Open Traceback"
new "開啟回溯"
# renpy/common/_errorhandling.rpym:450
old "Opens the traceback.txt file in a text editor."
new "在編輯器中開啟回溯檔案(traceback.txt)。"
# renpy/common/_errorhandling.rpym:456
old "Quits the game."
new "離開遊戲。"
# renpy/common/_errorhandling.rpym:483
old "Parsing the script failed."
new "解析腳本失敗。"
# renpy/common/_errorhandling.rpym:510
old "Open Parse Errors"
new "開啟解析錯誤"
# renpy/common/_errorhandling.rpym:512
old "Opens the errors.txt file in a text editor."
new "在編輯器中開啟解析錯誤檔案(errors.txt)。"
translate traditional_chinese strings:
# renpy/common/_layout/classic_load_save.rpym:152
old "a"
new "a"
# renpy/common/_layout/classic_load_save.rpym:161
old "q"
new "q"
translate traditional_chinese strings:
# renpy/common/00action_file.rpy:587
# renpy/common/00action_file.rpy:621
old "Quick save complete."
new "快速儲存。"
translate traditional_chinese strings:
# renpy/common/00gallery.rpy:521
old "Image [index] of [count] locked."
new "[count]個圖片中的第[index]個圖片被鎖定。"
# renpy/common/00gallery.rpy:539
old "prev"
new "上一頁"
# renpy/common/00gallery.rpy:540
old "next"
new "下一頁"
# renpy/common/00gallery.rpy:541
old "slideshow"
new "幻燈片"
# renpy/common/00gallery.rpy:542
old "return"
new "返回"
translate traditional_chinese strings:
# renpy/common/00layout.rpy:427
old "Are you sure you want to begin skipping?"
new "是否確定開始略過?"
# renpy/common/00layout.rpy:428
old "Are you sure you want to skip to the next choice?"
new "是否確定跳到下一個選項?"
# renpy/common/00layout.rpy:429
old "Are you sure you want to skip to unseen dialogue or the next choice?"
new "是否確定略過未看過的訊息或下一選項?"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/00console.rpy:179
old "%(version)s console, originally by Shiz, C, and delta.\n"
new "%(version)s 控制臺,作者: Shiz, C, delta"
new "%(version)s 控制臺, 作者: Shiz, C, delta\n"
# renpy/common/00console.rpy:180
old "Press <esc> to exit console. Type help for help.\n"
@@ -346,11 +39,11 @@ translate traditional_chinese strings:
# renpy/common/00console.rpy:407
old " <renpy script statement>: run the statement\n"
new " <renpy script statement>:運行語句\n"
new "<Ren'py 腳本語句>: 運行語句\n"
# renpy/common/00console.rpy:409
old " <python expression or statement>: run the expression or statement"
new " <python expression or statement>:運行運算式或語句"
new " <Python 運算式或語句>: 運行運算式或語句"
# renpy/common/00console.rpy:417
old "clear: clear the console history"
@@ -362,11 +55,11 @@ translate traditional_chinese strings:
# renpy/common/00console.rpy:429
old "load <slot>: loads the game from slot"
new "load <slot>:載入遊戲存檔(以 slot 為存檔號)"
new "load <檔位>: 從檔位載入遊戲"
# renpy/common/00console.rpy:442
old "save <slot>: saves the game in slot"
new "save <slot>:儲存遊戲存檔(以 slot 為存檔號)"
new "save <檔位>: 保存遊戲到檔位"
# renpy/common/00console.rpy:453
old "reload: reloads the game, refreshing the scripts"
@@ -374,20 +67,313 @@ translate traditional_chinese strings:
# renpy/common/00console.rpy:461
old "watch <expression>: watch a python expression"
new "watch <expression>: 監視一個 python 運算式"
new "watch <運算式>: 監視一個 python 運算式"
# renpy/common/00console.rpy:470
old "unwatch <expression>: stop watching an expression"
new "unwatch <expression>:停止監視某個運算式"
new "unwatch <運算式>: 停止監視某個運算式"
# renpy/common/00console.rpy:478
old "unwatchall: stop watching all expressions"
new "unwatchall:停止監視索引運算式"
new "unwatchall: 停止監視索引運算式"
# renpy/common/00console.rpy:484
old "jump <label>: jumps to label"
new "jump <label>: 跳移至標籤"
new "jump <標籤>: 跳移至標籤"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/00gallery.rpy:561
old "Image [index] of [count] locked."
new "[count] 個圖片中的第 [index] 個圖片被鎖定。"
# renpy/common/00gallery.rpy:581
old "prev"
new "上一頁"
# renpy/common/00gallery.rpy:582
old "next"
new "下一頁"
# renpy/common/00gallery.rpy:583
old "slideshow"
new "幻燈片"
# renpy/common/00gallery.rpy:584
old "return"
new "返回"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/00gltest.rpy:68
old "Graphics Acceleration"
new "圖形加速"
# renpy/common/00gltest.rpy:72
old "Automatically Choose"
new "自動選擇"
# renpy/common/00gltest.rpy:77
old "Force Angle/DirectX Renderer"
new "強制 Angle/DirectX 渲染"
# renpy/common/00gltest.rpy:81
old "Force OpenGL Renderer"
new "強制 OpenGL 渲染"
# renpy/common/00gltest.rpy:85
old "Force Software Renderer"
new "強制軟體渲染"
# renpy/common/00gltest.rpy:91
old "Changes will take effect the next time this program is run."
new "變更將會在下次啟動程式時生效。"
# renpy/common/00gltest.rpy:95
old "Quit"
new "離開"
# renpy/common/00gltest.rpy:100
old "Return"
new "返回"
# renpy/common/00gltest.rpy:130
old "Performance Warning"
new "效能警告"
# renpy/common/00gltest.rpy:135
old "This computer is using software rendering."
new "該電腦正在使用軟體渲染。"
# renpy/common/00gltest.rpy:137
old "This computer is not using shaders."
new "該電腦沒有使用著色器"
# renpy/common/00gltest.rpy:139
old "This computer is displaying graphics slowly."
new "該電腦圖形顯示緩慢。"
# renpy/common/00gltest.rpy:141
old "This computer has a problem displaying graphics: [problem]."
new "該電腦圖形顯示出錯:[problem]。"
# renpy/common/00gltest.rpy:146
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
new "目前的圖形驅動程式版本可能過舊或者運作不正確。這樣會導致圖形顯示緩慢或者錯誤。更新 DirectX 可能會解決該問題。"
# renpy/common/00gltest.rpy:148
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new "目前圖形驅動程式版本可能過舊或者運作不正確。這樣會導致圖形顯示緩慢或者錯誤。"
# renpy/common/00gltest.rpy:153
old "Update DirectX"
new "更新 DirectX"
# renpy/common/00gltest.rpy:159
old "Continue, Show this warning again"
new "繼續,下次再顯示此警告"
# renpy/common/00gltest.rpy:163
old "Continue, Don't show warning again"
new "繼續,不再顯示此警告"
# renpy/common/00gltest.rpy:189
old "Updating DirectX."
new "正在更新 DirectX。"
# renpy/common/00gltest.rpy:193
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
new "DirectX 線上安裝已啟動。將會最小化到狀態列中。請按照說明安裝 DirectX。"
# renpy/common/00gltest.rpy:197
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
new "{b}警告:{/b} Microsoft's DirectX 線上安裝程式會預設安裝 Bing 瀏覽器工具列。如果您不需要安裝這個工具列,請取消勾選對應選項。"
# renpy/common/00gltest.rpy:201
old "When setup finishes, please click below to restart this program."
new "當安裝完成後請點選下方來重新啟動應用程式。"
# renpy/common/00gltest.rpy:203
old "Restart"
new "重新啟動"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/00keymap.rpy:206
old "Saved screenshot as %s."
new "儲存螢幕截圖為 %s。"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/00layout.rpy:444
old "Are you sure?"
new "是否確認?"
# renpy/common/00layout.rpy:445
old "Are you sure you want to delete this save?"
new "您確定您要刪掉這份存檔嗎?"
# renpy/common/00layout.rpy:446
old "Are you sure you want to overwrite your save?"
new "您確定您要覆寫您的存檔嗎?"
# renpy/common/00layout.rpy:447
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "載入將會失去所有未儲存的進度。\n您確定您要這麼做嗎?"
# renpy/common/00layout.rpy:448
old "Are you sure you want to quit?"
new "您確定您要離開嗎?"
# renpy/common/00layout.rpy:449
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "您確定您想回到標題畫面嗎?\n這將使您失去所有未儲存的進度。"
# renpy/common/00layout.rpy:450
old "Are you sure you want to begin skipping?"
new "是否確定開始略過?"
# renpy/common/00layout.rpy:451
old "Are you sure you want to skip to the next choice?"
new "是否確定跳到下一個選項?"
# renpy/common/00layout.rpy:452
old "Are you sure you want to skip to unseen dialogue or the next choice?"
new "是否確定略過未看過的訊息或下一選項?"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/00library.rpy:149
old "Skip Mode"
new "略過對話模式"
# renpy/common/00library.rpy:152
old "Fast Skip Mode"
new "快速略過對話模式"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/00preferences.rpy:387
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "Clipboard voicing 已啟用。按 'shift+C' 禁用"
# renpy/common/00preferences.rpy:389
old "Self-voicing enabled. Press 'v' to disable."
new "Self-voicing 已啟用。按 'v' 禁用"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/00updater.rpy:362
old "The Ren'Py Updater is not supported on mobile devices."
new "Ren'Py 的更新不支援在行動裝置上使用。"
# renpy/common/00updater.rpy:478
old "An error is being simulated."
new "正在類比錯誤。"
# renpy/common/00updater.rpy:654
old "Either this project does not support updating, or the update status file was deleted."
new "此專案不支援更新,或者更新狀態檔已被刪除。"
# renpy/common/00updater.rpy:668
old "This account does not have permission to perform an update."
new "此帳戶不具有執行更新的權限。"
# renpy/common/00updater.rpy:671
old "This account does not have permission to write the update log."
new "此帳戶沒有更新日誌的寫入權限。"
# renpy/common/00updater.rpy:696
old "Could not verify update signature."
new "無法驗證更新簽名。"
# renpy/common/00updater.rpy:956
old "The update file was not downloaded."
new "不下載更新檔。"
# renpy/common/00updater.rpy:974
old "The update file does not have the correct digest - it may have been corrupted."
new "無法驗證更新檔案 — 它可能已損壞。"
# renpy/common/00updater.rpy:1030
old "While unpacking {}, unknown type {}."
new "正在解壓缩 {},未知類型 {}。"
# renpy/common/00updater.rpy:1380
old "Updater"
new "更新"
# renpy/common/00updater.rpy:1389
old "This program is up to date."
new "該程式已是最新版本。"
# renpy/common/00updater.rpy:1391
old "[u.version] is available. Do you want to install it?"
new "[u.version] 已釋出。是否確認安裝?"
# renpy/common/00updater.rpy:1393
old "Preparing to download the updates."
new "正在準備下載更新。"
# renpy/common/00updater.rpy:1395
old "Downloading the updates."
new "正在下載更新。"
# renpy/common/00updater.rpy:1397
old "Unpacking the updates."
new "解壓縮更新檔案。"
# renpy/common/00updater.rpy:1401
old "The updates have been installed. The program will restart."
new "該更新檔案已安裝,程式將會重新啟動。"
# renpy/common/00updater.rpy:1403
old "The updates have been installed."
new "已完成更新。"
# renpy/common/00updater.rpy:1405
old "The updates were cancelled."
new "已取消更新。"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/_compat/gamemenu.rpym:198
old "Empty Slot."
new "空白檔位"
# renpy/common/_compat/gamemenu.rpym:355
old "Previous"
new "上一頁"
# renpy/common/_compat/gamemenu.rpym:362
old "Next"
new "下一頁"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/_compat/preferences.rpym:428
old "Joystick Mapping"
new "遊戲桿映射"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
@@ -397,11 +383,11 @@ translate traditional_chinese strings:
# renpy/common/_developer/developer.rpym:67
old "Reload Game (Shift+R)"
new "重新載入遊戲Shift+R"
new "重新載入遊戲 (Shift+R)"
# renpy/common/_developer/developer.rpym:69
old "Console (Shift+O)"
new "控制臺(Shift+O)"
new "控制臺 (Shift+O)"
# renpy/common/_developer/developer.rpym:71
old "Variable Viewer"
@@ -427,72 +413,147 @@ translate traditional_chinese strings:
old "Hide Image Load Log"
new "隱藏圖片載入記錄"
# renpy/common/_developer/developer.rpym:149
# renpy/common/_developer/developer.rpym:150
old "No variables have changed since the game started."
new "遊戲開始至此沒有任何變數被改變。"
# renpy/common/_developer/developer.rpym:152
# renpy/common/_developer/developer.rpym:153
old "Return to the developer menu"
new "回到開發者選單"
# renpy/c72
old "{b}Missing Images{/b}"
new "{b}丟失圖片{/b}"
# renpy/common/_developer/developer.rpym:424
# renpy/common/_developer/developer.rpym:398
old "Rectangle: %r"
new "矩形區域%r"
new "矩形區域: %r"
# renpy/common/_developer/developer.rpym:429
# renpy/common/_developer/developer.rpym:403
old "Mouse position: %r"
new "滑鼠位置%r"
new "滑鼠位置: %r"
# renpy/common/_developer/developer.rpym:431
# renpy/common/_developer/developer.rpym:408
old "Right-click or escape to quit."
new "點選滑鼠右鍵或者按 ESC 鍵來退出。"
new "點選滑鼠右鍵或者按 Esc 鍵來退出。"
# renpy/common/_developer/developer.rpym:482
# renpy/common/_developer/developer.rpym:437
old "Rectangle copied to clipboard."
new "選擇區域複製到剪貼簿。"
# renpy/common/_developer/developer.rpym:440
old "Position copied to clipboard."
new "選擇位置複製到剪貼簿。"
# renpy/common/_developer/developer.rpym:471
old "Done"
new "完成"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/_developer/inspector.rpym:43
# renpy/common/_developer/inspector.rpym:46
old "Displayable Inspector"
new "Displayable 檢閱器"
# renpy/common/_developer/inspector.rpym:49
# renpy/common/_developer/inspector.rpym:52
old "Nothing to inspect."
new "沒有東西被檢閱"
# renpy/common/_developer/inspector.rpym:58
# renpy/common/_developer/inspector.rpym:70
old "Size"
new "大小"
# renpy/common/_developer/inspector.rpym:63
# renpy/common/_developer/inspector.rpym:74
old "Style"
new "風格"
# renpy/common/_developer/inspector.rpym:123
old "Inspecting Styles of [displayable_name!q]"
new "檢閱[displayable_name!q]的風格"
# renpy/common/_developer/inspector.rpym:80
old "Location"
new "位置"
# renpy/common/_developer/inspector.rpym:135
old "displayable:"
new "displayable"
# renpy/common/_developer/inspector.rpym:142
old "Inspecting Styles of [displayable_name!q]"
new "檢閱 [displayable_name!q] 的風格"
# renpy/common/_developer/inspector.rpym:155
old "displayable:"
new "Displayable:"
# renpy/common/_developer/inspector.rpym:162
old " (no properties affect the displayable)"
new " (沒有偏好的可顯示屬性)"
# renpy/common/_developer/inspector.rpym:144
# renpy/common/_developer/inspector.rpym:164
old " (default properties omitted)"
new " (略預設屬性)"
new " (略預設屬性)"
# renpy/common/_developer/inspector.rpym:174
# renpy/common/_developer/inspector.rpym:206
old "<repr() failed>"
new "<repr() failed>"
new "<repr() 失敗>"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/_errorhandling.rpym:450
old "An exception has occurred."
new "發生一個異常狀況。"
# renpy/common/_errorhandling.rpym:476
old "Rollback"
new "回滾"
# renpy/common/_errorhandling.rpym:478
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "嘗試回滾到先前的狀態,使您可以存檔或者選擇不同選項。"
# renpy/common/_errorhandling.rpym:481
old "Ignore"
new "忽略"
# renpy/common/_errorhandling.rpym:483
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "忽略異常,讓您可以繼續。這通常會產生額外的錯誤。"
# renpy/common/_errorhandling.rpym:486
old "Reload"
new "重新載入"
# renpy/common/_errorhandling.rpym:488
old "Reloads the game from disk, saving and restoring game state if possible."
new "從硬碟重新載入遊戲,請您儲存遊戲狀態。"
# renpy/common/_errorhandling.rpym:490
old "Open Traceback"
new "開啟回溯"
# renpy/common/_errorhandling.rpym:492
old "Opens the traceback.txt file in a text editor."
new "在編輯器中開啟回溯檔案。"
# renpy/common/_errorhandling.rpym:498
old "Quits the game."
new "離開遊戲。"
# renpy/common/_errorhandling.rpym:525
old "Parsing the script failed."
new "解析腳本失敗。"
# renpy/common/_errorhandling.rpym:552
old "Open Parse Errors"
new "開啟解析錯誤"
# renpy/common/_errorhandling.rpym:554
old "Opens the errors.txt file in a text editor."
new "在編輯器中開啟解析錯誤檔案。"
# TODO: Translation updated at 2015-03-26 20:17
translate traditional_chinese strings:
# renpy/common/_layout/classic_load_save.rpym:170
old "a"
new "a"
# renpy/common/_layout/classic_load_save.rpym:179
old "q"
new "q"
@@ -1,49 +1,39 @@
translate traditional_chinese strings:
# game/distribute.rpy:333
old "Nothing to do."
new "什麼都不做。"
# game/distribute.rpy:337
old "Scanning project files..."
new "掃描專案檔案..."
# game/distribute.rpy:344
old "Scanning Ren'Py files..."
new "掃描 Ren'Py 檔案..."
# game/distribute.rpy:494
old "Archiving files..."
new "壓縮檔案..."
# game/distribute.rpy:745
old "Writing the [variant] [format] package."
new "寫入 [variant] [format] 套件。"
# game/distribute.rpy:758
old "Making the [variant] update zsync file."
new "新增 [variant] 更新 zsync 檔案。"
# game/distribute.rpy:854
old "Processed {b}[complete]{/b} of {b}[total]{/b} files."
new "完成處理 {b}[complete]{/b} ,共 {b}[total]{/b}個檔案。"
# game/distribute.rpy:915
old "All packages have been built.\n\nDue to the presence of permission information, unpacking and repacking the Linux and Macintosh distributions on Windows is not supported."
new "所有套件已被建立。\n\n由於含有授權資訊存在,因此在 Windows 中不支援解開和重新包裝 Linux 及 Mac 的套件。"
translate traditional_chinese strings:
# game/distribute.rpy:358
old "No packages are selected, so there's nothing to do."
new "沒有選擇套件,沒有可以處理的事情。"
translate traditional_chinese strings:
# game/distribute.rpy:335
old "Building distributions failed:\n\nThe build.directory_name variable may not include the space, colon, or semicolon characters."
new "建立釋出版失敗:\n\n build.directory_name 變數可能包含空格,冒號或分號。"
# game/distribute.rpy:381
old "No packages are selected, so there's nothing to do."
new "沒有選擇套件,沒有可以處理的事情。"
# game/distribute.rpy:386
old "Scanning project files..."
new "掃描專案檔案..."
# game/distribute.rpy:396
old "Scanning Ren'Py files..."
new "掃描 Ren'Py 檔案..."
# game/distribute.rpy:444
old "All packages have been built.\n\nDue to the presence of permission information, unpacking and repacking the Linux and Macintosh distributions on Windows is not supported."
new "所有套件已被建立。\n\n由於含有授權資訊存在,因此在 Windows 中不支援解開和重新包裝 Linux 及 Mac 的套件。"
# game/distribute.rpy:568
old "Archiving files..."
new "壓縮檔案..."
# game/distribute.rpy:845
old "Writing the [variant] [format] package."
new "寫入 [variant] [format] 套件。"
# game/distribute.rpy:858
old "Making the [variant] update zsync file."
new "新增 [variant] 更新 zsync 檔案。"
# game/distribute.rpy:957
old "Processed {b}[complete]{/b} of {b}[total]{/b} files."
new "完成處理 {b}[complete]{/b} ,共 {b}[total]{/b}個檔案。"
@@ -1,47 +1,63 @@
translate traditional_chinese strings:
# game/distribute_gui.rpy:139
# game/distribute_gui.rpy:157
old "Build Distributions: [project.current.name!q]"
new "建立釋出版:[project.current.name!q]"
# game/distribute_gui.rpy:154
# game/distribute_gui.rpy:171
old "Directory Name:"
new "目錄名稱:"
# game/distribute_gui.rpy:158
# game/distribute_gui.rpy:175
old "Executable Name:"
new "執行檔案名稱:"
# game/distribute_gui.rpy:167
# game/distribute_gui.rpy:185
old "Actions:"
new "動作:"
# game/distribute_gui.rpy:175
# game/distribute_gui.rpy:193
old "Edit options.rpy"
new "編輯 options.rpy"
# game/distribute_gui.rpy:176
# game/distribute_gui.rpy:194
old "Add from clauses to calls, once"
new "向 call 語句添加 from 從句, 一次"
# game/distribute_gui.rpy:195
old "Refresh"
new "重新整理"
# game/distribute_gui.rpy:193
# game/distribute_gui.rpy:212
old "Build Packages:"
new "建立套件:"
# game/distribute_gui.rpy:208
# game/distribute_gui.rpy:231
old "Options:"
new "選項:"
# game/distribute_gui.rpy:236
old "Build Updates"
new "建立更新檔"
# game/distribute_gui.rpy:212
# game/distribute_gui.rpy:238
old "Add from clauses to calls"
new "向 call 語句添加 from 從句"
# game/distribute_gui.rpy:242
old "Build"
new "建立"
# game/distribute_gui.rpy:219
# game/distribute_gui.rpy:246
old "Adding from clauses to call statements that do not have them."
new "正在向 call 語句添加缺失的 from 從句"
# game/distribute_gui.rpy:267
old "Errors were detected when running the project. Please ensure the project runs without errors before building distributions."
new "當運行專案時發生了錯誤。在開始釋出前請確保專案運行無誤。"
# game/distribute_gui.rpy:236
# game/distribute_gui.rpy:284
old "Your project does not contain build information. Would you like to add build information to the end of options.rpy?"
new "您的專案不包含建置資訊。是否加入建置資訊到 options.rpy"
+33 -36
View File
@@ -1,58 +1,55 @@
translate traditional_chinese strings:
# game/editor.rpy:120
# game/editor.rpy:150
old "{b}Recommended.{/b} A beta editor with an easy to use interface and features that aid in development, such as spell-checking. Editra currently lacks the IME support required for Chinese, Japanese, and Korean text input."
new "{b}推薦{/b} 一個有簡單易用介面和功能的測試版編輯器能夠幫助開發,例如拼字的校對功能。Editra 目前缺乏中文、日文,韓文的輸入的 IME 支援。"
# game/editor.rpy:121
# game/editor.rpy:151
old "{b}Recommended.{/b} A beta editor with an easy to use interface and features that aid in development, such as spell-checking. Editra currently lacks the IME support required for Chinese, Japanese, and Korean text input. On Linux, Editra requires wxPython."
new "{b}推薦{/b} 一個有簡單易用的介面和功能的測試版編輯器能夠幫助開發,例如拼字的校對功能。Editra 現在沒有中文,日文,韓文的輸入功能。在 linux 中 Editra 需要 wxPython(模組支援)。"
# game/editor.rpy:137
old "The may have occured because wxPython is not installed on this system."
new "這可能是由於 wxPython 安裝在系統中而出現的。"
# game/editor.rpy:167
old "This may have occured because wxPython is not installed on this system."
new "這可能是因為 wxPython 沒有被安裝在當前系統中而發生的。"
# game/editor.rpy:144
# game/editor.rpy:169
old "Up to 22 MB download required."
new "22 MB 需要下載。"
# game/editor.rpy:157
old "1.8 MB download required."
new "1.8 MB 需要下載。"
# game/editor.rpy:158
old "This may have occured because Java is not installed on this system."
new "這可能是由於 Java 未安裝在此系統中而出現的。"
# game/editor.rpy:327
old "An exception occured while launching the text editor:\n[exception!q]"
new "啟動以下編輯器出現異常:\n[exception!q]"
# game/editor.rpy:378
old "Select Editor"
new "選擇編輯器"
# game/editor.rpy:393
old "A text editor is the program you'll use to edit Ren'Py script files. Here, you can select the editor Ren'Py will use. If not already present, the editor will be automatically downloaded and installed."
new "文字編輯器就是您用於編輯 Ren'py 腳本的程式。這裡您可以選擇 Ren'py 會使用的編輯器。如果選定則編輯器將會自動下載並安裝。"
# game/editor.rpy:415
old "Cancel"
new "取消"
translate traditional_chinese strings:
# game/editor.rpy:155
# game/editor.rpy:182
old "A mature editor that requires Java."
new "一個成熟的編輯器,它需要 Java。"
# game/editor.rpy:164
# game/editor.rpy:182
old "1.8 MB download required."
new "1.8 MB 需要下載。"
# game/editor.rpy:182
old "This may have occured because Java is not installed on this system."
new "這可能是因為 Java 沒有被安裝在當前系統中而發生的。"
# game/editor.rpy:191
old "Invokes the editor your operating system has associated with .rpy files."
new "調用作業系統已與 .rpy 檔案關聯的編輯器。"
# game/editor.rpy:180
# game/editor.rpy:207
old "Prevents Ren'Py from opening a text editor."
new "防止 Ren'Py 開啟文字編輯器。"
# game/editor.rpy:359
old "An exception occured while launching the text editor:\n[exception!q]"
new "啟動以下編輯器出現異常:\n[exception!q]"
# game/editor.rpy:457
old "Select Editor"
new "選擇編輯器"
# game/editor.rpy:472
old "A text editor is the program you'll use to edit Ren'Py script files. Here, you can select the editor Ren'Py will use. If not already present, the editor will be automatically downloaded and installed."
new "文字編輯器是您用於編輯 Ren'py 腳本的程式。在這裡您可以選擇 Ren'py 會使用到編輯器。如果選定則編輯器將會自動下載並安裝。"
# game/editor.rpy:494
old "Cancel"
new "取消"
@@ -1,93 +1,115 @@
translate traditional_chinese strings:
# game/front_page.rpy:79
old "+ Create New Project"
new "+ 新增專案"
# game/front_page.rpy:35
old "Open [text] directory."
new "開啟 [text] 目錄。"
# game/front_page.rpy:90
# game/front_page.rpy:91
old "PROJECTS:"
new "專案列表:"
# game/front_page.rpy:93
old "refresh"
new "重新整理"
# game/front_page.rpy:120
old "+ Create New Project"
new "+ 新建專案"
# game/front_page.rpy:132
old "Launch Project"
new "啟動專案"
# game/front_page.rpy:111
old "Tutorial"
new "教程"
# game/front_page.rpy:112
old "The Question"
new "問題"
# game/front_page.rpy:128
old "Active Project"
new "活動專案"
# game/front_page.rpy:136
old "Open Directory"
new "開啟目錄"
# game/front_page.rpy:141
old "game"
new "game"
# game/front_page.rpy:142
old "base"
new "base"
# game/front_page.rpy:148
old "Edit File"
new "編輯檔案"
# game/front_page.rpy:156
old "All script files"
new "開啟所有檔案"
# game/front_page.rpy:165
old "Navigate Script"
new "腳本導航"
# game/front_page.rpy:176
old "Check Script (Lint)"
new "檢查腳本(Lint"
# game/front_page.rpy:177
old "Change Theme"
new "變更介面主題"
# game/front_page.rpy:178
old "Delete Persistent"
new "刪除永久性資料"
# game/front_page.rpy:186
old "Build Distributions"
new "建立釋出版"
# game/front_page.rpy:188
old "Generate Translations"
new "產生翻譯"
# game/front_page.rpy:204
old "Checking script for potential problems..."
new "檢查腳本中的潛在錯誤..."
# game/front_page.rpy:219
old "Deleting persistent data..."
new "刪除永久性資料..."
translate traditional_chinese strings:
# game/front_page.rpy:69
old "PROJECTS:"
new "專案列表:"
# game/front_page.rpy:122
old "[p.name!q] (template)"
new "[p.name!q] (template)"
# game/front_page.rpy:215
# game/front_page.rpy:150
old "Select project [text]."
new "選擇專案 [text]。"
# game/front_page.rpy:166
old "Tutorial"
new "Tutorial"
# game/front_page.rpy:167
old "The Question"
new "The Question"
# game/front_page.rpy:183
old "Active Project"
new "活動專案"
# game/front_page.rpy:191
old "Open Directory"
new "開啟目錄"
# game/front_page.rpy:196
old "game"
new "game"
# game/front_page.rpy:197
old "base"
new "base"
# game/front_page.rpy:204
old "Edit File"
new "編輯檔案"
# game/front_page.rpy:212
old "All script files"
new "開啟所有檔案"
# game/front_page.rpy:221
old "Navigate Script"
new "腳本導航"
# game/front_page.rpy:232
old "Check Script (Lint)"
new "檢查腳本 (Lint)"
# game/front_page.rpy:233
old "Change Theme"
new "變更介面主題"
# game/front_page.rpy:234
old "Delete Persistent"
new "刪除持久性資料"
# game/front_page.rpy:235
old "Force Recompile"
new "強制重新編譯"
# game/front_page.rpy:243
old "Build Distributions"
new "建立釋出版"
# game/front_page.rpy:245
old "Android"
new "Android"
# game/front_page.rpy:217
old "Extract Dialogue"
new "產生對話框"
# game/front_page.rpy:246
old "iOS"
new "iOS"
# game/front_page.rpy:247
old "Generate Translations"
new "產生翻譯檔"
# game/front_page.rpy:248
old "Extract Dialogue"
new "提取對話"
# game/front_page.rpy:264
old "Checking script for potential problems..."
new "檢查腳本中的潛在錯誤..."
# game/front_page.rpy:279
old "Deleting persistent data..."
new "正在刪除持久性資料..."
# game/front_page.rpy:287
old "Recompiling all rpy files into rpyc files..."
new "重編譯所有 rpy 檔案為 rpyc 檔案……"
@@ -1,90 +1,83 @@
translate traditional_chinese strings:
# game/interface.rpy:89
# game/interface.rpy:107
old "Documentation"
new "文件"
# game/interface.rpy:90
# game/interface.rpy:108
old "Ren'Py Website"
new "Ren'Py網站"
# game/interface.rpy:91
# game/interface.rpy:109
old "Ren'Py Games List"
new "Ren'Py遊戲列表"
# game/interface.rpy:92
# game/interface.rpy:110
old "About"
new "關於"
# game/interface.rpy:99
# game/interface.rpy:117
old "update"
new "更新"
# game/interface.rpy:101
# game/interface.rpy:119
old "preferences"
new "設定"
# game/interface.rpy:102
# game/interface.rpy:120
old "quit"
new "離開"
# game/interface.rpy:149
# game/interface.rpy:192
old "Yes"
new "確定"
# game/interface.rpy:151
# game/interface.rpy:194
old "No"
new "取消"
# game/interface.rpy:181
# game/interface.rpy:229
old "Due to package format limitations, non-ASCII file and directory names are not allowed."
new "由於套件格式的限制,非 ASCII 編碼的檔案和目錄將不被支援。"
# game/interface.rpy:183
old "[title]"
new "[title]"
# game/interface.rpy:248
# game/interface.rpy:321
old "ERROR"
new "錯誤"
# game/interface.rpy:280
# game/interface.rpy:350
old "While [what!q], an error occured:"
new "[what!q]時,出現錯誤:"
# game/interface.rpy:281
# game/interface.rpy:350
old "[exception!q]"
new "[exception!q]"
# game/interface.rpy:298
# game/interface.rpy:369
old "Text input may not contain the {{ or [[ characters."
new "文字輸入可能不包含{{ 或 [[ 字元。"
# game/interface.rpy:303
# game/interface.rpy:374
old "File and directory names may not contain / or \\."
new "檔案或目錄不包含/或\\。"
# game/interface.rpy:309
# game/interface.rpy:380
old "File and directory names must consist of ASCII characters."
new "檔案名稱和目錄名稱必須是 ASCII 字元。"
# game/interface.rpy:330
# game/interface.rpy:401
old "INFORMATION"
new "資訊"
# game/interface.rpy:373
# game/interface.rpy:448
old "PROCESSING"
new "正在處理"
# game/interface.rpy:390
# game/interface.rpy:465
old "QUESTION"
new "問題"
translate traditional_chinese strings:
# game/interface.rpy:456
# game/interface.rpy:478
old "CHOICE"
new "選擇"
@@ -0,0 +1,99 @@
translate traditional_chinese strings:
# game/ios.rpy:28
old "To build iOS packages, please download renios, unzip it, and place it into the Ren'Py directory. Then restart the Ren'Py launcher."
new "要建立 iOS 套件,請下載 renios,並解壓縮到 Ren'Py 目錄下。然後重新啟動 Ren'Py 啟動器。"
# game/ios.rpy:29
old "The directory in where Xcode projects will be placed has not been selected. Choose 'Select Directory' to select it."
new "從 '選擇目錄' ,請選擇 Xcode 專案所在的目錄。"
# game/ios.rpy:30
old "There is no Xcode project corresponding to the current Ren'Py project. Choose 'Create Xcode Project' to create one."
new "沒有對應於當前的 Ren'Py 專案 Xcode 專案。請從 '創建 Xcode 專案' 中創建。"
# game/ios.rpy:31
old "An Xcode project exists. Choose 'Update Xcode Project' to update it with the latest game files, or use Xcode to build and install it."
new "Xcode 專案已存在。'更新 Xcode 專案' 通過選擇更新到最新的遊戲檔,但要使用 Xcode 構建它,請安裝。"
# game/ios.rpy:33
old "Attempts to emulate an iPhone.\n\nTouch input is emulated through the mouse, but only when the button is held down."
new "模擬一臺 iPhone。\n\n當按鈕被按下時,觸控輸入會模擬為滑鼠。"
# game/ios.rpy:34
old "Attempts to emulate an iPad.\n\nTouch input is emulated through the mouse, but only when the button is held down."
new "模擬一個 iPad。\n\n當按鈕被按下時,觸控輸入會模擬為滑鼠。"
# game/ios.rpy:36
old "Selects the directory where Xcode projects will be placed."
new "選擇放置 Xcode 專案的目錄。"
# game/ios.rpy:37
old "Creates an Xcode project corresponding to the current Ren'Py project."
new "創建對應于當前的 Ren'Py 專案 Xcode 專案。"
# game/ios.rpy:38
old "Updates the Xcode project with the latest game files. This must be done each time the Ren'Py project changes."
new "更新 Xcode 專案和最新的遊戲檔案。每次進行時 Ren'py 專案將會變更。"
# game/ios.rpy:39
old "Opens the Xcode project in Xcode."
new "在 Xcode 中開啟 Xcode 專案。"
# game/ios.rpy:41
old "Opens the directory containing Xcode projects."
new "開啟包含 Xcode 專案的目錄。"
# game/ios.rpy:126
old "The Xcode project already exists. Would you like to rename the old project, and replace it with a new one?"
new "Xcode 專案已存在。你想要重命名舊的專案,並將它替換一個新的嗎?"
# game/ios.rpy:200
old "iOS: [project.current.name!q]"
new "iOS: [project.current.name!q]"
# game/ios.rpy:229
old "iPhone"
new "iPhone"
# game/ios.rpy:233
old "iPad"
new "iPad"
# game/ios.rpy:253
old "Select Xcode Projects Directory"
new "選擇 Xcode 專案目錄"
# game/ios.rpy:257
old "Create Xcode Project"
new "創建 Xcode 專案"
# game/ios.rpy:261
old "Update Xcode Project"
new "更新 Xcode 專案"
# game/ios.rpy:266
old "Launch Xcode"
new "啟動 Xcode"
# game/ios.rpy:301
old "Open Xcode Projects Directory"
new "開啟 Xcode 專案目錄"
# game/ios.rpy:334
old "Before packaging iOS apps, you'll need to download renios, Ren'Py's iOS support. Would you like to download renios now?"
new "在包裝 iOS 應用程式前,您須下載 reniosRen'Py 的 iOS 包裝程式。您要現在下載 renios 嗎?"
# game/ios.rpy:343
old "XCODE PROJECTS DIRECTORY"
new "XCODE PROJECTS DIRECTORY"
# game/ios.rpy:343
old "Please choose the Xcode Projects Directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"
new "請使用 Xcode 的目錄選擇器來選擇專案目錄。\n{b}目錄選擇視窗可能會開啟在本視窗後面。{/b}"
# game/ios.rpy:348
old "Ren'Py has set the Xcode Projects Directory to:"
new "Ren'Py 已經將 Xcode 專案目錄設定為:"
@@ -1,71 +1,67 @@
translate traditional_chinese strings:
# game/navigation.rpy:150
# game/navigation.rpy:168
old "Navigate: [project.current.name]"
new "導航:[project.current.name]"
# game/navigation.rpy:159
# game/navigation.rpy:177
old "Order: "
new "排序:"
# game/navigation.rpy:160
# game/navigation.rpy:178
old "alphabetical"
new "按字母順序"
# game/navigation.rpy:162
# game/navigation.rpy:180
old "by-file"
new "按檔案"
# game/navigation.rpy:164
# game/navigation.rpy:182
old "natural"
new "natural"
# game/navigation.rpy:168
old "refresh"
new "重新整理"
# game/navigation.rpy:176
# game/navigation.rpy:194
old "Category:"
new "類別:"
# game/navigation.rpy:178
# game/navigation.rpy:196
old "files"
new "檔案"
# game/navigation.rpy:179
# game/navigation.rpy:197
old "labels"
new "標籤"
# game/navigation.rpy:180
# game/navigation.rpy:198
old "defines"
new "定義"
# game/navigation.rpy:181
# game/navigation.rpy:199
old "transforms"
new "轉換"
# game/navigation.rpy:182
# game/navigation.rpy:200
old "screens"
new "螢幕"
# game/navigation.rpy:183
# game/navigation.rpy:201
old "callables"
new "可呼叫"
# game/navigation.rpy:184
# game/navigation.rpy:202
old "TODOs"
new "待辦事項"
# game/navigation.rpy:223
# game/navigation.rpy:241
old "+ Add script file"
new "+ 加入腳本檔案"
# game/navigation.rpy:231
# game/navigation.rpy:249
old "No TODO comments found.\n\nTo create one, include \"# TODO\" in your script."
new "沒有待辦的事項被發現。\n\n要建立一個包含\"# TODO\"到您的腳本中。"
new "沒有待辦的事項被發現。\n\n要建立一個包含# TODO到您的腳本中。"
# game/navigation.rpy:238
# game/navigation.rpy:256
old "The list of names is empty."
new "名稱清單為空。"
@@ -1,45 +1,35 @@
translate traditional_chinese strings:
# game/new_project.rpy:22
# game/new_project.rpy:40
old "Choose Project Template"
new "選擇專案模版"
# game/new_project.rpy:40
old "Please select a template to use for your new project. Ren'Py ships with a default template that creates an English-language game with standard screens."
new "請選擇一個用於新專案的模版。Ren'Py 中預設了一個標準視窗的英文遊戲。"
# game/new_project.rpy:55
old "PROJECT NAME"
new "專案名稱"
# game/new_project.rpy:56
old "Please enter the name of your project:"
new "請輸入專案名稱:"
# game/new_project.rpy:62
old "The project name may not be empty."
new "專案名稱不能為空。"
# game/new_project.rpy:67
old "[project_name!q] already exists. Please choose a different project name."
new "[project_name!q]已存在。請選擇不同的名稱。"
# game/new_project.rpy:70
old "[project_dir!q] already exists. Please choose a different project name."
new "[project_dir!q] 已存在。請選擇不同的名稱。"
translate traditional_chinese strings:
# game/new_project.rpy:40
# game/new_project.rpy:58
old "Please select a template to use for your new project. The template sets the default font and the user interface language. If your language is not supported, choose 'english'."
new "請為您新的專案選擇一個模版。該模版將設定為預設的字型和語言。如果您的所使用的語言沒有被支援,那麼請選擇「english」。"
translate traditional_chinese strings:
new "請為您新的專案選擇一個模版。該模版將設定為預設的字型和語言。如果您的所使用的語言沒有被支援,那麼請選擇「english」。"
# game/new_project.rpy:71
old "The projects directory could not be set. Giving up."
new "無法設定專案目錄。放棄。"
# game/new_project.rpy:75
old "PROJECT NAME"
new "專案名稱"
# game/new_project.rpy:75
old "Please enter the name of your project:"
new "請輸入專案名稱:"
# game/new_project.rpy:83
old "The project name may not be empty."
new "專案名稱不能為空。"
# game/new_project.rpy:88
old "[project_name!q] already exists. Please choose a different project name."
new "[project_name!q] 已存在。請選擇不同的名稱。"
# game/new_project.rpy:91
old "[project_dir!q] already exists. Please choose a different project name."
new "[project_dir!q] 已存在。請選擇不同的名稱。"
@@ -1,66 +1,83 @@
translate traditional_chinese strings:
# game/preferences.rpy:40
# game/preferences.rpy:64
old "Launcher Preferences"
new "啟動器偏好"
# game/preferences.rpy:61
# game/preferences.rpy:85
old "Projects Directory:"
new "專案目錄:"
# game/preferences.rpy:68
# game/preferences.rpy:92
old "[persistent.projects_directory!q]"
new "[persistent.projects_directory!q]"
# game/preferences.rpy:70
# game/preferences.rpy:94
old "Projects directory: [text]"
new "專案資料夾: [text]"
# game/preferences.rpy:96
old "Not Set"
new "未設定"
# game/preferences.rpy:84
# game/preferences.rpy:111
old "Text Editor:"
new "文字編輯器: "
new "文字編輯器:"
# game/preferences.rpy:106
# game/preferences.rpy:117
old "Text editor: [text]"
new "文字編輯器: [text]"
# game/preferences.rpy:133
old "Update Channel:"
new "更新頻道:"
# game/preferences.rpy:126
# game/preferences.rpy:153
old "Navigation Options:"
new "導航選項:"
# game/preferences.rpy:130
# game/preferences.rpy:157
old "Include private names"
new "包含私有名稱"
# game/preferences.rpy:131
# game/preferences.rpy:158
old "Include library names"
new "包含資料庫名稱"
# game/preferences.rpy:141
# game/preferences.rpy:168
old "Launcher Options:"
new "啟動器選項:"
# game/preferences.rpy:145
# game/preferences.rpy:172
old "Hardware rendering"
new "硬體渲染"
# game/preferences.rpy:148
# game/preferences.rpy:173
old "Show templates"
new "顯示模板"
# game/preferences.rpy:174
old "Show edit file section"
new "顯示編輯檔節"
# game/preferences.rpy:175
old "Large fonts"
new "大字體"
# game/preferences.rpy:176
old "Generate empty strings for translations"
new "產生空字串翻譯"
# game/preferences.rpy:179
old "Console output"
new "控制臺輸出"
# game/preferences.rpy:169
# game/preferences.rpy:200
old "Open launcher project"
new "開啟啟動器專案"
# game/preferences.rpy:183
# game/preferences.rpy:214
old "Language:"
new "語言:"
translate traditional_chinese strings:
# game/preferences.rpy:146
old "Show templates"
new "顯示模版"
@@ -1,58 +1,51 @@
translate traditional_chinese strings:
# game/project.rpy:196
old "Ren'Py is scanning the project..."
new "Ren'Py 正在掃描專案..."
# game/project.rpy:485
old "PROJECTS DIRECTORY"
new "專案目錄"
# game/project.rpy:485
old "Please choose the projects directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"
new "請使用目錄選擇器選擇專案目錄。\n{b}目錄選擇視窗可能會開啟在本視窗後面。{/b}"
# game/project.rpy:485
old "This launcher will scan for projects in this directory, will create new projects in this directory, and will place built projects into this directory."
new "啟動器會掃描該目錄下的專案,新增的專案也將在該目錄下建置。專案也在該目錄下建立。"
# game/project.rpy:525
old "Ren'Py was unable to run python with tkinter to choose the projects directory."
new "Ren'Py 無法運行 python 的 tkinter 來選擇專案目錄。"
# game/project.rpy:529
old "Ren'Py has set the projects directory to:"
new "Ren'Py 已將專案目錄設定為:"
translate traditional_chinese strings:
# game/project.rpy:48
# game/project.rpy:47
old "After making changes to the script, press shift+R to reload your game."
new "改變腳本後,請按 shift+R 來重新載入您的遊戲。"
# game/project.rpy:49
# game/project.rpy:47
old "Press shift+O (the letter) to access the console."
new "按 shift+O (the letter)來進入控制臺。"
new "按 shift+O (the letter) 來進入控制臺。"
# game/project.rpy:50
# game/project.rpy:47
old "Press shift+D to access the developer menu."
new "按 shift+D 來進入開發者選單"
new "按 shift+D 來進入開發者選單"
# game/project.rpy:219
# game/project.rpy:47
old "Have you backed up your projects recently?"
new "您最近有備份您的專案嗎?"
# game/project.rpy:224
old "Launching the project failed."
new "啟動專案失敗。"
# game/project.rpy:219
# game/project.rpy:224
old "Please ensure that your project launches normally before running this command."
new "請確保您的專案能正常啟動再執行本指令。"
# game/project.rpy:516
# game/project.rpy:237
old "Ren'Py is scanning the project..."
new "Ren'Py 正在掃描專案.."
# game/project.rpy:526
old "Launching"
new "正在啟動"
new "啟動"
# game/project.rpy:585
old "Ren'Py was unable to run python with tkinter to choose the projects directory. Please install the python-tk or tkinter package."
new "Ren'Py 無法運行 python 的 tkinter 來選擇專案目錄。請安裝 python-tk 或 tkinter。"
# game/project.rpy:555
old "PROJECTS DIRECTORY"
new "專案目錄"
# game/project.rpy:555
old "Please choose the projects directory using the directory chooser.\n{b}The directory chooser may have opened behind this window.{/b}"
new "請使用目錄選擇器選擇專案目錄。\n{b}目錄選擇視窗可能會開啟在本視窗後面。{/b}"
# game/project.rpy:555
old "This launcher will scan for projects in this directory, will create new projects in this directory, and will place built projects into this directory."
new "啟動器會掃描該目錄下的專案,新增的專案也將在該目錄下建置。專案也在該目錄下建立。"
# game/project.rpy:560
old "Ren'Py has set the projects directory to:"
new "Ren'Py 已將專案目錄設定為"
+28 -32
View File
@@ -1,35 +1,31 @@
translate traditional_chinese python:
DROID = "tl/traditional_chinese/DroidSansFallback.ttf"
DSF = "tl/traditional_chinese/DroidSansFallback.ttf"
style.l_default.font = DSF
style.l_default.size = 16
style.l_default.selected_font = DSF
style.l_default.selected_bold = 1
style.l_button_text.font = DSF
style.l_button_text.selected_bold = True
style.l_checkbox_text.font = DSF
style.l_link_text.font = DSF
style.l_button_text.selected_font = DSF
style.l_button_text.selected_bold = 1
style.l_checkbox_text.selected_font = DSF
style.l_checkbox_text.selected_bold = 1
translate traditional_chinese style l_default:
font DROID
size 16
style.l_navigation_button_text.font = DSF
style.l_navigation_text.font = DSF
style.l_navigation_text.bold = True
translate traditional_chinese style l_button_text:
selected_font DROID
selected_bold True
translate traditional_chinese style l_link_text:
font DROID
translate traditional_chinese style l_alternate_text:
font DROID
translate traditional_chinese style l_navigation_button_text:
font DROID
translate traditional_chinese style l_navigation_text:
font DROID
bold True
translate traditional_chinese style l_checkbox_text:
selected_font DROID
translate traditional_chinese style l_nonbox_text:
selected_font DROID
translate traditional_chinese style hyperlink_text:
font DROID
translate traditional_chinese python:
make_style_backup()
style.l_link_text.selected_font = DSF
style.l_link_text.selected_bold = 1
style.l_alternate_text.font = DSF
style.l_nonbox_text.font = DSF
style.hyperlink_text.font = DSF
make_style_backup()
@@ -1,38 +1,35 @@
translate traditional_chinese strings:
# game/translations.rpy:10
# game/translations.rpy:34
old "Create or Update Translations"
new "新增或更新翻譯"
# game/translations.rpy:10
# game/translations.rpy:34
old "Please enter the name of the language for which you want to create or update translations."
new "請輸入您要新增或者更新語言的名稱。"
# game/translations.rpy:15
# game/translations.rpy:39
old "The language name can not be the empty string."
new "語言名稱不能為空字串。"
# game/translations.rpy:26
# game/translations.rpy:50
old "Ren'Py is generating translations...."
new "Ren'Py 正在產生翻譯..."
# game/translations.rpy:30
# game/translations.rpy:54
old "Ren'Py has finished generating [language] translations."
new "Ren'Py 已經完成[language]翻譯檔案。"
new "Ren'Py 已經完成 [language] 檔案的翻譯。"
translate traditional_chinese strings:
# game/translations.rpy:44
# game/translations.rpy:67
old "What format would you like for the extracted dialogue?"
new "您要使用什麼格式來提取對話"
new "您要使用什麼格式來提取對話?"
# game/translations.rpy:56
# game/translations.rpy:80
old "Ren'Py is extracting dialogue...."
new "Ren'Py 正在提取對話..."
new "Ren'Py 正在提取對話..."
# game/translations.rpy:60
# game/translations.rpy:84
old "Ren'Py has finished extracting dialogue. The extracted dialogue can be found in dialogue.[format] in the base directory."
new "Ren'Py 已經完成對話提取。提取的對話可以在底層目錄下 dialogue.[format] 中找到。"
new "Ren'Py 已經完成對話提取。提取的對話可以在底層目錄下 dialogue.[format] 中找到。"
@@ -1,93 +1,38 @@
translate traditional_chinese strings:
# game/updater.rpy:54
# game/updater.rpy:78
old "Select Update Channel"
new "選擇更新頻道"
# game/updater.rpy:65
# game/updater.rpy:89
old "The update channel controls the version of Ren'Py the updater will download. Please select an update channel:"
new "更新頻道控制 Ren'Py 更新將會下載的版本。請選擇一個更新頻道。"
# game/updater.rpy:70
# game/updater.rpy:94
old "Release"
new "Release"
# game/updater.rpy:76
# game/updater.rpy:100
old "{b}Recommended.{/b} The version of Ren'Py that should be used in all newly-released games."
new "{b}推薦{/b} Ren'py 的版本應在所有新釋出的遊戲中使用。"
# game/updater.rpy:81
# game/updater.rpy:105
old "Prerelease"
new "Prerelease"
# game/updater.rpy:87
# game/updater.rpy:111
old "A preview of the next version of Ren'Py that can be used for testing and taking advantage of new features, but not for final releases of games."
new "預覽 Ren'py 的下一個版本,適合用於測試和體驗新功能,但不適合遊戲的最終版本。"
# game/updater.rpy:93
# game/updater.rpy:117
old "Experimental"
new "Experimental"
# game/updater.rpy:99
# game/updater.rpy:123
old "Experimental versions of Ren'Py. You shouldn't select this channel unless asked by a Ren'Py developer."
new "Ren'py 的實驗版本,除非您被 Ren'py 的開發者要求,否則您不應該選擇此頻道。"
# game/updater.rpy:119
old "An error has occured:"
new "一個錯誤發生:"
# game/updater.rpy:121
old "Checking for updates."
new "檢查更新"
# game/updater.rpy:123
old "Ren'Py is up to date."
new "Ren'Py 已是最新版本"
# game/updater.rpy:125
old "[u.version] is now available. Do you want to install it?"
new "[u.version] 已經可以更新。你要下載它嗎?"
# game/updater.rpy:127
old "Preparing to download the update."
new "準備下載更新。"
# game/updater.rpy:129
old "Downloading the update."
new "正在下載更新。"
# game/updater.rpy:131
old "Unpacking the update."
new "正在解壓縮更新檔案。"
# game/updater.rpy:133
old "Finishing up."
new "即將完成。"
# game/updater.rpy:135
old "The update has been installed. Ren'Py will restart."
new "已安裝更新。Ren'Py 將會重新啟動。"
# game/updater.rpy:137
old "The update has been installed."
new "已安裝更新。"
# game/updater.rpy:139
old "The update was cancelled."
new "已取消更新。"
# game/updater.rpy:156
old "Ren'Py Update"
new "Ren'Py 更新"
# game/updater.rpy:162
old "Proceed"
new "繼續"
translate traditional_chinese strings:
# game/updater.rpy:129
old "Nightly"
new "Nightly"
@@ -96,3 +41,55 @@ translate traditional_chinese strings:
old "The bleeding edge of Ren'Py development. This may have the latest features, or might not run at all."
new "Ren'Py 最新的開發版本。這可能會擁有最新的功能,或可能根本無法運作。"
# game/updater.rpy:155
old "An error has occured:"
new "一個錯誤發生:"
# game/updater.rpy:157
old "Checking for updates."
new "正在檢查更新。"
# game/updater.rpy:159
old "Ren'Py is up to date."
new "Ren'Py 已是最新版本。"
# game/updater.rpy:161
old "[u.version] is now available. Do you want to install it?"
new "[u.version] 已經可以更新。您要下載它嗎?"
# game/updater.rpy:163
old "Preparing to download the update."
new "準備下載更新"
# game/updater.rpy:165
old "Downloading the update."
new "正在下載更新。"
# game/updater.rpy:167
old "Unpacking the update."
new "正在解壓縮更新檔案。"
# game/updater.rpy:169
old "Finishing up."
new "即將完成。"
# game/updater.rpy:171
old "The update has been installed. Ren'Py will restart."
new "已安裝更新。Ren'Py 將會重新啟動。"
# game/updater.rpy:173
old "The update has been installed."
new "已安裝更新。"
# game/updater.rpy:175
old "The update was cancelled."
new "已取消更新。"
# game/updater.rpy:192
old "Ren'Py Update"
new "Ren'Py 更新"
# game/updater.rpy:198
old "Proceed"
new "繼續"
+1 -1
View File
@@ -40,7 +40,7 @@ except ImportError:
vc_version = 0
# The tuple giving the version number.
version_tuple = (6, 99, 8, vc_version)
version_tuple = (6, 99, 9, vc_version)
# The name of this version.
version_name = "Here's to the crazy ones."
+4
View File
@@ -110,6 +110,10 @@ class ArgumentParser(argparse.ArgumentParser):
"--compile", action='store_true', dest='compile',
help='Forces all .rpy scripts to be recompiled before proceeding.')
self.add_argument(
"--keep-orphan-rpyc", action="store_true",
help="Prevents the compile command from deleting orphan rpyc files.")
self.add_argument(
"--lint", action="store_true", dest="lint",
help=argparse.SUPPRESS)
+8 -1
View File
@@ -983,13 +983,14 @@ def predict_imspec(imspec, scene=False, atl=None):
except:
pass
if atl is not None:
try:
at_list.append(renpy.display.motion.ATLTransform(atl))
except:
pass
layer = renpy.exports.default_layer(layer, tag or name, expression)
if scene:
renpy.game.context().images.predict_scene(layer)
@@ -1023,6 +1024,8 @@ def show_imspec(imspec, atl=None):
at_list = [ renpy.python.py_eval(i) for i in at_list ]
layer = renpy.exports.default_layer(layer, tag or name, expression)
renpy.config.show(name,
at_list=at_list,
layer=layer,
@@ -1197,6 +1200,8 @@ class Hide(Node):
if tag is None:
tag = name[0]
layer = renpy.exports.default_layer(layer, tag)
renpy.game.context().images.predict_hide(tag, layer)
return [ self.next ]
@@ -1216,6 +1221,8 @@ class Hide(Node):
elif len(self.imspec) == 7:
name, _expression, tag, _at_list, layer, _zorder, _behind = self.imspec
layer = renpy.exports.default_layer(layer, tag or name)
renpy.config.hide(tag or name, layer)
+1 -4
View File
@@ -127,9 +127,6 @@ def interpolate(t, a, b, type): #@ReservedAssignment
Linearly interpolate the arguments.
"""
if t >= 1.0:
return b
# Recurse into tuples.
if isinstance(b, tuple):
if a is None:
@@ -138,7 +135,7 @@ def interpolate(t, a, b, type): #@ReservedAssignment
return tuple(interpolate(t, i, j, ty) for i, j, ty in zip(a, b, type))
# Deal with booleans, nones, etc.
elif b is None or isinstance(b, bool):
elif b is None or isinstance(b, (bool, basestring)):
if t >= 1.0:
return b
else:
+171 -1
View File
@@ -22,7 +22,7 @@
# This file contains warpers that are used by ATL. They need to be defined
# early, so Ren'Py knows about them when parsing other files.
python early hide:
python early in _warper:
# pause is defined internally, but would look like:
#
@@ -51,3 +51,173 @@ python early hide:
def ease(x):
import math
return .5 - math.cos(math.pi * x) / 2.0
# Modified easing equations based on Robert Penner (http://robertpenner.com/easing/)
# License: http://robertpenner.com/easing_terms_of_use.html
# -in / -out surfix are inverted to much default warpers in ATL.
# quad
@renpy.atl_warper
def easeout_quad(t):
return pow(t, 2)
@renpy.atl_warper
def easein_quad(t):
return 1 - easeout_quad(1 - t)
@renpy.atl_warper
def ease_quad(t):
if t < .5:
return easeout_quad(t * 2.0) / 2.0
else:
return 1 - easeout_quad((1 - t)* 2.0) / 2.0
# cubic
@renpy.atl_warper
def easeout_cubic(t):
return pow(t, 3)
@renpy.atl_warper
def easein_cubic(t):
return 1 - easeout_cubic(1 - t)
@renpy.atl_warper
def ease_cubic(t):
if t < .5:
return easeout_cubic(t * 2.0) / 2.0
else:
return 1 - easeout_cubic((1 - t)* 2.0) / 2.0
# quart
@renpy.atl_warper
def easeout_quart(t):
return pow(t, 4)
@renpy.atl_warper
def easein_quart(t):
return 1 - easeout_quart(1 - t)
@renpy.atl_warper
def ease_quart(t):
if t < .5:
return easeout_quart(t * 2.0) / 2.0
else:
return 1 - easeout_quart((1 - t)* 2.0) / 2.0
# quint
@renpy.atl_warper
def easeout_quint(t):
return pow(t, 5)
@renpy.atl_warper
def easein_quint(t):
return 1 - easeout_quint(1 - t)
@renpy.atl_warper
def ease_quint(t):
if t < .5:
return easeout_quint(t * 2.0) / 2.0
else:
return 1 - easeout_quint((1 - t)* 2.0) / 2.0
# exponential
@renpy.atl_warper
def easeout_expo(t):
return pow(2, 10 * (t - 1))
@renpy.atl_warper
def easein_expo(t):
return 1 - easeout_expo(1 - t)
@renpy.atl_warper
def ease_expo(t):
if t < .5:
return easeout_expo(t * 2.0) / 2.0
else:
return 1 - easeout_expo((1 - t)* 2.0) / 2.0
# circular
@renpy.atl_warper
def easeout_circ(t):
import math
return 1 - math.sqrt(1 - t * t)
@renpy.atl_warper
def easein_circ(t):
return 1 - easeout_circ(1- t)
@renpy.atl_warper
def ease_circ(t):
if t < .5:
return easeout_circ(t * 2.0) / 2.0
else:
return 1 - easeout_circ((1- t) * 2.0) / 2.0
# back
@renpy.atl_warper
def easeout_back(t):
s = 1.7015 # Overshoot. It ranges .0 (swing 0%) ~ 8.4435 (swing 100%).
return t * t * ((s + 1) * t - s)
@renpy.atl_warper
def easein_back(t):
return 1 - easeout_back(1- t)
@renpy.atl_warper
def ease_back(t):
if t < .5:
return easeout_back(t * 2.0) / 2.0
else:
return 1 - easeout_back((1- t) * 2.0) / 2.0
# elastic
@renpy.atl_warper
def easein_elastic(t):
import math
p = .3 # Period. It ranges 0.1 (spring many) ~ 1.0 (spring once).
return 1 + pow(2, - 10 * t) * math.sin((t - p / 4.0) * (2.0 * math.pi) / p)
@renpy.atl_warper
def easeout_elastic(t):
return 1 - easein_elastic(1 - t)
@renpy.atl_warper
def ease_elastic(t):
if t < .5:
return easeout_elastic(t * 2.0) / 2.0
else:
return 1 - easeout_elastic((1- t) * 2.0) / 2.0
# bounce
@renpy.atl_warper
def easein_bounce(t):
p = 2.75 # Period. It's a fixed value. Don't change this.
s = pow(p, 2)
if t < (1.0 / p):
return s * t * t
elif t < (2.0 / p):
return 1 + s * (pow(t - 1.5 / p, 2) - pow(- .5 / p, 2))
elif t < (2.5 / p):
return 1 + s * (pow(t - 2.25 / p, 2) - pow(- .25 / p, 2))
else:
return 1 + s * (pow(t - 2.625 / p, 2) - pow(- .125 / p, 2))
@renpy.atl_warper
def easeout_bounce(t):
return 1 - easein_bounce(1 - t)
@renpy.atl_warper
def ease_bounce(t):
if t < .5:
return easeout_bounce(t * 2.0) / 2.0
else:
return 1 - easeout_bounce((1- t) * 2.0) / 2.0
+1
View File
@@ -53,6 +53,7 @@ init -1500:
style _console_input_text is _console_text:
color "#fafafa"
adjust_spacing False
style _console_history is _default:
background "#00000000"
-20
View File
@@ -212,26 +212,6 @@ init -1700 python:
config.predict_callbacks.append(_predict_screens)
##########################################################################
# Side Images
config.side_image_tag = None
config.side_image_only_not_showing = False
def SideImage(prefix_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(prefix_tag, image_tag=config.side_image_tag, not_showing=config.side_image_only_not_showing)
if name is None:
return Null()
else:
return ImageReference(name)
##########################################################################
# Name-only say statements.
+105
View File
@@ -0,0 +1,105 @@
# Copyright 2004-2015 Tom Rothamel <pytom@bishoujo.us>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation files
# (the "Software"), to deal in the Software without restriction,
# including without limitation the rights to use, copy, modify, merge,
# publish, distribute, sublicense, and/or sell copies of the Software,
# and to permit persons to whom the Software is furnished to do so,
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
init -1650 python:
##########################################################################
# Side Images
# A tag to use. This can be used to force the side image to only be of the
# main character.
config.side_image_tag = None
# If True, the side image will only be shown if an image with the same tag
# is not shown.
config.side_image_only_not_showing = False
# The prefix to use on the side image.
config.side_image_prefix_tag = 'side'
# A transform to use when the side image changes to that of a different
# character.
config.side_image_change_transform = None
# A transform to use when the side image changes to that of the same
# character.
config.side_image_same_transform = None
# The null to use.
config.side_image_null = Null()
def _side_per_interact():
"""
Called once per interaction to update the side image.
"""
global _side_image_raw
global _side_image
old = _side_image_raw
new = renpy.get_side_image(config.side_image_prefix_tag, image_tag=config.side_image_tag, not_showing=config.side_image_only_not_showing)
if new is None:
new = config.side_image_null
else:
new = ImageReference(new)
_side_image_raw = new
if config.skipping or renpy.game.after_rollback:
tf = None
elif isinstance(old, Null) and isinstance(new, Null):
tf = None
elif isinstance(old, Null) or isinstance(new, Null) or new.name[1] != old.name[1]:
tf = config.side_image_change_transform
else:
tf = config.side_image_same_transform
if tf:
_side_image = tf(old, new)
else:
_side_image = new
config.start_interact_callbacks.append(_side_per_interact)
def SideImage(prefix_tag=None):
"""
:doc: side_image_function
:args: ()
Returns the side image associated with the currently speaking character,
or a Null displayable if no such side image exists.
"""
# Compatibility with older games.
if (prefix_tag is not None) and (prefix_tag != config.side_image_prefix_tag):
config.side_image_prefix_tag = prefix_tag
_side_per_interact()
return _side_image
init 1650 python:
_side_image_old = config.side_image_null
_side_image_raw = config.side_image_null
_side_image = config.side_image_null
+26
View File
@@ -178,6 +178,32 @@ init -1500 python:
else:
return SetDict(persistent._character_volume, voice_tag, volume)
@renpy.pure
class PlayCharacterVoice(Action):
"""
:doc: voice_action
This plays `sample` on the voice channel, as if said by a
character with `voice_tag`.
`sample`
The full path to a sound file. No voice-related handling
of this file is done.
"""
def __init__(self, voice_tag, sample):
self.voice_tag = voice_tag
self.sample = sample
def __call__(self):
if self.voice_tag in persistent._voice_mute:
return
volume = persistent._character_volume.get(self.voice_tag, 1.0)
renpy.music.get_channel("voice").set_volume(volume)
renpy.sound.play(self.sample, channel="voice")
@renpy.pure
class ToggleVoiceMute(Action, DictEquality):
"""
+16 -1
View File
@@ -149,7 +149,7 @@ transient_layers = [ 'transient' ]
# overlays.
overlay_layers = [ 'overlay' ]
# A list of layers that should be cleared whe we enter a
# A list of layers that should be cleared when we enter a
# new context.
context_clear_layers = [ 'screens' ]
@@ -631,6 +631,21 @@ quit_on_mobile_background = False
# Should Ren'Py pass the raw joystick (not controller) events.?
pass_joystick_events = False
# A list of screens that should be shown when the overlay is enabled.
overlay_screens = [ ]
# A map from tag to the default layer that tag should be displayed on.
tag_layer = { }
# The default layer for tags not in in tag_layer.
default_tag_layer = 'master'
# A map from tag to the default transform that's used for that tag.
tag_transform = { }
# The width of lines logged with renpy.log.
log_width = 78
del renpy
del os
+3
View File
@@ -389,6 +389,9 @@ _predict_set = set()
# keyword arguments can be
_predict_screen = dict()
# Should the default screens be shown?
_overlay_screens = True
# If we're in a replay, the label of the start of the replay.
_in_replay = None
+10 -1
View File
@@ -290,7 +290,16 @@ def transform_render(self, widtho, heighto, st, at):
rxdx / inv_det)
rv.nearest = state.nearest
rv.alpha = state.alpha
alpha = state.alpha
if alpha < 0.0:
alpha = 0.0
elif alpha > 1.0:
alpha = 1.0
rv.alpha = alpha
rv.over = 1.0 - state.additive
rv.clipping = clipping
+56 -2
View File
@@ -1495,6 +1495,52 @@ class Interface(object):
self.safe_mode = get_safe_mode()
renpy.safe_mode_checked = True
# A scale factor used to compensate for the system DPI.
self.dpi_scale = self.setup_dpi_scaling()
renpy.display.log.write("DPI scale factor: %f", self.dpi_scale)
def setup_dpi_scaling(self):
if "RENPY_HIGHDPI" in os.environ:
return float(os.environ["RENPY_HIGHDPI"])
if not renpy.windows:
return 1.0
try:
import ctypes
from ctypes import c_void_p, c_int
ctypes.windll.user32.SetProcessDPIAware()
GetDC = ctypes.windll.user32.GetDC
GetDC.restype = c_void_p
GetDC.argtypes = [ c_void_p ]
ReleaseDC = ctypes.windll.user32.ReleaseDC
ReleaseDC.argtypes = [ c_void_p, c_void_p ]
GetDeviceCaps = ctypes.windll.gdi32.GetDeviceCaps
GetDeviceCaps.restype = c_int
GetDeviceCaps.argtypes = [ c_void_p, c_int ]
LOGPIXELSX = 88
dc = GetDC(None)
rv = GetDeviceCaps(dc, LOGPIXELSX) / 96.0
ReleaseDC(None, dc)
return rv
except:
renpy.display.log.write("Could not determine DPI scale factor:")
renpy.display.log.exception()
return 1.0
def start(self):
"""
Starts the interface, by opening a window and setting the mode.
@@ -2396,6 +2442,9 @@ class Interface(object):
@param suppress_underlay: This suppresses the display of the underlay.
"""
# Show default screens.
renpy.display.screen.show_overlay_screens(suppress_overlay)
# Prepare screens, if need be.
renpy.display.screen.prepare_screens()
@@ -2910,11 +2959,13 @@ class Interface(object):
if ev.w == 1 and ev.h == 1:
continue
size = (ev.w // self.dpi_scale, ev.h // self.dpi_scale)
if pygame.display.get_surface().get_size() != ev.size:
self.set_mode((ev.w, ev.h))
self.set_mode(size)
if not self.fullscreen:
self.last_resize = ev.size
self.last_resize = size
continue
@@ -2951,6 +3002,9 @@ class Interface(object):
if ev.type == pygame.ACTIVEEVENT:
if ev.state & 1:
if not ev.gain:
renpy.display.focus.clear_focus()
self.mouse_focused = ev.gain
if ev.state & 2:
+30
View File
@@ -69,6 +69,15 @@ grab = None
# The default focus for the current screen.
default_focus = None
# The type of input that caused the focus to change last. One of
# "keyboard" (for keyboard-like focus devices) or "mouse" (for mouse-like)
# focus devices.)
focus_type = "mouse"
# The same, but for the most recent input that might potentially cause
# the focus to change.
pending_focus_type = "mouse"
# Sets the currently focused widget.
def set_focused(widget, arg, screen):
global argument
@@ -259,6 +268,9 @@ def change_focus(newfocus, default=False):
if current is widget and (newfocus is None or newfocus.arg == argument):
return rv
global focus_type
focus_type = pending_focus_type
if current is not None:
try:
renpy.display.screen.push_current_screen(screen_of_focused)
@@ -282,6 +294,13 @@ def change_focus(newfocus, default=False):
return rv
def clear_focus():
"""
Clears the focus when the window loses mouse focus.
"""
change_focus(None)
# This handles mouse events, to see if they change the focus.
def mouse_handler(ev, x, y, default=False):
"""
@@ -291,9 +310,14 @@ def mouse_handler(ev, x, y, default=False):
If ev is not None, this function checks to see if it is a mouse event.
"""
global pending_focus_type
if ev is not None:
if ev.type not in (pygame.MOUSEMOTION, pygame.MOUSEBUTTONUP, pygame.MOUSEBUTTONDOWN):
return
else:
pending_focus_type = "mouse"
new_focus = renpy.display.render.focus_at_point(x, y)
@@ -397,6 +421,9 @@ def focus_nearest(from_x0, from_y0, from_x1, from_y1,
condition,
xmul, ymul, wmul, hmul):
global pending_focus_type
pending_focus_type = "keyboard"
if not focus_list:
return
@@ -472,6 +499,9 @@ def focus_nearest(from_x0, from_y0, from_x1, from_y1,
def focus_ordered(delta):
global pending_focus_type
pending_focus_type = "keyboard"
placeless = None
candidates = [ ]
+48 -5
View File
@@ -38,6 +38,40 @@ images = { }
image_attributes = collections.defaultdict(list)
def get_available_image_tags():
"""
:doc: image_func
Returns a list of image tags that have been defined.
"""
return [ k for k, v in image_attributes.items() if v ]
def get_available_image_attributes(tag, attributes=()):
"""
:doc: image_func
Returns a list of tuples, with each tuple representing a possible
combination of image attributes that can be associated with `tag`.
If `attributes` is given, only images that contain all the attributes
in that iterable are returned.
"""
rv = [ ]
if tag not in image_attributes:
return rv
for at in image_attributes[tag]:
for a in attributes:
if a not in at:
break
else:
rv.append(at)
return rv
def register_image(name, d):
"""
Registers the existence of an image with `name`, and that the image
@@ -100,7 +134,7 @@ class ImageReference(renpy.display.core.Displayable):
the image in an image statment.
"""
nosave = [ 'target', 'param_target' ]
nosave = [ 'target' ]
target = None
param_target = None
@@ -170,7 +204,15 @@ class ImageReference(renpy.display.core.Displayable):
try:
self.target = target.parameterize(name, parameters)
if self.target is not target:
if self.param_target is not None:
npt = self.target._get_parameterized()
if isinstance(npt, renpy.display.motion.Transform):
opt = self.param_target._get_parameterized()
npt.take_state(opt)
self.param_target = self.target
except Exception, e:
@@ -258,7 +300,7 @@ class DynamicImage(renpy.display.core.Displayable):
performed at the start of each iteraction.
"""
nosave = [ 'target', 'raw_target' ]
nosave = [ 'raw_target' ]
# The target that this image currently resolves to.
target = None
@@ -327,7 +369,7 @@ class DynamicImage(renpy.display.core.Displayable):
if not old_target:
return True
if isinstance(old_target, renpy.display.motion.Transform):
if not isinstance(old_target, renpy.display.motion.Transform):
return True
if not isinstance(target, renpy.display.motion.Transform):
@@ -469,6 +511,9 @@ class ShownImageInfo(renpy.object.Object):
Predicts the scene statement being called on layer.
"""
if layer is None:
layer = 'master'
for l, t in self.attributes.keys():
if l == layer:
del self.attributes[l, t]
@@ -530,8 +575,6 @@ class ShownImageInfo(renpy.object.Object):
return self.choose_image(nametag, required, optional, name)
def choose_image(self, tag, required, optional, exception_name):
"""
"""
# The longest length of an image that matches.
max_len = 0
+3 -3
View File
@@ -86,7 +86,7 @@ class Solid(renpy.display.core.Displayable):
class Frame(renpy.display.core.Displayable):
"""
:doc: disp_imagelike
:args: (image, left, top, right=None, bottom=None, tile=False, **properties)
:args: (image, left=0, top=0, right=None, bottom=None, tile=False, **properties)
A displayable that resizes an image to fill the available area,
while preserving the width and height of its borders. is often
@@ -134,7 +134,7 @@ class Frame(renpy.display.core.Displayable):
self.top = self.yborder
self.bottom = self.yborder
def __init__(self, image, left=None, top=None, right=None, bottom=None, xborder=None, yborder=None, bilinear=True, tile=False, **properties):
def __init__(self, image, left=None, top=None, right=None, bottom=None, xborder=0, yborder=0, bilinear=True, tile=False, **properties):
super(Frame, self).__init__(**properties)
self.image = renpy.easy.displayable(image)
@@ -144,7 +144,7 @@ class Frame(renpy.display.core.Displayable):
if left is None:
left = xborder
if top is None:
top= yborder
top = yborder
if right is None:
right = left
+40 -21
View File
@@ -593,13 +593,13 @@ class MultiBox(Container):
else:
adjust_times = False
xminimum = self.style.xminimum
if xminimum is not None:
width = max(width, scale(xminimum, width))
minx = self.style.xminimum
if minx is not None:
width = max(width, scale(minx, width))
yminimum = self.style.yminimum
if yminimum is not None:
height = max(height, scale(yminimum, height))
miny = self.style.yminimum
if miny is not None:
height = max(height, scale(miny, height))
if self.first:
@@ -695,9 +695,10 @@ class MultiBox(Container):
spacings = [ first_spacing ] + [ spacing ] * (len(self.children) - 1)
box_wrap = self.style.box_wrap
xfill = self.style.xfill
yfill = self.style.yfill
xminimum = self.style.xminimum
yminimum = self.style.yminimum
# The shared height and width of the current line. The line_height must
# be 0 for a vertical box, and the line_width must be 0 for a horizontal
@@ -719,6 +720,11 @@ class MultiBox(Container):
maxx = 0
maxy = 0
# The minimum size of x and y.
minx = 0
miny = 0
def layout_line(line, xfill, yfill):
"""
Lays out a single line.
@@ -762,17 +768,24 @@ class MultiBox(Container):
x = 0
y = 0
full_width = False
full_height = False
if layout == "horizontal":
full_height = yfill
if yfill:
miny = height
else:
miny = yminimum
line_height = 0
line = [ ]
remwidth = width
if xfill:
target_width = width
else:
target_width = xminimum
for d, padding, cst, cat in zip(children, spacings, csts, cats):
if box_wrap:
@@ -784,7 +797,7 @@ class MultiBox(Container):
sw, sh = surf.get_size()
if box_wrap and remwidth - sw - padding <= 0 and line:
maxx, maxy = layout_line(line, remwidth if xfill else 0, 0)
maxx, maxy = layout_line(line, target_width - x, 0)
y += line_height
x = 0
@@ -798,17 +811,25 @@ class MultiBox(Container):
x += sw + padding
remwidth -= (sw + padding)
maxx, maxy = layout_line(line, remwidth if xfill else 0, 0)
maxx, maxy = layout_line(line, target_width - x, 0)
elif layout == "vertical":
full_width = xfill
if xfill:
minx = width
else:
minx = xminimum
line_width = 0
line = [ ]
remheight = height
if yfill:
target_height = height
else:
target_height = yminimum
for d, padding, cst, cat in zip(children, spacings, csts, cats):
if box_wrap:
@@ -820,7 +841,7 @@ class MultiBox(Container):
sw, sh = surf.get_size()
if box_wrap and remheight - sh - padding <= 0:
maxx, maxy = layout_line(line, 0, remheight if yfill else 0)
maxx, maxy = layout_line(line, 0, target_height - y, 0)
x += line_width
y = 0
@@ -833,7 +854,7 @@ class MultiBox(Container):
y += sh + padding
remheight -= (sh + padding)
maxx, maxy = layout_line(line, 0, remheight if yfill else 0)
maxx, maxy = layout_line(line, 0, target_height - y)
else:
raise Exception("Unknown box layout: %r" % layout)
@@ -841,10 +862,10 @@ class MultiBox(Container):
# Back to the common for vertical and horizontal.
if not xfill:
width = maxx
width = max(xminimum, maxx)
if not yfill:
height = maxy
height = max(yminimum, maxy)
rv = renpy.display.render.Render(width, height)
@@ -852,10 +873,8 @@ class MultiBox(Container):
placements.reverse()
for child, x, y, w, h, surf in placements:
if full_width:
w = width
if full_height:
h = height
w = max(minx, w)
h = max(miny, h)
offset = child.place(rv, x, y, w, h, surf)
offsets.append(offset)
+51 -10
View File
@@ -875,24 +875,39 @@ def get_screen(name, layer="screens"):
"""
:doc: screens
Returns the ScreenDisplayable with the given `tag`, on
`layer`. If no displayable with the tag is not found, it is
interpreted as screen name. If it's still not found, None is returned.
"""
Returns the ScreenDisplayable with the given `name` on layer. `name`
is first interpreted as a tag name, and then a screen name. If the
screen is not showing, returns None.
This can also take a list of names, in which case the first screen
that is showing is returned.
This function can be used to check if a screen is showing, using code
like::
if renpy.get_screen("say"):
text "The say screen is showing."
else:
text "The say screen is hidden."
"""
if isinstance(name, basestring):
name = tuple(name.split())
tag = name[0]
name = (name, )
sl = renpy.exports.scene_lists()
sd = sl.get_displayable_by_tag(layer, tag)
for tag in name:
sd = sl.get_displayable_by_tag(layer, tag)
if sd is not None:
return sd
if sd is None:
sd = sl.get_displayable_by_name(layer, name)
if sd is not None:
return sd
return sd
return None
def has_screen(name):
@@ -1168,3 +1183,29 @@ def before_restart():
if isinstance(i, ScreenDisplayable):
i.restarting = True
def show_overlay_screens(suppress_overlay):
"""
Called from interact to show or hide the overlay screens.
"""
show = not suppress_overlay
if renpy.store._overlay_screens is None:
show = show
if renpy.store._overlay_screens is True:
show = True
else:
show = False
if show:
for i in renpy.config.overlay_screens:
if get_screen(i) is None:
show_screen(i)
else:
for i in renpy.config.overlay_screens:
if get_screen(i) is not None:
hide_screen(i)
+162 -11
View File
@@ -60,7 +60,10 @@ from renpy.display.screen import get_widget_properties
from renpy.display.focus import focus_coordinates
from renpy.display.predict import screen as predict_screen
from renpy.display.image import image_exists, image_exists as has_image
from renpy.display.image import get_available_image_tags, get_available_image_attributes
from renpy.display.im import load_surface, load_image
from renpy.curry import curry, partial
@@ -148,6 +151,7 @@ def public_api():
map_event, queue_event, clear_keymap_cache
const, pure, not_const
image_exists, has_image
get_available_image_tags, get_available_image_attributes
load_image, load_surface
profile_memory, diff_memory, profile_rollback
TEXT_TAG
@@ -375,6 +379,61 @@ def copy_images(old, new):
renpy.display.image.register_image(new + k[lenold:], v)
def default_layer(layer, tag, expression=False):
"""
:undocumented:
If layer is not None, returns it. Otherwise, interprets `tag` as a name
or tag, then looks up what the default layer for that tag is, and returns
the result.
"""
if layer is not None:
return layer
if expression:
return 'master'
if isinstance(tag, tuple):
tag = tag[0]
elif " " in tag:
tag = tag.split()[0]
return renpy.config.tag_layer.get(tag, renpy.config.default_tag_layer)
def can_show(name, layer=None, tag=None):
"""
:doc: image_func
Determines if `name` can be used to show an image. This interprets `name`
as a tag and attributes. This is combined with the attributes of the
currently-showing image with `tag` on `layer` to try to determine a unique image
to show. If a unique image can be show, returns the name of that image as
a tuple. Otherwise, returns None.
`tag`
The image tag to get attributes from. If not given, defaults to the first
component of `name`.
`layer`
The layer to check. If None, uses the default layer for `tag`.
"""
if not isinstance(name, tuple):
name = tuple(name.split())
if tag is None:
tag = name[0]
layer = default_layer(layer, None)
try:
return renpy.game.context().images.apply_attributes(layer, tag, name)
except:
return None
def showing(name, layer='master'):
"""
:doc: image_func
@@ -386,11 +445,17 @@ def showing(name, layer='master'):
May be a string giving the image name or a tuple giving each
component of the image name. It may also be a string giving
only the image tag.
`layer`
The layer to check. If None, uses the default layer for `tag`.
"""
if not isinstance(name, tuple):
name = tuple(name.split())
layer = default_layer(layer, name)
return renpy.game.context().images.showing(layer, name)
def get_showing_tags(layer='master'):
@@ -402,7 +467,7 @@ def get_showing_tags(layer='master'):
return renpy.game.context().images.get_showing_tags(layer)
def predict_show(name, layer='master', what=None, tag=None, at_list=[ ]):
def predict_show(name, layer=None, what=None, tag=None, at_list=[ ]):
"""
:undocumented:
@@ -412,7 +477,7 @@ def predict_show(name, layer='master', what=None, tag=None, at_list=[ ]):
The name of the image to show, a string.
`layer`
The layer the image is being show non.
The layer the image is being shown on.
`what`
What is being show - if given, overrides `name`.
@@ -426,6 +491,8 @@ def predict_show(name, layer='master', what=None, tag=None, at_list=[ ]):
key = tag or name[0]
layer = default_layer(key, layer)
if what is None:
what = name
elif isinstance(what, basestring):
@@ -457,7 +524,7 @@ def predict_show(name, layer='master', what=None, tag=None, at_list=[ ]):
renpy.display.predict.displayable(img)
def show(name, at_list=[ ], layer='master', what=None, zorder=None, tag=None, behind=[ ], atl=None, transient=False, munge_name=True):
def show(name, at_list=[ ], layer=None, what=None, zorder=None, tag=None, behind=[ ], atl=None, transient=False, munge_name=True):
"""
:doc: se_images
:args: (name, at_list=[ ], layer='master', what=None, zorder=0, tag=None, behind=[ ])
@@ -474,7 +541,8 @@ def show(name, at_list=[ ], layer='master', what=None, zorder=None, tag=None, be
`layer`
A string, giving the name of the layer on which the image will be shown.
The equivalent of the ``onlayer`` property.
The equivalent of the ``onlayer`` property. If None, uses the default
layer associated with the tag.
`what`
If not None, this is a displayable that will be shown in lieu of
@@ -509,10 +577,20 @@ def show(name, at_list=[ ], layer='master', what=None, zorder=None, tag=None, be
sls = scene_lists()
key = tag or name[0]
layer = default_layer(layer, key)
if renpy.config.sticky_positions:
if not at_list and key in sls.at_list[layer]:
at_list = sls.at_list[layer][key]
if not at_list:
tt = renpy.config.tag_transform.get(key, None)
if tt is not None:
if not isinstance(tt, list):
at_list = [ tt ]
else:
at_list = list(tt)
if what is None:
what = name
elif isinstance(what, basestring):
@@ -566,7 +644,7 @@ def show(name, at_list=[ ], layer='master', what=None, zorder=None, tag=None, be
sls.add(layer, img, key, zorder, behind, at_list=at_list, name=name, atl=atl, default_transform=default_transform, transient=transient)
def hide(name, layer='master'):
def hide(name, layer=None):
"""
:doc: se_images
@@ -577,7 +655,8 @@ def hide(name, layer='master'):
any image with the tag is hidden (the precise name does not matter).
`layer`
The layer on which this function operates.
The layer on which this function operates. If None, uses the default
layer associated with the tag.
"""
if renpy.game.context().init_phase:
@@ -588,6 +667,9 @@ def hide(name, layer='master'):
sls = scene_lists()
key = name[0]
layer = default_layer(layer, key)
sls.remove(layer, key)
if renpy.config.missing_hide:
@@ -612,6 +694,9 @@ def scene(layer='master'):
$ renpy.show("bg beach")
"""
if layer is None:
layer = 'master'
if renpy.game.context().init_phase:
raise Exception("Scene may not run while in init phase.")
@@ -1684,7 +1769,7 @@ def log(msg):
:doc: debug
If :var:`config.log` is not set, this does nothing. Otherwise, it opens
the logfile (if not already open), formats the message to 70
the logfile (if not already open), formats the message to :var:`config.log_width`
columns, and prints it to the logfile.
"""
@@ -1707,7 +1792,7 @@ def log(msg):
import textwrap
print >>logfile, textwrap.fill(msg).encode("utf-8")
print >>logfile, textwrap.fill(msg, renpy.config.log_width).encode("utf-8")
logfile.flush()
except:
@@ -1862,19 +1947,22 @@ def image_size(im):
return surf.get_size()
def get_at_list(name, layer='master'):
def get_at_list(name, layer=None):
"""
:doc: se_images
Returns the list of transforms being applied to the image with tag `name`
on `layer`. Returns an empty list if no transofrms are being applied, or
None if the image is not shown.
If `layer` is None, uses the default layer for the given tag.
"""
if isinstance(name, basestring):
name = tuple(name.split())
tag = name[0]
layer = default_layer(layer, tag)
return renpy.game.context().scene_lists.at_list[layer].get(tag, None)
@@ -2212,9 +2300,13 @@ def get_image_bounds(tag, width=None, height=None, layer='master'):
`width`, `height`
The width and height of the area that contains the image. If None,
defaults the width and height of the screen, respectively.
`layer`
If None, uses the default layer for `tag`.
"""
tag = tag.split()[0]
layer = default_layer(layer, tag)
if width is None:
width = renpy.config.screen_width
@@ -2577,19 +2669,25 @@ def get_side_image(prefix_tag, image_tag=None, not_showing=True, layer='master')
If not_showing is True, this only returns a side image if the image the
attributes are taken from is not on the screen.
If `layer` is None, uses the default layer for the currently showing
tag.
"""
images = renpy.game.context().images
if image_tag is not None:
attrs = (image_tag,) + images.get_attributes(layer, image_tag)
image_layer = default_layer(layer, image_tag)
attrs = (image_tag,) + images.get_attributes(image_layer, image_tag)
else:
attrs = renpy.store._side_image_attributes
if not attrs:
return None
if not_showing and images.showing(layer, (attrs[0], )):
attr_layer = default_layer(layer, attrs)
if not_showing and images.showing(attr_layer, (attrs[0], )):
return None
required = set()
@@ -2965,3 +3063,56 @@ def clear_line_log():
renpy.game.context().line_log = [ ]
def add_layer(layer, above=None, below=None, menu_clear=True):
"""
:doc: other
Adds a new layer to the screen. If the layer already exists, this
function does nothing.
One of `behind` or `above` must be given.
`layer`
A string giving the name of the new layer to add.
`above`
If not None, a string giving the name of a layer the new layer will
be placed above.
`below`
If not None, a string giving the name of a layer the new layer will
be placed below.
`menu_clear`
If true, this layer will be cleared when entering the game menu
context, and restored when leaving the
"""
layers = renpy.config.layers
if layer in renpy.config.layers:
return
if (above is not None) and (below is not None):
raise Exception("The above and below arguments to renpy.add_layer are mutually exclusive.")
elif above is not None:
try:
index = layers.index(above) + 1
except ValueError:
raise Exception("Layer '%s' does not exist." % above)
elif below is not None:
try:
index = layers.index(below)
except ValueError:
raise Exception("Layer '%s' does not exist." % below)
else:
raise Exception("The renpy.add_layer function requires either the above or below argument.")
layers.insert(index, layer)
if menu_clear:
renpy.config.menu_clear_layers.append(layer) # @UndefinedVariable
+1
View File
@@ -50,6 +50,7 @@ cdef class GLDraw:
cdef bint allow_fixed
cdef tuple default_clip
cdef bint did_render_to_texture
cdef float dpi_scale
cdef public tuple clip_rtt_box
+44 -15
View File
@@ -71,8 +71,6 @@ PIXELLATE = renpy.display.render.PIXELLATE
cdef object IDENTITY
IDENTITY = renpy.display.render.IDENTITY
FAKE_HIGHDPI = int(os.environ.get("RENPY_FAKE_HIGHDPI", "1"))
# Should we try to vsync?
vsync = True
@@ -152,6 +150,9 @@ cdef class GLDraw:
# Did we do a render_to_texture?
self.did_render_to_texture = False
# The DPI scale factor.
self.dpi_scale = renpy.display.interface.dpi_scale
def set_mode(self, virtual_size, physical_size, fullscreen):
"""
@@ -203,12 +204,26 @@ cdef class GLDraw:
virtual_ar = 1.0 * vwidth / vheight
pwidth *= self.dpi_scale
pheight *= self.dpi_scale
pwidth = max(vwidth / 2, pwidth)
pheight = max(vheight / 2, pheight)
window_args = { }
if not renpy.mobile:
pwidth = min(self.display_info.current_w - 102, pwidth)
pheight = min(self.display_info.current_h - 102, pheight)
info = renpy.display.get_info()
visible_w = info.current_w - 102
visible_h = info.current_h - 102
if renpy.windows:
visible_w *= self.dpi_scale
visible_h *= self.dpi_scale
pwidth = min(visible_w, pwidth)
pheight = min(visible_h, pheight)
# The first time through.
if not self.did_init:
@@ -220,6 +235,14 @@ cdef class GLDraw:
pwidth = max(pwidth, 256)
pheight = max(pheight, 256)
# If we don't set the place manually when dpi_scale is not 1.0,
# SDL2 can place the window titlebar off the screen.
if renpy.windows and (self.dpi_scale != 1.0):
window_args["pos"] = (
max((visible_w - pwidth) // 2, 0),
max((visible_h - pheight) // 2, 10),
)
# Handle swap control.
vsync = int(os.environ.get("RENPY_GL_VSYNC", "1"))
@@ -249,7 +272,10 @@ cdef class GLDraw:
pheight = 0
else:
opengl = pygame.OPENGL | pygame.WINDOW_ALLOW_HIGHDPI
opengl = pygame.OPENGL
if self.dpi_scale == 1.0:
opengl |= pygame.WINDOW_ALLOW_HIGHDPI
if renpy.config.gl_resize:
resizable = pygame.RESIZABLE
@@ -273,8 +299,8 @@ cdef class GLDraw:
if self.window is None:
try:
renpy.display.log.write("Windowed mode.")
self.window = pygame.display.set_mode((pwidth * FAKE_HIGHDPI, pheight * FAKE_HIGHDPI), resizable | opengl | pygame.DOUBLEBUF)
renpy.display.log.write("Windowed mode.")
self.window = pygame.display.set_mode((pwidth, pheight), resizable | opengl | pygame.DOUBLEBUF, **window_args)
except pygame.error, e:
renpy.display.log.write("Could not get pygame screen: %r", e)
@@ -295,9 +321,6 @@ cdef class GLDraw:
# Get the size of the created screen.
pwidth, pheight = self.window.get_size()
pwidth /= FAKE_HIGHDPI
pheight /= FAKE_HIGHDPI
self.physical_size = (pwidth, pheight)
self.drawable_size = pygame.display.get_drawable_size()
@@ -701,7 +724,10 @@ cdef class GLDraw:
Draws the screen.
"""
reverse = self.virt_to_draw
if renpy.config.use_drawable_resolution:
reverse = self.virt_to_draw
else:
reverse = IDENTITY
surftree.is_opaque()
@@ -1110,14 +1136,12 @@ cdef class GLDraw:
return rv
def translate_point(self, x, y):
"""
Translates (x, y) from physical to virtual coordinates.
"""
x /= FAKE_HIGHDPI
y /= FAKE_HIGHDPI
# Screen sizes.
pw, ph = self.physical_size
vw, vh = self.virtual_size
@@ -1284,7 +1308,12 @@ cdef class GLDraw:
pass
def get_physical_size(self):
return self.physical_size
x, y = self.physical_size
x = int(x / self.dpi_scale)
y = int(y / self.dpi_scale)
return (x, y)
class Rtt(object):
+5 -3
View File
@@ -278,13 +278,15 @@ def check_show(node, precise):
name, expression, tag, at_list, layer, _zorder, _behind = imspec(node.imspec)
layer = renpy.exports.default_layer(layer, tag or name)
if layer not in renpy.config.layers and layer not in renpy.config.top_layers:
report("Uses layer '%s', which is not in config.layers.", layer)
image_exists(name, expression, tag, precise=precise)
for i in at_list:
try_eval("the at list of a scene or show statment", i, "Perhaps you forgot to declare, or misspelled, a position?")
try_eval("the at list of a scene or show statment", i, "Perhaps you forgot to define or misspelled a transform.")
def precheck_show(node):
@@ -304,14 +306,14 @@ def check_hide(node):
tag = tag or name[0]
layer = renpy.exports.default_layer(layer, tag)
if layer not in renpy.config.layers and layer not in renpy.config.top_layers:
report("Uses layer '%s', which is not in config.layers.", layer)
if tag not in image_prefixes:
report("The image tag '%s' is not the prefix of a declared image, nor was it used in a show statement before this hide statement.", tag)
# for i in at_list:
# try_eval(node, "at list of hide statment", i)
def check_with(node):
try_eval("a with statement or clause", node.expr, "Perhaps you forgot to declare, or misspelled, a transition?")
+6 -1
View File
@@ -328,8 +328,13 @@ def main():
# If recompiling everything, remove orphan .rpyc files.
# Otherwise, will fail in case orphan .rpyc have same
# labels as in other scripts (usually happens on script rename).
if renpy.game.args.command == 'compile':
if (renpy.game.args.command == 'compile') and not (renpy.game.args.keep_orphan_rpyc): # @UndefinedVariable
for (fn, dir) in renpy.game.script.script_files:
if dir is None:
continue
if not os.path.isfile(os.path.join(dir, fn+".rpy")):
try:
name = os.path.join(dir, fn+".rpyc")
-5
View File
@@ -1165,11 +1165,6 @@ def parse_image_specifier(l):
break
if layer is None:
layer = 'master'
return image_name, expression, tag, at_list, layer, zorder, behind
def parse_with(l, node):
+1 -3
View File
@@ -841,13 +841,11 @@ class Layout(object):
def fill_empty_line():
for i in line:
if isinstance(i, (TextSegment, SpaceSegment, DisplayableSegment)):
if isinstance(i[0], (TextSegment, SpaceSegment, DisplayableSegment)):
return
line.extend(tss[-1].subsegment(u" "))
for type, text in tokens: #@ReservedAssignment
if type == PARAGRAPH:
+15
View File
@@ -331,3 +331,18 @@ def write_pure_const():
write_set(f, constants)
def write_easings(ns):
with open("source/inc/easings", "w") as f:
f.write(".. csv-table::\n")
f.write(' :header: "Ren\'Py Name", "easings.net Name"\n')
f.write('\n')
for name in sorted(dir(ns)):
if not name.startswith("ease"):
continue
if not "_" in name:
continue
stdname = name.replace("ease_", "easeInOut_").replace("easein_", "easeOut_").replace("easeout_", "easeIn_")
f.write(' "{}", "{}"\n'.format(name, stdname))
+2
View File
@@ -25,5 +25,7 @@ init 1000000 python:
doc.write_pure_const()
doc.write_easings(_warper)
raise SystemExit
+5
View File
@@ -67,6 +67,11 @@ due to the Android software and hardware are:
* Ren'Py cannot change the device volume. However, the android volume
buttons work normally.
* Ren'Py can't handle transparency in buttons and imagemaps.
(This is due to performance problems on some devices with the
display modes needed to support deciding which pixels are
transparent.)
In addition, there are a few changes that may be necessary due to
human factors:
+12 -2
View File
@@ -536,14 +536,17 @@ The functions have the same signature as those used with :func:`Transform`:
repeat
.. _warpers:
Warpers
=======
A warper is a function that can change the amount of time an interpolation
statement considers to have elapsed. The following warpers are defined by
default. They are defined as functions from t to t', where t and t' are
floating point numbers between 0.0 and 1.0. (If the statement has 0 duration,
than t is 1.0 when it runs.)
floating point numbers, with t ranging from 0.0 to 1.0 over the given
amount of time. (If the statement has 0 duration, then t is 1.0 when it runs.)
t' should start at 0.0 and end at 1.0, but can be greater or less.
``pause``
Pause, then jump to the new value. If t == 1.0, t = 1.0. Otherwise, t'
@@ -562,6 +565,13 @@ than t is 1.0 when it runs.)
``easeout``
Start slow, then speed up. t' = 1.0 - math.cos(t * math.pi / 2.0)
In addition, most of Robert Penner's easing functions are supported. To
make the names match those above, the functions have been renamed
somewhat. Graphs of these standard functions can be found at
http://www.easings.net/.
.. include:: inc/easings
New warpers can be defined using the renpy.atl_warper decorator, in a python
early block. It should be placed in a file that is parsed before any file
that uses the warper. The code looks like:
+70
View File
@@ -2,6 +2,76 @@
Full Changelog
==============
Ren'Py 6.99.8
=============
Tags, Layers, and Transforms
----------------------------
The new :var:`config.tag_layer` variable makes it possible to specify the
default layer used by an image on a per image tag basis. This makes it
possible to place an image on its own layer without having to use onlayer.
The new :var:`config.default_tag_layer` variable specifies the default layer
for unknown tags.
The new :func:`renpy.add_layer` function provides as way to add a new
layer above or below the existing layers, if and only if the layer
does not already exist.
The new :var:`config.tag_transform` variable makes it possible to specify a
default transform (or list of transforms) to use when a transform is not
provided as part of a show or scene statement.
Easing Functions
----------------
Thanks to Nyaatrap, Ren'Py now supports Robert Penner's easing functions
in ATL. These functions speed up and slow down interpolations (and in some
cases, can cause interpolations to overshoot their targets), in order to
provide more pleasing and natural motion.
The new easing functions are documented int the :ref:`warpers` section.
Side Images
-----------
New-style side image functionality (using images with the side tag) has been
overhauled. It's now possible to apply an ATL transform, and hence a t
ransition, whenever the side image changes. Different transforms can be used
in the case where the character changes and the case where it stays the same.
See the :ref:`side-images` section for complete documentation.
Other
-----
Fixed a major bug where Ren'Py would put an extra space at the end of each
text block. This could change the layout of text (and hence other portions of
the interface.) The fix reverts the change that added the space, causing it
to be smaller than in 6.99.7 (but the same size as 6.99.6 and before.)
Ren'Py now supports HighDPI ("retina") displays on the Windows platform,
displaying text at the native screen resolution.
The new :var:`config.overlay_screens` variable takes a list of screens
that are displayed whenever a pre-screens overlay would be displayed,
and hidden otherwise. This makes it easy to have a screen as a permanent
part of the in-game interface, even if the game can be entered from
multiple places (like a Replay).
Ren'Py now clears focus (causing unhover events to trigger) when the mouse
leaves the game window.
The hbox and vbox displayables now support the :propref:`xminimum` and
:propref:`yminimum` style properties (and hence, :propref:`xsize`,
:propref`ysize`, :propref:`xysize`, and :propref`area` properties.)
The new :func:`PlayCharacterVoice` action makes it possible to play
a sample of a character's voice at that character's voice volume level.
The Traditional Chinese translation has been updated.
Ren'Py 6.99.7
=============
+28
View File
@@ -363,6 +363,10 @@ Occasionally Used
window to the window size, this can be used to report cases where the
dialogue is too large for its window.
.. var:: config.default_tag_layer = "master:
The layer an image is show on if its tag is not found in config.tag_layer.
.. var:: config.default_transform = ...
When a displayable is shown using the show or scene statements,
@@ -587,6 +591,12 @@ Occasionally Used
A list of functions. When called, each function is expected to
use ui functions to add displayables to the overlay layer.
.. var:: config.overlay_screens = [ ... ]
A list of screens that are displayed when the overlay is enabled,
and hidden when the overlay is supressed. (The screens are shown
on the screens layer, not the overlay layer.)
.. var:: config.python_callbacks = [ ]
A list of functions. The functions in this list are called, without
@@ -648,6 +658,20 @@ Occasionally Used
beginning with an underscore (_). These keys are used by Ren'Py,
and should not be changed.
.. var:: config.tag_layer = { }
A dictionary mapping image tag strings to layer name strings. When
an image is shown without a specific layer name, the image's tag is
looked up in this dictionary to get the layer to show it on. If the
tag is not found here, :var:`config.default_tag_name` is used.
.. var:: config.tag_transform = { }
A dictionary mapping image tag strings to transforms or lists of
transforms. When an image is newly-shown without an at clause,
the image's tag is looked up in ths dictionary to find a transform
or list of transforms to use.
.. var:: config.thumbnail_height = 75
The height of the thumbnails that are taken when the game is
@@ -938,6 +962,10 @@ Rarely or Internally Used
images used by that interaction have loaded. (Yeah, it's a lousy
name.)
.. var:: config.log_width = 78
The width of lines logged when :var:`config.log` is used.
.. var:: config.longpress_duration = 0.5
The amount of time the player must press the screen for for a longpress
+1 -1
View File
@@ -8,7 +8,7 @@
.. function:: renpy.log(msg)
If :var:`config.log` is not set, this does nothing. Otherwise, it opens
the logfile (if not already open), formats the message to 70
the logfile (if not already open), formats the message to :var:`config.log_width`
columns, and prints it to the logfile.
.. function:: renpy.unwatch(expr)
+1 -1
View File
@@ -34,7 +34,7 @@
Flatten is a relatively expensive operation, and so should only be used
when absolutely required.
.. function:: Frame(image, left, top, right=None, bottom=None, tile=False, **properties)
.. function:: Frame(image, left=0, top=0, right=None, bottom=None, tile=False, **properties)
A displayable that resizes an image to fill the available area,
while preserving the width and height of its borders. is often
+30
View File
@@ -0,0 +1,30 @@
.. csv-table::
:header: "Ren'Py Name", "easings.net Name"
"ease_back", "easeInOut_back"
"ease_bounce", "easeInOut_bounce"
"ease_circ", "easeInOut_circ"
"ease_cubic", "easeInOut_cubic"
"ease_elastic", "easeInOut_elastic"
"ease_expo", "easeInOut_expo"
"ease_quad", "easeInOut_quad"
"ease_quart", "easeInOut_quart"
"ease_quint", "easeInOut_quint"
"easein_back", "easeOut_back"
"easein_bounce", "easeOut_bounce"
"easein_circ", "easeOut_circ"
"easein_cubic", "easeOut_cubic"
"easein_elastic", "easeOut_elastic"
"easein_expo", "easeOut_expo"
"easein_quad", "easeOut_quad"
"easein_quart", "easeOut_quart"
"easein_quint", "easeOut_quint"
"easeout_back", "easeIn_back"
"easeout_bounce", "easeIn_bounce"
"easeout_circ", "easeIn_circ"
"easeout_cubic", "easeIn_cubic"
"easeout_elastic", "easeIn_elastic"
"easeout_expo", "easeIn_expo"
"easeout_quad", "easeIn_quad"
"easeout_quart", "easeIn_quart"
"easeout_quint", "easeIn_quint"
+8 -3
View File
@@ -27,10 +27,11 @@
This function requests the purchase of `product`.
It returns true if the purchase succeded, now or at any time in the past,
and false otherwise.
It returns true if the purchase succeeds, or false if the purchase
fails. If the product has been registered as consumable, the purchase
is consumed before this call returns.
.. function:: iap.register(product, identifier=None, amazon=None, google=None, ios=None)
.. function:: iap.register(product, identifier=None, amazon=None, google=None, ios=None, consumable=True)
Registers a product with the in-app purchase system.
@@ -57,6 +58,10 @@
`ios`
A string that identifies the product in the Apple App store for
iOS. If not given, defaults to `identifier`.
`consumable`
True if this is a consumable purchase. Right now, consumable purchases
are only supported on iOS.
.. function:: iap.restore(interact=True)
+5 -1
View File
@@ -1,10 +1,14 @@
.. Automatically generated file - do not modify.
.. function:: iap.Purchase(product)
.. function:: iap.Purchase(product, success=None)
An action that attempts the purchase of `product`. This action is
sensitive iff and only if the product is purchasable (a store is
enabled, and the product has not already been purchased.)
`success`
If not None, this is an action or list of actions that are tun
when the purchase succeeds.
.. function:: iap.Restore()
+33
View File
@@ -1,5 +1,20 @@
.. Automatically generated file - do not modify.
.. function:: renpy.can_show(name, layer=None, tag=None)
Determines if `name` can be used to show an image. This interprets `name`
as a tag and attributes. This is combined with the attributes of the
currently-showing image with `tag` on `layer` to try to determine a unique image
to show. If a unique image can be show, returns the name of that image as
a tuple. Otherwise, returns None.
`tag`
The image tag to get attributes from. If not given, defaults to the first
component of `name`.
`layer`
The layer to check. If None, uses the default layer for `tag`.
.. function:: renpy.copy_images(old, new)
Copies images beginning with one prefix to images beginning with
@@ -19,6 +34,17 @@
A space-separated string giving the components of the new image
name.
.. function:: renpy.get_available_image_attributes(tag, attributes=())
Returns a list of tuples, with each tuple representing a possible
combination of image attributes that can be associated with `tag`.
If `attributes` is given, only images that contain all the attributes
in that iterable are returned.
.. function:: renpy.get_available_image_tags()
Returns a list of image tags that have been defined.
.. function:: renpy.get_image_bounds(tag, width=None, height=None, layer='master')
If an image with `tag` exists on `layer`, returns the bounding box of
@@ -30,6 +56,9 @@
`width`, `height`
The width and height of the area that contains the image. If None,
defaults the width and height of the screen, respectively.
`layer`
If None, uses the default layer for `tag`.
.. function:: renpy.get_placement(d)
@@ -82,6 +111,10 @@
May be a string giving the image name or a tuple giving each
component of the image name. It may also be a string giving
only the image tag.
`layer`
The layer to check. If None, uses the default layer for `tag`.
.. function:: renpy.start_predict(*args)
+25
View File
@@ -1,5 +1,27 @@
.. Automatically generated file - do not modify.
.. function:: renpy.add_layer(layer, above=None, below=None, menu_clear=True)
Adds a new layer to the screen. If the layer already exists, this
function does nothing.
One of `behind` or `above` must be given.
`layer`
A string giving the name of the new layer to add.
`above`
If not None, a string giving the name of a layer the new layer will
be placed above.
`below`
If not None, a string giving the name of a layer the new layer will
be placed below.
`menu_clear`
If true, this layer will be cleared when entering the game menu
context, and restored when leaving the
.. function:: renpy.call_stack_depth()
Returns the depth of the call stack of the current context - the number
@@ -168,6 +190,9 @@
If not_showing is True, this only returns a side image if the image the
attributes are taken from is not on the screen.
If `layer` is None, uses the default layer for the currently showing
tag.
.. function:: renpy.get_transition(layer=None)
+1
View File
@@ -67,6 +67,7 @@
* :func:`Pause`
* :func:`Pixellate`
* Play
* :func:`PlayCharacterVoice`
* Position
* :func:`Preference`
* :func:`Queue`
+1
View File
@@ -99,6 +99,7 @@
* :func:`Pixellate`
* :func:`Placeholder`
* Play
* :func:`PlayCharacterVoice`
* Position
* :func:`Preference`
* :func:`Queue`
+14 -4
View File
@@ -51,10 +51,20 @@
.. function:: renpy.get_screen(name, layer='screens')
Returns the ScreenDisplayable with the given `tag`, on
`layer`. If no displayable with the tag is not found, it is
interpreted as screen name. If it's still not found, None is returned.
Returns the ScreenDisplayable with the given `name` on layer. `name`
is first interpreted as a tag name, and then a screen name. If the
screen is not showing, returns None.
This can also take a list of names, in which case the first screen
that is showing is returned.
This function can be used to check if a screen is showing, using code
like::
if renpy.get_screen("say"):
text "The say screen is showing."
else:
text "The say screen is hidden."
.. function:: renpy.get_widget(screen, id, layer='screens')
+8 -4
View File
@@ -1,12 +1,14 @@
.. Automatically generated file - do not modify.
.. function:: renpy.get_at_list(name, layer='master')
.. function:: renpy.get_at_list(name, layer=None)
Returns the list of transforms being applied to the image with tag `name`
on `layer`. Returns an empty list if no transofrms are being applied, or
None if the image is not shown.
If `layer` is None, uses the default layer for the given tag.
.. function:: renpy.hide(name, layer='master')
.. function:: renpy.hide(name, layer=None)
Hides an image from a layer. The python equivalent of the hide statement.
@@ -15,7 +17,8 @@
any image with the tag is hidden (the precise name does not matter).
`layer`
The layer on which this function operates.
The layer on which this function operates. If None, uses the default
layer associated with the tag.
.. function:: renpy.image(name, d)
@@ -65,7 +68,8 @@
`layer`
A string, giving the name of the layer on which the image will be shown.
The equivalent of the ``onlayer`` property.
The equivalent of the ``onlayer`` property. If None, uses the default
layer associated with the tag.
`what`
If not None, this is a displayable that will be shown in lieu of
+1 -1
View File
@@ -1,6 +1,6 @@
.. Automatically generated file - do not modify.
.. function:: SideImage(prefix_tag='side')
.. function:: SideImage()
Returns the side image associated with the currently speaking character,
or a Null displayable if no such side image exists.
+9
View File
@@ -1,5 +1,14 @@
.. Automatically generated file - do not modify.
.. function:: PlayCharacterVoice(voice_tag, sample)
This plays `sample` on the voice channel, as if said by a
character with `voice_tag`.
`sample`
The full path to a sound file. No voice-related handling
of this file is done.
.. function:: SetCharacterVolume(voice_tag, volume=None)
This allows the volume of each characters to be adjusted.
+4
View File
@@ -22,6 +22,8 @@ with the same id. Ids are generated automatically by the screen
language, but when doing things by hand, they must be manually
specified.
Warning: UI Functions are deprecated and not recommended::
Here's an example python screen:
::
@@ -51,6 +53,8 @@ screens.
UI Functions
============
With the advent of SL2, UI Functions are deprecated and not recommended::
The UI functions are python equivalents of the screen language
statements. For each screen language statement, there is a ui function
with the same name. For example, ui.text corresponds to the text
+62 -2
View File
@@ -78,8 +78,8 @@ For example::
Variations
----------
There are two variants of side image support that can be selected - either alone
or together - using config variables:
There are a number of attributes of side images that can be controlled
using config variables.
.. var:: config.side_image_tag = None
@@ -101,6 +101,66 @@ or together - using config variables:
When set to true, the side image will only show if an image with that tag
is not already being shown on the screen.
.. var:: config.side_image_prefix_tag = 'side'
The prefix that is used when searching for a side image.
.. var:: config.side_image_null = Null()
The Null displayable to use when not displaying a side image. This
be changed, but only to other Null objects. One reason for doing so
would be to set the side of the Null (eg. Null(width=200, height=150))
to prevent dissolves from being cut off.
.. var:: config.side_image_same_transform = None
If not None, a transform that is used when the new side image shares the
same image tag as the previous side image.
.. var:: config.side_image_change_transform = None
If not None, a transform that is used when the new side image does not
share the name image tag (or one of the new or old side images does not
exist).
Transforms and Transitions
--------------------------
The :var:`config.side_image_same_transform` and
:var:`config.side_image_change_transform` transforms are called with two
arguments - old and new side image displayables - each time the side
image is displayed. These can be used to move around side images, or
use a transition to go between side images.
This code causes the side image to slide in and out when the character
associated with that image changes::
transform change_transform(old, new):
contains:
old
yalign 1.0
xpos 0.0 xanchor 0.0
linear 0.2 xanchor 1.0
contains:
new
yalign 1.0
xpos 0.0 xanchor 1.0
linear 0.2 xanchor 0.0
define config.side_image_change_transform = change_transform
This code is used to dissolve between old and new side images when the
character remains the same. (For example, when the character changes
emotion.) For the Dissolve to work correctly, both side images must
be the same size. ::
transform same_transform(old, new):
old
new with Dissolve(0.2, alpha=True)
define config.side_image_same_transform = same_transform
Leaving Room / Customization
----------------------------
+7 -7
View File
@@ -43,7 +43,7 @@ display: none;
<p><a name="Basic_Help" id="Basic_Help"></a></p>
<h2><span class="editsection">[<a href="/w/index.php?title=renpy/Help&amp;action=edit&amp;section=1" title="Edit section: Basic Help">edit</a>]</span>&nbsp;<span class="mw-headline">基本説明</span></h2>
<p>若開始進行遊戲,點擊滑鼠左鍵或按空格與回車鍵。遇到選項或選單,點擊滑鼠左鍵來選擇,或者使用方向鍵來選擇選項並按回車來確定。</p>
<p>開始進行遊戲,點擊滑鼠左鍵或按空白鍵與換行鍵。遇到選項或選單,點擊滑鼠左鍵來選擇,或者使用方向鍵來選擇選項並按換行鍵來確定。</p>
<p><a name="Game_Menu" id="Game_Menu"></a></p>
<h3><span class="editsection">[<a href="/w/index.php?title=renpy/Help&amp;action=edit&amp;section=2" title="Edit section: Game Menu">edit</a>]</span> <span class="mw-headline">遊戲選單</span></h3>
<p>當進行遊戲時,用滑鼠右擊或按下 Esc 鍵進入遊戲選單。遊戲選單給出以下選項:</p>
@@ -55,7 +55,7 @@ display: none;
<dt>載入</dt>
<dd>允許您通過點擊來載入指定檔位的遊戲檔案。點擊「自動」將訪問自動存儲的檔位。</dd>
<dt>設定<br></dt>
<dd>改變遊戲的偏好(選項/配置): <dl>
<dd>改變遊戲的偏好(options/configuration): <dl>
<dt>顯示</dt>
<dd>全屏模式和視窗模式之間切換。</dd>
<dt>過渡</dt>
@@ -65,7 +65,7 @@ display: none;
<dt>遊戲桿</dt>
<dd>讓您使用遊戲桿來進行遊戲。</dd>
<dt>略過<dt>
<dd>在選擇略過已讀訊(遊戲中經歷的所有)和略過所有訊之間作選擇。</dd>
<dd>在選擇略過已讀訊(遊戲中經歷的所有)和略過所有訊之間作選擇。</dd>
<dt>開始略過<br></dt>
<dd>返回遊戲,並開始略過模式。</dd>
<dt>選擇後<br></dt>
@@ -88,9 +88,9 @@ display: none;
<p><a name="Key_and_Mouse_Bindings" id="Key_and_Mouse_Bindings"></a></p>
<h3><span class="editsection">[<a href="/w/index.php?title=renpy/Help&amp;action=edit&amp;section=3" title="Edit section: Key and Mouse Bindings">edit</a>]</span> <span class="mw-headline">鍵盤和滑鼠綁定</span></h3>
<dl>
<dt>左擊,回車</dt>
<dt>左擊,換行鍵</dt>
<dd>繼續遊戲,確定選項按鈕和滑動塊。</dd>
<dt></dt>
<dt>白鍵</dt>
<dd>繼續遊戲,但不會確認選項。</dd><dd><br></dd>
<dt>方向鍵</dt>
<dd>選擇選項,按鈕和滑動塊。</dd>
@@ -111,7 +111,7 @@ display: none;
<dt>S</dt>
<dd>產生截圖,保存類型為 screenshootxxxx.png ,其中 xxxx 表示一組數位串。</dd>
<dt>Alt-M, Command-M</dt>
<dd>隱藏視窗到工作列。</dd>
<dd>最小化視窗到工作列。</dd>
<dt>Alt-F4, Command-Q</dt>
<dd>離開遊戲。</dd>
<dt>Delete</dt>
@@ -119,6 +119,6 @@ display: none;
</dl>
<p><a name="Legal_Notice" id="Legal_Notice"></a></p>
<h2><span class="editsection">[<a href="/w/index.php?title=renpy/Help&amp;action=edit&amp;section=4" title="Edit section: Legal Notice">edit</a>]</span> <span class="mw-headline">法律公告</span></h2>
<p>本遊戲使用了各開源專案的原始程式碼。如果您需要取原始碼和清單,請參閲 Ren'py 目錄中的 LICENSE.txt 檔案,或者訪問 <a href="http://www.renpy.org/wiki/renpy/License" class="external free" title="http://www.renpy.org/wiki/renpy/License" rel="nofollow">http://www.renpy.org/wiki/renpy/License</a></p>
<p>本遊戲使用了各開源專案的原始程式碼製作。如果您需要取原始碼和清單,請參閲 Ren'py 目錄中的 LICENSE.txt 檔案,或者訪問 <a href="http://www.renpy.org/wiki/renpy/License" class="external free" title="http://www.renpy.org/wiki/renpy/License" rel="nofollow">http://www.renpy.org/wiki/renpy/License</a></p>
</body></html>
+326 -164
View File
@@ -1,142 +1,150 @@
## This file contains some of the options that can be changed to customize
## your Ren'Py game. It only contains the most common options... there
## is quite a bit more customization you can do.
## 本檔包含部分可用於修改與定制的選項代碼,
## 它將會起作用於您的遊戲之中。 但這只是很多選項中的一部分,
## 您還可以對它進行很多自由的添加與修改。
##
## Lines beginning with two '#' marks are comments, and you shouldn't
## uncomment them. Lines beginning with a single '#' mark are
## commented-out code, and you may want to uncomment them when
## appropriate.
## 以兩個「#」號開頭的行是注釋行,您不應該清除這些注釋。
## 而以單個「#」號開頭的行是反注釋或備用參數,您可以在有必要的時候
## 選擇清除掉這些行
##
## 注釋:Ren'py引擎對空格等符號有著嚴格的要求,並且不能識別Tab定位字元,
## 無論是在此輸入參數,還是今後編輯遊戲腳本時,請務必小心空格的數量,
## 同時不能存在Tab定位字元,否則將會導致整個專案無法啟動!
init -1 python hide:
## Should we enable the use of developer tools? This should be
## set to False before the game is released, so the user can't
## cheat using developer tools.
## 此選項可供調整開發者工具的開關,
## 在遊戲正式發佈之前,應設定為False,
## 以避免使用者使用開發者工具進行遊戲作弊。
config.developer = True
## These control the width and height of the screen.
## 這些控制螢幕的寬度和高度。
## 此選項控制遊戲視窗的解析度。
config.screen_width = 800
config.screen_height = 600
## This controls the title of the window, when Ren'Py is
## running in a window.
## 當Ren'py專案以視窗化運行時,
## 此選項控制視窗的標題名稱。
## 注釋:需要命名為非英文字元時,需要在雙引號前加「u」以表示Unicode字元,
## 但即使命名為英文名稱也不一定需要將「u」去掉。
config.window_title = u"PROJECT_NAME"
# These control the name and version of the game, that are reported
# with tracebacks and other debugging logs.
# 當 Ren'Py 啓動時,此參數控制視窗的標題。
# 并在一個視窗中運行。
# 此選項控制遊戲的名稱與版本號,
# 並將它們回饋至debug工具與日誌中。
#
# 注釋:此選項通常針對開發者,SDK主介面的專案名稱、開發過程中的traceback.txt、
# 編譯時的可執行程式名稱、以及壓縮檔名稱中會有所體現,但與上述視窗標題無關。
config.name = "PROJECT_NAME"
config.version = "0.0"
#########################################
# Themes
# 主題
## We then want to call a theme function. theme.roundrect is
## a theme that features the use of rounded rectangles.
## 接著,我們就希望使用到主題功能。 theme.roundrect
## 代表著使用圓角矩形特性的主題。
##
## The theme function takes a number of parameters that can
## customize the color scheme.
## 主題功能擁有幾個參數
## 可使您對主題進行一定的自訂。
theme.regal(
## Theme: Regal
## Color scheme: Tree Frog
theme.roundrect(
## The color of an idle widget face.
widget = "#1c140d",
## 空閒控制項的顏色。
## 注釋:控制項通常體現在按鈕上,此處為滑鼠指標未指向時的顏色。
widget = "#003c78",
## The color of a focused widget face.
widget_hover = "#86827e",
## 被指向控制項的顏色。
widget_hover = "#0050a0",
## The color of the text in a widget.
widget_text = "#cbe86b",
## 控制項內文本顏色。
widget_text = "#c8ffff",
## The color of the text in a selected widget. (For
## example, the current value of a preference.)
widget_selected = "#f2e9e1",
## 被選中控制項內的文本顏色。
## 例:當前使用的參數。
widget_selected = "#ffffc8",
## The color of a disabled widget face.
disabled = "#ffffff",
## 被遮罩控制項的顏色。
disabled = "#404040",
## The color of disabled widget text.
disabled_text = "#1c140d",
## 被遮罩控制項內文本的顏色。
disabled_text = "#c8c8c8",
## The color of informational labels.
label = "#1c140d",
## 資訊框內的文本顏色。
label = "#ffffff",
## The color of a frame containing widgets.
frame = "#cbe86b",
## 含框架的控制項顏色。
frame = "#6496c8",
## The background of the main menu. This can be a color
## beginning with '#', or an image filename. The latter
## should take up the full height and width of the screen.
mm_root = "#ffffff",
## The background of the game menu. This can be a color
## beginning with '#', or an image filename. The latter
## should take up the full height and width of the screen.
gm_root = "#ffffff",
## If this is True, the in-game window is rounded. If False,
## the in-game window is square.
## 若設定為True,則遊戲內視窗顯示為圓角。
## 若為False,則遊戲內視窗顯示為矩形。
rounded_window = False,
## And we're done with the theme. The theme will customize
## various styles, so if we want to change them, we should
## do so below.
## 主選單的背景。
## 此處可以以「#」開頭代表一個顏色,或引用一個檔。
## 謹記,圖片檔的解析度要與實際視窗的解析度相同。
mm_root = "#dcebff",
## 遊戲內選單的背景。
## 使用方法與注意事項同上。
gm_root = "#dcebff",
## 主題的設定到此結束。
## 主題控制著多個可視性效果,若需要修改,
## 請參見下方參數。
)
#########################################
## These settings let you customize the window containing the
## dialogue and narration, by replacing it with an image.
## 此處的設定可允許您修改含有對話或旁白的文字方塊背景。
## 通過引用一個檔來修改它。
## The background of the window. In a Frame, the two numbers
## are the size of the left/right and top/bottom borders,
## respectively.
## 文字方塊的背景。 在Frame後的括弧中,兩個數字分別代表
## 左右邊距和上下邊距。
# style.window.background = Frame("frame.png", 12, 12)
## Margin is space surrounding the window, where the background
## is not drawn.
## 留邊參數用於設定文字方塊視窗周圍的空白部分。
## 這些部分將不會覆蓋背景圖。
## 注釋:如數值越大,則文字方塊周圍的空白越多,文字方塊本身越小,
## 但這僅限於文字方塊圖形本身,文字不受此參數影響。
# style.window.left_margin = 6
# style.window.right_margin = 6
# style.window.top_margin = 6
# style.window.bottom_margin = 6
## Padding is space inside the window, where the background is
## drawn.
## 填充參數是文字方塊視窗內的空白部分。
## 注釋:與上一個參數作用正好相反,
## 它會影響文字方塊內文字的顯示範圍。
# style.window.left_padding = 6
# style.window.right_padding = 6
# style.window.top_padding = 6
# style.window.bottom_padding = 6
## This is the minimum height of the window, including the margins
## and padding.
## 此參數控制視窗最低高度,並包含留邊與填充參數。
# style.window.yminimum = 250
#########################################
## This lets you change the placement of the main menu.
## 此處參數可使您修改主選單放置的位置。
## The way placement works is that we find an anchor point
## inside a displayable, and a position (pos) point on the
## screen. We then place the displayable so the two points are
## at the same place.
## 此參數的原理是在視覺化元素內尋找一個定位點(anchor),
## 以及在遊戲螢幕上尋找一個位置點(pos)。
## 接著我們會將兩個點進行重合。
##
## 注釋:視覺化元素內的定位點可假想為一個圖片中指定的點,
## 當pos參數指定一個遊戲視窗內的位置(點)後,
## 引擎便會將圖片中指定的點與視窗中指定好的點進行重合放置。
## 預設情況下,兩軸的anchor都為0.5時,定位點位於視覺化元素中心。
## An anchor/pos can be given as an integer or a floating point
## number. If an integer, the number is interpreted as a number
## of pixels from the upper-left corner. If a floating point,
## the number is interpreted as a fraction of the size of the
## displayable or screen.
## 定位點與位置點均可使用整數或小數表達。
## 如果設定為整數,則會被理解為距離左上角的圖元數量。
## 如果設定為小數,則會被理解為遊戲視窗分數化的位置。
##
## 注釋:分數化位置不難理解,如0.5,則代表遊戲視窗的二分之一處,
## 此時xy兩軸依舊有效。
# style.mm_menu_frame.xpos = 0.5
# style.mm_menu_frame.xanchor = 0.5
@@ -145,184 +153,338 @@ init -1 python hide:
#########################################
## These let you customize the default font used for text in Ren'Py.
## 可以在以下各項中自訂預設字型。
## 此處可修改Ren'py遊戲內的預設字型。
## The file containing the default font.
## 設定預設字型。
## 引用一個字體檔。
style.default.font = "tl/None/DroidSansFallback.ttf"
style._default.font = "tl/None/DroidSansFallback.ttf"
## The default size of text.
## 更改預設文字的大小。
## 修改字體大小。
# style.default.size = 22
## Note that these only change the size of some of the text. Other
## buttons have their own styles.
## 以上設定,可以變更某些文本的大小。
## 對其他都設定為他們自己的按鈕的文本樣式。
## 注意此參數僅能修改部分字體的大小,
## 一些按鈕擁有它們自己的風格參數。
#########################################
## These settings let you change some of the sounds that are used by
## Ren'Py.
## 此參數可使您修改Ren'py遊戲內使用的一些聲音。
## Set this to False if the game does not have any sound effects.
## 若為False,您的遊戲內將不會包含任何聲音效果。
config.has_sound = True
## Set this to False if the game does not have any music.
## 若您的遊戲內不包含任何音樂,請設定為False。
config.has_music = True
## Set this to True if the game has voicing.
## 若您的遊戲含有人物語音,請設定為True。
config.has_voice = False
## Sounds that are used when button and imagemaps are clicked.
## 設定在您點擊按鈕和圖片映射時的效果音。
# style.button.activate_sound = "click.wav"
# style.imagemap.activate_sound = "click.wav"
## Sounds that are used when entering and exiting the game menu.
## 設定在您進入和退出遊戲內選單時的聲音效果。
# config.enter_sound = "click.wav"
# config.exit_sound = "click.wav"
## A sample sound that can be played to check the sound volume.
## 設定一個聲音用於測試音量大小。
# config.sample_sound = "click.wav"
## Music that is played while the user is at the main menu.
## 設定使用者位於主選單時的音樂。
# config.main_menu_music = "main_menu_theme.ogg"
#########################################
## Help.
## 説明。
## 説明
## This lets you configure the help option on the Ren'Py menus.
## It may be:
## - A label in the script, in which case that label is called to
## show help to the user.
## - A file name relative to the base directory, which is opened in a
## web browser.
## - None, to disable help.
## 這允許您配置 Ren'Py 選單中的説明選項。
## 此參數可讓您控制Ren'py遊戲內的「説明」選項。
## 它可以是:
## - 腳本中的一個label,用於在點擊後向使用者顯示一段説明。
## - 遊戲根目錄下的一個檔,點擊後將會打開網頁瀏覽器。
## - 若為None,則關閉此功能。
##
## 注釋:label通常用於遊戲劇情腳本,如script.rpy中,label start:
## 指的就是點擊開始遊戲時指向的label。 label中可包含對話、旁白、
## 選項、背景、聲音等參數。
config.help = "README.html"
#########################################
## Transitions.
## 過渡。
## 過渡特效
## Used when entering the game menu from the game.
## 進入遊戲選單(右鍵選單)時的轉場方式。
## 從遊戲中進入遊戲內選單時的過渡特效。
config.enter_transition = None
## Used when exiting the game menu to the game.
## 脫離遊戲選單(右鍵選單)時的轉場方式。
## 退出選單回到遊戲時的過渡特效。
config.exit_transition = None
## Used between screens of the game menu.
## 在主選單、遊戲選單、設定畫面、存讀檔畫面中交叉切換時的內部轉場方式。
## 在遊戲選單內進行切換時的過渡特效。
config.intra_transition = None
## Used when entering the game menu from the main menu.
## 遷移到遊戲選單從主選單中的過渡時間。
## 從主選單進入遊戲內選單時的過渡特效。
config.main_game_transition = None
## Used when returning to the main menu from the game.
## 過渡時間暫停遊戲並返回到主選單。
## 退出選單回到主選單時的過渡特效。
config.game_main_transition = None
## Used when entering the main menu from the splashscreen.
## 開啟遊戲,第一次進入主選單時的轉場方式。
## 從封面進入主選單時的過渡特效。
## 注釋:封面(splashscreen)指的是打開遊戲時
## 先看到的一些發行商圖片或遊戲宣傳視頻等。
## 封面需要另外添加代碼實現,請參見官方文檔。
config.end_splash_transition = None
## Used when entering the main menu after the game has ended.
## 遊戲結束(碰到 return)跳回主選單時的轉場方式。
## 當遊戲結束時返回主選單的過渡特效。
config.end_game_transition = None
## Used when a game is loaded.
## 在 load 畫面載入遊戲時採用的轉場方式。
## 當一個進度被載入時的過渡特效。
config.after_load_transition = None
## Used when the window is shown.
## 顯式秀出對話框時使用的轉場方式(不過您目前還不知道怎麼操作)
## 當一個遊戲內視窗顯示時的過渡特效。
## 注釋:遊戲內視窗多指文字方塊
config.window_show_transition = None
## Used when the window is hidden.
## 顯式關閉對話框時使用的轉場方式(不過您目前還不知道怎麼操作)。
## 當一個遊戲內視窗被隱藏時的過渡特效。
config.window_hide_transition = None
## Used when showing NVL-mode text directly after ADV-mode text.
## 當在 ADV-mode 文字後直接顯示 NVL-mode 文字時使用。
## 當顯示完ADV-mode下的文本後直接轉為NVL-mode文本時的過渡特效。
## 注釋:ADV-mode是指文本位於螢幕底部文字方塊中的遊戲模式,
## NVL-mode是指文本全屏顯示的遊戲模式。
config.adv_nvl_transition = dissolve
## Used when showing ADV-mode text directly after NVL-mode text.
## 當在 NVL-mode 文字後直接顯示 ADV-mode 文字時使用。
## 當顯示完NVL-mode的文本後直接轉為ADV-mode文本時的過渡特效。
config.nvl_adv_transition = dissolve
## Used when yesno is shown.
## 當顯示怒氣衝衝時使用。
## 當確認取消按鈕出現時的過渡特效。
config.enter_yesno_transition = None
## Used when the yesno is hidden.
## 當怒氣衝衝處於隱藏狀態時使用。
## 當確認取消按鈕隱藏時的過渡特效
config.exit_yesno_transition = None
## Used when entering a replay
## 當進入重播時使用
## 當進入重播時的過渡特效。
config.enter_replay_transition = None
## Used when exiting a replay
## 當退出重播時使用
## 當退出重播時的過渡特效。
config.exit_replay_transition = None
## Used when the image is changed by a say statement with image attributes.
## 圖像由對話語句向圖像屬性更改時使用。
## 當圖像被say參數附帶屬性進行修改時的過渡特效。
config.say_attribute_transition = None
#########################################
## This is the name of the directory where the game's data is
## stored. (It needs to be set early, before any other init code
## is run, so the persistent information can be found by the init code.)
## 遊戲資料存儲在硬碟中的路徑名稱。
## 它需要及早設定,在初始化代碼運行之前,所以持續的資訊可以通過初始化代碼中找到。
## 此處可使您修改遊戲存檔資料存放的目錄。
## 這需要在遊戲開發之初,在任何init代碼都未被運行之前就進行設定,
## 以便在init中找到正確的持久性資料資訊。
python early:
config.save_directory = "PROJECT_NAME-UNIQUE"
init -1 python hide:
#########################################
## Default values of Preferences.
## 首選項的預設值。
## 設定中的預設選項。
## Note: These options are only evaluated the first time a
## game is run. To have them run a second time, delete
## 注意:這些選項僅會在第一次運行遊戲時生效。
## 若需要再生效一次,請刪除:
## game/saves/persistent
## 注釋:僅當運行的遊戲第一次來計算的值時,此選項才可用。
## 如果你想要應用的修改後的遊戲值請返回到
## game/saves/persistent 請刪除該檔。
## Should we start in fullscreen mode?
## 全螢幕模式嗎?
## 是否開啟全螢幕模式?
config.default_fullscreen = False
## The default text speed in characters per second. 0 is infinite.
## 預設文本字元 / 秒的表示速度。0 表示無限。
## 預設的每秒顯示文字數量,0為無限。
config.default_text_cps = 0
## The default auto-forward time setting.
## 設定預設自動前進時間。
## 預設的自動閱讀模式等待時間。
config.default_afm_time = 10
## 預設開啟換行後保持語音播放功能。
config.default_voice_sustain = True
#########################################
## More customizations can go here.
## 您可以從此處開始進行更多的自訂設定。
## 注釋:以下為範本原文的追加代碼。
## 此選項可讓您使用滑鼠滾輪閱讀劇情。
# config.keymap['dismiss'].append('mousedown_5')
## Windows 用標題列圖示設定。
## 圖像尺寸必須為 32x32 。
# config.windows_icon = "image/head.png"
## 圖像快取最高值設定。
## 數量過高有可能導致遊戲崩潰。
# config.image_cache_size = 8
## 設定跳過文字功能。
## 無法停止暫時性跳過時,請設定為None。
# config.allow_skipping = True
## 設定跳過文字的延遲時間。
# config.skip_delay = 25
## 是否允許非開發者通過>鍵使用快速略過模式。
## 注釋:快速略過模式非常快,所有未讀文字也將被略過。
# config.fast_skipping = False
## 設定文字回滾功能。
## 若需要持續回滾劇情,請使用renpy.block_rollback()。
## hard_rollback_limit 參數記錄回滾的行數。
# config.rollback_enabled = True
# config.hard_rollback_limit = 500
## 修改存檔位的縮略圖解析度。
# config.thumbnail_height = 75
# config.thumbnail_width = 100
## 若角色圖片檔使用image命令顯示時,
## 若此參數設定為True,則角色圖像僅以側邊圖(side image)
## 形式呈現。
# config.side_image_only_not_showing = False
## 預設圖層。
# config.layers = [ 'master', 'transient', 'screens', 'overlay' ]
## 添加最上方圖層。
## 此圖層不受過渡特效影響。
# config.top_layers = [ ]
## 回滾劇情時使用NVL-mode。
# config.nvl_paged_rollback = True
## 選項出現時使用NVL-mode。
# menu = nvl_menu
## 設定是否允許通過滑鼠拖拽改變視窗大小。
# config.gl_resize = False
## 遊戲啟動時視窗居中。
# import os
# os.environ['SDL_VIDEO_CENTERED'] = '1'
## 設定音樂預設的淡化(fade)時間。
# config.fade_music = 0.0
## 定義一個角色語音存放的資料夾,在腳本中可以直接進行調用。
## 定義以後,您只需輸入音訊的檔案名即可播放音訊。
# config.auto_voice = "voice/{filename}.ogg"
# config.voice_filename_format = "{filename}.ogg"
## 預設聲音通道。
## file_prefix中填入路徑,file_suffix中填入尾碼名,
## 即可實現僅需輸入檔案名就能重播聲音。
# renpy.music.register_channel("music", mixer="music" loop = True, file_prefix="", file_suffix="")
# renpy.music.register_channel("sound", mixer="sfx", loop = False, file_prefix="", file_suffix="")
# renpy.music.register_channel("voice", mixer="voice", loop = False, file_prefix="", file_suffix="")
## 按鍵連按參數。
## (.3,.03)的情況下,按住按鍵.3秒後,將會以.03秒為間隔自動連按。
# config.key_repeat = (.3, .03)
## 此區域控制您將如何產生一個釋出版本程式。
init python:
## 此參數用於修改發行版本壓縮檔與資料夾的名稱。
## 假如設定為「mygame-1.0」,則將會在產生Windows釋出版本時自動將遊戲放置在
## 「mygame-1.0-win」資料夾下,並產生mygame-1.0-win.zip的壓縮檔。
## 產生其他平臺的釋出版本時除「win」字元以外其他依舊沿用此處設定。
build.directory_name = "HANA-Build-1.0"
## 遊戲可執行程式的檔案名。
## 例如設定為「mygame」時,則產生發行版本後,
## 其遊戲目錄下可執行檔的檔案名將會為「mygame.exe」,
build.executable_name = "SHIRAYUKI"
## 如果設定為True,則此Ren'py遊戲將包含升級資訊,
## 使其允許升級程式運行。
build.include_update = False
## 檔案模式:
## 以下功能稱作檔案模式,檔案模式對大小寫並不敏感,
## 並且將「/」用於表示目錄的分層。
## 若存在多個檔案模式,則優先使用第一個。
## 在檔案模式中:
## /
## 這是一個目錄的分隔符號。
## *
## 代表所有字元,除目錄分隔符號以外。
## **
## 代表所有字元,包括目錄分隔符號。
## 例如:
## *.txt
## 代表遊戲根目錄下的所有txt檔。
## game/**.ogg
## 代表game資料夾下及其所有子資料夾中的ogg檔。
## **.psd
## 代表專案中所有地方的psd檔。
## 定義為None的檔將不會被包含在分佈版中。
build.classify('**~', None)
# build.classify('**.bak', None)
# build.classify('**/.**', None)
build.classify('**/#**', None)
build.classify('**/thumbs.db', None)
## 此處用於定義遊戲資源封裝的名稱。
## 注釋:您需要預先在此處預先定義封裝的名稱後,
## 才能在下一個參數中設定使用對應名稱的封裝。
# build.archive('script', 'all')
# build.archive('image', 'all')
# build.archive('bg', 'all')
# build.archive('voice', 'all')
# build.archive('char', 'all')
# build.archive('sound', 'all')
# build.archive('data', 'all')
## 若要將遊戲資源檔封裝,
## 請將它們定義為「archive」。
## 注釋:此處用於定義需要放進封裝的遊戲資源檔案清單,需要事先定義。
## 同時,在上方定義好archive的名稱後,可以在下方直接使用自訂名稱。
# build.classify('game/*.rpy', 'script')
# build.classify('game/*.rpyc', 'script')
# build.classify('game/*.rpyb', 'script')
# build.classify('game/bg/*.png', 'image')
# build.classify('game/char/*.png', 'image')
# build.classify('game/image/*.png', 'image')
# build.classify('game/voice/*.ogg', 'voice')
# build.classify('game/sound/*.ogg', 'sound')
# build.classify('game/data/**.*', 'data')
# build.classify('game/data/mask/**.*', 'data')
## 符合documentation樣式的檔,
## 在mac用分發版中同時包含在app與zip中。
build.documentation('*.html')
build.documentation('*.txt')
## 定義一整個資料夾的圖像,在腳本中可直接使用檔案名進行調用,
## 避免單個檔定義的繁瑣步驟。
## 注釋:詳細使用方法請參閱官方文檔。
# config.automatic_images = [ '/' ]
# config.automatic_images_strip = [ '/' ]
## 打開行動平臺上的視頻硬體加速,提升視頻播放效能。
## 理論上絕大多數平臺支援硬體加速功能。
# config.hw_video = True
## 打開選擇肢自動封存功能,存檔將會放到Q.Save位置。
# config.autosave_on_choice = True
+49 -47
View File
@@ -1,21 +1,21 @@
# This file is in the public domain. Feel free to modify it as a basis
# for your own screens.
# 此檔屬於公共領域,
# 請為屬於您的遊戲螢幕內容自由地定制。
##############################################################################
# Say
#
# Screen that's used to display adv-mode dialogue.
# 用於顯示adv-mode對話的螢幕。
# http://www.renpy.org/doc/html/screen_special.html#say
screen say:
# Defaults for side_image and two_window
# 側邊圖(side_image)與雙文字方塊的預設值。
default side_image = None
default two_window = False
# Decide if we want to use the one-window or two-window variant.
# 決定單文字方塊或雙文字方塊的變數:
if not two_window:
# The one window variant.
# 單文字方塊。
window:
id "window"
@@ -29,7 +29,7 @@ screen say:
else:
# The two window variant.
# 雙文字方塊。
vbox:
style "say_two_window_vbox"
@@ -48,20 +48,20 @@ screen say:
text what id "what"
# If there's a side image, display it above the text.
# 如果存在側邊圖,將其顯示于文字上方。
if side_image:
add side_image
else:
add SideImage() xalign 0.0 yalign 1.0
# Use the quick menu.
# 使用快速選單。
use quick_menu
##############################################################################
# Choice
#
# Screen that's used to display in-game menus.
# 顯示遊戲內選項的螢幕。
# http://www.renpy.org/doc/html/screen_special.html#choice
screen choice:
@@ -104,7 +104,7 @@ init -2:
##############################################################################
# Input
#
# Screen that's used to display renpy.input()
# 用於顯示renpy.input()對應效果的螢幕。
# http://www.renpy.org/doc/html/screen_special.html#input
screen input:
@@ -120,7 +120,7 @@ screen input:
##############################################################################
# Nvl
#
# Screen used for nvl-mode dialogue and menus.
# 用於顯示nvl-mode對話與選項的螢幕。
# http://www.renpy.org/doc/html/screen_special.html#nvl
screen nvl:
@@ -131,7 +131,7 @@ screen nvl:
has vbox:
style "nvl_vbox"
# Display dialogue.
# 顯示對話。
for who, what, who_id, what_id, window_id in dialogue:
window:
id window_id
@@ -144,7 +144,7 @@ screen nvl:
text what id what_id
# Display a menu, if given.
# 顯示選項,如果有。
if items:
vbox:
@@ -171,19 +171,19 @@ screen nvl:
##############################################################################
# Main Menu
#
# Screen that's used to display the main menu, when Ren'Py first starts
# 用於初次啟動時顯示Ren'py遊戲主選單的螢幕。
# http://www.renpy.org/doc/html/screen_special.html#main-menu
screen main_menu:
# This ensures that any other menu screen is replaced.
# 確保其他的選單螢幕被替換。
tag menu
# The background of the main menu.
# 主選單背景。
window:
style "mm_root"
# The main menu buttons.
# 主選單按鈕。
frame:
style_group "mm"
xalign .98
@@ -199,7 +199,7 @@ screen main_menu:
init -2:
# Make all the main menu buttons be the same size.
# 使所有選單按鈕的大小一致。
style mm_button:
size_group "mm"
@@ -208,16 +208,17 @@ init -2:
##############################################################################
# Navigation
#
# Screen that's included in other screens to display the game menu
# navigation and background.
# 遊戲螢幕內的另一個螢幕,用於顯示
# 遊戲選項的導航與背景。
# 注釋:參見Ren'py引擎SDK附帶的tutorial。
# http://www.renpy.org/doc/html/screen_special.html#navigation
screen navigation:
# The background of the game menu.
# 遊戲選單的背景。
window:
style "gm_root"
# The various buttons.
# 不同的按鈕。
frame:
style_group "gm_nav"
xalign .98
@@ -235,7 +236,7 @@ screen navigation:
init -2:
# Make all game menu navigation buttons the same size.
# 使所有導航選項按鈕大小相同。
style gm_nav_button:
size_group "gm_nav"
@@ -243,13 +244,13 @@ init -2:
##############################################################################
# Save, Load
#
# Screens that allow the user to save and load the game.
# 使用者能夠存檔與讀檔的螢幕。
# http://www.renpy.org/doc/html/screen_special.html#save
# http://www.renpy.org/doc/html/screen_special.html#load
# Since saving and loading are so similar, we combine them into
# a single screen, file_picker. We then use the file_picker screen
# from simple load and save screens.
# 因為存檔與讀檔都非常相似,
# 因此我們將它們混合到一個螢幕中,file_picker
# 於是我們就用file_picker螢幕來實現簡單的存檔與讀檔。
screen file_picker:
@@ -258,8 +259,8 @@ screen file_picker:
has vbox
# The buttons at the top allow the user to pick a
# page of files.
# 頂部的按鈕可允許使用者選擇
# 存檔的頁數。
hbox:
style_group "file_picker_nav"
@@ -282,23 +283,23 @@ screen file_picker:
$ columns = 2
$ rows = 5
# Display a grid of file slots.
# 顯示存檔位網格。
grid columns rows:
transpose True
xfill True
style_group "file_picker"
# Display ten file slots, numbered 1 - 10.
# 顯示十個存檔位,編號為1-10
for i in range(1, columns * rows + 1):
# Each file slot is a button.
# 每個存檔位都是一個按鈕。
button:
action FileAction(i)
xfill True
has hbox
# Add the screenshot.
# 添加螢幕截圖。
add FileScreenshot(i)
$ file_name = FileSlotName(i, columns * rows)
@@ -312,7 +313,7 @@ screen file_picker:
screen save:
# This ensures that any other menu screen is replaced.
# 確保其他任何選單都被覆蓋。
tag menu
use navigation
@@ -320,7 +321,7 @@ screen save:
screen load:
# This ensures that any other menu screen is replaced.
# 確保其他任何選單都被覆蓋。
tag menu
use navigation
@@ -337,22 +338,22 @@ init -2:
##############################################################################
# Preferences
#
# Screen that allows the user to change the preferences.
# 允許使用者更改偏好設置的螢幕。
# http://www.renpy.org/doc/html/screen_special.html#prefereces
screen preferences:
tag menu
# Include the navigation.
# 包含導航選項。
use navigation
# Put the navigation columns in a three-wide grid.
# 縱向放置導航選項于三個寬列中。
grid 3 1:
style_group "prefs"
xfill True
# The left column.
# 左側縱欄。
vbox:
frame:
style_group "pref"
@@ -383,7 +384,7 @@ screen preferences:
textbutton _("Joystick...") action Preference("joystick")
# 中間縱欄
vbox:
frame:
style_group "pref"
@@ -416,7 +417,7 @@ screen preferences:
if config.has_voice:
textbutton _("Wait for Voice") action Preference("wait for voice", "toggle")
# 右側縱欄
vbox:
frame:
style_group "pref"
@@ -475,7 +476,7 @@ init -2:
##############################################################################
# Yes/No Prompt
#
# Screen that asks the user a yes or no question.
# 用於詢問使用者確定與否的螢幕。
# http://www.renpy.org/doc/html/screen_special.html#yesno-prompt
screen yesno_prompt:
@@ -509,7 +510,7 @@ screen yesno_prompt:
textbutton _("Yes") action yes_action
textbutton _("No") action no_action
# Right-click and escape answer "no".
# 按右鍵進行回避並回答「否」。
key "game_menu" action no_action
init -2:
@@ -524,11 +525,12 @@ init -2:
##############################################################################
# Quick Menu
#
# A screen that's included by the default say screen, and adds quick access to
# several useful functions.
# 包含在預設的say螢幕中的螢幕,
# 用於快速訪問某些實用功能。
# 注釋:也就是文字方塊下方的存檔、讀檔等按鈕。
screen quick_menu:
# Add an in-game quick menu.
# 添加一個遊戲內快速訪問的選單。
hbox:
style_group "quick"
@@ -1,21 +1,17 @@
# You can place the script of your game in this file.
# 此檔包含遊戲腳本。
# 您可以在此編寫遊戲的腳本。
# Declare images below this line, using the image statement.
# image 定義圖像使用門。
# image命令可用於定義一個圖像。
# eg. image eileen happy = "eileen_happy.png"
# Declare characters used by this game.
# 定義在遊戲中使用的字元。
define e = Character('艾琳', color="#c8ffc8")
# define命令可定義遊戲中出現的角色名稱與對應文本顏色。
define e = Character('Eileen', color="#c8ffc8")
# The game starts here.
# 遊戲從這裡開始。
label start:
e "您已經創建了一個新的 Ren'Py 遊戲。"
e "一旦您添加了一個故事 圖片和音樂,您可以將它發佈給全世界 "
e "您添加一段故事, 圖片和音樂, 您就可以將它發佈給全世界!"
return
@@ -1,306 +1,21 @@

translate None strings:
# renpy/common/00action_file.rpy:118
# renpy/common/00action_file.rpy:142
old "%b %d, %H:%M"
new "%m月%d日, %H:%M"
translate None strings:
# renpy/common/00gltest.rpy:50
old "Graphics Acceleration"
new "圖形加速"
# renpy/common/00gltest.rpy:54
old "Automatically Choose"
new "自動選擇"
# renpy/common/00gltest.rpy:59
old "Force Angle/DirectX Renderer"
new "強制 Angle/DirectX 渲染"
# renpy/common/00gltest.rpy:63
old "Force OpenGL Renderer"
new "強制 OpenGL 渲染"
# renpy/common/00gltest.rpy:67
old "Force Software Renderer"
new "強制軟體渲染"
# renpy/common/00gltest.rpy:73
old "Changes will take effect the next time this program is run."
new "更改將會在下次啟動程式時生效。"
# renpy/common/00gltest.rpy:112
old "Performance Warning"
new "效能警告"
# renpy/common/00gltest.rpy:117
old "This computer is using software rendering."
new "該電腦正在使用軟體渲染。"
# renpy/common/00gltest.rpy:119
old "This computer is not using shaders."
new "該電腦沒有使用著色器"
# renpy/common/00gltest.rpy:121
old "This computer is displaying graphics slowly."
new "該電腦圖形顯示緩慢。"
# renpy/common/00gltest.rpy:123
old "This computer has a problem displaying graphics: [problem]."
new "該電腦圖形顯示出錯:[problem]。"
# renpy/common/00gltest.rpy:128
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
new "目前的圖形驅動程式版本可能過舊或者運作不正確。這樣會導致圖形顯示緩慢或者錯誤。升級 DirectX 可能會解決該問題。"
# renpy/common/00gltest.rpy:130
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new "目前圖形驅動程式版本可能過舊或者運作不正確。這樣會導致圖形顯示緩慢或者錯誤。"
# renpy/common/00gltest.rpy:135
old "Update DirectX"
new "更新 DirectX"
# renpy/common/00gltest.rpy:141
old "Continue, Show this warning again"
new "繼續,下次再顯示該警告"
# renpy/common/00gltest.rpy:145
old "Continue, Don't show warning again"
new "繼續,不再顯示該警告"
# renpy/common/00gltest.rpy:171
old "Updating DirectX."
new "正在更新 DirectX。"
# renpy/common/00gltest.rpy:175
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
new "DirectX 線上安裝已啟動。將會最小化到狀態列中。請按照說明安裝 DirectX。"
# renpy/common/00gltest.rpy:179
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
new "{b}警告:{/b} Microsoft's DirectX 線上安裝程式會預設安裝 Bing 瀏覽器工具列。如果您不需要安裝這個工具列,請取消勾選對應選項。"
# renpy/common/00gltest.rpy:183
old "When setup finishes, please click below to restart this program."
new "當安裝完成後請點選下方來重新啟動應用程式。"
# renpy/common/00gltest.rpy:185
old "Restart"
new "重新啟動"
translate None strings:
# renpy/common/00keymap.rpy:167
old "Saved screenshot as %s."
new "儲存螢幕截圖為 %s。"
translate None strings:
# renpy/common/00layout.rpy:439
old "Are you sure?"
new "是否確認?"
# renpy/common/00layout.rpy:443
old "Are you sure you want to quit?"
new "您確定您要離開嗎?"
# renpy/common/00layout.rpy:444
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "您確定您想回到標題畫面嗎?\n這將使您失去所有未儲存的進度。"
# renpy/common/00layout.rpy:441
old "Are you sure you want to overwrite your save?"
new "您確定您要覆寫您的存檔?"
# renpy/common/00layout.rpy:442
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "載入將會失去所有未儲存的進度。\n您確定您要這麼做嗎?"
# renpy/common/00layout.rpy:440
old "Are you sure you want to delete this save?"
new "您確定您要刪掉這份存檔嗎?"
translate None strings:
# renpy/common/00library.rpy:77
old "Skip Mode"
new "跳過對話模式"
# renpy/common/00library.rpy:80
old "Fast Skip Mode"
new "快速跳過對話模式"
translate None strings:
# renpy/common/00updater.rpy:1258
old "Updater"
new "更新"
# renpy/common/00updater.rpy:1267
old "This program is up to date."
new "該程式已是最新版本。"
# renpy/common/00updater.rpy:1269
old "[u.version] is available. Do you want to install it?"
new "[u.version] 已釋出。是否確認安裝?"
# renpy/common/00updater.rpy:1271
old "Preparing to download the updates."
new "正在準備下載更新。"
# renpy/common/00updater.rpy:1273
old "Downloading the updates."
new "正在下載更新。"
# renpy/common/00updater.rpy:1275
old "Unpacking the updates."
new "解壓縮更新檔案。"
# renpy/common/00updater.rpy:1279
old "The updates have been installed. The program will restart."
new "該更新檔案已安裝,程式將會重新啟動。"
# renpy/common/00updater.rpy:1281
old "The updates have been installed."
new "已完成更新。"
# renpy/common/00updater.rpy:1283
old "The updates were cancelled."
new "已取消更新。"
translate None strings:
# renpy/common/_compat/preferences.rpym:411
old "Joystick Mapping"
new "遊戲桿映射"
translate None strings:
# renpy/common/_errorhandling.rpym:408
old "An exception has occurred."
new "發生一個異常狀況。"
# renpy/common/_errorhandling.rpym:434
old "Rollback"
new "回滾"
# renpy/common/_errorhandling.rpym:436
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "嘗試回滾到先前的狀態,使您可以存檔或者選擇不同選項。"
# renpy/common/_errorhandling.rpym:439
old "Ignore"
new "忽略"
# renpy/common/_errorhandling.rpym:441
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "忽略異常,讓您可以繼續。這通常會產生額外的錯誤。"
# renpy/common/_errorhandling.rpym:444
old "Reload"
new "重新載入"
# renpy/common/_errorhandling.rpym:446
old "Reloads the game from disk, saving and restoring game state if possible."
new "從硬碟重新載入遊戲,請您儲存遊戲狀態。"
# renpy/common/_errorhandling.rpym:448
old "Open Traceback"
new "開啟回溯"
# renpy/common/_errorhandling.rpym:450
old "Opens the traceback.txt file in a text editor."
new "在編輯器中開啟回溯檔案(traceback.txt)。"
# renpy/common/_errorhandling.rpym:456
old "Quits the game."
new "離開遊戲。"
# renpy/common/_errorhandling.rpym:483
old "Parsing the script failed."
new "解析腳本失敗。"
# renpy/common/_errorhandling.rpym:510
old "Open Parse Errors"
new "開啟解析錯誤"
# renpy/common/_errorhandling.rpym:512
old "Opens the errors.txt file in a text editor."
new "在編輯器中開啟解析錯誤檔案(errors.txt)。"
translate None strings:
# renpy/common/_layout/classic_load_save.rpym:152
old "a"
new "a"
# renpy/common/_layout/classic_load_save.rpym:161
old "q"
new "q"
translate None strings:
# renpy/common/00action_file.rpy:587
# renpy/common/00action_file.rpy:621
old "Quick save complete."
new "快速儲存。"
translate None strings:
# renpy/common/00gallery.rpy:521
old "Image [index] of [count] locked."
new "[count]個圖片中的第[index]個圖片被鎖定。"
# renpy/common/00gallery.rpy:539
old "prev"
new "上一頁"
# renpy/common/00gallery.rpy:540
old "next"
new "下一頁"
# renpy/common/00gallery.rpy:541
old "slideshow"
new "幻燈片"
# renpy/common/00gallery.rpy:542
old "return"
new "返回"
translate None strings:
# renpy/common/00layout.rpy:427
old "Are you sure you want to begin skipping?"
new "是否確定開始略過?"
# renpy/common/00layout.rpy:428
old "Are you sure you want to skip to the next choice?"
new "是否確定跳到下一個選項?"
# renpy/common/00layout.rpy:429
old "Are you sure you want to skip to unseen dialogue or the next choice?"
new "是否確定略過未看過的訊息或下一選項?"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/00console.rpy:179
old "%(version)s console, originally by Shiz, C, and delta.\n"
new "%(version)s 控制臺,作者: Shiz, C, delta"
new "%(version)s 控制臺, 作者: Shiz, C, delta\n"
# renpy/common/00console.rpy:180
old "Press <esc> to exit console. Type help for help.\n"
@@ -324,11 +39,11 @@ translate None strings:
# renpy/common/00console.rpy:407
old " <renpy script statement>: run the statement\n"
new " <renpy script statement>:運行語句\n"
new "<Ren'py 腳本語句>: 運行語句\n"
# renpy/common/00console.rpy:409
old " <python expression or statement>: run the expression or statement"
new " <python expression or statement>:運行運算式或語句"
new " <Python 運算式或語句>: 運行運算式或語句"
# renpy/common/00console.rpy:417
old "clear: clear the console history"
@@ -340,11 +55,11 @@ translate None strings:
# renpy/common/00console.rpy:429
old "load <slot>: loads the game from slot"
new "load <slot>:載入遊戲存檔(以 slot 為存檔號)"
new "load <檔位>: 從檔位載入遊戲"
# renpy/common/00console.rpy:442
old "save <slot>: saves the game in slot"
new "save <slot>:儲存遊戲存檔(以 slot 為存檔號)"
new "save <檔位>: 保存遊戲到檔位"
# renpy/common/00console.rpy:453
old "reload: reloads the game, refreshing the scripts"
@@ -352,20 +67,309 @@ translate None strings:
# renpy/common/00console.rpy:461
old "watch <expression>: watch a python expression"
new "watch <expression>: 監視一個 python 運算式"
new "watch <運算式>: 監視一個 python 運算式"
# renpy/common/00console.rpy:470
old "unwatch <expression>: stop watching an expression"
new "unwatch <expression>:停止監視某個運算式"
new "unwatch <運算式>: 停止監視某個運算式"
# renpy/common/00console.rpy:478
old "unwatchall: stop watching all expressions"
new "unwatchall:停止監視索引運算式"
new "unwatchall: 停止監視索引運算式"
# renpy/common/00console.rpy:484
old "jump <label>: jumps to label"
new "jump <label>: 跳移至標籤"
new "jump <標籤>: 跳移至標籤"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/00gallery.rpy:561
old "Image [index] of [count] locked."
new "[count] 個圖片中的第 [index] 個圖片被鎖定。"
# renpy/common/00gallery.rpy:581
old "prev"
new "上一頁"
# renpy/common/00gallery.rpy:582
old "next"
new "下一頁"
# renpy/common/00gallery.rpy:583
old "slideshow"
new "幻燈片"
# renpy/common/00gallery.rpy:584
old "return"
new "返回"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/00gltest.rpy:68
old "Graphics Acceleration"
new "圖形加速"
# renpy/common/00gltest.rpy:72
old "Automatically Choose"
new "自動選擇"
# renpy/common/00gltest.rpy:77
old "Force Angle/DirectX Renderer"
new "強制 Angle/DirectX 渲染"
# renpy/common/00gltest.rpy:81
old "Force OpenGL Renderer"
new "強制 OpenGL 渲染"
# renpy/common/00gltest.rpy:85
old "Force Software Renderer"
new "強制軟體渲染"
# renpy/common/00gltest.rpy:91
old "Changes will take effect the next time this program is run."
new "變更將會在下次啟動程式時生效。"
# renpy/common/00gltest.rpy:130
old "Performance Warning"
new "效能警告"
# renpy/common/00gltest.rpy:135
old "This computer is using software rendering."
new "該電腦正在使用軟體渲染。"
# renpy/common/00gltest.rpy:137
old "This computer is not using shaders."
new "該電腦沒有使用著色器"
# renpy/common/00gltest.rpy:139
old "This computer is displaying graphics slowly."
new "該電腦圖形顯示緩慢。"
# renpy/common/00gltest.rpy:141
old "This computer has a problem displaying graphics: [problem]."
new "該電腦圖形顯示出錯:[problem]。"
# renpy/common/00gltest.rpy:146
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display. Updating DirectX could fix this problem."
new "目前的圖形驅動程式版本可能過舊或者運作不正確。這樣會導致圖形顯示緩慢或者錯誤。更新 DirectX 可能會解決該問題。"
# renpy/common/00gltest.rpy:148
old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display."
new "目前圖形驅動程式版本可能過舊或者運作不正確。這樣會導致圖形顯示緩慢或者錯誤。"
# renpy/common/00gltest.rpy:153
old "Update DirectX"
new "更新 DirectX"
# renpy/common/00gltest.rpy:159
old "Continue, Show this warning again"
new "繼續,下次再顯示此警告"
# renpy/common/00gltest.rpy:163
old "Continue, Don't show warning again"
new "繼續,不再顯示此警告"
# renpy/common/00gltest.rpy:189
old "Updating DirectX."
new "正在更新 DirectX。"
# renpy/common/00gltest.rpy:193
old "DirectX web setup has been started. It may start minimized in the taskbar. Please follow the prompts to install DirectX."
new "DirectX 線上安裝已啟動。將會最小化到狀態列中。請按照說明安裝 DirectX。"
# renpy/common/00gltest.rpy:197
old "{b}Note:{/b} Microsoft's DirectX web setup program will, by default, install the Bing toolbar. If you do not want this toolbar, uncheck the appropriate box."
new "{b}警告:{/b} Microsoft's DirectX 線上安裝程式會預設安裝 Bing 瀏覽器工具列。如果您不需要安裝這個工具列,請取消勾選對應選項。"
# renpy/common/00gltest.rpy:201
old "When setup finishes, please click below to restart this program."
new "當安裝完成後請點選下方來重新啟動應用程式。"
# renpy/common/00gltest.rpy:203
old "Restart"
new "重新啟動"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/00keymap.rpy:206
old "Saved screenshot as %s."
new "儲存螢幕截圖為 %s。"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/00layout.rpy:444
old "Are you sure?"
new "是否確認?"
# renpy/common/00layout.rpy:445
old "Are you sure you want to delete this save?"
new "您確定您要刪掉這份存檔嗎?"
# renpy/common/00layout.rpy:446
old "Are you sure you want to overwrite your save?"
new "您確定您要覆寫您的存檔?"
# renpy/common/00layout.rpy:447
old "Loading will lose unsaved progress.\nAre you sure you want to do this?"
new "載入將會失去所有未儲存的進度。\n您確定您要這麼做嗎?"
# renpy/common/00layout.rpy:448
old "Are you sure you want to quit?"
new "您確定您要離開嗎?"
# renpy/common/00layout.rpy:449
old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress."
new "您確定您想回到標題畫面嗎?\n這將使您失去所有未儲存的進度。"
# renpy/common/00layout.rpy:450
old "Are you sure you want to begin skipping?"
new "是否確定開始略過?"
# renpy/common/00layout.rpy:451
old "Are you sure you want to skip to the next choice?"
new "是否確定跳到下一個選項?"
# renpy/common/00layout.rpy:452
old "Are you sure you want to skip to unseen dialogue or the next choice?"
new "是否確定略過未看過的訊息或下一選項?"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/00library.rpy:149
old "Skip Mode"
new "略過對話模式"
# renpy/common/00library.rpy:152
old "Fast Skip Mode"
new "快速略過對話模式"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/00preferences.rpy:387
old "Clipboard voicing enabled. Press 'shift+C' to disable."
new "Clipboard voicing 已啟用。按 'shift+C' 禁用"
# renpy/common/00preferences.rpy:389
old "Self-voicing enabled. Press 'v' to disable."
new "Self-voicing 已啟用。按 'v' 禁用"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/00updater.rpy:362
old "The Ren'Py Updater is not supported on mobile devices."
new "Ren'Py 的更新不支援在行動裝置上使用。"
# renpy/common/00updater.rpy:478
old "An error is being simulated."
new "正在類比錯誤。"
# renpy/common/00updater.rpy:654
old "Either this project does not support updating, or the update status file was deleted."
new "此專案不支援更新,或者更新狀態檔已被刪除。"
# renpy/common/00updater.rpy:668
old "This account does not have permission to perform an update."
new "此帳戶不具有執行更新的權限。"
# renpy/common/00updater.rpy:671
old "This account does not have permission to write the update log."
new "此帳戶沒有更新日誌的寫入權限。"
# renpy/common/00updater.rpy:696
old "Could not verify update signature."
new "無法驗證更新簽名。"
# renpy/common/00updater.rpy:956
old "The update file was not downloaded."
new "不下載更新檔。"
# renpy/common/00updater.rpy:974
old "The update file does not have the correct digest - it may have been corrupted."
new "無法驗證更新檔案 — 它可能已損壞。"
# renpy/common/00updater.rpy:1030
old "While unpacking {}, unknown type {}."
new "正在解壓缩 {},未知類型 {}。"
# renpy/common/00updater.rpy:1380
old "Updater"
new "更新"
# renpy/common/00updater.rpy:1385
old "An error has occured:"
new "一個錯誤發生:"
# renpy/common/00updater.rpy:1387
old "Checking for updates."
new "正在檢查更新。"
# renpy/common/00updater.rpy:1389
old "This program is up to date."
new "該程式已是最新版本。"
# renpy/common/00updater.rpy:1391
old "[u.version] is available. Do you want to install it?"
new "[u.version] 已釋出。是否確認安裝?"
# renpy/common/00updater.rpy:1393
old "Preparing to download the updates."
new "正在準備下載更新。"
# renpy/common/00updater.rpy:1395
old "Downloading the updates."
new "正在下載更新。"
# renpy/common/00updater.rpy:1397
old "Unpacking the updates."
new "解壓縮更新檔案。"
# renpy/common/00updater.rpy:1399
old "Finishing up."
new "即將完成。"
# renpy/common/00updater.rpy:1401
old "The updates have been installed. The program will restart."
new "該更新檔案已安裝,程式將會重新啟動。"
# renpy/common/00updater.rpy:1403
old "The updates have been installed."
new "已完成更新。"
# renpy/common/00updater.rpy:1405
old "The updates were cancelled."
new "已取消更新。"
# renpy/common/00updater.rpy:1419
old "Proceed"
new "繼續"
# renpy/common/00updater.rpy:1422
old "Cancel"
new "取消"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/_compat/preferences.rpym:428
old "Joystick Mapping"
new "遊戲桿映射"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
@@ -375,11 +379,11 @@ translate None strings:
# renpy/common/_developer/developer.rpym:67
old "Reload Game (Shift+R)"
new "重新載入遊戲Shift+R"
new "重新載入遊戲 (Shift+R)"
# renpy/common/_developer/developer.rpym:69
old "Console (Shift+O)"
new "控制臺(Shift+O)"
new "控制臺 (Shift+O)"
# renpy/common/_developer/developer.rpym:71
old "Variable Viewer"
@@ -405,72 +409,147 @@ translate None strings:
old "Hide Image Load Log"
new "隱藏圖片載入記錄"
# renpy/common/_developer/developer.rpym:149
# renpy/common/_developer/developer.rpym:150
old "No variables have changed since the game started."
new "遊戲開始至此沒有任何變數被改變。"
# renpy/common/_developer/developer.rpym:152
# renpy/common/_developer/developer.rpym:153
old "Return to the developer menu"
new "回到開發者選單"
# renpy/c72
old "{b}Missing Images{/b}"
new "{b}丟失圖片{/b}"
# renpy/common/_developer/developer.rpym:424
# renpy/common/_developer/developer.rpym:398
old "Rectangle: %r"
new "矩形區域%r"
new "矩形區域: %r"
# renpy/common/_developer/developer.rpym:429
# renpy/common/_developer/developer.rpym:403
old "Mouse position: %r"
new "滑鼠位置%r"
new "滑鼠位置: %r"
# renpy/common/_developer/developer.rpym:431
# renpy/common/_developer/developer.rpym:408
old "Right-click or escape to quit."
new "點選滑鼠右鍵或者按 Esc 鍵來退出。"
# renpy/common/_developer/developer.rpym:482
# renpy/common/_developer/developer.rpym:437
old "Rectangle copied to clipboard."
new "選擇區域複製到剪貼簿。"
# renpy/common/_developer/developer.rpym:440
old "Position copied to clipboard."
new "選擇位置複製到剪貼簿。"
# renpy/common/_developer/developer.rpym:471
old "Done"
new "完成"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/_developer/inspector.rpym:43
# renpy/common/_developer/inspector.rpym:46
old "Displayable Inspector"
new "Displayable 檢閱器"
# renpy/common/_developer/inspector.rpym:49
# renpy/common/_developer/inspector.rpym:52
old "Nothing to inspect."
new "沒有東西被檢閱"
# renpy/common/_developer/inspector.rpym:58
# renpy/common/_developer/inspector.rpym:70
old "Size"
new "大小"
# renpy/common/_developer/inspector.rpym:63
# renpy/common/_developer/inspector.rpym:74
old "Style"
new "風格"
# renpy/common/_developer/inspector.rpym:123
old "Inspecting Styles of [displayable_name!q]"
new "檢閱[displayable_name!q]的風格"
# renpy/common/_developer/inspector.rpym:80
old "Location"
new "位置"
# renpy/common/_developer/inspector.rpym:135
old "displayable:"
new "displayable"
# renpy/common/_developer/inspector.rpym:142
old "Inspecting Styles of [displayable_name!q]"
new "檢閱 [displayable_name!q] 的風格"
# renpy/common/_developer/inspector.rpym:155
old "displayable:"
new "Displayable:"
# renpy/common/_developer/inspector.rpym:162
old " (no properties affect the displayable)"
new " (沒有偏好的可顯示屬性)"
# renpy/common/_developer/inspector.rpym:144
# renpy/common/_developer/inspector.rpym:164
old " (default properties omitted)"
new " (略預設屬性)"
new " (略預設屬性)"
# renpy/common/_developer/inspector.rpym:174
# renpy/common/_developer/inspector.rpym:206
old "<repr() failed>"
new "<repr() failed>"
new "<repr() 失敗>"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/_errorhandling.rpym:450
old "An exception has occurred."
new "發生一個異常狀況。"
# renpy/common/_errorhandling.rpym:476
old "Rollback"
new "回滾"
# renpy/common/_errorhandling.rpym:478
old "Attempts a roll back to a prior time, allowing you to save or choose a different choice."
new "嘗試回滾到先前的狀態,使您可以存檔或者選擇不同選項。"
# renpy/common/_errorhandling.rpym:481
old "Ignore"
new "忽略"
# renpy/common/_errorhandling.rpym:483
old "Ignores the exception, allowing you to continue. This often leads to additional errors."
new "忽略異常,讓您可以繼續。這通常會產生額外的錯誤。"
# renpy/common/_errorhandling.rpym:486
old "Reload"
new "重新載入"
# renpy/common/_errorhandling.rpym:488
old "Reloads the game from disk, saving and restoring game state if possible."
new "從硬碟重新載入遊戲,請您儲存遊戲狀態。"
# renpy/common/_errorhandling.rpym:490
old "Open Traceback"
new "開啟回溯"
# renpy/common/_errorhandling.rpym:492
old "Opens the traceback.txt file in a text editor."
new "在編輯器中開啟回溯檔案。"
# renpy/common/_errorhandling.rpym:498
old "Quits the game."
new "離開遊戲。"
# renpy/common/_errorhandling.rpym:525
old "Parsing the script failed."
new "解析腳本失敗。"
# renpy/common/_errorhandling.rpym:552
old "Open Parse Errors"
new "開啟解析錯誤"
# renpy/common/_errorhandling.rpym:554
old "Opens the errors.txt file in a text editor."
new "在編輯器中開啟解析錯誤檔案。"
# TODO: Translation updated at 2015-03-26 20:17
translate None strings:
# renpy/common/_layout/classic_load_save.rpym:170
old "a"
new "a"
# renpy/common/_layout/classic_load_save.rpym:179
old "q"
new "q"
@@ -175,4 +175,4 @@ translate None strings:
# game/screens.rpy:453
old "Voice Sustain"
new "聲音維持"
new "聲音維持"