420 lines
10 KiB
Text
420 lines
10 KiB
Text
# Copyright 2004-2019 Tom Rothamel <pytom@bishoujo.us>
|
|
#
|
|
# Permission is hereby granted, free of charge, to any person
|
|
# obtaining a copy of this software and associated documentation files
|
|
# (the "Software"), to deal in the Software without restriction,
|
|
# including without limitation the rights to use, copy, modify, merge,
|
|
# publish, distribute, sublicense, and/or sell copies of the Software,
|
|
# and to permit persons to whom the Software is furnished to do so,
|
|
# subject to the following conditions:
|
|
#
|
|
# The above copyright notice and this permission notice shall be
|
|
# included in all copies or substantial portions of the Software.
|
|
#
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
# This is kind of a catch-all file for things that are defined in the library,
|
|
# but don't merit their own files.
|
|
|
|
init 9999:
|
|
# Re-run the errorhandling setup, so we can adjust the styles to the new size
|
|
# of the screen.
|
|
call _errorhandling
|
|
|
|
init -1700 python:
|
|
|
|
# Should we debug the equality operations?
|
|
config.debug_equality = False
|
|
|
|
class DictEquality(object):
|
|
"""
|
|
Declares two objects equal if their types are the same, and
|
|
their internal dictionaries are equal.
|
|
"""
|
|
|
|
def __eq__(self, o):
|
|
|
|
try:
|
|
if self is o:
|
|
return True
|
|
|
|
if _type(self) is _type(o):
|
|
return (self.__dict__ == o.__dict__)
|
|
|
|
return False
|
|
|
|
except:
|
|
if config.debug_equality:
|
|
raise
|
|
|
|
return False
|
|
|
|
def __ne__(self, o):
|
|
return not (self == o)
|
|
|
|
class FieldEquality(object):
|
|
"""
|
|
Declares two objects equal if their types are the same, and
|
|
the listed fields are equal.
|
|
"""
|
|
|
|
# The lists of fields to use.
|
|
equality_fields = [ ]
|
|
identity_fields = [ ]
|
|
|
|
def __eq__(self, o):
|
|
|
|
try:
|
|
|
|
if self is o:
|
|
return True
|
|
|
|
if _type(self) is not _type(o):
|
|
return False
|
|
|
|
for k in self.equality_fields:
|
|
if self.__dict__[k] != o.__dict__[k]:
|
|
return False
|
|
|
|
for k in self.identity_fields:
|
|
if self.__dict__[k] is not o.__dict__[k]:
|
|
return False
|
|
|
|
return True
|
|
|
|
except:
|
|
|
|
if config.debug_equality:
|
|
raise
|
|
|
|
return False
|
|
|
|
def __ne__(self, o):
|
|
return not (self == o)
|
|
|
|
|
|
init -1700 python:
|
|
|
|
# basics: True if the skip indicator should be shown.
|
|
config.skip_indicator = True
|
|
|
|
# This is updated to give the user an idea of where a save is
|
|
# taking place.
|
|
save_name = ''
|
|
|
|
##########################################################################
|
|
# Alias the preferences object.
|
|
|
|
# This is for compatibility with default preferences.foo = True.
|
|
preferences = _preferences
|
|
|
|
##########################################################################
|
|
# Empty window
|
|
|
|
def _default_empty_window():
|
|
|
|
try:
|
|
who = _last_say_who
|
|
who = renpy.eval_who(who)
|
|
except:
|
|
who = None
|
|
|
|
if who is None:
|
|
who = narrator
|
|
|
|
if isinstance(who, NVLCharacter):
|
|
nvl_show_core()
|
|
elif isinstance(store.narrator, ADVCharacter):
|
|
store.narrator.empty_window()
|
|
elif isinstance(store._narrator, ADVCharacter):
|
|
store._narrator.empty_window()
|
|
|
|
config.empty_window = _default_empty_window
|
|
|
|
|
|
##########################################################################
|
|
# Extend
|
|
|
|
config.extend_interjection = "{fast}"
|
|
|
|
def extend(what, interact=True, *args, **kwargs):
|
|
who = _last_say_who
|
|
who = renpy.eval_who(who)
|
|
|
|
if who is None:
|
|
who = narrator
|
|
elif isinstance(who, basestring):
|
|
who = Character(who, kind=name_only)
|
|
|
|
# This ensures extend works even with NVL mode.
|
|
who.do_extend()
|
|
|
|
what = _last_say_what + config.extend_interjection + _last_raw_what
|
|
|
|
args = args + _last_say_args
|
|
kw = dict(_last_say_kwargs)
|
|
kw.update(kwargs)
|
|
kw["interact"] = interact and kw.get("interact", True)
|
|
|
|
renpy.exports.say(who, what, *args, **kw)
|
|
store._last_say_what = what
|
|
|
|
extend.record_say = False
|
|
|
|
|
|
##########################################################################
|
|
# Skip indicator
|
|
|
|
style.skip_indicator = Style(style.default, heavy=True, help='The skip indicator.')
|
|
style.skip_indicator.xpos = 10
|
|
style.skip_indicator.ypos = 10
|
|
|
|
def _skip_indicator():
|
|
|
|
if renpy.has_screen("skip_indicator"):
|
|
|
|
if config.skipping and not renpy.get_screen("skip_indicator"):
|
|
renpy.show_screen("skip_indicator")
|
|
elif not config.skipping and renpy.get_screen("skip_indicator"):
|
|
renpy.hide_screen("skip_indicator")
|
|
|
|
return
|
|
|
|
### skip_indicator default
|
|
# (text) The style and placement of the skip indicator.
|
|
|
|
if config.skip_indicator is True:
|
|
|
|
if config.skipping:
|
|
ui.text(_(u"Skip Mode"), style='skip_indicator')
|
|
|
|
return
|
|
|
|
if not config.skip_indicator:
|
|
return
|
|
|
|
if not config.skipping:
|
|
return
|
|
|
|
ui.add(renpy.easy.displayable(config.skip_indicator))
|
|
|
|
config.overlay_functions.append(_skip_indicator)
|
|
|
|
|
|
##########################################################################
|
|
# Predictions
|
|
|
|
# A list of labels we predict at start time.
|
|
config.predict_start_labels = [ "start" ]
|
|
|
|
# Prediction of statements.
|
|
def _predict_statements(current):
|
|
|
|
if main_menu:
|
|
rv = list(config.predict_start_labels)
|
|
rv.append(current)
|
|
return rv
|
|
|
|
return [ current ]
|
|
|
|
config.predict_statements_callback = _predict_statements
|
|
|
|
|
|
# Prediction of screens.
|
|
def _predict_screens():
|
|
|
|
for i in config.overlay_screens:
|
|
renpy.predict_screen(i)
|
|
|
|
s = _game_menu_screen
|
|
|
|
if s is None:
|
|
return
|
|
|
|
if renpy.has_screen(s):
|
|
renpy.predict_screen(s)
|
|
return
|
|
|
|
if s.endswith("_screen"):
|
|
s = s[:-7]
|
|
if renpy.has_screen(s):
|
|
renpy.predict_screen(s)
|
|
return
|
|
|
|
config.predict_callbacks.append(_predict_screens)
|
|
|
|
|
|
##########################################################################
|
|
# Name-only say statements.
|
|
|
|
# This character is copied when a name-only say statement is called.
|
|
name_only = adv
|
|
|
|
def predict_say(who, what):
|
|
who = Character(who, kind=name_only)
|
|
try:
|
|
who.predict(what)
|
|
except:
|
|
pass
|
|
|
|
def say(who, what, interact=True, *args, **kwargs):
|
|
who = Character(who, kind=name_only)
|
|
who(what, interact=interact, *args, **kwargs)
|
|
|
|
##########################################################################
|
|
# Misc.
|
|
|
|
# Should we display tiles in places of transparency while in developer
|
|
# mode?
|
|
config.transparent_tile = True
|
|
|
|
# Use DejaVuSans-Bold when appropriate.
|
|
config.font_replacement_map["DejaVuSans.ttf", True, False] = ("DejaVuSans-Bold.ttf", False, False)
|
|
|
|
# License text.
|
|
renpy.license = _("This program contains free software under a number of licenses, including the MIT License and GNU Lesser General Public License. A complete list of software, including links to full source code, can be found {a=https://www.renpy.org/l/license}here{/a}.")
|
|
|
|
init -1000 python:
|
|
# Set developer to the auto default.
|
|
config.original_developer = "auto"
|
|
|
|
if config.script_version:
|
|
config.developer = False
|
|
config.default_developer = False
|
|
else:
|
|
config.developer = True
|
|
config.default_developer = True
|
|
|
|
# Lock the library object.
|
|
config.locked = True
|
|
|
|
# Record the builtins.
|
|
renpy.lint.renpy_builtins = set(globals())
|
|
|
|
for i in """
|
|
adv
|
|
alt
|
|
anim
|
|
blinds
|
|
center
|
|
default
|
|
default_transition
|
|
dissolve
|
|
ease
|
|
easeinbottom
|
|
easeinleft
|
|
easeinright
|
|
easeintop
|
|
easeoutbottom
|
|
easeoutleft
|
|
easeoutright
|
|
easeouttop
|
|
fade
|
|
hpunch
|
|
irisin
|
|
irisout
|
|
left
|
|
menu
|
|
mouse_visible
|
|
move
|
|
moveinbottom
|
|
moveinleft
|
|
moveinright
|
|
moveintop
|
|
moveoutbottom
|
|
moveoutleft
|
|
moveoutright
|
|
moveouttop
|
|
name_only
|
|
nvl
|
|
nvl_variant
|
|
offscreenleft
|
|
offscreenright
|
|
pixellate
|
|
pushdown
|
|
pushleft
|
|
pushright
|
|
pushup
|
|
right
|
|
save_name
|
|
slideawaydown
|
|
slideawayleft
|
|
slideawayright
|
|
slideawayup
|
|
slidedown
|
|
slideleft
|
|
slideright
|
|
slideup
|
|
squares
|
|
suppress_overlay
|
|
sv
|
|
top
|
|
topleft
|
|
topright
|
|
truecenter
|
|
vpunch
|
|
wipedown
|
|
wipeleft
|
|
wiperight
|
|
wipeup
|
|
zoomin
|
|
zoominout
|
|
zoomout
|
|
""".split():
|
|
|
|
renpy.lint.renpy_builtins.remove(i)
|
|
|
|
# After init, make some changes based on if config.developer is True.
|
|
init 1700 python hide:
|
|
|
|
if config.developer:
|
|
|
|
if config.debug_sound is None:
|
|
config.debug_sound = True
|
|
|
|
renpy.load_module("_developer/developer")
|
|
renpy.load_module("_developer/inspector")
|
|
|
|
if config.window_title is None:
|
|
config.window_title = config.name or "A Ren'Py Game"
|
|
|
|
import os
|
|
if "RENPY_GL_MODERN" in os.environ:
|
|
config.gl_npot = True
|
|
config.cache_surfaces = False
|
|
|
|
print("Modern GL Enabled.")
|
|
|
|
|
|
|
|
# Used by renpy.return_statement() to return.
|
|
label _renpy_return:
|
|
return _return
|
|
|
|
# Entry point for the developer screen. The rest of it is loaded from
|
|
# _developer.rpym
|
|
label _developer:
|
|
|
|
if not config.developer:
|
|
return
|
|
|
|
$ _enter_menu()
|
|
|
|
jump expression "_developer_screen"
|
|
|
|
|
|
# This is used to ensure a fixed click-to-continue indicator is shown on
|
|
# its own layer.
|
|
screen _ctc:
|
|
add ctc
|
|
|
|
|
|
# Creates the data structure that history is stored in.
|
|
default _history = True
|
|
default _history_list = [ ]
|