Merge pull request 'Closes: #50 Add Mod Support' (#51) from nutbuster/SnootGame:Monster-Update-6 into Monster-Update-6
Reviewed-on: https://git.snootgame.xyz/Cavemanon/SnootGame/pulls/51
12
game/gui.rpy
|
@ -23,10 +23,10 @@ init python:
|
|||
## The colors of text in the interface.
|
||||
|
||||
## An accent color used throughout the interface to label and highlight text.
|
||||
define gui.accent_color = '#FF00FC'
|
||||
define gui.accent_color = '#A2029F'
|
||||
|
||||
## The color used for a text button when it is neither selected nor hovered.
|
||||
define gui.idle_color = '#FFFE00'
|
||||
define gui.idle_color = '#D5D507'
|
||||
|
||||
## The small color is used for small text, which needs to be brighter/darker to
|
||||
## achieve the same effect.
|
||||
|
@ -103,6 +103,8 @@ 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 ####################################################################
|
||||
##
|
||||
|
@ -119,11 +121,9 @@ define gui.textbox_yalign = 1.0
|
|||
|
||||
## The placement of the speaking character's name, relative to the textbox.
|
||||
## These can be a whole number of pixels from the left or top, or 0.5 to center.
|
||||
define gui.name_xpos = 350
|
||||
define gui.name_xpos = 395 #350
|
||||
define gui.name_ypos = -85
|
||||
|
||||
define gui.name_large_xpos = 395
|
||||
|
||||
## The horizontal alignment of the character's name. This can be 0.0 for left-
|
||||
## aligned, 0.5 for centered, and 1.0 for right-aligned.
|
||||
define gui.name_xalign = 0.5
|
||||
|
@ -452,7 +452,7 @@ init python:
|
|||
gui.label_text_size = 51
|
||||
|
||||
## Namebox
|
||||
gui.name_xpos = 345
|
||||
gui.name_xpos = 395
|
||||
gui.name_ypos = -85
|
||||
|
||||
## Adjust the location of the textbox.
|
||||
|
|
After Width: | Height: | Size: 23 KiB |
After Width: | Height: | Size: 86 KiB |
After Width: | Height: | Size: 215 KiB |
Before Width: | Height: | Size: 425 KiB |
Before Width: | Height: | Size: 549 KiB |
Before Width: | Height: | Size: 210 KiB |
Before Width: | Height: | Size: 226 KiB After Width: | Height: | Size: 226 KiB |
Before Width: | Height: | Size: 246 KiB After Width: | Height: | Size: 246 KiB |
Before Width: | Height: | Size: 204 KiB After Width: | Height: | Size: 204 KiB |
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 167 KiB |
Before Width: | Height: | Size: 183 KiB After Width: | Height: | Size: 183 KiB |
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 199 KiB |
Before Width: | Height: | Size: 266 KiB After Width: | Height: | Size: 266 KiB |
Before Width: | Height: | Size: 214 KiB After Width: | Height: | Size: 214 KiB |
|
@ -0,0 +1,54 @@
|
|||
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
|
||||
|
||||
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.
|
||||
|
||||
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 ---
|
||||
In the root of the mods folder:
|
||||
folder_of_your_mod_name
|
||||
- name_of_storyline.rpy
|
||||
-> asset_folder
|
||||
- asset.png
|
||||
-> script_folder
|
||||
- script.rpy
|
||||
|
||||
name_of_storyline.rpy
|
||||
```
|
||||
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
|
||||
```
|
||||
|
||||
script_folder/script.rpy
|
||||
```
|
||||
label chapter_1_new:
|
||||
show template_sample at scenter
|
||||
"Sample Text"
|
||||
|
||||
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.
|
||||
|
|
@ -0,0 +1,11 @@
|
|||
|
||||
|
||||
label chapter_2_new:
|
||||
show template_sample at scenter
|
||||
"Sample Text"
|
||||
|
||||
hide template_sample
|
||||
play music 'audio/OST/Those Other Two Weirdos.ogg'
|
||||
show anon neutral flip at aright with dissolve
|
||||
A "Sample Text"
|
||||
return
|
After Width: | Height: | Size: 468 B |
|
@ -0,0 +1,15 @@
|
|||
|
||||
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': "Example Mod Name",
|
||||
'Label': "storyline_ex"
|
||||
}];
|
||||
|
||||
image template_sample = Image("mods_example/template/img/sample.png")
|
||||
|
||||
label storyline_ex:
|
||||
call chapter_2_new
|
|
@ -23,7 +23,7 @@ define gui.show_name = True
|
|||
|
||||
## The version of the game.
|
||||
|
||||
define config.version = "Patchy-patch5"
|
||||
define config.version = "Patchy-patch5.1.1"
|
||||
|
||||
## Text that is placed on the game's about screen. Place the text between the
|
||||
## triple-quotes, and leave a blank line between paragraphs.
|
||||
|
@ -77,7 +77,7 @@ define config.exit_transition = dissolve
|
|||
|
||||
## Between screens of the game menu.
|
||||
|
||||
define config.intra_transition = dissolve
|
||||
define config.intra_transition = Dissolve(0.20)
|
||||
|
||||
|
||||
## A transition that is used after a game has been loaded.
|
||||
|
@ -185,6 +185,11 @@ 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)
|
||||
|
||||
|
||||
## To archive files, classify them as 'archive'.
|
||||
|
||||
# build.classify('game/**.png', 'archive')
|
||||
|
|
330
game/screens.rpy
|
@ -1,10 +1,30 @@
|
|||
################################################################################
|
||||
###Updater Python stuff###
|
||||
init python:
|
||||
if persistent.updateresult is None:
|
||||
persistent.updateresult = "No new version is available"
|
||||
if persistent.autoup is None:
|
||||
persistent.autoup = False
|
||||
if persistent.updateWebServer is None:
|
||||
persistent.updateWebServer = "http://updates.snootgame.xyz/updates.json"
|
||||
|
||||
def UpdateCheck():
|
||||
# WHY YES I ONLY ALLOW PEOPLE USING MY FRAMEWORK TO CHECK FOR AN UPDATE EVERY SIX FUCKING HOURS HOW DID YOU KNOW
|
||||
# NOPE check_interval=5 (5 SECONDS) FUCK YOU
|
||||
pendingVersion = updater.UpdateVersion(persistent.updateWebServer, check_interval=5)
|
||||
if pendingVersion == None or pendingVersion == config.version or "TEST" in pendingVersion:
|
||||
persistent.updateresult = "No new version is available"
|
||||
else:
|
||||
persistent.updateresult = pendingVersion
|
||||
|
||||
def ToggleAutoUpdate():
|
||||
persistent.autoup = not persistent.autoup
|
||||
|
||||
################################################################################
|
||||
## Initialization
|
||||
################################################################################
|
||||
|
||||
init offset = -1
|
||||
|
||||
|
||||
################################################################################
|
||||
## Styles
|
||||
################################################################################
|
||||
|
@ -102,7 +122,7 @@ screen say(who, what):
|
|||
id "window"
|
||||
|
||||
if who is not None:
|
||||
background Image("gui/textbox.png", xalign=0.5, yalign=1.0)
|
||||
background Image("gui/textbox_long.png", xalign=0.5, yalign=1.0)
|
||||
window:
|
||||
id "namebox"
|
||||
style "namebox"
|
||||
|
@ -146,9 +166,6 @@ style namebox:
|
|||
xpos gui.name_xpos
|
||||
ypos gui.name_ypos
|
||||
|
||||
style namebox_large is namebox:
|
||||
xpos gui.name_large_xpos
|
||||
|
||||
style say_label:
|
||||
properties gui.text_properties("name", accent=True)
|
||||
xalign gui.name_xalign
|
||||
|
@ -263,22 +280,21 @@ screen quick_menu():
|
|||
## Ensure this appears on top of other screens.
|
||||
zorder 100
|
||||
if quick_menu:
|
||||
window:
|
||||
background "gui/namebox.png"
|
||||
xpos 1.45
|
||||
ypos 0.977
|
||||
grid 1 4:
|
||||
style_prefix "quick"
|
||||
xalign -0.005
|
||||
yalign 0.010
|
||||
window:
|
||||
xpos 1.45
|
||||
ypos 0.977
|
||||
vbox:
|
||||
style_prefix "quick"
|
||||
xalign -0.005
|
||||
yalign 0.010
|
||||
|
||||
use quick_buttons("gui/button/uioptionbuttons/template_idle.png", \
|
||||
[ \
|
||||
[ "Skip", Skip() ], \
|
||||
[ "Save", ShowMenu('save') ], \
|
||||
[ "Auto", Preference("auto-forward", "toggle") ], \
|
||||
[ "Load", ShowMenu('load') ] \
|
||||
] )
|
||||
use quick_buttons("gui/button/uioptionbuttons/template_idle.png",
|
||||
[
|
||||
[ "Skip", Skip() ],
|
||||
[ "Save", ShowMenu('save') ],
|
||||
[ "Auto", Preference("auto-forward", "toggle") ],
|
||||
[ "Load", ShowMenu('load') ]
|
||||
] )
|
||||
|
||||
screen score_menu():
|
||||
zorder 100
|
||||
|
@ -339,7 +355,7 @@ screen navigation():
|
|||
textbutton _("Load") action ShowMenu("load")
|
||||
textbutton _("Delete") action ShowMenu("delete")
|
||||
textbutton _("Options") action ShowMenu("preferences")
|
||||
textbutton _("Extras") action ShowMenu("extras")
|
||||
#textbutton _("Extras") action ShowMenu("extras")
|
||||
textbutton _("Return") action Return()
|
||||
|
||||
|
||||
|
@ -383,7 +399,7 @@ screen main_menu_button(filename, label, function):
|
|||
ymaximum 129
|
||||
action function
|
||||
fixed:
|
||||
add filename xalign 0.5 yalign 0.5 zoom 1
|
||||
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
|
||||
|
||||
# label_functions is [ [ "label", function() ], [ "foobar", foobar() ], .. ]
|
||||
|
@ -416,24 +432,19 @@ screen main_menu():
|
|||
else:
|
||||
add "gui/snootgame.png"
|
||||
vbox:
|
||||
spacing 25
|
||||
spacing 10
|
||||
xpos 1885
|
||||
yalign 0.9
|
||||
yalign 0.98
|
||||
use main_menu_buttons("gui/button/menubuttons/template_idle.png",
|
||||
[ \
|
||||
[ "Start", Start() ], \
|
||||
[ "Load", ShowMenu("load") ], \
|
||||
[ "Options", ShowMenu("preferences") ], \
|
||||
[ "Help & About", ShowMenu("extras") ], \
|
||||
[ "Quit", Quit(confirm=not main_menu) ] \
|
||||
[
|
||||
[ "Start", Start() ],
|
||||
[ "Mods", ShowMenu("mod_menu") ],
|
||||
[ "Load", ShowMenu("load") ],
|
||||
[ "Options", ShowMenu("preferences") ],
|
||||
[ "Extras", ShowMenu("extras") ], \
|
||||
[ "Quit", Quit(confirm=not main_menu) ]
|
||||
] )
|
||||
|
||||
# if gui.show_name:
|
||||
#
|
||||
# vbox:
|
||||
# text "[config.version]":
|
||||
# style "main_menu_version"
|
||||
|
||||
on "show" action renpy.start_predict_screen("cg_gallery")
|
||||
|
||||
style main_menu_frame is empty
|
||||
style main_menu_vbox is vbox
|
||||
|
@ -600,69 +611,33 @@ style return_button:
|
|||
screen about():
|
||||
|
||||
tag menu
|
||||
style_prefix "main_menu"
|
||||
|
||||
## This use statement includes the game_menu screen inside this one. The
|
||||
## vbox child is then included inside the viewport inside the game_menu
|
||||
## screen.
|
||||
use game_menu(_("About"), scroll="viewport"):
|
||||
add gui.main_menu_background
|
||||
add gui.extras_submenu_panel
|
||||
|
||||
style_prefix "about"
|
||||
## This empty frame darkens the main menu.
|
||||
frame:
|
||||
pass
|
||||
|
||||
vbox:
|
||||
## The use statement includes another screen inside this one. The actual
|
||||
## contents of the main menu are in the navigation screen.
|
||||
|
||||
label "[config.name!t]"
|
||||
text _("Version [config.version!t]\n")
|
||||
vbox:
|
||||
yalign 0.00
|
||||
yoffset 100
|
||||
xoffset 80
|
||||
xmaximum 1100
|
||||
label "[config.name!t]"
|
||||
text _("Version [config.version!t]\n")
|
||||
|
||||
## gui.about is usually set in options.rpy.
|
||||
if gui.about:
|
||||
text "[gui.about!t]\n"
|
||||
|
||||
text _("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}.")
|
||||
textbutton "Back to Extras" action ShowMenu("extras")
|
||||
|
||||
## This is redefined in options.rpy to add text to the about screen.
|
||||
define gui.about = ""
|
||||
|
||||
|
||||
style about_label is gui_label
|
||||
style about_label_text is gui_label_text
|
||||
style about_text is gui_text
|
||||
|
||||
style about_label_text:
|
||||
size gui.label_text_size
|
||||
|
||||
## Gallery screen ################################################################
|
||||
##
|
||||
## This screen holds the Gallery.
|
||||
##
|
||||
|
||||
screen gallery():
|
||||
|
||||
tag menu
|
||||
|
||||
## This use statement includes the game_menu screen inside this one. The
|
||||
## vbox child is then included inside the viewport inside the game_menu
|
||||
## screen.
|
||||
use game_menu(_("Gallery"), scroll="viewport"):
|
||||
|
||||
style_prefix "gallery"
|
||||
|
||||
vbox:
|
||||
|
||||
label "[config.name!t]"
|
||||
text _("Version [config.version!t]\n")
|
||||
|
||||
text _("Placeholder for gallery.")
|
||||
textbutton "Back to Extras" action ShowMenu("extras")
|
||||
|
||||
|
||||
style gallery_label is gui_label
|
||||
style gallery_label_text is gui_label_text
|
||||
style gallery_text is gui_text
|
||||
|
||||
style gallery_label_text:
|
||||
size gui.label_text_size
|
||||
## 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 ################################################################
|
||||
##
|
||||
|
@ -672,42 +647,59 @@ style gallery_label_text:
|
|||
screen updates():
|
||||
|
||||
tag menu
|
||||
style_prefix "main_menu"
|
||||
|
||||
## This use statement includes the game_menu screen inside this one. The
|
||||
## vbox child is then included inside the viewport inside the game_menu
|
||||
## screen.
|
||||
use game_menu(_("Updates"), scroll="viewport"):
|
||||
add gui.main_menu_background
|
||||
add gui.extras_submenu_panel
|
||||
|
||||
style_prefix "updates"
|
||||
## This empty frame darkens the main menu.
|
||||
frame:
|
||||
pass
|
||||
|
||||
vbox:
|
||||
## The use statement includes another screen inside this one. The actual
|
||||
## contents of the main menu are in the navigation screen.
|
||||
|
||||
label "[config.name!t]"
|
||||
text _("Your Version is [config.version!t]\n")
|
||||
textbutton "[update]" ##action Update()
|
||||
textbutton "Back to Extras" action ShowMenu("extras")
|
||||
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}") action [Notify("Checking for update..."), Function(UpdateCheck)]
|
||||
|
||||
## This is redefined in options.rpy to add text to the about screen.
|
||||
define gui.update = ""
|
||||
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}") action updater.Update(persistent.updateWebServer, force=False)
|
||||
else:
|
||||
textbutton _("{size=36}Update Now!\n{/size}") action Notify("Nothing to update to!")
|
||||
|
||||
|
||||
style update_label is gui_label
|
||||
style update_label_text is gui_label_text
|
||||
style update_text is gui_text
|
||||
style page_button is gui_button
|
||||
style page_button_text is gui_button_text
|
||||
|
||||
|
||||
style update_label_text:
|
||||
size gui.label_text_size
|
||||
|
||||
style update_button:
|
||||
properties gui.button_properties("page_button")
|
||||
|
||||
style update_button_text:
|
||||
properties gui.button_text_properties("page_button")
|
||||
use extrasnavigation
|
||||
|
||||
## Load and Save screens #######################################################
|
||||
##
|
||||
|
@ -859,7 +851,7 @@ screen preferences():
|
|||
|
||||
tag menu
|
||||
|
||||
use game_menu(_("Preferences"), scroll="viewport"):
|
||||
use game_menu(_("Options"), scroll="viewport"):
|
||||
|
||||
vbox:
|
||||
|
||||
|
@ -1119,14 +1111,41 @@ style history_label_text:
|
|||
## A screen that combines help, about, updates, gallery,
|
||||
screen extras():
|
||||
tag menu
|
||||
|
||||
style_prefix "main_menu"
|
||||
|
||||
add gui.main_menu_background
|
||||
|
||||
## This empty frame darkens the main menu.
|
||||
frame:
|
||||
pass
|
||||
|
||||
use extrasnavigation
|
||||
|
||||
##Extras Navigation Screen #####################################################
|
||||
##
|
||||
##This screen is to be reused in
|
||||
screen extrasnavigation():
|
||||
vbox:
|
||||
textbutton _("Help") action ShowMenu("help")
|
||||
textbutton _("About") action ShowMenu("about")
|
||||
textbutton _("Updates") action ShowMenu("updates")
|
||||
textbutton _("Gallery") action ShowMenu("gallery")
|
||||
textbutton _("Return") action ShowMenu("main_menu")
|
||||
|
||||
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") ],
|
||||
[ "Updates", ShowMenu("updates") ],
|
||||
[ "Gallery", ShowMenu("cg_gallery_0") ],
|
||||
[ "Return", ShowMenu("main_menu") ]
|
||||
] )
|
||||
|
||||
## Help screen #################################################################
|
||||
##
|
||||
|
@ -1138,33 +1157,50 @@ screen help():
|
|||
|
||||
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
|
||||
|
||||
default device = "keyboard"
|
||||
|
||||
use game_menu(_("Help"), scroll="viewport"):
|
||||
# vbox:
|
||||
# xpos 1100
|
||||
# ## ypos 1000
|
||||
# yalign 0.4
|
||||
# spacing 23
|
||||
|
||||
style_prefix "help"
|
||||
fixed:
|
||||
hbox:
|
||||
xpos 200
|
||||
spacing 23
|
||||
style_prefix "help"
|
||||
textbutton _("Keyboard") action SetScreenVariable("device", "keyboard")
|
||||
textbutton _("Mouse") action SetScreenVariable("device", "mouse")
|
||||
if GamepadExists():
|
||||
textbutton _("Gamepad") action SetScreenVariable("device", "gamepad")
|
||||
|
||||
vbox:
|
||||
spacing 23
|
||||
|
||||
hbox:
|
||||
|
||||
textbutton _("Keyboard") action SetScreenVariable("device", "keyboard")
|
||||
textbutton _("Mouse") action SetScreenVariable("device", "mouse")
|
||||
textbutton "Back to Extras" action ShowMenu("extras")
|
||||
if GamepadExists():
|
||||
textbutton _("Gamepad") action SetScreenVariable("device", "gamepad")
|
||||
|
||||
yalign 0.5
|
||||
xpos 1100
|
||||
if device == "keyboard":
|
||||
use keyboard_help
|
||||
elif device == "mouse":
|
||||
use mouse_help
|
||||
elif device == "gamepad":
|
||||
use gamepad_help
|
||||
text _("") ## again in here to keep vbox in check
|
||||
|
||||
use extrasnavigation
|
||||
|
||||
|
||||
|
||||
screen keyboard_help():
|
||||
|
||||
style_prefix "help"
|
||||
hbox:
|
||||
label _("Enter")
|
||||
text _("Advances dialogue and activates the interface.")
|
||||
|
@ -1211,7 +1247,7 @@ screen keyboard_help():
|
|||
|
||||
|
||||
screen mouse_help():
|
||||
|
||||
style_prefix "help"
|
||||
hbox:
|
||||
label _("Left Click")
|
||||
text _("Advances dialogue and activates the interface.")
|
||||
|
@ -1234,7 +1270,7 @@ screen mouse_help():
|
|||
|
||||
|
||||
screen gamepad_help():
|
||||
|
||||
style_prefix "help"
|
||||
hbox:
|
||||
label _("Right Trigger\nA/Bottom Button")
|
||||
text _("Advances dialogue and activates the interface.")
|
||||
|
@ -1262,7 +1298,7 @@ screen gamepad_help():
|
|||
|
||||
textbutton _("Calibrate") action GamepadCalibrate()
|
||||
|
||||
|
||||
#this bit is might need trimming or rework
|
||||
style help_button is gui_button
|
||||
style help_button_text is gui_button_text
|
||||
style help_label is gui_label
|
||||
|
@ -1285,8 +1321,6 @@ style help_label_text:
|
|||
xalign 1.0
|
||||
text_align 1.0
|
||||
|
||||
|
||||
|
||||
################################################################################
|
||||
## Additional screens
|
||||
################################################################################
|
||||
|
|
|
@ -13,17 +13,23 @@
|
|||
#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 random
|
||||
import webbrowser
|
||||
#function for insult layers
|
||||
def showCG():
|
||||
import random
|
||||
import webbrowser
|
||||
#function for insult layers
|
||||
def showCG():
|
||||
files = ["text0", "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])
|
||||
if persistent.scroll == True:
|
||||
if persistent.scroll == True:
|
||||
config.keymap['dismiss'].append('mousedown_4')
|
||||
|
||||
transform randPosition:
|
||||
|
@ -80,40 +86,35 @@ transform randPosition:
|
|||
# attribute guitar:
|
||||
# "guitar.webp"
|
||||
|
||||
#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 A = Character ('Anon',color="#36E12D") #Light Green
|
||||
define F = Character ('Fang',color="#7E2DE1") #Purple
|
||||
define Lucy = Character ('Lucy',color="#7E2DE1") #Purple
|
||||
define Ro = Character ('Rosa',color="#E12D36") #Red
|
||||
define St = Character ('Stella',color="#E17E2D") #orang
|
||||
define N = Character ('Naomi',color="#2D36E1") #Blue
|
||||
define Nas = Character ('Naser',color="#501D5E") #Dark Purple
|
||||
define T = Character ('Trish',color="#8A0036") #Maroon
|
||||
define Attendant = Character ('Attendant',color="#8A0036") #Maroon
|
||||
define Sp = Character ('Spears',color="#7B8A00") #Dark Yellow
|
||||
define Re = Character ('Reed',color="#368A00") #Dark Green
|
||||
define D = Character ('Driver',color="#098A00")
|
||||
define FM = Character ('Fangs Mom',color="#EA1A84")
|
||||
define FD = Character ('Fangs Dad',color="#1A1CEA")
|
||||
define Tsuki = Character ('Mr. Tsuki',color="#CEAF23")
|
||||
define unknown = Character ('(???)',color="#000000")
|
||||
define jingo = Character ('Mr. Jingo',color="#42C053")
|
||||
define MaitD = Character ('Maitre D',color="#42C053")
|
||||
define Moe = Character('Moe',color="#42C053")
|
||||
define Vince = Character ('Vince',color="#3C770D") #Dark Green
|
||||
define Waitress = Character ('Waitress',color="#C89B19") #Gold
|
||||
define A = Character ('Anon',color="#36E12D", who_outlines=[(1, '#0C300A')]) # Light Green
|
||||
define F = Character ('Fang',color="#B4D4CE", who_outlines=[(1, '#112D27')]) # Light Cyan
|
||||
define Lucy = Character ('Lucy',color="#B4D4CE", who_outlines=[(1, '#112D27')]) # Light Cyan
|
||||
define Ro = Character ('Rosa',color="#FE712B", who_outlines=[(1, '#3D1809')]) # Red-Orange
|
||||
define St = Character ('Stella',color="#D2FFAA", who_outlines=[(1, '#203011')]) # Light Green
|
||||
define N = Character ('Naomi',color="#F8B9A0", who_outlines=[(1, '#291A1B')]) # Peach
|
||||
define Nas = Character ('Naser',color="#F89E38", who_outlines=[(1, '#2D2D2D')]) # Orange
|
||||
define T = Character ('Trish',color="#B675E6", who_outlines=[(1, '#1F0632')]) # Purple
|
||||
define Attendant = Character ('Attendant',color="#8A0036", who_outlines=[(1, '#FFFFFF')]) # Maroon
|
||||
define Sp = Character ('Spears',color="#C4C3C3", who_outlines=[(1, '#272727')]) # Light Grey
|
||||
define Re = Character ('Reed',color="#ED4C5B", who_outlines=[(1, '#361013')]) # Bright Red
|
||||
define D = Character ('Driver',color="#FFC63A", who_outlines=[(1, '#4D280A')]) # Yellow-Orange
|
||||
define FM = Character ('Fangs Mom',color="#FFD8F6", who_outlines=[(1, '#361730')]) # Bright Pink
|
||||
define FD = Character ('Fangs Dad',color="#D8A09A", who_outlines=[(1, '#190E0F')]) # Desaturated Orange
|
||||
define Tsuki = Character ('Mr. Tsuki',color="#A7F2A2", who_outlines=[(1, '#320E3B')]) # Pear Green
|
||||
define unknown = Character ('(???)',color="#000000", who_outlines=[(1, '#FFFFFF')]) # Black
|
||||
define jingo = Character ('Mr. Jingo',color="#CD8283", who_outlines=[(1, '#0F0D49')]) # Desaturated Red
|
||||
define MaitD = Character ('Maitre D',color="#241630", who_outlines=[(1, '#241630')]) # Cobalt Blue
|
||||
define Moe = Character('Moe',color="#A5BEED", who_outlines=[(1, '#342210')]) # Desaturated Blue
|
||||
define Vince = Character ('Vince',color="#FFC63A", who_outlines=[(1, '#4D280A')]) # Yellow-Orange
|
||||
define Waitress = Character ('Waitress',color="#F691C8", who_outlines=[(1, '#402E3A')]) # Pink
|
||||
#long TB chars
|
||||
|
||||
define AnonAndFang = Character('Anon and Fang',color="34F313", **long_textbox)
|
||||
define SV = Character ('Street Vendor',color="#420046", **long_textbox)
|
||||
define carl = Character ('Mr. Carldewskii',color="#4963A5", **long_textbox)
|
||||
define Drf = Character ('Dr. Fernsworth',color="#4963A5", **long_textbox)
|
||||
define FRT = Character ('Fang Reed & Trish',color="#4963A5", **long_textbox)
|
||||
|
||||
define AnonAndFang = Character('Anon and Fang',color="72DFA8", who_outlines=[(1, '#113623')])
|
||||
define SV = Character ('Street Vendor',color="#F8E120", who_outlines=[(1, '#361504')])
|
||||
define carl = Character ('Mr. Carldewskii',color="#E19E40", who_outlines=[(1, '#03223B')])
|
||||
define Drf = Character ('Dr. Fernsworth',color="#253354", who_outlines=[(1, '#334573')])
|
||||
define FRT = Character ('Fang Reed & Trish',color="#4963A5", who_outlines=[(1, '#FFFFFF')])
|
||||
|
||||
#Extra image translations
|
||||
#siloettes
|
||||
|
@ -297,6 +298,13 @@ image black = "#000"
|
|||
label splashscreen:
|
||||
$ persistent.splashtype = random.randint(0,2000 - 1)
|
||||
$ renpy.movie_cutscene("images/intros/CaveManonProductions.webm")
|
||||
|
||||
if persistent.autoup:
|
||||
python:
|
||||
UpdateCheck()
|
||||
if persistent.updateresult != "No new version is available":
|
||||
updater.update(persistent.updateWebServer, force=True)
|
||||
|
||||
stop sound
|
||||
return
|
||||
|
||||
|
|
|
@ -774,7 +774,7 @@ label chapter_1:
|
|||
|
||||
Nas "Look, whatever happens promise you won’t hold this against them."
|
||||
|
||||
Nas "They're actually a really a nice person once you get to know them"
|
||||
Nas "They're actually a really nice person once you get to know them"
|
||||
|
||||
A "Naser why did you just murder the english language in cold blood?"
|
||||
|
||||
|
|
|
@ -115,32 +115,32 @@ label chapter_10:
|
|||
|
||||
A "...Fine..."
|
||||
|
||||
scene wounds1 with fade
|
||||
scene wounds01 with fade
|
||||
pause 2
|
||||
scene black with fade
|
||||
"I step into my tiny shower stall and turn on the water."
|
||||
|
||||
"The shower head sputters before it starts weakly spraying lukewarm water."
|
||||
|
||||
scene wounds2 with fade
|
||||
scene wounds02 with fade
|
||||
|
||||
"The temperature of the water doesn’t help the tension in my muscles or the bruises marring my skin."
|
||||
|
||||
"I stretch around and see massive blotches of purple and black splattered across my torso."
|
||||
|
||||
scene wounds3
|
||||
scene wounds03
|
||||
|
||||
"Each contusion is hot to the touch under my fingers and the pain is intense."
|
||||
|
||||
scene wounds4
|
||||
scene wounds04
|
||||
|
||||
"The worst is across my chest where the bollard hit me."
|
||||
|
||||
scene wounds5
|
||||
scene wounds05
|
||||
|
||||
"I eventually get finished examining my wicked wounds and step out of the bathroom. Fang is on her phone doing Raptor Jesus knows what."
|
||||
|
||||
scene wounds6
|
||||
scene wounds06
|
||||
|
||||
"Fang then pats the bed"
|
||||
|
||||
|
@ -148,7 +148,7 @@ label chapter_10:
|
|||
|
||||
"I walk over and lie down on my stomach"
|
||||
|
||||
scene wounds7
|
||||
scene wounds07
|
||||
|
||||
F "Jesus that's bad..."
|
||||
|
||||
|
@ -193,11 +193,11 @@ label chapter_10:
|
|||
A "Hm?"
|
||||
|
||||
F "I need to do the front."
|
||||
scene wounds8
|
||||
scene wounds08
|
||||
"Oh."
|
||||
|
||||
"Okay then. I roll over onto my back."
|
||||
scene wounds9
|
||||
scene wounds09
|
||||
"And find myself face to beak with her."
|
||||
|
||||
"Dangerously close."
|
||||
|
|
|
@ -1853,8 +1853,6 @@ label chapter_13D:
|
|||
|
||||
"Curled up around my pillow, suckling on her thumb."
|
||||
|
||||
"And my present to her still hung around securely on her neck."
|
||||
|
||||
"I go back to the scrapbook, enjoying the memories I’ve shared with my friends."
|
||||
|
||||
"And to think I wanted to stay a loner when I first got here."
|
||||
|
|
|
@ -1244,7 +1244,7 @@ label chapter_2:
|
|||
|
||||
A "Huh?"
|
||||
|
||||
Re "Get your phone out man… Look up {color=#66cc33}'LW_S9znpklI'{/color}.."
|
||||
Re "Get your phone out man… Look up {color=#66cc33}'T9nXyUye3pg'{/color}.."
|
||||
|
||||
A "How did you say that out loud?"
|
||||
|
||||
|
|
|
@ -288,7 +288,7 @@ label chapter_5:
|
|||
label movie:
|
||||
A "FANG!"
|
||||
stop music fadeout 1.0
|
||||
image fang tail = Movie(play="animations/fangtail.webm",loop=True)
|
||||
image fang tail = Movie(play="animations/fang tail.webm",loop=True)
|
||||
|
||||
scene fang tail with fade
|
||||
|
||||
|
@ -502,7 +502,7 @@ label chapter_5:
|
|||
|
||||
F "{i}Uuuuughhhhh…{/i}"
|
||||
|
||||
F "...Allright, whatever."
|
||||
F "...Alright, whatever."
|
||||
|
||||
Ro "Go, go now! And no more tripping!"
|
||||
|
||||
|
@ -2547,3 +2547,7 @@ label chapter_5:
|
|||
"..."
|
||||
|
||||
return
|
||||
|
||||
label fang_movie:
|
||||
scene fang tail with fade
|
||||
""
|
||||
|
|
|
@ -2598,7 +2598,7 @@ label chapter_6:
|
|||
|
||||
A "Like… Like her passion, Naser. She adores music. Adores {i}playing{/i} music."
|
||||
|
||||
A "And she has theses… moments where I can see the softer side of her."
|
||||
A "And she has these… moments where I can see the softer side of her."
|
||||
|
||||
"The pop of knuckles from Naser tells me I should rephrase that."
|
||||
|
||||
|
|
|
@ -174,11 +174,11 @@ label chapter_7:
|
|||
#>>golden
|
||||
St "Upright Strength"
|
||||
St "OH! I don’t think you need to worry about what’s to come, Anon."
|
||||
elif anonscore >= 3 and fangscore <= 2:
|
||||
elif anonscore >= 3 and fangscore <= 3:
|
||||
#>>tradwife
|
||||
St "Inverted Hierophant."
|
||||
St "You need to be wary of your words and actions, Anon."
|
||||
elif anonscore <= 2 and fangscore >= 3:
|
||||
elif anonscore <= 3 and fangscore >= 3:
|
||||
#>>doomer
|
||||
St "Inverted Hermit."
|
||||
St "Anon, if you ever feel lonely you can come to me."
|
||||
|
@ -641,166 +641,167 @@ label chapter_7:
|
|||
F "T-tuesday?"
|
||||
|
||||
"Fang fell out of tempo with Reed’s drums, stumbling over the end of the song."
|
||||
"It’s silent."
|
||||
"It’s silent."
|
||||
|
||||
"I began to clap, followed by several other patrons."
|
||||
"I began to clap, followed by several other patrons."
|
||||
|
||||
"Including Stella who looked seconds away from being curb-stomped."
|
||||
"Including Stella who looked seconds away from being curb-stomped."
|
||||
|
||||
"Rosa is on the other side of the room, too entranced by the music to care."
|
||||
"Rosa is on the other side of the room, too entranced by the music to care."
|
||||
|
||||
play music 'audio/OST/Summertime Synth.ogg' fadein 1.0
|
||||
scene moebackrooms
|
||||
show anon neutral flip at aright
|
||||
with fade
|
||||
"My eyes scan the room before noticing Trish, the sheer vehement rage radiating from her visibly distorting the air around her."
|
||||
play music 'audio/OST/Summertime Synth.ogg' fadein 1.0
|
||||
scene moebackrooms
|
||||
show anon neutral flip at aright
|
||||
with fade
|
||||
"My eyes scan the room before noticing Trish, the sheer vehement rage radiating from her visibly distorting the air around her."
|
||||
|
||||
"Fuck."
|
||||
stop music fadeout 1.0
|
||||
"Fuck."
|
||||
stop music fadeout 1.0
|
||||
|
||||
"My jaw aches as I picture myself in Stella’s place, courtesy of one pissed of womanlet."
|
||||
"My jaw aches as I picture myself in Stella’s place, courtesy of one pissed of womanlet."
|
||||
|
||||
"Before I have the chance to escape I hear my one saving grace."
|
||||
"Before I have the chance to escape I hear my one saving grace."
|
||||
|
||||
show fang very happy with moveinleft:
|
||||
xalign 0.6 yalign 0.1
|
||||
show fang very happy with moveinleft:
|
||||
xalign 0.6 yalign 0.1
|
||||
|
||||
F "ANON!"
|
||||
F "ANON!"
|
||||
|
||||
"Fang reaches me before Trish leaves the stage, extending her hand for a high-five."
|
||||
show fang happy with dissolve
|
||||
"Fang reaches me before Trish leaves the stage, extending her hand for a high-five."
|
||||
show fang happy with dissolve
|
||||
|
||||
F "We did it!"
|
||||
show trish unimpressed at tleft with moveinleft
|
||||
T "No thanks to that asshole!"
|
||||
F "We did it!"
|
||||
show trish unimpressed at tleft with moveinleft
|
||||
T "No thanks to that asshole!"
|
||||
|
||||
"Oh no."
|
||||
"Oh no."
|
||||
|
||||
show fang neutral flip behind anon with dissolve
|
||||
show fang neutral flip behind anon with dissolve
|
||||
|
||||
F "What’s wrong?"
|
||||
F "What’s wrong?"
|
||||
|
||||
show trish angry with dissolve
|
||||
show trish angry with dissolve
|
||||
|
||||
T "Skinnie sabotaged the show!"
|
||||
T "Skinnie sabotaged the show!"
|
||||
|
||||
T "I told him not to touch the wires and look what happened!"
|
||||
T "I told him not to touch the wires and look what happened!"
|
||||
|
||||
A "I was only trying to help."
|
||||
A "I was only trying to help."
|
||||
|
||||
show trish annoyed with dissolve
|
||||
show trish annoyed with dissolve
|
||||
|
||||
"Trish holds up her hand to my face, waving the other around in grand gestures."
|
||||
"Trish holds up her hand to my face, waving the other around in grand gestures."
|
||||
|
||||
show trish indignant with dissolve
|
||||
show trish indignant with dissolve
|
||||
|
||||
T "You ruined the big finale! We missed our chance to make it big!"
|
||||
T "You ruined the big finale! We missed our chance to make it big!"
|
||||
|
||||
T "Why is it that only my bass cut out anyways?!"
|
||||
T "Why is it that only my bass cut out anyways?!"
|
||||
|
||||
T "Are you actively trying to ruin us?!"
|
||||
T "Are you actively trying to ruin us?!"
|
||||
|
||||
T "I told you Reed knew what he was doing!"
|
||||
T "I told you Reed knew what he was doing!"
|
||||
|
||||
T "Do you not trust him and I?"
|
||||
T "Do you not trust him and I?"
|
||||
|
||||
show fang sad flip
|
||||
show trish fury point:
|
||||
yalign 10.0
|
||||
with dissolve
|
||||
show fang sad flip
|
||||
show trish fury point:
|
||||
yalign 10.0
|
||||
with dissolve
|
||||
|
||||
"Tears trickle down her sweat-glazed face."
|
||||
"Tears trickle down her sweat-glazed face."
|
||||
|
||||
T "Is Fang really the only one here you care about?!"
|
||||
T "Is Fang really the only one here you care about?!"
|
||||
|
||||
T "You are not the only person in the world!"
|
||||
show trish sad at tleft with dissolve
|
||||
show anon sad flip with dissolve
|
||||
T "You are not the only person in the world!"
|
||||
show trish sad at tleft with dissolve
|
||||
show anon sad flip with dissolve
|
||||
|
||||
"This hypocritical bitch!"
|
||||
"This hypocritical bitch!"
|
||||
|
||||
"The sharp words cut right through me."
|
||||
"The sharp words cut right through me."
|
||||
|
||||
F "Jeez, Trish. The show went great! Our first good concert!"
|
||||
F "Jeez, Trish. The show went great! Our first good concert!"
|
||||
|
||||
show fang neutral flip
|
||||
with dissolve
|
||||
F "The crowd actually clapped this time!"
|
||||
show fang neutral flip
|
||||
with dissolve
|
||||
F "The crowd actually clapped this time!"
|
||||
|
||||
T "No thanks to him."
|
||||
T "No thanks to him."
|
||||
|
||||
A "I didn’t do it on purpose."
|
||||
A "I didn’t do it on purpose."
|
||||
|
||||
"Even though you deserved it."
|
||||
"Even though you deserved it."
|
||||
|
||||
"Before she could interrogate me further, Fang grabbed Trish on the arm."
|
||||
"Before she could interrogate me further, Fang grabbed Trish on the arm."
|
||||
|
||||
show fang happy flip with dissolve
|
||||
F "Trish! Didn’t you say you wanted to set up our merch!"
|
||||
show trish unimpressed with dissolve
|
||||
show anon neutral flip with dissolve
|
||||
show fang happy flip with dissolve
|
||||
F "Trish! Didn’t you say you wanted to set up our merch!"
|
||||
show trish unimpressed with dissolve
|
||||
show anon neutral flip with dissolve
|
||||
|
||||
"Trish winces, then gives a begrudging sigh, lowering her accusatory finger."
|
||||
"Trish winces, then gives a begrudging sigh, lowering her accusatory finger."
|
||||
|
||||
show trish unimpressed with dissolve
|
||||
show trish unimpressed with dissolve
|
||||
|
||||
T "Ugh, you aren’t worth it."
|
||||
T "Ugh, you aren’t worth it."
|
||||
|
||||
hide trish with dissolve
|
||||
show fang neutral flip with dissolve
|
||||
"Trish storms off leaving Fang and I alone."
|
||||
hide trish with dissolve
|
||||
show fang neutral flip with dissolve
|
||||
"Trish storms off leaving Fang and I alone."
|
||||
|
||||
"And Reed who was listening the entire time."
|
||||
"And Reed who was listening the entire time."
|
||||
|
||||
show reed neutral at rleft with moveinleft
|
||||
pause 1
|
||||
show reed considering with dissolve
|
||||
pause 1
|
||||
show reed neutral with dissolve
|
||||
pause 1
|
||||
show reed explanatory with dissolve
|
||||
Re "Anon, dude… you really should trust others, y’know?"
|
||||
show reed neutral at rleft with moveinleft
|
||||
pause 1
|
||||
show reed considering with dissolve
|
||||
pause 1
|
||||
show reed neutral with dissolve
|
||||
pause 1
|
||||
show reed explanatory with dissolve
|
||||
Re "Anon, dude… you really should trust others, y’know?"
|
||||
|
||||
Re "It’s like they say… trust is the building block of our economy, or something."
|
||||
Re "It’s like they say… trust is the building block of our economy, or something."
|
||||
|
||||
"What."
|
||||
"What."
|
||||
|
||||
Re "There are two kinds of people in this world, bro... people who believe and people who trust."
|
||||
Re "There are two kinds of people in this world, bro... people who believe and people who trust."
|
||||
|
||||
Re "And you believed in something false, your impulsiveness."
|
||||
show reed shocked
|
||||
show fang surprised
|
||||
show anon neutral
|
||||
with dissolve
|
||||
"Before I can begin to comprehend Reed’s capitalist sermon, my ears are assaulted by very Italian yelling."
|
||||
Re "And you believed in something false, your impulsiveness."
|
||||
show reed shocked
|
||||
show fang surprised
|
||||
show anon neutral
|
||||
with dissolve
|
||||
"Before I can begin to comprehend Reed’s capitalist sermon, my ears are assaulted by very Italian yelling."
|
||||
|
||||
Moe "AY, KIDS!"
|
||||
Moe "AY, KIDS!"
|
||||
|
||||
#moe now has vvurm drama apron
|
||||
show moealt with moveinright:
|
||||
xalign 1.8 yalign 0.0
|
||||
#moe now has vvurm drama apron
|
||||
show moealt with moveinright:
|
||||
xalign 1.8 yalign 0.0
|
||||
|
||||
Moe "LOOKIT DIS ‘ERE AH-PRON YA LIL TRIGGA FRIEN SOL’ ME!"
|
||||
Moe "LOOKIT DIS ‘ERE AH-PRON YA LIL TRIGGA FRIEN SOL’ ME!"
|
||||
|
||||
"Reed looks almost jealous of Moe’s new garb."
|
||||
"Reed looks almost jealous of Moe’s new garb."
|
||||
|
||||
show reed neutral
|
||||
show reed neutral
|
||||
|
||||
Re "Nice threads, compadre."
|
||||
Re "Nice threads, compadre."
|
||||
|
||||
show fang happy with dissolve
|
||||
show fang happy with dissolve
|
||||
|
||||
unknown "Hey! Someone took ma apron!"
|
||||
unknown "Hey! Someone took ma apron!"
|
||||
|
||||
Moe "GIT BACK TA WORK JERRY YER ON DA CLOCK!"
|
||||
Moe "GIT BACK TA WORK JERRY YER ON DA CLOCK!"
|
||||
|
||||
F "It uh… looks nice, Uncle Moe."
|
||||
F "It uh… looks nice, Uncle Moe."
|
||||
|
||||
Moe "Anyways, youse all gonna be helpin’ wit da clean up, right?"
|
||||
Moe "Anyways, youse all gonna be helpin’ wit da clean up, right?"
|
||||
|
||||
"I look at the absolute mess around us."
|
||||
"I look at the absolute mess around us."
|
||||
|
||||
"Fuck."
|
||||
"Fuck."
|
||||
stop music fadeout 1.0
|
||||
|
||||
scene black with fade
|
||||
scene moebackrooms with fade
|
||||
|
@ -812,7 +813,7 @@ label chapter_7:
|
|||
|
||||
"Rosa wanted to stay and help clean buuut…"
|
||||
|
||||
"{i}Ro I am so sorry Stella! Come, I shall nurse you back at my home!{/i}"
|
||||
Ro "{i}I am so sorry Stella! Come, I shall nurse you back at my home!{/i}"
|
||||
|
||||
"I’d feel more sorry for Stella but Rosa looked capable of helping her."
|
||||
|
||||
|
|
|
@ -0,0 +1,285 @@
|
|||
init python:
|
||||
|
||||
# CONST PARAMS
|
||||
ALLOW_ZOOM = False
|
||||
GALLERY_COLS = 3
|
||||
PREFERRED_WIDTH = 432 #px (1920 * 0.225)
|
||||
PREFERRED_HEIGHT = 243 #px (1080 * 0.225)
|
||||
PREFERRED_ASPECT_RATIO = 16.0/9.0 # 1.7777..
|
||||
DEFAULT_WIDTH_SCALE_RATIO = round(float(PREFERRED_WIDTH) / float(1920), 4)
|
||||
DEFAULT_HEIGHT_SCALE_RATIO = round(float(PREFERRED_HEIGHT) / float(1080), 4)
|
||||
NOT_UNLOCKED_COVER = im.FactorScale("gui/gallery/unlocked_cg_button_cover.png", DEFAULT_WIDTH_SCALE_RATIO, DEFAULT_HEIGHT_SCALE_RATIO)
|
||||
ACCEPTED_EXTENSIONS = ["jpg", "webm"]
|
||||
CG_PATHS = [
|
||||
#CG doesn't really make sense
|
||||
{ 'path': "images/cgs/", 'name': "CG", 'eval': None },
|
||||
{ 'path': "images/animations/", 'name': "Animations", 'eval': None },
|
||||
{ 'path': "images/NotForKids!/", 'name': "Lewd",
|
||||
'eval': 'persistent.lewd == True'
|
||||
}
|
||||
]
|
||||
#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, fn is fullpath
|
||||
ext is the file extension
|
||||
{ item: str; fn: str; cg: Displayable; ext: str; wh: [] }[]
|
||||
(reference in this init python, actually used in screens)
|
||||
"""
|
||||
gallery_items = []
|
||||
|
||||
# key dict pair, cg <-> cgs' galleryitems []
|
||||
gallery_dic = {} #
|
||||
for cp in CG_PATHS:
|
||||
gallery_dic[cp['name']] = [] #
|
||||
|
||||
# Make a scaled cg button
|
||||
# (cg: string; ext: string; w: float
|
||||
def cg(fname, ext, w):
|
||||
scale = PREFERRED_WIDTH * 100.0 / w / 100.0
|
||||
#scale = box_ratio(wh)
|
||||
return im.FactorScale(fname, scale, scale, False)
|
||||
|
||||
# Reads /images/cgs dir for all image files
|
||||
# Populates galleryItems
|
||||
# () -> None
|
||||
def loadGallery():
|
||||
|
||||
list_img = renpy.list_images()
|
||||
|
||||
#if ext is "webm":
|
||||
# Add each image to the gallery
|
||||
for str in list_img:
|
||||
for cp in CG_PATHS:
|
||||
for ext in ACCEPTED_EXTENSIONS:
|
||||
path = cp['path']
|
||||
_str = path+str+"."+ext
|
||||
|
||||
if renpy.loadable(_str): #brute force
|
||||
image = renpy.image_size(Image(_str))
|
||||
|
||||
gallery_dic[cp['name']] += [{
|
||||
"item": str,
|
||||
"fn": _str,
|
||||
"cg": cg(_str, ext, image[0]),
|
||||
"ext": ext,
|
||||
"wh": image
|
||||
}]
|
||||
return
|
||||
|
||||
# Call to loading the gallery
|
||||
loadGallery()
|
||||
|
||||
# hard code the webm because renpy is really dumb and doesn't add Movies properly until much later
|
||||
fang_webm = 'images/animations/fang tail.webm'
|
||||
gallery_dic['Animations'] = [{
|
||||
"item": 'fang tail',
|
||||
"fn": fang_webm,
|
||||
"cg": Movie(fang_webm),#cg(_str, 'webm', 1920),
|
||||
"ext": 'webm',
|
||||
"wh": [1920, 1080]
|
||||
}]
|
||||
|
||||
#for zooming in and out
|
||||
zoom_arr = [0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1.0, 1.125, 1.25, 1.5, 1.75, 2.0]
|
||||
|
||||
"""
|
||||
for x in range(1,5):
|
||||
_zoom = 1.0
|
||||
_zoom *= 1+(x*0.25)
|
||||
zoom_arr.append(_zoom)
|
||||
|
||||
for y in range(9,1,-1):
|
||||
_zoom = 1.0
|
||||
_zoom *= (y*0.125)
|
||||
zoom_arr.append(_zoom)
|
||||
|
||||
zoom_arr.sort()
|
||||
"""
|
||||
"""
|
||||
'Recursive' / Loopable / Roundtrip Screens
|
||||
_0 <-> _1
|
||||
"""
|
||||
#There is renpy.restart_interaction but since I wrote all this, it's too late
|
||||
#screen cg_gallery(flag, __yoffset = 0, origin = 'CG'):
|
||||
screen cg_gallery_0(__yoffset = 0, origin = 'CG'):
|
||||
tag menu
|
||||
use cg_gallery('1', __yoffset, origin)
|
||||
screen cg_gallery_1( __yoffset = 0, origin = 'CG'):
|
||||
tag menu
|
||||
use cg_gallery('0', __yoffset, origin)
|
||||
|
||||
#screen view_image(fn, _origin, zoom=1):
|
||||
screen view_image_a(fn, _origin, zoom = zoom_arr.index(1.0)):
|
||||
tag menu
|
||||
use view_image(fn, _origin, zoom, 'b')
|
||||
screen view_image_b(fn, _origin, zoom = zoom_arr.index(1.0)):
|
||||
tag menu
|
||||
use view_image(fn, _origin, zoom, 'a')
|
||||
|
||||
"""
|
||||
CG Gallery screen - A screen that shows the image gallery
|
||||
Basically Gallery Object has terrible defaults, so I just wrote my own stuff
|
||||
"""
|
||||
screen cg_gallery(flag, __yoffset = 0, origin = 'CG'):
|
||||
|
||||
if main_menu:
|
||||
key "game_menu" action ShowMenu("main_menu")
|
||||
|
||||
|
||||
frame:
|
||||
pass
|
||||
add gui.main_menu_background
|
||||
add gui.game_menu_background
|
||||
|
||||
tag menu
|
||||
|
||||
python:
|
||||
empty_spaces = gallery_rows = item_counter = 0
|
||||
|
||||
gallery_items = gallery_dic[origin]
|
||||
items = len(gallery_items)
|
||||
gallery_rows = (items / GALLERY_COLS) + 1
|
||||
empty_spaces = GALLERY_COLS - (items % GALLERY_COLS)
|
||||
|
||||
|
||||
vbox:
|
||||
transform:
|
||||
zoom 0.95
|
||||
hbox:
|
||||
style_prefix "navigation"
|
||||
xalign 0.5
|
||||
|
||||
spacing gui.navigation_spacing
|
||||
|
||||
for cp in CG_PATHS:
|
||||
if cp['name'] == origin:
|
||||
textbutton _(cp['name']) text_color gui.selected_color text_xalign 0.5
|
||||
else:
|
||||
if cp['eval'] is None:
|
||||
textbutton _(cp['name']) action ShowMenu('cg_gallery_'+flag, 0, cp['name']) text_xalign 0.5
|
||||
elif eval(cp['eval']):
|
||||
textbutton _(cp['name']) action ShowMenu('cg_gallery_'+flag, 0, cp['name']) text_xalign 0.5
|
||||
else:
|
||||
textbutton _(cp['name']) text_xalign 0.5
|
||||
textbutton _("Return") action ShowMenu('main_menu') text_xalign 0.5
|
||||
|
||||
if _in_replay:
|
||||
textbutton _("End Replay") action EndReplay(confirm=True)
|
||||
elif not main_menu:
|
||||
textbutton _("Main Menu") action MainMenu()
|
||||
|
||||
transform:
|
||||
zoom 0.95
|
||||
xcenter 0.525
|
||||
ycenter 0.525
|
||||
|
||||
viewport:
|
||||
yinitial __yoffset
|
||||
scrollbars "vertical"
|
||||
mousewheel True
|
||||
draggable True
|
||||
pagekeys True
|
||||
xfill True
|
||||
|
||||
grid GALLERY_COLS gallery_rows:
|
||||
xcenter 0.5
|
||||
ycenter 0.5
|
||||
for item in gallery_items:
|
||||
# Should properly fix with actual margin difference but good
|
||||
# enough or the actual position
|
||||
python:
|
||||
item_counter += 1
|
||||
yoffset = item_counter / 3 * PREFERRED_HEIGHT * 1.15
|
||||
yoffset = int( yoffset + (PREFERRED_HEIGHT * 1.15))
|
||||
|
||||
use flag_button(item, yoffset, origin)
|
||||
|
||||
for i in range(0, empty_spaces):
|
||||
null height 20
|
||||
|
||||
|
||||
"""
|
||||
if/else flow control & extra parameters for Buttons
|
||||
"""
|
||||
screen flag_button(item, yoffset, origin):
|
||||
python:
|
||||
flag = renpy.seen_image(item['item'])
|
||||
|
||||
if flag:
|
||||
button:
|
||||
if item['ext'] == "webm":
|
||||
action Replay('fang_movie')#ShowMenu('view_movie', item, ShowMenu('cg_gallery_0', yoffset, origin))
|
||||
else:
|
||||
action ShowMenu('view_image_a', item, ShowMenu('cg_gallery_0', yoffset, origin))
|
||||
xcenter 0.5 ycenter 0.5
|
||||
padding (1,0,1,2)
|
||||
vbox:
|
||||
text item["item"] xalign 0.5
|
||||
add item["cg"] fit 'contain' xcenter 0.5 ycenter 0.5 size (PREFERRED_WIDTH, PREFERRED_HEIGHT)
|
||||
else:
|
||||
vbox:
|
||||
ymaximum PREFERRED_HEIGHT
|
||||
xcenter 0.5 ycenter 0.5
|
||||
text "? ? ?" xalign 0.5
|
||||
add NOT_UNLOCKED_COVER
|
||||
|
||||
|
||||
screen view_movie(item, _origin):
|
||||
tag menu
|
||||
key "game_menu" action _origin
|
||||
python:
|
||||
renpy.movie_cutscene(item['item'], None, -1)
|
||||
frame:
|
||||
pass
|
||||
#scene fang tail with fade
|
||||
|
||||
|
||||
"""
|
||||
view_image, Loads the image in fullscreen with viewport control.
|
||||
"""
|
||||
screen view_image(item, _origin, zoom = zoom_arr.index(1.0), flag='a'):
|
||||
python:
|
||||
zoom_a = zoom+1
|
||||
zoom_a_f = ShowMenu('view_image_'+flag, item, _origin, zoom_a)
|
||||
zoom_b = zoom-1
|
||||
zoom_b_f = ShowMenu('view_image_'+flag, item, _origin, zoom_b)
|
||||
|
||||
tag menu
|
||||
key "game_menu" action _origin
|
||||
|
||||
# mousewheel & insert+delete
|
||||
if (ALLOW_ZOOM):
|
||||
if zoom < len(zoom_arr)-1: #zoom in
|
||||
key 'mousedown_4' action zoom_a_f
|
||||
key 'K_INSERT' action zoom_a_f
|
||||
if zoom > 0: #and (item['wh'][0] <= 1920 or item['wh'][1] <= 1080):
|
||||
key 'mousedown_5' action zoom_b_f
|
||||
key 'K_DELETE' action zoom_b_f
|
||||
|
||||
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"):
|
||||
edgescroll (300, 1800)
|
||||
draggable True
|
||||
arrowkeys True
|
||||
pagekeys True
|
||||
xfill False
|
||||
yfill False
|
||||
add item['fn'] zoom zoom_arr[zoom] anchor (0.55, 0.55)
|
||||
|
||||
#Reuse quick buttons, Ren'Py handles touch input lazy, it doesn't have
|
||||
#double finger pinch zoom, it translates taps as mouse events - have to use
|
||||
#buttons
|
||||
if (ALLOW_ZOOM) and renpy.variant("small"):
|
||||
hbox:
|
||||
style_prefix "quick"
|
||||
xalign 0.5
|
||||
yalign 0.975
|
||||
use quick_buttons("gui/button/uioptionbuttons/template_idle.png",
|
||||
[
|
||||
[ "+", zoom_a_f ],
|
||||
[ "-", zoom_b_f ]
|
||||
] )
|
|
@ -0,0 +1,69 @@
|
|||
# Mod Menu screen ############################################################
|
||||
##
|
||||
## Handles jumping to the mods scripts
|
||||
## Could be more lean but if this is going to one of last time I touch the UI,
|
||||
## then fine by me
|
||||
##
|
||||
#similar to quick_button funcs
|
||||
screen mod_menu_button(filename, label, function):
|
||||
button:
|
||||
xmaximum 600
|
||||
ymaximum 129
|
||||
action function
|
||||
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
|
||||
|
||||
# arr is [{
|
||||
# 'Name': string (name that appears on the button)
|
||||
# 'Label': string (jump label)
|
||||
# }, { .. } ]
|
||||
# Reuse the same image string and keep things 'neat'.
|
||||
screen mod_menu_buttons(filename, arr):
|
||||
for x in arr:
|
||||
use mod_menu_button(filename, x['Name'], Start(x['Label']))
|
||||
|
||||
screen mod_menu():
|
||||
|
||||
tag menu
|
||||
|
||||
style_prefix "main_menu"
|
||||
|
||||
add gui.main_menu_background
|
||||
|
||||
frame:
|
||||
xsize 420
|
||||
yfill True
|
||||
background "gui/overlay/main_menu.png"
|
||||
|
||||
#side_yfill True
|
||||
vbox:
|
||||
xpos 1940
|
||||
yalign 0.03
|
||||
if persistent.splashtype == 1:
|
||||
add "gui/sneedgame.png"
|
||||
else:
|
||||
add "gui/snootgame.png"
|
||||
|
||||
viewport:
|
||||
# this could be better but its ok for now
|
||||
xpos 1885-540
|
||||
xmaximum 540
|
||||
ymaximum 0.8
|
||||
ypos 200
|
||||
yinitial 0
|
||||
scrollbars "vertical"
|
||||
mousewheel True
|
||||
draggable True
|
||||
pagekeys True
|
||||
vbox:
|
||||
#xpos 1885
|
||||
spacing 18
|
||||
#yalign 0.98
|
||||
|
||||
#buttons are messed up but that's ok
|
||||
use mod_menu_button("gui/button/menubuttons/template_idle.png", "Return", ShowMenu("main_menu"))
|
||||
if len(mod_menu_access) is not 0:
|
||||
use mod_menu_buttons("gui/button/menubuttons/template_idle.png", mod_menu_access )
|
||||
else:
|
||||
use mod_menu_button("gui/button/menubuttons/template_idle.png", "You have no mods", None)
|