├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md └── game ├── gui.rpy ├── gui.rpyc ├── gui ├── bar │ ├── bottom.png │ ├── left.png │ ├── right.png │ └── top.png ├── button │ ├── check_foreground.png │ ├── check_selected_foreground.png │ ├── choice_hover_background.png │ ├── choice_idle_background.png │ ├── hover_background.png │ ├── idle_background.png │ ├── quick_hover_background.png │ ├── quick_idle_background.png │ ├── radio_foreground.png │ ├── radio_selected_foreground.png │ ├── slot_hover_background.png │ └── slot_idle_background.png ├── frame.png ├── game_menu.png ├── main_menu.png ├── namebox.png ├── notify.png ├── nvl.png ├── overlay │ ├── confirm.png │ ├── game_menu.png │ └── main_menu.png ├── phone │ ├── bar │ │ ├── bottom.png │ │ ├── left.png │ │ ├── right.png │ │ └── top.png │ ├── button │ │ ├── check_foreground.png │ │ ├── check_selected_foreground.png │ │ ├── choice_hover_background.png │ │ ├── choice_idle_background.png │ │ ├── hover_background.png │ │ ├── idle_background.png │ │ ├── radio_foreground.png │ │ ├── radio_selected_foreground.png │ │ ├── slot_hover_background.png │ │ └── slot_idle_background.png │ ├── nvl.png │ ├── overlay │ │ ├── game_menu.png │ │ └── main_menu.png │ ├── scrollbar │ │ ├── horizontal_hover_bar.png │ │ ├── horizontal_hover_thumb.png │ │ ├── horizontal_idle_bar.png │ │ ├── horizontal_idle_thumb.png │ │ ├── vertical_hover_bar.png │ │ ├── vertical_hover_thumb.png │ │ ├── vertical_idle_bar.png │ │ └── vertical_idle_thumb.png │ ├── slider │ │ ├── horizontal_hover_bar.png │ │ ├── horizontal_hover_thumb.png │ │ ├── horizontal_idle_bar.png │ │ ├── horizontal_idle_thumb.png │ │ ├── vertical_hover_bar.png │ │ ├── vertical_hover_thumb.png │ │ ├── vertical_idle_bar.png │ │ └── vertical_idle_thumb.png │ └── textbox.png ├── scrollbar │ ├── horizontal_hover_bar.png │ ├── horizontal_hover_thumb.png │ ├── horizontal_idle_bar.png │ ├── horizontal_idle_thumb.png │ ├── vertical_hover_bar.png │ ├── vertical_hover_thumb.png │ ├── vertical_idle_bar.png │ └── vertical_idle_thumb.png ├── skip.png ├── slider │ ├── horizontal_hover_bar.png │ ├── horizontal_hover_thumb.png │ ├── horizontal_idle_bar.png │ ├── horizontal_idle_thumb.png │ ├── vertical_hover_bar.png │ ├── vertical_hover_thumb.png │ ├── vertical_idle_bar.png │ └── vertical_idle_thumb.png ├── textbox.png └── window_icon.png ├── options.rpy ├── options.rpyc ├── python-packages └── chatgpt │ └── __init__.py ├── screens.rpy ├── screens.rpyc ├── script.rpy ├── script.rpyc └── tl └── None ├── common.rpym └── common.rpymc /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/renpy 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=renpy 3 | 4 | ### Renpy ### 5 | # Don't track content of these folders # 6 | ######################################## 7 | cache/ 8 | saves/ 9 | 10 | 11 | # Compiled source # 12 | ################### 13 | *.com 14 | *.class 15 | *.dll 16 | *.exe 17 | *.o 18 | *.so 19 | 20 | *.rpyc 21 | *.rpymc 22 | 23 | 24 | # The log file and other misc things # 25 | ###################################### 26 | log.txt 27 | errors.txt 28 | traceback.txt 29 | files.txt 30 | 31 | # End of https://www.toptal.com/developers/gitignore/api/renpy 32 | *.rpyc 33 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # RenPyChatGPTExample 2 | Simple ChatGPT plugin for Ren'Py and simple example on how to use it 3 | 4 | For a fully fledged open source videogame based on this plugin, go here : https://github.com/Taiko3615/Danse-Macabre 5 | 6 | # How to use this plugin in your Ren'Py project ? 7 | 8 | Just copy paste the "python-packages" folder into your "game" folder. 9 | 10 | In your script.rpy try to import the chatgpt package, if it doesn't crash it worked ! 11 | 12 | Then add this basic hello world example in your script to see if it all worked : 13 | ``` 14 | define e = Character("Eileen") 15 | 16 | e "Hello there, my name is Eileen, I am so happy to see you ! Hihihi" 17 | 18 | python: 19 | import chatgpt 20 | 21 | apikey = renpy.input("What is your OPENAI API Key?", length=64) 22 | 23 | messages = [ 24 | {"role": "system", "content": "You are Eileen, a tennage student enrolled at Miskatonic Univeristy of Arkham. You are secretly in love with the user. You laugh very frequently and finish your sentences with 'Hihihi'"}, 25 | {"role": "assistant", "content": "Hello there, my name is Eileen, who are you ?"} 26 | ] 27 | 28 | while True: 29 | user_input = renpy.input("What do you say ?", length=1000) 30 | messages.append( 31 | {"role": "user", "content": user_input} 32 | ) 33 | 34 | messages = chatgpt.completion(messages,apikey) 35 | response = messages[-1]["content"] 36 | e("[response]") 37 | ``` 38 | # Important note about OpenAI API Keys ! 39 | 40 | While developing your game, it's ok to hardcode your OpenAI API key locally to do your tests. 41 | But. 42 | It's very important that you never actually publish your OpenAI API key anywhere. Neither inside your game assets or on your github repo (if it's a public repo). 43 | 44 | Because if anyone has your API Key, they can send hundreds of thousands of requests using your API key and bankrupt you. 45 | 46 | They can also release another game that uses your API key and the requests sent by your players will be billed to you. 47 | 48 | And nobody wants that, right ? 49 | 50 | So, how to still publish your game and allow your players to use your API key without seeing it ? 51 | 52 | The easiest way is for you to create a kind of "proxy" that you control and that filters what requests are ok and which requests are not OK, and this proxy will inject your API key in your requests. 53 | 54 | For example, you could make a list of "NPC prompts" that are in your game, those are allowed, but other unrelated requests aren't allowed. 55 | 56 | Here's a sample code for a very basic proxy.php file you could use, just create this "proxy.php" file on your_server.com so that the url of this file is http://your_server.com/proxy.php : 57 | ``` 58 | "system", 75 | "content" => "You are Eileen, a tennage student enrolled at Miskatonic Univeristy of Arkham. You are secretly in love with the user. You laugh very frequently and finish your sentences with 'Hihihi'" 76 | ), 77 | array( 78 | "role" => "system", 79 | "content" => "You are Brother Conrad, a crazy monk scribe at the Abbey of Neuberg, you are very nervous and scratch your arms intermitently." 80 | ), 81 | array( 82 | "role" => "system", 83 | "content" => "You are the Abbot of the Abbey of Neuberg, you like gardening." 84 | ) 85 | ); 86 | 87 | $contains_authorised_npc = false; 88 | if (isset($data['messages']) && is_array($data['messages'])) { 89 | foreach ($data['messages'] as $message) { 90 | if (in_array($message, $authorised_npcs)) { 91 | $contains_authorised_npc = true; 92 | break; 93 | } 94 | } 95 | } 96 | 97 | if ($contains_authorised_npc) { 98 | // Forward the request to the OpenAI API with the API key 99 | $ch = curl_init($openai_api_url); 100 | curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); 101 | curl_setopt($ch, CURLOPT_POSTFIELDS, $json_data); 102 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 103 | curl_setopt($ch, CURLOPT_HTTPHEADER, array( 104 | 'Content-Type: application/json', 105 | 'Authorization: Bearer ' . $openai_api_key, 106 | 'Content-Length: ' . strlen($json_data)) 107 | ); 108 | 109 | // Get the response from the OpenAI API 110 | $response = curl_exec($ch); 111 | 112 | // Check for errors and send the response 113 | if (curl_errno($ch)) { 114 | $error_msg = curl_error($ch); 115 | http_response_code(500); 116 | echo json_encode(array('error' => $error_msg)); 117 | } else { 118 | http_response_code(200); 119 | echo $response; 120 | } 121 | 122 | // Close the cURL session 123 | curl_close($ch); 124 | } else { 125 | // Return an error message if none of the Authorised NPCs are present 126 | http_response_code(400); 127 | echo json_encode(array('error' => 'None of the Authorised NPCs were found in the request.')); 128 | } 129 | 130 | ``` 131 | 132 | Now in your game instead of calling : chatgpt.completion(messages,api_key=apikey), call chatgpt.completion(messages,proxy="http://your_server.com/proxy.php") 133 | 134 | And don't forget to modify your proxy.php file each time you add a new NPC in your game. 135 | 136 | This is just a very simple proxy.php, you may want to consider adding some rate limitations or other securities. 137 | -------------------------------------------------------------------------------- /game/gui.rpy: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | ## Initialization 3 | ################################################################################ 4 | 5 | ## The init offset statement causes the initialization statements in this file 6 | ## to run before init statements in any other file. 7 | init offset = -2 8 | 9 | ## Calling gui.init resets the styles to sensible default values, and sets the 10 | ## width and height of the game. 11 | init python: 12 | gui.init(1920, 1080) 13 | 14 | 15 | 16 | ################################################################################ 17 | ## GUI Configuration Variables 18 | ################################################################################ 19 | 20 | 21 | ## Colors ###################################################################### 22 | ## 23 | ## The colors of text in the interface. 24 | 25 | ## An accent color used throughout the interface to label and highlight text. 26 | define gui.accent_color = '#0099cc' 27 | 28 | ## The color used for a text button when it is neither selected nor hovered. 29 | define gui.idle_color = '#888888' 30 | 31 | ## The small color is used for small text, which needs to be brighter/darker to 32 | ## achieve the same effect. 33 | define gui.idle_small_color = '#aaaaaa' 34 | 35 | ## The color that is used for buttons and bars that are hovered. 36 | define gui.hover_color = '#66c1e0' 37 | 38 | ## The color used for a text button when it is selected but not focused. A 39 | ## button is selected if it is the current screen or preference value. 40 | define gui.selected_color = '#ffffff' 41 | 42 | ## The color used for a text button when it cannot be selected. 43 | define gui.insensitive_color = '#8888887f' 44 | 45 | ## Colors used for the portions of bars that are not filled in. These are not 46 | ## used directly, but are used when re-generating bar image files. 47 | define gui.muted_color = '#003d51' 48 | define gui.hover_muted_color = '#005b7a' 49 | 50 | ## The colors used for dialogue and menu choice text. 51 | define gui.text_color = '#ffffff' 52 | define gui.interface_text_color = '#ffffff' 53 | 54 | 55 | ## Fonts and Font Sizes ######################################################## 56 | 57 | ## The font used for in-game text. 58 | define gui.text_font = "DejaVuSans.ttf" 59 | 60 | ## The font used for character names. 61 | define gui.name_text_font = "DejaVuSans.ttf" 62 | 63 | ## The font used for out-of-game text. 64 | define gui.interface_text_font = "DejaVuSans.ttf" 65 | 66 | ## The size of normal dialogue text. 67 | define gui.text_size = 33 68 | 69 | ## The size of character names. 70 | define gui.name_text_size = 45 71 | 72 | ## The size of text in the game's user interface. 73 | define gui.interface_text_size = 33 74 | 75 | ## The size of labels in the game's user interface. 76 | define gui.label_text_size = 36 77 | 78 | ## The size of text on the notify screen. 79 | define gui.notify_text_size = 24 80 | 81 | ## The size of the game's title. 82 | define gui.title_text_size = 75 83 | 84 | 85 | ## Main and Game Menus ######################################################### 86 | 87 | ## The images used for the main and game menus. 88 | define gui.main_menu_background = "gui/main_menu.png" 89 | define gui.game_menu_background = "gui/game_menu.png" 90 | 91 | 92 | ## Dialogue #################################################################### 93 | ## 94 | ## These variables control how dialogue is displayed on the screen one line at a 95 | ## time. 96 | 97 | ## The height of the textbox containing dialogue. 98 | define gui.textbox_height = 278 99 | 100 | ## The placement of the textbox vertically on the screen. 0.0 is the top, 0.5 is 101 | ## center, and 1.0 is the bottom. 102 | define gui.textbox_yalign = 1.0 103 | 104 | 105 | ## The placement of the speaking character's name, relative to the textbox. 106 | ## These can be a whole number of pixels from the left or top, or 0.5 to center. 107 | define gui.name_xpos = 360 108 | define gui.name_ypos = 0 109 | 110 | ## The horizontal alignment of the character's name. This can be 0.0 for left- 111 | ## aligned, 0.5 for centered, and 1.0 for right-aligned. 112 | define gui.name_xalign = 0.0 113 | 114 | ## The width, height, and borders of the box containing the character's name, or 115 | ## None to automatically size it. 116 | define gui.namebox_width = None 117 | define gui.namebox_height = None 118 | 119 | ## The borders of the box containing the character's name, in left, top, right, 120 | ## bottom order. 121 | define gui.namebox_borders = Borders(5, 5, 5, 5) 122 | 123 | ## If True, the background of the namebox will be tiled, if False, the 124 | ## background of the namebox will be scaled. 125 | define gui.namebox_tile = False 126 | 127 | 128 | ## The placement of dialogue relative to the textbox. These can be a whole 129 | ## number of pixels relative to the left or top side of the textbox, or 0.5 to 130 | ## center. 131 | define gui.dialogue_xpos = 402 132 | define gui.dialogue_ypos = 75 133 | 134 | ## The maximum width of dialogue text, in pixels. 135 | define gui.dialogue_width = 1116 136 | 137 | ## The horizontal alignment of the dialogue text. This can be 0.0 for left- 138 | ## aligned, 0.5 for centered, and 1.0 for right-aligned. 139 | define gui.dialogue_text_xalign = 0.0 140 | 141 | 142 | ## Buttons ##################################################################### 143 | ## 144 | ## These variables, along with the image files in gui/button, control aspects of 145 | ## how buttons are displayed. 146 | 147 | ## The width and height of a button, in pixels. If None, Ren'Py computes a size. 148 | define gui.button_width = None 149 | define gui.button_height = None 150 | 151 | ## The borders on each side of the button, in left, top, right, bottom order. 152 | define gui.button_borders = Borders(6, 6, 6, 6) 153 | 154 | ## If True, the background image will be tiled. If False, the background image 155 | ## will be linearly scaled. 156 | define gui.button_tile = False 157 | 158 | ## The font used by the button. 159 | define gui.button_text_font = gui.interface_text_font 160 | 161 | ## The size of the text used by the button. 162 | define gui.button_text_size = gui.interface_text_size 163 | 164 | ## The color of button text in various states. 165 | define gui.button_text_idle_color = gui.idle_color 166 | define gui.button_text_hover_color = gui.hover_color 167 | define gui.button_text_selected_color = gui.selected_color 168 | define gui.button_text_insensitive_color = gui.insensitive_color 169 | 170 | ## The horizontal alignment of the button text. (0.0 is left, 0.5 is center, 1.0 171 | ## is right). 172 | define gui.button_text_xalign = 0.0 173 | 174 | 175 | ## These variables override settings for different kinds of buttons. Please see 176 | ## the gui documentation for the kinds of buttons available, and what each is 177 | ## used for. 178 | ## 179 | ## These customizations are used by the default interface: 180 | 181 | define gui.radio_button_borders = Borders(27, 6, 6, 6) 182 | 183 | define gui.check_button_borders = Borders(27, 6, 6, 6) 184 | 185 | define gui.confirm_button_text_xalign = 0.5 186 | 187 | define gui.page_button_borders = Borders(15, 6, 15, 6) 188 | 189 | define gui.quick_button_borders = Borders(15, 6, 15, 0) 190 | define gui.quick_button_text_size = 21 191 | define gui.quick_button_text_idle_color = gui.idle_small_color 192 | define gui.quick_button_text_selected_color = gui.accent_color 193 | 194 | ## You can also add your own customizations, by adding properly-named variables. 195 | ## For example, you can uncomment the following line to set the width of a 196 | ## navigation button. 197 | 198 | # define gui.navigation_button_width = 250 199 | 200 | 201 | ## Choice Buttons ############################################################## 202 | ## 203 | ## Choice buttons are used in the in-game menus. 204 | 205 | define gui.choice_button_width = 1185 206 | define gui.choice_button_height = None 207 | define gui.choice_button_tile = False 208 | define gui.choice_button_borders = Borders(150, 8, 150, 8) 209 | define gui.choice_button_text_font = gui.text_font 210 | define gui.choice_button_text_size = gui.text_size 211 | define gui.choice_button_text_xalign = 0.5 212 | define gui.choice_button_text_idle_color = "#cccccc" 213 | define gui.choice_button_text_hover_color = "#ffffff" 214 | define gui.choice_button_text_insensitive_color = "#444444" 215 | 216 | 217 | ## File Slot Buttons ########################################################### 218 | ## 219 | ## A file slot button is a special kind of button. It contains a thumbnail 220 | ## image, and text describing the contents of the save slot. A save slot uses 221 | ## image files in gui/button, like the other kinds of buttons. 222 | 223 | ## The save slot button. 224 | define gui.slot_button_width = 414 225 | define gui.slot_button_height = 309 226 | define gui.slot_button_borders = Borders(15, 15, 15, 15) 227 | define gui.slot_button_text_size = 21 228 | define gui.slot_button_text_xalign = 0.5 229 | define gui.slot_button_text_idle_color = gui.idle_small_color 230 | define gui.slot_button_text_selected_idle_color = gui.selected_color 231 | define gui.slot_button_text_selected_hover_color = gui.hover_color 232 | 233 | ## The width and height of thumbnails used by the save slots. 234 | define config.thumbnail_width = 384 235 | define config.thumbnail_height = 216 236 | 237 | ## The number of columns and rows in the grid of save slots. 238 | define gui.file_slot_cols = 3 239 | define gui.file_slot_rows = 2 240 | 241 | 242 | ## Positioning and Spacing ##################################################### 243 | ## 244 | ## These variables control the positioning and spacing of various user interface 245 | ## elements. 246 | 247 | ## The position of the left side of the navigation buttons, relative to the left 248 | ## side of the screen. 249 | define gui.navigation_xpos = 60 250 | 251 | ## The vertical position of the skip indicator. 252 | define gui.skip_ypos = 15 253 | 254 | ## The vertical position of the notify screen. 255 | define gui.notify_ypos = 68 256 | 257 | ## The spacing between menu choices. 258 | define gui.choice_spacing = 33 259 | 260 | ## Buttons in the navigation section of the main and game menus. 261 | define gui.navigation_spacing = 6 262 | 263 | ## Controls the amount of spacing between preferences. 264 | define gui.pref_spacing = 15 265 | 266 | ## Controls the amount of spacing between preference buttons. 267 | define gui.pref_button_spacing = 0 268 | 269 | ## The spacing between file page buttons. 270 | define gui.page_spacing = 0 271 | 272 | ## The spacing between file slots. 273 | define gui.slot_spacing = 15 274 | 275 | ## The position of the main menu text. 276 | define gui.main_menu_text_xalign = 1.0 277 | 278 | 279 | ## Frames ###################################################################### 280 | ## 281 | ## These variables control the look of frames that can contain user interface 282 | ## components when an overlay or window is not present. 283 | 284 | ## Generic frames. 285 | define gui.frame_borders = Borders(6, 6, 6, 6) 286 | 287 | ## The frame that is used as part of the confirm screen. 288 | define gui.confirm_frame_borders = Borders(60, 60, 60, 60) 289 | 290 | ## The frame that is used as part of the skip screen. 291 | define gui.skip_frame_borders = Borders(24, 8, 75, 8) 292 | 293 | ## The frame that is used as part of the notify screen. 294 | define gui.notify_frame_borders = Borders(24, 8, 60, 8) 295 | 296 | ## Should frame backgrounds be tiled? 297 | define gui.frame_tile = False 298 | 299 | 300 | ## Bars, Scrollbars, and Sliders ############################################### 301 | ## 302 | ## These control the look and size of bars, scrollbars, and sliders. 303 | ## 304 | ## The default GUI only uses sliders and vertical scrollbars. All of the other 305 | ## bars are only used in creator-written screens. 306 | 307 | ## The height of horizontal bars, scrollbars, and sliders. The width of vertical 308 | ## bars, scrollbars, and sliders. 309 | define gui.bar_size = 38 310 | define gui.scrollbar_size = 18 311 | define gui.slider_size = 38 312 | 313 | ## True if bar images should be tiled. False if they should be linearly scaled. 314 | define gui.bar_tile = False 315 | define gui.scrollbar_tile = False 316 | define gui.slider_tile = False 317 | 318 | ## Horizontal borders. 319 | define gui.bar_borders = Borders(6, 6, 6, 6) 320 | define gui.scrollbar_borders = Borders(6, 6, 6, 6) 321 | define gui.slider_borders = Borders(6, 6, 6, 6) 322 | 323 | ## Vertical borders. 324 | define gui.vbar_borders = Borders(6, 6, 6, 6) 325 | define gui.vscrollbar_borders = Borders(6, 6, 6, 6) 326 | define gui.vslider_borders = Borders(6, 6, 6, 6) 327 | 328 | ## What to do with unscrollable scrollbars in the gui. "hide" hides them, while 329 | ## None shows them. 330 | define gui.unscrollable = "hide" 331 | 332 | 333 | ## History ##################################################################### 334 | ## 335 | ## The history screen displays dialogue that the player has already dismissed. 336 | 337 | ## The number of blocks of dialogue history Ren'Py will keep. 338 | define config.history_length = 250 339 | 340 | ## The height of a history screen entry, or None to make the height variable at 341 | ## the cost of performance. 342 | define gui.history_height = 210 343 | 344 | ## The position, width, and alignment of the label giving the name of the 345 | ## speaking character. 346 | define gui.history_name_xpos = 233 347 | define gui.history_name_ypos = 0 348 | define gui.history_name_width = 233 349 | define gui.history_name_xalign = 1.0 350 | 351 | ## The position, width, and alignment of the dialogue text. 352 | define gui.history_text_xpos = 255 353 | define gui.history_text_ypos = 3 354 | define gui.history_text_width = 1110 355 | define gui.history_text_xalign = 0.0 356 | 357 | 358 | ## NVL-Mode #################################################################### 359 | ## 360 | ## The NVL-mode screen displays the dialogue spoken by NVL-mode characters. 361 | 362 | ## The borders of the background of the NVL-mode background window. 363 | define gui.nvl_borders = Borders(0, 15, 0, 30) 364 | 365 | ## The maximum number of NVL-mode entries Ren'Py will display. When more entries 366 | ## than this are to be show, the oldest entry will be removed. 367 | define gui.nvl_list_length = 6 368 | 369 | ## The height of an NVL-mode entry. Set this to None to have the entries 370 | ## dynamically adjust height. 371 | define gui.nvl_height = 173 372 | 373 | ## The spacing between NVL-mode entries when gui.nvl_height is None, and between 374 | ## NVL-mode entries and an NVL-mode menu. 375 | define gui.nvl_spacing = 15 376 | 377 | ## The position, width, and alignment of the label giving the name of the 378 | ## speaking character. 379 | define gui.nvl_name_xpos = 645 380 | define gui.nvl_name_ypos = 0 381 | define gui.nvl_name_width = 225 382 | define gui.nvl_name_xalign = 1.0 383 | 384 | ## The position, width, and alignment of the dialogue text. 385 | define gui.nvl_text_xpos = 675 386 | define gui.nvl_text_ypos = 12 387 | define gui.nvl_text_width = 885 388 | define gui.nvl_text_xalign = 0.0 389 | 390 | ## The position, width, and alignment of nvl_thought text (the text said by the 391 | ## nvl_narrator character.) 392 | define gui.nvl_thought_xpos = 360 393 | define gui.nvl_thought_ypos = 0 394 | define gui.nvl_thought_width = 1170 395 | define gui.nvl_thought_xalign = 0.0 396 | 397 | ## The position of nvl menu_buttons. 398 | define gui.nvl_button_xpos = 675 399 | define gui.nvl_button_xalign = 0.0 400 | 401 | ## Localization ################################################################ 402 | 403 | ## This controls where a line break is permitted. The default is suitable 404 | ## for most languages. A list of available values can be found at https:// 405 | ## www.renpy.org/doc/html/style_properties.html#style-property-language 406 | 407 | define gui.language = "unicode" 408 | 409 | 410 | ################################################################################ 411 | ## Mobile devices 412 | ################################################################################ 413 | 414 | init python: 415 | 416 | ## This increases the size of the quick buttons to make them easier to touch 417 | ## on tablets and phones. 418 | @gui.variant 419 | def touch(): 420 | 421 | gui.quick_button_borders = Borders(60, 21, 60, 0) 422 | 423 | ## This changes the size and spacing of various GUI elements to ensure they 424 | ## are easily visible on phones. 425 | @gui.variant 426 | def small(): 427 | 428 | ## Font sizes. 429 | gui.text_size = 45 430 | gui.name_text_size = 54 431 | gui.notify_text_size = 38 432 | gui.interface_text_size = 45 433 | gui.button_text_size = 45 434 | gui.label_text_size = 51 435 | 436 | ## Adjust the location of the textbox. 437 | gui.textbox_height = 360 438 | gui.name_xpos = 120 439 | gui.dialogue_xpos = 135 440 | gui.dialogue_width = 1650 441 | 442 | ## Change the size and spacing of various things. 443 | gui.slider_size = 54 444 | 445 | gui.choice_button_width = 1860 446 | gui.choice_button_text_size = 45 447 | 448 | gui.navigation_spacing = 30 449 | gui.pref_button_spacing = 15 450 | 451 | gui.history_height = 285 452 | gui.history_text_width = 1035 453 | 454 | gui.quick_button_text_size = 30 455 | 456 | ## File button layout. 457 | gui.file_slot_cols = 2 458 | gui.file_slot_rows = 2 459 | 460 | ## NVL-mode. 461 | gui.nvl_height = 255 462 | 463 | gui.nvl_name_width = 458 464 | gui.nvl_name_xpos = 488 465 | 466 | gui.nvl_text_width = 1373 467 | gui.nvl_text_xpos = 518 468 | gui.nvl_text_ypos = 8 469 | 470 | gui.nvl_thought_width = 1860 471 | gui.nvl_thought_xpos = 30 472 | 473 | gui.nvl_button_width = 1860 474 | gui.nvl_button_xpos = 30 475 | -------------------------------------------------------------------------------- /game/gui.rpyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui.rpyc -------------------------------------------------------------------------------- /game/gui/bar/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/bar/bottom.png -------------------------------------------------------------------------------- /game/gui/bar/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/bar/left.png -------------------------------------------------------------------------------- /game/gui/bar/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/bar/right.png -------------------------------------------------------------------------------- /game/gui/bar/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/bar/top.png -------------------------------------------------------------------------------- /game/gui/button/check_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/check_foreground.png -------------------------------------------------------------------------------- /game/gui/button/check_selected_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/check_selected_foreground.png -------------------------------------------------------------------------------- /game/gui/button/choice_hover_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/choice_hover_background.png -------------------------------------------------------------------------------- /game/gui/button/choice_idle_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/choice_idle_background.png -------------------------------------------------------------------------------- /game/gui/button/hover_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/hover_background.png -------------------------------------------------------------------------------- /game/gui/button/idle_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/idle_background.png -------------------------------------------------------------------------------- /game/gui/button/quick_hover_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/quick_hover_background.png -------------------------------------------------------------------------------- /game/gui/button/quick_idle_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/quick_idle_background.png -------------------------------------------------------------------------------- /game/gui/button/radio_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/radio_foreground.png -------------------------------------------------------------------------------- /game/gui/button/radio_selected_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/radio_selected_foreground.png -------------------------------------------------------------------------------- /game/gui/button/slot_hover_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/slot_hover_background.png -------------------------------------------------------------------------------- /game/gui/button/slot_idle_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/button/slot_idle_background.png -------------------------------------------------------------------------------- /game/gui/frame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/frame.png -------------------------------------------------------------------------------- /game/gui/game_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/game_menu.png -------------------------------------------------------------------------------- /game/gui/main_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/main_menu.png -------------------------------------------------------------------------------- /game/gui/namebox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/namebox.png -------------------------------------------------------------------------------- /game/gui/notify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/notify.png -------------------------------------------------------------------------------- /game/gui/nvl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/nvl.png -------------------------------------------------------------------------------- /game/gui/overlay/confirm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/overlay/confirm.png -------------------------------------------------------------------------------- /game/gui/overlay/game_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/overlay/game_menu.png -------------------------------------------------------------------------------- /game/gui/overlay/main_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/overlay/main_menu.png -------------------------------------------------------------------------------- /game/gui/phone/bar/bottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/bar/bottom.png -------------------------------------------------------------------------------- /game/gui/phone/bar/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/bar/left.png -------------------------------------------------------------------------------- /game/gui/phone/bar/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/bar/right.png -------------------------------------------------------------------------------- /game/gui/phone/bar/top.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/bar/top.png -------------------------------------------------------------------------------- /game/gui/phone/button/check_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/check_foreground.png -------------------------------------------------------------------------------- /game/gui/phone/button/check_selected_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/check_selected_foreground.png -------------------------------------------------------------------------------- /game/gui/phone/button/choice_hover_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/choice_hover_background.png -------------------------------------------------------------------------------- /game/gui/phone/button/choice_idle_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/choice_idle_background.png -------------------------------------------------------------------------------- /game/gui/phone/button/hover_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/hover_background.png -------------------------------------------------------------------------------- /game/gui/phone/button/idle_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/idle_background.png -------------------------------------------------------------------------------- /game/gui/phone/button/radio_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/radio_foreground.png -------------------------------------------------------------------------------- /game/gui/phone/button/radio_selected_foreground.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/radio_selected_foreground.png -------------------------------------------------------------------------------- /game/gui/phone/button/slot_hover_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/slot_hover_background.png -------------------------------------------------------------------------------- /game/gui/phone/button/slot_idle_background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/button/slot_idle_background.png -------------------------------------------------------------------------------- /game/gui/phone/nvl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/nvl.png -------------------------------------------------------------------------------- /game/gui/phone/overlay/game_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/overlay/game_menu.png -------------------------------------------------------------------------------- /game/gui/phone/overlay/main_menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/overlay/main_menu.png -------------------------------------------------------------------------------- /game/gui/phone/scrollbar/horizontal_hover_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/scrollbar/horizontal_hover_bar.png -------------------------------------------------------------------------------- /game/gui/phone/scrollbar/horizontal_hover_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/scrollbar/horizontal_hover_thumb.png -------------------------------------------------------------------------------- /game/gui/phone/scrollbar/horizontal_idle_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/scrollbar/horizontal_idle_bar.png -------------------------------------------------------------------------------- /game/gui/phone/scrollbar/horizontal_idle_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/scrollbar/horizontal_idle_thumb.png -------------------------------------------------------------------------------- /game/gui/phone/scrollbar/vertical_hover_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/scrollbar/vertical_hover_bar.png -------------------------------------------------------------------------------- /game/gui/phone/scrollbar/vertical_hover_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/scrollbar/vertical_hover_thumb.png -------------------------------------------------------------------------------- /game/gui/phone/scrollbar/vertical_idle_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/scrollbar/vertical_idle_bar.png -------------------------------------------------------------------------------- /game/gui/phone/scrollbar/vertical_idle_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/scrollbar/vertical_idle_thumb.png -------------------------------------------------------------------------------- /game/gui/phone/slider/horizontal_hover_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/slider/horizontal_hover_bar.png -------------------------------------------------------------------------------- /game/gui/phone/slider/horizontal_hover_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/slider/horizontal_hover_thumb.png -------------------------------------------------------------------------------- /game/gui/phone/slider/horizontal_idle_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/slider/horizontal_idle_bar.png -------------------------------------------------------------------------------- /game/gui/phone/slider/horizontal_idle_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/slider/horizontal_idle_thumb.png -------------------------------------------------------------------------------- /game/gui/phone/slider/vertical_hover_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/slider/vertical_hover_bar.png -------------------------------------------------------------------------------- /game/gui/phone/slider/vertical_hover_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/slider/vertical_hover_thumb.png -------------------------------------------------------------------------------- /game/gui/phone/slider/vertical_idle_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/slider/vertical_idle_bar.png -------------------------------------------------------------------------------- /game/gui/phone/slider/vertical_idle_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/slider/vertical_idle_thumb.png -------------------------------------------------------------------------------- /game/gui/phone/textbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/phone/textbox.png -------------------------------------------------------------------------------- /game/gui/scrollbar/horizontal_hover_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/scrollbar/horizontal_hover_bar.png -------------------------------------------------------------------------------- /game/gui/scrollbar/horizontal_hover_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/scrollbar/horizontal_hover_thumb.png -------------------------------------------------------------------------------- /game/gui/scrollbar/horizontal_idle_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/scrollbar/horizontal_idle_bar.png -------------------------------------------------------------------------------- /game/gui/scrollbar/horizontal_idle_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/scrollbar/horizontal_idle_thumb.png -------------------------------------------------------------------------------- /game/gui/scrollbar/vertical_hover_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/scrollbar/vertical_hover_bar.png -------------------------------------------------------------------------------- /game/gui/scrollbar/vertical_hover_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/scrollbar/vertical_hover_thumb.png -------------------------------------------------------------------------------- /game/gui/scrollbar/vertical_idle_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/scrollbar/vertical_idle_bar.png -------------------------------------------------------------------------------- /game/gui/scrollbar/vertical_idle_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/scrollbar/vertical_idle_thumb.png -------------------------------------------------------------------------------- /game/gui/skip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/skip.png -------------------------------------------------------------------------------- /game/gui/slider/horizontal_hover_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/slider/horizontal_hover_bar.png -------------------------------------------------------------------------------- /game/gui/slider/horizontal_hover_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/slider/horizontal_hover_thumb.png -------------------------------------------------------------------------------- /game/gui/slider/horizontal_idle_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/slider/horizontal_idle_bar.png -------------------------------------------------------------------------------- /game/gui/slider/horizontal_idle_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/slider/horizontal_idle_thumb.png -------------------------------------------------------------------------------- /game/gui/slider/vertical_hover_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/slider/vertical_hover_bar.png -------------------------------------------------------------------------------- /game/gui/slider/vertical_hover_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/slider/vertical_hover_thumb.png -------------------------------------------------------------------------------- /game/gui/slider/vertical_idle_bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/slider/vertical_idle_bar.png -------------------------------------------------------------------------------- /game/gui/slider/vertical_idle_thumb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/slider/vertical_idle_thumb.png -------------------------------------------------------------------------------- /game/gui/textbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/textbox.png -------------------------------------------------------------------------------- /game/gui/window_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/gui/window_icon.png -------------------------------------------------------------------------------- /game/options.rpy: -------------------------------------------------------------------------------- 1 | ## This file contains options that can be changed to customize your game. 2 | ## 3 | ## Lines beginning with two '#' marks are comments, and you shouldn't uncomment 4 | ## them. Lines beginning with a single '#' mark are commented-out code, and you 5 | ## may want to uncomment them when appropriate. 6 | 7 | 8 | ## Basics ###################################################################### 9 | 10 | ## A human-readable name of the game. This is used to set the default window 11 | ## title, and shows up in the interface and error reports. 12 | ## 13 | ## The _() surrounding the string marks it as eligible for translation. 14 | 15 | define config.name = _("RenPyChatGPTExample") 16 | 17 | 18 | ## Determines if the title given above is shown on the main menu screen. Set 19 | ## this to False to hide the title. 20 | 21 | define gui.show_name = True 22 | 23 | 24 | ## The version of the game. 25 | 26 | define config.version = "1.0" 27 | 28 | 29 | ## Text that is placed on the game's about screen. Place the text between the 30 | ## triple-quotes, and leave a blank line between paragraphs. 31 | 32 | define gui.about = _p(""" 33 | """) 34 | 35 | 36 | ## A short name for the game used for executables and directories in the built 37 | ## distribution. This must be ASCII-only, and must not contain spaces, colons, 38 | ## or semicolons. 39 | 40 | define build.name = "RenPyChatGPTExample" 41 | 42 | 43 | ## Sounds and music ############################################################ 44 | 45 | ## These three variables control, among other things, which mixers are shown 46 | ## to the player by default. Setting one of these to False will hide the 47 | ## appropriate mixer. 48 | 49 | define config.has_sound = True 50 | define config.has_music = True 51 | define config.has_voice = True 52 | 53 | 54 | ## To allow the user to play a test sound on the sound or voice channel, 55 | ## uncomment a line below and use it to set a sample sound to play. 56 | 57 | # define config.sample_sound = "sample-sound.ogg" 58 | # define config.sample_voice = "sample-voice.ogg" 59 | 60 | 61 | ## Uncomment the following line to set an audio file that will be played while 62 | ## the player is at the main menu. This file will continue playing into the 63 | ## game, until it is stopped or another file is played. 64 | 65 | # define config.main_menu_music = "main-menu-theme.ogg" 66 | 67 | 68 | ## Transitions ################################################################# 69 | ## 70 | ## These variables set transitions that are used when certain events occur. 71 | ## Each variable should be set to a transition, or None to indicate that no 72 | ## transition should be used. 73 | 74 | ## Entering or exiting the game menu. 75 | 76 | define config.enter_transition = dissolve 77 | define config.exit_transition = dissolve 78 | 79 | 80 | ## Between screens of the game menu. 81 | 82 | define config.intra_transition = dissolve 83 | 84 | 85 | ## A transition that is used after a game has been loaded. 86 | 87 | define config.after_load_transition = None 88 | 89 | 90 | ## Used when entering the main menu after the game has ended. 91 | 92 | define config.end_game_transition = None 93 | 94 | 95 | ## A variable to set the transition used when the game starts does not exist. 96 | ## Instead, use a with statement after showing the initial scene. 97 | 98 | 99 | ## Window management ########################################################### 100 | ## 101 | ## This controls when the dialogue window is displayed. If "show", it is always 102 | ## displayed. If "hide", it is only displayed when dialogue is present. If 103 | ## "auto", the window is hidden before scene statements and shown again once 104 | ## dialogue is displayed. 105 | ## 106 | ## After the game has started, this can be changed with the "window show", 107 | ## "window hide", and "window auto" statements. 108 | 109 | define config.window = "auto" 110 | 111 | 112 | ## Transitions used to show and hide the dialogue window 113 | 114 | define config.window_show_transition = Dissolve(.2) 115 | define config.window_hide_transition = Dissolve(.2) 116 | 117 | 118 | ## Preference defaults ######################################################### 119 | 120 | ## Controls the default text speed. The default, 0, is infinite, while any other 121 | ## number is the number of characters per second to type out. 122 | 123 | default preferences.text_cps = 0 124 | 125 | 126 | ## The default auto-forward delay. Larger numbers lead to longer waits, with 0 127 | ## to 30 being the valid range. 128 | 129 | default preferences.afm_time = 15 130 | 131 | 132 | ## Save directory ############################################################## 133 | ## 134 | ## Controls the platform-specific place Ren'Py will place the save files for 135 | ## this game. The save files will be placed in: 136 | ## 137 | ## Windows: %APPDATA\RenPy\ 138 | ## 139 | ## Macintosh: $HOME/Library/RenPy/ 140 | ## 141 | ## Linux: $HOME/.renpy/ 142 | ## 143 | ## This generally should not be changed, and if it is, should always be a 144 | ## literal string, not an expression. 145 | 146 | define config.save_directory = "RenPyChatGPTExample-1679242524" 147 | 148 | 149 | ## Icon ######################################################################## 150 | ## 151 | ## The icon displayed on the taskbar or dock. 152 | 153 | define config.window_icon = "gui/window_icon.png" 154 | 155 | 156 | ## Build configuration ######################################################### 157 | ## 158 | ## This section controls how Ren'Py turns your project into distribution files. 159 | 160 | init python: 161 | 162 | ## The following functions take file patterns. File patterns are case- 163 | ## insensitive, and matched against the path relative to the base directory, 164 | ## with and without a leading /. If multiple patterns match, the first is 165 | ## used. 166 | ## 167 | ## In a pattern: 168 | ## 169 | ## / is the directory separator. 170 | ## 171 | ## * matches all characters, except the directory separator. 172 | ## 173 | ## ** matches all characters, including the directory separator. 174 | ## 175 | ## For example, "*.txt" matches txt files in the base directory, "game/ 176 | ## **.ogg" matches ogg files in the game directory or any of its 177 | ## subdirectories, and "**.psd" matches psd files anywhere in the project. 178 | 179 | ## Classify files as None to exclude them from the built distributions. 180 | 181 | build.classify('**~', None) 182 | build.classify('**.bak', None) 183 | build.classify('**/.**', None) 184 | build.classify('**/#**', None) 185 | build.classify('**/thumbs.db', None) 186 | 187 | ## To archive files, classify them as 'archive'. 188 | 189 | # build.classify('game/**.png', 'archive') 190 | # build.classify('game/**.jpg', 'archive') 191 | 192 | ## Files matching documentation patterns are duplicated in a mac app build, 193 | ## so they appear in both the app and the zip file. 194 | 195 | build.documentation('*.html') 196 | build.documentation('*.txt') 197 | 198 | 199 | ## A Google Play license key is required to download expansion files and perform 200 | ## in-app purchases. It can be found on the "Services & APIs" page of the Google 201 | ## Play developer console. 202 | 203 | # define build.google_play_key = "..." 204 | 205 | 206 | ## The username and project name associated with an itch.io project, separated 207 | ## by a slash. 208 | 209 | # define build.itch_project = "renpytom/test-project" 210 | -------------------------------------------------------------------------------- /game/options.rpyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/options.rpyc -------------------------------------------------------------------------------- /game/python-packages/chatgpt/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = "1.0.0" 2 | 3 | # Import required libraries 4 | import requests 5 | import json 6 | 7 | # Define the completion function that takes messages and an API key as input 8 | def completion(messages, api_key="", proxy=''): 9 | # Set the API endpoint URL for ChatGPT completions 10 | url = "https://api.openai.com/v1/chat/completions" 11 | 12 | # If a proxy is set, then it should use that instead 13 | if proxy is not None and proxy != '': url = proxy 14 | 15 | # Set the headers for the API request, including the Content-Type and Authorization with the API key 16 | headers = { 17 | "Content-Type": "application/json", 18 | "Authorization": f"Bearer {api_key}" 19 | } 20 | 21 | # Set the data for the API request, including the model and the input messages 22 | data = { 23 | "model": "gpt-3.5-turbo", 24 | "messages": messages 25 | } 26 | 27 | # Send the API request using the POST method, passing the headers and the data as JSON 28 | response = requests.post(url, headers=headers, data=json.dumps(data)) 29 | 30 | # Check if the response status code is 200 (successful) 31 | if response.status_code == 200: 32 | # Extract the message from the response JSON and append it to the messages list 33 | completion = response.json()["choices"][0]["message"] 34 | messages.append(completion) 35 | return messages # Return the updated messages list 36 | else: 37 | # If the status code is not 200, raise an exception with the error details 38 | raise Exception(f"Error: {response.status_code}, {response.text}") 39 | -------------------------------------------------------------------------------- /game/screens.rpy: -------------------------------------------------------------------------------- 1 | ################################################################################ 2 | ## Initialization 3 | ################################################################################ 4 | 5 | init offset = -1 6 | 7 | 8 | ################################################################################ 9 | ## Styles 10 | ################################################################################ 11 | 12 | style default: 13 | properties gui.text_properties() 14 | language gui.language 15 | 16 | style input: 17 | properties gui.text_properties("input", accent=True) 18 | adjust_spacing False 19 | 20 | style hyperlink_text: 21 | properties gui.text_properties("hyperlink", accent=True) 22 | hover_underline True 23 | 24 | style gui_text: 25 | properties gui.text_properties("interface") 26 | 27 | 28 | style button: 29 | properties gui.button_properties("button") 30 | 31 | style button_text is gui_text: 32 | properties gui.text_properties("button") 33 | yalign 0.5 34 | 35 | 36 | style label_text is gui_text: 37 | properties gui.text_properties("label", accent=True) 38 | 39 | style prompt_text is gui_text: 40 | properties gui.text_properties("prompt") 41 | 42 | 43 | style bar: 44 | ysize gui.bar_size 45 | left_bar Frame("gui/bar/left.png", gui.bar_borders, tile=gui.bar_tile) 46 | right_bar Frame("gui/bar/right.png", gui.bar_borders, tile=gui.bar_tile) 47 | 48 | style vbar: 49 | xsize gui.bar_size 50 | top_bar Frame("gui/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) 51 | bottom_bar Frame("gui/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) 52 | 53 | style scrollbar: 54 | ysize gui.scrollbar_size 55 | base_bar Frame("gui/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) 56 | thumb Frame("gui/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) 57 | 58 | style vscrollbar: 59 | xsize gui.scrollbar_size 60 | base_bar Frame("gui/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) 61 | thumb Frame("gui/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) 62 | 63 | style slider: 64 | ysize gui.slider_size 65 | base_bar Frame("gui/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) 66 | thumb "gui/slider/horizontal_[prefix_]thumb.png" 67 | 68 | style vslider: 69 | xsize gui.slider_size 70 | base_bar Frame("gui/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) 71 | thumb "gui/slider/vertical_[prefix_]thumb.png" 72 | 73 | 74 | style frame: 75 | padding gui.frame_borders.padding 76 | background Frame("gui/frame.png", gui.frame_borders, tile=gui.frame_tile) 77 | 78 | 79 | 80 | ################################################################################ 81 | ## In-game screens 82 | ################################################################################ 83 | 84 | 85 | ## Say screen ################################################################## 86 | ## 87 | ## The say screen is used to display dialogue to the player. It takes two 88 | ## parameters, who and what, which are the name of the speaking character and 89 | ## the text to be displayed, respectively. (The who parameter can be None if no 90 | ## name is given.) 91 | ## 92 | ## This screen must create a text displayable with id "what", as Ren'Py uses 93 | ## this to manage text display. It can also create displayables with id "who" 94 | ## and id "window" to apply style properties. 95 | ## 96 | ## https://www.renpy.org/doc/html/screen_special.html#say 97 | 98 | screen say(who, what): 99 | style_prefix "say" 100 | 101 | window: 102 | id "window" 103 | 104 | if who is not None: 105 | 106 | window: 107 | id "namebox" 108 | style "namebox" 109 | text who id "who" 110 | 111 | text what id "what" 112 | 113 | 114 | ## If there's a side image, display it above the text. Do not display on the 115 | ## phone variant - there's no room. 116 | if not renpy.variant("small"): 117 | add SideImage() xalign 0.0 yalign 1.0 118 | 119 | 120 | ## Make the namebox available for styling through the Character object. 121 | init python: 122 | config.character_id_prefixes.append('namebox') 123 | 124 | style window is default 125 | style say_label is default 126 | style say_dialogue is default 127 | style say_thought is say_dialogue 128 | 129 | style namebox is default 130 | style namebox_label is say_label 131 | 132 | 133 | style window: 134 | xalign 0.5 135 | xfill True 136 | yalign gui.textbox_yalign 137 | ysize gui.textbox_height 138 | 139 | background Image("gui/textbox.png", xalign=0.5, yalign=1.0) 140 | 141 | style namebox: 142 | xpos gui.name_xpos 143 | xanchor gui.name_xalign 144 | xsize gui.namebox_width 145 | ypos gui.name_ypos 146 | ysize gui.namebox_height 147 | 148 | background Frame("gui/namebox.png", gui.namebox_borders, tile=gui.namebox_tile, xalign=gui.name_xalign) 149 | padding gui.namebox_borders.padding 150 | 151 | style say_label: 152 | properties gui.text_properties("name", accent=True) 153 | xalign gui.name_xalign 154 | yalign 0.5 155 | 156 | style say_dialogue: 157 | properties gui.text_properties("dialogue") 158 | 159 | xpos gui.dialogue_xpos 160 | xsize gui.dialogue_width 161 | ypos gui.dialogue_ypos 162 | 163 | adjust_spacing False 164 | 165 | ## Input screen ################################################################ 166 | ## 167 | ## This screen is used to display renpy.input. The prompt parameter is used to 168 | ## pass a text prompt in. 169 | ## 170 | ## This screen must create an input displayable with id "input" to accept the 171 | ## various input parameters. 172 | ## 173 | ## https://www.renpy.org/doc/html/screen_special.html#input 174 | 175 | screen input(prompt): 176 | style_prefix "input" 177 | 178 | window: 179 | 180 | vbox: 181 | xanchor gui.dialogue_text_xalign 182 | xpos gui.dialogue_xpos 183 | xsize gui.dialogue_width 184 | ypos gui.dialogue_ypos 185 | 186 | text prompt style "input_prompt" 187 | input id "input" 188 | 189 | style input_prompt is default 190 | 191 | style input_prompt: 192 | xalign gui.dialogue_text_xalign 193 | properties gui.text_properties("input_prompt") 194 | 195 | style input: 196 | xalign gui.dialogue_text_xalign 197 | xmaximum gui.dialogue_width 198 | 199 | 200 | ## Choice screen ############################################################### 201 | ## 202 | ## This screen is used to display the in-game choices presented by the menu 203 | ## statement. The one parameter, items, is a list of objects, each with caption 204 | ## and action fields. 205 | ## 206 | ## https://www.renpy.org/doc/html/screen_special.html#choice 207 | 208 | screen choice(items): 209 | style_prefix "choice" 210 | 211 | vbox: 212 | for i in items: 213 | textbutton i.caption action i.action 214 | 215 | 216 | style choice_vbox is vbox 217 | style choice_button is button 218 | style choice_button_text is button_text 219 | 220 | style choice_vbox: 221 | xalign 0.5 222 | ypos 405 223 | yanchor 0.5 224 | 225 | spacing gui.choice_spacing 226 | 227 | style choice_button is default: 228 | properties gui.button_properties("choice_button") 229 | 230 | style choice_button_text is default: 231 | properties gui.button_text_properties("choice_button") 232 | 233 | 234 | ## Quick Menu screen ########################################################### 235 | ## 236 | ## The quick menu is displayed in-game to provide easy access to the out-of-game 237 | ## menus. 238 | 239 | screen quick_menu(): 240 | 241 | ## Ensure this appears on top of other screens. 242 | zorder 100 243 | 244 | if quick_menu: 245 | 246 | hbox: 247 | style_prefix "quick" 248 | 249 | xalign 0.5 250 | yalign 1.0 251 | 252 | textbutton _("Back") action Rollback() 253 | textbutton _("History") action ShowMenu('history') 254 | textbutton _("Skip") action Skip() alternate Skip(fast=True, confirm=True) 255 | textbutton _("Auto") action Preference("auto-forward", "toggle") 256 | textbutton _("Save") action ShowMenu('save') 257 | textbutton _("Q.Save") action QuickSave() 258 | textbutton _("Q.Load") action QuickLoad() 259 | textbutton _("Prefs") action ShowMenu('preferences') 260 | 261 | 262 | ## This code ensures that the quick_menu screen is displayed in-game, whenever 263 | ## the player has not explicitly hidden the interface. 264 | init python: 265 | config.overlay_screens.append("quick_menu") 266 | 267 | default quick_menu = True 268 | 269 | style quick_button is default 270 | style quick_button_text is button_text 271 | 272 | style quick_button: 273 | properties gui.button_properties("quick_button") 274 | 275 | style quick_button_text: 276 | properties gui.button_text_properties("quick_button") 277 | 278 | 279 | ################################################################################ 280 | ## Main and Game Menu Screens 281 | ################################################################################ 282 | 283 | ## Navigation screen ########################################################### 284 | ## 285 | ## This screen is included in the main and game menus, and provides navigation 286 | ## to other menus, and to start the game. 287 | 288 | screen navigation(): 289 | 290 | vbox: 291 | style_prefix "navigation" 292 | 293 | xpos gui.navigation_xpos 294 | yalign 0.5 295 | 296 | spacing gui.navigation_spacing 297 | 298 | if main_menu: 299 | 300 | textbutton _("Start") action Start() 301 | 302 | else: 303 | 304 | textbutton _("History") action ShowMenu("history") 305 | 306 | textbutton _("Save") action ShowMenu("save") 307 | 308 | textbutton _("Load") action ShowMenu("load") 309 | 310 | textbutton _("Preferences") action ShowMenu("preferences") 311 | 312 | if _in_replay: 313 | 314 | textbutton _("End Replay") action EndReplay(confirm=True) 315 | 316 | elif not main_menu: 317 | 318 | textbutton _("Main Menu") action MainMenu() 319 | 320 | textbutton _("About") action ShowMenu("about") 321 | 322 | if renpy.variant("pc") or (renpy.variant("web") and not renpy.variant("mobile")): 323 | 324 | ## Help isn't necessary or relevant to mobile devices. 325 | textbutton _("Help") action ShowMenu("help") 326 | 327 | if renpy.variant("pc"): 328 | 329 | ## The quit button is banned on iOS and unnecessary on Android and 330 | ## Web. 331 | textbutton _("Quit") action Quit(confirm=not main_menu) 332 | 333 | 334 | style navigation_button is gui_button 335 | style navigation_button_text is gui_button_text 336 | 337 | style navigation_button: 338 | size_group "navigation" 339 | properties gui.button_properties("navigation_button") 340 | 341 | style navigation_button_text: 342 | properties gui.button_text_properties("navigation_button") 343 | 344 | 345 | ## Main Menu screen ############################################################ 346 | ## 347 | ## Used to display the main menu when Ren'Py starts. 348 | ## 349 | ## https://www.renpy.org/doc/html/screen_special.html#main-menu 350 | 351 | screen main_menu(): 352 | 353 | ## This ensures that any other menu screen is replaced. 354 | tag menu 355 | 356 | add gui.main_menu_background 357 | 358 | ## This empty frame darkens the main menu. 359 | frame: 360 | style "main_menu_frame" 361 | 362 | ## The use statement includes another screen inside this one. The actual 363 | ## contents of the main menu are in the navigation screen. 364 | use navigation 365 | 366 | if gui.show_name: 367 | 368 | vbox: 369 | style "main_menu_vbox" 370 | 371 | text "[config.name!t]": 372 | style "main_menu_title" 373 | 374 | text "[config.version]": 375 | style "main_menu_version" 376 | 377 | 378 | style main_menu_frame is empty 379 | style main_menu_vbox is vbox 380 | style main_menu_text is gui_text 381 | style main_menu_title is main_menu_text 382 | style main_menu_version is main_menu_text 383 | 384 | style main_menu_frame: 385 | xsize 420 386 | yfill True 387 | 388 | background "gui/overlay/main_menu.png" 389 | 390 | style main_menu_vbox: 391 | xalign 1.0 392 | xoffset -30 393 | xmaximum 1200 394 | yalign 1.0 395 | yoffset -30 396 | 397 | style main_menu_text: 398 | properties gui.text_properties("main_menu", accent=True) 399 | 400 | style main_menu_title: 401 | properties gui.text_properties("title") 402 | 403 | style main_menu_version: 404 | properties gui.text_properties("version") 405 | 406 | 407 | ## Game Menu screen ############################################################ 408 | ## 409 | ## This lays out the basic common structure of a game menu screen. It's called 410 | ## with the screen title, and displays the background, title, and navigation. 411 | ## 412 | ## The scroll parameter can be None, or one of "viewport" or "vpgrid". When 413 | ## this screen is intended to be used with one or more children, which are 414 | ## transcluded (placed) inside it. 415 | 416 | screen game_menu(title, scroll=None, yinitial=0.0): 417 | 418 | style_prefix "game_menu" 419 | 420 | if main_menu: 421 | add gui.main_menu_background 422 | else: 423 | add gui.game_menu_background 424 | 425 | frame: 426 | style "game_menu_outer_frame" 427 | 428 | hbox: 429 | 430 | ## Reserve space for the navigation section. 431 | frame: 432 | style "game_menu_navigation_frame" 433 | 434 | frame: 435 | style "game_menu_content_frame" 436 | 437 | if scroll == "viewport": 438 | 439 | viewport: 440 | yinitial yinitial 441 | scrollbars "vertical" 442 | mousewheel True 443 | draggable True 444 | pagekeys True 445 | 446 | side_yfill True 447 | 448 | vbox: 449 | transclude 450 | 451 | elif scroll == "vpgrid": 452 | 453 | vpgrid: 454 | cols 1 455 | yinitial yinitial 456 | 457 | scrollbars "vertical" 458 | mousewheel True 459 | draggable True 460 | pagekeys True 461 | 462 | side_yfill True 463 | 464 | transclude 465 | 466 | else: 467 | 468 | transclude 469 | 470 | use navigation 471 | 472 | textbutton _("Return"): 473 | style "return_button" 474 | 475 | action Return() 476 | 477 | label title 478 | 479 | if main_menu: 480 | key "game_menu" action ShowMenu("main_menu") 481 | 482 | 483 | style game_menu_outer_frame is empty 484 | style game_menu_navigation_frame is empty 485 | style game_menu_content_frame is empty 486 | style game_menu_viewport is gui_viewport 487 | style game_menu_side is gui_side 488 | style game_menu_scrollbar is gui_vscrollbar 489 | 490 | style game_menu_label is gui_label 491 | style game_menu_label_text is gui_label_text 492 | 493 | style return_button is navigation_button 494 | style return_button_text is navigation_button_text 495 | 496 | style game_menu_outer_frame: 497 | bottom_padding 45 498 | top_padding 180 499 | 500 | background "gui/overlay/game_menu.png" 501 | 502 | style game_menu_navigation_frame: 503 | xsize 420 504 | yfill True 505 | 506 | style game_menu_content_frame: 507 | left_margin 60 508 | right_margin 30 509 | top_margin 15 510 | 511 | style game_menu_viewport: 512 | xsize 1380 513 | 514 | style game_menu_vscrollbar: 515 | unscrollable gui.unscrollable 516 | 517 | style game_menu_side: 518 | spacing 15 519 | 520 | style game_menu_label: 521 | xpos 75 522 | ysize 180 523 | 524 | style game_menu_label_text: 525 | size gui.title_text_size 526 | color gui.accent_color 527 | yalign 0.5 528 | 529 | style return_button: 530 | xpos gui.navigation_xpos 531 | yalign 1.0 532 | yoffset -45 533 | 534 | 535 | ## About screen ################################################################ 536 | ## 537 | ## This screen gives credit and copyright information about the game and Ren'Py. 538 | ## 539 | ## There's nothing special about this screen, and hence it also serves as an 540 | ## example of how to make a custom screen. 541 | 542 | screen about(): 543 | 544 | tag menu 545 | 546 | ## This use statement includes the game_menu screen inside this one. The 547 | ## vbox child is then included inside the viewport inside the game_menu 548 | ## screen. 549 | use game_menu(_("About"), scroll="viewport"): 550 | 551 | style_prefix "about" 552 | 553 | vbox: 554 | 555 | label "[config.name!t]" 556 | text _("Version [config.version!t]\n") 557 | 558 | ## gui.about is usually set in options.rpy. 559 | if gui.about: 560 | text "[gui.about!t]\n" 561 | 562 | text _("Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]") 563 | 564 | 565 | style about_label is gui_label 566 | style about_label_text is gui_label_text 567 | style about_text is gui_text 568 | 569 | style about_label_text: 570 | size gui.label_text_size 571 | 572 | 573 | ## Load and Save screens ####################################################### 574 | ## 575 | ## These screens are responsible for letting the player save the game and load 576 | ## it again. Since they share nearly everything in common, both are implemented 577 | ## in terms of a third screen, file_slots. 578 | ## 579 | ## https://www.renpy.org/doc/html/screen_special.html#save https:// 580 | ## www.renpy.org/doc/html/screen_special.html#load 581 | 582 | screen save(): 583 | 584 | tag menu 585 | 586 | use file_slots(_("Save")) 587 | 588 | 589 | screen load(): 590 | 591 | tag menu 592 | 593 | use file_slots(_("Load")) 594 | 595 | 596 | screen file_slots(title): 597 | 598 | default page_name_value = FilePageNameInputValue(pattern=_("Page {}"), auto=_("Automatic saves"), quick=_("Quick saves")) 599 | 600 | use game_menu(title): 601 | 602 | fixed: 603 | 604 | ## This ensures the input will get the enter event before any of the 605 | ## buttons do. 606 | order_reverse True 607 | 608 | ## The page name, which can be edited by clicking on a button. 609 | button: 610 | style "page_label" 611 | 612 | key_events True 613 | xalign 0.5 614 | action page_name_value.Toggle() 615 | 616 | input: 617 | style "page_label_text" 618 | value page_name_value 619 | 620 | ## The grid of file slots. 621 | grid gui.file_slot_cols gui.file_slot_rows: 622 | style_prefix "slot" 623 | 624 | xalign 0.5 625 | yalign 0.5 626 | 627 | spacing gui.slot_spacing 628 | 629 | for i in range(gui.file_slot_cols * gui.file_slot_rows): 630 | 631 | $ slot = i + 1 632 | 633 | button: 634 | action FileAction(slot) 635 | 636 | has vbox 637 | 638 | add FileScreenshot(slot) xalign 0.5 639 | 640 | text FileTime(slot, format=_("{#file_time}%A, %B %d %Y, %H:%M"), empty=_("empty slot")): 641 | style "slot_time_text" 642 | 643 | text FileSaveName(slot): 644 | style "slot_name_text" 645 | 646 | key "save_delete" action FileDelete(slot) 647 | 648 | ## Buttons to access other pages. 649 | hbox: 650 | style_prefix "page" 651 | 652 | xalign 0.5 653 | yalign 1.0 654 | 655 | spacing gui.page_spacing 656 | 657 | textbutton _("<") action FilePagePrevious() 658 | 659 | if config.has_autosave: 660 | textbutton _("{#auto_page}A") action FilePage("auto") 661 | 662 | if config.has_quicksave: 663 | textbutton _("{#quick_page}Q") action FilePage("quick") 664 | 665 | ## range(1, 10) gives the numbers from 1 to 9. 666 | for page in range(1, 10): 667 | textbutton "[page]" action FilePage(page) 668 | 669 | textbutton _(">") action FilePageNext() 670 | 671 | 672 | style page_label is gui_label 673 | style page_label_text is gui_label_text 674 | style page_button is gui_button 675 | style page_button_text is gui_button_text 676 | 677 | style slot_button is gui_button 678 | style slot_button_text is gui_button_text 679 | style slot_time_text is slot_button_text 680 | style slot_name_text is slot_button_text 681 | 682 | style page_label: 683 | xpadding 75 684 | ypadding 5 685 | 686 | style page_label_text: 687 | text_align 0.5 688 | layout "subtitle" 689 | hover_color gui.hover_color 690 | 691 | style page_button: 692 | properties gui.button_properties("page_button") 693 | 694 | style page_button_text: 695 | properties gui.button_text_properties("page_button") 696 | 697 | style slot_button: 698 | properties gui.button_properties("slot_button") 699 | 700 | style slot_button_text: 701 | properties gui.button_text_properties("slot_button") 702 | 703 | 704 | ## Preferences screen ########################################################## 705 | ## 706 | ## The preferences screen allows the player to configure the game to better suit 707 | ## themselves. 708 | ## 709 | ## https://www.renpy.org/doc/html/screen_special.html#preferences 710 | 711 | screen preferences(): 712 | 713 | tag menu 714 | 715 | use game_menu(_("Preferences"), scroll="viewport"): 716 | 717 | vbox: 718 | 719 | hbox: 720 | box_wrap True 721 | 722 | if renpy.variant("pc") or renpy.variant("web"): 723 | 724 | vbox: 725 | style_prefix "radio" 726 | label _("Display") 727 | textbutton _("Window") action Preference("display", "window") 728 | textbutton _("Fullscreen") action Preference("display", "fullscreen") 729 | 730 | vbox: 731 | style_prefix "check" 732 | label _("Skip") 733 | textbutton _("Unseen Text") action Preference("skip", "toggle") 734 | textbutton _("After Choices") action Preference("after choices", "toggle") 735 | textbutton _("Transitions") action InvertSelected(Preference("transitions", "toggle")) 736 | 737 | ## Additional vboxes of type "radio_pref" or "check_pref" can be 738 | ## added here, to add additional creator-defined preferences. 739 | 740 | null height (4 * gui.pref_spacing) 741 | 742 | hbox: 743 | style_prefix "slider" 744 | box_wrap True 745 | 746 | vbox: 747 | 748 | label _("Text Speed") 749 | 750 | bar value Preference("text speed") 751 | 752 | label _("Auto-Forward Time") 753 | 754 | bar value Preference("auto-forward time") 755 | 756 | vbox: 757 | 758 | if config.has_music: 759 | label _("Music Volume") 760 | 761 | hbox: 762 | bar value Preference("music volume") 763 | 764 | if config.has_sound: 765 | 766 | label _("Sound Volume") 767 | 768 | hbox: 769 | bar value Preference("sound volume") 770 | 771 | if config.sample_sound: 772 | textbutton _("Test") action Play("sound", config.sample_sound) 773 | 774 | 775 | if config.has_voice: 776 | label _("Voice Volume") 777 | 778 | hbox: 779 | bar value Preference("voice volume") 780 | 781 | if config.sample_voice: 782 | textbutton _("Test") action Play("voice", config.sample_voice) 783 | 784 | if config.has_music or config.has_sound or config.has_voice: 785 | null height gui.pref_spacing 786 | 787 | textbutton _("Mute All"): 788 | action Preference("all mute", "toggle") 789 | style "mute_all_button" 790 | 791 | 792 | style pref_label is gui_label 793 | style pref_label_text is gui_label_text 794 | style pref_vbox is vbox 795 | 796 | style radio_label is pref_label 797 | style radio_label_text is pref_label_text 798 | style radio_button is gui_button 799 | style radio_button_text is gui_button_text 800 | style radio_vbox is pref_vbox 801 | 802 | style check_label is pref_label 803 | style check_label_text is pref_label_text 804 | style check_button is gui_button 805 | style check_button_text is gui_button_text 806 | style check_vbox is pref_vbox 807 | 808 | style slider_label is pref_label 809 | style slider_label_text is pref_label_text 810 | style slider_slider is gui_slider 811 | style slider_button is gui_button 812 | style slider_button_text is gui_button_text 813 | style slider_pref_vbox is pref_vbox 814 | 815 | style mute_all_button is check_button 816 | style mute_all_button_text is check_button_text 817 | 818 | style pref_label: 819 | top_margin gui.pref_spacing 820 | bottom_margin 3 821 | 822 | style pref_label_text: 823 | yalign 1.0 824 | 825 | style pref_vbox: 826 | xsize 338 827 | 828 | style radio_vbox: 829 | spacing gui.pref_button_spacing 830 | 831 | style radio_button: 832 | properties gui.button_properties("radio_button") 833 | foreground "gui/button/radio_[prefix_]foreground.png" 834 | 835 | style radio_button_text: 836 | properties gui.button_text_properties("radio_button") 837 | 838 | style check_vbox: 839 | spacing gui.pref_button_spacing 840 | 841 | style check_button: 842 | properties gui.button_properties("check_button") 843 | foreground "gui/button/check_[prefix_]foreground.png" 844 | 845 | style check_button_text: 846 | properties gui.button_text_properties("check_button") 847 | 848 | style slider_slider: 849 | xsize 525 850 | 851 | style slider_button: 852 | properties gui.button_properties("slider_button") 853 | yalign 0.5 854 | left_margin 15 855 | 856 | style slider_button_text: 857 | properties gui.button_text_properties("slider_button") 858 | 859 | style slider_vbox: 860 | xsize 675 861 | 862 | 863 | ## History screen ############################################################## 864 | ## 865 | ## This is a screen that displays the dialogue history to the player. While 866 | ## there isn't anything special about this screen, it does have to access the 867 | ## dialogue history stored in _history_list. 868 | ## 869 | ## https://www.renpy.org/doc/html/history.html 870 | 871 | screen history(): 872 | 873 | tag menu 874 | 875 | ## Avoid predicting this screen, as it can be very large. 876 | predict False 877 | 878 | use game_menu(_("History"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0): 879 | 880 | style_prefix "history" 881 | 882 | for h in _history_list: 883 | 884 | window: 885 | 886 | ## This lays things out properly if history_height is None. 887 | has fixed: 888 | yfit True 889 | 890 | if h.who: 891 | 892 | label h.who: 893 | style "history_name" 894 | substitute False 895 | 896 | ## Take the color of the who text from the Character, if 897 | ## set. 898 | if "color" in h.who_args: 899 | text_color h.who_args["color"] 900 | 901 | $ what = renpy.filter_text_tags(h.what, allow=gui.history_allow_tags) 902 | text what: 903 | substitute False 904 | 905 | if not _history_list: 906 | label _("The dialogue history is empty.") 907 | 908 | 909 | ## This determines what tags are allowed to be displayed on the history screen. 910 | 911 | define gui.history_allow_tags = { "alt", "noalt", "rt", "rb", "art" } 912 | 913 | 914 | style history_window is empty 915 | 916 | style history_name is gui_label 917 | style history_name_text is gui_label_text 918 | style history_text is gui_text 919 | 920 | style history_label is gui_label 921 | style history_label_text is gui_label_text 922 | 923 | style history_window: 924 | xfill True 925 | ysize gui.history_height 926 | 927 | style history_name: 928 | xpos gui.history_name_xpos 929 | xanchor gui.history_name_xalign 930 | ypos gui.history_name_ypos 931 | xsize gui.history_name_width 932 | 933 | style history_name_text: 934 | min_width gui.history_name_width 935 | text_align gui.history_name_xalign 936 | 937 | style history_text: 938 | xpos gui.history_text_xpos 939 | ypos gui.history_text_ypos 940 | xanchor gui.history_text_xalign 941 | xsize gui.history_text_width 942 | min_width gui.history_text_width 943 | text_align gui.history_text_xalign 944 | layout ("subtitle" if gui.history_text_xalign else "tex") 945 | 946 | style history_label: 947 | xfill True 948 | 949 | style history_label_text: 950 | xalign 0.5 951 | 952 | 953 | ## Help screen ################################################################# 954 | ## 955 | ## A screen that gives information about key and mouse bindings. It uses other 956 | ## screens (keyboard_help, mouse_help, and gamepad_help) to display the actual 957 | ## help. 958 | 959 | screen help(): 960 | 961 | tag menu 962 | 963 | default device = "keyboard" 964 | 965 | use game_menu(_("Help"), scroll="viewport"): 966 | 967 | style_prefix "help" 968 | 969 | vbox: 970 | spacing 23 971 | 972 | hbox: 973 | 974 | textbutton _("Keyboard") action SetScreenVariable("device", "keyboard") 975 | textbutton _("Mouse") action SetScreenVariable("device", "mouse") 976 | 977 | if GamepadExists(): 978 | textbutton _("Gamepad") action SetScreenVariable("device", "gamepad") 979 | 980 | if device == "keyboard": 981 | use keyboard_help 982 | elif device == "mouse": 983 | use mouse_help 984 | elif device == "gamepad": 985 | use gamepad_help 986 | 987 | 988 | screen keyboard_help(): 989 | 990 | hbox: 991 | label _("Enter") 992 | text _("Advances dialogue and activates the interface.") 993 | 994 | hbox: 995 | label _("Space") 996 | text _("Advances dialogue without selecting choices.") 997 | 998 | hbox: 999 | label _("Arrow Keys") 1000 | text _("Navigate the interface.") 1001 | 1002 | hbox: 1003 | label _("Escape") 1004 | text _("Accesses the game menu.") 1005 | 1006 | hbox: 1007 | label _("Ctrl") 1008 | text _("Skips dialogue while held down.") 1009 | 1010 | hbox: 1011 | label _("Tab") 1012 | text _("Toggles dialogue skipping.") 1013 | 1014 | hbox: 1015 | label _("Page Up") 1016 | text _("Rolls back to earlier dialogue.") 1017 | 1018 | hbox: 1019 | label _("Page Down") 1020 | text _("Rolls forward to later dialogue.") 1021 | 1022 | hbox: 1023 | label "H" 1024 | text _("Hides the user interface.") 1025 | 1026 | hbox: 1027 | label "S" 1028 | text _("Takes a screenshot.") 1029 | 1030 | hbox: 1031 | label "V" 1032 | text _("Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}.") 1033 | 1034 | hbox: 1035 | label "Shift+A" 1036 | text _("Opens the accessibility menu.") 1037 | 1038 | 1039 | screen mouse_help(): 1040 | 1041 | hbox: 1042 | label _("Left Click") 1043 | text _("Advances dialogue and activates the interface.") 1044 | 1045 | hbox: 1046 | label _("Middle Click") 1047 | text _("Hides the user interface.") 1048 | 1049 | hbox: 1050 | label _("Right Click") 1051 | text _("Accesses the game menu.") 1052 | 1053 | hbox: 1054 | label _("Mouse Wheel Up\nClick Rollback Side") 1055 | text _("Rolls back to earlier dialogue.") 1056 | 1057 | hbox: 1058 | label _("Mouse Wheel Down") 1059 | text _("Rolls forward to later dialogue.") 1060 | 1061 | 1062 | screen gamepad_help(): 1063 | 1064 | hbox: 1065 | label _("Right Trigger\nA/Bottom Button") 1066 | text _("Advances dialogue and activates the interface.") 1067 | 1068 | hbox: 1069 | label _("Left Trigger\nLeft Shoulder") 1070 | text _("Rolls back to earlier dialogue.") 1071 | 1072 | hbox: 1073 | label _("Right Shoulder") 1074 | text _("Rolls forward to later dialogue.") 1075 | 1076 | 1077 | hbox: 1078 | label _("D-Pad, Sticks") 1079 | text _("Navigate the interface.") 1080 | 1081 | hbox: 1082 | label _("Start, Guide") 1083 | text _("Accesses the game menu.") 1084 | 1085 | hbox: 1086 | label _("Y/Top Button") 1087 | text _("Hides the user interface.") 1088 | 1089 | textbutton _("Calibrate") action GamepadCalibrate() 1090 | 1091 | 1092 | style help_button is gui_button 1093 | style help_button_text is gui_button_text 1094 | style help_label is gui_label 1095 | style help_label_text is gui_label_text 1096 | style help_text is gui_text 1097 | 1098 | style help_button: 1099 | properties gui.button_properties("help_button") 1100 | xmargin 12 1101 | 1102 | style help_button_text: 1103 | properties gui.button_text_properties("help_button") 1104 | 1105 | style help_label: 1106 | xsize 375 1107 | right_padding 30 1108 | 1109 | style help_label_text: 1110 | size gui.text_size 1111 | xalign 1.0 1112 | text_align 1.0 1113 | 1114 | 1115 | 1116 | ################################################################################ 1117 | ## Additional screens 1118 | ################################################################################ 1119 | 1120 | 1121 | ## Confirm screen ############################################################## 1122 | ## 1123 | ## The confirm screen is called when Ren'Py wants to ask the player a yes or no 1124 | ## question. 1125 | ## 1126 | ## https://www.renpy.org/doc/html/screen_special.html#confirm 1127 | 1128 | screen confirm(message, yes_action, no_action): 1129 | 1130 | ## Ensure other screens do not get input while this screen is displayed. 1131 | modal True 1132 | 1133 | zorder 200 1134 | 1135 | style_prefix "confirm" 1136 | 1137 | add "gui/overlay/confirm.png" 1138 | 1139 | frame: 1140 | 1141 | vbox: 1142 | xalign .5 1143 | yalign .5 1144 | spacing 45 1145 | 1146 | label _(message): 1147 | style "confirm_prompt" 1148 | xalign 0.5 1149 | 1150 | hbox: 1151 | xalign 0.5 1152 | spacing 150 1153 | 1154 | textbutton _("Yes") action yes_action 1155 | textbutton _("No") action no_action 1156 | 1157 | ## Right-click and escape answer "no". 1158 | key "game_menu" action no_action 1159 | 1160 | 1161 | style confirm_frame is gui_frame 1162 | style confirm_prompt is gui_prompt 1163 | style confirm_prompt_text is gui_prompt_text 1164 | style confirm_button is gui_medium_button 1165 | style confirm_button_text is gui_medium_button_text 1166 | 1167 | style confirm_frame: 1168 | background Frame([ "gui/confirm_frame.png", "gui/frame.png"], gui.confirm_frame_borders, tile=gui.frame_tile) 1169 | padding gui.confirm_frame_borders.padding 1170 | xalign .5 1171 | yalign .5 1172 | 1173 | style confirm_prompt_text: 1174 | text_align 0.5 1175 | layout "subtitle" 1176 | 1177 | style confirm_button: 1178 | properties gui.button_properties("confirm_button") 1179 | 1180 | style confirm_button_text: 1181 | properties gui.button_text_properties("confirm_button") 1182 | 1183 | 1184 | ## Skip indicator screen ####################################################### 1185 | ## 1186 | ## The skip_indicator screen is displayed to indicate that skipping is in 1187 | ## progress. 1188 | ## 1189 | ## https://www.renpy.org/doc/html/screen_special.html#skip-indicator 1190 | 1191 | screen skip_indicator(): 1192 | 1193 | zorder 100 1194 | style_prefix "skip" 1195 | 1196 | frame: 1197 | 1198 | hbox: 1199 | spacing 9 1200 | 1201 | text _("Skipping") 1202 | 1203 | text "▸" at delayed_blink(0.0, 1.0) style "skip_triangle" 1204 | text "▸" at delayed_blink(0.2, 1.0) style "skip_triangle" 1205 | text "▸" at delayed_blink(0.4, 1.0) style "skip_triangle" 1206 | 1207 | 1208 | ## This transform is used to blink the arrows one after another. 1209 | transform delayed_blink(delay, cycle): 1210 | alpha .5 1211 | 1212 | pause delay 1213 | 1214 | block: 1215 | linear .2 alpha 1.0 1216 | pause .2 1217 | linear .2 alpha 0.5 1218 | pause (cycle - .4) 1219 | repeat 1220 | 1221 | 1222 | style skip_frame is empty 1223 | style skip_text is gui_text 1224 | style skip_triangle is skip_text 1225 | 1226 | style skip_frame: 1227 | ypos gui.skip_ypos 1228 | background Frame("gui/skip.png", gui.skip_frame_borders, tile=gui.frame_tile) 1229 | padding gui.skip_frame_borders.padding 1230 | 1231 | style skip_text: 1232 | size gui.notify_text_size 1233 | 1234 | style skip_triangle: 1235 | ## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE 1236 | ## glyph in it. 1237 | font "DejaVuSans.ttf" 1238 | 1239 | 1240 | ## Notify screen ############################################################### 1241 | ## 1242 | ## The notify screen is used to show the player a message. (For example, when 1243 | ## the game is quicksaved or a screenshot has been taken.) 1244 | ## 1245 | ## https://www.renpy.org/doc/html/screen_special.html#notify-screen 1246 | 1247 | screen notify(message): 1248 | 1249 | zorder 100 1250 | style_prefix "notify" 1251 | 1252 | frame at notify_appear: 1253 | text "[message!tq]" 1254 | 1255 | timer 3.25 action Hide('notify') 1256 | 1257 | 1258 | transform notify_appear: 1259 | on show: 1260 | alpha 0 1261 | linear .25 alpha 1.0 1262 | on hide: 1263 | linear .5 alpha 0.0 1264 | 1265 | 1266 | style notify_frame is empty 1267 | style notify_text is gui_text 1268 | 1269 | style notify_frame: 1270 | ypos gui.notify_ypos 1271 | 1272 | background Frame("gui/notify.png", gui.notify_frame_borders, tile=gui.frame_tile) 1273 | padding gui.notify_frame_borders.padding 1274 | 1275 | style notify_text: 1276 | properties gui.text_properties("notify") 1277 | 1278 | 1279 | ## NVL screen ################################################################## 1280 | ## 1281 | ## This screen is used for NVL-mode dialogue and menus. 1282 | ## 1283 | ## https://www.renpy.org/doc/html/screen_special.html#nvl 1284 | 1285 | 1286 | screen nvl(dialogue, items=None): 1287 | 1288 | window: 1289 | style "nvl_window" 1290 | 1291 | has vbox: 1292 | spacing gui.nvl_spacing 1293 | 1294 | ## Displays dialogue in either a vpgrid or the vbox. 1295 | if gui.nvl_height: 1296 | 1297 | vpgrid: 1298 | cols 1 1299 | yinitial 1.0 1300 | 1301 | use nvl_dialogue(dialogue) 1302 | 1303 | else: 1304 | 1305 | use nvl_dialogue(dialogue) 1306 | 1307 | ## Displays the menu, if given. The menu may be displayed incorrectly if 1308 | ## config.narrator_menu is set to True. 1309 | for i in items: 1310 | 1311 | textbutton i.caption: 1312 | action i.action 1313 | style "nvl_button" 1314 | 1315 | add SideImage() xalign 0.0 yalign 1.0 1316 | 1317 | 1318 | screen nvl_dialogue(dialogue): 1319 | 1320 | for d in dialogue: 1321 | 1322 | window: 1323 | id d.window_id 1324 | 1325 | fixed: 1326 | yfit gui.nvl_height is None 1327 | 1328 | if d.who is not None: 1329 | 1330 | text d.who: 1331 | id d.who_id 1332 | 1333 | text d.what: 1334 | id d.what_id 1335 | 1336 | 1337 | ## This controls the maximum number of NVL-mode entries that can be displayed at 1338 | ## once. 1339 | define config.nvl_list_length = gui.nvl_list_length 1340 | 1341 | style nvl_window is default 1342 | style nvl_entry is default 1343 | 1344 | style nvl_label is say_label 1345 | style nvl_dialogue is say_dialogue 1346 | 1347 | style nvl_button is button 1348 | style nvl_button_text is button_text 1349 | 1350 | style nvl_window: 1351 | xfill True 1352 | yfill True 1353 | 1354 | background "gui/nvl.png" 1355 | padding gui.nvl_borders.padding 1356 | 1357 | style nvl_entry: 1358 | xfill True 1359 | ysize gui.nvl_height 1360 | 1361 | style nvl_label: 1362 | xpos gui.nvl_name_xpos 1363 | xanchor gui.nvl_name_xalign 1364 | ypos gui.nvl_name_ypos 1365 | yanchor 0.0 1366 | xsize gui.nvl_name_width 1367 | min_width gui.nvl_name_width 1368 | text_align gui.nvl_name_xalign 1369 | 1370 | style nvl_dialogue: 1371 | xpos gui.nvl_text_xpos 1372 | xanchor gui.nvl_text_xalign 1373 | ypos gui.nvl_text_ypos 1374 | xsize gui.nvl_text_width 1375 | min_width gui.nvl_text_width 1376 | text_align gui.nvl_text_xalign 1377 | layout ("subtitle" if gui.nvl_text_xalign else "tex") 1378 | 1379 | style nvl_thought: 1380 | xpos gui.nvl_thought_xpos 1381 | xanchor gui.nvl_thought_xalign 1382 | ypos gui.nvl_thought_ypos 1383 | xsize gui.nvl_thought_width 1384 | min_width gui.nvl_thought_width 1385 | text_align gui.nvl_thought_xalign 1386 | layout ("subtitle" if gui.nvl_text_xalign else "tex") 1387 | 1388 | style nvl_button: 1389 | properties gui.button_properties("nvl_button") 1390 | xpos gui.nvl_button_xpos 1391 | xanchor gui.nvl_button_xalign 1392 | 1393 | style nvl_button_text: 1394 | properties gui.button_text_properties("nvl_button") 1395 | 1396 | 1397 | 1398 | ################################################################################ 1399 | ## Mobile Variants 1400 | ################################################################################ 1401 | 1402 | style pref_vbox: 1403 | variant "medium" 1404 | xsize 675 1405 | 1406 | ## Since a mouse may not be present, we replace the quick menu with a version 1407 | ## that uses fewer and bigger buttons that are easier to touch. 1408 | screen quick_menu(): 1409 | variant "touch" 1410 | 1411 | zorder 100 1412 | 1413 | if quick_menu: 1414 | 1415 | hbox: 1416 | style_prefix "quick" 1417 | 1418 | xalign 0.5 1419 | yalign 1.0 1420 | 1421 | textbutton _("Back") action Rollback() 1422 | textbutton _("Skip") action Skip() alternate Skip(fast=True, confirm=True) 1423 | textbutton _("Auto") action Preference("auto-forward", "toggle") 1424 | textbutton _("Menu") action ShowMenu() 1425 | 1426 | 1427 | style window: 1428 | variant "small" 1429 | background "gui/phone/textbox.png" 1430 | 1431 | style radio_button: 1432 | variant "small" 1433 | foreground "gui/phone/button/radio_[prefix_]foreground.png" 1434 | 1435 | style check_button: 1436 | variant "small" 1437 | foreground "gui/phone/button/check_[prefix_]foreground.png" 1438 | 1439 | style nvl_window: 1440 | variant "small" 1441 | background "gui/phone/nvl.png" 1442 | 1443 | style main_menu_frame: 1444 | variant "small" 1445 | background "gui/phone/overlay/main_menu.png" 1446 | 1447 | style game_menu_outer_frame: 1448 | variant "small" 1449 | background "gui/phone/overlay/game_menu.png" 1450 | 1451 | style game_menu_navigation_frame: 1452 | variant "small" 1453 | xsize 510 1454 | 1455 | style game_menu_content_frame: 1456 | variant "small" 1457 | top_margin 0 1458 | 1459 | style pref_vbox: 1460 | variant "small" 1461 | xsize 600 1462 | 1463 | style bar: 1464 | variant "small" 1465 | ysize gui.bar_size 1466 | left_bar Frame("gui/phone/bar/left.png", gui.bar_borders, tile=gui.bar_tile) 1467 | right_bar Frame("gui/phone/bar/right.png", gui.bar_borders, tile=gui.bar_tile) 1468 | 1469 | style vbar: 1470 | variant "small" 1471 | xsize gui.bar_size 1472 | top_bar Frame("gui/phone/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) 1473 | bottom_bar Frame("gui/phone/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) 1474 | 1475 | style scrollbar: 1476 | variant "small" 1477 | ysize gui.scrollbar_size 1478 | base_bar Frame("gui/phone/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) 1479 | thumb Frame("gui/phone/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) 1480 | 1481 | style vscrollbar: 1482 | variant "small" 1483 | xsize gui.scrollbar_size 1484 | base_bar Frame("gui/phone/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) 1485 | thumb Frame("gui/phone/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) 1486 | 1487 | style slider: 1488 | variant "small" 1489 | ysize gui.slider_size 1490 | base_bar Frame("gui/phone/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) 1491 | thumb "gui/phone/slider/horizontal_[prefix_]thumb.png" 1492 | 1493 | style vslider: 1494 | variant "small" 1495 | xsize gui.slider_size 1496 | base_bar Frame("gui/phone/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) 1497 | thumb "gui/phone/slider/vertical_[prefix_]thumb.png" 1498 | 1499 | style slider_vbox: 1500 | variant "small" 1501 | xsize None 1502 | 1503 | style slider_slider: 1504 | variant "small" 1505 | xsize 900 1506 | -------------------------------------------------------------------------------- /game/screens.rpyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/screens.rpyc -------------------------------------------------------------------------------- /game/script.rpy: -------------------------------------------------------------------------------- 1 | # The script of the game goes in this file. 2 | 3 | 4 | # The game starts here. 5 | 6 | label start: 7 | 8 | define m = Character("Game Master") 9 | 10 | m "Welcome to ChatGPTExample, please start by inputing your OpenAI API key" 11 | 12 | m "To find it search 'Where do I find my Secret OPENAI API Key?' on Google. Note that you need to create an OPENAI account for that." 13 | 14 | python: 15 | #We get the API Key from the User. Because you should NEVER give your API key in any form with your game let alone share it on a public repository 16 | #How to distribute your game with an embbed API KEY ? I'll soon make a special server system to make it possible 17 | apikey = renpy.input("What is your OPENAI API Key? (leave empty if you don't have any)", length=64) 18 | 19 | m "Oki let's go !" 20 | 21 | 22 | define e = Character("Eileen") 23 | 24 | # Show a background. This uses a placeholder by default, but you can 25 | # add a file (named either "bg room.png" or "bg room.jpg") to the 26 | # images directory to show it. 27 | 28 | scene bg room 29 | 30 | # This shows a character sprite. A placeholder is used, but you can 31 | # replace it by adding a file named "eileen happy.png" to the images 32 | # directory. 33 | 34 | show eileen happy 35 | 36 | e "Hello there, my name is Eileen, I am so happy to see you ! Hihihi" 37 | 38 | python: 39 | import chatgpt 40 | 41 | #The "system" message is the initial prompt of your NPC 42 | #Messages with "assistant" are messages from the NPC, here there's a first message so we add it to the list of messages already said by the NPC 43 | messages = [ 44 | {"role": "system", "content": "You are Eileen, a tennage student enrolled at Miskatonic Univeristy of Arkham. You are secretly in love with the user. You laugh very frequently and finish your sentences with 'Hihihi'"}, 45 | {"role": "assistant", "content": "Hello there, my name is Eileen, who are you ?"} 46 | ] 47 | 48 | while True: 49 | #We ask the user for an input 50 | user_input = renpy.input("What do you say ?", length=1000) 51 | #Then add it in the "history" of messages 52 | messages.append( 53 | {"role": "user", "content": user_input} 54 | ) 55 | 56 | if apikey != '': 57 | #We ask ChatGPT to "complete" the conversation by adding a response 58 | #If you have an API key, let's use that 59 | messages = chatgpt.completion(messages,api_key=apikey) 60 | else : 61 | #If you don't provide an API key, we'll use my proxy 62 | #This proxy only allows a set of NPCs, and serves to "hide" my API key 63 | #Check the README.md to know more about it 64 | #Of course if you modify the NPC in any way, it won't work, you'll have to use your own API key instead. 65 | messages = chatgpt.completion(messages,proxy="http://prima.wiki/proxy.php") 66 | 67 | #Here we only care about the response from the NPC 68 | response = messages[-1]["content"] 69 | #So we display just that 70 | e("[response]") 71 | 72 | return 73 | -------------------------------------------------------------------------------- /game/script.rpyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Taiko3615/RenPyChatGPTExample/1217376c1a4fca62c86dbf65e0d900900d5bd78d/game/script.rpyc -------------------------------------------------------------------------------- /game/tl/None/common.rpym: -------------------------------------------------------------------------------- 1 |  2 | translate None strings: 3 | 4 | # renpy/common/00accessibility.rpy:28 5 | old "Self-voicing disabled." 6 | new "Self-voicing disabled." 7 | 8 | # renpy/common/00accessibility.rpy:29 9 | old "Clipboard voicing enabled. " 10 | new "Clipboard voicing enabled. " 11 | 12 | # renpy/common/00accessibility.rpy:30 13 | old "Self-voicing enabled. " 14 | new "Self-voicing enabled. " 15 | 16 | # renpy/common/00accessibility.rpy:32 17 | old "bar" 18 | new "bar" 19 | 20 | # renpy/common/00accessibility.rpy:33 21 | old "selected" 22 | new "selected" 23 | 24 | # renpy/common/00accessibility.rpy:34 25 | old "viewport" 26 | new "viewport" 27 | 28 | # renpy/common/00accessibility.rpy:35 29 | old "horizontal scroll" 30 | new "horizontal scroll" 31 | 32 | # renpy/common/00accessibility.rpy:36 33 | old "vertical scroll" 34 | new "vertical scroll" 35 | 36 | # renpy/common/00accessibility.rpy:37 37 | old "activate" 38 | new "activate" 39 | 40 | # renpy/common/00accessibility.rpy:38 41 | old "deactivate" 42 | new "deactivate" 43 | 44 | # renpy/common/00accessibility.rpy:39 45 | old "increase" 46 | new "increase" 47 | 48 | # renpy/common/00accessibility.rpy:40 49 | old "decrease" 50 | new "decrease" 51 | 52 | # renpy/common/00accessibility.rpy:138 53 | old "Font Override" 54 | new "Font Override" 55 | 56 | # renpy/common/00accessibility.rpy:142 57 | old "Default" 58 | new "Default" 59 | 60 | # renpy/common/00accessibility.rpy:146 61 | old "DejaVu Sans" 62 | new "DejaVu Sans" 63 | 64 | # renpy/common/00accessibility.rpy:150 65 | old "Opendyslexic" 66 | new "Opendyslexic" 67 | 68 | # renpy/common/00accessibility.rpy:156 69 | old "Text Size Scaling" 70 | new "Text Size Scaling" 71 | 72 | # renpy/common/00accessibility.rpy:162 73 | old "Reset" 74 | new "Reset" 75 | 76 | # renpy/common/00accessibility.rpy:168 77 | old "Line Spacing Scaling" 78 | new "Line Spacing Scaling" 79 | 80 | # renpy/common/00accessibility.rpy:180 81 | old "High Contrast Text" 82 | new "High Contrast Text" 83 | 84 | # renpy/common/00accessibility.rpy:182 85 | old "Enable" 86 | new "Enable" 87 | 88 | # renpy/common/00accessibility.rpy:186 89 | old "Disable" 90 | new "Disable" 91 | 92 | # renpy/common/00accessibility.rpy:193 93 | old "Self-Voicing" 94 | new "Self-Voicing" 95 | 96 | # renpy/common/00accessibility.rpy:197 97 | old "Off" 98 | new "Off" 99 | 100 | # renpy/common/00accessibility.rpy:201 101 | old "Text-to-speech" 102 | new "Text-to-speech" 103 | 104 | # renpy/common/00accessibility.rpy:205 105 | old "Clipboard" 106 | new "Clipboard" 107 | 108 | # renpy/common/00accessibility.rpy:209 109 | old "Debug" 110 | new "Debug" 111 | 112 | # renpy/common/00accessibility.rpy:215 113 | old "Self-Voicing Volume Drop" 114 | new "Self-Voicing Volume Drop" 115 | 116 | # renpy/common/00accessibility.rpy:224 117 | old "The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was." 118 | new "The options on this menu are intended to improve accessibility. They may not work with all games, and some combinations of options may render the game unplayable. This is not an issue with the game or engine. For the best results when changing fonts, try to keep the text size the same as it originally was." 119 | 120 | # renpy/common/00accessibility.rpy:229 121 | old "Return" 122 | new "Return" 123 | 124 | # renpy/common/00action_file.rpy:26 125 | old "{#weekday}Monday" 126 | new "{#weekday}Monday" 127 | 128 | # renpy/common/00action_file.rpy:26 129 | old "{#weekday}Tuesday" 130 | new "{#weekday}Tuesday" 131 | 132 | # renpy/common/00action_file.rpy:26 133 | old "{#weekday}Wednesday" 134 | new "{#weekday}Wednesday" 135 | 136 | # renpy/common/00action_file.rpy:26 137 | old "{#weekday}Thursday" 138 | new "{#weekday}Thursday" 139 | 140 | # renpy/common/00action_file.rpy:26 141 | old "{#weekday}Friday" 142 | new "{#weekday}Friday" 143 | 144 | # renpy/common/00action_file.rpy:26 145 | old "{#weekday}Saturday" 146 | new "{#weekday}Saturday" 147 | 148 | # renpy/common/00action_file.rpy:26 149 | old "{#weekday}Sunday" 150 | new "{#weekday}Sunday" 151 | 152 | # renpy/common/00action_file.rpy:37 153 | old "{#weekday_short}Mon" 154 | new "{#weekday_short}Mon" 155 | 156 | # renpy/common/00action_file.rpy:37 157 | old "{#weekday_short}Tue" 158 | new "{#weekday_short}Tue" 159 | 160 | # renpy/common/00action_file.rpy:37 161 | old "{#weekday_short}Wed" 162 | new "{#weekday_short}Wed" 163 | 164 | # renpy/common/00action_file.rpy:37 165 | old "{#weekday_short}Thu" 166 | new "{#weekday_short}Thu" 167 | 168 | # renpy/common/00action_file.rpy:37 169 | old "{#weekday_short}Fri" 170 | new "{#weekday_short}Fri" 171 | 172 | # renpy/common/00action_file.rpy:37 173 | old "{#weekday_short}Sat" 174 | new "{#weekday_short}Sat" 175 | 176 | # renpy/common/00action_file.rpy:37 177 | old "{#weekday_short}Sun" 178 | new "{#weekday_short}Sun" 179 | 180 | # renpy/common/00action_file.rpy:47 181 | old "{#month}January" 182 | new "{#month}January" 183 | 184 | # renpy/common/00action_file.rpy:47 185 | old "{#month}February" 186 | new "{#month}February" 187 | 188 | # renpy/common/00action_file.rpy:47 189 | old "{#month}March" 190 | new "{#month}March" 191 | 192 | # renpy/common/00action_file.rpy:47 193 | old "{#month}April" 194 | new "{#month}April" 195 | 196 | # renpy/common/00action_file.rpy:47 197 | old "{#month}May" 198 | new "{#month}May" 199 | 200 | # renpy/common/00action_file.rpy:47 201 | old "{#month}June" 202 | new "{#month}June" 203 | 204 | # renpy/common/00action_file.rpy:47 205 | old "{#month}July" 206 | new "{#month}July" 207 | 208 | # renpy/common/00action_file.rpy:47 209 | old "{#month}August" 210 | new "{#month}August" 211 | 212 | # renpy/common/00action_file.rpy:47 213 | old "{#month}September" 214 | new "{#month}September" 215 | 216 | # renpy/common/00action_file.rpy:47 217 | old "{#month}October" 218 | new "{#month}October" 219 | 220 | # renpy/common/00action_file.rpy:47 221 | old "{#month}November" 222 | new "{#month}November" 223 | 224 | # renpy/common/00action_file.rpy:47 225 | old "{#month}December" 226 | new "{#month}December" 227 | 228 | # renpy/common/00action_file.rpy:63 229 | old "{#month_short}Jan" 230 | new "{#month_short}Jan" 231 | 232 | # renpy/common/00action_file.rpy:63 233 | old "{#month_short}Feb" 234 | new "{#month_short}Feb" 235 | 236 | # renpy/common/00action_file.rpy:63 237 | old "{#month_short}Mar" 238 | new "{#month_short}Mar" 239 | 240 | # renpy/common/00action_file.rpy:63 241 | old "{#month_short}Apr" 242 | new "{#month_short}Apr" 243 | 244 | # renpy/common/00action_file.rpy:63 245 | old "{#month_short}May" 246 | new "{#month_short}May" 247 | 248 | # renpy/common/00action_file.rpy:63 249 | old "{#month_short}Jun" 250 | new "{#month_short}Jun" 251 | 252 | # renpy/common/00action_file.rpy:63 253 | old "{#month_short}Jul" 254 | new "{#month_short}Jul" 255 | 256 | # renpy/common/00action_file.rpy:63 257 | old "{#month_short}Aug" 258 | new "{#month_short}Aug" 259 | 260 | # renpy/common/00action_file.rpy:63 261 | old "{#month_short}Sep" 262 | new "{#month_short}Sep" 263 | 264 | # renpy/common/00action_file.rpy:63 265 | old "{#month_short}Oct" 266 | new "{#month_short}Oct" 267 | 268 | # renpy/common/00action_file.rpy:63 269 | old "{#month_short}Nov" 270 | new "{#month_short}Nov" 271 | 272 | # renpy/common/00action_file.rpy:63 273 | old "{#month_short}Dec" 274 | new "{#month_short}Dec" 275 | 276 | # renpy/common/00action_file.rpy:250 277 | old "%b %d, %H:%M" 278 | new "%b %d, %H:%M" 279 | 280 | # renpy/common/00action_file.rpy:364 281 | old "Save slot %s: [text]" 282 | new "Save slot %s: [text]" 283 | 284 | # renpy/common/00action_file.rpy:445 285 | old "Load slot %s: [text]" 286 | new "Load slot %s: [text]" 287 | 288 | # renpy/common/00action_file.rpy:498 289 | old "Delete slot [text]" 290 | new "Delete slot [text]" 291 | 292 | # renpy/common/00action_file.rpy:577 293 | old "File page auto" 294 | new "File page auto" 295 | 296 | # renpy/common/00action_file.rpy:579 297 | old "File page quick" 298 | new "File page quick" 299 | 300 | # renpy/common/00action_file.rpy:581 301 | old "File page [text]" 302 | new "File page [text]" 303 | 304 | # renpy/common/00action_file.rpy:639 305 | old "Page {}" 306 | new "Page {}" 307 | 308 | # renpy/common/00action_file.rpy:639 309 | old "Automatic saves" 310 | new "Automatic saves" 311 | 312 | # renpy/common/00action_file.rpy:639 313 | old "Quick saves" 314 | new "Quick saves" 315 | 316 | # renpy/common/00action_file.rpy:780 317 | old "Next file page." 318 | new "Next file page." 319 | 320 | # renpy/common/00action_file.rpy:852 321 | old "Previous file page." 322 | new "Previous file page." 323 | 324 | # renpy/common/00action_file.rpy:913 325 | old "Quick save complete." 326 | new "Quick save complete." 327 | 328 | # renpy/common/00action_file.rpy:931 329 | old "Quick save." 330 | new "Quick save." 331 | 332 | # renpy/common/00action_file.rpy:950 333 | old "Quick load." 334 | new "Quick load." 335 | 336 | # renpy/common/00action_other.rpy:381 337 | old "Language [text]" 338 | new "Language [text]" 339 | 340 | # renpy/common/00action_other.rpy:703 341 | old "Open [text] directory." 342 | new "Open [text] directory." 343 | 344 | # renpy/common/00director.rpy:708 345 | old "The interactive director is not enabled here." 346 | new "The interactive director is not enabled here." 347 | 348 | # renpy/common/00director.rpy:1481 349 | old "⬆" 350 | new "⬆" 351 | 352 | # renpy/common/00director.rpy:1487 353 | old "⬇" 354 | new "⬇" 355 | 356 | # renpy/common/00director.rpy:1551 357 | old "Done" 358 | new "Done" 359 | 360 | # renpy/common/00director.rpy:1561 361 | old "(statement)" 362 | new "(statement)" 363 | 364 | # renpy/common/00director.rpy:1562 365 | old "(tag)" 366 | new "(tag)" 367 | 368 | # renpy/common/00director.rpy:1563 369 | old "(attributes)" 370 | new "(attributes)" 371 | 372 | # renpy/common/00director.rpy:1564 373 | old "(transform)" 374 | new "(transform)" 375 | 376 | # renpy/common/00director.rpy:1589 377 | old "(transition)" 378 | new "(transition)" 379 | 380 | # renpy/common/00director.rpy:1601 381 | old "(channel)" 382 | new "(channel)" 383 | 384 | # renpy/common/00director.rpy:1602 385 | old "(filename)" 386 | new "(filename)" 387 | 388 | # renpy/common/00director.rpy:1631 389 | old "Change" 390 | new "Change" 391 | 392 | # renpy/common/00director.rpy:1633 393 | old "Add" 394 | new "Add" 395 | 396 | # renpy/common/00director.rpy:1636 397 | old "Cancel" 398 | new "Cancel" 399 | 400 | # renpy/common/00director.rpy:1639 401 | old "Remove" 402 | new "Remove" 403 | 404 | # renpy/common/00director.rpy:1674 405 | old "Statement:" 406 | new "Statement:" 407 | 408 | # renpy/common/00director.rpy:1695 409 | old "Tag:" 410 | new "Tag:" 411 | 412 | # renpy/common/00director.rpy:1711 413 | old "Attributes:" 414 | new "Attributes:" 415 | 416 | # renpy/common/00director.rpy:1729 417 | old "Transforms:" 418 | new "Transforms:" 419 | 420 | # renpy/common/00director.rpy:1748 421 | old "Behind:" 422 | new "Behind:" 423 | 424 | # renpy/common/00director.rpy:1767 425 | old "Transition:" 426 | new "Transition:" 427 | 428 | # renpy/common/00director.rpy:1785 429 | old "Channel:" 430 | new "Channel:" 431 | 432 | # renpy/common/00director.rpy:1803 433 | old "Audio Filename:" 434 | new "Audio Filename:" 435 | 436 | # renpy/common/00gui.rpy:445 437 | old "Are you sure?" 438 | new "Are you sure?" 439 | 440 | # renpy/common/00gui.rpy:446 441 | old "Are you sure you want to delete this save?" 442 | new "Are you sure you want to delete this save?" 443 | 444 | # renpy/common/00gui.rpy:447 445 | old "Are you sure you want to overwrite your save?" 446 | new "Are you sure you want to overwrite your save?" 447 | 448 | # renpy/common/00gui.rpy:448 449 | old "Loading will lose unsaved progress.\nAre you sure you want to do this?" 450 | new "Loading will lose unsaved progress.\nAre you sure you want to do this?" 451 | 452 | # renpy/common/00gui.rpy:449 453 | old "Are you sure you want to quit?" 454 | new "Are you sure you want to quit?" 455 | 456 | # renpy/common/00gui.rpy:450 457 | old "Are you sure you want to return to the main menu?\nThis will lose unsaved progress." 458 | new "Are you sure you want to return to the main menu?\nThis will lose unsaved progress." 459 | 460 | # renpy/common/00gui.rpy:451 461 | old "Are you sure you want to end the replay?" 462 | new "Are you sure you want to end the replay?" 463 | 464 | # renpy/common/00gui.rpy:452 465 | old "Are you sure you want to begin skipping?" 466 | new "Are you sure you want to begin skipping?" 467 | 468 | # renpy/common/00gui.rpy:453 469 | old "Are you sure you want to skip to the next choice?" 470 | new "Are you sure you want to skip to the next choice?" 471 | 472 | # renpy/common/00gui.rpy:454 473 | old "Are you sure you want to skip unseen dialogue to the next choice?" 474 | new "Are you sure you want to skip unseen dialogue to the next choice?" 475 | 476 | # renpy/common/00keymap.rpy:310 477 | old "Failed to save screenshot as %s." 478 | new "Failed to save screenshot as %s." 479 | 480 | # renpy/common/00keymap.rpy:322 481 | old "Saved screenshot as %s." 482 | new "Saved screenshot as %s." 483 | 484 | # renpy/common/00library.rpy:230 485 | old "Skip Mode" 486 | new "Skip Mode" 487 | 488 | # renpy/common/00library.rpy:316 489 | old "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}." 490 | new "This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}." 491 | 492 | # renpy/common/00preferences.rpy:259 493 | old "display" 494 | new "display" 495 | 496 | # renpy/common/00preferences.rpy:271 497 | old "transitions" 498 | new "transitions" 499 | 500 | # renpy/common/00preferences.rpy:280 501 | old "skip transitions" 502 | new "skip transitions" 503 | 504 | # renpy/common/00preferences.rpy:282 505 | old "video sprites" 506 | new "video sprites" 507 | 508 | # renpy/common/00preferences.rpy:291 509 | old "show empty window" 510 | new "show empty window" 511 | 512 | # renpy/common/00preferences.rpy:300 513 | old "text speed" 514 | new "text speed" 515 | 516 | # renpy/common/00preferences.rpy:308 517 | old "joystick" 518 | new "joystick" 519 | 520 | # renpy/common/00preferences.rpy:308 521 | old "joystick..." 522 | new "joystick..." 523 | 524 | # renpy/common/00preferences.rpy:315 525 | old "skip" 526 | new "skip" 527 | 528 | # renpy/common/00preferences.rpy:318 529 | old "skip unseen [text]" 530 | new "skip unseen [text]" 531 | 532 | # renpy/common/00preferences.rpy:323 533 | old "skip unseen text" 534 | new "skip unseen text" 535 | 536 | # renpy/common/00preferences.rpy:325 537 | old "begin skipping" 538 | new "begin skipping" 539 | 540 | # renpy/common/00preferences.rpy:329 541 | old "after choices" 542 | new "after choices" 543 | 544 | # renpy/common/00preferences.rpy:336 545 | old "skip after choices" 546 | new "skip after choices" 547 | 548 | # renpy/common/00preferences.rpy:338 549 | old "auto-forward time" 550 | new "auto-forward time" 551 | 552 | # renpy/common/00preferences.rpy:352 553 | old "auto-forward" 554 | new "auto-forward" 555 | 556 | # renpy/common/00preferences.rpy:359 557 | old "Auto forward" 558 | new "Auto forward" 559 | 560 | # renpy/common/00preferences.rpy:362 561 | old "auto-forward after click" 562 | new "auto-forward after click" 563 | 564 | # renpy/common/00preferences.rpy:371 565 | old "automatic move" 566 | new "automatic move" 567 | 568 | # renpy/common/00preferences.rpy:380 569 | old "wait for voice" 570 | new "wait for voice" 571 | 572 | # renpy/common/00preferences.rpy:389 573 | old "voice sustain" 574 | new "voice sustain" 575 | 576 | # renpy/common/00preferences.rpy:398 577 | old "self voicing" 578 | new "self voicing" 579 | 580 | # renpy/common/00preferences.rpy:407 581 | old "self voicing volume drop" 582 | new "self voicing volume drop" 583 | 584 | # renpy/common/00preferences.rpy:415 585 | old "clipboard voicing" 586 | new "clipboard voicing" 587 | 588 | # renpy/common/00preferences.rpy:424 589 | old "debug voicing" 590 | new "debug voicing" 591 | 592 | # renpy/common/00preferences.rpy:433 593 | old "emphasize audio" 594 | new "emphasize audio" 595 | 596 | # renpy/common/00preferences.rpy:442 597 | old "rollback side" 598 | new "rollback side" 599 | 600 | # renpy/common/00preferences.rpy:452 601 | old "gl powersave" 602 | new "gl powersave" 603 | 604 | # renpy/common/00preferences.rpy:458 605 | old "gl framerate" 606 | new "gl framerate" 607 | 608 | # renpy/common/00preferences.rpy:461 609 | old "gl tearing" 610 | new "gl tearing" 611 | 612 | # renpy/common/00preferences.rpy:464 613 | old "font transform" 614 | new "font transform" 615 | 616 | # renpy/common/00preferences.rpy:467 617 | old "font size" 618 | new "font size" 619 | 620 | # renpy/common/00preferences.rpy:475 621 | old "font line spacing" 622 | new "font line spacing" 623 | 624 | # renpy/common/00preferences.rpy:483 625 | old "system cursor" 626 | new "system cursor" 627 | 628 | # renpy/common/00preferences.rpy:492 629 | old "renderer menu" 630 | new "renderer menu" 631 | 632 | # renpy/common/00preferences.rpy:495 633 | old "accessibility menu" 634 | new "accessibility menu" 635 | 636 | # renpy/common/00preferences.rpy:498 637 | old "high contrast text" 638 | new "high contrast text" 639 | 640 | # renpy/common/00preferences.rpy:507 641 | old "audio when minimized" 642 | new "audio when minimized" 643 | 644 | # renpy/common/00preferences.rpy:527 645 | old "main volume" 646 | new "main volume" 647 | 648 | # renpy/common/00preferences.rpy:528 649 | old "music volume" 650 | new "music volume" 651 | 652 | # renpy/common/00preferences.rpy:529 653 | old "sound volume" 654 | new "sound volume" 655 | 656 | # renpy/common/00preferences.rpy:530 657 | old "voice volume" 658 | new "voice volume" 659 | 660 | # renpy/common/00preferences.rpy:531 661 | old "mute main" 662 | new "mute main" 663 | 664 | # renpy/common/00preferences.rpy:532 665 | old "mute music" 666 | new "mute music" 667 | 668 | # renpy/common/00preferences.rpy:533 669 | old "mute sound" 670 | new "mute sound" 671 | 672 | # renpy/common/00preferences.rpy:534 673 | old "mute voice" 674 | new "mute voice" 675 | 676 | # renpy/common/00preferences.rpy:535 677 | old "mute all" 678 | new "mute all" 679 | 680 | # renpy/common/00preferences.rpy:616 681 | old "Clipboard voicing enabled. Press 'shift+C' to disable." 682 | new "Clipboard voicing enabled. Press 'shift+C' to disable." 683 | 684 | # renpy/common/00preferences.rpy:618 685 | old "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable." 686 | new "Self-voicing would say \"[renpy.display.tts.last]\". Press 'alt+shift+V' to disable." 687 | 688 | # renpy/common/00preferences.rpy:620 689 | old "Self-voicing enabled. Press 'v' to disable." 690 | new "Self-voicing enabled. Press 'v' to disable." 691 | 692 | # renpy/common/00iap.rpy:219 693 | old "Contacting App Store\nPlease Wait..." 694 | new "Contacting App Store\nPlease Wait..." 695 | 696 | # renpy/common/00updater.rpy:419 697 | old "The Ren'Py Updater is not supported on mobile devices." 698 | new "The Ren'Py Updater is not supported on mobile devices." 699 | 700 | # renpy/common/00updater.rpy:548 701 | old "An error is being simulated." 702 | new "An error is being simulated." 703 | 704 | # renpy/common/00updater.rpy:738 705 | old "Either this project does not support updating, or the update status file was deleted." 706 | new "Either this project does not support updating, or the update status file was deleted." 707 | 708 | # renpy/common/00updater.rpy:752 709 | old "This account does not have permission to perform an update." 710 | new "This account does not have permission to perform an update." 711 | 712 | # renpy/common/00updater.rpy:755 713 | old "This account does not have permission to write the update log." 714 | new "This account does not have permission to write the update log." 715 | 716 | # renpy/common/00updater.rpy:783 717 | old "Could not verify update signature." 718 | new "Could not verify update signature." 719 | 720 | # renpy/common/00updater.rpy:1084 721 | old "The update file was not downloaded." 722 | new "The update file was not downloaded." 723 | 724 | # renpy/common/00updater.rpy:1102 725 | old "The update file does not have the correct digest - it may have been corrupted." 726 | new "The update file does not have the correct digest - it may have been corrupted." 727 | 728 | # renpy/common/00updater.rpy:1252 729 | old "While unpacking {}, unknown type {}." 730 | new "While unpacking {}, unknown type {}." 731 | 732 | # renpy/common/00updater.rpy:1624 733 | old "Updater" 734 | new "Updater" 735 | 736 | # renpy/common/00updater.rpy:1631 737 | old "An error has occured:" 738 | new "An error has occured:" 739 | 740 | # renpy/common/00updater.rpy:1633 741 | old "Checking for updates." 742 | new "Checking for updates." 743 | 744 | # renpy/common/00updater.rpy:1635 745 | old "This program is up to date." 746 | new "This program is up to date." 747 | 748 | # renpy/common/00updater.rpy:1637 749 | old "[u.version] is available. Do you want to install it?" 750 | new "[u.version] is available. Do you want to install it?" 751 | 752 | # renpy/common/00updater.rpy:1639 753 | old "Preparing to download the updates." 754 | new "Preparing to download the updates." 755 | 756 | # renpy/common/00updater.rpy:1641 757 | old "Downloading the updates." 758 | new "Downloading the updates." 759 | 760 | # renpy/common/00updater.rpy:1643 761 | old "Unpacking the updates." 762 | new "Unpacking the updates." 763 | 764 | # renpy/common/00updater.rpy:1645 765 | old "Finishing up." 766 | new "Finishing up." 767 | 768 | # renpy/common/00updater.rpy:1647 769 | old "The updates have been installed. The program will restart." 770 | new "The updates have been installed. The program will restart." 771 | 772 | # renpy/common/00updater.rpy:1649 773 | old "The updates have been installed." 774 | new "The updates have been installed." 775 | 776 | # renpy/common/00updater.rpy:1651 777 | old "The updates were cancelled." 778 | new "The updates were cancelled." 779 | 780 | # renpy/common/00updater.rpy:1666 781 | old "Proceed" 782 | new "Proceed" 783 | 784 | # renpy/common/00compat.rpy:371 785 | old "Fullscreen" 786 | new "Fullscreen" 787 | 788 | # renpy/common/00gallery.rpy:627 789 | old "Image [index] of [count] locked." 790 | new "Image [index] of [count] locked." 791 | 792 | # renpy/common/00gallery.rpy:647 793 | old "prev" 794 | new "prev" 795 | 796 | # renpy/common/00gallery.rpy:648 797 | old "next" 798 | new "next" 799 | 800 | # renpy/common/00gallery.rpy:649 801 | old "slideshow" 802 | new "slideshow" 803 | 804 | # renpy/common/00gallery.rpy:650 805 | old "return" 806 | new "return" 807 | 808 | # renpy/common/00gltest.rpy:89 809 | old "Renderer" 810 | new "Renderer" 811 | 812 | # renpy/common/00gltest.rpy:93 813 | old "Automatically Choose" 814 | new "Automatically Choose" 815 | 816 | # renpy/common/00gltest.rpy:100 817 | old "Force GL Renderer" 818 | new "Force GL Renderer" 819 | 820 | # renpy/common/00gltest.rpy:105 821 | old "Force ANGLE Renderer" 822 | new "Force ANGLE Renderer" 823 | 824 | # renpy/common/00gltest.rpy:110 825 | old "Force GLES Renderer" 826 | new "Force GLES Renderer" 827 | 828 | # renpy/common/00gltest.rpy:116 829 | old "Force GL2 Renderer" 830 | new "Force GL2 Renderer" 831 | 832 | # renpy/common/00gltest.rpy:121 833 | old "Force ANGLE2 Renderer" 834 | new "Force ANGLE2 Renderer" 835 | 836 | # renpy/common/00gltest.rpy:126 837 | old "Force GLES2 Renderer" 838 | new "Force GLES2 Renderer" 839 | 840 | # renpy/common/00gltest.rpy:132 841 | old "Gamepad" 842 | new "Gamepad" 843 | 844 | # renpy/common/00gltest.rpy:136 845 | old "Enable (No Blocklist)" 846 | new "Enable (No Blocklist)" 847 | 848 | # renpy/common/00gltest.rpy:150 849 | old "Calibrate" 850 | new "Calibrate" 851 | 852 | # renpy/common/00gltest.rpy:159 853 | old "Powersave" 854 | new "Powersave" 855 | 856 | # renpy/common/00gltest.rpy:173 857 | old "Framerate" 858 | new "Framerate" 859 | 860 | # renpy/common/00gltest.rpy:177 861 | old "Screen" 862 | new "Screen" 863 | 864 | # renpy/common/00gltest.rpy:181 865 | old "60" 866 | new "60" 867 | 868 | # renpy/common/00gltest.rpy:185 869 | old "30" 870 | new "30" 871 | 872 | # renpy/common/00gltest.rpy:191 873 | old "Tearing" 874 | new "Tearing" 875 | 876 | # renpy/common/00gltest.rpy:207 877 | old "Changes will take effect the next time this program is run." 878 | new "Changes will take effect the next time this program is run." 879 | 880 | # renpy/common/00gltest.rpy:214 881 | old "Quit" 882 | new "Quit" 883 | 884 | # renpy/common/00gltest.rpy:242 885 | old "Performance Warning" 886 | new "Performance Warning" 887 | 888 | # renpy/common/00gltest.rpy:247 889 | old "This computer is using software rendering." 890 | new "This computer is using software rendering." 891 | 892 | # renpy/common/00gltest.rpy:249 893 | old "This game requires use of GL2 that can't be initialised." 894 | new "This game requires use of GL2 that can't be initialised." 895 | 896 | # renpy/common/00gltest.rpy:251 897 | old "This computer has a problem displaying graphics: [problem]." 898 | new "This computer has a problem displaying graphics: [problem]." 899 | 900 | # renpy/common/00gltest.rpy:255 901 | old "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display." 902 | new "Its graphics drivers may be out of date or not operating correctly. This can lead to slow or incorrect graphics display." 903 | 904 | # renpy/common/00gltest.rpy:259 905 | old "The {a=edit:1:log.txt}log.txt{/a} file may contain information to help you determine what is wrong with your computer." 906 | new "The {a=edit:1:log.txt}log.txt{/a} file may contain information to help you determine what is wrong with your computer." 907 | 908 | # renpy/common/00gltest.rpy:264 909 | old "More details on how to fix this can be found in the {a=[url]}documentation{/a}." 910 | new "More details on how to fix this can be found in the {a=[url]}documentation{/a}." 911 | 912 | # renpy/common/00gltest.rpy:269 913 | old "Continue, Show this warning again" 914 | new "Continue, Show this warning again" 915 | 916 | # renpy/common/00gltest.rpy:273 917 | old "Continue, Don't show warning again" 918 | new "Continue, Don't show warning again" 919 | 920 | # renpy/common/00gltest.rpy:281 921 | old "Change render options" 922 | new "Change render options" 923 | 924 | # renpy/common/00gamepad.rpy:32 925 | old "Select Gamepad to Calibrate" 926 | new "Select Gamepad to Calibrate" 927 | 928 | # renpy/common/00gamepad.rpy:35 929 | old "No Gamepads Available" 930 | new "No Gamepads Available" 931 | 932 | # renpy/common/00gamepad.rpy:54 933 | old "Calibrating [name] ([i]/[total])" 934 | new "Calibrating [name] ([i]/[total])" 935 | 936 | # renpy/common/00gamepad.rpy:58 937 | old "Press or move the '[control!s]' [kind]." 938 | new "Press or move the '[control!s]' [kind]." 939 | 940 | # renpy/common/00gamepad.rpy:68 941 | old "Skip (A)" 942 | new "Skip (A)" 943 | 944 | # renpy/common/00gamepad.rpy:71 945 | old "Back (B)" 946 | new "Back (B)" 947 | 948 | # renpy/common/_errorhandling.rpym:555 949 | old "Open" 950 | new "Open" 951 | 952 | # renpy/common/_errorhandling.rpym:557 953 | old "Opens the traceback.txt file in a text editor." 954 | new "Opens the traceback.txt file in a text editor." 955 | 956 | # renpy/common/_errorhandling.rpym:559 957 | old "Copy BBCode" 958 | new "Copy BBCode" 959 | 960 | # renpy/common/_errorhandling.rpym:561 961 | old "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/." 962 | new "Copies the traceback.txt file to the clipboard as BBcode for forums like https://lemmasoft.renai.us/." 963 | 964 | # renpy/common/_errorhandling.rpym:563 965 | old "Copy Markdown" 966 | new "Copy Markdown" 967 | 968 | # renpy/common/_errorhandling.rpym:565 969 | old "Copies the traceback.txt file to the clipboard as Markdown for Discord." 970 | new "Copies the traceback.txt file to the clipboard as Markdown for Discord." 971 | 972 | # renpy/common/_errorhandling.rpym:594 973 | old "An exception has occurred." 974 | new "An exception has occurred." 975 | 976 | # renpy/common/_errorhandling.rpym:617 977 | old "Rollback" 978 | new "Rollback" 979 | 980 | # renpy/common/_errorhandling.rpym:619 981 | old "Attempts a roll back to a prior time, allowing you to save or choose a different choice." 982 | new "Attempts a roll back to a prior time, allowing you to save or choose a different choice." 983 | 984 | # renpy/common/_errorhandling.rpym:622 985 | old "Ignore" 986 | new "Ignore" 987 | 988 | # renpy/common/_errorhandling.rpym:626 989 | old "Ignores the exception, allowing you to continue." 990 | new "Ignores the exception, allowing you to continue." 991 | 992 | # renpy/common/_errorhandling.rpym:628 993 | old "Ignores the exception, allowing you to continue. This often leads to additional errors." 994 | new "Ignores the exception, allowing you to continue. This often leads to additional errors." 995 | 996 | # renpy/common/_errorhandling.rpym:632 997 | old "Reload" 998 | new "Reload" 999 | 1000 | # renpy/common/_errorhandling.rpym:634 1001 | old "Reloads the game from disk, saving and restoring game state if possible." 1002 | new "Reloads the game from disk, saving and restoring game state if possible." 1003 | 1004 | # renpy/common/_errorhandling.rpym:637 1005 | old "Console" 1006 | new "Console" 1007 | 1008 | # renpy/common/_errorhandling.rpym:639 1009 | old "Opens a console to allow debugging the problem." 1010 | new "Opens a console to allow debugging the problem." 1011 | 1012 | # renpy/common/_errorhandling.rpym:652 1013 | old "Quits the game." 1014 | new "Quits the game." 1015 | 1016 | # renpy/common/_errorhandling.rpym:673 1017 | old "Parsing the script failed." 1018 | new "Parsing the script failed." 1019 | 1020 | # renpy/common/_developer/developer.rpym:38 1021 | old "Developer Menu" 1022 | new "Developer Menu" 1023 | 1024 | # renpy/common/_developer/developer.rpym:43 1025 | old "Interactive Director (D)" 1026 | new "Interactive Director (D)" 1027 | 1028 | # renpy/common/_developer/developer.rpym:45 1029 | old "Reload Game (Shift+R)" 1030 | new "Reload Game (Shift+R)" 1031 | 1032 | # renpy/common/_developer/developer.rpym:47 1033 | old "Console (Shift+O)" 1034 | new "Console (Shift+O)" 1035 | 1036 | # renpy/common/_developer/developer.rpym:49 1037 | old "Variable Viewer" 1038 | new "Variable Viewer" 1039 | 1040 | # renpy/common/_developer/developer.rpym:51 1041 | old "Image Location Picker" 1042 | new "Image Location Picker" 1043 | 1044 | # renpy/common/_developer/developer.rpym:53 1045 | old "Filename List" 1046 | new "Filename List" 1047 | 1048 | # renpy/common/_developer/developer.rpym:57 1049 | old "Show Image Load Log (F4)" 1050 | new "Show Image Load Log (F4)" 1051 | 1052 | # renpy/common/_developer/developer.rpym:60 1053 | old "Hide Image Load Log (F4)" 1054 | new "Hide Image Load Log (F4)" 1055 | 1056 | # renpy/common/_developer/developer.rpym:63 1057 | old "Image Attributes" 1058 | new "Image Attributes" 1059 | 1060 | # renpy/common/_developer/developer.rpym:90 1061 | old "[name] [attributes] (hidden)" 1062 | new "[name] [attributes] (hidden)" 1063 | 1064 | # renpy/common/_developer/developer.rpym:94 1065 | old "[name] [attributes]" 1066 | new "[name] [attributes]" 1067 | 1068 | # renpy/common/_developer/developer.rpym:143 1069 | old "Nothing to inspect." 1070 | new "Nothing to inspect." 1071 | 1072 | # renpy/common/_developer/developer.rpym:154 1073 | old "Hide deleted" 1074 | new "Hide deleted" 1075 | 1076 | # renpy/common/_developer/developer.rpym:154 1077 | old "Show deleted" 1078 | new "Show deleted" 1079 | 1080 | # renpy/common/_developer/developer.rpym:278 1081 | old "Return to the developer menu" 1082 | new "Return to the developer menu" 1083 | 1084 | # renpy/common/_developer/developer.rpym:443 1085 | old "Rectangle: %r" 1086 | new "Rectangle: %r" 1087 | 1088 | # renpy/common/_developer/developer.rpym:448 1089 | old "Mouse position: %r" 1090 | new "Mouse position: %r" 1091 | 1092 | # renpy/common/_developer/developer.rpym:453 1093 | old "Right-click or escape to quit." 1094 | new "Right-click or escape to quit." 1095 | 1096 | # renpy/common/_developer/developer.rpym:485 1097 | old "Rectangle copied to clipboard." 1098 | new "Rectangle copied to clipboard." 1099 | 1100 | # renpy/common/_developer/developer.rpym:488 1101 | old "Position copied to clipboard." 1102 | new "Position copied to clipboard." 1103 | 1104 | # renpy/common/_developer/developer.rpym:506 1105 | old "Type to filter: " 1106 | new "Type to filter: " 1107 | 1108 | # renpy/common/_developer/developer.rpym:633 1109 | old "Textures: [tex_count] ([tex_size_mb:.1f] MB)" 1110 | new "Textures: [tex_count] ([tex_size_mb:.1f] MB)" 1111 | 1112 | # renpy/common/_developer/developer.rpym:637 1113 | old "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)" 1114 | new "Image cache: [cache_pct:.1f]% ([cache_size_mb:.1f] MB)" 1115 | 1116 | # renpy/common/_developer/developer.rpym:647 1117 | old "✔ " 1118 | new "✔ " 1119 | 1120 | # renpy/common/_developer/developer.rpym:650 1121 | old "✘ " 1122 | new "✘ " 1123 | 1124 | # renpy/common/_developer/developer.rpym:655 1125 | old "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}" 1126 | new "\n{color=#cfc}✔ predicted image (good){/color}\n{color=#fcc}✘ unpredicted image (bad){/color}\n{color=#fff}Drag to move.{/color}" 1127 | 1128 | # renpy/common/_developer/inspector.rpym:38 1129 | old "Displayable Inspector" 1130 | new "Displayable Inspector" 1131 | 1132 | # renpy/common/_developer/inspector.rpym:61 1133 | old "Size" 1134 | new "Size" 1135 | 1136 | # renpy/common/_developer/inspector.rpym:65 1137 | old "Style" 1138 | new "Style" 1139 | 1140 | # renpy/common/_developer/inspector.rpym:71 1141 | old "Location" 1142 | new "Location" 1143 | 1144 | # renpy/common/_developer/inspector.rpym:122 1145 | old "Inspecting Styles of [displayable_name!q]" 1146 | new "Inspecting Styles of [displayable_name!q]" 1147 | 1148 | # renpy/common/_developer/inspector.rpym:139 1149 | old "displayable:" 1150 | new "displayable:" 1151 | 1152 | # renpy/common/_developer/inspector.rpym:145 1153 | old " (no properties affect the displayable)" 1154 | new " (no properties affect the displayable)" 1155 | 1156 | # renpy/common/_developer/inspector.rpym:147 1157 | old " (default properties omitted)" 1158 | new " (default properties omitted)" 1159 | 1160 | # renpy/common/_developer/inspector.rpym:185 1161 | old "" 1162 | new "" 1163 | 1164 | # renpy/common/00console.rpy:524 1165 | old "Press to exit console. Type help for help.\n" 1166 | new "Press to exit console. Type help for help.\n" 1167 | 1168 | # renpy/common/00console.rpy:528 1169 | old "Ren'Py script enabled." 1170 | new "Ren'Py script enabled." 1171 | 1172 | # renpy/common/00console.rpy:530 1173 | old "Ren'Py script disabled." 1174 | new "Ren'Py script disabled." 1175 | 1176 | # renpy/common/00console.rpy:779 1177 | old "help: show this help" 1178 | new "help: show this help" 1179 | 1180 | # renpy/common/00console.rpy:784 1181 | old "commands:\n" 1182 | new "commands:\n" 1183 | 1184 | # renpy/common/00console.rpy:794 1185 | old " : run the statement\n" 1186 | new " : run the statement\n" 1187 | 1188 | # renpy/common/00console.rpy:796 1189 | old " : run the expression or statement" 1190 | new " : run the expression or statement" 1191 | 1192 | # renpy/common/00console.rpy:804 1193 | old "clear: clear the console history" 1194 | new "clear: clear the console history" 1195 | 1196 | # renpy/common/00console.rpy:808 1197 | old "exit: exit the console" 1198 | new "exit: exit the console" 1199 | 1200 | # renpy/common/00console.rpy:816 1201 | old "stack: print the return stack" 1202 | new "stack: print the return stack" 1203 | 1204 | # renpy/common/00console.rpy:838 1205 | old "load : loads the game from slot" 1206 | new "load : loads the game from slot" 1207 | 1208 | # renpy/common/00console.rpy:851 1209 | old "save : saves the game in slot" 1210 | new "save : saves the game in slot" 1211 | 1212 | # renpy/common/00console.rpy:862 1213 | old "reload: reloads the game, refreshing the scripts" 1214 | new "reload: reloads the game, refreshing the scripts" 1215 | 1216 | # renpy/common/00console.rpy:870 1217 | old "watch : watch a python expression\n watch short: makes the representation of traced expressions short (default)\n watch long: makes the representation of traced expressions as is" 1218 | new "watch : watch a python expression\n watch short: makes the representation of traced expressions short (default)\n watch long: makes the representation of traced expressions as is" 1219 | 1220 | # renpy/common/00console.rpy:907 1221 | old "unwatch : stop watching an expression" 1222 | new "unwatch : stop watching an expression" 1223 | 1224 | # renpy/common/00console.rpy:953 1225 | old "unwatchall: stop watching all expressions" 1226 | new "unwatchall: stop watching all expressions" 1227 | 1228 | # renpy/common/00console.rpy:974 1229 | old "jump