SnootGame/game/src/cg_gallery.rpy

236 lines
7.5 KiB
Plaintext

init 2 python:
import json
# CONST PARAMS
GALLERY_COLS = 4
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)
CG_PATHS = []
#path: folder, name: shows up in gallery, eval: runs eval() on string
"""
Data structure that holds the data for each cg and button
item is name, cg is the image definition
{ item: str; cg: Displayable; }
(reference in this init python, actually used in screens)
"""
gallery_dic = {}
# Makes a scaled down cg button
def cg_(fname, w):
scale = PREFERRED_WIDTH / w
if type(fname) is str:
image = im.FactorScale(fname, scale, scale, True)
return image
else:
return Transform(fname, zoom=scale)
# For testing purposes, unlocks all images in the gallery (And by extension the bonus chapters)
def unlock_all():
for key in gallery_dic.keys():
for image in gallery_dic[key]:
renpy.mark_image_seen(image["item"])
# Reads /images/cgs dir for all image files
# Populates galleryItems
# () -> None
def jsonloadandpop():
fp = renpy.open_file('src/gallery_dataset.json')
data = json.load(fp)
list_img = renpy.list_images()
for tab in data['tabs']:
tab_name = _(tab['tab_name'])
_eval = None
if 'eval' in tab.keys():
_eval = tab['eval']
CG_PATHS.append({'name': tab_name, 'eval': _eval})
gallery_dic[tab_name] = []
#gallery_dataset
if 'items' in tab.keys():
for image in tab['items']:
name = image["name"]
cg = image["image"]
rcg = renpy.get_registered_image(cg)
item = {
"item": name,
"image": rcg,
"cg": cg_(rcg, 1920),
}
gallery_dic[tab_name].append(item)
pass
jsonloadandpop()
gallery_dic['Animations'] = [{
"item": 'fang tail',
"image": 'images/animations/fang tail thumbnail.webp',
"cg": 'images/animations/fang tail thumbnail.webp',
}]
renpy.image("fang tail", Movie(loop=True,play='images/animations/fang tail.webm')) # Since we are hard-coding might as well.
pass
# Bullshit for the scrollbar to reset back to the beggining. Bless the renpy Discord :pray:
default adjust = ui.adjustment()
"""
CG Gallery screen - A screen that shows the image gallery
Built-in Gallery Object has terrible defaults, so I just wrote my own stuff
"""
screen cg_gallery(origin = 'CG'):
if main_menu:
key "game_menu" action ShowMenu("main_menu")
# Bg for frame
add gui.main_menu_background
# Frame
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 id "vbx":
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']) text_color gui.idle_color text_hover_color gui.hover_color activate_sound "audio/ui/uiClick.wav" action (ShowMenu('cg_gallery', cp['name']),SetField(adjust, 'value', 0)) text_xalign 0.5
elif eval(cp['eval']):
textbutton _(cp['name']) text_color gui.idle_color text_hover_color gui.hover_color activate_sound "audio/ui/uiClick.wav" action (ShowMenu('cg_gallery', cp['name']),SetField(adjust, 'value', 0)) text_xalign 0.5
else:
textbutton _(cp['name']) text_xalign 0.5
textbutton _("Return") activate_sound "audio/ui/uiBack.wav" action ShowMenu('main_menu') text_xalign 0.5
transform:
zoom 0.95
xcenter 0.525
ycenter 0.525
vpgrid id "vpg":
if gallery_rows>=4:
scrollbars "vertical"
mousewheel True
draggable True
pagekeys True
xfill True
yadjustment adjust
xcenter 0.5
spacing 20
cols GALLERY_COLS
for item in gallery_items:
use flag_button(item, origin)
for i in range(0, empty_spaces):
null height 20
"""
if/else flow control & extra parameters for Buttons
"""
screen flag_button(item, origin):
$ flag = renpy.seen_image(item['item'])
if flag:
button:
if item in gallery_dic['Animations']:
action ShowMenu('view_movie', item, ShowMenu('cg_gallery', origin))
else:
action ShowMenu('view_image', item, ShowMenu('cg_gallery',origin))
xcenter 0.5 ycenter 0.5
vbox:
yminimum PREFERRED_HEIGHT xminimum PREFERRED_WIDTH
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
add NOT_UNLOCKED_COVER
screen view_movie(item, _origin):
tag menu
key "game_menu" action [Hide('view_movie'), _origin ]
key "button_alternate" action [Hide('view_movie'), _origin ]
add item['item']
if renpy.variant("small"):
hbox:
style_prefix "quick"
xalign 0.5
yalign 0.975
use quick_buttons("gui/button/uioptionbuttons/template_idle.png",
[
[ "Return", _origin ]
] )
"""
view_image, Loads the image in fullscreen with viewport control.
"""
screen view_image(item, _origin):
tag menu
key "game_menu" action (Hide('view_image'), _origin)
key "button_alternate" action (Hide('view_image'), _origin)
viewport id "vie":
#Ren'Py isn't smart enough to not edgescroll while pressed,
#so we'll have to disable this for mobile
if renpy.variant("pc"):
edgescroll (300, 1800)
draggable True
arrowkeys True
pagekeys True
xfill False
yfill False
add item['image'] zoom 1.0 anchor (0.55, 0.55)
#Reuse quick buttons. Ren'Py handles touch input lazy, it doesn't have
#double finger pinch zoom, it translates taps as mouse events - have to use
#buttons
if renpy.variant("small"):
hbox:
style_prefix "quick"
xalign 0.5
yalign 0.975
use quick_buttons("gui/button/uioptionbuttons/template_idle.png",
[
[ "Return", _origin ]
] )