Compare commits
213 Commits
flower-lin
...
Patch11-Mo
| Author | SHA1 | Date | |
|---|---|---|---|
| ff359efd1b | |||
| 3f2fc63950 | |||
| ccadc0c179 | |||
| 420ed93ee2 | |||
| 83d3c129fa | |||
| b86f91e423 | |||
| b4a7223e9a | |||
| 3776b2bc9d | |||
| 46c47303d7 | |||
| 6377fffba0 | |||
| b16bd97d33 | |||
| a82e51e477 | |||
| e7eb667820 | |||
| 520a728ebd | |||
| 8686143ddd | |||
| a0c0a22a41 | |||
| 6cea8fa94b | |||
| 1fad3b0b62 | |||
| fc537fecc7 | |||
| f3bb2caa7f | |||
| 3bf7e9e433 | |||
| d581c7884c | |||
| 3d51bae4a6 | |||
| 5d44682f49 | |||
| 033175500c | |||
| 2c2899e734 | |||
| 301035bad1 | |||
| e06db742e2 | |||
| 610737fddf | |||
| e41d42d4e7 | |||
| 7873a882a8 | |||
| c045fcff26 | |||
| 81c646e81b | |||
| 7612935547 | |||
| 201cd61f63 | |||
| 934a0dc72a | |||
| 9d1064c75e | |||
| ca7406d0d9 | |||
| 79ac93e6fd | |||
| 019d5f4f44 | |||
| 64b566d66b | |||
| 40ec930ab3 | |||
| b8d8a00f44 | |||
| fd21e45713 | |||
| 87e9546d15 | |||
| a266c9508c | |||
| b1719c4b21 | |||
| db337e64ae | |||
| 0e35c5a415 | |||
| 302c2f6b10 | |||
| c14c7b43be | |||
| 5eb39a7c3c | |||
| aa0eff4377 | |||
| e54c950ef6 | |||
| 8dfa492442 | |||
| 6a407f4630 | |||
| 2269086430 | |||
| 902e435e6c | |||
| 62cc1206ce | |||
| 42c05f0cbf | |||
| 7904646359 | |||
| e41e277f7b | |||
| fa2bf7e4a9 | |||
| ffccaff704 | |||
| 84240297e5 | |||
| a8fb7bae19 | |||
| cd21d816d3 | |||
| 557ce88ff4 | |||
| 7309c68119 | |||
| 6c283a8dcd | |||
| f0892157ab | |||
| dabac1f5f0 | |||
| 7d2203dc04 | |||
| 963851af8e | |||
| 85d71da086 | |||
| 4db1a76088 | |||
| 91abc6f87f | |||
| 3b53dc1f6f | |||
| e82064ef6b | |||
| c8b5c68649 | |||
| 6b93689456 | |||
| f71b284e90 | |||
| 267634783d | |||
| 73328cb2e1 | |||
| 10e8010f9b | |||
| 5126f0e3ae | |||
| c3e365d01c | |||
| 3059d469f2 | |||
| 2a157e1362 | |||
| 1373bed36b | |||
| 99997a4204 | |||
| cebabce278 | |||
| 00166f6d3d | |||
| d9cb051d91 | |||
| 0ceae541a5 | |||
| ee3f8b7152 | |||
| 92ee2a56f1 | |||
| 4d3801dd3d | |||
| aee5d8b610 | |||
| 4ce0d1df31 | |||
| b1cc24fb2e | |||
| e0027f3c5d | |||
| a787d1ceaf | |||
| 719f08ba24 | |||
| a31fa50d8a | |||
| 803e878c3f | |||
| f38c53776c | |||
| 7865a0164c | |||
| 908d8f62f7 | |||
| 76e61ee78e | |||
| dcff088d11 | |||
| 9c3ddccbb5 | |||
| 79dff8fcc9 | |||
| ee8f5b04b7 | |||
| 98cd25dc47 | |||
| 0665ce7f03 | |||
| cacc68462a | |||
| 41e73b07cf | |||
| baad1afda7 | |||
| 331b628adf | |||
| 6d7f357dbb | |||
| 60f8efc6df | |||
| fc3472692b | |||
| e060956d82 | |||
| 7023a06020 | |||
| 62ffab3bed | |||
| 32894af0af | |||
| 9078bb8aa1 | |||
| ac1c51543e | |||
| 8dd717abeb | |||
| 05b0525a3d | |||
| 01135c64b9 | |||
| 2c325c0d3d | |||
| a175a0bb12 | |||
|
|
50b64f170e | ||
| fd7ac143af | |||
|
|
9ef954bd9f | ||
| 4f4956f201 | |||
|
|
002e2b6a13 | ||
| 949dfa4044 | |||
|
|
c06e73743a | ||
| 1f747f5101 | |||
| ae7454506e | |||
| c020847800 | |||
| a04c4e6912 | |||
| b048e9c32a | |||
| 84f6d467dd | |||
| dd6da86a8c | |||
| a75d26de8d | |||
| 351e433504 | |||
| 80bdae1d08 | |||
| df967527e4 | |||
| fef3b7beec | |||
| cee1984f4d | |||
| 0fbff1b81b | |||
| 84ccfc1b13 | |||
| b65ed32b14 | |||
| c5ea9c9cb5 | |||
| 993824e152 | |||
| a65a5075fe | |||
| 4d449593f5 | |||
| 233a801aa5 | |||
| 59c229db73 | |||
| afee5de501 | |||
| 2d793f86af | |||
| fb64284d84 | |||
| 72ea3dd640 | |||
| 966fca9fc5 | |||
| b34ad59fb4 | |||
| a933c090e4 | |||
| 17cdc25bb1 | |||
| 3e9ea5ddbc | |||
| b7da3f957e | |||
| ce05fd5cdb | |||
| 806151f430 | |||
| 859610e3bd | |||
| 8b783f6838 | |||
| a046896907 | |||
| 098c7dd021 | |||
| 7084451986 | |||
| ba0024f251 | |||
| 01e9ababa2 | |||
| 66d4b308af | |||
| 8b20ffaecd | |||
| 97cc4252d5 | |||
| 1864a917dc | |||
| f8aa9d0459 | |||
| fc903d08fb | |||
| e4d7b18bf2 | |||
| 14b7d1a6ea | |||
| 4a2a62478d | |||
| 88279e9601 | |||
| afb67298ec | |||
| 0a4ab9609a | |||
| 6a32d84d24 | |||
| 366c62d484 | |||
| c68090bf58 | |||
| 1345686055 | |||
| dbf1aa34ef | |||
| c50eb0ce32 | |||
| 4b662b5488 | |||
| 79569c7441 | |||
| 297ca81c7c | |||
| 670a3624c5 | |||
| 50afe3a646 | |||
| 79a73ccc64 | |||
| 9f2bd4ed5f | |||
| 0c648922aa | |||
| 378cb12bf4 | |||
| c890f2094c | |||
| dbffdf5c36 | |||
| c274f8726a | |||
| 9021619bf0 |
@@ -1 +0,0 @@
|
||||
{"expansion": false, "heap_size": "3", "icon_name": "Snoot Game", "include_pil": false, "include_sqlite": false, "layout": null, "name": "Snoot Game", "numeric_version": 1, "orientation": "sensorLandscape", "package": "cavemanon.snootgame", "permissions": ["VIBRATE", "INTERNET"], "source": false, "store": "none", "update_always": true, "update_icons": true, "update_keystores": true, "version": "INTERNAL-BUILD"}
|
||||
11
.gitignore
vendored
@@ -51,4 +51,13 @@ env
|
||||
*.rpymc
|
||||
|
||||
#backups
|
||||
*.bak
|
||||
*.bak
|
||||
|
||||
#android
|
||||
.android.json
|
||||
|
||||
#linux
|
||||
*.sh
|
||||
|
||||
# Exclude mod folders, but not files in the root mod directory
|
||||
/game/mods/*/
|
||||
@@ -1,3 +1,9 @@
|
||||
clone:
|
||||
git:
|
||||
image: woodpeckerci/plugin-git
|
||||
settings:
|
||||
depth: 1
|
||||
|
||||
steps:
|
||||
changelog:
|
||||
image: debian
|
||||
@@ -11,7 +17,7 @@ steps:
|
||||
image: debian
|
||||
commands:
|
||||
- sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" game/options.rpy #Change the internal build name to the tagged version
|
||||
- sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" .android.json
|
||||
- sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" android.json
|
||||
when:
|
||||
- event: tag
|
||||
|
||||
@@ -19,20 +25,21 @@ steps:
|
||||
image: debian
|
||||
commands:
|
||||
- sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_SHA}/g" game/options.rpy #if no tag, make it the commit num
|
||||
- sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_TAG}/g" .android.json
|
||||
|
||||
- sed -i -e "s/INTERNAL-BUILD/${CI_COMMIT_SHA}/g" android.json
|
||||
when:
|
||||
- event: cron
|
||||
|
||||
build:
|
||||
image: openjdk:8
|
||||
image: openjdk:21-jdk-bookworm
|
||||
commands:
|
||||
- apt update
|
||||
- apt install libgl1 -y
|
||||
- apt install libgl1 patch -y
|
||||
- sed -i -e "s/VERSION/${RenpyVersion}/g" game/options.rpy #Change the renpy version to the woodpecker reuqested one.
|
||||
#Get Renkit
|
||||
- wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-linux-amd64.tar.gz" | tar xz --directory=/tmp/
|
||||
- /tmp/renconstruct build -i "." -c "renconstruct.toml" -o dist/
|
||||
- wget -qO- "https://github.com/kobaltcore/renkit/releases/download/v${RenkitVersion}/renkit-x86_64-unknown-linux-gnu.tar.xz" | tar -Jax --directory=/tmp/
|
||||
- /tmp/renkit-x86_64-unknown-linux-gnu/renconstruct build "." dist/
|
||||
- mkdir "dist/android"
|
||||
- mv dist/*.apk "dist/android"
|
||||
- cd /tmp/
|
||||
|
||||
archival-sha:
|
||||
@@ -76,6 +83,6 @@ steps:
|
||||
|
||||
matrix:
|
||||
RenpyVersion:
|
||||
- "8.0.3"
|
||||
- "8.3.2"
|
||||
RenkitVersion:
|
||||
- "3.3.1"
|
||||
- "4.4.0"
|
||||
|
||||
24
android.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"expansion": false,
|
||||
"google_play_key": null,
|
||||
"google_play_salt": null,
|
||||
"heap_size": "3",
|
||||
"icon_name": "Snoot Game",
|
||||
"include_pil": false,
|
||||
"include_sqlite": false,
|
||||
"layout": null,
|
||||
"name": "Snoot Game",
|
||||
"numeric_version": 1,
|
||||
"orientation": "sensorLandscape",
|
||||
"package": "cavemanon.snootgame",
|
||||
"permissions": [
|
||||
"VIBRATE",
|
||||
"INTERNET"
|
||||
],
|
||||
"source": false,
|
||||
"store": "none",
|
||||
"update_always": true,
|
||||
"update_icons": true,
|
||||
"update_keystores": true,
|
||||
"version": "INTERNAL-BUILD"
|
||||
}
|
||||
BIN
android.keystore
Normal file
BIN
bundle.keystore
Normal file
@@ -11,7 +11,8 @@ init offset = -2
|
||||
init python:
|
||||
gui.init(1920, 1080)
|
||||
|
||||
|
||||
## Enable checks for invalid or unstable properties in screens or transforms
|
||||
#define config.check_conflicting_properties = True
|
||||
|
||||
################################################################################
|
||||
## GUI Configuration Variables
|
||||
@@ -104,7 +105,6 @@ define gui.main_menu_text_size = 60
|
||||
## The images used for the main and game menus.
|
||||
define gui.main_menu_background = "gui/main_menu.png"
|
||||
define gui.game_menu_background = "gui/game_menu.png"
|
||||
define gui.extras_submenu_background = "gui/overlay/extras_submenu.png"
|
||||
define gui.extras_submenu_panel = "gui/overlay/extras_submenu_panel.png"
|
||||
|
||||
## Dialogue ####################################################################
|
||||
@@ -362,6 +362,8 @@ define config.history_length = 250
|
||||
## the cost of performance.
|
||||
define gui.history_height = 210
|
||||
|
||||
define gui.history_spacing = 0
|
||||
|
||||
## The position, width, and alignment of the label giving the name of the
|
||||
## speaking character.
|
||||
define gui.history_name_xpos = 233
|
||||
@@ -419,6 +421,7 @@ define gui.nvl_thought_xalign = 0.0
|
||||
define gui.nvl_button_xpos = 675
|
||||
define gui.nvl_button_xalign = 0.0
|
||||
|
||||
|
||||
## Localization ################################################################
|
||||
|
||||
## This controls where a line break is permitted. The default is suitable
|
||||
|
||||
BIN
game/gui/bubble.png
Normal file
|
After Width: | Height: | Size: 6.7 KiB |
BIN
game/gui/button/menubuttons/check.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
game/gui/button/menubuttons/checkbox.png
Normal file
|
After Width: | Height: | Size: 3.8 KiB |
BIN
game/gui/button/menubuttons/checkbox_epilogue.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
BIN
game/gui/button/menubuttons/cross.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
BIN
game/gui/button/menubuttons/down.png
Normal file
|
After Width: | Height: | Size: 551 B |
BIN
game/gui/button/menubuttons/template_full_idle.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
game/gui/button/menubuttons/template_idle_epilogue.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
game/gui/button/menubuttons/up.png
Normal file
|
After Width: | Height: | Size: 541 B |
|
Before Width: | Height: | Size: 2.7 KiB |
BIN
game/gui/flag/Italy.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
game/gui/game_menu_epilogue.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 58 KiB |
BIN
game/gui/mod_frame.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
|
Before Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 86 KiB |
BIN
game/gui/overlay/extras_submenu_panel_epilogue.png
Normal file
|
After Width: | Height: | Size: 150 KiB |
|
Before Width: | Height: | Size: 193 KiB |
|
Before Width: | Height: | Size: 2.2 KiB |
BIN
game/gui/thoughtbubble.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
0
game/mods/-DISABLEALLMODS.txt
Normal file
0
game/mods/-NOLOADORDER.txt
Normal file
0
game/mods/-NOMODS.txt
Normal file
@@ -1,55 +1,120 @@
|
||||
To normal users installing multiple mods: It's recommended to only have one mod folder installed in the mods directory in case two mods have duplicate `green_fang_story` label, otherwise the game will error out if mods conflict each other, this includes not only labels but images & sound too.
|
||||
--- MOD LOADER USAGE ---
|
||||
|
||||
The game loads an alternate storyline.rpy, this allows you to control the flow of the game's storytelling
|
||||
Examples include:
|
||||
- You want to inject more stuff inbetween chapters, maybe you hate time skip writing
|
||||
- You want to have more of an after story kind of ordeal, for example expanding Ending 2
|
||||
- You want to replace the entire story route
|
||||
You can still call the vanilla game's chapters like the intro (call chapter_1) for example but you might want to either copy the vanilla scripts and mix in your edits to have full control
|
||||
If there's problems with installed mods - like if an enabled mod makes the game crash on startup - there's 3 file flags you can apply to work around it, checked only in the root of the mods folder:
|
||||
- Any file starting with "DISABLEALLMODS". This will force disable all currently installed mods, but will still load all their metadata. Removing this flag will return the mod states to how it was previously.
|
||||
- Any file starting with "NOLOADORDER". This will erase the load order/states and always load mods in folder alphabetical order, with mod states depending on the "Enable New Mods" option in the preferences menu.
|
||||
- Any file starting with "NOMODS". This turns off mod loading entirely by making the game not find any metadata files to load.
|
||||
These file flags already exist in the mods folder, but renamed to not trigger in-game. Enable them by renaming the file to take off the first hyphen.
|
||||
|
||||
You will need to learn bit of Ren'Py & bit of actual Python anyways but you don't have to think too hard in learning anything new other than familiarizing with this game's script.rpy's already defined Character objects and images, you can freely ignore most of the UI and so on for the inexperienced but passionate artist and/or writer.
|
||||
When ordering the mods in the mod menu, know that not all mod code will be loaded according to the order. Ren'Py has a feature called 'init' that will run code at certain mod-defined stages (priorities) of the engine starting up, so if one mod's init block is set to run at an earlier priority than another mod's, it doesn't what order it is in the mod loader, it will always load that init first. The only time when the order comes into effect is if 2 mod's init blocks run at the same priority, or aren't running in an init block.
|
||||
|
||||
Textbox limitation: ~300 characters / four lines, the maximum in the vanilla game's script is around roughly ~278 and that only barely overflows to four lines, so <200 characters / three lines of text should be fine.
|
||||
|
||||
--- Ideal file structure of your mod ---
|
||||
--- MOD CREATION PRE-REQUSITES ---
|
||||
|
||||
Before modding, you may want to do either of these things:
|
||||
|
||||
-Download Snoot Game as a renpy project and launch through the SDK so you can have easy access to debugging and other QoL tools, including dev mode. (Download the repo in this link: https://git.cavemanon.xyz/Cavemanon/SnootGame)
|
||||
-Open script.rpy and put 'config.developer = True' somewhere in the 'init python' block to have access to renpy's dev mode.
|
||||
|
||||
Pick the latter option if you're lazy, since you don't seriously need to use the SDK for most things.
|
||||
|
||||
|
||||
--- MOD CRREATION ---
|
||||
|
||||
When creating a mod, make a new folder within the 'mods' directory at the root of the game directory and name it whatever you want. Inside that folder, make a file called 'metadata.json', and follow the JSON file format to implement details about your mod. An example would be:
|
||||
|
||||
```
|
||||
{
|
||||
"ID": "234234u9SDjjasdhl23",
|
||||
"Name": "Test Mod",
|
||||
"Label": "test_mod_label",
|
||||
"Version": "1.0",
|
||||
"Authors": [ "Author1", "Author2", "Author3" ],
|
||||
"Links": "Link1",
|
||||
"Description": "This contains the description of my mod"
|
||||
}
|
||||
```
|
||||
|
||||
Make sure there isn't a comma at the end of the last entry in your JSON.
|
||||
|
||||
Below is all the possible entries you can put in, and explanations for what they do. Note that you don't need to put all of these in your metadata file, and infact the only hard requirement is the "ID" entry.
|
||||
|
||||
"ID" : The ID of your mod. Required to be able to load your mod at all, as it is used by the mod loader for mod orders and enabling/disabling. Make this as unique of a string as you can, like a hash. Smash your keyboard if you must. This is how the game knows to differentiate your mod from others (And can be used by other mods to find if a user has your mod installed, if they so choose).
|
||||
|
||||
"Name" : The name of your mod. If this doesn't exist, the game will assume the name of your mod folder.
|
||||
|
||||
"Label" : The label to jump to start your mod story. If this doesn't exist, the button this mod will appear as will do nothing when clicked. Useful if you're only modifying something relating to the base game.
|
||||
|
||||
"Version" : The version number of your mod.
|
||||
|
||||
"Authors" : The authors of your mod. This can be a list of strings or just a string. If it's just a string, it will display in the mod details pane with only "Author:" instead of "Authors:"
|
||||
|
||||
"Links" : The links to download your mod and/or advertisement. This can be a list of strings or just a string. If it's just a string, it will display in the mod details pane with only "Link:" instead of "Links:". In order for this to be useful, use the 'a' text tag to make these texts hyperlinks.
|
||||
|
||||
"Description" : The description of your mod.
|
||||
|
||||
"Mobile Description" : The description of your mod, but only appearing while playing Snoot on Android. If this doesn't exist, it will assume the contents of the description entry. Otherwise, you can copy your description text here and format it however you think it fits for Android.
|
||||
|
||||
"Display" : How your mod button appears if there's an icon image detected. This can be set to "name" - which only displays the mod name - "icon" - which only displays the icon, taking up the entire button - or "both" - which displays the name and icon together, with the icon miniaturized and to the side of the name. This defaults to "both" if it doesn't exist, and if an icon image is not present, it will fall back to "name" mode.
|
||||
|
||||
"Thumbnail Displayable" : What displayable to use for the thumbnail when the mod has loaded scripts. If this doesn't exist, the game will use the thumbnail image found alongside your metadata file
|
||||
|
||||
"Icon Displayable" : What displayable to use for the icon when the mod has loaded scripts. If this doesn't exist, the game will use the icon image found alongside your metadata file
|
||||
|
||||
"Screenshot Displayables" : What displayables to use for screenshots when the mod has loaded scripts. This should be a list of strings. The game will choose each displayable in the list over images found alongside the metadata file sequentially, so if there's 5 screenshot images and 3 screenshot displayables, the last 2 will still display the screenshot images, and the first 3 will display the screenshot displayables. If there's more displayables than images, then the mod will appear to gain screenshots in the mod details pane when the mod is enabled. If you enter empty strings in the list ( "" ), the game will interpret that as a deliberate skipping over to load screenshot images instead of displayables, so if your list consists of '[ "", "my_displayable" ]' and there's any number of screenshot images found, the first screenshot will still show a screenshot image, and only the next one will show a displayable. If this entry doesn't exist, it will just use the screenshot images found alongside your metadata file.
|
||||
|
||||
In the same directory as your metadata file, there's image files you can put in the to make your mod more appealing. These can be any of Ren'Py's supported image file types, so the file extension here is just for demonstration:
|
||||
|
||||
-'thumbnail.png' will appear as a banner for your mod, at the top of the mod details pane
|
||||
-'icon.png' will show a small image next your mod name or take up the entire button depending on what your "Display" entry is set to. NOTE: Putting in an image too big in dimensions will crash the game.
|
||||
-'screenshot(number).png' will show screenshots at the bottom of the mod details pane. The '(number)' is a placeholder for a number that represents what order your screenshots appear in. For example, you can have 'screenshot1.png', 'screenshot2.png', and 'screenshot3.png' in your mod directory, and they will all appear in the mod details pane in order. These numbers don't need to be strictly sequential, they can be any number as long as they are integers, and the order will be derived from ASCII ordering.
|
||||
|
||||
As the game loads the metadata, it will also collect scripts for loading. When you make your mod scripts, ALL OF THEM NEED TO HAVE .rpym EXTENSIONS. This is important for being able to control mods with the mod loader, otherwise there would be mod conflicts galore. If you use .rpy extensions to make your mod scripts, they will work, but they will not be manageable by the mod loader. This means you should only use them for development, or if you're not using the mod loader anyway - such as adding a translation to the base game.
|
||||
|
||||
Additionally, Ren'Py will not load any files from the mods folder automatically, so any and all audio/image/video files need to be manually defined to be usable.
|
||||
|
||||
--- TRANSLATION ---
|
||||
|
||||
For disambiguation, a "language code" refers to the code Ren'Py uses to refer to languages program-wide, and can be found on the folder names in "game/tl", with "None" being the default language (Representing a fallback language, but usually meaning English. Internally, it's an actual None variable)
|
||||
|
||||
For translating mods, you should use the Ren'Py SDK to automatically generate translations from mod scripts. Make sure to use a language code that Snoot supports when you do so, so you don't accidentally create a new language. Put them into an organized directory in your mod and change them to use .rpym extensions so that translations don't activate unless your mod is as well (This prevents potential conflicts from other mods from interface/string translations).
|
||||
|
||||
For assets, the easiest way is to put them in the "tl" folder and have the same filepath to your mod asset as it is from the "game" folder to your asset, just like how the officially supported translations are. This will make your mod less portable, but at least there's no namespace or file conflicts for translating images. If you're deadset on making your mod portable, you'll have to make conditionals in your mod to swap out images depending on the language, which means other people translating your mod can't just add a file somewhere and be done with it, they will need to edit your mod scripts as well.
|
||||
|
||||
For translating metadata, you can translate the .json file by creating a new .json and naming it "metadata_(language code).json" (Ex: "metadata_es.json" for spanish). Fill out the .json how you would with the normal metadata file, but with your translated strings. The game will automatically pick this up and replace the strings (or add, if there's no 'None' variant of an entry) according to your language. Note that translating the ID or Label will do nothing, so you will always need a metadata.json file with at least an ID entry even if your mod isn't in english.
|
||||
|
||||
For the images found alongisde your metadata, you can do the same thing as your .json to replace them. Simply append your language code to your image filename like "thumbnail_es.png", "icon_es.png", etc.. For screenshots, the number in your filename will determine if any given translated image will replace another image, or add it inbetween images. So if you have "screenshot4.png", and you have "screenshot2_es.png" and "screenshot5_es.png", all screenshots will show up if your language is in spanish. If there's "screenshot4_es.png" in the directory, then it will replace "screenshot4.png". The final screenshot display will always take the english screenshots as a base before replacing the images with whatever translated images that exist.
|
||||
|
||||
|
||||
--- TIPS ---
|
||||
|
||||
The Ren'Py documentation is your friend, but it is also a bitch-ass friend. It will sometimes be notoriously unhelpful, so consult other renpy dudes from the Ren'Py discord, your snoot communities, or youtube. This may also be of interest, as it will link to other documentation as well as many interesting libraries you can use:
|
||||
https://github.com/methanoliver/awesome-renpy
|
||||
|
||||
Link to Ren'Py documentation:
|
||||
https://www.renpy.org/doc/html/
|
||||
|
||||
When making the file structure for your mod, this is the ideal. Keep it nice and organized, preferably keeping the root of your mods folder clear of eveything but metadata related stuff:
|
||||
```
|
||||
In the root of the mods folder:
|
||||
folder_of_your_mod_name
|
||||
- name_of_storyline.rpy
|
||||
- metadata.json
|
||||
- Your various image metadatas
|
||||
-> asset_folder
|
||||
- asset.png
|
||||
-> script_folder
|
||||
- script.rpy
|
||||
|
||||
name_of_storyline.rpy
|
||||
- script.rpym
|
||||
-> etc. folders...
|
||||
- etc. files...
|
||||
```
|
||||
init python:
|
||||
# Modding Support variables
|
||||
# All mod rpy files must have title of their mod (this shows up on a button)
|
||||
# and finally the label that controls the flow of dialogue
|
||||
|
||||
mod_menu_access += [{
|
||||
'Name': "Mod Name",
|
||||
'Label': "mod_storyline"
|
||||
}];
|
||||
|
||||
image template_sample = Image("mods/folder_of_your_mod_name/asset_folder/asset.png")
|
||||
|
||||
label mod_storyline:
|
||||
call chapter_1_new
|
||||
To start your mod, just make it under the label you defined in your metadata file in a mod script. An example in a newly created "mymodscript.rpym":
|
||||
```
|
||||
label my_mod_label:
|
||||
scene my_background
|
||||
show my_sprite
|
||||
"blah blah dialogue"
|
||||
```
|
||||
|
||||
script_folder/script.rpy
|
||||
```
|
||||
label chapter_1_new:
|
||||
show template_sample at scenter
|
||||
"Sample Text"
|
||||
Textbox limitation: ~300 characters / four lines, the maximum in the vanilla game's script is around roughly ~278 and that only barely overflows to four lines, so <200 characters / three lines of text should be fine.
|
||||
|
||||
hide template_sample
|
||||
play music 'audio/OST/Those Other Two Weirdos.ogg'
|
||||
show anon neutral flip at aright with dissolve
|
||||
A "Sample Text"
|
||||
|
||||
return
|
||||
```
|
||||
|
||||
The funny thing is I don't even like 'fanfictions' to begin with but this mod support allows these 'fanfictions', ironic.
|
||||
If a user has many mods installed, it would be annoying to need to keep track of which mods to enable or disable because of code conflicts, so make your variables/functions unique. Since Ren'Py's own scripting doesn't support namespaced stuff, a very simple way is to prefix all your variables/functions with a mod-unique name, similar to your mod ID. An example would be "mymodisfantastic2349234_function_or_variable". Kinda ugly, but manageable with Ctrl-F and string replacement if there's problems. If there must be code conflicts, let the user know in your mod description!
|
||||
@@ -24,7 +24,7 @@ define gui.show_name = True
|
||||
|
||||
## The version of the game.
|
||||
|
||||
define config.version = _("INTERNAL-BUILD")
|
||||
define config.version = "INTERNAL-BUILD"
|
||||
|
||||
## Text that is placed on the game's about screen. Place the text between the
|
||||
## triple-quotes, and leave a blank line between paragraphs.
|
||||
@@ -48,7 +48,7 @@ define build.name = "SnootGame"
|
||||
|
||||
define config.has_sound = True
|
||||
define config.has_music = True
|
||||
define config.has_voice = False
|
||||
define config.has_voice = True
|
||||
|
||||
define config.play_channel = "uisounds"
|
||||
|
||||
@@ -133,9 +133,47 @@ default preferences.text_cps = 50
|
||||
|
||||
default preferences.afm_time = 15
|
||||
|
||||
|
||||
## Disables loading all languages at once at startup, only loading a language when selecting a language
|
||||
|
||||
define config.defer_tl_scripts = True
|
||||
|
||||
|
||||
## Retains linear audio fading so mixing doesn't get fucked from the update to 8.2+
|
||||
|
||||
define config.linear_fades = True
|
||||
|
||||
|
||||
## The variable used for making the splashscreen not show when reloading a mod
|
||||
default persistent.reloading_mods = False
|
||||
|
||||
|
||||
## Snoot-specific config variables
|
||||
|
||||
define config.developer = "auto"
|
||||
|
||||
default persistent.use_epilogue_menu = False
|
||||
default persistent.enable_debug_scores = config.developer
|
||||
default persistent.enable_chapter_select = config.developer
|
||||
default persistent.lewd = False
|
||||
default persistent.autoup = False
|
||||
default persistent.show_mod_screenshots = True
|
||||
default persistent.gallery_edgescroll = True
|
||||
default persistent.scroll = False
|
||||
|
||||
init -999 python:
|
||||
if persistent.newmods_default_state == None:
|
||||
persistent.newmods_default_state = False
|
||||
|
||||
init python:
|
||||
# Makes going forward on the scroll wheel advance dialogue, rather than just seen dialogue
|
||||
if persistent.scroll == True:
|
||||
config.keymap['dismiss'].append('mousedown_4')
|
||||
|
||||
##Default Audio is not ear rape
|
||||
define config.default_music_volume = 0.48
|
||||
define config.default_sfx_volume = 0.80
|
||||
define config.default_music_volume = 0.61
|
||||
define config.default_sfx_volume = 0.8
|
||||
define config.default_voice_volume = 0.8
|
||||
|
||||
## Save directory ##############################################################
|
||||
##
|
||||
@@ -192,10 +230,17 @@ init python:
|
||||
build.classify('**/#**', None)
|
||||
build.classify('**/thumbs.db', None)
|
||||
|
||||
# Do not include mod_examples as part of the build process
|
||||
build.classify('game/mods_example/**', None)
|
||||
build.classify('game/mods_example/.**', None)
|
||||
# Do not include mod folders as part of the build process
|
||||
build.classify('game/mods/*/', None)
|
||||
|
||||
#Development files need not apply
|
||||
build.classify('README.md', None)
|
||||
build.classify('renconstruct.toml', None)
|
||||
build.classify('bundle.keystore', None)
|
||||
build.classify('android.keystore', None)
|
||||
build.classify('bundle.keystore.original', None)
|
||||
build.classify('android.keystore.original', None)
|
||||
build.classify('*dist/*', None)
|
||||
|
||||
## To archive files, classify them as 'archive'.
|
||||
|
||||
@@ -209,9 +254,9 @@ init python:
|
||||
build.documentation('*.txt')
|
||||
|
||||
|
||||
## A Google Play license key is required to download expansion files and perform
|
||||
## in-app purchases. It can be found on the "Services & APIs" page of the Google
|
||||
## Play developer console.
|
||||
## A Google Play license key is required to perform in-app purchases. It can be
|
||||
## found in the Google Play developer console, under "Monetize" > "Monetization
|
||||
## Setup" > "Licensing".
|
||||
|
||||
# define build.google_play_key = "..."
|
||||
|
||||
@@ -220,6 +265,3 @@ init python:
|
||||
## by a slash.
|
||||
|
||||
# define build.itch_project = "renpytom/test-project"
|
||||
|
||||
#RenPy updating from snootgame.xyz
|
||||
define build.include_update = True
|
||||
|
||||
BIN
game/presplash_background.png
Normal file
|
After Width: | Height: | Size: 147 KiB |
BIN
game/presplash_foreground.png
Normal file
|
After Width: | Height: | Size: 5.5 KiB |
519
game/screens.rpy
@@ -194,7 +194,7 @@ screen input(prompt):
|
||||
window:
|
||||
add Image("gui/textbox_no_hitch.png", xalign=0.5, yalign=1.0, yoffset=gui.input_yoffset) #for mobile OSK
|
||||
vbox:
|
||||
xalign gui.dialogue_text_xalign
|
||||
xanchor gui.dialogue_text_xalign
|
||||
xpos gui.dialogue_xpos
|
||||
xsize gui.dialogue_width
|
||||
ypos gui.dialogue_ypos
|
||||
@@ -251,7 +251,7 @@ style choice_button is default:
|
||||
activate_sound "audio/ui/uiRollover.wav"
|
||||
|
||||
style choice_button_text is default:
|
||||
properties gui.button_text_properties("choice_button")
|
||||
properties gui.text_properties("choice_button")
|
||||
|
||||
|
||||
## Quick Menu screen ###########################################################
|
||||
@@ -259,24 +259,25 @@ style choice_button_text is default:
|
||||
## The quick menu is displayed in-game to provide easy access to the out-of-game
|
||||
## menus.
|
||||
|
||||
screen quick_button(filename, label, function):
|
||||
screen quick_button(filename, label, function=NullAction(), function2=NullAction()):
|
||||
button:
|
||||
xsize 71
|
||||
ysize 71
|
||||
action function
|
||||
alternate function2
|
||||
if 'Return' in label or 'Back' in label or 'Menu' in label:
|
||||
activate_sound "audio/ui/uiBack.wav"
|
||||
else:
|
||||
activate_sound "audio/ui/uiClick.wav"
|
||||
fixed:
|
||||
add filename xalign 0.5 yalign 0.5 zoom 1
|
||||
text label xalign 0.5 yalign 0.5 xanchor 0.5 size 22 style "quick_button_text"
|
||||
text label xalign 0.5 yalign 0.5 size 22 style "quick_button_text"
|
||||
|
||||
# label_functions is [ [ "label", function() ], [ "foobar", foobar() ], .. ]
|
||||
# Reuse the same image string and keep things 'neat'.
|
||||
screen quick_buttons(filename, label_functions):
|
||||
for l_f in label_functions:
|
||||
use quick_button(filename, l_f[0], l_f[1])
|
||||
use quick_button(filename, l_f[0], l_f[1], l_f[2])
|
||||
|
||||
screen quick_menu():
|
||||
|
||||
@@ -292,33 +293,20 @@ screen quick_menu():
|
||||
|
||||
use quick_buttons("gui/button/uioptionbuttons/template_idle.png",
|
||||
[
|
||||
[ _("Skip"), Skip() ],
|
||||
[ _("Save"), ShowMenu('save') ],
|
||||
[ _("Auto"), Preference("auto-forward", "toggle") ],
|
||||
[ _("Load"), ShowMenu('load') ]
|
||||
[ _("Skip"), Skip(), Skip(fast=True, confirm=True) ],
|
||||
[ _("Save"), ShowMenu('save'), NullAction() ],
|
||||
[ _("Auto"), Preference("auto-forward", "toggle"), NullAction() ],
|
||||
[ _("Load"), ShowMenu('load'), NullAction() ]
|
||||
] )
|
||||
|
||||
screen score_menu():
|
||||
zorder 100
|
||||
window:
|
||||
background "gui/debug.webp"
|
||||
xalign -1.0
|
||||
yalign 0.0
|
||||
grid 1 3:
|
||||
style_prefix "score"
|
||||
xalign 0.0
|
||||
yalign 0.0
|
||||
text "anons: " + str(anonscore)
|
||||
text "fang: " + str(fangscore)
|
||||
text "DEBUG SCORE CARD"
|
||||
|
||||
|
||||
## This code ensures that the quick_menu screen is displayed in-game, whenever
|
||||
## the player has not explicitly hidden the interface.
|
||||
init python:
|
||||
config.overlay_screens.append("quick_menu")
|
||||
|
||||
default quick_menu = True
|
||||
default persistent.old_endings = None
|
||||
default persistent.endings = None
|
||||
|
||||
style quick_button is default
|
||||
style quick_button_text is button_text
|
||||
@@ -356,6 +344,10 @@ screen navigation():
|
||||
textbutton _("Save") activate_sound "audio/ui/uiClick.wav" action ShowMenu("save")
|
||||
textbutton _("Load") activate_sound "audio/ui/uiClick.wav" action ShowMenu("load")
|
||||
textbutton _("Delete") activate_sound "audio/ui/uiClick.wav" action ShowMenu("delete")
|
||||
|
||||
if persistent.enable_chapter_select:
|
||||
textbutton _("Chapter Select") activate_sound "audio/ui/uiClick.wav" action Start("chapter_select")
|
||||
|
||||
textbutton _("Options") activate_sound "audio/ui/uiClick.wav" action ShowMenu("preferences")
|
||||
#textbutton _("Extras") action ShowMenu("extras")
|
||||
textbutton _("Return") activate_sound "audio/ui/uiBack.wav" action Return()
|
||||
@@ -384,7 +376,7 @@ style navigation_button:
|
||||
properties gui.button_properties("navigation_button")
|
||||
|
||||
style navigation_button_text:
|
||||
properties gui.button_text_properties("navigation_button")
|
||||
properties gui.text_properties("navigation_button")
|
||||
|
||||
|
||||
## Main Menu screen ############################################################
|
||||
@@ -404,8 +396,8 @@ screen main_menu_button(filename, label, function):
|
||||
else:
|
||||
activate_sound "audio/ui/uiClick.wav"
|
||||
fixed:
|
||||
add filename xalign 0.5 yalign 0.5 zoom 1 xanchor 0 xcenter 0.5 ycenter 0.5
|
||||
text label xalign 0.5 yalign 0.5 xanchor 0.5
|
||||
add filename xalign 0.5 yalign 0.5 zoom 1
|
||||
text label xalign 0.5 yalign 0.5
|
||||
|
||||
image bonus_flash:
|
||||
|
||||
@@ -416,38 +408,24 @@ image bonus_flash:
|
||||
repeat 4
|
||||
|
||||
|
||||
image template_black_m = Composite(
|
||||
(511, 129),
|
||||
(6, 5), Crop((0, 0, 511-12, 129-12), Solid("#000000", width=2, height=2)),
|
||||
(0, 0), "gui/button/menubuttons/template_idle.png",
|
||||
(0, 0), "gui/button/menubuttons/template_idle.png"
|
||||
)
|
||||
|
||||
image template_black:
|
||||
"template_black_m"
|
||||
matrixcolor TintMatrix(Color((0, 0, 0)))
|
||||
alpha 0.8
|
||||
|
||||
screen bonus_chapter_button(f="gui/button/menubuttons/template_idle.png"):
|
||||
#("gui/button/menubuttons/template_idle.png", "Bonus Chapters", ShowMenu("ex_ch_menu"))
|
||||
button:
|
||||
xmaximum 500
|
||||
ymaximum 129
|
||||
xysize (500, 129)
|
||||
action ShowMenu("ex_ch_menu")
|
||||
activate_sound "audio/ui/uiClick.wav"
|
||||
fixed:
|
||||
if (persistent.old_endings != persistent.endings) or (persistent.bonus_chapters != persistent.old_bonus_chapters and (persistent.bonus_chapters == 0b111111111)):
|
||||
add "bonus_flash" xalign 0.5 yalign 0.5 zoom 1 xanchor 0 xcenter 0.5 ycenter 0.5
|
||||
add "bonus_flash" xalign 0.5 yalign 0.5 zoom 1
|
||||
$ persistent.old_endings = persistent.endings
|
||||
#$ persistent.old_bonus_chapters = persistent.bonus_chapters
|
||||
else:
|
||||
add f xalign 0.5 yalign 0.5 zoom 1 xanchor 0 xcenter 0.5 ycenter 0.5
|
||||
add f xalign 0.5 yalign 0.5 zoom 1
|
||||
|
||||
if (persistent.old_bonus_chapters != persistent.bonus_chapters): #just in case
|
||||
$ persistent.old_bonus_chapters = persistent.bonus_chapters
|
||||
|
||||
text "Bonus Chapters" xalign 0.5 yalign 0.5 xanchor 0.5
|
||||
text "Bonus Chapters" xalign 0.5 yalign 0.5
|
||||
|
||||
# label_functions is [ [ "label", function() ], [ "foobar", foobar() ], .. ]
|
||||
# Reuse the same image string and keep things 'neat'.
|
||||
@@ -460,23 +438,28 @@ transform bonus_notif:
|
||||
pause 6.00
|
||||
easeout_cubic 0.65 alpha 0
|
||||
|
||||
screen main_menu_background(frame=True):
|
||||
# The style prefix needs to be set outside of this screen if you want to have the sidebar graphic
|
||||
if persistent.use_epilogue_menu:
|
||||
add "big ending"
|
||||
else:
|
||||
add gui.main_menu_background
|
||||
|
||||
## This empty frame darkens the main menu.
|
||||
if frame:
|
||||
frame:
|
||||
background "gui/overlay/main_menu.png"
|
||||
|
||||
screen main_menu():
|
||||
|
||||
## This ensures that any other menu screen is replaced.
|
||||
tag menu
|
||||
|
||||
style_prefix "main_menu"
|
||||
|
||||
if renpy.seen_image("big ending"):
|
||||
style_prefix "main_menu_ex"
|
||||
add "big ending"
|
||||
else:
|
||||
style_prefix "main_menu"
|
||||
add gui.main_menu_background
|
||||
|
||||
## This empty frame darkens the main menu.
|
||||
frame:
|
||||
pass
|
||||
use main_menu_background
|
||||
|
||||
$ main_menu_button_img = "gui/button/menubuttons/template_idle_epilogue.png" if persistent.use_epilogue_menu else "gui/button/menubuttons/template_idle.png"
|
||||
|
||||
if (persistent.old_endings != persistent.endings) or (persistent.bonus_chapters != persistent.old_bonus_chapters and (persistent.bonus_chapters == 0b111111111)):
|
||||
fixed:
|
||||
@@ -511,27 +494,16 @@ screen main_menu():
|
||||
spacing 10
|
||||
xpos 1885
|
||||
ypos 1130
|
||||
if renpy.seen_image('big ending'):
|
||||
use main_menu_button("template_black", "Start", Start())
|
||||
use bonus_chapter_button("template_black")
|
||||
use main_menu_buttons("template_black",
|
||||
[
|
||||
[ _("Load"), ShowMenu("load") ],
|
||||
[ _("Options"), ShowMenu("preferences") ],
|
||||
[ _("Extras"), ShowMenu("extras") ], \
|
||||
[ _("Quit"), Quit(confirm=not main_menu) ]
|
||||
] )
|
||||
else:
|
||||
use main_menu_button("gui/button/menubuttons/template_idle.png", "Start", Start())
|
||||
use bonus_chapter_button()
|
||||
use main_menu_buttons("gui/button/menubuttons/template_idle.png",
|
||||
[
|
||||
[ _("Load"), ShowMenu("load") ],
|
||||
[ _("Options"), ShowMenu("preferences") ],
|
||||
[ _("Extras"), ShowMenu("extras") ], \
|
||||
[ _("Quit"), Quit(confirm=not main_menu) ]
|
||||
] )
|
||||
#on "show" action renpy.start_predict_screen("cg_gallery")
|
||||
use main_menu_button(main_menu_button_img, "Start", Start())
|
||||
use bonus_chapter_button(main_menu_button_img)
|
||||
use main_menu_buttons(main_menu_button_img,
|
||||
[
|
||||
[ _("Load"), ShowMenu("load") ],
|
||||
[ _("Options"), ShowMenu("preferences") ],
|
||||
[ _("Extras"), ShowMenu("extras") ], \
|
||||
[ _("Quit"), Quit(confirm=not main_menu) ]
|
||||
] )
|
||||
|
||||
|
||||
style main_menu_frame is empty
|
||||
style main_menu_vbox is vbox
|
||||
@@ -543,8 +515,6 @@ style main_menu_frame:
|
||||
xsize 420
|
||||
yfill True
|
||||
|
||||
background "gui/overlay/main_menu.png"
|
||||
|
||||
style main_menu_vbox:
|
||||
xalign 1.0
|
||||
xoffset -30
|
||||
@@ -561,41 +531,21 @@ style main_menu_text:
|
||||
style main_menu_title:
|
||||
properties gui.text_properties("title")
|
||||
|
||||
style main_menu_ex is main_menu
|
||||
style main_menu_ex_vbox is main_menu_vbox
|
||||
style main_menu_ex_text is main_menu_text
|
||||
style main_menu_ex_frame is main_menu_frame
|
||||
|
||||
#style main_menu_ex_button:
|
||||
#color "#222"
|
||||
#background "gui/button/menubuttons/template_idle.png"
|
||||
#xalign 0.5 yalign 0.5 zoom 1 xanchor 0 xcenter 0.5 ycenter 0.5
|
||||
|
||||
#style main_menu_ex_button:
|
||||
#color "#222"
|
||||
|
||||
|
||||
|
||||
#style main_menu_version:
|
||||
# properties gui.text_properties("version")
|
||||
|
||||
# style
|
||||
|
||||
## Game Menu screen ############################################################
|
||||
##
|
||||
## This lays out the basic common structure of a game menu screen. It's called
|
||||
## with the screen title, and displays the background, title, and navigation.
|
||||
##
|
||||
## The scroll parameter can be None, or one of "viewport" or "vpgrid". When
|
||||
## this screen is intended to be used with one or more children, which are
|
||||
## The scroll parameter can be None, or one of "viewport" or "vpgrid".
|
||||
## This screen is intended to be used with one or more children, which are
|
||||
## transcluded (placed) inside it.
|
||||
|
||||
screen game_menu(title, scroll=None, yinitial=0.0):
|
||||
screen game_menu(title, scroll=None, yinitial=0.0, spacing=0):
|
||||
|
||||
style_prefix "game_menu"
|
||||
|
||||
if main_menu:
|
||||
add gui.main_menu_background
|
||||
use main_menu_background(False)
|
||||
else:
|
||||
add gui.game_menu_background
|
||||
|
||||
@@ -623,6 +573,8 @@ screen game_menu(title, scroll=None, yinitial=0.0):
|
||||
side_yfill True
|
||||
|
||||
vbox:
|
||||
spacing spacing
|
||||
|
||||
transclude
|
||||
|
||||
elif scroll == "vpgrid":
|
||||
@@ -638,6 +590,8 @@ screen game_menu(title, scroll=None, yinitial=0.0):
|
||||
|
||||
side_yfill True
|
||||
|
||||
spacing spacing
|
||||
|
||||
transclude
|
||||
|
||||
else:
|
||||
@@ -716,12 +670,11 @@ screen about():
|
||||
tag menu
|
||||
style_prefix "main_menu"
|
||||
|
||||
add gui.main_menu_background
|
||||
add gui.extras_submenu_panel
|
||||
|
||||
## This empty frame darkens the main menu.
|
||||
frame:
|
||||
pass
|
||||
use main_menu_background
|
||||
if persistent.use_epilogue_menu:
|
||||
add "gui/overlay/extras_submenu_panel_epilogue.png"
|
||||
else:
|
||||
add gui.extras_submenu_panel
|
||||
|
||||
## The use statement includes another screen inside this one. The actual
|
||||
## contents of the main menu are in the navigation screen.
|
||||
@@ -732,76 +685,14 @@ screen about():
|
||||
xoffset 80
|
||||
xmaximum 1100
|
||||
label "[config.name!t]"
|
||||
text _("Version [config.version!t]\n")
|
||||
text _("Version [config.version!t]\n") outlines [ (absolute(1), "#000", absolute(0), absolute(0)) ]
|
||||
|
||||
## gui.about is usually set in options.rpy.
|
||||
if gui.about:
|
||||
text "[gui.about!t]\n"
|
||||
|
||||
style_prefix "quick"
|
||||
text _("{size=30}Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]\nTo find more information about the game (and its source code) please visit {a=https://www.snootgame.xyz/}our website{/a}.{/size}") text_align 0
|
||||
use extrasnavigation
|
||||
|
||||
## Updates screen ################################################################
|
||||
##
|
||||
## This screen houses the updates option using the built-in updates capabilities of Ren'Py.
|
||||
##
|
||||
|
||||
screen updates():
|
||||
|
||||
tag menu
|
||||
style_prefix "main_menu"
|
||||
|
||||
add gui.main_menu_background
|
||||
add gui.extras_submenu_panel
|
||||
|
||||
## This empty frame darkens the main menu.
|
||||
frame:
|
||||
pass
|
||||
|
||||
## The use statement includes another screen inside this one. The actual
|
||||
## contents of the main menu are in the navigation screen.
|
||||
|
||||
vbox:
|
||||
yalign 0.00
|
||||
yoffset 100
|
||||
xoffset 80
|
||||
xmaximum 1100
|
||||
label "[config.name!t]"
|
||||
text _("Version [config.version!t]")
|
||||
if updater.can_update():
|
||||
label _("{color=#00FF00}{size=32}Update directory exists, updating is possible!\n{/size}{/color}")
|
||||
else:
|
||||
label _("{color=#FF0000}{size=32}Update directory does not exist or is corrupt!\n{/size}{/color}")
|
||||
|
||||
label _("Auto Update:")
|
||||
label _("{color=#FFFFFF}{size=32}Automatic Updates: [persistent.autoup!t]{/size}{/color}")
|
||||
textbutton _("{size=36}Toggle Automatic Updates\n{/size}") action [Notify("Toggling Automatic Updates..."), Function(ToggleAutoUpdate)]
|
||||
|
||||
label _("Update Checker:")
|
||||
label _("{color=#FFFFFF}{size=32}[persistent.updateresult!t]{/size}{/color}")
|
||||
textbutton _("{size=36}Check for Update\n{/size}") activate_sound "audio/ui/uiClick.wav" action [Notify("Checking for update..."), Function(UpdateCheck)]
|
||||
|
||||
label _("Updater:")
|
||||
label _("{color=#FFFFFF}{size=32}Server URL (click to edit):{/size}{/color}")
|
||||
default input_on = False
|
||||
button:
|
||||
key_events True
|
||||
if input_on:
|
||||
input:
|
||||
default "[persistent.updateWebServer!t]" size 36 color '#FFFFFF'
|
||||
value FieldInputValue(persistent, 'updateWebServer')
|
||||
length 49
|
||||
copypaste True
|
||||
else:
|
||||
text persistent.updateWebServer size 36 color '#FFFF00'
|
||||
action ToggleScreenVariable('input_on')
|
||||
style_prefix "quick"
|
||||
if persistent.updateresult != "No new version is available":
|
||||
textbutton _("{size=36}Update Now!\n{/size}") activate_sound "audio/ui/uiNotification.wav" action [updater.Update(persistent.updateWebServer, force=False)]
|
||||
else:
|
||||
textbutton _("{size=36}Update Now!\n{/size}") activate_sound "audio/ui/uiFail.wav" action [Notify("Nothing to update to!")]
|
||||
|
||||
text _("{size=30}Made with {a=https://www.renpy.org/}Ren'Py{/a} [renpy.version_only].\n\n[renpy.license!t]\nTo find more information about the game (and its source code) please visit {a=https://www.snootgame.xyz/}our website{/a}.{/size}") text_align 0 outlines [ (absolute(1), "#000", absolute(0), absolute(0)) ]
|
||||
use extrasnavigation
|
||||
|
||||
## Load and Save screens #######################################################
|
||||
@@ -888,27 +779,41 @@ screen file_slots(title, flag=False):
|
||||
key "save_delete" action FileDelete(slot)
|
||||
|
||||
## Buttons to access other pages.
|
||||
hbox:
|
||||
vbox:
|
||||
style_prefix "page"
|
||||
|
||||
xalign 0.5
|
||||
yalign 1.0
|
||||
hbox:
|
||||
xalign 0.5
|
||||
|
||||
spacing gui.page_spacing
|
||||
spacing gui.page_spacing
|
||||
|
||||
textbutton _("<") activate_sound "audio/ui/uiRollover.wav" action FilePagePrevious()
|
||||
textbutton _("<") activate_sound "audio/ui/uiRollover.wav" action FilePagePrevious()
|
||||
key "save_page_prev" action FilePagePrevious()
|
||||
|
||||
if config.has_autosave:
|
||||
textbutton _("{#auto_page}A") activate_sound "audio/ui/uiClick.wav" action FilePage("auto")
|
||||
if config.has_autosave:
|
||||
textbutton _("{#auto_page}A") activate_sound "audio/ui/uiClick.wav" action FilePage("auto")
|
||||
|
||||
if config.has_quicksave:
|
||||
textbutton _("{#quick_page}Q") activate_sound "audio/ui/uiClick.wav" action FilePage("quick")
|
||||
if config.has_quicksave:
|
||||
textbutton _("{#quick_page}Q") activate_sound "audio/ui/uiClick.wav" action FilePage("quick")
|
||||
|
||||
## range(1, 10) gives the numbers from 1 to 9.
|
||||
for page in range(1, 10):
|
||||
textbutton "[page]" activate_sound "audio/ui/uiClick.wav" action FilePage(page)
|
||||
## range(1, 10) gives the numbers from 1 to 9.
|
||||
for page in range(1, 10):
|
||||
textbutton "[page]" activate_sound "audio/ui/uiClick.wav" action FilePage(page)
|
||||
|
||||
textbutton _(">") activate_sound "audio/ui/uiRollover.wav" action FilePageNext(max=9)
|
||||
textbutton _(">") activate_sound "audio/ui/uiRollover.wav" action FilePageNext(max=9)
|
||||
key "save_page_next" action FilePageNext()
|
||||
|
||||
if config.has_sync:
|
||||
if CurrentScreenName() == "save":
|
||||
textbutton _("Upload Sync"):
|
||||
action UploadSync()
|
||||
xalign 0.5
|
||||
else:
|
||||
textbutton _("Download Sync"):
|
||||
action DownloadSync()
|
||||
xalign 0.5
|
||||
|
||||
|
||||
style page_label is gui_label
|
||||
@@ -926,7 +831,7 @@ style page_label:
|
||||
ypadding 5
|
||||
|
||||
style page_label_text:
|
||||
text_align 0.5
|
||||
textalign 0.5
|
||||
layout "subtitle"
|
||||
hover_color gui.hover_color
|
||||
|
||||
@@ -934,13 +839,13 @@ style page_button:
|
||||
properties gui.button_properties("page_button")
|
||||
|
||||
style page_button_text:
|
||||
properties gui.button_text_properties("page_button")
|
||||
properties gui.text_properties("page_button")
|
||||
|
||||
style slot_button:
|
||||
properties gui.button_properties("slot_button")
|
||||
|
||||
style slot_button_text:
|
||||
properties gui.button_text_properties("slot_button")
|
||||
properties gui.text_properties("slot_button")
|
||||
|
||||
|
||||
## Preferences screen ##########################################################
|
||||
@@ -969,22 +874,23 @@ screen preferences():
|
||||
textbutton _("Window") activate_sound "audio/ui/uiOptionOn.wav" action Preference("display", "any window")
|
||||
textbutton _("Fullscreen") activate_sound "audio/ui/uiOptionOn.wav" action Preference("display", "fullscreen")
|
||||
|
||||
vbox:
|
||||
style_prefix "radio"
|
||||
label _("Rollback Side")
|
||||
textbutton _("Disable") activate_sound "audio/ui/uiOptionOn.wav" action Preference("rollback side", "disable")
|
||||
textbutton _("Left") activate_sound "audio/ui/uiOptionOn.wav" action Preference("rollback side", "left")
|
||||
textbutton _("Right") activate_sound "audio/ui/uiOptionOn.wav" action Preference("rollback side", "right")
|
||||
vbox:
|
||||
style_prefix "check"
|
||||
label _("Requires Restart")
|
||||
textbutton _("Enable Forward-Scroll Movement") action [Function(onclick_audio, persistent.scroll), ToggleVariable("persistent.scroll", True, False)]
|
||||
|
||||
if renpy.variant(["mobile", "steam_deck"]):
|
||||
vbox:
|
||||
style_prefix "radio"
|
||||
label _("Rollback Side")
|
||||
textbutton _("Disable") activate_sound "audio/ui/uiOptionOn.wav" action Preference("rollback side", "disable")
|
||||
textbutton _("Left") activate_sound "audio/ui/uiOptionOn.wav" action Preference("rollback side", "left")
|
||||
textbutton _("Right") activate_sound "audio/ui/uiOptionOn.wav" action Preference("rollback side", "right")
|
||||
vbox:
|
||||
style_prefix "check"
|
||||
label _("Naughty Stuff")
|
||||
textbutton _("Enable Lewd Images") action [Function(onclick_audio, persistent.lewd), ToggleVariable("persistent.lewd", True, False)]
|
||||
|
||||
vbox:
|
||||
style_prefix "check"
|
||||
label _("Requires Restart")
|
||||
textbutton _("Enable Forward-Scroll Movement") action [Function(onclick_audio, persistent.scroll), ToggleVariable("persistent.scroll", True, False)]
|
||||
|
||||
vbox:
|
||||
style_prefix "check"
|
||||
label _("Skip")
|
||||
@@ -993,6 +899,39 @@ screen preferences():
|
||||
textbutton _("Transitions") action [Function(onclick_audio, preferences.transitions, True), ToggleVariable("preferences.transitions", 0, 2)]
|
||||
|
||||
vbox:
|
||||
style_prefix "check"
|
||||
label _("Developer Tools")
|
||||
textbutton _("Enable Debug Scores") action ToggleVariable("persistent.enable_debug_scores", True, False)
|
||||
textbutton _("Enable Chapter Select") action ToggleVariable("persistent.enable_chapter_select", True, False)
|
||||
|
||||
if not main_menu:
|
||||
if persistent.enable_debug_scores:
|
||||
$ debug_story_variables(False)
|
||||
$ debug_story_variables(True)
|
||||
else:
|
||||
$ debug_story_variables(False)
|
||||
|
||||
vbox:
|
||||
style_prefix "check"
|
||||
label _("Mods")
|
||||
textbutton _("Show Mod Screenshots") action [Function(onclick_audio, persistent.show_mod_screenshots), ToggleVariable("persistent.show_mod_screenshots", True, False)]
|
||||
textbutton _("Enable New Mods") action [Function(onclick_audio, persistent.newmods_default_state), ToggleVariable("persistent.newmods_default_state", True, False)]
|
||||
|
||||
if renpy.variant(["mobile", "steam_deck"]):
|
||||
vbox:
|
||||
style_prefix "check"
|
||||
label _("Gallery")
|
||||
textbutton _("Enable Edgescrolling") action [Function(onclick_audio, persistent.gallery_edgescroll), ToggleVariable("persistent.gallery_edgescroll", True, False)]
|
||||
|
||||
if renpy.seen_image("big ending"):
|
||||
vbox:
|
||||
style_prefix "radio"
|
||||
label _("Menu Style")
|
||||
textbutton _("Original") activate_sound "audio/ui/uiOptionOn.wav" action SetVariable("persistent.use_epilogue_menu", False)
|
||||
textbutton _("Epilogue") activate_sound "audio/ui/uiOptionOn.wav" action SetVariable("persistent.use_epilogue_menu", True)
|
||||
|
||||
vbox:
|
||||
xsize 676
|
||||
style_prefix "check"
|
||||
label _("Language")
|
||||
vpgrid:
|
||||
@@ -1000,13 +939,12 @@ screen preferences():
|
||||
cols 1
|
||||
mousewheel True
|
||||
draggable True
|
||||
xsize 676
|
||||
xsize 550
|
||||
ysize 250
|
||||
if len(languages)>4:
|
||||
scrollbars "vertical"
|
||||
for lang in languages:
|
||||
fixed:
|
||||
xsize 656
|
||||
ysize 60
|
||||
use lang_button(lang)
|
||||
|
||||
@@ -1036,7 +974,7 @@ screen preferences():
|
||||
hbox:
|
||||
bar value Preference("music volume") yalign 0.5
|
||||
textbutton _("Reset"):
|
||||
action Function(preferences.set_volume, 'music', config.default_music_volume)
|
||||
action Function(preferences.set_mixer, 'music', config.default_music_volume)
|
||||
|
||||
if config.has_sound:
|
||||
|
||||
@@ -1044,7 +982,7 @@ screen preferences():
|
||||
hbox:
|
||||
bar value Preference("sfx volume") yalign 0.5
|
||||
textbutton _("Reset"):
|
||||
action Function(preferences.set_volume, 'sfx', config.default_sfx_volume)
|
||||
action Function(preferences.set_mixer, 'sfx', config.default_sfx_volume)
|
||||
if config.sample_sound:
|
||||
textbutton _("Test") action Play("sound", config.sample_sound)
|
||||
|
||||
@@ -1053,7 +991,7 @@ screen preferences():
|
||||
bar value Preference("ui volume") yalign 0.5
|
||||
textbutton _("Reset"):
|
||||
yalign 0.5
|
||||
action Function(preferences.set_volume, 'ui', config.default_sfx_volume)
|
||||
action Function(preferences.set_mixer, 'ui', config.default_sfx_volume)
|
||||
|
||||
if config.has_voice:
|
||||
label _("Voice Volume")
|
||||
@@ -1061,7 +999,7 @@ screen preferences():
|
||||
bar value Preference("voice volume") yalign 0.5
|
||||
textbutton _("Reset"):
|
||||
yalign 0.5
|
||||
action Function(preferences.set_volume, 'voice', config.default_sfx_volume)
|
||||
action Function(preferences.set_mixer, 'voice', config.default_voice_volume)
|
||||
if config.sample_voice:
|
||||
textbutton _("Test") action Play("voice", config.sample_voice)
|
||||
|
||||
@@ -1116,7 +1054,7 @@ style radio_button:
|
||||
foreground "gui/button/radio_[prefix_]foreground.png"
|
||||
|
||||
style radio_button_text:
|
||||
properties gui.button_text_properties("radio_button")
|
||||
properties gui.text_properties("radio_button")
|
||||
|
||||
style check_vbox:
|
||||
spacing gui.pref_button_spacing
|
||||
@@ -1126,7 +1064,7 @@ style check_button:
|
||||
foreground "gui/button/check_[prefix_]foreground.png"
|
||||
|
||||
style check_button_text:
|
||||
properties gui.button_text_properties("check_button")
|
||||
properties gui.text_properties("check_button")
|
||||
|
||||
style slider_slider:
|
||||
xsize 525
|
||||
@@ -1137,7 +1075,7 @@ style slider_button:
|
||||
left_margin 15
|
||||
|
||||
style slider_button_text:
|
||||
properties gui.button_text_properties("slider_button")
|
||||
properties gui.text_properties("slider_button")
|
||||
|
||||
style slider_vbox:
|
||||
xsize 675
|
||||
@@ -1158,7 +1096,7 @@ screen history():
|
||||
## Avoid predicting this screen, as it can be very large.
|
||||
predict False
|
||||
|
||||
use game_menu(_("History"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0):
|
||||
use game_menu(_("History"), scroll=("vpgrid" if gui.history_height else "viewport"), yinitial=1.0, spacing=gui.history_spacing):
|
||||
|
||||
style_prefix "history"
|
||||
|
||||
@@ -1217,7 +1155,7 @@ style history_name:
|
||||
|
||||
style history_name_text:
|
||||
min_width gui.history_name_width
|
||||
text_align gui.history_name_xalign
|
||||
textalign gui.history_name_xalign
|
||||
|
||||
style history_text:
|
||||
xpos gui.history_text_xpos
|
||||
@@ -1225,7 +1163,7 @@ style history_text:
|
||||
xanchor gui.history_text_xalign
|
||||
xsize gui.history_text_width
|
||||
min_width gui.history_text_width
|
||||
text_align gui.history_text_xalign
|
||||
textalign gui.history_text_xalign
|
||||
layout ("subtitle" if gui.history_text_xalign else "tex")
|
||||
|
||||
style history_label:
|
||||
@@ -1241,11 +1179,7 @@ screen extras():
|
||||
|
||||
style_prefix "main_menu"
|
||||
|
||||
add gui.main_menu_background
|
||||
|
||||
## This empty frame darkens the main menu.
|
||||
frame:
|
||||
pass
|
||||
use main_menu_background
|
||||
|
||||
use extrasnavigation
|
||||
|
||||
@@ -1264,12 +1198,16 @@ screen extrasnavigation():
|
||||
vbox:
|
||||
spacing 10
|
||||
xpos 1885
|
||||
ypos 1130
|
||||
use main_menu_buttons("gui/button/menubuttons/template_idle.png",
|
||||
ypos (1269 if persistent.enable_chapter_select else 1130)
|
||||
|
||||
$ main_menu_button_img = "gui/button/menubuttons/template_idle_epilogue.png" if persistent.use_epilogue_menu else "gui/button/menubuttons/template_idle.png"
|
||||
|
||||
use main_menu_buttons(main_menu_button_img,
|
||||
[
|
||||
[ _("Help"), ShowMenu("help") ],
|
||||
[ _("About"), ShowMenu("about") ],
|
||||
[ _("Gallery"), ShowMenu("cg_gallery") ],
|
||||
*([(_("Chapter Select{#MainMenu}"), Start("chapter_select"))] if persistent.enable_chapter_select else []),
|
||||
[ _("Mods"), ShowMenu("mod_menu") ],
|
||||
[ _("Return"), ShowMenu("main_menu") ]
|
||||
] )
|
||||
@@ -1287,12 +1225,13 @@ screen help():
|
||||
|
||||
style_prefix "main_menu"
|
||||
|
||||
add gui.main_menu_background
|
||||
add gui.extras_submenu_panel
|
||||
use main_menu_background
|
||||
|
||||
if persistent.use_epilogue_menu:
|
||||
add "gui/overlay/extras_submenu_panel_epilogue.png"
|
||||
else:
|
||||
add gui.extras_submenu_panel
|
||||
|
||||
## This empty frame darkens the main menu.
|
||||
frame:
|
||||
pass
|
||||
|
||||
default device = "keyboard"
|
||||
|
||||
@@ -1361,6 +1300,10 @@ screen keyboard_help():
|
||||
label _("Page Down")
|
||||
text _("Rolls forward to later dialogue.")
|
||||
|
||||
hbox:
|
||||
label _("Backspace")
|
||||
text _("Hides mod details. Shows mod errors if there is any.")
|
||||
|
||||
hbox:
|
||||
label "H"
|
||||
text _("Hides the user interface.")
|
||||
@@ -1389,7 +1332,7 @@ screen mouse_help():
|
||||
text _("Accesses the game menu. Also escapes the Gallery.")
|
||||
|
||||
hbox:
|
||||
label _("Mouse Wheel Up\nClick Rollback Side")
|
||||
label _("Mouse Wheel Up")
|
||||
text _("Rolls back to earlier dialogue.")
|
||||
|
||||
hbox:
|
||||
@@ -1411,13 +1354,12 @@ screen gamepad_help():
|
||||
label _("Right Shoulder")
|
||||
text _("Rolls forward to later dialogue.")
|
||||
|
||||
|
||||
hbox:
|
||||
label _("D-Pad, Sticks")
|
||||
text _("Navigate the interface.")
|
||||
|
||||
hbox:
|
||||
label _("Start, Guide")
|
||||
label _("Start, Guide, B/Right Button")
|
||||
text _("Accesses the game menu.")
|
||||
|
||||
hbox:
|
||||
@@ -1438,7 +1380,7 @@ style help_button:
|
||||
xmargin 12
|
||||
|
||||
style help_button_text:
|
||||
properties gui.button_text_properties("help_button")
|
||||
properties gui.text_properties("help_button")
|
||||
|
||||
style help_label:
|
||||
xsize 375
|
||||
@@ -1507,14 +1449,14 @@ style confirm_frame:
|
||||
yalign .5
|
||||
|
||||
style confirm_prompt_text:
|
||||
text_align 0.5
|
||||
textalign 0.5
|
||||
layout "subtitle"
|
||||
|
||||
style confirm_button:
|
||||
properties gui.button_properties("confirm_button")
|
||||
|
||||
style confirm_button_text:
|
||||
properties gui.button_text_properties("confirm_button")
|
||||
properties gui.text_properties("confirm_button")
|
||||
|
||||
|
||||
## Skip indicator screen #######################################################
|
||||
@@ -1701,7 +1643,7 @@ style nvl_label:
|
||||
yanchor 0.0
|
||||
xsize gui.nvl_name_width
|
||||
min_width gui.nvl_name_width
|
||||
text_align gui.nvl_name_xalign
|
||||
textalign gui.nvl_name_xalign
|
||||
|
||||
style nvl_dialogue:
|
||||
xpos gui.nvl_text_xpos
|
||||
@@ -1709,7 +1651,7 @@ style nvl_dialogue:
|
||||
ypos gui.nvl_text_ypos
|
||||
xsize gui.nvl_text_width
|
||||
min_width gui.nvl_text_width
|
||||
text_align gui.nvl_text_xalign
|
||||
textalign gui.nvl_text_xalign
|
||||
layout ("subtitle" if gui.nvl_text_xalign else "tex")
|
||||
|
||||
style nvl_thought:
|
||||
@@ -1718,7 +1660,7 @@ style nvl_thought:
|
||||
ypos gui.nvl_thought_ypos
|
||||
xsize gui.nvl_thought_width
|
||||
min_width gui.nvl_thought_width
|
||||
text_align gui.nvl_thought_xalign
|
||||
textalign gui.nvl_thought_xalign
|
||||
layout ("subtitle" if gui.nvl_text_xalign else "tex")
|
||||
|
||||
style nvl_button:
|
||||
@@ -1730,6 +1672,94 @@ style nvl_button_text:
|
||||
properties gui.button_text_properties("nvl_button")
|
||||
|
||||
|
||||
## Bubble screen ###############################################################
|
||||
##
|
||||
## The bubble screen is used to display dialogue to the player when using speech
|
||||
## bubbles. The bubble screen takes the same parameters as the say screen, must
|
||||
## create a displayable with the id of "what", and can create displayables with
|
||||
## the "namebox", "who", and "window" ids.
|
||||
##
|
||||
## https://www.renpy.org/doc/html/bubble.html#bubble-screen
|
||||
|
||||
screen bubble(who, what):
|
||||
style_prefix "bubble"
|
||||
|
||||
window:
|
||||
id "window"
|
||||
|
||||
if who is not None:
|
||||
|
||||
window:
|
||||
id "namebox"
|
||||
style "bubble_namebox"
|
||||
|
||||
text who:
|
||||
id "who"
|
||||
|
||||
text what:
|
||||
id "what"
|
||||
|
||||
style bubble_window is empty
|
||||
style bubble_namebox is empty
|
||||
style bubble_who is default
|
||||
style bubble_what is default
|
||||
|
||||
style bubble_window:
|
||||
xpadding 30
|
||||
top_padding 5
|
||||
bottom_padding 5
|
||||
|
||||
style bubble_namebox:
|
||||
xalign 0.5
|
||||
|
||||
style bubble_who:
|
||||
xalign 0.5
|
||||
textalign 0.5
|
||||
color "#000"
|
||||
|
||||
style bubble_what:
|
||||
align (0.5, 0.5)
|
||||
text_align 0.5
|
||||
layout "subtitle"
|
||||
color "#000"
|
||||
|
||||
define bubble.frame = Frame("gui/bubble.png", 55, 55, 55, 95)
|
||||
define bubble.thoughtframe = Frame("gui/thoughtbubble.png", 55, 55, 55, 55)
|
||||
|
||||
define bubble.properties = {
|
||||
"bottom_left" : {
|
||||
"window_background" : Transform(bubble.frame, xzoom=1, yzoom=1),
|
||||
"window_bottom_padding" : 27,
|
||||
},
|
||||
|
||||
"bottom_right" : {
|
||||
"window_background" : Transform(bubble.frame, xzoom=-1, yzoom=1),
|
||||
"window_bottom_padding" : 27,
|
||||
},
|
||||
|
||||
"top_left" : {
|
||||
"window_background" : Transform(bubble.frame, xzoom=1, yzoom=-1),
|
||||
"window_top_padding" : 27,
|
||||
},
|
||||
|
||||
"top_right" : {
|
||||
"window_background" : Transform(bubble.frame, xzoom=-1, yzoom=-1),
|
||||
"window_top_padding" : 27,
|
||||
},
|
||||
|
||||
"thought" : {
|
||||
"window_background" : bubble.thoughtframe,
|
||||
}
|
||||
}
|
||||
|
||||
define bubble.expand_area = {
|
||||
"bottom_left" : (0, 0, 0, 22),
|
||||
"bottom_right" : (0, 0, 0, 22),
|
||||
"top_left" : (0, 22, 0, 0),
|
||||
"top_right" : (0, 22, 0, 0),
|
||||
"thought" : (0, 0, 0, 0),
|
||||
}
|
||||
|
||||
|
||||
################################################################################
|
||||
## Mobile Variants
|
||||
@@ -1764,35 +1794,12 @@ screen quick_menu():
|
||||
yalign 0.975
|
||||
use quick_buttons("gui/button/uioptionbuttons/template_idle.png", \
|
||||
[ \
|
||||
[ _("Back"), Rollback() ], \
|
||||
[ _("Skip"), Skip() ], \
|
||||
[ _("Auto"), Preference("auto-forward", "toggle") ], \
|
||||
[ _("Menu"), ShowMenu() ] \
|
||||
[ _("Back"), Rollback(), NullAction()], \
|
||||
[ _("Skip"), Skip(), Skip(fast=True, confirm=True) ], \
|
||||
[ _("Auto"), Preference("auto-forward", "toggle"), NullAction() ], \
|
||||
[ _("Menu"), ShowMenu(), NullAction() ] \
|
||||
] )
|
||||
|
||||
screen extrasnavigation(): #Updates are removed (not even supported by Ren'Py)
|
||||
variant "mobile"
|
||||
vbox:
|
||||
xpos 1940
|
||||
yalign 0.03
|
||||
|
||||
if persistent.splashtype == 1:
|
||||
add "gui/sneedgame.png"
|
||||
else:
|
||||
add "gui/snootgame.png"
|
||||
vbox:
|
||||
spacing 25
|
||||
xpos 1885
|
||||
yalign 0.9
|
||||
use main_menu_buttons("gui/button/menubuttons/template_idle.png",
|
||||
[
|
||||
[ _("Help"), ShowMenu("help") ],
|
||||
[ _("About"), ShowMenu("about") ],
|
||||
[ _("Gallery"), ShowMenu("cg_gallery") ],
|
||||
[ _("Mods"), ShowMenu("mod_menu") ],
|
||||
[ _("Return"), ShowMenu("main_menu") ]
|
||||
] )
|
||||
|
||||
style radio_button:
|
||||
variant "mobile"
|
||||
foreground "gui/phone/button/radio_[prefix_]foreground.png"
|
||||
|
||||
308
game/script.rpy
@@ -14,43 +14,21 @@
|
||||
#Why yes all my code was formerly in one massive file called "script" thats 28k lines long, how could you tell?
|
||||
#Licensed under the GNU AGPL v3, for more information check snootgame.xyz or the LICENSE file that should have came with this work.
|
||||
|
||||
init -1 python:
|
||||
# Modding Support variables
|
||||
# All mod rpy files must run a small init python script
|
||||
mod_dir = "mods/"
|
||||
mod_menu_access = []
|
||||
|
||||
init python:
|
||||
|
||||
import webbrowser # This is for the ch2 "look the link up" choice
|
||||
import random
|
||||
import webbrowser
|
||||
#function for insult layers
|
||||
def showCG():
|
||||
files = ["text1", "text2", "text3", "text4", "text5", "text6", "text7", "text8", "text9"]
|
||||
length = len(files)
|
||||
picked = random.randint(0,length - 1)
|
||||
fileName = files[picked]
|
||||
renpy.show(fileName, at_list=[randPosition])
|
||||
|
||||
# extra music channel so we can do crossfade instead of fadeout followed by fadein
|
||||
# TODO: function for stopping both channels with optional fadeout so we don't have to keep track of which channel is playing
|
||||
renpy.music.register_channel("music1","music",True,tight=True)
|
||||
renpy.music.register_channel("music2","music",True,tight=True)
|
||||
|
||||
# allows playing looped ambience alongside music
|
||||
renpy.music.register_channel("ambient","sfx",True,tight=True)
|
||||
renpy.music.register_channel("ambient1","sfx",True,tight=True)
|
||||
renpy.music.register_channel("ambient2","sfx",True,tight=True)
|
||||
renpy.music.register_channel("ambient3","sfx",True,tight=True)
|
||||
if persistent.scroll == True:
|
||||
config.keymap['dismiss'].append('mousedown_4')
|
||||
elif persistent.scroll == None:
|
||||
persistent.scroll = False
|
||||
|
||||
if persistent.lewd == None:
|
||||
persistent.lewd = False
|
||||
|
||||
if persistent.autoup == None:
|
||||
persistent.autoup = False
|
||||
|
||||
# Set vars for bonus chapter completion
|
||||
if persistent.bonus_chapters == None:
|
||||
if renpy.seen_image("big ending"): #for returning players
|
||||
persistent.bonus_chapters = 0b111111111
|
||||
@@ -59,272 +37,40 @@ init python:
|
||||
persistent.bonus_chapters = 0b0
|
||||
persistent.old_bonus_chapters = 0b0
|
||||
|
||||
# Randomizes the placement of choice boxes when a choice menu appears
|
||||
def randomize_choices(choices):
|
||||
# fine for size of 2
|
||||
if (renpy.random.randint(0, 1)):
|
||||
choices.reverse()
|
||||
return choices
|
||||
|
||||
pass
|
||||
# For people upgrading to patch 11 and onwards, a fix to make sure the fang tail movie is unlocked.
|
||||
if renpy.seen_image("fang tail"):
|
||||
renpy.mark_image_seen("fang_tail_movie")
|
||||
|
||||
transform randPosition:
|
||||
alpha 0.0
|
||||
xalign random.uniform(0.2,0.8)
|
||||
yalign random.uniform(0.2,0.8)
|
||||
linear 0.6 alpha 1.0
|
||||
linear 1.0 alpha 0.0
|
||||
# Determine the splash type for the Snoot game logo
|
||||
persistent.splashtype = random.randint(0,2000 - 1)
|
||||
|
||||
|
||||
#python:
|
||||
# def Walking( name ):
|
||||
# show name:
|
||||
# xalign 0.2 yalign 0.25
|
||||
# ease 1.0 yalign 0.0
|
||||
# ease 1.0 yalign 0.25
|
||||
# repeat
|
||||
|
||||
|
||||
#layeredimage aquariumexhibit:
|
||||
#group animals:
|
||||
# attribute babyTurtle:
|
||||
# attribute octo:
|
||||
# attribute
|
||||
# attribute
|
||||
# attribute
|
||||
# attribute
|
||||
|
||||
#layeredimage aquarium
|
||||
#group kids:
|
||||
# attribute wkids:
|
||||
# "smolpatrol.webp"
|
||||
|
||||
#layeredimage anon:
|
||||
# group face:
|
||||
# attribute neutralFace default:
|
||||
# "anonb1f1.webp"
|
||||
# attribute happyFace:
|
||||
# "anonhappyface.webp"
|
||||
# attribute flipNeutralFace:
|
||||
# "flipanonb1f1.webp"
|
||||
# attribute flipHappyFace:
|
||||
# "flipanonhappyface.webp"
|
||||
# group body:
|
||||
# attribute neutralBody default:
|
||||
# "anonspriteneutral.webp"
|
||||
# attribute thumbsUp:
|
||||
# "anonspritethumbsup.webp"
|
||||
# attribute flipThumbsUp:
|
||||
# "flipanonspritethumbsup.webp"
|
||||
# attribute:
|
||||
# "flipanonspriteneutral.webp"
|
||||
# attribute monkey:
|
||||
# "monkeyanon.webp"
|
||||
# group holding:
|
||||
# attribute guitar:
|
||||
# "guitar.webp"
|
||||
|
||||
# Click-to-continue icons / animations
|
||||
# TODO: settle on a position/animation that people like
|
||||
|
||||
|
||||
#Raw Image & kwargs for long textboxes
|
||||
define long_textbox_img = Image("gui/textbox_long.png", xalign=0.5, yalign=1.0)
|
||||
define long_textbox = { "window_background": long_textbox_img, 'namebox_style': "namebox_large" }
|
||||
|
||||
#Characters
|
||||
define base = Character (ctc="ctc_end_marker", ctc_pause="ctc_mid_marker", ctc_timedpause=Null(), ctc_position="nestled") # try to remember some of the basics of CTC
|
||||
define narrator = Character(kind=base)
|
||||
define A = Character (_('Anon'), base, color="#36E12D", who_outlines=[(gui.name_text_thickness, '#0C300A')]) # Light Green
|
||||
define F = Character (_('Fang'), base, color="#B4D4CE", who_outlines=[(gui.name_text_thickness, '#0F3930')]) # Light Cyan
|
||||
define Lucy = Character (_('Lucy'), base, color="#B4D4CE", who_outlines=[(gui.name_text_thickness, '#0F3930')]) # Light Cyan
|
||||
define Ro = Character (_('Rosa'), base, color="#FE712B", who_outlines=[(gui.name_text_thickness, '#54230F')]) # Red-Orange
|
||||
define St = Character (_('Stella'), base, color="#D5FFAE", who_outlines=[(gui.name_text_thickness, '#294211')]) # Light Green
|
||||
define N = Character (_('Naomi'), base, color="#FDD2C1", who_outlines=[(gui.name_text_thickness, '#462628')]) # Peach
|
||||
define Nas = Character (_('Naser'), base, color="#FFB561", who_outlines=[(gui.name_text_thickness, '#512322')]) # Orange
|
||||
define T = Character (_('Trish'), base, color="#B675E6", who_outlines=[(gui.name_text_thickness, '#3A0C5D')]) # Purple
|
||||
define Attendant = Character (_('Attendant'), base, color="#5BF0F8", who_outlines=[(gui.name_text_thickness, '#121C68')]) # Aqua
|
||||
define Sp = Character (_('Spears'), base, color="#C7C7C7", who_outlines=[(gui.name_text_thickness, '#272727')]) # Light Grey
|
||||
define Re = Character (_('Reed'), base, color="#ED4C5B", who_outlines=[(gui.name_text_thickness, '#421014')]) # Bright Red
|
||||
define D = Character (_('Driver'), base, color="#FFECBC", who_outlines=[(gui.name_text_thickness, '#563010')]) # Yellow-Orange
|
||||
|
||||
define FM = Character (_("Fang's Mom"), base, color="#FFD8F6", who_outlines=[(gui.name_text_thickness, '#521947')]) # Bright Pink
|
||||
define FD = Character (_("Fang's Dad"), base, color="#D8A09A", who_outlines=[(gui.name_text_thickness, '#461B1F')]) # Desaturated Orange
|
||||
|
||||
define LM = Character (_("Lucy's Mom"), base, color="#FFD8F6", who_outlines=[(gui.name_text_thickness, '#521947')]) # Bright Pink
|
||||
define LD = Character (_("Lucy's Dad"), base, color="#D8A09A", who_outlines=[(gui.name_text_thickness, '#461B1F')]) # Desaturated Orange
|
||||
|
||||
define Tsuki = Character (_('Mr. Tsuki'), base, color="#A7F2A2", who_outlines=[(gui.name_text_thickness, '#471054')]) # Pear Green
|
||||
define unknown = Character (_('(???)'), base, color="#FFF", who_outlines=[(gui.name_text_thickness, '#000')]) # White
|
||||
define jingo = Character (_('Mr. Jingo'), base, color="#CD8283", who_outlines=[(gui.name_text_thickness, '#0F0D49')]) # Desaturated Red
|
||||
define MaitD = Character (_('Maitre D'), base, color="#AF9EFF", who_outlines=[(gui.name_text_thickness, '#241630')]) # Cobalt Blue
|
||||
define Moe = Character(_('Moe'), base, color="#A5BEED", who_outlines=[(gui.name_text_thickness, '#1F253B')]) # Desaturated Blue
|
||||
define Vince = Character (_('Vince'), base, color="#FFECBC", who_outlines=[(gui.name_text_thickness, '#563010')]) # Yellow-Orange
|
||||
define Waitress = Character (_('Waitress'), base, color="#F691C8", who_outlines=[(gui.name_text_thickness, '#512040')]) # Pink
|
||||
define Riley = Character (_('Riley'), base, color="#B675E6", who_outlines=[(gui.name_text_thickness, '#1F0632')]) # TODO
|
||||
define Tana = Character (_('Tana'), base, color="#B675E6", who_outlines=[(gui.name_text_thickness, '#1F0632')]) # TODO
|
||||
define Trevor = Character (_('Trevor'), base, color="#B675E6", who_outlines=[(gui.name_text_thickness, '#1F0632')]) # TODO
|
||||
#long TB chars
|
||||
define AnonAndFang = Character(_('Anon and Fang'), base, color="72DFA8", who_outlines=[(gui.name_text_thickness, '#113623')]) # Cyan
|
||||
define SV = Character (_('Street Vendor'), base, color="#F8E120", who_outlines=[(gui.name_text_thickness, '#58260C')]) # Yellow
|
||||
define carl = Character ('Mr. Carldewskii', base, color="#EECB99", who_outlines=[(gui.name_text_thickness, '#082337')]) #Puke Orange
|
||||
define Drf = Character ('Dr. Fernsworth', base, color="#DCEEF5", who_outlines=[(gui.name_text_thickness, '#253354')]) #Yellow-Orange
|
||||
define FRT = Character (_('Fang Reed & Trish'), base, color="#DCBBF7", who_outlines=[(gui.name_text_thickness, '#191C78')]) #Light Purple
|
||||
define FangAndTrish = Character(_('Fang and Trish'), base, color="#42DFA8", who_outlines=[(gui.name_text_thickness, '#183623')])
|
||||
define NaserAndNaomi = Character(_('Naser and Naomi'), base, color="#22DFA8", who_outlines=[(gui.name_text_thickness, '#2036B3')])
|
||||
define TeamMember = Character(_('Team member'), base, color="#D32552", who_outlines=[(gui.name_text_thickness, '#445F42')])
|
||||
define Everyone = Character(_('Everyone'), base, color="#A45489", who_outline=[(gui.name_text_thickness, '#4F5F81')])
|
||||
define Chet = Character(_('Chet'), base, color="#B45411", who_outline=[(gui.name_text_thickness, '#BF5F81')])
|
||||
|
||||
|
||||
#Custom Vars for positions
|
||||
transform scenter:
|
||||
xalign 0.5 yalign 0.0
|
||||
transform sleft:
|
||||
xalign 0.0 yalign 0.0
|
||||
transform sright:
|
||||
xalign 1.0 yalign 0.0
|
||||
|
||||
#Stella
|
||||
transform stcenter:
|
||||
xalign 0.5 yalign 0.1
|
||||
transform stleft:
|
||||
xalign 0.0 yalign 0.1
|
||||
transform stright:
|
||||
xalign 1.0 yalign 0.1
|
||||
|
||||
#Anon
|
||||
transform acenter:
|
||||
xalign 0.5 yalign 0.1
|
||||
transform aleft:
|
||||
xalign 0.0 yalign 0.1
|
||||
transform aright:
|
||||
xalign 1.0 yalign 0.1
|
||||
|
||||
#Naser
|
||||
transform ncenter:
|
||||
xalign 0.6 yalign 0.1
|
||||
transform nleft:
|
||||
xalign -0.2 yalign 0.1
|
||||
transform nright:
|
||||
xalign 1.9 yalign 0.1
|
||||
|
||||
#Fangs mom
|
||||
transform fmcenter:
|
||||
xalign 0.5 yalign 0.1
|
||||
transform fmleft:
|
||||
xalign 0.0 yalign 0.1
|
||||
transform fmright:
|
||||
xalign 1.0 yalign 0.1
|
||||
|
||||
#Trish
|
||||
transform tcenter:
|
||||
xalign 0.5 yalign 0.1
|
||||
transform tleft:
|
||||
xalign 0.0 yalign 0.1
|
||||
transform tright:
|
||||
xalign 1.0 yalign 0.1
|
||||
|
||||
#Reed and other long tailed dinos
|
||||
transform rcenter:
|
||||
xalign 1.2 yalign 0.1
|
||||
transform rleft:
|
||||
xalign -0.2 yalign 0.1
|
||||
transform rright:
|
||||
xalign 1.7 yalign 0.1
|
||||
|
||||
#misc transforms
|
||||
transform shudder:
|
||||
subpixel True
|
||||
around (.5, .5) alignaround (.5, .5) xalign .5 yalign .5
|
||||
rotate 0
|
||||
linear 0.0 rotate -0.75
|
||||
block:
|
||||
linear 0.04 rotate 0.75
|
||||
linear 0.05 rotate -0.75
|
||||
linear 0.07 rotate 0
|
||||
|
||||
transform turnaround:
|
||||
linear 0.1 xzoom -1.0
|
||||
|
||||
transform wiggle:
|
||||
subpixel True
|
||||
block:
|
||||
xpos 0.5 ypos 1.0 xanchor 0.5 yanchor 1.0 zoom 1.02
|
||||
alignaround (.5, .5)
|
||||
linear 10.0 yalign 1.0 clockwise circles 1
|
||||
repeat
|
||||
|
||||
|
||||
transform raymbatransform:
|
||||
xcenter 0.6 ycenter 0.385 zoom 0.5
|
||||
|
||||
# PHONE SCROLLING
|
||||
|
||||
|
||||
transform cursortransform:
|
||||
block:
|
||||
yalign 0.2 xalign 0.60
|
||||
pause .25
|
||||
easein_cubic 1 yalign 0.75 xalign 0.54
|
||||
pause .5
|
||||
repeat
|
||||
|
||||
screen prompt():
|
||||
fixed:
|
||||
add "cursor"
|
||||
|
||||
screen mousedetect():
|
||||
transform: # thanks based nutbuster
|
||||
zoom 0.8
|
||||
rotate 12.5
|
||||
mousearea:
|
||||
ypos -75
|
||||
area(432, 0, 795, 1100)
|
||||
# xalign 0.5 yanchor 0 ypos 0
|
||||
hovered Hide("prompt" )
|
||||
unhovered Show("prompt")
|
||||
|
||||
screen textscroll():
|
||||
timer 2.0 action(Show("mousedetect"), Show("prompt"))
|
||||
|
||||
add Solid("FFF")
|
||||
|
||||
transform:
|
||||
zoom 0.8
|
||||
rotate 12.5
|
||||
viewport:
|
||||
xalign 0.51 yanchor 0 ypos -75 xysize(795, 1150)
|
||||
child_size(795, 7650)
|
||||
draggable True
|
||||
arrowkeys True
|
||||
# edgescroll(400, 800)
|
||||
|
||||
yinitial 1.0
|
||||
|
||||
imagebutton auto "fangbutton%s" xalign 0.53 yalign 0.5:
|
||||
ypos 65+(int(107/2))
|
||||
xsize 284
|
||||
ysize 107
|
||||
action (Hide("mousedetect"), Hide("prompt"), Hide("textscroll", transition=Dissolve(1.0)), Return())
|
||||
add "texts"
|
||||
|
||||
add "fang phone"
|
||||
|
||||
|
||||
# Naser's position when helping Anon get up
|
||||
transform nmidright:
|
||||
xalign 1.5 yalign 0.08
|
||||
|
||||
# Naomi's position when handing the brochure to Anon
|
||||
transform scloserleft:
|
||||
xalign 0.1 yalign 0.0
|
||||
label before_main_menu:
|
||||
# Force users pre-Patch 11 to use english if they were on 'None'
|
||||
if preferences.language == None:
|
||||
$ preferences.language = 'en'
|
||||
|
||||
# Setting this here means we're past reloading scripts, therefore we're not reloading mods
|
||||
$ persistent.reloading_mods = False
|
||||
|
||||
# Call initial language setup screen
|
||||
# languaged_up is set within lang_sel
|
||||
if (persistent.languaged_up is None):
|
||||
$ preferences.set_mixer("ui", config.default_sfx_volume)
|
||||
call screen lang_sel
|
||||
return
|
||||
|
||||
label start:
|
||||
$ fangscore = 0
|
||||
$ anonscore = 0
|
||||
$ tradwife = False
|
||||
$ wingStory = False
|
||||
|
||||
$ toggle_debug()
|
||||
|
||||
pause 1.0
|
||||
call storyline from _call_storyline
|
||||
|
||||
$ renpy.call(chapter_list[chapter_list_index]) # Call first element of the chapter_list array
|
||||
|
||||
@@ -157,7 +157,7 @@ label chapter_1:
|
||||
scene stairs at Pan((553,169), (553, 169), 0) with None # snap here if the player is advancing the dialogue quickly
|
||||
window hide
|
||||
show iris:
|
||||
xalign 0.99 yalign 0.75
|
||||
xalign 0.99 yalign 0.75
|
||||
stop ambient fadeout 4
|
||||
stop ambient1 fadeout 4
|
||||
with Dissolve(3)
|
||||
@@ -1289,9 +1289,9 @@ label chapter_1:
|
||||
|
||||
show naomi neutral flip with dissolve
|
||||
show naser:
|
||||
easein_cubic 0.5 xalign 0.62
|
||||
pause 0.75
|
||||
ease 0.75 xalign 0.4
|
||||
easein_cubic 0.5 xalign 0.62
|
||||
pause 0.75
|
||||
ease 0.75 xalign 0.4
|
||||
pause 2
|
||||
|
||||
"He tears the sandwich in two and hands me the larger half."
|
||||
@@ -1846,9 +1846,9 @@ label chapter_1:
|
||||
window hide
|
||||
$ i = 0
|
||||
while i < 20:
|
||||
$ showCG()
|
||||
pause 1
|
||||
$ i = i + 1
|
||||
$ showCG()
|
||||
pause 1
|
||||
$ i = i + 1
|
||||
|
||||
$ renpy.music.set_volume(0.4, 2, 'ambient')
|
||||
|
||||
@@ -3479,7 +3479,7 @@ label chapter_1:
|
||||
show anon neutral at aleft
|
||||
show naomi neutral flip at sright
|
||||
show naser sad flip behind naomi:
|
||||
xalign 0.7 yalign -0.1
|
||||
xalign 0.7 yalign -0.1
|
||||
with Dissolve(1)
|
||||
pause 0.5
|
||||
|
||||
@@ -3663,4 +3663,4 @@ label chapter_1:
|
||||
window auto
|
||||
pause 1.5
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -550,4 +550,4 @@ label chapter_10:
|
||||
window auto
|
||||
pause 1
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -447,9 +447,11 @@ label chapter_11:
|
||||
#Naser Drama
|
||||
#THIS SECTION IS SCORE DEPENDENT
|
||||
|
||||
# Determine ending and set up ending chapters
|
||||
$ setup_ending(get_ending())
|
||||
|
||||
# Doomer ending skips this segment
|
||||
call get_ending from _call_get_ending
|
||||
if _return == 2:
|
||||
if ending_route_number == 2:
|
||||
stop music fadeout 3
|
||||
pause 2
|
||||
jump lPromAnnouncement
|
||||
@@ -585,13 +587,12 @@ label chapter_11:
|
||||
Nas "Don’t take it the wrong way, but my mind just screamed at me ‘worst case scenario’."
|
||||
pause .5
|
||||
|
||||
call get_ending from _call_get_ending_1
|
||||
if _return == 4:
|
||||
jump lSortingThings # Golden
|
||||
elif _return == 3:
|
||||
jump lMendingThings # Tradwife
|
||||
if ending_route_number == 4: # Golden
|
||||
jump lSortingThings
|
||||
elif ending_route_number == 3: # tradwife
|
||||
jump lMendingThings
|
||||
else:
|
||||
jump lBreakingThings # Shooter
|
||||
jump lBreakingThings # All else fails, go to shooter.
|
||||
|
||||
label lSortingThings:
|
||||
|
||||
@@ -3847,7 +3848,7 @@ label chapter_11:
|
||||
pause .5
|
||||
|
||||
show rosa neutral behind moe:
|
||||
yalign 0.2 xalign 0.0
|
||||
yalign 0.2 xalign 0.0
|
||||
show rosa:
|
||||
easein_back 2 yalign 0.2 xalign 0.9
|
||||
with dissolve
|
||||
@@ -5211,8 +5212,8 @@ label chapter_11:
|
||||
"Fang and I have been together for a month now."
|
||||
pause .5
|
||||
|
||||
call get_ending from _call_get_ending_2
|
||||
if _return == 3: #tradwife
|
||||
|
||||
if ending_route_number == 3: # tradwife
|
||||
|
||||
"Things are going pretty well. When we discount Trish’s weekly attempt to talk with Fang."
|
||||
|
||||
@@ -5245,9 +5246,9 @@ label chapter_11:
|
||||
|
||||
scene classroom
|
||||
show anon neutral:
|
||||
yalign 0.1 xalign 0.2
|
||||
yalign 0.1 xalign 0.2
|
||||
show fang neutral behind anon:
|
||||
yalign 0.0 xalign 0.8
|
||||
yalign 0.0 xalign 0.8
|
||||
with Dissolve(1)
|
||||
pause .5
|
||||
|
||||
@@ -5466,100 +5467,102 @@ label chapter_11:
|
||||
|
||||
"{cps=*.1}...{/cps}"
|
||||
|
||||
call get_ending from _call_get_ending_3
|
||||
if _return != 1: # any route except Shooter
|
||||
# duplicated segment from 11B, 11C and 11D transplanted here
|
||||
window hide
|
||||
window auto
|
||||
pause .5
|
||||
# skip this segment if we're doing ending 1
|
||||
if ending_route_number == 1: #shooter
|
||||
$ next_story_chapter()
|
||||
|
||||
# the following segment makes sense in the context of 11B+11C+11D
|
||||
window hide
|
||||
window auto
|
||||
pause .5
|
||||
|
||||
play music "audio/OST/Appreciating her Company.ogg" fadein 1.0
|
||||
pause .5
|
||||
play music "audio/OST/Appreciating her Company.ogg" fadein 1.0
|
||||
pause .5
|
||||
|
||||
"About fifteen minutes into the assignment, the two of us are just about done."
|
||||
"About fifteen minutes into the assignment, the two of us are just about done."
|
||||
|
||||
"We’re making surprisingly good time."
|
||||
"We’re making surprisingly good time."
|
||||
|
||||
show fang considering with Dissolve(.25)
|
||||
F "Uhm{cps=*.1}...{/cps} and you said that the electrons hold the negative charge, right?"
|
||||
show fang considering with Dissolve(.25)
|
||||
F "Uhm{cps=*.1}...{/cps} and you said that the electrons hold the negative charge, right?"
|
||||
|
||||
A "Yeah, yeah."
|
||||
A "Yeah, yeah."
|
||||
|
||||
show fang unimpressed with Dissolve(.25)
|
||||
F "Can’t imagine when I’d be using this crap in real life."
|
||||
show fang unimpressed with Dissolve(.25)
|
||||
F "Can’t imagine when I’d be using this crap in real life."
|
||||
|
||||
A "You never know, you might shrink one day."
|
||||
A "You never know, you might shrink one day."
|
||||
|
||||
show fang happy with Dissolve(.25)
|
||||
F "Yeah, and you might stop pretending you’re livestreaming on Yousnoot."
|
||||
pause .5
|
||||
show fang happy with Dissolve(.25)
|
||||
F "Yeah, and you might stop pretending you’re livestreaming on Yousnoot."
|
||||
pause .5
|
||||
|
||||
A "As far as you know I might be giving you incorrect answers, you know."
|
||||
A "As far as you know I might be giving you incorrect answers, you know."
|
||||
|
||||
F "Mhm, sure."
|
||||
pause .5
|
||||
F "Mhm, sure."
|
||||
pause .5
|
||||
|
||||
"The teacher is making his rounds checking on the students and gets to our desks."
|
||||
window hide
|
||||
window auto
|
||||
"The teacher is making his rounds checking on the students and gets to our desks."
|
||||
window hide
|
||||
window auto
|
||||
|
||||
show farnsworth:
|
||||
yalign 0.1 xalign 1.6
|
||||
show farnsworth:
|
||||
easein_cubic 1 xalign 1.2
|
||||
with dissolve
|
||||
pause .5
|
||||
show farnsworth:
|
||||
yalign 0.1 xalign 1.6
|
||||
show farnsworth:
|
||||
easein_cubic 1 xalign 1.2
|
||||
with dissolve
|
||||
pause .5
|
||||
|
||||
Drf "Hello, Anon. Fang."
|
||||
Drf "Hello, Anon. Fang."
|
||||
|
||||
Drf "Are you two getting along well?"
|
||||
Drf "Are you two getting along well?"
|
||||
|
||||
AnonAndFang "Yes, Doctor Fernsworth."
|
||||
AnonAndFang "Yes, Doctor Fernsworth."
|
||||
|
||||
Drf "Great to hear."
|
||||
pause .5
|
||||
Drf "Great to hear."
|
||||
pause .5
|
||||
|
||||
Drf "You know, I’m real proud of you two."
|
||||
pause .5
|
||||
Drf "You know, I’m real proud of you two."
|
||||
pause .5
|
||||
|
||||
Drf "I remember at the start of the year you were at each other's throats."
|
||||
Drf "I remember at the start of the year you were at each other's throats."
|
||||
|
||||
Drf "And now look at you!"
|
||||
pause .5
|
||||
Drf "And now look at you!"
|
||||
pause .5
|
||||
|
||||
show anon concerned
|
||||
show fang sad
|
||||
with dissolve
|
||||
"The two of us cringe."
|
||||
pause .5
|
||||
show anon concerned
|
||||
show fang sad
|
||||
with dissolve
|
||||
"The two of us cringe."
|
||||
pause .5
|
||||
|
||||
A "Uhh{cps=*.1}...{/cps} Yeah, thanks."
|
||||
A "Uhh{cps=*.1}...{/cps} Yeah, thanks."
|
||||
|
||||
Drf "At any rate, you two understand the material, right?"
|
||||
Drf "At any rate, you two understand the material, right?"
|
||||
|
||||
show anon happy
|
||||
show fang neutral
|
||||
with dissolve
|
||||
A "Oh yeah, Fang and I are fine."
|
||||
show anon happy
|
||||
show fang neutral
|
||||
with dissolve
|
||||
A "Oh yeah, Fang and I are fine."
|
||||
|
||||
show anon neutral with Dissolve(.25)
|
||||
A "I was just helping them with a few problems."
|
||||
pause .5
|
||||
show anon neutral with Dissolve(.25)
|
||||
A "I was just helping them with a few problems."
|
||||
pause .5
|
||||
|
||||
"Phew, remembered it this time."
|
||||
"Phew, remembered it this time."
|
||||
|
||||
Drf "Good, good."
|
||||
Drf "Good, good."
|
||||
|
||||
Drf "I won’t keep you any longer then."
|
||||
Drf "I won’t keep you any longer then."
|
||||
|
||||
show farnsworth:
|
||||
easeout_cubic 1 xalign 1.6
|
||||
pause .5
|
||||
hide farnsworth with dissolve
|
||||
show farnsworth:
|
||||
easeout_cubic 1 xalign 1.6
|
||||
pause .5
|
||||
hide farnsworth with dissolve
|
||||
|
||||
"Fernsworth meanders to pester the next few students."
|
||||
pause .5
|
||||
"Fernsworth meanders to pester the next few students."
|
||||
pause .5
|
||||
|
||||
A "Anyways, where were we?"
|
||||
A "Anyways, where were we?"
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -158,4 +158,4 @@ label chapter_11A:
|
||||
window auto
|
||||
pause .5
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
@@ -173,4 +173,4 @@ label chapter_11B:
|
||||
window auto
|
||||
pause 1
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
@@ -302,4 +302,4 @@ label chapter_11C:
|
||||
"{cps=*.1}...{/cps}"
|
||||
pause .5
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
@@ -392,4 +392,4 @@ label chapter_11D:
|
||||
"{cps=*.1}...{/cps}"
|
||||
pause .5
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -445,4 +445,4 @@ label chapter_12_5C:
|
||||
window hide
|
||||
window auto
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -443,4 +443,4 @@ label chapter_12_5D:
|
||||
|
||||
F "Oh, Anon, you’re already here!"
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -1034,4 +1034,4 @@ label chapter_12A:
|
||||
window hide
|
||||
window auto
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -591,4 +591,4 @@ label chapter_12B:
|
||||
window auto
|
||||
pause 1
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -901,4 +901,4 @@ label chapter_12C:
|
||||
window auto
|
||||
pause 1
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -781,4 +781,4 @@ label chapter_12D:
|
||||
|
||||
"{cps=*0.1}...{/cps}"
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -56,7 +56,7 @@ label chapter_13A:
|
||||
show naomi prom neutral:
|
||||
yalign 0.0 xalign -0.4
|
||||
show naomi prom neutral:
|
||||
easein_cubic 1 xalign -0.125
|
||||
easein_cubic 1 xalign -0.125
|
||||
with dissolve
|
||||
pause .5
|
||||
|
||||
@@ -690,13 +690,11 @@ label chapter_13A:
|
||||
pause .5
|
||||
|
||||
menu:
|
||||
"Could be worse":
|
||||
"Could be worse":
|
||||
A "Could be worse."
|
||||
|
||||
A "Could be worse."
|
||||
|
||||
"Going great, actually":
|
||||
|
||||
A "Going great, actually."
|
||||
"Going great, actually":
|
||||
A "Going great, actually."
|
||||
|
||||
pause .5
|
||||
Sp "Where’s your date, I thought I saw the two of you enter."
|
||||
@@ -1799,4 +1797,4 @@ label chapter_13A:
|
||||
window auto
|
||||
pause 1
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -1048,4 +1048,4 @@ label chapter_13B:
|
||||
window auto
|
||||
pause 1
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -2539,14 +2539,14 @@ label chapter_13C:
|
||||
easein_cubic 1 xalign 1.85
|
||||
|
||||
show chillicheesefries:
|
||||
rotate 130 xalign 0.5 yalign 0.4 xpos 0.77 ypos 0.425
|
||||
rotate 130 xanchor 0.5 yanchor 0.4 xpos 0.77 ypos 0.425
|
||||
easein_cubic 1 xpos 0.795
|
||||
with None
|
||||
|
||||
show naser rstained surprised
|
||||
hide chillicheesefries
|
||||
show chillicheesefries_hack:
|
||||
rotate 130 xalign 0.5 yalign 0.4 xpos 0.765 ypos 0.425
|
||||
rotate 130 xanchor 0.5 yanchor 0.4 xpos 0.765 ypos 0.425
|
||||
easein_cubic 1 xpos 0.79
|
||||
with dissolve
|
||||
|
||||
@@ -2554,7 +2554,7 @@ label chapter_13C:
|
||||
|
||||
show naser rstained shocked
|
||||
show chillicheesefries:
|
||||
rotate 140 xalign 0.5 yalign 0.4 xpos 0.805 ypos 0.4
|
||||
rotate 140 xanchor 0.5 yanchor 0.4 xpos 0.805 ypos 0.4
|
||||
hide chillicheesefries_hack
|
||||
with Dissolve(.22)
|
||||
|
||||
@@ -2635,7 +2635,7 @@ label chapter_13C:
|
||||
show naser fullystained shocked
|
||||
hide chillicheesefries
|
||||
show chillicheesefries_hack:
|
||||
rotate 140 xalign 0.75 yalign 0.5 xpos 0.905 ypos 0.45
|
||||
rotate 140 xanchor 0.75 yanchor 0.5 xpos 0.905 ypos 0.45
|
||||
easein_cubic 1 xpos 0.93
|
||||
with Dissolve(.22)
|
||||
|
||||
@@ -4604,4 +4604,4 @@ label chapter_13C:
|
||||
|
||||
#end of new stuff
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
@@ -3114,17 +3114,13 @@ label chapter_13D:
|
||||
pause .5
|
||||
|
||||
menu:
|
||||
"Go to college":
|
||||
A "Well... {w=0.3}Spears convinced me to send out a couple application letters for college."
|
||||
|
||||
"Go to college":
|
||||
|
||||
A "Well... {w=0.3}Spears convinced me to send out a couple application letters for college."
|
||||
|
||||
A "I’m thinking of doing something with music{cps=*.1}...{/cps} maybe becoming a sound engineer?"
|
||||
|
||||
"Not certain just yet":
|
||||
A "I’m not sure yet."
|
||||
|
||||
A "I’m thinking of doing something with music{cps=*.1}...{/cps} maybe becoming a sound engineer?"
|
||||
"Not certain just yet":
|
||||
A "I’m not sure yet."
|
||||
|
||||
A "I’m thinking of doing something with music{cps=*.1}...{/cps} maybe becoming a sound engineer?"
|
||||
|
||||
Re "Oh nice, dude! You can be the band’s sound technician when you’re done!"
|
||||
|
||||
@@ -4057,4 +4053,4 @@ label chapter_13D:
|
||||
"{cps=*.1}...{/cps}"
|
||||
pause 0.5
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -1442,4 +1442,5 @@ label chapter_14A:
|
||||
pause 5
|
||||
|
||||
$ renpy.music.set_volume(1, 0, 'ambient')
|
||||
return
|
||||
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -350,4 +350,4 @@ label chapter_14B:
|
||||
scene black with Dissolve(3)
|
||||
pause 2
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -441,7 +441,7 @@ label chapter_14C:
|
||||
pause .5
|
||||
|
||||
show fang:
|
||||
easeout_cubic 1 xalign 1.4
|
||||
easeout_cubic 1 xalign 1.4
|
||||
show fang c happy with dissolve
|
||||
hide fang with dissolve
|
||||
pause 0.5
|
||||
@@ -1014,4 +1014,5 @@ label chapter_14C:
|
||||
pause 1.0
|
||||
stop music
|
||||
$ renpy.music.set_volume(1, 0, 'music')
|
||||
return
|
||||
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -898,4 +898,5 @@ label chapter_14D:
|
||||
pause 16
|
||||
scene black with Dissolve(1.0)
|
||||
pause 1
|
||||
return
|
||||
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -603,7 +603,7 @@ label chapter_2:
|
||||
window auto
|
||||
|
||||
show fang neutral with Dissolve(1):
|
||||
xalign -0.6 yalign 0.0
|
||||
xalign -0.6 yalign 0.0
|
||||
pause .75
|
||||
|
||||
show white:
|
||||
@@ -903,7 +903,7 @@ label chapter_2:
|
||||
pause .5
|
||||
|
||||
show fang sad flip:
|
||||
ease_cubic 1.5 xalign -0.6
|
||||
ease_cubic 1.5 xalign -0.6
|
||||
pause 1.15
|
||||
show fang sad with dissolve
|
||||
pause 1.2
|
||||
@@ -1919,7 +1919,7 @@ label chapter_2:
|
||||
show fang sad:
|
||||
yalign 0 xalign -1
|
||||
show fang sad:
|
||||
easein 1 xalign -0.6
|
||||
easein 1 xalign -0.6
|
||||
with Dissolve(1)
|
||||
pause 1
|
||||
|
||||
@@ -2191,13 +2191,13 @@ label chapter_2:
|
||||
|
||||
scene cafeteria
|
||||
show anon neutral:
|
||||
xalign -0.2 yalign 0.1
|
||||
xalign -0.2 yalign 0.1
|
||||
show reed neutral flip:
|
||||
xalign 0.5 yalign 0.1
|
||||
xalign 0.5 yalign 0.1
|
||||
show fang considering flip:
|
||||
xalign 0.95 yalign 0.0
|
||||
xalign 0.95 yalign 0.0
|
||||
show trish neutral flip:
|
||||
xalign 1.125 yalign 0.0
|
||||
xalign 1.125 yalign 0.0
|
||||
with Dissolve(1)
|
||||
pause .5
|
||||
|
||||
@@ -2274,11 +2274,11 @@ label chapter_2:
|
||||
stop music fadeout 0.02
|
||||
|
||||
show reed shocked flip:
|
||||
easein_quart 1 xalign 0.54
|
||||
easein_quart 1 xalign 0.54
|
||||
show fang surprised flip:
|
||||
easein_quart 1 xalign 0.99
|
||||
easein_quart 1 xalign 0.99
|
||||
show trish surprised flip:
|
||||
easein_quart 1 xalign 1.155
|
||||
easein_quart 1 xalign 1.155
|
||||
pause .5
|
||||
"The three stop in their tracks and look back at me."
|
||||
pause .5
|
||||
@@ -2331,11 +2331,11 @@ label chapter_2:
|
||||
pause .5
|
||||
|
||||
show reed shocked flip:
|
||||
easein_quart 1 xalign 0.65#0.54
|
||||
easein_quart 1 xalign 0.65#0.54
|
||||
show fang surprised flip:
|
||||
easein_quart 1 xalign 1.15#0.99
|
||||
easein_quart 1 xalign 1.15#0.99
|
||||
show trish neutral flip:
|
||||
easein_quart 1 xalign 1.25#1.155
|
||||
easein_quart 1 xalign 1.25#1.155
|
||||
FRT "Ohfuck.{w=.4} Sorry Anon, we gotta bail."
|
||||
|
||||
window hide
|
||||
@@ -2604,4 +2604,4 @@ label chapter_2:
|
||||
"{cps=*.05}...{/cps}"
|
||||
pause .5
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -2291,4 +2291,4 @@ label chapter_3:
|
||||
|
||||
"{cps=*.1}...{/cps}"
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -732,7 +732,7 @@ label chapter_4:
|
||||
show reed king rex behind anon:
|
||||
yalign 0.1 xalign -1.9
|
||||
show reed:
|
||||
easein 1 xalign -1.2
|
||||
easein 1 xalign -1.2
|
||||
with Dissolve(1)
|
||||
pause 1
|
||||
Re "It’ll be fine."
|
||||
@@ -1422,4 +1422,4 @@ label chapter_4:
|
||||
window auto
|
||||
pause .5
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -1,12 +1,3 @@
|
||||
init python:
|
||||
# some stupid bullshit you have to do to get sounds playing in an ATL block
|
||||
def fang_kicks_a_car_workaround_sfx_fuck_renpy(a,b,c):
|
||||
if random.random() > 0.5:
|
||||
renpy.play('audio/effects/carKick1.ogg', channel='audio')
|
||||
else:
|
||||
renpy.play('audio/effects/carKick2.ogg', channel='audio')
|
||||
# renpy.play('audio/effects/carSuspension1.ogg', channel='audio')
|
||||
|
||||
label chapter_5:
|
||||
|
||||
# Gardening Club
|
||||
@@ -551,7 +542,7 @@ label chapter_5:
|
||||
show anon:
|
||||
easein_back 0.5 xalign 0.2
|
||||
|
||||
label movie:
|
||||
label movie: # This unfortunately needs to stay here so compatability with translations is kept
|
||||
play sound 'audio/effects/slapstickPunch.ogg'
|
||||
A "FANG!" with vpunch
|
||||
|
||||
@@ -559,7 +550,8 @@ label chapter_5:
|
||||
|
||||
play ambient 'audio/effects/clipLoop.ogg' fadein 1
|
||||
play ambient1 'audio/effects/outdoorNatureLoop.ogg' fadein 1
|
||||
scene fang tail with Dissolve(1)
|
||||
# scene fang tail with Dissolve(1)
|
||||
show fang_tail_movie with Dissolve(1) # change how the movie is played
|
||||
|
||||
"Through my blurred vision I can make out Fang’s tail, slowly shifting side to side."
|
||||
|
||||
@@ -573,9 +565,9 @@ label chapter_5:
|
||||
|
||||
menu:
|
||||
"Tug Her Tail":
|
||||
pass
|
||||
pass
|
||||
"Tug Her Ankle":
|
||||
pass
|
||||
pass
|
||||
|
||||
pause .5
|
||||
|
||||
@@ -4665,9 +4657,4 @@ label chapter_5:
|
||||
window auto
|
||||
pause 1
|
||||
|
||||
return
|
||||
|
||||
# I'm guessing this is for the gallery?
|
||||
label fang_movie:
|
||||
scene fang tail with fade
|
||||
""
|
||||
$ next_story_chapter()
|
||||
@@ -4677,4 +4677,4 @@ label chapter_6:
|
||||
window auto
|
||||
pause 1
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -80,9 +80,9 @@ label chapter_8:
|
||||
"Knowing better than to look through the ocean of students, I follow my nose to Reed."
|
||||
pause 0.5
|
||||
show reed sunglasses:
|
||||
xalign 0.4 yalign 0.1
|
||||
xalign 0.4 yalign 0.1
|
||||
show trish neutral behind reed:
|
||||
xalign 0.9
|
||||
xalign 0.9
|
||||
with dissolve
|
||||
|
||||
"The fetid raptor was sitting in the very last row with Trish."
|
||||
@@ -335,7 +335,7 @@ label chapter_8:
|
||||
|
||||
show reed happy flip:
|
||||
yalign 0.238
|
||||
easeout_cubic .5 rotate 90 yalign -0.01 ypos 0.5
|
||||
easeout_cubic .5 rotate 90 yanchor -0.01 ypos 0.5
|
||||
pause .15
|
||||
hide reed with Dissolve(.25)
|
||||
play sound 'audio/effects/anonGardenFall.ogg'
|
||||
@@ -622,8 +622,10 @@ label chapter_8:
|
||||
pause .5
|
||||
|
||||
python:
|
||||
choices = [(_('Play The Guitar'), 'lLetFangPlayGuit'),
|
||||
(_('Get to Studying'), 'lGetStartedOnStudy')]
|
||||
choices = [
|
||||
(_('Play The Guitar'), 'lLetFangPlayGuit'),
|
||||
(_('Get to Studying'), 'lGetStartedOnStudy')]
|
||||
|
||||
renpy.jump(renpy.display_menu(randomize_choices(choices)))
|
||||
|
||||
|
||||
@@ -1277,7 +1279,6 @@ label chapter_8:
|
||||
with Dissolve(0.2)
|
||||
|
||||
pause 0.3
|
||||
hide anonfacecloseup
|
||||
|
||||
|
||||
FD "Out. {w=0.3}{b}Now{/b}."
|
||||
@@ -1524,7 +1525,7 @@ label chapter_8:
|
||||
|
||||
"{cps=*.1}...{/cps}"
|
||||
|
||||
if anonscore >= 3 or fangscore >= 3:
|
||||
if (anonscore >= 4 and fangscore >= 4) or ending_route_number == 4:
|
||||
pause 0.5
|
||||
play music 'audio/OST/its_footloose_now.ogg' fadein 1.0
|
||||
|
||||
@@ -1567,7 +1568,7 @@ label chapter_8:
|
||||
window hide
|
||||
window auto
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
label lGetStartedOnStudy:
|
||||
pause 0.5
|
||||
@@ -2156,4 +2157,5 @@ label chapter_8:
|
||||
"{cps=*.1}...{/cps}"
|
||||
window hide
|
||||
window auto
|
||||
return
|
||||
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -1297,7 +1297,7 @@ label chapter_9:
|
||||
jump lGoHomeEarly
|
||||
|
||||
label lWaitForTrishToExit:
|
||||
$ anonscore += 1
|
||||
$ anonscore += 1
|
||||
|
||||
#play music 'audio/OST/fighter.ogg' fadein 1.0
|
||||
A "You worried about her, too?"
|
||||
@@ -2171,4 +2171,4 @@ label chapter_9:
|
||||
window auto
|
||||
pause .5
|
||||
|
||||
return
|
||||
$ next_story_chapter()
|
||||
|
||||
@@ -1041,6 +1041,7 @@ label chapter_x10:
|
||||
window auto
|
||||
pause 0.5
|
||||
|
||||
$ persistent.use_epilogue_menu = True
|
||||
scene big ending with Dissolve(1)
|
||||
scene big blending with Dissolve(1)
|
||||
pause 6
|
||||
|
||||
@@ -397,7 +397,7 @@ label chapter_x7:
|
||||
pause .5
|
||||
show trish happy with dissolve
|
||||
|
||||
#show trish happy behind dimmer_darker at tleft with easeinleft
|
||||
#show trish happy behind dimmer_darker at tleft with easeinleft
|
||||
|
||||
T "Fang! It took a while but Reed’s distracted!"
|
||||
|
||||
|
||||
@@ -13,12 +13,10 @@ init 2 python:
|
||||
CG_PATHS = []
|
||||
#path: folder, name: shows up in gallery, eval: runs eval() on string
|
||||
|
||||
"""
|
||||
Data structure that holds the data for each cg and button
|
||||
item is name, cg is the image definition
|
||||
{ item: str; cg: Displayable; }
|
||||
(reference in this init python, actually used in screens)
|
||||
"""
|
||||
# Data structure that holds the data for each cg and button
|
||||
# item is name, cg is the image definition
|
||||
# { item: str; cg: Displayable; }
|
||||
# (reference in this init python, actually used in screens)
|
||||
|
||||
gallery_dic = {}
|
||||
|
||||
@@ -79,29 +77,32 @@ init 2 python:
|
||||
jsonloadandpop()
|
||||
|
||||
gallery_dic['Animations'] = [{
|
||||
"item": 'fang tail',
|
||||
"item": 'fang_tail_movie',
|
||||
"image": 'images/animations/fang tail thumbnail.webp',
|
||||
"cg": 'images/animations/fang tail thumbnail.webp',
|
||||
}]
|
||||
renpy.image("fang tail", Movie(loop=True,play='images/animations/fang tail.webm')) # Since we are hard-coding might as well.
|
||||
|
||||
pass
|
||||
|
||||
# Bullshit for the scrollbar to reset back to the beggining. Bless the renpy Discord :pray:
|
||||
default adjust = ui.adjustment()
|
||||
|
||||
"""
|
||||
CG Gallery screen - A screen that shows the image gallery
|
||||
Built-in Gallery Object has terrible defaults, so I just wrote my own stuff
|
||||
"""
|
||||
|
||||
# CG Gallery screen - A screen that shows the image gallery
|
||||
# Built-in Gallery Object has terrible defaults, so I just wrote my own stuff
|
||||
|
||||
screen cg_gallery(origin = 'CG'):
|
||||
|
||||
if main_menu:
|
||||
key "game_menu" action ShowMenu("main_menu")
|
||||
|
||||
# Bg for frame
|
||||
add gui.main_menu_background
|
||||
use main_menu_background(False)
|
||||
# Frame
|
||||
add gui.game_menu_background
|
||||
if persistent.use_epilogue_menu:
|
||||
add "gui/game_menu_epilogue.png"
|
||||
else:
|
||||
add gui.game_menu_background
|
||||
|
||||
tag menu
|
||||
|
||||
@@ -162,9 +163,8 @@ screen cg_gallery(origin = 'CG'):
|
||||
for i in range(0, empty_spaces):
|
||||
null height 20
|
||||
|
||||
"""
|
||||
if/else flow control & extra parameters for Buttons
|
||||
"""
|
||||
|
||||
# if/else flow control & extra parameters for Buttons
|
||||
screen flag_button(item, origin):
|
||||
|
||||
$ flag = renpy.seen_image(item['item'])
|
||||
@@ -200,9 +200,8 @@ screen view_movie(item, _origin):
|
||||
[ "Return", _origin ]
|
||||
] )
|
||||
|
||||
"""
|
||||
view_image, Loads the image in fullscreen with viewport control.
|
||||
"""
|
||||
|
||||
# view_image, Loads the image in fullscreen with viewport control.
|
||||
screen view_image(item, _origin):
|
||||
tag menu
|
||||
key "game_menu" action (Hide('view_image'), _origin)
|
||||
@@ -211,7 +210,7 @@ screen view_image(item, _origin):
|
||||
viewport id "vie":
|
||||
#Ren'Py isn't smart enough to not edgescroll while pressed,
|
||||
#so we'll have to disable this for mobile
|
||||
if renpy.variant("pc"):
|
||||
if renpy.variant("pc") and persistent.gallery_edgescroll:
|
||||
edgescroll (300, 1800)
|
||||
draggable True
|
||||
arrowkeys True
|
||||
|
||||
173
game/src/chapter_select.rpy
Normal file
@@ -0,0 +1,173 @@
|
||||
define chapter_tuple = [
|
||||
(_("1. First Day of School"), "chapter_1"),
|
||||
(_("2. Meeting the Band"), "chapter_2"),
|
||||
(_("3. Band Practice"), "chapter_3"),
|
||||
(_("4. Music Class"), "chapter_4"),
|
||||
(_("5. Gardening Club / Heart to Heart"), "chapter_5"), # This is supposed to be split in 2 chapters, but maybe making tons of save files stop working would be too much to ask
|
||||
(_("6. Not a Date"), "chapter_6"),
|
||||
(_("7. Concert Day"), "chapter_7"),
|
||||
(_("8. Study Session"), "chapter_8"),
|
||||
(_("9. VVURM DRAMA"), "chapter_9"),
|
||||
(_("10. Confession"), "chapter_10"),
|
||||
(_("11. Naser drama"), "chapter_11")
|
||||
]
|
||||
|
||||
define ending_1_tuple = [
|
||||
(_("11.5. Announcing a Plan"), "lPromAnnouncement"), # this is supposed to be ch 12 (13, accounting for ch 5), but it somehow got counted as part of 11 internally
|
||||
(_("12. Let's all go to the Museum"), "chapter_12A"),
|
||||
(_("13. Prom is Complicated"), "chapter_12_5D"),
|
||||
(_("14. Bowling for Volcano High"), "chapter_14A")
|
||||
]
|
||||
|
||||
define ending_2_tuple = [
|
||||
(_("11.5. Announcing Nothing Important"), "lPromAnnouncement"),
|
||||
(_("12. Let's all go to a Concert"), "chapter_12B"),
|
||||
(_("13. Prom is For Suckers"), "chapter_13B"),
|
||||
(_("14. Anon and the Infinite Sadness"), "chapter_14B")
|
||||
]
|
||||
|
||||
define ending_3_tuple = [
|
||||
(_("11.5. Announcing a Date"), "lPromAnnouncement"),
|
||||
(_("12. Let's all go Camping"), "chapter_12C"),
|
||||
(_("13. Prom is Surprising"), "chapter_12_5C"),
|
||||
(_("14. Volcano Highschool Musical"), "chapter_14C")
|
||||
]
|
||||
|
||||
define ending_4_tuple = [
|
||||
(_("11.5. Announcing a Show"), "lPromAnnouncement"),
|
||||
(_("12. Let's all go to the Aquarium"), "chapter_12D"),
|
||||
(_("13. Prom is Memorable"), "chapter_12_5D"),
|
||||
(_("14. Fast Times at Volcano High"), "chapter_14D")
|
||||
]
|
||||
|
||||
|
||||
label chapter_select:
|
||||
$ quick_menu = False # Hides bottom quick menu UI
|
||||
|
||||
stop ambient
|
||||
stop ambient1
|
||||
stop ambient2
|
||||
stop ambient3
|
||||
stop sound
|
||||
stop music
|
||||
stop music1
|
||||
stop music2
|
||||
scene black
|
||||
|
||||
camera:
|
||||
yanchor 0.0 xanchor 0.0 rotate None zoom 1.0 xpos 0.0 ypos 0.0
|
||||
matrixcolor None
|
||||
|
||||
with Dissolve(0.25)
|
||||
|
||||
jump chapter_select_go_back # Technically we don't need to explicitly jump to the label just below here, but doing so anyway for clarity
|
||||
|
||||
label chapter_select_go_back:
|
||||
|
||||
# Reset story vars. Not that it terribly matters, but just in case it avoids bugs.
|
||||
python:
|
||||
anonscore = 0
|
||||
fangscore = 0
|
||||
wingStory = False
|
||||
|
||||
chapter_list = base_chapter_list.copy()
|
||||
chapter_list_index = 0
|
||||
chapter_list_length = get_chapter_list_length()
|
||||
ending_route_number = None
|
||||
ending_chapters_determined = False
|
||||
current_chapter = chapter_list[chapter_list_index]
|
||||
|
||||
menu:
|
||||
"What ending do you want to lock to?"
|
||||
|
||||
"Ending 1":
|
||||
$ ending_route_number = 1
|
||||
"Ending 2":
|
||||
$ ending_route_number = 2
|
||||
"Ending 3":
|
||||
$ ending_route_number = 3
|
||||
"Ending 4":
|
||||
$ ending_route_number = 4
|
||||
"Exit to main menu":
|
||||
scene black with Dissolve(0.25)
|
||||
return
|
||||
|
||||
window auto hide
|
||||
|
||||
$ chapter_select()
|
||||
|
||||
|
||||
init python:
|
||||
|
||||
# Some of this would be much easier to do if we could just reorganize how the chapters are laid out, but breaking translations is way more of a hassle to fix
|
||||
|
||||
def chapter_select():
|
||||
global current_chapter, quick_menu, ending_route_number, chapter_list_index, chapter_list, ending_chapters_determined, chapter_list_length
|
||||
|
||||
selected_label = display_chapter_choices() # Returns a label of the chapter to jump to
|
||||
|
||||
setup_ending(ending_route_number) # Add ending chapters to chapter control list
|
||||
|
||||
# Find the index position of the selected chapter
|
||||
try:
|
||||
chapter_list_index = chapter_list.index(selected_label)
|
||||
except ValueError: # This crashes the game otherwise since it wouldn't find the correct chapter
|
||||
|
||||
# Make an exception for the 11A/B/C/D chapters, since we're technically supposed to start at the lPromAnnouncement label
|
||||
# Stank as fuck
|
||||
if selected_label == "lPromAnnouncement":
|
||||
chapter_list_index = 10
|
||||
current_chapter = "chapter_11"
|
||||
|
||||
toggle_debug()
|
||||
quick_menu = True
|
||||
|
||||
renpy.call("lPromAnnouncement")
|
||||
else:
|
||||
print("No such chapter exists!")
|
||||
MainMenu(confirm=False) () # Exits to the main menu
|
||||
|
||||
current_chapter = selected_label
|
||||
|
||||
# Start playing the game
|
||||
toggle_debug()
|
||||
quick_menu = True # Restores the bottom quick menu UI
|
||||
|
||||
renpy.call(current_chapter)
|
||||
|
||||
def display_chapter_choices():
|
||||
# Vars for displaying the choices
|
||||
ending_tuples = {
|
||||
1: ending_1_tuple,
|
||||
2: ending_2_tuple,
|
||||
3: ending_3_tuple,
|
||||
4: ending_4_tuple
|
||||
}
|
||||
|
||||
final_chapter_tuple = chapter_tuple + ending_tuples[ending_route_number] # Chapter list to select from
|
||||
|
||||
current_page = 0
|
||||
chapters_per_page = 6
|
||||
|
||||
# The range of choices to display
|
||||
start_index = 0
|
||||
end_index = chapters_per_page
|
||||
|
||||
while True:
|
||||
# Displays the choices
|
||||
selected_label = renpy.display_menu(final_chapter_tuple[start_index:end_index] + [(_("Next Page"), "chapter_select_next_page"), (_("Go Back"), "chapter_select_go_back")])
|
||||
|
||||
if selected_label == "chapter_select_next_page":
|
||||
# If we're at the last page, wrap around to the first
|
||||
current_page = 0 if end_index == len(final_chapter_tuple) else (current_page + 1)
|
||||
|
||||
start_index = chapters_per_page * current_page
|
||||
end_index = min(start_index + chapters_per_page, len(final_chapter_tuple))
|
||||
|
||||
# Exit to ending selection
|
||||
elif selected_label == "chapter_select_go_back":
|
||||
renpy.jump("chapter_select_go_back")
|
||||
|
||||
# We've selected a chapter
|
||||
else:
|
||||
return selected_label
|
||||
31
game/src/chapter_variables.rpy
Normal file
@@ -0,0 +1,31 @@
|
||||
# Store the general chapters inside an array for easy manipulation
|
||||
define base_chapter_list = [
|
||||
"chapter_1", "chapter_2", "chapter_3", "chapter_4", "chapter_5",
|
||||
"chapter_6", "chapter_7", "chapter_8", "chapter_9", "chapter_10", "chapter_11"
|
||||
]
|
||||
|
||||
define ending_routes = {
|
||||
4: ["chapter_11D", "chapter_12D", "chapter_12_5D", "chapter_13D", "chapter_14D"],
|
||||
3: ["chapter_11C", "chapter_12C", "chapter_12_5C", "chapter_13C", "chapter_14C"],
|
||||
2: ["chapter_11B", "chapter_12B", "chapter_13B", "chapter_14B"],
|
||||
1: ["chapter_11A", "chapter_12A", "chapter_12_5D", "chapter_13A", "chapter_14A"]
|
||||
}
|
||||
|
||||
# The working list the game references to determine the chapters to use. Ending chapters are added to this list when determined.
|
||||
default chapter_list = base_chapter_list.copy()
|
||||
|
||||
# Default vars reset when a new game starts, so no biggie.
|
||||
|
||||
# Anon/Fang
|
||||
default anonscore = 0
|
||||
default fangscore = 0
|
||||
default wingStory = False
|
||||
|
||||
# Chapter variables
|
||||
default chapter_list_length = get_chapter_list_length()
|
||||
default chapter_list_index = 0 # Index number for the current position of the chapter_list array
|
||||
default current_chapter = chapter_list[chapter_list_index] # Store the name of the label as a string
|
||||
|
||||
# What ending we're on
|
||||
default ending_route_number = None # A value of None signals to get_ending() to determine the value based off anon/fang scores when it is called
|
||||
default ending_chapters_determined = False
|
||||
@@ -95,6 +95,11 @@ init 999 python:
|
||||
'Man_of_Krieg',
|
||||
'ReD',
|
||||
],
|
||||
_('Translators (Italian):'): [
|
||||
'Dsatta',
|
||||
'rc_05',
|
||||
'Anon_theFox',
|
||||
],
|
||||
_('Proofreaders (Spanish):'): [
|
||||
'ElBan Anón',
|
||||
'GMAnon'
|
||||
@@ -105,6 +110,10 @@ init 999 python:
|
||||
'YtkaGen',
|
||||
'DatFeelFrog'
|
||||
],
|
||||
_('Proofreaders (Italian):'): [
|
||||
'Solidus333',
|
||||
'Dsatta',
|
||||
],
|
||||
_('Asset help (Spanish):'): [
|
||||
'Arkiangelo Anon'
|
||||
],
|
||||
@@ -112,6 +121,12 @@ init 999 python:
|
||||
'Gexahord',
|
||||
'YtkaGen',
|
||||
'2ch Anon'
|
||||
],
|
||||
_('Asset help (Italian):'): [
|
||||
'Dsatta',
|
||||
],
|
||||
_('Promo Art (Italian):'): [
|
||||
'Kaprakaz',
|
||||
]
|
||||
}
|
||||
|
||||
@@ -165,7 +180,7 @@ init 999 python:
|
||||
tgrid.append(Null())
|
||||
pass
|
||||
|
||||
tgrid = Grid(TL_WIDTH, TL_HEIGHT, *tgrid)
|
||||
tgrid = Grid(TL_WIDTH, TL_HEIGHT, *tgrid, xspacing=40) #helps with longer translation names
|
||||
|
||||
textlist.append(tgrid)
|
||||
textlist.append(Null(1, 16*12)) #check
|
||||
@@ -208,43 +223,50 @@ label test_credits:
|
||||
|
||||
|
||||
# Credits definitions moved here so everything that needs to be changed is is one place.
|
||||
|
||||
#
|
||||
# Anytime the credits changes to include more translators, you're just going to have to guess what the correct
|
||||
# value to offset everything is again. Mainly concerning values that control the panning destination of credits text,
|
||||
# and the height of the credits text itself
|
||||
# value to offset everything is again. You only need to concern yourself with the panning_stop and panning_duration variable
|
||||
#
|
||||
# My recommendation is to imagine a square on top of the "T" in "THE END"
|
||||
# The square is as long as one of those characters, and the top of the square should touch the top of the screen
|
||||
# when the credits stop scrolling
|
||||
#
|
||||
# Someone please come up with an exact formula pls
|
||||
## i would but i blame the lack access to basic text tools, like i can't figure out the kerning or the rect/AABB of a line?
|
||||
|
||||
# Remember, ending sketch is always +550 of when the Pan stops
|
||||
init python:
|
||||
# Note: Measuring in pixels
|
||||
panning_stop = 13290 # How far the panning will go down
|
||||
panning_stop_bg = 8100 # How far the background images will pan, to create the parallax effect (I can't believe cuckedmanon didn't like this!)
|
||||
panning_duration = 67 # How long in seconds
|
||||
credits_img_offset = panning_stop + 550 # Distance away from panning_stop where the image will render
|
||||
credits_img_boundary = credits_img_offset + 590 # The offset + the height of the credits image file
|
||||
|
||||
image credits_coverup:
|
||||
"black"
|
||||
crop (0, 0, 1920, 1080)
|
||||
|
||||
image b_credits_text = Composite(
|
||||
(1920, 13235),
|
||||
(1920, credits_img_boundary),
|
||||
(0, 390), "credits_hbox",
|
||||
(0, 12705), "b_sketch"
|
||||
(0, credits_img_offset), "b_sketch"
|
||||
)
|
||||
image c_credits_text = Composite(
|
||||
(1920, 13235),
|
||||
(1920, credits_img_boundary),
|
||||
(0, 390), "credits_hbox",
|
||||
(0, 12705), "c_sketch"
|
||||
(0, credits_img_offset), "c_sketch"
|
||||
)
|
||||
image d_credits_text = Composite(
|
||||
(1920, 13235),
|
||||
(1920, credits_img_boundary),
|
||||
(0, 390), "credits_hbox",
|
||||
(0, 12705), "d_sketch"
|
||||
(0, credits_img_offset), "d_sketch"
|
||||
)
|
||||
|
||||
|
||||
label lending:
|
||||
call get_ending from _call_get_ending_4
|
||||
if _return == 4:
|
||||
if ending_route_number == 4:
|
||||
pause 0.5
|
||||
show snootgame_big with dissolve: # Renpy not allowing you to grab images from the gui folder is serious bullshit
|
||||
show snootgame_big with dissolve:
|
||||
subpixel True
|
||||
xalign 0.5
|
||||
yalign 0.5
|
||||
@@ -262,17 +284,17 @@ label lending:
|
||||
hide snootgame_big
|
||||
with dissolve
|
||||
|
||||
show credits_base at Pan((0, -1080),(0, 8100), 65):
|
||||
show credits_base at Pan((0, -1080),(0, panning_stop_bg), panning_duration):
|
||||
subpixel True
|
||||
show d_credits_text at Pan((0, 0),(0, 12100), 65):
|
||||
show d_credits_text at Pan((0, 0),(0, panning_stop), panning_duration):
|
||||
subpixel True
|
||||
show credits_coverup at Pan((0, 0),(0, 12100), 65):
|
||||
show credits_coverup at Pan((0, 0),(0, panning_stop), panning_duration):
|
||||
subpixel True
|
||||
|
||||
pause 50
|
||||
queue music 'audio/OST/amberlight brillance live end.ogg'
|
||||
queue music "<silence 1.0>" loop
|
||||
elif _return == 3:
|
||||
elif ending_route_number == 3:
|
||||
play music "audio/OST/Dino Destiny Reader.ogg"
|
||||
pause 0.5
|
||||
show c_credits_text:
|
||||
@@ -281,9 +303,9 @@ label lending:
|
||||
show c_credits_text:
|
||||
crop None
|
||||
pause 2.75
|
||||
show credits_base at Pan((0, -1080),(0, 8100), 65) behind c_credits_text:
|
||||
show credits_base at Pan((0, -1080),(0, panning_stop_bg), panning_duration) behind c_credits_text:
|
||||
subpixel True
|
||||
show c_credits_text at Pan((0, 0),(0, 12100), 65):
|
||||
show c_credits_text at Pan((0, 0),(0, panning_stop), panning_duration):
|
||||
crop None
|
||||
subpixel True
|
||||
else:
|
||||
@@ -295,23 +317,24 @@ label lending:
|
||||
show b_credits_text:
|
||||
crop None
|
||||
pause 2.75
|
||||
show credits_base at Pan((0, -1080),(0, 8100), 65) behind b_credits_text:
|
||||
show credits_base at Pan((0, -1080),(0, panning_stop_bg), panning_duration) behind b_credits_text:
|
||||
subpixel True
|
||||
show b_credits_text at Pan((0, 0),(0, 12100), 65):
|
||||
show b_credits_text at Pan((0, 0),(0, panning_stop), panning_duration):
|
||||
crop None
|
||||
subpixel True
|
||||
pause
|
||||
stop music fadeout 5
|
||||
scene black with Dissolve(3)
|
||||
pause 2
|
||||
if tradwife:
|
||||
if ending_route_number == 3:
|
||||
scene c10 with Dissolve(1.5)
|
||||
pause 20
|
||||
scene black with Dissolve(2)
|
||||
pause 1
|
||||
elif anonscore >= 4 and fangscore >= 4:
|
||||
elif ending_route_number == 4:
|
||||
scene golden ending with Dissolve(1.5)
|
||||
pause 20
|
||||
scene black with Dissolve(2)
|
||||
pause 1
|
||||
return
|
||||
|
||||
$ MainMenu(confirm=False) () # Exits to the main menu
|
||||
|
||||
@@ -31,7 +31,7 @@ screen ex_ch_button(filename, label, function):
|
||||
activate_sound "audio/ui/uiClick.wav"
|
||||
fixed:
|
||||
add filename xalign 0.5 yalign 0.5 zoom 0.9
|
||||
text label xalign 0.5 yalign 0.5 xanchor 0.5 size 34
|
||||
text label xalign 0.5 yalign 0.5 size 34
|
||||
|
||||
# label_functions is [ [ "label", function() ], [ "foobar", foobar() ], .. ]
|
||||
# Reuse the same image string and keep things 'neat'.
|
||||
@@ -65,12 +65,7 @@ screen ex_ch_menu():
|
||||
|
||||
tag menu
|
||||
style_prefix "main_menu"
|
||||
add gui.main_menu_background
|
||||
|
||||
frame:
|
||||
xsize 420
|
||||
yfill True
|
||||
background "gui/overlay/main_menu.png"
|
||||
use main_menu_background
|
||||
|
||||
#side_yfill True
|
||||
vbox:
|
||||
@@ -92,14 +87,15 @@ screen ex_ch_menu():
|
||||
mousewheel True
|
||||
draggable True
|
||||
pagekeys True
|
||||
vbox:
|
||||
#xpos 1885
|
||||
spacing 12
|
||||
#yalign 0.98
|
||||
|
||||
use ex_ch_button("gui/button/menubuttons/template_idle.png", "Return", ShowMenu("main_menu"))
|
||||
#use ex_ch_button("gui/button/menubuttons/template_idle.png", str(e), ShowMenu("main_menu"))
|
||||
$ main_menu_button_img = "gui/button/menubuttons/template_idle_epilogue.png" if persistent.use_epilogue_menu else "gui/button/menubuttons/template_idle.png"
|
||||
|
||||
vbox:
|
||||
spacing 12
|
||||
|
||||
use ex_ch_button(main_menu_button_img, "Return", ShowMenu("main_menu"))
|
||||
|
||||
if len(ex_chapters_menu):
|
||||
use ex_ch_buttons("gui/button/menubuttons/template_idle.png", ex_chapters_menu )
|
||||
use ex_ch_buttons(main_menu_button_img, ex_chapters_menu )
|
||||
for x in range(0, len(ex_chapters) - len(ex_chapters_menu)):
|
||||
use ex_ch_button("gui/button/menubuttons/template_idle.png", "???", None)
|
||||
use ex_ch_button(main_menu_button_img, "???", None)
|
||||
|
||||
@@ -352,6 +352,18 @@ init 1 python:
|
||||
|
||||
# aight, time for the stuff that isn't gallery required.
|
||||
|
||||
### SPLASHSCREEN
|
||||
|
||||
image caveintrosequence:
|
||||
"caveintro"
|
||||
alpha 0
|
||||
time 0.5
|
||||
linear 3.5 alpha 1
|
||||
time 10
|
||||
linear 1 alpha 0
|
||||
|
||||
|
||||
|
||||
### OTHER
|
||||
|
||||
|
||||
@@ -1051,7 +1063,7 @@ image naomi prom lessblurred = im.Flip(im.Blur('images/naomi/naomi prom neutral.
|
||||
#image emptyroomnight = "images/backgrounds/emptyroomnight.webp"
|
||||
|
||||
#image naomifangcg = "images/cgs/naomifangcg.webp"
|
||||
image naomifangcg blur = im.Blur("images/cgs/naomifangcg.webp", 1.5)
|
||||
#image naomifangcg blur = im.Blur("images/cgs/naomifangcg.webp", 1.5)
|
||||
image naomiletter = 'images/cgs/naomiletter.webp'
|
||||
#image ending_d_cg = 'images/cgs/golden ending.webp'
|
||||
|
||||
@@ -1423,7 +1435,8 @@ image iris = im.FactorScale(im.MatrixColor("vfx/iris.webp",im.matrix.opacity(0.9
|
||||
|
||||
# CHAPTER 5
|
||||
|
||||
image fang tail = Movie(play="animations/fang tail.webm",loop=True)
|
||||
image fang_tail_movie = Movie(channel="movie_dp", loop=True, play="images/animations/fang tail.webm") # New way of playing movies as of Renpy 8.1
|
||||
|
||||
|
||||
|
||||
# CHAPTER 11
|
||||
@@ -1548,28 +1561,28 @@ image fang very sad blur flip = im.Flip("highres/bluralt/fang very sad blur.webp
|
||||
image naomi neutral blur flip = im.Flip("highres/bluralt/naomi neutral blur.webp", horizontal=True)
|
||||
|
||||
image fang pneutral blur = Composite(
|
||||
(1412, 1500),
|
||||
#(2683, 2850),
|
||||
(0, 0), "highres/bluralt/fang neutral blur.webp",
|
||||
(0, 0), "highres/bluralt/amberpendant1 blur.webp"
|
||||
(1412, 1500),
|
||||
#(2683, 2850),
|
||||
(0, 0), "highres/bluralt/fang neutral blur.webp",
|
||||
(0, 0), "highres/bluralt/amberpendant1 blur.webp"
|
||||
)
|
||||
image fang pbird happy blur = Composite(
|
||||
(1412, 1500),
|
||||
#(2683, 2850),
|
||||
(0, 0), "highres/bluralt/fang flip off happy blur.webp",
|
||||
(0, 0), "highres/bluralt/amberpendant1 blur.webp"
|
||||
(1412, 1500),
|
||||
#(2683, 2850),
|
||||
(0, 0), "highres/bluralt/fang flip off happy blur.webp",
|
||||
(0, 0), "highres/bluralt/amberpendant1 blur.webp"
|
||||
)
|
||||
image fang pneutral blur flip = Composite(
|
||||
(1412, 1500),
|
||||
#(2683, 2850),
|
||||
(0, 0), im.Flip("highres/bluralt/fang neutral blur.webp", horizontal=True),
|
||||
(0, 0), im.Flip("highres/bluralt/amberpendant1 blur.webp", horizontal=True)
|
||||
(1412, 1500),
|
||||
#(2683, 2850),
|
||||
(0, 0), im.Flip("highres/bluralt/fang neutral blur.webp", horizontal=True),
|
||||
(0, 0), im.Flip("highres/bluralt/amberpendant1 blur.webp", horizontal=True)
|
||||
)
|
||||
image fang pbird happy blur flip = Composite(
|
||||
(1412, 1500),
|
||||
#(2683, 2850),
|
||||
(0, 0), im.Flip("highres/bluralt/fang flip off happy blur.webp", horizontal=True),
|
||||
(0, 0), im.Flip("highres/bluralt/amberpendant1 blur.webp", horizontal=True)
|
||||
(1412, 1500),
|
||||
#(2683, 2850),
|
||||
(0, 0), im.Flip("highres/bluralt/fang flip off happy blur.webp", horizontal=True),
|
||||
(0, 0), im.Flip("highres/bluralt/amberpendant1 blur.webp", horizontal=True)
|
||||
)
|
||||
|
||||
image raymba2 flip = im.Flip("raymba/raymba2.webp", horizontal=True)
|
||||
216
game/src/misc_definitions.rpy
Normal file
@@ -0,0 +1,216 @@
|
||||
init python:
|
||||
# function for insult layers
|
||||
import random
|
||||
def showCG():
|
||||
files = ["text1", "text2", "text3", "text4", "text5", "text6", "text7", "text8", "text9"]
|
||||
length = len(files)
|
||||
picked = random.randint(0,length - 1)
|
||||
fileName = files[picked]
|
||||
renpy.show(fileName, at_list=[randPosition])
|
||||
|
||||
# some stupid bullshit you have to do to get sounds playing in an ATL block
|
||||
def fang_kicks_a_car_workaround_sfx_fuck_renpy(a,b,c):
|
||||
if random.random() > 0.5:
|
||||
renpy.play('audio/effects/carKick1.ogg', channel='audio')
|
||||
else:
|
||||
renpy.play('audio/effects/carKick2.ogg', channel='audio')
|
||||
# renpy.play('audio/effects/carSuspension1.ogg', channel='audio')
|
||||
|
||||
|
||||
transform randPosition:
|
||||
alpha 0.0
|
||||
xalign random.uniform(0.2,0.8)
|
||||
yalign random.uniform(0.2,0.8)
|
||||
linear 0.6 alpha 1.0
|
||||
linear 1.0 alpha 0.0
|
||||
|
||||
#Raw Image & kwargs for long textboxes
|
||||
define long_textbox_img = Image("gui/textbox_long.png", xalign=0.5, yalign=1.0)
|
||||
define long_textbox = { "window_background": long_textbox_img, 'namebox_style': "namebox_large" }
|
||||
|
||||
#Characters
|
||||
define base = Character (ctc="ctc_end_marker", ctc_pause="ctc_mid_marker", ctc_timedpause=Null(), ctc_position="nestled") # try to remember some of the basics of CTC
|
||||
define narrator = Character(kind=base)
|
||||
define A = Character (_('Anon'), base, color="#36E12D", who_outlines=[(gui.name_text_thickness, '#0C300A')]) # Light Green
|
||||
define F = Character (_('Fang'), base, color="#B4D4CE", who_outlines=[(gui.name_text_thickness, '#0F3930')]) # Light Cyan
|
||||
define Lucy = Character (_('Lucy'), base, color="#B4D4CE", who_outlines=[(gui.name_text_thickness, '#0F3930')]) # Light Cyan
|
||||
define Ro = Character (_('Rosa'), base, color="#FE712B", who_outlines=[(gui.name_text_thickness, '#54230F')]) # Red-Orange
|
||||
define St = Character (_('Stella'), base, color="#D5FFAE", who_outlines=[(gui.name_text_thickness, '#294211')]) # Light Green
|
||||
define N = Character (_('Naomi'), base, color="#FDD2C1", who_outlines=[(gui.name_text_thickness, '#462628')]) # Peach
|
||||
define Nas = Character (_('Naser'), base, color="#FFB561", who_outlines=[(gui.name_text_thickness, '#512322')]) # Orange
|
||||
define T = Character (_('Trish'), base, color="#B675E6", who_outlines=[(gui.name_text_thickness, '#3A0C5D')]) # Purple
|
||||
define Attendant = Character (_('Attendant'), base, color="#5BF0F8", who_outlines=[(gui.name_text_thickness, '#121C68')]) # Aqua
|
||||
define Sp = Character (_('Spears'), base, color="#C7C7C7", who_outlines=[(gui.name_text_thickness, '#272727')]) # Light Grey
|
||||
define Re = Character (_('Reed'), base, color="#ED4C5B", who_outlines=[(gui.name_text_thickness, '#421014')]) # Bright Red
|
||||
define D = Character (_('Driver'), base, color="#FFECBC", who_outlines=[(gui.name_text_thickness, '#563010')]) # Yellow-Orange
|
||||
|
||||
define FM = Character (_("Fang's Mom"), base, color="#FFD8F6", who_outlines=[(gui.name_text_thickness, '#521947')]) # Bright Pink
|
||||
define FD = Character (_("Fang's Dad"), base, color="#D8A09A", who_outlines=[(gui.name_text_thickness, '#461B1F')]) # Desaturated Orange
|
||||
|
||||
define LM = Character (_("Lucy's Mom"), base, color="#FFD8F6", who_outlines=[(gui.name_text_thickness, '#521947')]) # Bright Pink
|
||||
define LD = Character (_("Lucy's Dad"), base, color="#D8A09A", who_outlines=[(gui.name_text_thickness, '#461B1F')]) # Desaturated Orange
|
||||
|
||||
define Tsuki = Character (_('Mr. Tsuki'), base, color="#A7F2A2", who_outlines=[(gui.name_text_thickness, '#471054')]) # Pear Green
|
||||
define unknown = Character (_('(???)'), base, color="#FFF", who_outlines=[(gui.name_text_thickness, '#000')]) # White
|
||||
define jingo = Character (_('Mr. Jingo'), base, color="#CD8283", who_outlines=[(gui.name_text_thickness, '#0F0D49')]) # Desaturated Red
|
||||
define MaitD = Character (_('Maitre D'), base, color="#AF9EFF", who_outlines=[(gui.name_text_thickness, '#241630')]) # Cobalt Blue
|
||||
define Moe = Character(_('Moe'), base, color="#A5BEED", who_outlines=[(gui.name_text_thickness, '#1F253B')]) # Desaturated Blue
|
||||
define Vince = Character (_('Vince'), base, color="#FFECBC", who_outlines=[(gui.name_text_thickness, '#563010')]) # Yellow-Orange
|
||||
define Waitress = Character (_('Waitress'), base, color="#F691C8", who_outlines=[(gui.name_text_thickness, '#512040')]) # Pink
|
||||
define Riley = Character (_('Riley'), base, color="#B675E6", who_outlines=[(gui.name_text_thickness, '#1F0632')]) # TODO
|
||||
define Tana = Character (_('Tana'), base, color="#B675E6", who_outlines=[(gui.name_text_thickness, '#1F0632')]) # TODO
|
||||
define Trevor = Character (_('Trevor'), base, color="#B675E6", who_outlines=[(gui.name_text_thickness, '#1F0632')]) # TODO
|
||||
#long TB chars
|
||||
define AnonAndFang = Character(_('Anon and Fang'), base, color="72DFA8", who_outlines=[(gui.name_text_thickness, '#113623')]) # Cyan
|
||||
define SV = Character (_('Street Vendor'), base, color="#F8E120", who_outlines=[(gui.name_text_thickness, '#58260C')]) # Yellow
|
||||
define carl = Character ('Mr. Carldewskii', base, color="#EECB99", who_outlines=[(gui.name_text_thickness, '#082337')]) #Puke Orange
|
||||
define Drf = Character ('Dr. Fernsworth', base, color="#DCEEF5", who_outlines=[(gui.name_text_thickness, '#253354')]) #Yellow-Orange
|
||||
define FRT = Character (_('Fang Reed & Trish'), base, color="#DCBBF7", who_outlines=[(gui.name_text_thickness, '#191C78')]) #Light Purple
|
||||
define FangAndTrish = Character(_('Fang and Trish'), base, color="#42DFA8", who_outlines=[(gui.name_text_thickness, '#183623')])
|
||||
define NaserAndNaomi = Character(_('Naser and Naomi'), base, color="#22DFA8", who_outlines=[(gui.name_text_thickness, '#2036B3')])
|
||||
define TeamMember = Character(_('Team member'), base, color="#D32552", who_outlines=[(gui.name_text_thickness, '#445F42')])
|
||||
define Everyone = Character(_('Everyone'), base, color="#A45489", who_outline=[(gui.name_text_thickness, '#4F5F81')])
|
||||
define Chet = Character(_('Chet'), base, color="#B45411", who_outline=[(gui.name_text_thickness, '#BF5F81')])
|
||||
|
||||
|
||||
#Custom Vars for positions
|
||||
transform scenter:
|
||||
xalign 0.5 yalign 0.0
|
||||
transform sleft:
|
||||
xalign 0.0 yalign 0.0
|
||||
transform sright:
|
||||
xalign 1.0 yalign 0.0
|
||||
|
||||
#Stella
|
||||
transform stcenter:
|
||||
xalign 0.5 yalign 0.1
|
||||
transform stleft:
|
||||
xalign 0.0 yalign 0.1
|
||||
transform stright:
|
||||
xalign 1.0 yalign 0.1
|
||||
|
||||
#Anon
|
||||
transform acenter:
|
||||
xalign 0.5 yalign 0.1
|
||||
transform aleft:
|
||||
xalign 0.0 yalign 0.1
|
||||
transform aright:
|
||||
xalign 1.0 yalign 0.1
|
||||
|
||||
#Naser
|
||||
transform ncenter:
|
||||
xalign 0.6 yalign 0.1
|
||||
transform nleft:
|
||||
xalign -0.2 yalign 0.1
|
||||
transform nright:
|
||||
xalign 1.9 yalign 0.1
|
||||
|
||||
#Fangs mom
|
||||
transform fmcenter:
|
||||
xalign 0.5 yalign 0.1
|
||||
transform fmleft:
|
||||
xalign 0.0 yalign 0.1
|
||||
transform fmright:
|
||||
xalign 1.0 yalign 0.1
|
||||
|
||||
#Trish
|
||||
transform tcenter:
|
||||
xalign 0.5 yalign 0.1
|
||||
transform tleft:
|
||||
xalign 0.0 yalign 0.1
|
||||
transform tright:
|
||||
xalign 1.0 yalign 0.1
|
||||
|
||||
#Reed and other long tailed dinos
|
||||
transform rcenter:
|
||||
xalign 1.2 yalign 0.1
|
||||
transform rleft:
|
||||
xalign -0.2 yalign 0.1
|
||||
transform rright:
|
||||
xalign 1.7 yalign 0.1
|
||||
|
||||
#misc transforms
|
||||
transform shudder:
|
||||
subpixel True
|
||||
alignaround (.5, .5) xalign .5 yalign .5
|
||||
rotate 0
|
||||
linear 0.0 rotate -0.75
|
||||
block:
|
||||
linear 0.04 rotate 0.75
|
||||
linear 0.05 rotate -0.75
|
||||
linear 0.07 rotate 0
|
||||
|
||||
transform turnaround:
|
||||
linear 0.1 xzoom -1.0
|
||||
|
||||
transform wiggle:
|
||||
subpixel True
|
||||
block:
|
||||
xpos 0.5 ypos 1.0 xanchor 0.5 yanchor 1.0 zoom 1.02
|
||||
alignaround (.5, .5)
|
||||
linear 10.0 yalign 1.0 clockwise circles 1
|
||||
repeat
|
||||
|
||||
|
||||
transform raymbatransform:
|
||||
xcenter 0.6 ycenter 0.385 zoom 0.5
|
||||
|
||||
# PHONE SCROLLING
|
||||
|
||||
|
||||
transform cursortransform:
|
||||
block:
|
||||
yalign 0.2 xalign 0.60
|
||||
pause .25
|
||||
easein_cubic 1 yalign 0.75 xalign 0.54
|
||||
pause .5
|
||||
repeat
|
||||
|
||||
screen prompt():
|
||||
fixed:
|
||||
add "cursor"
|
||||
|
||||
screen mousedetect():
|
||||
transform: # thanks based nutbuster
|
||||
zoom 0.8
|
||||
rotate 12.5
|
||||
mousearea:
|
||||
area(432, -75, 795, 1100)
|
||||
# xalign 0.5 yanchor 0 ypos 0
|
||||
hovered Hide("prompt" )
|
||||
unhovered Show("prompt")
|
||||
|
||||
screen textscroll():
|
||||
timer 2.0 action(Show("mousedetect"), Show("prompt"))
|
||||
|
||||
add Solid("FFF")
|
||||
|
||||
transform:
|
||||
zoom 0.8
|
||||
rotate 12.5
|
||||
viewport:
|
||||
xalign 0.51 yanchor 0 ypos -75 xysize(795, 1150)
|
||||
child_size(795, 7650)
|
||||
draggable True
|
||||
arrowkeys True
|
||||
# edgescroll(400, 800)
|
||||
|
||||
yinitial 1.0
|
||||
|
||||
imagebutton auto "fangbutton%s" xalign 0.53 yanchor 0.5:
|
||||
ypos 65+(int(107/2))
|
||||
xsize 284
|
||||
ysize 107
|
||||
action (Hide("mousedetect"), Hide("prompt"), Hide("textscroll", transition=Dissolve(1.0)), Return())
|
||||
add "texts"
|
||||
|
||||
add "fang phone"
|
||||
|
||||
|
||||
# Naser's position when helping Anon get up
|
||||
transform nmidright:
|
||||
xalign 1.5 yalign 0.08
|
||||
|
||||
# Naomi's position when handing the brochure to Anon
|
||||
transform scloserleft:
|
||||
xalign 0.1 yalign 0.0
|
||||
90
game/src/rounded_corners.rpy
Normal file
@@ -0,0 +1,90 @@
|
||||
# RoundedCorners() rounds the corners of a displayable you give it
|
||||
|
||||
python early:
|
||||
|
||||
def normalize_color(col):
|
||||
a = col[3] / 255.0
|
||||
r = a * col[0] / 255.0
|
||||
g = a * col[1] / 255.0
|
||||
b = a * col[2] / 255.0
|
||||
return (r, g, b, a)
|
||||
|
||||
_rounded_corners_relative = {
|
||||
None: 0.0,
|
||||
"min": 1.0,
|
||||
"max": 2.0,
|
||||
"width": 3.0,
|
||||
"height": 4.0,
|
||||
}
|
||||
|
||||
def RoundedCorners(child, radius, relative=None, outline_width=0.0, outline_color="#fff", **kwargs):
|
||||
if not isinstance(radius, tuple): radius = (radius,) * 4
|
||||
relative = _rounded_corners_relative[relative]
|
||||
outline_color = normalize_color(Color(outline_color))
|
||||
return Transform(child, mesh=True, shader="shader.rounded_corners", u_radius=radius, u_relative=relative, u_outline_color=outline_color, u_outline_width=outline_width, **kwargs)
|
||||
|
||||
CurriedRoundedCorners = renpy.curry(RoundedCorners)
|
||||
|
||||
renpy.register_shader("shader.rounded_corners", variables="""
|
||||
uniform vec4 u_radius;
|
||||
uniform float u_outline_width;
|
||||
uniform vec4 u_outline_color;
|
||||
uniform float u_relative;
|
||||
uniform sampler2D tex0;
|
||||
attribute vec2 a_tex_coord;
|
||||
varying vec2 v_tex_coord;
|
||||
uniform vec2 u_model_size;
|
||||
""", vertex_200="""
|
||||
v_tex_coord = a_tex_coord;
|
||||
""", fragment_functions="""
|
||||
float rounded_rectangle(vec2 p, vec2 b, float r) {
|
||||
return length(max(abs(p) - b + r, 0.0)) - r;
|
||||
}
|
||||
|
||||
float get_radius(vec2 uv_minus_center, vec4 radius) {
|
||||
vec2 xy = (uv_minus_center.x > 0.0) ? radius.xy : radius.zw;
|
||||
float r = (uv_minus_center.y > 0.0) ? xy.x : xy.y;
|
||||
return r;
|
||||
}
|
||||
""", fragment_200="""
|
||||
vec2 center = u_model_size.xy / 2.0;
|
||||
vec2 uv = (v_tex_coord.xy * u_model_size.xy);
|
||||
|
||||
vec2 uv_minus_center = uv - center;
|
||||
float radius = get_radius(uv_minus_center, u_radius);
|
||||
|
||||
vec4 color = texture2D(tex0, v_tex_coord);
|
||||
|
||||
if (u_relative != 0.0) {
|
||||
float side_size;
|
||||
if (u_relative == 1.0) {
|
||||
side_size = u_model_size.x;
|
||||
} else if (u_relative == 2.0) {
|
||||
side_size = u_model_size.y;
|
||||
} else if (u_relative == 3.0) {
|
||||
side_size = min(u_model_size.x, u_model_size.y);
|
||||
} else {
|
||||
side_size = max(u_model_size.x, u_model_size.y);
|
||||
}
|
||||
|
||||
radius *= side_size;
|
||||
}
|
||||
|
||||
if (u_outline_width > 0.0) {
|
||||
vec2 center_outline = center - u_outline_width;
|
||||
|
||||
float crop1 = rounded_rectangle(uv - center, center, radius);
|
||||
float crop2 = rounded_rectangle(uv - center, center_outline, radius - u_outline_width);
|
||||
|
||||
float coeff1 = smoothstep(1.0, -1.0, crop1);
|
||||
float coeff2 = smoothstep(1.0, -1.0, crop2);
|
||||
|
||||
float outline_coeff = (coeff1 - coeff2);
|
||||
|
||||
gl_FragColor = mix(vec4(0.0), mix(color, u_outline_color, outline_coeff), coeff1);
|
||||
}
|
||||
else {
|
||||
float crop = rounded_rectangle(uv_minus_center, center, radius);
|
||||
gl_FragColor = mix(color, vec4(0.0), smoothstep(0.0, 1.0, crop));
|
||||
}
|
||||
""")
|
||||
@@ -1,24 +1,10 @@
|
||||
|
||||
label splashscreen:
|
||||
$ persistent.splashtype = random.randint(0,2000 - 1)
|
||||
|
||||
image caveintrosequence:
|
||||
"caveintro"
|
||||
alpha 0
|
||||
time 0.5
|
||||
linear 3.5 alpha 1
|
||||
time 10
|
||||
linear 1 alpha 0
|
||||
|
||||
show caveintrosequence
|
||||
play sound 'audio/OST/startup.ogg'
|
||||
pause 11.2
|
||||
stop sound
|
||||
|
||||
if (persistent.languaged_up is None):
|
||||
$ persistent.languaged_up = True
|
||||
$ preferences.set_volume('ui', config.default_sfx_volume) # hack
|
||||
call screen lang_sel
|
||||
if not renpy.get_autoreload() and not persistent.reloading_mods:
|
||||
show caveintrosequence
|
||||
play sound 'audio/OST/startup.ogg'
|
||||
pause 11.2
|
||||
stop sound
|
||||
|
||||
|
||||
return
|
||||
|
||||
53
game/src/storyline.rpy
Normal file
@@ -0,0 +1,53 @@
|
||||
init -1 python:
|
||||
# This function name is a misnomer, this actually counts endings as seen when the player reaches the ending cards when this is called
|
||||
# And it's done in the most retarded way possible because someone thought it'd be funny.
|
||||
def ending_image():
|
||||
#0b0000, DCBA, flash the bits with |=, check with &
|
||||
endings = 0b0000
|
||||
_e = 0b1
|
||||
for i in range(1, 5):
|
||||
fn = "e"+str(i)+"of4"
|
||||
endings |= (_e * renpy.seen_image(fn))
|
||||
_e = _e << 0b1
|
||||
persistent.old_endings = persistent.endings
|
||||
persistent.endings = endings
|
||||
|
||||
init python:
|
||||
# Sequences through the chapter_list list with chapter_list_index as a pointer
|
||||
def next_story_chapter():
|
||||
global chapter_list_index, current_chapter, chapter_list, ending_route_number, chapter_list_length, ending_chapters_determined
|
||||
|
||||
if chapter_list_index < chapter_list_length:
|
||||
chapter_list_index += 1
|
||||
current_chapter = chapter_list[chapter_list_index]
|
||||
renpy.call(current_chapter)
|
||||
|
||||
# Safeguard if setup_ending wasn't called somehow
|
||||
elif not ending_chapters_determined:
|
||||
setup_ending(get_ending())
|
||||
|
||||
# We're at an ending
|
||||
else:
|
||||
ending_image() # Count endings that have seen the ending cards as seen
|
||||
|
||||
if ending_route_number == 1:
|
||||
renpy.quit()
|
||||
else:
|
||||
renpy.call("lending")
|
||||
|
||||
# Adds ending chapters to chapter_list and sets the ending number
|
||||
def setup_ending(ending):
|
||||
global ending_route_number, chapter_list, chapter_list_length, ending_chapters_determined
|
||||
|
||||
if not ending_chapters_determined:
|
||||
ending_route_number = ending
|
||||
|
||||
# Add ending chapters
|
||||
chapter_list.extend(ending_routes[ending_route_number])
|
||||
chapter_list_length = get_chapter_list_length() # chapter_list_length is updated to reflect the addition to the chapter_list array
|
||||
|
||||
ending_chapters_determined = True
|
||||
|
||||
def get_chapter_list_length():
|
||||
global chapter_list
|
||||
return len(chapter_list) - 1
|
||||
@@ -1,131 +1,160 @@
|
||||
init offset = -1
|
||||
|
||||
screen OkPrompt(message, go_menu):
|
||||
|
||||
modal True
|
||||
|
||||
zorder 200
|
||||
|
||||
style_prefix "confirm"
|
||||
|
||||
add "gui/overlay/confirm.png"
|
||||
|
||||
frame:
|
||||
|
||||
vbox:
|
||||
xalign .5
|
||||
yalign .5
|
||||
spacing 30
|
||||
|
||||
label _(message):
|
||||
style "confirm_prompt"
|
||||
xalign 0.5
|
||||
|
||||
hbox:
|
||||
xalign 0.5
|
||||
spacing 100
|
||||
|
||||
textbutton _("OK") activate_sound "audio/ui/uiClick.wav" action If(go_menu, true=MainMenu(False,False), false=Hide())
|
||||
|
||||
default persistent.seenWarning = []
|
||||
|
||||
init python:
|
||||
|
||||
from math import ceil
|
||||
|
||||
notice = _("NOTICE: Please keep in mind this is a fan translation, and as such it may not be completely accurate to the original intent of any written lines.")
|
||||
|
||||
languages = [
|
||||
{'image': 'gui/flag/USofA.png', 'name': 'English', 'value': None },
|
||||
{'image': 'gui/flag/Mexico.png', 'name': 'Español', 'value': 'es'},
|
||||
{'image': 'gui/flag/Rus.png', 'name': 'Русский', 'value': 'ru'},
|
||||
{'image': 'gui/flag/Poland.png', 'name': 'Polski', 'value': 'pl'}
|
||||
]
|
||||
|
||||
#This was done so it would work with whatever amount of languages you wanted, I tried it with up to 200 and it worked nicely.
|
||||
|
||||
maxItems = len(languages)
|
||||
maxRows = ceil(maxItems/4)
|
||||
if maxItems > 4:
|
||||
maxItems = 4*maxRows
|
||||
|
||||
init:
|
||||
transform renpysdumb: # Needed to scale down the imagebuttons.
|
||||
zoom 0.5
|
||||
transform icon: #For the preferences screen
|
||||
truecenter
|
||||
zoom 0.1
|
||||
|
||||
transform glowie(img):
|
||||
img
|
||||
easein_cubic 0.30 matrixcolor TintMatrix(Color((255, 255, 255)))
|
||||
|
||||
transform darkie(img):
|
||||
img
|
||||
easeout_cubic 0.30 matrixcolor TintMatrix(Color((255/2, 255/2, 255/2)))
|
||||
|
||||
screen lang_sel():
|
||||
|
||||
tag menu
|
||||
|
||||
frame:
|
||||
|
||||
background Transform(gui.main_menu_background, matrixcolor=TintMatrix('#222'))
|
||||
|
||||
padding (120, 40)
|
||||
|
||||
vbox:
|
||||
style_prefix "navigation"
|
||||
vbox:
|
||||
label _("Choose Your Language") text_size 80
|
||||
add Null(0, 40)
|
||||
|
||||
vpgrid:
|
||||
if maxItems <= 4:
|
||||
cols maxItems
|
||||
rows 1
|
||||
else:
|
||||
cols 4
|
||||
rows maxRows
|
||||
#spacing 30
|
||||
draggable True
|
||||
mousewheel True
|
||||
|
||||
if maxRows > 3:
|
||||
scrollbars "vertical"
|
||||
|
||||
for i in range(maxItems):
|
||||
fixed:
|
||||
xsize 400
|
||||
ysize 300
|
||||
vbox:
|
||||
if i<len(languages):
|
||||
text languages[i]["name"] at top
|
||||
add Null(0,10)
|
||||
imagebutton:
|
||||
idle darkie(languages[i]["image"])
|
||||
hover glowie(languages[i]["image"])
|
||||
action If(languages[i]["value"] in persistent.seenWarning or languages[i]["value"] == None,
|
||||
true = [Language(languages[i]["value"]), MainMenu(False,False)],
|
||||
# Important to change the language before calling notice. Otherwise it will be in english.
|
||||
false = [Language(languages[i]["value"]), AddToSet(set=persistent.seenWarning, value=languages[i]["value"]), Show(screen="OkPrompt", message=notice, go_menu=True)]
|
||||
)
|
||||
at renpysdumb # Scales the imagebutton down. No, you can't just specify the zoom here. It has to be a defined transform.
|
||||
else:
|
||||
# Renpy seethes if a vpgrid doesn't have the exact maximum amount of items for some reason.
|
||||
add Null(0,0)
|
||||
at truecenter
|
||||
|
||||
screen lang_button(lang):
|
||||
hbox:
|
||||
spacing 15
|
||||
textbutton lang["name"]:
|
||||
activate_sound "audio/ui/uiRollover.wav"
|
||||
action If(lang["value"] in persistent.seenWarning or lang["value"] == None,
|
||||
true = [Language(lang["value"])],
|
||||
false = [Language(lang["value"]), AddToSet(set=persistent.seenWarning, value=lang["value"]), Show(screen="OkPrompt", message=notice, go_menu=False)]
|
||||
)
|
||||
if _preferences.language == lang["value"]:
|
||||
add glowie(lang["image"]) at icon
|
||||
else:
|
||||
add darkie(lang["image"]) at icon
|
||||
init offset = -1
|
||||
|
||||
screen OkPrompt(message, go_menu):
|
||||
|
||||
modal True
|
||||
|
||||
zorder 200
|
||||
|
||||
style_prefix "confirm"
|
||||
|
||||
add "gui/overlay/confirm.png"
|
||||
|
||||
frame:
|
||||
|
||||
vbox:
|
||||
xalign .5
|
||||
yalign .5
|
||||
spacing 30
|
||||
|
||||
label _(message):
|
||||
style "confirm_prompt"
|
||||
xalign 0.5
|
||||
|
||||
hbox:
|
||||
xalign 0.5
|
||||
spacing 100
|
||||
|
||||
textbutton _("OK") activate_sound "audio/ui/snd_ui_click.wav" action If(go_menu, true=MainMenu(False,False), false=[Hide(),Return()])
|
||||
|
||||
screen hiddenOkPrompt(message, go_menu):
|
||||
|
||||
modal True
|
||||
|
||||
zorder 200
|
||||
|
||||
style_prefix "confirm"
|
||||
|
||||
add "gui/overlay/confirm.png"
|
||||
|
||||
frame:
|
||||
|
||||
vbox:
|
||||
xalign .5
|
||||
yalign .5
|
||||
spacing 30
|
||||
|
||||
label _(message):
|
||||
style "confirm_prompt"
|
||||
xalign 0.5
|
||||
|
||||
hbox:
|
||||
xalign 0.5
|
||||
spacing 100
|
||||
|
||||
textbutton _("OK") activate_sound "audio/ui/snd_ui_click.wav" action If(go_menu, true=MainMenu(False,False), false=Hide())
|
||||
|
||||
default persistent.seenWarning = []
|
||||
default persistent.languaged_up = None
|
||||
|
||||
init python:
|
||||
|
||||
from math import ceil
|
||||
|
||||
notice = _("NOTICE: Please keep in mind this is a fan translation, and as such it may not be completely accurate to the original intent of any written lines.")
|
||||
|
||||
languages = [
|
||||
{'image': 'gui/flag/USofA.png', 'name': 'English', 'value': 'en' },
|
||||
{'image': 'gui/flag/Mexico.png', 'name': 'Español', 'value': 'es'},
|
||||
{'image': 'gui/flag/Rus.png', 'name': 'Русский', 'value': 'ru'},
|
||||
{'image': 'gui/flag/Poland.png', 'name': 'Polski', 'value': 'pl'},
|
||||
{'image': 'gui/flag/Italy.png', 'name': 'Italiano', 'value': 'it'}
|
||||
]
|
||||
|
||||
#This was done so it would work with whatever amount of languages you wanted, I tried it with up to 200 and it worked nicely.
|
||||
|
||||
maxItems = len(languages)
|
||||
maxRows = ceil(maxItems/4)
|
||||
if maxItems > 4:
|
||||
maxItems = 4*maxRows
|
||||
|
||||
init:
|
||||
transform renpysdumb: # Needed to scale down the imagebuttons.
|
||||
zoom 0.5
|
||||
transform icon: #For the preferences screen
|
||||
truecenter
|
||||
zoom 0.1
|
||||
|
||||
transform glowie(img):
|
||||
img
|
||||
easein_cubic 0.30 matrixcolor TintMatrix(Color((255, 255, 255)))
|
||||
|
||||
transform darkie(img):
|
||||
img
|
||||
easeout_cubic 0.30 matrixcolor TintMatrix(Color((255/2, 255/2, 255/2)))
|
||||
|
||||
screen lang_sel():
|
||||
|
||||
tag menu
|
||||
|
||||
frame:
|
||||
|
||||
background Transform(gui.main_menu_background, matrixcolor=TintMatrix('#222'))
|
||||
|
||||
padding (120, 40)
|
||||
|
||||
vbox:
|
||||
style_prefix "navigation"
|
||||
vbox:
|
||||
label _("Choose Your Language") text_size 80
|
||||
add Null(0, 40)
|
||||
|
||||
vpgrid:
|
||||
if maxItems <= 4:
|
||||
cols maxItems
|
||||
rows 1
|
||||
else:
|
||||
cols 4
|
||||
rows maxRows
|
||||
#spacing 30
|
||||
draggable True
|
||||
mousewheel True
|
||||
|
||||
if maxRows > 3:
|
||||
scrollbars "vertical"
|
||||
|
||||
for i in range(maxItems):
|
||||
fixed:
|
||||
xsize 400
|
||||
ysize 300
|
||||
vbox:
|
||||
if i<len(languages):
|
||||
text languages[i]["name"] at top
|
||||
add Null(0,10)
|
||||
imagebutton:
|
||||
idle darkie(languages[i]["image"])
|
||||
hover glowie(languages[i]["image"])
|
||||
action If(languages[i]["value"] in persistent.seenWarning or languages[i]["value"] == 'en',
|
||||
true = [Language(languages[i]["value"]), SetVariable("persistent.languaged_up", True), Return()],
|
||||
# Important to change the language before calling notice. Otherwise it will be in english.
|
||||
false = [Language(languages[i]["value"]), AddToSet(set=persistent.seenWarning, value=languages[i]["value"]), SetVariable("persistent.languaged_up", True), Show(screen="OkPrompt", message=notice, go_menu=False)]
|
||||
)
|
||||
at renpysdumb # Scales the imagebutton down. No, you can't just specify the zoom here. It has to be a defined transform.
|
||||
else:
|
||||
# Renpy seethes if a vpgrid doesn't have the exact maximum amount of items for some reason.
|
||||
add Null(0,0)
|
||||
at truecenter
|
||||
|
||||
screen lang_button(lang):
|
||||
hbox:
|
||||
spacing 15
|
||||
textbutton lang["name"]:
|
||||
activate_sound "audio/ui/uiRollover.wav"
|
||||
action If(lang["value"] in persistent.seenWarning or lang["value"] == 'en',
|
||||
true = [Language(lang["value"])],
|
||||
false = [Language(lang["value"]), AddToSet(set=persistent.seenWarning, value=lang["value"]), Show(screen="hiddenOkPrompt", message=notice, go_menu=False)]
|
||||
)
|
||||
if _preferences.language == lang["value"]:
|
||||
add glowie(lang["image"]) at icon
|
||||
else:
|
||||
add darkie(lang["image"]) at icon
|
||||
|
||||
41
game/src/utility.rpy
Normal file
@@ -0,0 +1,41 @@
|
||||
## Utility functions for game setup, debugging etc.
|
||||
|
||||
init python:
|
||||
def get_ending():
|
||||
if ending_route_number == None:
|
||||
if anonscore >= 4 and fangscore >= 4 and wingStory:
|
||||
return 4 # Golden
|
||||
elif anonscore >= 3 and fangscore <= 4:
|
||||
return 3 # Tradwife
|
||||
elif anonscore <= 3 and fangscore >= 3:
|
||||
return 2 # Doomer
|
||||
else:
|
||||
return 1 # Shooter
|
||||
else:
|
||||
return ending_route_number
|
||||
|
||||
|
||||
def debug_story_variables(toggle=True):
|
||||
var_list = [
|
||||
"anonscore",
|
||||
"fangscore",
|
||||
"current_chapter",
|
||||
"chapter_list_length",
|
||||
"chapter_list_index",
|
||||
"ending_route_number",
|
||||
"ending_chapters_determined"
|
||||
]
|
||||
|
||||
for item in var_list:
|
||||
if toggle:
|
||||
renpy.watch(item)
|
||||
else:
|
||||
renpy.unwatch(item)
|
||||
|
||||
|
||||
def toggle_debug():
|
||||
if persistent.enable_debug_scores:
|
||||
debug_story_variables(False)
|
||||
debug_story_variables(True)
|
||||
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
init -1 python:
|
||||
def ending_image():
|
||||
#0b0000, DCBA, flash the bits with |=, check with &
|
||||
endings = 0b0000
|
||||
_e = 0b1
|
||||
for i in range(1, 5):
|
||||
fn = "e"+str(i)+"of4"
|
||||
endings |= (_e * renpy.seen_image(fn))
|
||||
_e = _e << 0b1
|
||||
persistent.old_endings = persistent.endings
|
||||
persistent.endings = endings
|
||||
|
||||
label storyline:
|
||||
call chapter_1 from _call_chapter_1
|
||||
call chapter_2 from _call_chapter_2
|
||||
call chapter_3 from _call_chapter_3
|
||||
call chapter_4 from _call_chapter_4
|
||||
call chapter_5 from _call_chapter_5
|
||||
call chapter_6 from _call_chapter_6
|
||||
call chapter_7 from _call_chapter_7
|
||||
call chapter_8 from _call_chapter_8
|
||||
call chapter_9 from _call_chapter_9
|
||||
call chapter_10 from _call_chapter_10
|
||||
call chapter_11 from _call_chapter_11
|
||||
call get_ending from _call_get_ending_5
|
||||
if _return == 4:
|
||||
call chapter_11D from _call_chapter_11D
|
||||
call chapter_12D from _call_chapter_12D
|
||||
call chapter_12_5D from _call_chapter_12_5D
|
||||
call chapter_13D from _call_chapter_13D
|
||||
call chapter_14D from _call_chapter_14D
|
||||
elif _return == 3:
|
||||
$ tradwife = True
|
||||
call chapter_11C from _call_chapter_11C
|
||||
call chapter_12C from _call_chapter_12C
|
||||
call chapter_12_5C from _call_chapter_12_5C
|
||||
call chapter_13C from _call_chapter_13C
|
||||
call chapter_14C from _call_chapter_14C
|
||||
elif _return == 2:
|
||||
call chapter_11B from _call_chapter_11B
|
||||
call chapter_12B from _call_chapter_12B
|
||||
# no chapter_13 here since the scene is different enough to the other routes for everything to go into 13C
|
||||
call chapter_13B from _call_chapter_13B
|
||||
call chapter_14B from _call_chapter_14B
|
||||
else:
|
||||
call chapter_11A from _call_chapter_11A
|
||||
call chapter_12A from _call_chapter_12A
|
||||
call chapter_12_5D from _call_chapter_12_5D_1
|
||||
call chapter_13A from _call_chapter_13A
|
||||
call chapter_14A from _call_chapter_14A
|
||||
$ ending_image()
|
||||
$ renpy.quit()
|
||||
$ ending_image()
|
||||
call lending from _call_lending
|
||||
return
|
||||
0
game/tl/en/mod-stuff-goes-here.txt
Normal file
@@ -514,3 +514,87 @@ translate es strings:
|
||||
old "Skipping"
|
||||
new "Saltando"
|
||||
|
||||
# TODO: Translation updated at 2024-10-07 00:57
|
||||
|
||||
translate es strings:
|
||||
|
||||
# game/screens.rpy:294
|
||||
old "Auto"
|
||||
new "Auto"
|
||||
|
||||
# game/screens.rpy:349
|
||||
old "Chapter Select"
|
||||
new "Seleccionar Capitulo"
|
||||
|
||||
old "Chapter Select{#MainMenu}"
|
||||
new "{size=50}Seleccionar Capitulo{/size}"
|
||||
|
||||
# game/screens.rpy:499
|
||||
old "Extras"
|
||||
new "Extras"
|
||||
|
||||
# game/screens.rpy:810
|
||||
old "Upload Sync"
|
||||
new "Subir Sync"
|
||||
|
||||
# game/screens.rpy:814
|
||||
old "Download Sync"
|
||||
new "Descargar Sync"
|
||||
|
||||
# game/screens.rpy:903
|
||||
old "Developer Tools"
|
||||
new "Opciones de Desarrollador"
|
||||
|
||||
# game/screens.rpy:904
|
||||
old "Enable Debug Scores"
|
||||
new "Activar Visor de Puntos"
|
||||
|
||||
# game/screens.rpy:905
|
||||
old "Enable Chapter Select"
|
||||
new "Activar Selector de Capitulos"
|
||||
|
||||
# game/screens.rpy:909
|
||||
old "Mods"
|
||||
new "Mods"
|
||||
|
||||
# game/screens.rpy:910
|
||||
old "Show Mod Screenshots"
|
||||
new "Mostrar Screenshots de Mods"
|
||||
|
||||
# game/screens.rpy:911
|
||||
old "Enable New Mods"
|
||||
new "Activar Mods Por Defecto"
|
||||
|
||||
# game/screens.rpy:924
|
||||
old "Enable Edgescrolling"
|
||||
new "Activar Desplazamiento de Bordes"
|
||||
|
||||
# game/screens.rpy:929
|
||||
old "Menu Style"
|
||||
new "Estilo del Menú"
|
||||
|
||||
# game/screens.rpy:930
|
||||
old "Original"
|
||||
new "Original"
|
||||
|
||||
# game/screens.rpy:931
|
||||
old "Epilogue"
|
||||
new "Epílogo"
|
||||
|
||||
# game/screens.rpy:1332
|
||||
old "Mouse Wheel Up"
|
||||
new "Rueda del Mouse para arriba"
|
||||
|
||||
# game/screens.rpy:1359
|
||||
old "Start, Guide, B/Right Button"
|
||||
new "Start, Guia, B/Botón Derecho"
|
||||
|
||||
# game/screens.rpy:1792
|
||||
old "Menu"
|
||||
new "Menú"
|
||||
|
||||
old "Backspace"
|
||||
new "Tecla de borrar"
|
||||
|
||||
old "Hides mod details. Shows mod errors if there is any."
|
||||
new "Esconde los detalles de los mods. Muestra los errores relacionados a los mods"
|
||||
@@ -4099,24 +4099,12 @@ translate es FastTimesAtVolcanoHigh_94e85886:
|
||||
# A "Well... {w=0.3}Spears convinced me to send out a couple application letters for college."
|
||||
A "Bueno... {w=0.3}Spears me convenció de enviar un par de letras de aplicación para la universidad."
|
||||
|
||||
# game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy:3121
|
||||
translate es FastTimesAtVolcanoHigh_4e617de4:
|
||||
|
||||
# A "I’m thinking of doing something with music{cps=*.1}...{/cps} maybe becoming a sound engineer?"
|
||||
A "Estoy pensando en hacer algo con música{cps=*.1}...{/cps} ¿quizás convertirme en ingeniero de sonido?"
|
||||
|
||||
# game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy:3124
|
||||
translate es FastTimesAtVolcanoHigh_a2735d38:
|
||||
|
||||
# A "I’m not sure yet."
|
||||
A "Todavía no estoy seguro."
|
||||
|
||||
# game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy:3126
|
||||
translate es FastTimesAtVolcanoHigh_4e617de4_1:
|
||||
|
||||
# A "I’m thinking of doing something with music{cps=*.1}...{/cps} maybe becoming a sound engineer?"
|
||||
A "Estoy pensando en hacer algo con música{cps=*.1}...{/cps} ¿quizás convertirme en ingeniero de sonido?"
|
||||
|
||||
# game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy:3128
|
||||
translate es FastTimesAtVolcanoHigh_5ce0f5f5:
|
||||
|
||||
@@ -6127,3 +6115,11 @@ translate es strings:
|
||||
old "Not certain just yet"
|
||||
new "Todavía no estoy seguro"
|
||||
|
||||
# TODO: Translation updated at 2023-05-07 00:20
|
||||
|
||||
# game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy:3123
|
||||
translate es FastTimesAtVolcanoHigh_4e617de4:
|
||||
|
||||
# A "I’m thinking of doing something with music{cps=*.1}...{/cps} maybe becoming a sound engineer?"
|
||||
A "Estoy pensando en hacer algo con música{cps=*.1}...{/cps} ¿quizás convertirme en ingeniero de sonido?"
|
||||
|
||||
|
||||
@@ -2226,48 +2226,6 @@ translate es PostCableConundrum_797b4809:
|
||||
# "Right into Trish’s trap, {w=0.3}hook, {w=0.3}line, {w=0.3}sinker and rod."
|
||||
"Justo en la trampa, {w=0.3}el anzuelo, {w=0.3}la línea, {w=0.3}la plomada y en la caña de Trish."
|
||||
|
||||
# game/script/7.concert-day.rpy:1539
|
||||
translate es PostCableConundrum_afcbc2bb:
|
||||
|
||||
# A "I do NOT have a thing for Incontineisha."
|
||||
A "La incontinencia NO es mi fetiche."
|
||||
|
||||
# game/script/7.concert-day.rpy:1542
|
||||
translate es PostCableConundrum_afcbc2bb_1:
|
||||
|
||||
# A "I do NOT have a thing for Incontineisha."
|
||||
A "La incontinencia NO es mi fetiche."
|
||||
|
||||
# game/script/7.concert-day.rpy:1545
|
||||
translate es PostCableConundrum_afcbc2bb_2:
|
||||
|
||||
# A "I do NOT have a thing for Incontineisha."
|
||||
A "La incontinencia NO es mi fetiche."
|
||||
|
||||
# game/script/7.concert-day.rpy:1548
|
||||
translate es PostCableConundrum_afcbc2bb_3:
|
||||
|
||||
# A "I do NOT have a thing for Incontineisha."
|
||||
A "La incontinencia NO es mi fetiche."
|
||||
|
||||
# game/script/7.concert-day.rpy:1551
|
||||
translate es PostCableConundrum_afcbc2bb_4:
|
||||
|
||||
# A "I do NOT have a thing for Incontineisha."
|
||||
A "La incontinencia NO es mi fetiche."
|
||||
|
||||
# game/script/7.concert-day.rpy:1554
|
||||
translate es PostCableConundrum_afcbc2bb_5:
|
||||
|
||||
# A "I do NOT have a thing for Incontineisha."
|
||||
A "La incontinencia NO es mi fetiche."
|
||||
|
||||
# game/script/7.concert-day.rpy:1557
|
||||
translate es PostCableConundrum_afcbc2bb_6:
|
||||
|
||||
# A "I do NOT have a thing for Incontineisha."
|
||||
A "La incontinencia NO es mi fetiche."
|
||||
|
||||
# game/script/7.concert-day.rpy:1560
|
||||
translate es PostCableConundrum_afcbc2bb_7:
|
||||
|
||||
@@ -2630,3 +2588,11 @@ translate es strings:
|
||||
old "No."
|
||||
new "No."
|
||||
|
||||
# TODO: Translation updated at 2023-05-07 00:20
|
||||
|
||||
# game/script/7.concert-day.rpy:1556
|
||||
translate es PostCableConundrum_afcbc2bb:
|
||||
|
||||
# A "I do NOT have a thing for Incontineisha."
|
||||
A "La incontinencia NO es mi fetiche."
|
||||
|
||||
|
||||
144
game/tl/es/src/chapter_select.rpy
Normal file
@@ -0,0 +1,144 @@
|
||||
# TODO: Translation updated at 2024-10-07 00:57
|
||||
|
||||
translate es strings:
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "1. First Day of School"
|
||||
new "1. El Primer Día de la Escuela"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "2. Meeting the Band"
|
||||
new "2. Conociendo a la Banda"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "3. Band Practice"
|
||||
new "3. Practica de Banda"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "4. Music Class"
|
||||
new "4. La Clase de Música"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "5. Gardening Club / Heart to Heart"
|
||||
new "5. El Club de Jardinería / De corazón a corazón"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "6. Not a Date"
|
||||
new "6. No es una Cita"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "7. Concert Day"
|
||||
new "7. Día de Concierto"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "8. Study Session"
|
||||
new "8. Sesión de Estudio"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "9. VVURM DRAMA"
|
||||
new "9. VVURM DRAMA"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "10. Confession"
|
||||
new "10. Confesión"
|
||||
|
||||
# game/src/chapter_select.rpy:1
|
||||
old "11. Naser drama"
|
||||
new "11. Drama de Naser"
|
||||
|
||||
# game/src/chapter_select.rpy:15
|
||||
old "11.5. Announcing a Plan"
|
||||
new "11.5. Anunciando un Plan"
|
||||
|
||||
# game/src/chapter_select.rpy:15
|
||||
old "12. Let's all go to the Museum"
|
||||
new "12. Vayamos al Museo"
|
||||
|
||||
# game/src/chapter_select.rpy:15
|
||||
old "13. Prom is Complicated"
|
||||
new "13. El Baile de Graduación es Complicado"
|
||||
|
||||
# game/src/chapter_select.rpy:15
|
||||
old "14. Bowling for Volcano High"
|
||||
new "14. Bolos para el Instituto Volcano"
|
||||
|
||||
# game/src/chapter_select.rpy:22
|
||||
old "11.5. Announcing Nothing Important"
|
||||
new "11.5. Anunciando Nada Importante"
|
||||
|
||||
# game/src/chapter_select.rpy:22
|
||||
old "12. Let's all go to a Concert"
|
||||
new "12. Vayamos Todos a un Concierto"
|
||||
|
||||
# game/src/chapter_select.rpy:22
|
||||
old "13. Prom is For Suckers"
|
||||
new "13. El Baile de Graduación es Para Perdedores"
|
||||
|
||||
# game/src/chapter_select.rpy:22
|
||||
old "14. Anon and the Infinite Sadness"
|
||||
new "14. Anon y la Tristesa Infinita"
|
||||
|
||||
# game/src/chapter_select.rpy:29
|
||||
old "11.5. Announcing a Date"
|
||||
new "11.5. Anunciando una Cita"
|
||||
|
||||
# game/src/chapter_select.rpy:29
|
||||
old "12. Let's all go Camping"
|
||||
new "12. Vayamos Todos a Acampar"
|
||||
|
||||
# game/src/chapter_select.rpy:29
|
||||
old "13. Prom is Surprising"
|
||||
new "13. El Baile de Graduación es Sorprendente"
|
||||
|
||||
# game/src/chapter_select.rpy:29
|
||||
old "14. Volcano Highschool Musical"
|
||||
new "14. El Musical del Instituto Volcano"
|
||||
|
||||
# game/src/chapter_select.rpy:36
|
||||
old "11.5. Announcing a Show"
|
||||
new "11.5. Anunciando un Show"
|
||||
|
||||
# game/src/chapter_select.rpy:36
|
||||
old "12. Let's all go to the Aquarium"
|
||||
new "12. Vayamos Todos al Acuario"
|
||||
|
||||
# game/src/chapter_select.rpy:36
|
||||
old "13. Prom is Memorable"
|
||||
new "13. El Baile de Graduación es Memorable"
|
||||
|
||||
# game/src/chapter_select.rpy:36
|
||||
old "14. Fast Times at Volcano High"
|
||||
new "14. Tiempos Rapidos en el Instituto Volcano"
|
||||
|
||||
# game/src/chapter_select.rpy:80
|
||||
old "What ending do you want to lock to?"
|
||||
new "¿Qué final quieres elegír?"
|
||||
|
||||
# game/src/chapter_select.rpy:80
|
||||
old "Ending 1"
|
||||
new "Final 1"
|
||||
|
||||
# game/src/chapter_select.rpy:80
|
||||
old "Ending 2"
|
||||
new "Final 2"
|
||||
|
||||
# game/src/chapter_select.rpy:80
|
||||
old "Ending 3"
|
||||
new "Final 3"
|
||||
|
||||
# game/src/chapter_select.rpy:80
|
||||
old "Ending 4"
|
||||
new "Final 4"
|
||||
|
||||
# game/src/chapter_select.rpy:80
|
||||
old "Exit to main menu"
|
||||
new "Volver al menú principal"
|
||||
|
||||
# game/src/chapter_select.rpy:158
|
||||
old "Next Page"
|
||||
new "Siguiente página"
|
||||
|
||||
# game/src/chapter_select.rpy:158
|
||||
old "Go Back"
|
||||
new "Atrás"
|
||||
|
||||
@@ -126,3 +126,19 @@ translate es strings:
|
||||
|
||||
old "Special Thanks:"
|
||||
new "Agradecimientos especiales:"
|
||||
# TODO: Translation updated at 2024-10-07 00:57
|
||||
|
||||
translate es strings:
|
||||
|
||||
# game/src/credits.rpy:80
|
||||
old "Translators (Italian):"
|
||||
new "Traducción (Italiano):"
|
||||
|
||||
# game/src/credits.rpy:80
|
||||
old "Proofreaders (Italian):"
|
||||
new "Revisado por (Italiano):"
|
||||
|
||||
# game/src/credits.rpy:80
|
||||
old "Asset help (Italian):"
|
||||
new "Ayuda extra (Italiano):"
|
||||
|
||||
|
||||
80
game/tl/es/src/misc_definitions.rpy
Normal file
@@ -0,0 +1,80 @@
|
||||
# TODO: Translation updated at 2024-10-07 00:57
|
||||
|
||||
translate es strings:
|
||||
|
||||
# game/src/misc_definitions.rpy:34
|
||||
old "Anon"
|
||||
new "Anon"
|
||||
|
||||
# game/src/misc_definitions.rpy:35
|
||||
old "Fang"
|
||||
new "Fang"
|
||||
|
||||
# game/src/misc_definitions.rpy:36
|
||||
old "Lucy"
|
||||
new "Lucy"
|
||||
|
||||
# game/src/misc_definitions.rpy:37
|
||||
old "Rosa"
|
||||
new "Rosa"
|
||||
|
||||
# game/src/misc_definitions.rpy:38
|
||||
old "Stella"
|
||||
new "Stella"
|
||||
|
||||
# game/src/misc_definitions.rpy:39
|
||||
old "Naomi"
|
||||
new "Naomi"
|
||||
|
||||
# game/src/misc_definitions.rpy:40
|
||||
old "Naser"
|
||||
new "Naser"
|
||||
|
||||
# game/src/misc_definitions.rpy:41
|
||||
old "Trish"
|
||||
new "Trish"
|
||||
|
||||
# game/src/misc_definitions.rpy:43
|
||||
old "Spears"
|
||||
new "Spears"
|
||||
|
||||
# game/src/misc_definitions.rpy:44
|
||||
old "Reed"
|
||||
new "Reed"
|
||||
|
||||
# game/src/misc_definitions.rpy:54
|
||||
old "(???)"
|
||||
new "(???)"
|
||||
|
||||
# game/src/misc_definitions.rpy:55
|
||||
old "Mr. Jingo"
|
||||
new "Sr. Jingo"
|
||||
|
||||
# game/src/misc_definitions.rpy:56
|
||||
old "Maitre D"
|
||||
new "Maitre D"
|
||||
|
||||
# game/src/misc_definitions.rpy:57
|
||||
old "Moe"
|
||||
new "Moe"
|
||||
|
||||
# game/src/misc_definitions.rpy:58
|
||||
old "Vince"
|
||||
new "Vince"
|
||||
|
||||
# game/src/misc_definitions.rpy:60
|
||||
old "Riley"
|
||||
new "Riley"
|
||||
|
||||
# game/src/misc_definitions.rpy:61
|
||||
old "Tana"
|
||||
new "Tana"
|
||||
|
||||
# game/src/misc_definitions.rpy:62
|
||||
old "Trevor"
|
||||
new "Trevor"
|
||||
|
||||
# game/src/misc_definitions.rpy:73
|
||||
old "Chet"
|
||||
new "Chet"
|
||||
|
||||
186
game/tl/es/src/mod_menu.rpy
Normal file
@@ -0,0 +1,186 @@
|
||||
# TODO: Translation updated at 2024-10-07 00:57
|
||||
|
||||
translate es strings:
|
||||
|
||||
# game/src/mod_menu.rpy:584
|
||||
old "the root of the mods folder"
|
||||
new "la carpeta base de mods"
|
||||
|
||||
# game/src/mod_menu.rpy:597
|
||||
old " for '{color=#ffbdbd}"
|
||||
new " para '{color=#ffbdbd}"
|
||||
|
||||
# game/src/mod_menu.rpy:597
|
||||
old "{/color}' language"
|
||||
new "{/color}' del lenguaje"
|
||||
|
||||
# game/src/mod_menu.rpy:605
|
||||
old "{color=#ff1e1e}Mod in "
|
||||
new "{color=#ff1e1e}El mod "
|
||||
|
||||
# game/src/mod_menu.rpy:605
|
||||
old " failed to load: Metadata is formatted incorrectly. Check log.txt or console for more info.{/color}"
|
||||
new " no se pudo cargar: Los metadatos no están correctamente formateados. Revisa log.txt o la consola para más información.{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:607
|
||||
old "{color=#ff8b1f}Metadata in "
|
||||
new "{color=#ff8b1f}Los metadatos en "
|
||||
|
||||
# game/src/mod_menu.rpy:607
|
||||
old " is formatted incorrectly. Check log.txt or console for more info.{/color}"
|
||||
new " no están correctamente formateados. Revisa log.txt o la consola para más información.{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:609
|
||||
old "{color=#ff8b1f}Mod's name in "
|
||||
new "{color=#ff8b1f}El nombre del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:609
|
||||
old " is not a string.{/color}"
|
||||
new " no es un texto.{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:611
|
||||
old "{color=#ff8b1f}Mod's label in "
|
||||
new "{color=#ff8b1f}La label del mod en "
|
||||
|
||||
# game/src/mod_menu.rpy:613
|
||||
old "{color=#ff8b1f}Display mode in "
|
||||
new "{color=#ff8b1f}El modo de display del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:615
|
||||
old " is not valid. Valid options are 'both', 'icon' and 'name', not "
|
||||
new " no es válido. Las opciones validas son 'both', 'icon' y 'name', no "
|
||||
|
||||
# game/src/mod_menu.rpy:615
|
||||
old ".{/color}"
|
||||
new ".{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:617
|
||||
old "{color=#ff8b1f}Mod's version in "
|
||||
new "{color=#ff8b1f}La versión del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:619
|
||||
old "{color=#ff8b1f}Mod's authors in "
|
||||
new "{color=#ff8b1f}Los autores del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:619
|
||||
old " is not a string or list.{/color}"
|
||||
new " no es un texto o lista.{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:621
|
||||
old "{color=#ff8b1f}Author "
|
||||
new "{color=#ff8b1f}El autor "
|
||||
|
||||
# game/src/mod_menu.rpy:621
|
||||
old " in "
|
||||
new " de "
|
||||
|
||||
# game/src/mod_menu.rpy:623
|
||||
old "{color=#ff8b1f}Mod's links in "
|
||||
new "{color=#ff8b1f}Los links del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:625
|
||||
old "{color=#ff8b1f}Link "
|
||||
new "{color=#ff8b1f}El link "
|
||||
|
||||
# game/src/mod_menu.rpy:627
|
||||
old "{color=#ff8b1f}Mod's description in "
|
||||
new "{color=#ff8b1f}La descripción del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:629
|
||||
old "{color=#ff8b1f}Mod's mobile description in "
|
||||
new "{color=#ff8b1f}La descripción para celular del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:631
|
||||
old "{color=#ff8b1f}Mod's screenshot displayables in "
|
||||
new "{color=#ff8b1f}Las screenshots displayables del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:631
|
||||
old " is not a list.{/color}"
|
||||
new " no es una lista.{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:633
|
||||
old "{color=#ff8b1f}Screenshot Displayable "
|
||||
new "{color=#ff8b1f}La screenshot displayable "
|
||||
|
||||
# game/src/mod_menu.rpy:635
|
||||
old "{color=#ff8b1f}Mod's icon displayable in "
|
||||
new "{color=#ff8b1f}El icono displayable del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:637
|
||||
old "{color=#ff8b1f}Mod's thumbnail displayable in "
|
||||
new "{color=#ff8b1f}La miniatura displayable del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:639
|
||||
old " failed to load: Does not have a mod ID.{/color}"
|
||||
new " no se pudo cargar: No tiene ID.{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:641
|
||||
old " failed to load: ID is not a string.{/color}"
|
||||
new " no se pudo cargar: Su ID no es un texto.{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:643
|
||||
old " failed to load: Another mod "
|
||||
new " no se pudo cargar: Otro mod "
|
||||
|
||||
# game/src/mod_menu.rpy:643
|
||||
old " has the same ID.{/color}"
|
||||
new " tiene el mismo ID.{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:645
|
||||
old " is not installed correctly.\nMake sure it's structure is "
|
||||
new " no está instalado correctamente.\nAsegurate de que su estructura sea "
|
||||
|
||||
# game/src/mod_menu.rpy:645
|
||||
old " instead of "
|
||||
new " en vez de "
|
||||
|
||||
# game/src/mod_menu.rpy:647
|
||||
old "{color=#ff8b1f}"
|
||||
new "{color=#ff8b1f}"
|
||||
|
||||
# game/src/mod_menu.rpy:647
|
||||
old " image for mod in "
|
||||
new " imagen del mod "
|
||||
|
||||
# game/src/mod_menu.rpy:647
|
||||
old " has an incompatible file extension. {a=https://www.renpy.org/doc/html/displayables.html#images}Only use images that Ren'Py supports!{/a}{/color}"
|
||||
new " tiene un formato incompatible. {a=https://www.renpy.org/doc/html/displayables.html#images}¡Solo usa imagenes que Renpy soporte!{/a}{/color}"
|
||||
|
||||
# game/src/mod_menu.rpy:708
|
||||
old "Reload Mods"
|
||||
new "Recargar Mods"
|
||||
|
||||
# game/src/mod_menu.rpy:888
|
||||
old "You have no mods! \nInstall some in:\n\"{color=#abd7ff}[mod_menu_moddir]{/color}\""
|
||||
new "¡No tienes mods! \nInstala algunos en:\n\"{color=#abd7ff}[mod_menu_moddir]{/color}\""
|
||||
|
||||
# game/src/mod_menu.rpy:969
|
||||
old "Name: "
|
||||
new "Nombre: "
|
||||
|
||||
# game/src/mod_menu.rpy:973
|
||||
old "Version: "
|
||||
new "Versión: "
|
||||
|
||||
# game/src/mod_menu.rpy:978
|
||||
old "Authors: "
|
||||
new "Autores: "
|
||||
|
||||
# game/src/mod_menu.rpy:982
|
||||
old "Author: "
|
||||
new "Autor: "
|
||||
|
||||
# game/src/mod_menu.rpy:987
|
||||
old "Links: "
|
||||
new "Links: "
|
||||
|
||||
# game/src/mod_menu.rpy:991
|
||||
old "Link: "
|
||||
new "Link: "
|
||||
|
||||
# game/src/mod_menu.rpy:1062
|
||||
old "Installing mods is dangerous since you are running unknown code in your computer. Only install mods from sources that you trust.\n\nIf you have problems with installed mods, check the README.md in the root of the mods folder."
|
||||
new "Instalar mods es peligroso, ya que estás ejecutando código desconocido en tu ordenador. Sólo instala mods de fuentes en las que confíes.\n\nSi tienes problemas con los mods instalados, consulta el archivo README.md (Inglés) en la raíz de la carpeta de mods."
|
||||
|
||||
old "Show Errors"
|
||||
new "Mostrar Errores"
|
||||
8
game/tl/es/src/translation.rpy
Normal file
@@ -0,0 +1,8 @@
|
||||
# TODO: Translation updated at 2024-10-07 00:57
|
||||
|
||||
translate es strings:
|
||||
|
||||
# game/src/translation.rpy:28
|
||||
old "OK"
|
||||
new "OK"
|
||||
|
||||
1208
game/tl/it/common.rpy
Normal file
BIN
game/tl/it/images/NotForKids!/fangonamp text.webp
Normal file
|
After Width: | Height: | Size: 6.5 KiB |
BIN
game/tl/it/images/backgrounds/home fang day alt text.webp
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
game/tl/it/images/cgs/a14 text.webp
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
game/tl/it/images/cgs/bathroom1 text.webp
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
game/tl/it/images/cgs/c02 text.webp
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
game/tl/it/images/cgs/d01 text.webp
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
game/tl/it/images/cgs/fuckedwingretard text.webp
Normal file
|
After Width: | Height: | Size: 41 KiB |