diff --git a/.gitignore b/.gitignore index 4a613fc..692c457 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ ehthumbs_vista.db #backups *.bak + +#android +.android.json diff --git a/android-icon_foreground.png b/android-icon_foreground.png new file mode 100644 index 0000000..1851be8 Binary files /dev/null and b/android-icon_foreground.png differ diff --git a/android-presplash.jpg b/android-presplash.jpg new file mode 100644 index 0000000..cf9e623 Binary files /dev/null and b/android-presplash.jpg differ diff --git a/game/gui.rpy b/game/gui.rpy index 9f55ddf..d8a3daf 100644 --- a/game/gui.rpy +++ b/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 @@ -445,14 +445,14 @@ init python: ## Font sizes. gui.text_size = 44 - gui.name_text_size = 48 + gui.name_text_size = 46 gui.notify_text_size = 38 gui.interface_text_size = 45 gui.button_text_size = 45 gui.label_text_size = 51 ## Namebox - gui.name_xpos = 345 + gui.name_xpos = 395 gui.name_ypos = -85 ## Adjust the location of the textbox. diff --git a/game/gui/gallery/unlocked_cg_button_cover.png b/game/gui/gallery/unlocked_cg_button_cover.png new file mode 100644 index 0000000..9781519 Binary files /dev/null and b/game/gui/gallery/unlocked_cg_button_cover.png differ diff --git a/game/gui/overlay/extras_submenu.png b/game/gui/overlay/extras_submenu.png new file mode 100644 index 0000000..4d673d0 Binary files /dev/null and b/game/gui/overlay/extras_submenu.png differ diff --git a/game/gui/overlay/extras_submenu_panel.png b/game/gui/overlay/extras_submenu_panel.png new file mode 100644 index 0000000..46b1642 Binary files /dev/null and b/game/gui/overlay/extras_submenu_panel.png differ diff --git a/game/images/animations/fangtail.webm b/game/images/animations/fang tail.webm similarity index 100% rename from game/images/animations/fangtail.webm rename to game/images/animations/fang tail.webm diff --git a/game/images/cgs/d04.jpg b/game/images/cgs/d04.jpg deleted file mode 100644 index adb0363..0000000 Binary files a/game/images/cgs/d04.jpg and /dev/null differ diff --git a/game/images/cgs/d04a.jpg b/game/images/cgs/d04a.jpg deleted file mode 100644 index 7a90ef4..0000000 Binary files a/game/images/cgs/d04a.jpg and /dev/null differ diff --git a/game/images/cgs/fangfuneral2.jpg b/game/images/cgs/fangfuneral2.jpg deleted file mode 100644 index 3da4f87..0000000 Binary files a/game/images/cgs/fangfuneral2.jpg and /dev/null differ diff --git a/game/images/cgs/wounds1.jpg b/game/images/cgs/wounds01.jpg similarity index 100% rename from game/images/cgs/wounds1.jpg rename to game/images/cgs/wounds01.jpg diff --git a/game/images/cgs/wounds2.jpg b/game/images/cgs/wounds02.jpg similarity index 100% rename from game/images/cgs/wounds2.jpg rename to game/images/cgs/wounds02.jpg diff --git a/game/images/cgs/wounds3.jpg b/game/images/cgs/wounds03.jpg similarity index 100% rename from game/images/cgs/wounds3.jpg rename to game/images/cgs/wounds03.jpg diff --git a/game/images/cgs/wounds4.jpg b/game/images/cgs/wounds04.jpg similarity index 100% rename from game/images/cgs/wounds4.jpg rename to game/images/cgs/wounds04.jpg diff --git a/game/images/cgs/wounds5.jpg b/game/images/cgs/wounds05.jpg similarity index 100% rename from game/images/cgs/wounds5.jpg rename to game/images/cgs/wounds05.jpg diff --git a/game/images/cgs/wounds6.jpg b/game/images/cgs/wounds06.jpg similarity index 100% rename from game/images/cgs/wounds6.jpg rename to game/images/cgs/wounds06.jpg diff --git a/game/images/cgs/wounds7.jpg b/game/images/cgs/wounds07.jpg similarity index 100% rename from game/images/cgs/wounds7.jpg rename to game/images/cgs/wounds07.jpg diff --git a/game/images/cgs/wounds8.jpg b/game/images/cgs/wounds08.jpg similarity index 100% rename from game/images/cgs/wounds8.jpg rename to game/images/cgs/wounds08.jpg diff --git a/game/images/cgs/wounds9.jpg b/game/images/cgs/wounds09.jpg similarity index 100% rename from game/images/cgs/wounds9.jpg rename to game/images/cgs/wounds09.jpg diff --git a/game/mods/README.md b/game/mods/README.md new file mode 100644 index 0000000..cf6b09b --- /dev/null +++ b/game/mods/README.md @@ -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. + diff --git a/game/mods_example/template/chapter2_redo.rpy b/game/mods_example/template/chapter2_redo.rpy new file mode 100644 index 0000000..a5a1b71 --- /dev/null +++ b/game/mods_example/template/chapter2_redo.rpy @@ -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 diff --git a/game/mods_example/template/img/sample.png b/game/mods_example/template/img/sample.png new file mode 100644 index 0000000..a90472f Binary files /dev/null and b/game/mods_example/template/img/sample.png differ diff --git a/game/mods_example/template/storyline_ex.rpy b/game/mods_example/template/storyline_ex.rpy new file mode 100644 index 0000000..ab3f492 --- /dev/null +++ b/game/mods_example/template/storyline_ex.rpy @@ -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 diff --git a/game/options.rpy b/game/options.rpy index 76119cc..91c0e82 100644 --- a/game/options.rpy +++ b/game/options.rpy @@ -23,7 +23,7 @@ define gui.show_name = True ## The version of the game. -define config.version = "Patchy-patch5" +define config.version = "Monster-Update-6" ## 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') diff --git a/game/screens.rpy b/game/screens.rpy index 2031d83..b9d4bce 100644 --- a/game/screens.rpy +++ b/game/screens.rpy @@ -1,1680 +1,1737 @@ -################################################################################ -## Initialization -################################################################################ - -init offset = -1 - - -################################################################################ -## Styles -################################################################################ - -style default: - properties gui.text_properties() - language gui.language - -style input: - properties gui.text_properties("input", accent=True) - adjust_spacing False - -style hyperlink_text: - properties gui.text_properties("hyperlink", accent=True) - hover_underline True - -style gui_text: - properties gui.text_properties("interface") - - -style button: - properties gui.button_properties("button") - -style button_text is gui_text: - properties gui.text_properties("button") - yalign 0.5 - - -style label_text is gui_text: - properties gui.text_properties("label", accent=True) - -style prompt_text is gui_text: - properties gui.text_properties("prompt") - - -style bar: - ysize gui.bar_size - left_bar Frame("gui/bar/left.png", gui.bar_borders, tile=gui.bar_tile) - right_bar Frame("gui/bar/right.png", gui.bar_borders, tile=gui.bar_tile) - -style vbar: - xsize gui.bar_size - top_bar Frame("gui/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) - bottom_bar Frame("gui/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) - -style scrollbar: - ysize gui.scrollbar_size - base_bar Frame("gui/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) - thumb Frame("gui/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) - -style vscrollbar: - xsize gui.scrollbar_size - base_bar Frame("gui/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) - thumb Frame("gui/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) - -style slider: - ysize gui.slider_size - base_bar Frame("gui/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) - thumb "gui/slider/horizontal_[prefix_]thumb.png" - -style vslider: - xsize gui.slider_size - base_bar Frame("gui/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) - thumb "gui/slider/vertical_[prefix_]thumb.png" - - -style frame: - padding gui.frame_borders.padding - background Frame("gui/frame.png", gui.frame_borders, tile=gui.frame_tile) - - - -################################################################################ -## In-game screens -################################################################################ - - -## Say screen ################################################################## -## -## The say screen is used to display dialogue to the player. It takes two -## parameters, who and what, which are the name of the speaking character and -## the text to be displayed, respectively. (The who parameter can be None if no -## name is given.) -## -## This screen must create a text displayable with id "what", as Ren'Py uses -## this to manage text display. It can also create displayables with id "who" -## and id "window" to apply style properties. -## -## https://www.renpy.org/doc/html/screen_special.html#say - -screen say(who, what): - style_prefix "say" - - window: - id "window" - - if who is not None: - background Image("gui/textbox.png", xalign=0.5, yalign=1.0) - window: - id "namebox" - style "namebox" - text who id "who" - else: - background Image("gui/textbox_no_hitch.png", xalign=0.5, yalign=1.0) - - text what id "what" - - - ## If there's a side image, display it above the text. Do not display on the - ## phone variant - there's no room. - if not renpy.variant("small"): - add SideImage() xalign 0.0 yalign 1.0 - - -## Make the namebox available for styling through the Character object. -init python: - config.character_id_prefixes.append('namebox') - -style window is default -style say_label is default -style say_dialogue is default -style say_thought is say_dialogue - -style namebox is default -style namebox_label is say_label - - -style window: - xalign 0.5 - xfill True - yalign gui.textbox_yalign - ysize gui.textbox_height - xoffset 0 - yoffset gui.window_yoffset - xcenter 0.5 - -style namebox: - xalign 0.5 - 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 - yalign 0.5 - xanchor gui.name_xalign - -style say_dialogue: - properties gui.text_properties("dialogue") - - xpos gui.dialogue_xpos - xsize gui.dialogue_width - ypos gui.dialogue_ypos - - -## Input screen ################################################################ -## -## This screen is used to display renpy.input. The prompt parameter is used to -## pass a text prompt in. -## -## This screen must create an input displayable with id "input" to accept the -## various input parameters. -## -## https://www.renpy.org/doc/html/screen_special.html#input - -screen input(prompt): - style_prefix "input" - - 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 - xpos gui.dialogue_xpos - xsize gui.dialogue_width - ypos gui.dialogue_ypos - yoffset gui.input_yoffset #for mobile OSK - - text prompt style "input_prompt" - input id "input" - -style input_prompt is default - -style input_prompt: - xalign gui.dialogue_text_xalign - properties gui.text_properties("input_prompt") - -style input: - xalign gui.dialogue_text_xalign - xmaximum gui.dialogue_width - - -## Choice screen ############################################################### -## -## This screen is used to display the in-game choices presented by the menu -## statement. The one parameter, items, is a list of objects, each with caption -## and action fields. -## -## https://www.renpy.org/doc/html/screen_special.html#choice - -screen choice(items): - style_prefix "choice" - - vbox: - for i in items: - textbutton i.caption action i.action - - -## When this is true, menu captions will be spoken by the narrator. When false, -## menu captions will be displayed as empty buttons. -define config.narrator_menu = True - - -style choice_vbox is vbox -style choice_button is button -style choice_button_text is button_text - -style choice_vbox: - xalign 0.5 - ypos 405 - yanchor 0.5 - - spacing gui.choice_spacing - -style choice_button is default: - properties gui.button_properties("choice_button") - -style choice_button_text is default: - properties gui.button_text_properties("choice_button") - - -## Quick Menu screen ########################################################### -## -## The quick menu is displayed in-game to provide easy access to the out-of-game -## menus. - -screen quick_button(filename, label, function): - button: - xmaximum 80 - ymaximum 72 - action function - 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" - -# 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]) - -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 - - 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 - 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 - -style quick_button is default -style quick_button_text is button_text - -style quick_button: - properties gui.button_properties("quick_button") - -style quick_button_text: - #properties gui.button_text_properties("quick_button") - color gui.selected_color - hover_color gui.hover_color - selected_color gui.accent_color - - -################################################################################ -## Main and Game Menu Screens -################################################################################ - -## Navigation screen ########################################################## -## -## This screen is included in the main and game menus, and provides navigation -## to other menus, and to start the game. - -screen navigation(): - - vbox: - style_prefix "navigation" - xpos gui.notMM_navigation_xpos - yalign 0.5 - - - spacing gui.navigation_spacing - - textbutton _("History") action ShowMenu("history") - textbutton _("Save") action ShowMenu("save") - textbutton _("Load") action ShowMenu("load") - textbutton _("Delete") action ShowMenu("delete") - textbutton _("Options") action ShowMenu("preferences") - textbutton _("Extras") action ShowMenu("extras") - textbutton _("Return") action Return() - - - if _in_replay: - - textbutton _("End Replay") action EndReplay(confirm=True) - - elif not main_menu: - - textbutton _("Main Menu") action MainMenu() - #textbutton _("Debug Score Card") action ShowMenu("score_menu") - - #if renpy.variant("pc"): - - ## The quit button is banned on iOS and unnecessary on Android and - ## Web. - #textbutton _("Quit") action Quit() - - -style navigation_button is gui_button -style navigation_button_text is gui_button_text - -style navigation_button: - size_group "navigation" - properties gui.button_properties("navigation_button") - -style navigation_button_text: - properties gui.button_text_properties("navigation_button") - - -## Main Menu screen ############################################################ -## -## Used to display the main menu when Ren'Py starts. -## -## https://www.renpy.org/doc/html/screen_special.html#main-menu - -#similar to quick_button funcs -screen main_menu_button(filename, label, function): - button: - xmaximum 500 - ymaximum 129 - action function - fixed: - add filename xalign 0.5 yalign 0.5 zoom 1 - text label xalign 0.5 yalign 0.5 xanchor 0.5 - -# label_functions is [ [ "label", function() ], [ "foobar", foobar() ], .. ] -# Reuse the same image string and keep things 'neat'. -screen main_menu_buttons(filename, label_functions): - for l_f in label_functions: - use main_menu_button(filename, l_f[0], l_f[1]) - -screen main_menu(): - - ## This ensures that any other menu screen is replaced. - tag menu - - style_prefix "main_menu" - - add gui.main_menu_background - - - ## 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: - 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", - [ \ - [ "Start", Start() ], \ - [ "Load", ShowMenu("load") ], \ - [ "Options", ShowMenu("preferences") ], \ - [ "Help & About", ShowMenu("extras") ], \ - [ "Quit", Quit(confirm=not main_menu) ] \ - ] ) - -# if gui.show_name: -# -# vbox: -# text "[config.version]": -# style "main_menu_version" - - -style main_menu_frame is empty -style main_menu_vbox is vbox -style main_menu_text is gui_text -style main_menu_title is main_menu_text -style main_menu_version is main_menu_text - -style main_menu_frame: - xsize 420 - yfill True - - background "gui/overlay/main_menu.png" - -style main_menu_vbox: - xalign 1.0 - xoffset -30 - xmaximum 1200 - yalign 1.0 - yoffset -60 - -style main_menu_text: - properties gui.text_properties("main_menu") #, accent=True) - color gui.main_menu_color - hover_color gui.hover_color - size gui.main_menu_text_size - -style main_menu_title: - properties gui.text_properties("title") - -#style main_menu_version: -# properties gui.text_properties("version") - - -## 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 -## transcluded (placed) inside it. - -screen game_menu(title, scroll=None, yinitial=0.0): - - style_prefix "game_menu" - - if main_menu: - add gui.main_menu_background - else: - add gui.game_menu_background - - frame: - style "game_menu_outer_frame" - - hbox: - - ## Reserve space for the navigation section. - frame: - style "game_menu_navigation_frame" - - frame: - style "game_menu_content_frame" - - if scroll == "viewport": - - viewport: - yinitial yinitial - scrollbars "vertical" - mousewheel True - draggable True - pagekeys True - - side_yfill True - - vbox: - transclude - - elif scroll == "vpgrid": - - vpgrid: - cols 1 - yinitial yinitial - - scrollbars "vertical" - mousewheel True - draggable True - pagekeys True - - side_yfill True - - transclude - - else: - - transclude - - use navigation - - label title - - if main_menu: - key "game_menu" action ShowMenu("main_menu") - - -style game_menu_outer_frame is empty -style game_menu_navigation_frame is empty -style game_menu_content_frame is empty -style game_menu_viewport is gui_viewport -style game_menu_side is gui_side -style game_menu_scrollbar is gui_vscrollbar - -style game_menu_label is gui_label -style game_menu_label_text is gui_label_text - -style return_button is navigation_button -style return_button_text is navigation_button_text - -style game_menu_outer_frame: - bottom_padding 45 - top_padding 180 - - background "gui/overlay/game_menu.png" - -style game_menu_navigation_frame: - xsize 420 - yfill True - -style game_menu_content_frame: - left_margin 60 - right_margin 30 - top_margin 15 - -style game_menu_viewport: - xsize 1380 - -style game_menu_vscrollbar: - unscrollable gui.unscrollable - -style game_menu_side: - spacing 15 - -style game_menu_label: - xpos 75 - ysize 180 - -style game_menu_label_text: - size gui.title_text_size - color gui.accent_color - yalign 0.5 - -style return_button: - xpos gui.navigation_xpos - yalign 1.0 - yoffset -45 - - -## About screen ################################################################ -## -## This screen gives credit and copyright information about the game and Ren'Py. -## -## There's nothing special about this screen, and hence it also serves as an -## example of how to make a custom screen. - -screen about(): - - 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(_("About"), scroll="viewport"): - - style_prefix "about" - - vbox: - - 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 - - -## Updates screen ################################################################ -## -## This screen houses the updates option using the built-in updates capabilities of Ren'Py. -## - -screen updates(): - - 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(_("Updates"), scroll="viewport"): - - style_prefix "updates" - - vbox: - - label "[config.name!t]" - text _("Your Version is [config.version!t]\n") - textbutton "[update]" ##action Update() - textbutton "Back to Extras" action ShowMenu("extras") - - - -## This is redefined in options.rpy to add text to the about screen. -define gui.update = "" - - -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") - -## Load and Save screens ####################################################### -## -## These screens are responsible for letting the player save the game and load -## it again. Since they share nearly everything in common, both are implemented -## in terms of a third screen, file_slots. -## -## https://www.renpy.org/doc/html/screen_special.html#save https:// -## www.renpy.org/doc/html/screen_special.html#load - -screen save(): - - tag menu - - use file_slots(_("Save")) - - -screen load(): - - tag menu - - use file_slots(_("Load")) - -screen delete(): - - tag menu - - use file_slots(_("Delete"), True) - -screen file_slots(title, flag=False): - - default page_name_value = FilePageNameInputValue(pattern=_("Page {}"), auto=_("Automatic saves"), quick=_("Quick saves")) - - use game_menu(title): - - fixed: - - ## This ensures the input will get the enter event before any of the - ## buttons do. - order_reverse True - - ## The page name - button: - style "page_label" - - key_events True - xalign 0.5 - #action page_name_value.Toggle() - - input: - style "page_label_text" - value page_name_value - - ## The grid of file slots. - grid gui.file_slot_cols gui.file_slot_rows: - style_prefix "slot" - - xalign 0.5 - yalign 0.5 - - spacing gui.slot_spacing - - for i in range(gui.file_slot_cols * gui.file_slot_rows): - - $ slot = i + 1 - - button: - if flag: - action FileDelete(slot) - else: - action FileAction(slot) - - has vbox - - add FileScreenshot(slot) xalign 0.5 - - text FileTime(slot, format=_("{#file_time}%A, %B %d %Y, %H:%M"), empty=_("Empty Slot")): - style "slot_time_text" - - text FileSaveName(slot): - style "slot_name_text" - - key "save_delete" action FileDelete(slot) - - ## Buttons to access other pages. - hbox: - style_prefix "page" - - xalign 0.5 - yalign 1.0 - - spacing gui.page_spacing - - textbutton _("<") action FilePagePrevious() - - if config.has_autosave: - textbutton _("{#auto_page}A") action FilePage("auto") - - if config.has_quicksave: - textbutton _("{#quick_page}Q") action FilePage("quick") - - ## range(1, 10) gives the numbers from 1 to 9. - for page in range(1, 10): - textbutton "[page]" action FilePage(page) - - textbutton _(">") action FilePageNext() - - -style page_label is gui_label -style page_label_text is gui_label_text -style page_button is gui_button -style page_button_text is gui_button_text - -style slot_button is gui_button -style slot_button_text is gui_button_text -style slot_time_text is slot_button_text -style slot_name_text is slot_button_text - -style page_label: - xpadding 75 - ypadding 5 - -style page_label_text: - text_align 0.5 - layout "subtitle" - hover_color gui.hover_color - -style page_button: - properties gui.button_properties("page_button") - -style page_button_text: - properties gui.button_text_properties("page_button") - -style slot_button: - properties gui.button_properties("slot_button") - -style slot_button_text: - properties gui.button_text_properties("slot_button") - - -## Preferences screen ########################################################## -## -## The preferences screen allows the player to configure the game to better suit -## themselves. -## -## https://www.renpy.org/doc/html/screen_special.html#preferences - -screen preferences(): - - tag menu - - use game_menu(_("Preferences"), scroll="viewport"): - - vbox: - - hbox: - box_wrap True - - if renpy.variant("pc") or renpy.variant("web"): - - vbox: - style_prefix "radio" - label _("Display") - textbutton _("Window") action Preference("display", "any window") - textbutton _("Fullscreen") action Preference("display", "fullscreen") - - vbox: - style_prefix "radio" - label _("Rollback Side") - textbutton _("Disable") action Preference("rollback side", "disable") - textbutton _("Left") action Preference("rollback side", "left") - textbutton _("Right") action Preference("rollback side", "right") - vbox: - style_prefix "check" - label _("Naughty Stuff") - textbutton _("Enable Lewd Images") action ToggleVariable("persistent.lewd", True, False) - - vbox: - style_prefix "check" - label _("Requires Restart") - textbutton _("Enable Forward-Scroll Movement") action ToggleVariable("persistent.scroll", True, False) - - - vbox: - style_prefix "check" - label _("Skip") - textbutton _("Unseen Text") action Preference("skip", "toggle") - textbutton _("After Choices") action Preference("after choices", "toggle") - textbutton _("Transitions") action InvertSelected(Preference("transitions", "toggle")) - - ## Additional vboxes of type "radio_pref" or "check_pref" can be - ## added here, to add additional creator-defined preferences. - - null height (4 * gui.pref_spacing) - - hbox: - style_prefix "slider" - box_wrap True - - vbox: - - label _("Text Speed") - - bar value Preference("text speed") - - label _("Auto-Forward Time") - - bar value Preference("auto-forward time") - - vbox: - - if config.has_music: - label _("Music Volume") - - hbox: - bar value Preference("music volume") - - if config.has_sound: - - label _("Sound Volume") - - hbox: - bar value Preference("sound volume") - - if config.sample_sound: - textbutton _("Test") action Play("sound", config.sample_sound) - - - if config.has_voice: - label _("Voice Volume") - - hbox: - bar value Preference("voice volume") - - if config.sample_voice: - textbutton _("Test") action Play("voice", config.sample_voice) - - if config.has_music or config.has_sound or config.has_voice: - null height gui.pref_spacing - - textbutton _("Mute All"): - action Preference("all mute", "toggle") - style "mute_all_button" - - -style pref_label is gui_label -style pref_label_text is gui_label_text -style pref_vbox is vbox - -style radio_label is pref_label -style radio_label_text is pref_label_text -style radio_button is gui_button -style radio_button_text is gui_button_text -style radio_vbox is pref_vbox - -style check_label is pref_label -style check_label_text is pref_label_text -style check_button is gui_button -style check_button_text is gui_button_text -style check_vbox is pref_vbox - -style slider_label is pref_label -style slider_label_text is pref_label_text -style slider_slider is gui_slider -style slider_button is gui_button -style slider_button_text is gui_button_text -style slider_pref_vbox is pref_vbox - -style mute_all_button is check_button -style mute_all_button_text is check_button_text - -style pref_label: - top_margin gui.pref_spacing - bottom_margin 3 - -style pref_label_text: - yalign 1.0 - -style pref_vbox: - xsize 338 - -style radio_vbox: - spacing gui.pref_button_spacing - -style radio_button: - properties gui.button_properties("radio_button") - foreground "gui/button/radio_[prefix_]foreground.png" - -style radio_button_text: - properties gui.button_text_properties("radio_button") - -style check_vbox: - spacing gui.pref_button_spacing - -style check_button: - properties gui.button_properties("check_button") - foreground "gui/button/check_[prefix_]foreground.png" - -style check_button_text: - properties gui.button_text_properties("check_button") - -style slider_slider: - xsize 525 - -style slider_button: - properties gui.button_properties("slider_button") - yalign 0.5 - left_margin 15 - -style slider_button_text: - properties gui.button_text_properties("slider_button") - -style slider_vbox: - xsize 675 - - -## History screen ############################################################## -## -## This is a screen that displays the dialogue history to the player. While -## there isn't anything special about this screen, it does have to access the -## dialogue history stored in _history_list. -## -## https://www.renpy.org/doc/html/history.html - -screen history(): - - tag menu - - ## 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): - - style_prefix "history" - - for h in _history_list: - - window: - - ## This lays things out properly if history_height is None. - has fixed: - yfit True - - if h.who: - - label h.who: - style "history_name" - substitute False - - ## Take the color of the who text from the Character, if - ## set. - if "color" in h.who_args: - text_color h.who_args["color"] - - $ what = renpy.filter_text_tags(h.what, allow=gui.history_allow_tags) - text what: - substitute False - - if not _history_list: - label _("The dialogue history is empty.") - - -## This determines what tags are allowed to be displayed on the history screen. - -define gui.history_allow_tags = set() - - -style history_window is empty - -style history_name is gui_label -style history_name_text is gui_label_text -style history_text is gui_text - -style history_text is gui_text - -style history_label is gui_label -style history_label_text is gui_label_text - -style history_window: - xfill True - ysize gui.history_height - -style history_name: - xpos gui.history_name_xpos - xanchor gui.history_name_xalign - ypos gui.history_name_ypos - xsize gui.history_name_width - -style history_name_text: - min_width gui.history_name_width - text_align gui.history_name_xalign - -style history_text: - xpos gui.history_text_xpos - ypos gui.history_text_ypos - xanchor gui.history_text_xalign - xsize gui.history_text_width - min_width gui.history_text_width - text_align gui.history_text_xalign - layout ("subtitle" if gui.history_text_xalign else "tex") - -style history_label: - xfill True - -style history_label_text: - xalign 0.5 - -## Extras screen######################################################## -## A screen that combines help, about, updates, gallery, -screen extras(): - tag menu - 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") - - - -## Help screen ################################################################# -## -## A screen that gives information about key and mouse bindings. It uses other -## screens (keyboard_help, mouse_help, and gamepad_help) to display the actual -## help. - -screen help(): - - tag menu - - default device = "keyboard" - - use game_menu(_("Help"), scroll="viewport"): - - style_prefix "help" - - 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") - - if device == "keyboard": - use keyboard_help - elif device == "mouse": - use mouse_help - elif device == "gamepad": - use gamepad_help - - -screen keyboard_help(): - - hbox: - label _("Enter") - text _("Advances dialogue and activates the interface.") - - hbox: - label _("Space") - text _("Advances dialogue without selecting choices.") - - hbox: - label _("Arrow Keys") - text _("Navigate the interface.") - - hbox: - label _("Escape") - text _("Accesses the game menu.") - - hbox: - label _("Ctrl") - text _("Skips dialogue while held down.") - - hbox: - label _("Tab") - text _("Toggles dialogue skipping.") - - hbox: - label _("Page Up") - text _("Rolls back to earlier dialogue.") - - hbox: - label _("Page Down") - text _("Rolls forward to later dialogue.") - - hbox: - label "H" - text _("Hides the user interface.") - - hbox: - label "S" - text _("Takes a screenshot.") - - hbox: - label "V" - text _("Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}.") - - -screen mouse_help(): - - hbox: - label _("Left Click") - text _("Advances dialogue and activates the interface.") - - hbox: - label _("Middle Click") - text _("Hides the user interface.") - - hbox: - label _("Right Click") - text _("Accesses the game menu.") - - hbox: - label _("Mouse Wheel Up\nClick Rollback Side") - text _("Rolls back to earlier dialogue.") - - hbox: - label _("Mouse Wheel Down") - text _("Rolls forward to later dialogue.") - - -screen gamepad_help(): - - hbox: - label _("Right Trigger\nA/Bottom Button") - text _("Advances dialogue and activates the interface.") - - hbox: - label _("Left Trigger\nLeft Shoulder") - text _("Rolls back to earlier dialogue.") - - hbox: - label _("Right Shoulder") - text _("Rolls forward to later dialogue.") - - - hbox: - label _("D-Pad, Sticks") - text _("Navigate the interface.") - - hbox: - label _("Start, Guide") - text _("Accesses the game menu.") - - hbox: - label _("Y/Top Button") - text _("Hides the user interface.") - - textbutton _("Calibrate") action GamepadCalibrate() - - -style help_button is gui_button -style help_button_text is gui_button_text -style help_label is gui_label -style help_label_text is gui_label_text -style help_text is gui_text - -style help_button: - properties gui.button_properties("help_button") - xmargin 12 - -style help_button_text: - properties gui.button_text_properties("help_button") - -style help_label: - xsize 375 - right_padding 30 - -style help_label_text: - size gui.text_size - xalign 1.0 - text_align 1.0 - - - -################################################################################ -## Additional screens -################################################################################ - - -## Confirm screen ############################################################## -## -## The confirm screen is called when Ren'Py wants to ask the player a yes or no -## question. -## -## https://www.renpy.org/doc/html/screen_special.html#confirm - -screen confirm(message, yes_action, no_action): - - ## Ensure other screens do not get input while this screen is displayed. - modal True - - zorder 200 - - style_prefix "confirm" - - add "gui/overlay/confirm.png" - - frame: - - vbox: - xalign .5 - yalign .5 - spacing 45 - - label _(message): - style "confirm_prompt" - xalign 0.5 - - hbox: - xalign 0.5 - spacing 150 - - textbutton _("Yes") action yes_action - textbutton _("No") action no_action - - ## Right-click and escape answer "no". - key "game_menu" action no_action - - -style confirm_frame is gui_frame -style confirm_prompt is gui_prompt -style confirm_prompt_text is gui_prompt_text -style confirm_button is gui_medium_button -style confirm_button_text is gui_medium_button_text - -style confirm_frame: - background Frame([ "gui/confirm_frame.png", "gui/frame.png"], gui.confirm_frame_borders, tile=gui.frame_tile) - padding gui.confirm_frame_borders.padding - xalign .5 - yalign .5 - -style confirm_prompt_text: - text_align 0.5 - layout "subtitle" - -style confirm_button: - properties gui.button_properties("confirm_button") - -style confirm_button_text: - properties gui.button_text_properties("confirm_button") - - -## Skip indicator screen ####################################################### -## -## The skip_indicator screen is displayed to indicate that skipping is in -## progress. -## -## https://www.renpy.org/doc/html/screen_special.html#skip-indicator - -screen skip_indicator(): - - zorder 100 - style_prefix "skip" - - frame: - - hbox: - spacing 9 - - text _("Skipping") - - text "▸" at delayed_blink(0.0, 1.0) style "skip_triangle" - text "▸" at delayed_blink(0.2, 1.0) style "skip_triangle" - text "▸" at delayed_blink(0.4, 1.0) style "skip_triangle" - - -## This transform is used to blink the arrows one after another. -transform delayed_blink(delay, cycle): - alpha .5 - - pause delay - - block: - linear .2 alpha 1.0 - pause .2 - linear .2 alpha 0.5 - pause (cycle - .4) - repeat - - -style skip_frame is empty -style skip_text is gui_text -style skip_triangle is skip_text - -style skip_frame: - ypos gui.skip_ypos - background Frame("gui/skip.png", gui.skip_frame_borders, tile=gui.frame_tile) - padding gui.skip_frame_borders.padding - -style skip_text: - size gui.notify_text_size - -style skip_triangle: - ## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE - ## glyph in it. - font "DejaVuSans.ttf" - - -## Notify screen ############################################################### -## -## The notify screen is used to show the player a message. (For example, when -## the game is quicksaved or a screenshot has been taken.) -## -## https://www.renpy.org/doc/html/screen_special.html#notify-screen - -screen notify(message): - - zorder 100 - style_prefix "notify" - - frame at notify_appear: - text "[message!tq]" - - timer 3.25 action Hide('notify') - - -transform notify_appear: - on show: - alpha 0 - linear .25 alpha 1.0 - on hide: - linear .5 alpha 0.0 - - -style notify_frame is empty -style notify_text is gui_text - -style notify_frame: - ypos gui.notify_ypos - - background Frame("gui/notify.png", gui.notify_frame_borders, tile=gui.frame_tile) - padding gui.notify_frame_borders.padding - -style notify_text: - properties gui.text_properties("notify") - - -## NVL screen ################################################################## -## -## This screen is used for NVL-mode dialogue and menus. -## -## https://www.renpy.org/doc/html/screen_special.html#nvl - - -screen nvl(dialogue, items=None): - - window: - style "nvl_window" - - has vbox: - spacing gui.nvl_spacing - - ## Displays dialogue in either a vpgrid or the vbox. - if gui.nvl_height: - - vpgrid: - cols 1 - yinitial 1.0 - - use nvl_dialogue(dialogue) - - else: - - use nvl_dialogue(dialogue) - - ## Displays the menu, if given. The menu may be displayed incorrectly if - ## config.narrator_menu is set to True, as it is above. - for i in items: - - textbutton i.caption: - action i.action - style "nvl_button" - - add SideImage() xalign 0.0 yalign 1.0 - - -screen nvl_dialogue(dialogue): - - for d in dialogue: - - window: - id d.window_id - - fixed: - yfit gui.nvl_height is None - - if d.who is not None: - - text d.who: - id d.who_id - - text d.what: - id d.what_id - - -## This controls the maximum number of NVL-mode entries that can be displayed at -## once. -define config.nvl_list_length = gui.nvl_list_length - -style nvl_window is default -style nvl_entry is default - -style nvl_label is say_label -style nvl_dialogue is say_dialogue - -style nvl_button is button -style nvl_button_text is button_text - -style nvl_window: - xfill True - yfill True - - background "gui/nvl.png" - padding gui.nvl_borders.padding - -style nvl_entry: - xfill True - ysize gui.nvl_height - -style nvl_label: - xpos gui.nvl_name_xpos - xanchor gui.nvl_name_xalign - ypos gui.nvl_name_ypos - yanchor 0.0 - xsize gui.nvl_name_width - min_width gui.nvl_name_width - text_align gui.nvl_name_xalign - -style nvl_dialogue: - xpos gui.nvl_text_xpos - xanchor gui.nvl_text_xalign - ypos gui.nvl_text_ypos - xsize gui.nvl_text_width - min_width gui.nvl_text_width - text_align gui.nvl_text_xalign - layout ("subtitle" if gui.nvl_text_xalign else "tex") - -style nvl_thought: - xpos gui.nvl_thought_xpos - xanchor gui.nvl_thought_xalign - ypos gui.nvl_thought_ypos - xsize gui.nvl_thought_width - min_width gui.nvl_thought_width - text_align gui.nvl_thought_xalign - layout ("subtitle" if gui.nvl_text_xalign else "tex") - -style nvl_button: - properties gui.button_properties("nvl_button") - xpos gui.nvl_button_xpos - xanchor gui.nvl_button_xalign - -style nvl_button_text: - properties gui.button_text_properties("nvl_button") - - - -################################################################################ -## Mobile Variants -################################################################################ - -style pref_vbox: - variant "medium" - xsize 675 - -## Since a mouse may not be present, we replace the quick menu with a version -## that uses fewer and bigger buttons that are easier to touch. - -#redefine function -screen quick_button(filename, label, function): - variant "small" - button: - xmaximum 180 - ymaximum 100 - action function - fixed: - add filename xalign 0.5 yalign 0.5 zoom 1.75 - text label xalign 0.5 yalign 0.5 size 42 style "quick_button_text" - -screen quick_menu(): - variant "small" - zorder 100 - if quick_menu: - hbox: - style_prefix "quick" - xalign 0.5 - yalign 0.975 - use quick_buttons("gui/button/uioptionbuttons/template_idle.png", \ - [ \ - [ "Back", Rollback() ], \ - [ "Skip", Skip() ], \ - [ "Auto", Preference("auto-forward", "toggle") ], \ - [ "Menu", ShowMenu() ] \ - ] ) - -style radio_button: - variant "small" - foreground "gui/phone/button/radio_[prefix_]foreground.png" - -style check_button: - variant "small" - foreground "gui/phone/button/check_[prefix_]foreground.png" - -style nvl_window: - variant "small" - background "gui/phone/nvl.png" - -style game_menu_outer_frame: - variant "small" - background "gui/phone/overlay/game_menu.png" - -style game_menu_navigation_frame: - variant "small" - xsize 510 - -style game_menu_content_frame: - variant "small" - top_margin 0 - -style pref_vbox: - variant "small" - xsize 600 - -style bar: - variant "small" - ysize gui.bar_size - left_bar Frame("gui/phone/bar/left.png", gui.bar_borders, tile=gui.bar_tile) - right_bar Frame("gui/phone/bar/right.png", gui.bar_borders, tile=gui.bar_tile) - -style vbar: - variant "small" - xsize gui.bar_size - top_bar Frame("gui/phone/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) - bottom_bar Frame("gui/phone/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) - -style scrollbar: - variant "small" - ysize gui.scrollbar_size - base_bar Frame("gui/phone/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) - thumb Frame("gui/phone/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) - -style vscrollbar: - variant "small" - xsize gui.scrollbar_size - base_bar Frame("gui/phone/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) - thumb Frame("gui/phone/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) - -style slider: - variant "small" - ysize gui.slider_size - base_bar Frame("gui/phone/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) - thumb "gui/phone/slider/horizontal_[prefix_]thumb.png" - -style vslider: - variant "small" - xsize gui.slider_size - base_bar Frame("gui/phone/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) - thumb "gui/phone/slider/vertical_[prefix_]thumb.png" - -style slider_pref_vbox: - variant "small" - xsize None - -style slider_pref_slider: - variant "small" - xsize 900 +###Updater Python stuff### +init python: + if renpy.variant("pc"): #Don't run this on mobile, not supported + 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 +################################################################################ + +style default: + properties gui.text_properties() + language gui.language + +style input: + properties gui.text_properties("input", accent=True) + adjust_spacing False + +style hyperlink_text: + properties gui.text_properties("hyperlink", accent=True) + hover_underline True + +style gui_text: + properties gui.text_properties("interface") + + +style button: + properties gui.button_properties("button") + +style button_text is gui_text: + properties gui.text_properties("button") + yalign 0.5 + + +style label_text is gui_text: + properties gui.text_properties("label", accent=True) + +style prompt_text is gui_text: + properties gui.text_properties("prompt") + + +style bar: + ysize gui.bar_size + left_bar Frame("gui/bar/left.png", gui.bar_borders, tile=gui.bar_tile) + right_bar Frame("gui/bar/right.png", gui.bar_borders, tile=gui.bar_tile) + +style vbar: + xsize gui.bar_size + top_bar Frame("gui/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) + bottom_bar Frame("gui/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) + +style scrollbar: + ysize gui.scrollbar_size + base_bar Frame("gui/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) + thumb Frame("gui/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) + +style vscrollbar: + xsize gui.scrollbar_size + base_bar Frame("gui/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) + thumb Frame("gui/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) + +style slider: + ysize gui.slider_size + base_bar Frame("gui/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) + thumb "gui/slider/horizontal_[prefix_]thumb.png" + +style vslider: + xsize gui.slider_size + base_bar Frame("gui/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) + thumb "gui/slider/vertical_[prefix_]thumb.png" + + +style frame: + padding gui.frame_borders.padding + background Frame("gui/frame.png", gui.frame_borders, tile=gui.frame_tile) + + + +################################################################################ +## In-game screens +################################################################################ + + +## Say screen ################################################################## +## +## The say screen is used to display dialogue to the player. It takes two +## parameters, who and what, which are the name of the speaking character and +## the text to be displayed, respectively. (The who parameter can be None if no +## name is given.) +## +## This screen must create a text displayable with id "what", as Ren'Py uses +## this to manage text display. It can also create displayables with id "who" +## and id "window" to apply style properties. +## +## https://www.renpy.org/doc/html/screen_special.html#say + +screen say(who, what): + style_prefix "say" + + window: + id "window" + + if who is not None: + background Image("gui/textbox_long.png", xalign=0.5, yalign=1.0) + window: + id "namebox" + style "namebox" + text who id "who" + else: + background Image("gui/textbox_no_hitch.png", xalign=0.5, yalign=1.0) + + text what id "what" + + ## If there's a side image, display it above the text. Do not display on the + ## phone variant - there's no room. + if not renpy.variant("small"): + add SideImage() xalign 0.0 yalign 1.0 + + +## Make the namebox available for styling through the Character object. +init python: + config.character_id_prefixes.append('namebox') + +style window is default +style say_label is default +style say_dialogue is default +style say_thought is say_dialogue + +style namebox is default +style namebox_label is say_label + + +style window: + xalign 0.5 + xfill True + yalign gui.textbox_yalign + ysize gui.textbox_height + xoffset 0 + yoffset gui.window_yoffset + xcenter 0.5 + +style namebox: + xalign 0.5 + xpos gui.name_xpos + ypos gui.name_ypos + +style say_label: + properties gui.text_properties("name", accent=True) + xalign gui.name_xalign + yalign 0.5 + xanchor gui.name_xalign + +style say_dialogue: + properties gui.text_properties("dialogue") + + xpos gui.dialogue_xpos + xsize gui.dialogue_width + ypos gui.dialogue_ypos + + +## Input screen ################################################################ +## +## This screen is used to display renpy.input. The prompt parameter is used to +## pass a text prompt in. +## +## This screen must create an input displayable with id "input" to accept the +## various input parameters. +## +## https://www.renpy.org/doc/html/screen_special.html#input + +screen input(prompt): + style_prefix "input" + + 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 + xpos gui.dialogue_xpos + xsize gui.dialogue_width + ypos gui.dialogue_ypos + yoffset gui.input_yoffset #for mobile OSK + + text prompt style "input_prompt" + input id "input" + +style input_prompt is default + +style input_prompt: + xalign gui.dialogue_text_xalign + properties gui.text_properties("input_prompt") + +style input: + xalign gui.dialogue_text_xalign + xmaximum gui.dialogue_width + + +## Choice screen ############################################################### +## +## This screen is used to display the in-game choices presented by the menu +## statement. The one parameter, items, is a list of objects, each with caption +## and action fields. +## +## https://www.renpy.org/doc/html/screen_special.html#choice + +screen choice(items): + style_prefix "choice" + + vbox: + for i in items: + textbutton i.caption action i.action + + +## When this is true, menu captions will be spoken by the narrator. When false, +## menu captions will be displayed as empty buttons. +define config.narrator_menu = True + + +style choice_vbox is vbox +style choice_button is button +style choice_button_text is button_text + +style choice_vbox: + xalign 0.5 + ypos 405 + yanchor 0.5 + + spacing gui.choice_spacing + +style choice_button is default: + properties gui.button_properties("choice_button") + +style choice_button_text is default: + properties gui.button_text_properties("choice_button") + + +## Quick Menu screen ########################################################### +## +## The quick menu is displayed in-game to provide easy access to the out-of-game +## menus. + +screen quick_button(filename, label, function): + button: + xmaximum 80 + ymaximum 72 + action function + 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" + +# 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]) + +screen quick_menu(): + + ## Ensure this appears on top of other screens. + zorder 100 + if quick_menu: + 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') ] + ] ) + +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 + +style quick_button is default +style quick_button_text is button_text + +style quick_button: + properties gui.button_properties("quick_button") + +style quick_button_text: + #properties gui.button_text_properties("quick_button") + color gui.selected_color + hover_color gui.hover_color + selected_color gui.accent_color + + +################################################################################ +## Main and Game Menu Screens +################################################################################ + +## Navigation screen ########################################################## +## +## This screen is included in the main and game menus, and provides navigation +## to other menus, and to start the game. + +screen navigation(): + + vbox: + style_prefix "navigation" + xpos gui.notMM_navigation_xpos + yalign 0.5 + + + spacing gui.navigation_spacing + + textbutton _("History") action ShowMenu("history") + textbutton _("Save") action ShowMenu("save") + textbutton _("Load") action ShowMenu("load") + textbutton _("Delete") action ShowMenu("delete") + textbutton _("Options") action ShowMenu("preferences") + #textbutton _("Extras") action ShowMenu("extras") + textbutton _("Return") action Return() + + + if _in_replay: + + textbutton _("End Replay") action EndReplay(confirm=True) + + elif not main_menu: + + textbutton _("Main Menu") action MainMenu() + #textbutton _("Debug Score Card") action ShowMenu("score_menu") + + #if renpy.variant("pc"): + + ## The quit button is banned on iOS and unnecessary on Android and + ## Web. + #textbutton _("Quit") action Quit() + + +style navigation_button is gui_button +style navigation_button_text is gui_button_text + +style navigation_button: + size_group "navigation" + properties gui.button_properties("navigation_button") + +style navigation_button_text: + properties gui.button_text_properties("navigation_button") + + +## Main Menu screen ############################################################ +## +## Used to display the main menu when Ren'Py starts. +## +## https://www.renpy.org/doc/html/screen_special.html#main-menu + +#similar to quick_button funcs +screen main_menu_button(filename, label, function): + button: + xmaximum 500 + ymaximum 129 + action function + 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 + +# label_functions is [ [ "label", function() ], [ "foobar", foobar() ], .. ] +# Reuse the same image string and keep things 'neat'. +screen main_menu_buttons(filename, label_functions): + for l_f in label_functions: + use main_menu_button(filename, l_f[0], l_f[1]) + +screen main_menu(): + + ## This ensures that any other menu screen is replaced. + tag menu + + style_prefix "main_menu" + + add gui.main_menu_background + + + ## 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: + xpos 1940 + yalign 0.03 + if persistent.splashtype == 1: + add "gui/sneedgame.png" + else: + add "gui/snootgame.png" + vbox: + spacing 10 + xpos 1885 + ypos 1130 + use main_menu_buttons("gui/button/menubuttons/template_idle.png", + [ + [ "Start", Start() ], + [ "Mods", ShowMenu("mod_menu") ], + [ "Load", ShowMenu("load") ], + [ "Options", ShowMenu("preferences") ], + [ "Extras", ShowMenu("extras") ], \ + [ "Quit", Quit(confirm=not main_menu) ] + ] ) + on "show" action renpy.start_predict_screen("cg_gallery") + +style main_menu_frame is empty +style main_menu_vbox is vbox +style main_menu_text is gui_text +style main_menu_title is main_menu_text +style main_menu_version is main_menu_text + +style main_menu_frame: + xsize 420 + yfill True + + background "gui/overlay/main_menu.png" + +style main_menu_vbox: + xalign 1.0 + xoffset -30 + xmaximum 1200 + yalign 1.0 + yoffset -60 + +style main_menu_text: + properties gui.text_properties("main_menu") #, accent=True) + color gui.main_menu_color + hover_color gui.hover_color + size gui.main_menu_text_size + +style main_menu_title: + properties gui.text_properties("title") + +#style main_menu_version: +# properties gui.text_properties("version") + + +## 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 +## transcluded (placed) inside it. + +screen game_menu(title, scroll=None, yinitial=0.0): + + style_prefix "game_menu" + + if main_menu: + add gui.main_menu_background + else: + add gui.game_menu_background + + frame: + style "game_menu_outer_frame" + + hbox: + + ## Reserve space for the navigation section. + frame: + style "game_menu_navigation_frame" + + frame: + style "game_menu_content_frame" + + if scroll == "viewport": + + viewport: + yinitial yinitial + scrollbars "vertical" + mousewheel True + draggable True + pagekeys True + + side_yfill True + + vbox: + transclude + + elif scroll == "vpgrid": + + vpgrid: + cols 1 + yinitial yinitial + + scrollbars "vertical" + mousewheel True + draggable True + pagekeys True + + side_yfill True + + transclude + + else: + + transclude + + use navigation + + label title + + if main_menu: + key "game_menu" action ShowMenu("main_menu") + + +style game_menu_outer_frame is empty +style game_menu_navigation_frame is empty +style game_menu_content_frame is empty +style game_menu_viewport is gui_viewport +style game_menu_side is gui_side +style game_menu_scrollbar is gui_vscrollbar + +style game_menu_label is gui_label +style game_menu_label_text is gui_label_text + +style return_button is navigation_button +style return_button_text is navigation_button_text + +style game_menu_outer_frame: + bottom_padding 45 + top_padding 180 + + background "gui/overlay/game_menu.png" + +style game_menu_navigation_frame: + xsize 420 + yfill True + +style game_menu_content_frame: + left_margin 60 + right_margin 30 + top_margin 15 + +style game_menu_viewport: + xsize 1380 + +style game_menu_vscrollbar: + unscrollable gui.unscrollable + +style game_menu_side: + spacing 15 + +style game_menu_label: + xpos 75 + ysize 180 + +style game_menu_label_text: + size gui.title_text_size + color gui.accent_color + yalign 0.5 + +style return_button: + xpos gui.navigation_xpos + yalign 1.0 + yoffset -45 + + +## About screen ################################################################ +## +## This screen gives credit and copyright information about the game and Ren'Py. +## +## There's nothing special about this screen, and hence it also serves as an +## example of how to make a custom screen. + +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 + + ## 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]\n") + + ## 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}") 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}") action updater.Update(persistent.updateWebServer, force=False) + else: + textbutton _("{size=36}Update Now!\n{/size}") action Notify("Nothing to update to!") + + use extrasnavigation + +## Load and Save screens ####################################################### +## +## These screens are responsible for letting the player save the game and load +## it again. Since they share nearly everything in common, both are implemented +## in terms of a third screen, file_slots. +## +## https://www.renpy.org/doc/html/screen_special.html#save https:// +## www.renpy.org/doc/html/screen_special.html#load + +screen save(): + + tag menu + + use file_slots(_("Save")) + + +screen load(): + + tag menu + + use file_slots(_("Load")) + +screen delete(): + + tag menu + + use file_slots(_("Delete"), True) + +screen file_slots(title, flag=False): + + default page_name_value = FilePageNameInputValue(pattern=_("Page {}"), auto=_("Automatic saves"), quick=_("Quick saves")) + + use game_menu(title): + + fixed: + + ## This ensures the input will get the enter event before any of the + ## buttons do. + order_reverse True + + ## The page name + button: + style "page_label" + + key_events True + xalign 0.5 + #action page_name_value.Toggle() + + input: + style "page_label_text" + value page_name_value + + ## The grid of file slots. + grid gui.file_slot_cols gui.file_slot_rows: + style_prefix "slot" + + xalign 0.5 + yalign 0.5 + + spacing gui.slot_spacing + + for i in range(gui.file_slot_cols * gui.file_slot_rows): + + $ slot = i + 1 + + button: + if flag: + action FileDelete(slot) + else: + action FileAction(slot) + + has vbox + + add FileScreenshot(slot) xalign 0.5 + + text FileTime(slot, format=_("{#file_time}%A, %B %d %Y, %H:%M"), empty=_("Empty Slot")): + style "slot_time_text" + + text FileSaveName(slot): + style "slot_name_text" + + key "save_delete" action FileDelete(slot) + + ## Buttons to access other pages. + hbox: + style_prefix "page" + + xalign 0.5 + yalign 1.0 + + spacing gui.page_spacing + + textbutton _("<") action FilePagePrevious() + + if config.has_autosave: + textbutton _("{#auto_page}A") action FilePage("auto") + + if config.has_quicksave: + textbutton _("{#quick_page}Q") action FilePage("quick") + + ## range(1, 10) gives the numbers from 1 to 9. + for page in range(1, 10): + textbutton "[page]" action FilePage(page) + + textbutton _(">") action FilePageNext() + + +style page_label is gui_label +style page_label_text is gui_label_text +style page_button is gui_button +style page_button_text is gui_button_text + +style slot_button is gui_button +style slot_button_text is gui_button_text +style slot_time_text is slot_button_text +style slot_name_text is slot_button_text + +style page_label: + xpadding 75 + ypadding 5 + +style page_label_text: + text_align 0.5 + layout "subtitle" + hover_color gui.hover_color + +style page_button: + properties gui.button_properties("page_button") + +style page_button_text: + properties gui.button_text_properties("page_button") + +style slot_button: + properties gui.button_properties("slot_button") + +style slot_button_text: + properties gui.button_text_properties("slot_button") + + +## Preferences screen ########################################################## +## +## The preferences screen allows the player to configure the game to better suit +## themselves. +## +## https://www.renpy.org/doc/html/screen_special.html#preferences + +screen preferences(): + + tag menu + + use game_menu(_("Options"), scroll="viewport"): + + vbox: + + hbox: + box_wrap True + + if renpy.variant("pc") or renpy.variant("web"): + + vbox: + style_prefix "radio" + label _("Display") + textbutton _("Window") action Preference("display", "any window") + textbutton _("Fullscreen") action Preference("display", "fullscreen") + + vbox: + style_prefix "radio" + label _("Rollback Side") + textbutton _("Disable") action Preference("rollback side", "disable") + textbutton _("Left") action Preference("rollback side", "left") + textbutton _("Right") action Preference("rollback side", "right") + vbox: + style_prefix "check" + label _("Naughty Stuff") + textbutton _("Enable Lewd Images") action ToggleVariable("persistent.lewd", True, False) + + vbox: + style_prefix "check" + label _("Requires Restart") + textbutton _("Enable Forward-Scroll Movement") action ToggleVariable("persistent.scroll", True, False) + + + vbox: + style_prefix "check" + label _("Skip") + textbutton _("Unseen Text") action Preference("skip", "toggle") + textbutton _("After Choices") action Preference("after choices", "toggle") + textbutton _("Transitions") action InvertSelected(Preference("transitions", "toggle")) + + ## Additional vboxes of type "radio_pref" or "check_pref" can be + ## added here, to add additional creator-defined preferences. + + null height (4 * gui.pref_spacing) + + hbox: + style_prefix "slider" + box_wrap True + + vbox: + + label _("Text Speed") + + bar value Preference("text speed") + + label _("Auto-Forward Time") + + bar value Preference("auto-forward time") + + vbox: + + if config.has_music: + label _("Music Volume") + + hbox: + bar value Preference("music volume") + + if config.has_sound: + + label _("Sound Volume") + + hbox: + bar value Preference("sound volume") + + if config.sample_sound: + textbutton _("Test") action Play("sound", config.sample_sound) + + + if config.has_voice: + label _("Voice Volume") + + hbox: + bar value Preference("voice volume") + + if config.sample_voice: + textbutton _("Test") action Play("voice", config.sample_voice) + + if config.has_music or config.has_sound or config.has_voice: + null height gui.pref_spacing + + textbutton _("Mute All"): + action Preference("all mute", "toggle") + style "mute_all_button" + + +style pref_label is gui_label +style pref_label_text is gui_label_text +style pref_vbox is vbox + +style radio_label is pref_label +style radio_label_text is pref_label_text +style radio_button is gui_button +style radio_button_text is gui_button_text +style radio_vbox is pref_vbox + +style check_label is pref_label +style check_label_text is pref_label_text +style check_button is gui_button +style check_button_text is gui_button_text +style check_vbox is pref_vbox + +style slider_label is pref_label +style slider_label_text is pref_label_text +style slider_slider is gui_slider +style slider_button is gui_button +style slider_button_text is gui_button_text +style slider_pref_vbox is pref_vbox + +style mute_all_button is check_button +style mute_all_button_text is check_button_text + +style pref_label: + top_margin gui.pref_spacing + bottom_margin 3 + +style pref_label_text: + yalign 1.0 + +style pref_vbox: + xsize 338 + +style radio_vbox: + spacing gui.pref_button_spacing + +style radio_button: + properties gui.button_properties("radio_button") + foreground "gui/button/radio_[prefix_]foreground.png" + +style radio_button_text: + properties gui.button_text_properties("radio_button") + +style check_vbox: + spacing gui.pref_button_spacing + +style check_button: + properties gui.button_properties("check_button") + foreground "gui/button/check_[prefix_]foreground.png" + +style check_button_text: + properties gui.button_text_properties("check_button") + +style slider_slider: + xsize 525 + +style slider_button: + properties gui.button_properties("slider_button") + yalign 0.5 + left_margin 15 + +style slider_button_text: + properties gui.button_text_properties("slider_button") + +style slider_vbox: + xsize 675 + + +## History screen ############################################################## +## +## This is a screen that displays the dialogue history to the player. While +## there isn't anything special about this screen, it does have to access the +## dialogue history stored in _history_list. +## +## https://www.renpy.org/doc/html/history.html + +screen history(): + + tag menu + + ## 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): + + style_prefix "history" + + for h in _history_list: + + window: + + ## This lays things out properly if history_height is None. + has fixed: + yfit True + + if h.who: + + label h.who: + style "history_name" + substitute False + + ## Take the color of the who text from the Character, if + ## set. + if "color" in h.who_args: + text_color h.who_args["color"] + + $ what = renpy.filter_text_tags(h.what, allow=gui.history_allow_tags) + text what: + substitute False + + if not _history_list: + label _("The dialogue history is empty.") + + +## This determines what tags are allowed to be displayed on the history screen. + +define gui.history_allow_tags = set() + + +style history_window is empty + +style history_name is gui_label +style history_name_text is gui_label_text +style history_text is gui_text + +style history_text is gui_text + +style history_label is gui_label +style history_label_text is gui_label_text + +style history_window: + xfill True + ysize gui.history_height + +style history_name: + xpos gui.history_name_xpos + xanchor gui.history_name_xalign + ypos gui.history_name_ypos + xsize gui.history_name_width + +style history_name_text: + min_width gui.history_name_width + text_align gui.history_name_xalign + +style history_text: + xpos gui.history_text_xpos + ypos gui.history_text_ypos + xanchor gui.history_text_xalign + xsize gui.history_text_width + min_width gui.history_text_width + text_align gui.history_text_xalign + layout ("subtitle" if gui.history_text_xalign else "tex") + +style history_label: + xfill True + +style history_label_text: + xalign 0.5 + +## Extras screen######################################################## +## 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: + 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 ################################################################# +## +## A screen that gives information about key and mouse bindings. It uses other +## screens (keyboard_help, mouse_help, and gamepad_help) to display the actual +## help. + +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" + + # vbox: + # xpos 1100 + # ## ypos 1000 + # yalign 0.4 + # spacing 23 + + 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: + 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.") + + hbox: + label _("Space") + text _("Advances dialogue without selecting choices.") + + hbox: + label _("Arrow Keys") + text _("Navigate the interface.") + + hbox: + label _("Escape") + text _("Accesses the game menu.") + + hbox: + label _("Ctrl") + text _("Skips dialogue while held down.") + + hbox: + label _("Tab") + text _("Toggles dialogue skipping.") + + hbox: + label _("Page Up") + text _("Rolls back to earlier dialogue.") + + hbox: + label _("Page Down") + text _("Rolls forward to later dialogue.") + + hbox: + label "H" + text _("Hides the user interface.") + + hbox: + label "S" + text _("Takes a screenshot.") + + hbox: + label "V" + text _("Toggles assistive {a=https://www.renpy.org/l/voicing}self-voicing{/a}.") + + +screen mouse_help(): + style_prefix "help" + hbox: + label _("Left Click") + text _("Advances dialogue and activates the interface.") + + hbox: + label _("Middle Click") + text _("Hides the user interface.") + + hbox: + label _("Right Click") + text _("Accesses the game menu.") + + hbox: + label _("Mouse Wheel Up\nClick Rollback Side") + text _("Rolls back to earlier dialogue.") + + hbox: + label _("Mouse Wheel Down") + text _("Rolls forward to later dialogue.") + + +screen gamepad_help(): + style_prefix "help" + hbox: + label _("Right Trigger\nA/Bottom Button") + text _("Advances dialogue and activates the interface.") + + hbox: + label _("Left Trigger\nLeft Shoulder") + text _("Rolls back to earlier dialogue.") + + hbox: + label _("Right Shoulder") + text _("Rolls forward to later dialogue.") + + + hbox: + label _("D-Pad, Sticks") + text _("Navigate the interface.") + + hbox: + label _("Start, Guide") + text _("Accesses the game menu.") + + hbox: + label _("Y/Top Button") + text _("Hides the user interface.") + + 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 +style help_label_text is gui_label_text +style help_text is gui_text + +style help_button: + properties gui.button_properties("help_button") + xmargin 12 + +style help_button_text: + properties gui.button_text_properties("help_button") + +style help_label: + xsize 375 + right_padding 30 + +style help_label_text: + size gui.text_size + xalign 1.0 + text_align 1.0 + +################################################################################ +## Additional screens +################################################################################ + + +## Confirm screen ############################################################## +## +## The confirm screen is called when Ren'Py wants to ask the player a yes or no +## question. +## +## https://www.renpy.org/doc/html/screen_special.html#confirm + +screen confirm(message, yes_action, no_action): + + ## Ensure other screens do not get input while this screen is displayed. + modal True + + zorder 200 + + style_prefix "confirm" + + add "gui/overlay/confirm.png" + + frame: + + vbox: + xalign .5 + yalign .5 + spacing 45 + + label _(message): + style "confirm_prompt" + xalign 0.5 + + hbox: + xalign 0.5 + spacing 150 + + textbutton _("Yes") action yes_action + textbutton _("No") action no_action + + ## Right-click and escape answer "no". + key "game_menu" action no_action + + +style confirm_frame is gui_frame +style confirm_prompt is gui_prompt +style confirm_prompt_text is gui_prompt_text +style confirm_button is gui_medium_button +style confirm_button_text is gui_medium_button_text + +style confirm_frame: + background Frame([ "gui/confirm_frame.png", "gui/frame.png"], gui.confirm_frame_borders, tile=gui.frame_tile) + padding gui.confirm_frame_borders.padding + xalign .5 + yalign .5 + +style confirm_prompt_text: + text_align 0.5 + layout "subtitle" + +style confirm_button: + properties gui.button_properties("confirm_button") + +style confirm_button_text: + properties gui.button_text_properties("confirm_button") + + +## Skip indicator screen ####################################################### +## +## The skip_indicator screen is displayed to indicate that skipping is in +## progress. +## +## https://www.renpy.org/doc/html/screen_special.html#skip-indicator + +screen skip_indicator(): + + zorder 100 + style_prefix "skip" + + frame: + + hbox: + spacing 9 + + text _("Skipping") + + text "▸" at delayed_blink(0.0, 1.0) style "skip_triangle" + text "▸" at delayed_blink(0.2, 1.0) style "skip_triangle" + text "▸" at delayed_blink(0.4, 1.0) style "skip_triangle" + + +## This transform is used to blink the arrows one after another. +transform delayed_blink(delay, cycle): + alpha .5 + + pause delay + + block: + linear .2 alpha 1.0 + pause .2 + linear .2 alpha 0.5 + pause (cycle - .4) + repeat + + +style skip_frame is empty +style skip_text is gui_text +style skip_triangle is skip_text + +style skip_frame: + ypos gui.skip_ypos + background Frame("gui/skip.png", gui.skip_frame_borders, tile=gui.frame_tile) + padding gui.skip_frame_borders.padding + +style skip_text: + size gui.notify_text_size + +style skip_triangle: + ## We have to use a font that has the BLACK RIGHT-POINTING SMALL TRIANGLE + ## glyph in it. + font "DejaVuSans.ttf" + + +## Notify screen ############################################################### +## +## The notify screen is used to show the player a message. (For example, when +## the game is quicksaved or a screenshot has been taken.) +## +## https://www.renpy.org/doc/html/screen_special.html#notify-screen + +screen notify(message): + + zorder 100 + style_prefix "notify" + + frame at notify_appear: + text "[message!tq]" + + timer 3.25 action Hide('notify') + + +transform notify_appear: + on show: + alpha 0 + linear .25 alpha 1.0 + on hide: + linear .5 alpha 0.0 + + +style notify_frame is empty +style notify_text is gui_text + +style notify_frame: + ypos gui.notify_ypos + + background Frame("gui/notify.png", gui.notify_frame_borders, tile=gui.frame_tile) + padding gui.notify_frame_borders.padding + +style notify_text: + properties gui.text_properties("notify") + + +## NVL screen ################################################################## +## +## This screen is used for NVL-mode dialogue and menus. +## +## https://www.renpy.org/doc/html/screen_special.html#nvl + + +screen nvl(dialogue, items=None): + + window: + style "nvl_window" + + has vbox: + spacing gui.nvl_spacing + + ## Displays dialogue in either a vpgrid or the vbox. + if gui.nvl_height: + + vpgrid: + cols 1 + yinitial 1.0 + + use nvl_dialogue(dialogue) + + else: + + use nvl_dialogue(dialogue) + + ## Displays the menu, if given. The menu may be displayed incorrectly if + ## config.narrator_menu is set to True, as it is above. + for i in items: + + textbutton i.caption: + action i.action + style "nvl_button" + + add SideImage() xalign 0.0 yalign 1.0 + + +screen nvl_dialogue(dialogue): + + for d in dialogue: + + window: + id d.window_id + + fixed: + yfit gui.nvl_height is None + + if d.who is not None: + + text d.who: + id d.who_id + + text d.what: + id d.what_id + + +## This controls the maximum number of NVL-mode entries that can be displayed at +## once. +define config.nvl_list_length = gui.nvl_list_length + +style nvl_window is default +style nvl_entry is default + +style nvl_label is say_label +style nvl_dialogue is say_dialogue + +style nvl_button is button +style nvl_button_text is button_text + +style nvl_window: + xfill True + yfill True + + background "gui/nvl.png" + padding gui.nvl_borders.padding + +style nvl_entry: + xfill True + ysize gui.nvl_height + +style nvl_label: + xpos gui.nvl_name_xpos + xanchor gui.nvl_name_xalign + ypos gui.nvl_name_ypos + yanchor 0.0 + xsize gui.nvl_name_width + min_width gui.nvl_name_width + text_align gui.nvl_name_xalign + +style nvl_dialogue: + xpos gui.nvl_text_xpos + xanchor gui.nvl_text_xalign + ypos gui.nvl_text_ypos + xsize gui.nvl_text_width + min_width gui.nvl_text_width + text_align gui.nvl_text_xalign + layout ("subtitle" if gui.nvl_text_xalign else "tex") + +style nvl_thought: + xpos gui.nvl_thought_xpos + xanchor gui.nvl_thought_xalign + ypos gui.nvl_thought_ypos + xsize gui.nvl_thought_width + min_width gui.nvl_thought_width + text_align gui.nvl_thought_xalign + layout ("subtitle" if gui.nvl_text_xalign else "tex") + +style nvl_button: + properties gui.button_properties("nvl_button") + xpos gui.nvl_button_xpos + xanchor gui.nvl_button_xalign + +style nvl_button_text: + properties gui.button_text_properties("nvl_button") + + + +################################################################################ +## Mobile Variants +################################################################################ + +style pref_vbox: + variant "medium" + xsize 675 + +## Since a mouse may not be present, we replace the quick menu with a version +## that uses fewer and bigger buttons that are easier to touch. + +#redefine function +screen quick_button(filename, label, function): + variant "small" + button: + xmaximum 124 + ymaximum 124 + action function + fixed: + add filename xalign 0.5 yalign 0.5 zoom 1.75 + text label xalign 0.5 yalign 0.5 size 42 style "quick_button_text" + +screen quick_menu(): + variant "small" + zorder 100 + if quick_menu: + hbox: + spacing 28 + style_prefix "quick" + xalign 0.5 + yalign 0.975 + use quick_buttons("gui/button/uioptionbuttons/template_idle.png", \ + [ \ + [ "Back", Rollback() ], \ + [ "Skip", Skip() ], \ + [ "Auto", Preference("auto-forward", "toggle") ], \ + [ "Menu", ShowMenu() ] \ + ] ) + +screen extrasnavigation(): #Updates are removed (not even supported by Ren'Py) + variant "small" + 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_0") ], + [ "Return", ShowMenu("main_menu") ] + ] ) + +style radio_button: + variant "small" + foreground "gui/phone/button/radio_[prefix_]foreground.png" + +style check_button: + variant "small" + foreground "gui/phone/button/check_[prefix_]foreground.png" + +style nvl_window: + variant "small" + background "gui/phone/nvl.png" + +style game_menu_outer_frame: + variant "small" + background "gui/phone/overlay/game_menu.png" + +style game_menu_navigation_frame: + variant "small" + xsize 510 + +style game_menu_content_frame: + variant "small" + top_margin 0 + +style pref_vbox: + variant "small" + xsize 600 + +style bar: + variant "small" + ysize gui.bar_size + left_bar Frame("gui/phone/bar/left.png", gui.bar_borders, tile=gui.bar_tile) + right_bar Frame("gui/phone/bar/right.png", gui.bar_borders, tile=gui.bar_tile) + +style vbar: + variant "small" + xsize gui.bar_size + top_bar Frame("gui/phone/bar/top.png", gui.vbar_borders, tile=gui.bar_tile) + bottom_bar Frame("gui/phone/bar/bottom.png", gui.vbar_borders, tile=gui.bar_tile) + +style scrollbar: + variant "small" + ysize gui.scrollbar_size + base_bar Frame("gui/phone/scrollbar/horizontal_[prefix_]bar.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) + thumb Frame("gui/phone/scrollbar/horizontal_[prefix_]thumb.png", gui.scrollbar_borders, tile=gui.scrollbar_tile) + +style vscrollbar: + variant "small" + xsize gui.scrollbar_size + base_bar Frame("gui/phone/scrollbar/vertical_[prefix_]bar.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) + thumb Frame("gui/phone/scrollbar/vertical_[prefix_]thumb.png", gui.vscrollbar_borders, tile=gui.scrollbar_tile) + +style slider: + variant "small" + ysize gui.slider_size + base_bar Frame("gui/phone/slider/horizontal_[prefix_]bar.png", gui.slider_borders, tile=gui.slider_tile) + thumb "gui/phone/slider/horizontal_[prefix_]thumb.png" + +style vslider: + variant "small" + xsize gui.slider_size + base_bar Frame("gui/phone/slider/vertical_[prefix_]bar.png", gui.vslider_borders, tile=gui.slider_tile) + thumb "gui/phone/slider/vertical_[prefix_]thumb.png" + +style slider_pref_vbox: + variant "small" + xsize None + +style slider_pref_slider: + variant "small" + xsize 900 diff --git a/game/script.rpy b/game/script.rpy index 010e380..2dc198a 100644 --- a/game/script.rpy +++ b/game/script.rpy @@ -13,24 +13,30 @@ #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]) - # 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) - # 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) - if persistent.scroll == True: + # 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) + # 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) + if persistent.scroll == True: config.keymap['dismiss'].append('mousedown_4') transform randPosition: @@ -111,35 +117,33 @@ define long_textbox = { "window_background": long_textbox_img, 'namebox_style': #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 I = Character(kind=base) # for internal dialogue i.e narration. Required for CTC indicators working with Anon's thoughts -define A = Character ('Anon', base, color="#36E12D") #Light Green -define F = Character ('Fang', base, color="#7E2DE1") #Purple -define Lucy = Character ('Lucy', base, color="#7E2DE1") #Purple -define Ro = Character ('Rosa', base, color="#E12D36") #Red -define St = Character ('Stella', base, color="#E17E2D") #orang -define N = Character ('Naomi', base, color="#2D36E1") #Blue -define Nas = Character ('Naser', base, color="#501D5E") #Dark Purple -define T = Character ('Trish', base, color="#8A0036") #Maroon -define Attendant = Character ('Attendant', base, color="#8A0036") #Maroon -define Sp = Character ('Spears', base, color="#7B8A00") #Dark Yellow -define Re = Character ('Reed', base, color="#368A00") #Dark Green -define D = Character ('Driver', base, color="#098A00") -define FM = Character ('Fangs Mom', base, color="#EA1A84") -define FD = Character ('Fangs Dad', base, color="#1A1CEA") -define Tsuki = Character ('Mr. Tsuki', base, color="#CEAF23") -define unknown = Character ('(???)', base, color="#000000") -define jingo = Character ('Mr. Jingo', base, color="#42C053") -define MaitD = Character ('Maitre D', base, color="#42C053") -define Moe = Character('Moe', base, color="#42C053") -define Vince = Character ('Vince', base, color="#3C770D") #Dark Green -define Waitress = Character ('Waitress', base, color="#C89B19") #Gold +define A = Character ('Anon', base, color="#36E12D", who_outlines=[(1, '#0C300A')]) # Light Green +define F = Character ('Fang', base, color="#B4D4CE", who_outlines=[(1, '#112D27')]) # Light Cyan +define Lucy = Character ('Lucy', base, color="#B4D4CE", who_outlines=[(1, '#112D27')]) # Light Cyan +define Ro = Character ('Rosa', base, color="#FE712B", who_outlines=[(1, '#3D1809')]) # Red-Orange +define St = Character ('Stella', base, color="#D2FFAA", who_outlines=[(1, '#203011')]) # Light Green +define N = Character ('Naomi', base, color="#F8B9A0", who_outlines=[(1, '#291A1B')]) # Peach +define Nas = Character ('Naser', base, color="#F89E38", who_outlines=[(1, '#2D2D2D')]) # Orange +define T = Character ('Trish', base, color="#B675E6", who_outlines=[(1, '#1F0632')]) # Purple +define Attendant = Character ('Attendant', base, color="#8A0036", who_outlines=[(1, '#FFFFFF')]) # Maroon +define Sp = Character ('Spears', base, color="#C4C3C3", who_outlines=[(1, '#272727')]) # Light Grey +define Re = Character ('Reed', base, color="#ED4C5B", who_outlines=[(1, '#361013')]) # Bright Red +define D = Character ('Driver', base, color="#FFC63A", who_outlines=[(1, '#4D280A')]) # Yellow-Orange +define FM = Character ('Fangs Mom', base, color="#FFD8F6", who_outlines=[(1, '#361730')]) # Bright Pink +define FD = Character ('Fangs Dad', base, color="#D8A09A", who_outlines=[(1, '#190E0F')]) # Desaturated Orange +define Tsuki = Character ('Mr. Tsuki', base, color="#A7F2A2", who_outlines=[(1, '#320E3B')]) # Pear Green +define unknown = Character ('(???)', base, color="#000000", who_outlines=[(1, '#FFFFFF')]) # Black +define jingo = Character ('Mr. Jingo', base, color="#CD8283", who_outlines=[(1, '#0F0D49')]) # Desaturated Red +define MaitD = Character ('Maitre D', base, color="#241630", who_outlines=[(1, '#241630')]) # Cobalt Blue +define Moe = Character('Moe', base, color="#A5BEED", who_outlines=[(1, '#342210')]) # Desaturated Blue +define Vince = Character ('Vince', base, color="#FFC63A", who_outlines=[(1, '#4D280A')]) # Yellow-Orange +define Waitress = Character ('Waitress', base, color="#F691C8", who_outlines=[(1, '#402E3A')]) # Pink #long TB chars - -define AnonAndFang = Character('Anon and Fang', base, color="34F313", **long_textbox) -define SV = Character ('Street Vendor', base, color="#420046", **long_textbox) -define carl = Character ('Mr. Carldewskii', base, color="#4963A5", **long_textbox) -define Drf = Character ('Dr. Fernsworth', base, color="#4963A5", **long_textbox) -define FRT = Character ('Fang Reed & Trish', base, color="#4963A5", **long_textbox) - +define AnonAndFang = Character('Anon and Fang', base, color="72DFA8", who_outlines=[(1, '#113623')]) +define SV = Character ('Street Vendor', base, color="#F8E120", who_outlines=[(1, '#361504')]) +define carl = Character ('Mr. Carldewskii', base, color="#E19E40", who_outlines=[(1, '#03223B')]) +define Drf = Character ('Dr. Fernsworth', base, color="#253354", who_outlines=[(1, '#334573')]) +define FRT = Character ('Fang Reed & Trish', base, color="#4963A5", who_outlines=[(1, '#FFFFFF')]) #Extra image translations #siloettes @@ -334,6 +338,13 @@ image dimmer_darker = "#00000088" 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 diff --git a/game/script/1.first-two-days-anon-meets-fang.rpy b/game/script/1.first-two-days-anon-meets-fang.rpy index b7dfc79..7efdb3c 100644 --- a/game/script/1.first-two-days-anon-meets-fang.rpy +++ b/game/script/1.first-two-days-anon-meets-fang.rpy @@ -359,7 +359,7 @@ label chapter_1: N "I had this prepared just for you!" - show anon neutral flip + show anon neutral flip show naomi neutral with dissolve pause .25 @@ -437,7 +437,7 @@ label chapter_1: N "ahem" - show anon neutral flip + show anon neutral flip show naomi neutral with Dissolve(.25) @@ -656,7 +656,7 @@ label chapter_1: pause 0.5 "{cps=*.2}Yay me.{/cps}" - + scene black with fade # SCENE UPDATED @@ -741,7 +741,7 @@ label chapter_1: I "I stand from my seat and face the class.{w=0.5} Once again all eyes on me and the tightness in my chest returns.{w} I inhale deep,{w=0.3} willing my erratic heart to slow." - + $ renpy.music.set_volume(0.3, 0, 'ambient1') play ambient1 'audio/effects/heartbeat.ogg' fadein 4 @@ -782,7 +782,7 @@ label chapter_1: A "uh{cps=*0.2}...{/cps}{w=0.4} I{cps=*0.2}...{/cps}" I "There’s whispers now.{w} The hushed tones,{w=0.3} silenced snickers,{w=0.3} blending with the everpresent stares." - + I "My heart hammers at my chest and I am sure that they all can hear it.{w=0.5} See the cold chill racing over me." show dimmer_darker behind anon, jinflip with dissolve @@ -871,7 +871,7 @@ label chapter_1: $ renpy.music.set_volume(1, 1, 'ambient') hide dimmer_light with dissolve - + show anon sad flip behind naser with Dissolve(0.25) pause 0.75 @@ -1022,7 +1022,7 @@ label chapter_1: show naomi explanatory flip: easein 0.4 xalign 0.9 - + N "Hey!{w=0.4} Don’t leave me out of the conversation!" show naomi happy flip with dissolve @@ -1472,7 +1472,7 @@ label chapter_1: show anon: easein_quad 0.5 xalign 0.825 - pause .5 + pause .5 A "Seriously?" @@ -1486,7 +1486,7 @@ label chapter_1: Nas "Look,{w=0.5} whatever happens{w=0.3} 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" pause 0.6 A "Naser why did you just murder the english language in cold blood?" @@ -1524,7 +1524,7 @@ label chapter_1: I "I’m just getting thrown around today.{w=0.5} I don’t know." I "She looks familiar." - + stop ambient fadeout 1 pause 1.0 @@ -1540,7 +1540,7 @@ label chapter_1: pause .5 play music 'audio/OST/its_the_piece_of_shit_you_asked_for.ogg' volume 1 with hpunch - pause 2 + pause 2 I "What I thought was a guitar sounded horrifically wrong,{w=0.5} far too heavy." @@ -2213,7 +2213,7 @@ label chapter_1: Re "Bro,{w=0.4} you’ve known I’m in a band for like,{w=0.4} a year now." show reed neutral flip - + pause 0.7 show naomi angry: easein 0.25 xalign 0.1 @@ -2963,14 +2963,14 @@ label chapter_1: menu: "Grab the cookies you fatass": - + pass "That sandwich looks good": pass - pause .5 + pause .5 I "Why not both?" I "Hence my tray stacked high with desserts and the tastiest looking sandwich from the lunchline." @@ -3121,7 +3121,7 @@ label chapter_1: show naser: linear 0.2 xalign .7 - + pause .7 I "{i}I realize now that I had been laughing with them.{/i}" pause .5 diff --git a/game/script/10.an-excellent-reason-to-start-abusing-mod-powers.rpy b/game/script/10.an-excellent-reason-to-start-abusing-mod-powers.rpy index ed860e1..8b23884 100644 --- a/game/script/10.an-excellent-reason-to-start-abusing-mod-powers.rpy +++ b/game/script/10.an-excellent-reason-to-start-abusing-mod-powers.rpy @@ -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." @@ -350,4 +350,4 @@ label chapter_10: stop music fadeout 1.0 "..." - return \ No newline at end of file + return diff --git a/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy b/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy index b56084f..62e25d4 100644 --- a/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy +++ b/game/script/13D.fang-plays-well,-naomi-jealous,-fang-talks-to-anon-to-break-up-while-she-thinks-about-her-life.rpy @@ -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." diff --git a/game/script/2.fourth-day-of-school.rpy b/game/script/2.fourth-day-of-school.rpy index 18d87f1..cbca7f3 100644 --- a/game/script/2.fourth-day-of-school.rpy +++ b/game/script/2.fourth-day-of-school.rpy @@ -1,7 +1,7 @@ label chapter_2: scene room anon dark with fade - + I "{cps=*0.2}-- Two Days Later --{/cps}" pause .6 @@ -588,7 +588,7 @@ label chapter_2: A "Yeah what she said." pause .5 - + stop music fadeout 2.5 show farnsworth behind fang: @@ -644,7 +644,7 @@ label chapter_2: show fang: easein_back .4 xalign -0.3 F "I. Am. Non.{fast} Binary." - + I "How was I supposed to know something so trivial would set something like this off?!" pause .5 @@ -675,17 +675,17 @@ label chapter_2: stop music fadeout 0.1 play sound 'audio/effects/slapstickSuperPunch.ogg' - + # fuk u renpy, let me do more than one goddamn thing at once without resorting to this hacky bullshit show fang shocked: xalign -0.3 show farnsworth concerned: easein_elastic 1 xalign 1.0 - Drf "{b}FANG{/b}.{nw}" with Fade(.1, 0, .4, color="#fff") + Drf "{b}FANG{/b}.{nw}" with Fade(.1, 0, .4, color="#fff") extend "" with vpunch # show fang: - # xalign -0.3 + # xalign -0.3 # show fang shocked with Dissolve(.2) show dimmer_darker behind fang with Dissolve(.25) @@ -1195,7 +1195,7 @@ label chapter_2: A "Y{w=.2}-yeah.{w=.4} {cps=*.2}Haha.{/cps}" A "I{w=.1}-I mean,{w=.3} concert?" - + show trish neutral flip with Dissolve(.25) pause .5 @@ -1310,7 +1310,7 @@ label chapter_2: I "The bell announces lunchtime,{w=.4} and the rest of the students collectively rise and start shuffling out the door." - play music 'audio/OST/Those Other Two Weirdos.ogg' fadein 1 + play music 'audio/OST/Those Other Two Weirdos.ogg' fadein 1 stop sound fadeout 1.0 A "Lunch hour,{w=.4} been a blast talking to you guys." @@ -1413,7 +1413,7 @@ label chapter_2: I "I need to find Reed." I "I double back to the classroom I just left and find it empty." - + I "{i}Fuck.{/i}" I "Maybe he’s getting his lunch now.{w=.4} Cafeteria then." @@ -1716,10 +1716,10 @@ label chapter_2: F "Wow.{w=.5} That is hilariously depressing." show dimmer_light behind anon, trish, reed, fang - show anon sad flip + show anon sad flip with Dissolve(.25) I "I hate everyone here." - show anon neutral flip behind reed + show anon neutral flip behind reed hide dimmer_light with dissolve @@ -1740,7 +1740,7 @@ label chapter_2: F "{cps=*.65}Uuuuuuuuuuuuuuuuurrrrrrrrrrggggghhhhhhh.{/cps}{w=.4} Trish?" show fang neutral - show trish smug flip + show trish smug flip with Dissolve(.25) T "The morons swapped backpacks and now they’re best friends or something." @@ -1759,7 +1759,7 @@ label chapter_2: F "Is he?" show trish neutral flip - show anon neutral + show anon neutral with Dissolve(.25) A "{cps=*.1}...{/cps}Didn’t you already grab your lunch,{w=.3} Reed?" @@ -1821,7 +1821,7 @@ label chapter_2: show fang neutral with Dissolve(.25) F "No,{w=.3} fuck that.{w=.5} I would never wear something that retarded." - + hide dimmer_lighter with dissolve I "As for Reed{cps=*.1}...{/cps}" @@ -1850,7 +1850,7 @@ label chapter_2: Re "I can." show reed neutral - show anon neutral flip + show anon neutral flip with Dissolve(.25) A "Huh?" @@ -1892,7 +1892,7 @@ label chapter_2: label .PostCheckLinkOut: - + show reed explanatory Re "Xrox is better anyways,{w=.4} you see the whole lineup they had prepared for{cps=*.1}...{/cps}" @@ -1902,14 +1902,14 @@ label chapter_2: I "I thought he was just an airhead,{w=.4} but{cps=*.1}...{/cps}" I "I totally can’t get a read on this guy." - + show reed neutral - hide dimmer_lighter + hide dimmer_lighter with dissolve F "Well,{w=.3} anyways." - show anon neutral + show anon neutral show fang considering with Dissolve(.25) pause .25 @@ -1928,7 +1928,7 @@ label chapter_2: I "Trish and Fang babble to each other about their daily activities all through the lunch line." I "Reed on the other hand has pulled out a tablet from his backpack to show me something." - + scene cafeteria show anon neutral: xalign -0.2 yalign 0.1 @@ -1939,7 +1939,7 @@ label chapter_2: show trish neutral flip: xalign 1.125 yalign 0.0 with fade - pause .5 + pause .5 show reed explanatory flip Re "So like,{w=.4} y’know we got a band,{w=.2} yeah?" @@ -1961,12 +1961,12 @@ label chapter_2: play music 'audio/OST/The (audiophile edition).ogg' with vpunch pause .6 - + I "Even through the poor recording quality I can see and hear just how atrocious the band is." I "I bite back the grimace threatening to come out as I give the video my full attention." pause .5 - + F "W{w=.2}-well?" show trish happy flip with Dissolve(.25) @@ -2002,7 +2002,7 @@ label chapter_2: "Very nice ironic reference to Beethoven’s Für Elise.": pass - + pause .5 $ renpy.music.set_volume(0, 0.1, 'ambient') @@ -2031,7 +2031,7 @@ label chapter_2: play music 'audio/OST/Bayside Bumming it.ogg' show trish neutral flip - show reed explanatory flip + show reed explanatory flip with Dissolve(.25) Re "Jeez man,{w=.4} you got the ears of a bat?" show reed neutral flip @@ -2223,7 +2223,7 @@ label chapter_2: show naomi explanatory with Dissolve(.25) N "What a great opportunity for real friendship Anon!{w=.5} I’m so happy for you!" - + show naomi neutral show naser considering with Dissolve(.25) @@ -2260,7 +2260,7 @@ label chapter_2: pause 1 show naser considering flip - show naomi neutral + show naomi neutral with dissolve I "The bell’s loud sound rings on our ears" diff --git a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy index 7af9780..f52a70e 100644 --- a/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy +++ b/game/script/5.fang-and-anon-cut-class-to-talk-on-the-roof.rpy @@ -24,7 +24,7 @@ label chapter_5: "It’s Saturday after all." pause .5 - + scene outside school fog with Dissolve(1) "Except{w=.4} I’m walking to school." @@ -135,7 +135,7 @@ label chapter_5: St "Oh,{w=.2} wonderful!" "My eyes are drawn to the green stego,{w=.4} who I immediately recognize from that encounter with the cards." - + show stella neutral with Dissolve(.25) show anon: @@ -215,13 +215,13 @@ label chapter_5: show fang neutral flip show rosa: ease 0.5 xalign 0.05 - + stop music fadeout 3 play sound 'audio/effects/spearYellRumbleVoice.ogg' Sp "GET ALL YOUR ASSES OUT FRONT RIGHT NOW!" with hpunch pause .5 - show anon neutral + show anon neutral show fang neutral show rosa considering show stella considering @@ -439,7 +439,7 @@ label chapter_5: A "If you say so{cps=*.1}...{/cps}" pause .5 - + show anon: easein_cubic 1 yalign -0.5 show fang: @@ -460,7 +460,7 @@ label chapter_5: show fang considering with Dissolve(.25) F "Don’t feel like getting down.{w=.4} Come on,{w=.2} you can’t be that weak." - pause .5 + pause .5 "Whatever.{w=.4} {nw}" show anon: @@ -519,7 +519,7 @@ label chapter_5: A "FANG!" with vpunch stop music fadeout 3 - 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 Dissolve(1) @@ -536,7 +536,7 @@ label chapter_5: pass "Tug Her Ankle": pass - + pause .5 "As I reach out to her she drops another clump into my eyes,{w=.4} blinding me." @@ -559,9 +559,9 @@ label chapter_5: show black with Fade(.1, 0, 1, color="#fff") pause .5 - # B: Going by the script Anon is supposed to be laying in the flowerbed - # until Rosa picks him up, and Fang still up on the ladder, but there's not - # really any good-looking way of showing this I can think of - hence the + # B: Going by the script Anon is supposed to be laying in the flowerbed + # until Rosa picks him up, and Fang still up on the ladder, but there's not + # really any good-looking way of showing this I can think of - hence the # disparity between the visuals and dialogue in this segment "Suddenly stars explode in my sight impaired eyes and I fall backwards." @@ -728,7 +728,7 @@ label chapter_5: show fang considering flip with Dissolve(.25) - Ro "Wh-{w=.3}yo-{w=.3}why-{w=.6} {nw}" + Ro "Wh-{w=.3}yo-{w=.3}why-{w=.6} {nw}" play sound 'audio/effects/slapStickPunch.ogg' show rosa: easein_elastic 0.5 xalign 0.6 @@ -779,9 +779,9 @@ label chapter_5: Ro "SORRY?{w=.5} What kind of pendejo manages to fall that hard into my Middlemist Red Camelias that hard on his own?!?" "I shrug apologetically." - - show fang considering flip with Dissolve(.25) - + + show fang considering flip with Dissolve(.25) + Ro "I just{cps=*.1}...{/cps}{w=.3} URGH!{w=.4} Do you have {i}any{/i} idea how long it takes for those to bloom!" Ro "Name!{w=.4} What is your name?!" @@ -811,7 +811,7 @@ label chapter_5: easein 0.5 xalign -0.1 show anon neutral with dissolve pause .5 - + A "You trying to rip my arm off?" "She grabs a bicep proudly." @@ -1039,7 +1039,7 @@ label chapter_5: stop ambient fadeout 3 pause .5 - + show fang: easein_elastic 0.5 xalign 0.1 show fang angry flip with Dissolve(.25) @@ -1262,7 +1262,7 @@ label chapter_5: play sound 'audio/effects/whoosh.ogg' pause .15 play sound 'audio/effects/slapstickBigPunch.ogg' - scene black with Fade(.1, 0, 1, color="#fff") + scene black with Fade(.1, 0, 1, color="#fff") "My head snaps to the side,{w=.4} a burning sting radiating from my cheek." @@ -1420,7 +1420,7 @@ label chapter_5: show stella unimpressed flip with Dissolve(.25) St "You should go find Fang and apologize.{w=.5} And bring her back." - + show stella sad flip with Dissolve(.25) St "If you don’t share someone’s pain,{w=.4} you can never understand them." pause .5 @@ -1440,14 +1440,14 @@ label chapter_5: hide anon with dissolve stop music fadeout 4 - + show rosa: easein_cubic 1 xalign 0.4 show rosa bossy flip with Dissolve(.25) Ro "You better!" pause .5 - scene outside school + scene outside school with Fade(1,0,1) "There aren’t many cars in the parking lot,{w=.4} so Fang shouldn’t be too hard to find." @@ -1648,7 +1648,7 @@ label chapter_5: pass "{b}GET THE FUCK OUT OF DODGE.{/b}": pass - + scene black with fade "Fang immediately bolts towards the front of the school." @@ -1690,7 +1690,7 @@ label chapter_5: show fang: easein_cubic 1 xalign 1.2# pause .2 - show fang angry with dissolve + show fang angry with dissolve "Her sneer returns and she makes to turn away." pause .5 @@ -1972,7 +1972,7 @@ label chapter_5: Sp "Dismissed." pause .5 - + show spears neutral with Dissolve(.25) hide spears with easeoutright pause .5 @@ -1986,7 +1986,7 @@ label chapter_5: Ro "Not you,{w=.3} An-{w=.1}on!{w=.4} You stay!" show anon concerned with dissolve pause .25 - + Ro "Right!{w=.4} And before everyone goes{cps=*.1}...!{/cps}" show stella neutral flip: @@ -2001,7 +2001,7 @@ label chapter_5: pause .25 show anon neutral - show fang happy + show fang happy with Dissolve(.25) "The small crowd gets a bit more energetic." @@ -2050,7 +2050,7 @@ label chapter_5: pause .5 show rosa considering flip - show anon neutral + show anon neutral with dissolve "I don’t really{cps=*.1}...{/cps}{w=.3} get compliments." @@ -2174,7 +2174,7 @@ label chapter_5: scene flower garden with Dissolve(1) pause .5 - + "Fang seems to have disappeared,{w=.4} guess she didn’t want to stick around longer than she had to after all." pause .5 @@ -2374,7 +2374,7 @@ label chapter_5: "{cps=*.05}...{/cps}" pause 1 - + #Heart to Heart play music 'audio/OST/punk_revamp.ogg' fadein 1 @@ -2489,7 +2489,7 @@ label chapter_5: pause .5 A "ow{cps=*.1}...{/cps}" - + show reed explanatory flip with Dissolve(.25) Re "Bro{cps=*.1}.....{/cps}{w=.3} that sucks{cps=*.1}.....{/cps}" show reed neutral flip with Dissolve(.25) @@ -2514,7 +2514,7 @@ label chapter_5: pause .2 hide reed with dissolve pause .5 - + show anon sad: alpha 0 yalign -0.8 xalign -0.1 @@ -2636,7 +2636,7 @@ label chapter_5: easein_cubic 1 xalign 0.55 T "{i}You’ll{/i} talk to Fang?{w=.6} You’ll probably make it worse.{w=.6} {i}I{/i} should be the one to talk with them." pause .5 - + A "So why haven’t you?" pause .5 @@ -2730,14 +2730,14 @@ label chapter_5: "I can’t think of anything that would be appropriate around normal highschoolers." pause .5 - + show trish: easein_cubic 1 xalign 0.5 show trish happy with Dissolve(.25) "Trish raises her hand and jumps in place." T "How about the Count of Monte Cristo?" - + show reed explanatory flip Re "Oh,{w=.3} I know that one!{w=.4} The actors in that one are pretty great{cps=*.1}...{/cps}" show reed neutral flip with Dissolve(.25) @@ -2755,7 +2755,7 @@ label chapter_5: with None show trish neutral flip with Dissolve(.25) pause .5 - + "Trish and Reed stop and stare at me." pause .5 @@ -2773,7 +2773,7 @@ label chapter_5: play sound 'audio/effects/schoolBell.ogg' I "{cps=*20}{i}DING-{w=0.7}DONG {w=0.65}BING-{w=0.7}BONG{/i}{/cps}" - show trish considering flip with Dissolve(.25) + show trish considering flip with Dissolve(.25) pause 0.5 play music 'audio/OST/The.ogg' fadein 1.0 @@ -2840,7 +2840,7 @@ label chapter_5: "Still unseen?" "{cps=*.1}...{/cps}" - + hide anonphone with easeoutbottom pause .5 @@ -2870,7 +2870,7 @@ label chapter_5: "There are only two in the building." "I sprint to the first bathroom,{w=.4} closer to the back of the school and nestled away in the special needs area." - + "My knuckles rap against the door,{w=.4} locked and preoccupied." pause .5 @@ -2882,7 +2882,7 @@ label chapter_5: unknown "{cps=*.4}The one you seek is elsewhere.{/cps}" pause .5 - + "Who the fuck{cps=*.1}...{/cps}{w=.3} Wait{cps=*.1}...{/cps}" A "You’re that weird stego chick{cps=*.1}...{/cps}{w=.3} Stella?" @@ -2976,7 +2976,7 @@ label chapter_5: easein 1 xalign 0.0 with dissolve pause 1 - + A "Mr. Jingo’s hall pass.{w=.5} I uh{cps=*.1}...{/cps}{w=.3} kinda need help with sheet music again." show fang unimpressed flip with Dissolve(.25) @@ -3067,7 +3067,7 @@ label chapter_5: pause .5 F "Not once after all the work I’ve put into VVURM DRAMA has anyone ever told me it was good." - + show fang sad flip with dissolve pause .5 "Her eyes wetten.{w=.6} Her voice roughens.{w=.6} Her shoulders quake." @@ -3226,7 +3226,7 @@ label chapter_5: show fang angry with Dissolve(.25) F "He’s always trying." pause .5 - + show fang: easein_cubic 1 xalign 0.4 show fang very angry with dissolve @@ -3266,7 +3266,7 @@ label chapter_5: "Interrupt": pause .5 jump interrupt4d - + show fang: easein_quart 1 xalign 0.2 show fang ultra angry with Dissolve(.25) @@ -3369,7 +3369,7 @@ label chapter_5: "Fang grips my jacket with both hands,{w=.4} digging in." pause .5 - + scene fangroofcry with Dissolve(.25) pause 1 @@ -3606,17 +3606,17 @@ label chapter_5: show fang very sad with dissolve F "My baby brother,{w=.3} just 9 years old,{w=.4} had jumped off the bluff,{w=.5} thinking he could fly!" - "Fang’s eyes grow wet again." + "Fang’s eyes grow wet again." show anon behind fang: ease_cubic 1 xalign 0.7 pause .5 - + hide fang hide anon show fanganonhug with dissolve - + "Without a second thought I draw her into a hug,{w=.4} comforting her." "Her voice is muffled by my jacket but she continues." @@ -3676,7 +3676,7 @@ label chapter_5: pause .25 F "Useless?{w=.5} Something like that." - + show fang neutral with Dissolve(.25) pause .5 @@ -3746,7 +3746,7 @@ label chapter_5: pause .5 "Fang removes her head from her knees and looks to me with pleading eyes." pause .5 - + F "What?" pause .5 @@ -3811,7 +3811,7 @@ label chapter_5: F "{cps=*.1}...{/cps}" pause .5 - + show fang sad with dissolve pause .5 @@ -3824,7 +3824,7 @@ label chapter_5: label postinterruption: - + show anon behind fang: ease_cubic 1 xalign 0.9 "I put my arm on Fang’s shoulder." @@ -3871,12 +3871,12 @@ label chapter_5: A "You don’t have to do it alone." pause .5 - + show anon behind fang show fang: ease_cubic 1 xalign 0.8 pause .5 - + hide fang hide anon show fanganonhug @@ -4000,11 +4000,11 @@ label chapter_5: "More natural." pause .5 - "I’m careful to hoist her to her feet.{w=.5} Mindful of her injured palm." + "I’m careful to hoist her to her feet.{w=.5} Mindful of her injured palm." show weridkissu with Dissolve(.25) pause 1 - + "But her beak accidentally bumps into my cheek on her way up." pause 1 @@ -4321,4 +4321,9 @@ label chapter_5: "{cps=*.05}...{/cps}" - return \ No newline at end of file + return + +# I'm guessing this is for the gallery? +label fang_movie: + scene fang tail with fade + "" diff --git a/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy b/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy index b759127..a1645c9 100644 --- a/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy +++ b/game/script/6.anon-helps-fang-find-a-venue-for-band.rpy @@ -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." @@ -2685,4 +2685,4 @@ label chapter_6: "..." - return \ No newline at end of file + return diff --git a/game/script/7.concert-day.rpy b/game/script/7.concert-day.rpy index 0e27ee2..d3389ef 100644 --- a/game/script/7.concert-day.rpy +++ b/game/script/7.concert-day.rpy @@ -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." diff --git a/game/src/cg_gallery.rpy b/game/src/cg_gallery.rpy new file mode 100644 index 0000000..aec52ca --- /dev/null +++ b/game/src/cg_gallery.rpy @@ -0,0 +1,292 @@ +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 + hbox: + style_prefix "quick" + xalign 0.5 + yalign 0.975 + if (ALLOW_ZOOM) and renpy.variant("small"): + use quick_buttons("gui/button/uioptionbuttons/template_idle.png", + [ + [ "+", zoom_a_f ], + [ "-", zoom_b_f ], + [ "Return", zoom_b_f ] + ] ) + else: + use quick_buttons("gui/button/uioptionbuttons/template_idle.png", + [ + [ "Return", _origin ] + ] ) + diff --git a/game/src/mod_menu.rpy b/game/src/mod_menu.rpy new file mode 100644 index 0000000..a068e04 --- /dev/null +++ b/game/src/mod_menu.rpy @@ -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) diff --git a/game/storyline.rpy b/game/storyline.rpy index 5c1e906..846d6ba 100644 --- a/game/storyline.rpy +++ b/game/storyline.rpy @@ -58,4 +58,4 @@ label ending: if tradwife: scene c10 with fade pause 20 - return \ No newline at end of file + return