# Init Mod
init -1000 python:
_ZLZK_UGU = _ZLZK_UGU()
# Exec Mod
init 1000 python:
# Hook hijacks.
_ZLZK_UGU.hook_hijacks()
# Mod Framework
init -2000 python:
def _ZLZK_UGU():
import renpy
object = _object
type = _type
dict = _dict
list = _list
set = _set
str = unicode
def Hook(obj, name):
"""
This hooks hijacks in objects.
`name`
Attribute name of object.
`func`
Hijack function.
"""
attr = getattr(obj, name)
hooked.add( (obj, name, attr) )
def Hook(func):
def wrapper(*args, **kwargs):
return func(attr, *args, **kwargs)
for v in (obj if obj.__class__ is type else obj.__class__).__mro__:
if name in v.__dict__:
if isinstance(v.__dict__[name], (staticmethod, classmethod)):
wrapper = staticmethod(wrapper)
break
wrapper.__name__ = attr.__name__
wrapper.__doc__ = attr.__doc__
setattr(obj, name, wrapper)
return Hook
hooked = set( )
class _ZLZK_UGU(object):
"""
Mod `Universal Gallery Unlocker`.
"""
__author__ = "ZLZK"
__name__ = "Universal Gallery Unlocker"
__version__ = (23, 3, 20)
@property
def author(self):
return self.__author__
@property
def name(self):
return self.__name__
@property
def version(self):
return "20" + "-".join( str(i).zfill(2) for i in self.__version__ )
def __str__(self):
return "{} [{}] [{}]".format(self.name, self.version, self.author)
# Value swapper.
@staticmethod
def _swap(o):
def s(o):
if o is False:
return True
if o is 0:
return 1
if o is "":
return " "
if isinstance(o, (set, list, tuple)):
return o.__class__( s(v) for v in o )
if isinstance(o, dict):
return o.__class__( (k, s(v)) for (k, v) in o.items() )
return o
o = s(o)
if isinstance(o, (set, list, dict)):
f = lambda *args: True
o = type(o.__class__.__name__, (o.__class__,), dict(__contains__=f))(o)
return o
# Hijacks hooker.
def hook_hijacks(self):
mod = self
# Make all labels to be seen.
@Hook(renpy.exports, 'seen_label')
def hijack(func, *args, **kwargs):
return True
# Make all images to be seen.
@Hook(renpy.exports, 'seen_image')
def hijack(func, *args, **kwargs):
return True
# Make all audios to be seen.
@Hook(renpy.exports, 'seen_audio')
def hijack(func, *args, **kwargs):
return True
# Make all missing persistent variables to be True.
@Hook(renpy.game.Persistent, '__getattr__')
def hijack(func, self, name):
if name.startswith("_"):
return func(self, name)
else:
return True
# Make all persistent variables to be True.
@Hook(renpy.game.Persistent, '__getattribute__')
def hijack(func, self, name):
if name.startswith("_"):
return func(self, name)
else:
return mod._swap(func(self, name))
# Unload hijacks on script reload.
@Hook(renpy.exports, 'utter_restart')
def hijack(func, *args, **kwargs):
mod.unhook_hijacks()
return func(*args, **kwargs)
def unhook_hijacks(self):
""" This unhooks all hijacks. """
while hooked:
setattr( *hooked.pop() )
return _ZLZK_UGU()
# EOF