181 lines
6.4 KiB
Plaintext
181 lines
6.4 KiB
Plaintext
python early:
|
|
if renpy.version_tuple < (8,2,1,24030407):
|
|
raise RuntimeWarning("Your Ren'Py launcher is outdated, the current minimal requirement is 8.2.1+\nPlease perform an update and try launching the game again.")
|
|
|
|
from renpy.uguu import glGetString, GL_VENDOR, GL_RENDERER, GL_VERSION
|
|
|
|
def get_gpu_info():
|
|
try:
|
|
info = "\n".join([glGetString(GL_VENDOR).decode(), glGetString(GL_RENDERER).decode(), glGetString(GL_VERSION).decode()])
|
|
except:
|
|
info = "ERR: Unknown or incompatible driver."
|
|
return info
|
|
|
|
def get_renderer():
|
|
return "DirectX" if preferences.renderer == "angle2" else "OpenGL"
|
|
|
|
class stdcol:
|
|
PURPLE = '\033[1;35;48m'
|
|
CYAN = '\033[1;36;48m'
|
|
BOLD = '\033[1;37;48m'
|
|
BLUE = '\033[1;34;48m'
|
|
GREEN = '\033[1;32;48m'
|
|
YELLOW = '\033[1;33;48m'
|
|
RED = '\033[1;31;48m'
|
|
BLACK = '\033[1;30;48m'
|
|
UNDERLINE = '\033[4;37;48m'
|
|
END = '\033[1;37;0m'
|
|
|
|
# Debug
|
|
# Note: config.developer flag is set to False during early initialisation
|
|
def detect_orphaned_rpyc_files():
|
|
excluded = ["tl/", "00db.rpyc", "00sshtransition.rpyc"]
|
|
|
|
files = renpy.list_files(common=True)
|
|
|
|
compiled = [x for x in files if x.endswith(".rpyc") if not any(x.startswith(i) for i in excluded)]
|
|
scripts = [x for x in files if x.endswith(".rpy")]
|
|
orphaned = []
|
|
|
|
for i in compiled:
|
|
if not i[:-1] in scripts:
|
|
orphaned.append(i)
|
|
|
|
if orphaned:
|
|
raise Exception(f"Orphaned compiled scripts detected, please force recompile in Ren'py Launcher before continuing:\n{orphaned}")
|
|
|
|
detect_orphaned_rpyc_files()
|
|
|
|
# class InstanceDebugger(object):
|
|
|
|
# def __init__(self, obj):
|
|
# object.__setattr__(self, 'instance', obj)
|
|
|
|
# def __get__(self, obj, type=None):
|
|
# return functools.partial(self, obj)
|
|
|
|
# def __call__(self, *args, **kwargs):
|
|
# return self.instance(*args,**kwargs)
|
|
|
|
# def __getattr__(self, attr):
|
|
# attr = getattr(self.instance, attr)
|
|
|
|
# return self.__class__(attr) if hasattr(attr, '__dict__') else attr
|
|
|
|
# def __setattr__(self, attr, value):
|
|
# instance = self.instance
|
|
|
|
# if getattr(instance, attr, None) != value:
|
|
# print(f"'{self.instance.id}' setting attribute '{attr}' to '{value}' ...")
|
|
|
|
# instance.attr = value
|
|
|
|
init python:
|
|
config.missing_image_callback = missing_image_func
|
|
|
|
if config.developer:
|
|
renpy.arguments.register_command("whitespace", save_whitespace)
|
|
else:
|
|
config.missing_label_callback = missing_label_func
|
|
config.return_not_found_label = "missing_return"
|
|
|
|
init -2 python:
|
|
|
|
def missing_image_func(path):
|
|
global systemerror
|
|
systemerror = ["Missing image", path]
|
|
file, ext = os.path.splitext(path)
|
|
|
|
if renpy.loadable(file + ".png"):
|
|
return Image(file + ".png")
|
|
|
|
if config.developer:
|
|
raise IOError(f"Missing image: {path}")
|
|
return Image("images/blank.webp")
|
|
|
|
def missing_label_func(name):
|
|
global systemerror
|
|
systemerror = ["Missing label", name]
|
|
return "missing_label"
|
|
|
|
def TBA_message(msg="Currently unavailable, check in later versions of the game."):
|
|
renpy.say(nar, msg)
|
|
|
|
def save_whitespace(refresh=False):
|
|
"""
|
|
Generates a whitespace information file.
|
|
"""
|
|
global whitespace_dict
|
|
|
|
ap = renpy.arguments.ArgumentParser("Generates a whitespace information file.", require_command=False)
|
|
ap.add_argument("--refresh", action="store_true", help="Recalculate for all images.")
|
|
args = ap.parse_args()
|
|
if args.refresh or refresh:
|
|
whitespace_dict = {}
|
|
|
|
path = os.path.normpath(config.gamedir)
|
|
images = []
|
|
for root, dirs, files in os.walk(path):
|
|
for file in fnmatch.filter(files, "*.webp"):
|
|
img = os.path.join(root, file).replace("\\", "/").split("/game/")[1]
|
|
images.append(img)
|
|
|
|
c = len(images)
|
|
for i, img in enumerate(images):
|
|
# stdout causes issues on Windows
|
|
|
|
# sys.stdout.write("\rCalculating whitespace... {:3.0f}%".format(i / float(c - 1) * 100.0))
|
|
# sys.stdout.flush()
|
|
crop_whitespace(img)
|
|
|
|
file = os.path.normpath(config.gamedir + "/images.whitespace")
|
|
with open(file, "w") as f:
|
|
for img, box in sorted(whitespace_dict.items()):
|
|
f.write("{}:{},{},{},{}\n".format(img, *box))
|
|
|
|
print("\rCalculating whitespace... Done!")
|
|
return False
|
|
|
|
label missing_label():
|
|
$ renpy.choice_for_skipping()
|
|
$ err_msg1 = systemerror[0]
|
|
$ err_msg2 = systemerror[1]
|
|
|
|
if not _savecompat:
|
|
# Suppress debug on save update, it's normal.
|
|
"{color=#7a0000}System{/color}" "Uh-oh. Looks like you've encountered a bug. Don't worry, we will try to return you back to the office after displaying the error message, your save file won't be affected."
|
|
"{color=#7a0000}System{/color}" "{color=#7a0000}Error:{/color} [err_msg1] '{color=#7a0000}[err_msg2]{/color}'\n\n\n{size=-4}You can report this bug on our {a=https://discord.gg/7PD57yt}discord{/a}.{/size}"
|
|
$ states.last_girl = None
|
|
$ states.active_girl = None
|
|
$ systemerror = [None, None]
|
|
$ _savecompat = False
|
|
jump main_room
|
|
|
|
label missing_return():
|
|
$ renpy.choice_for_skipping()
|
|
|
|
if not _savecompat:
|
|
# Suppress debug on save update, it's normal.
|
|
"{color=#7a0000}System{/color}" "Uh-oh. Looks like you've encountered a bug. Don't worry, we will try to return you back to the office after displaying the error message, your save file won't be affected."
|
|
"{color=#7a0000}System{/color}" "{color=#7a0000}Error:{/color} Point of no return.\n\n\n{size=-4}You can report this bug on our {a=https://discord.gg/7PD57yt}discord{/a}.{/size}"
|
|
$ states.last_girl = None
|
|
$ states.active_girl = None
|
|
$ _savecompat = False
|
|
jump main_room
|
|
|
|
screen placeholder():
|
|
tag cg
|
|
zorder 16 # above dolls
|
|
|
|
add Placeholder("bg")
|
|
add Placeholder("girl")
|
|
|
|
|
|
init 999 python hide:
|
|
def set_screen_layer(layer, *screens):
|
|
for scr_name in screens:
|
|
for _, scr in renpy.display.screen.get_all_screen_variants(scr_name):
|
|
scr.layer = layer
|
|
|
|
set_screen_layer("interface", "_performance", "_image_load_log")
|