Last active
July 16, 2021 15:04
-
-
Save Gouvernathor/6a8c398cb7ca6616bc0bc37a96b1638e to your computer and use it in GitHub Desktop.
Events manager and journal screen to display it
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
init python: | |
class Event: | |
def __init__(self, id, name=None, categories=()): | |
self.id = id | |
self.name = name if name is not None else id | |
self.categories = categories | |
define events_list = (Event("intro", _("Arrival in Hogwarts"), {_("General")}), | |
Event("office_prez"), # technical events used as flags | |
Event("first_sleep"), # not displayed in the journal since no category | |
Event("hermi1", _("Introduced to Hermione"), {_("Hermione")}), # first, the id | |
Event("luna1", _("Introduced to Luna"), {_("Luna")}), # then the label to display it | |
Event("daphne1", _("Introduced to Daphne"), {_("Daphne")}), # then the categories it fits in | |
Event("ginny1", _("Introduced to Ginny"), {_("Ginny")}), | |
Event("pan1", _("Discovered Pan"), {_("Pan")}), | |
) | |
# the categories will appear on the journal in the same order as they first appear here | |
define left_cats = {"General"} # list of categories to be displayed on the left page | |
# there is one constant like this because our journal has two pages | |
# but there needs to be one less than the number of pages | |
init python: | |
class Manager: | |
_eventids = {ev.id for ev in events_list} | |
def __init__(self): | |
self.set = set() | |
def check(self, evname): | |
self.set.add(evname) | |
if not getattr(self, evname): | |
setattr(self, evname, True) | |
def __setattr__(self, name, value): | |
if name in self._eventids: | |
if value is not True: | |
raise ValueError | |
object.__setattr__(self, name, value) | |
self.check(name) | |
# setattr(persistent.events, name, value) | |
persistent.events.add(name) | |
return | |
object.__setattr__(self, name, value) | |
return | |
def __contains__(self, evname): | |
return evname in self.set | |
def __getattr__(self, name): | |
if name in self._eventids: | |
return False | |
raise AttributeError | |
default events = Manager() | |
default persistent.events = set() | |
# to check if an event already happened during this game | |
# if events.intro | |
# if 'intro' in events | |
# to check if an event ever happened in any game on this computer | |
# if 'intro' in persistent.events | |
# to flag an event as passed (on both storages) | |
# events.intro = True | |
# events.check('intro') | |
init python hide: | |
import collections | |
left = collections.OrderedDict() | |
right = collections.OrderedDict() | |
for ev in events_list: | |
for kat in ev.categories: | |
stor = left if kat in left_cats else right | |
if kat not in stor: | |
# print(kat) | |
stor[kat] = [] | |
stor[kat].append(ev) | |
renpy.store.left_categories = left | |
renpy.store.right_categories = right | |
# store the events in categories for each page - needs to be tweaked if you add pages | |
default journal_left_page_adjustment = ui.adjustment() | |
default journal_right_page_adjustment = ui.adjustment() | |
# the scroobars for the pages - idem | |
# call this from the quick_menu with ShowMenu("journal") - my advice | |
screen journal(): | |
modal True | |
add "#0005" | |
add "open_book" pos (257, 81) | |
fixed: # left page | |
pos (350, 170) | |
xysize (565, 680) | |
# add Solid("#0f03") # to test the boundaries of the page | |
use events_page(journal_left_page_adjustment, left_categories) | |
vbar: | |
xanchor 1. | |
style "vscrollbar" | |
unscrollable "hide" | |
adjustment journal_left_page_adjustment | |
fixed: # right page | |
pos (1005, 170) | |
xysize (565, 680) | |
# add Solid("#0f03") | |
use events_page(journal_right_page_adjustment, right_categories) | |
vbar: | |
xpos 1. | |
style "vscrollbar" | |
unscrollable "hide" | |
adjustment journal_right_page_adjustment | |
imagebutton: # cross to close the screen | |
pos (1425+257, 378+81) | |
idle "book_close_idle" | |
hover "book_close_hover" | |
action Return() | |
screen events_page(adjustment, categories): | |
viewport: | |
draggable True | |
mousewheel "change" | |
yadjustment adjustment | |
has vbox | |
add Solid("#f00", ysize=0) | |
for k, (cat, evlist) in enumerate(categories.items()): | |
if k: | |
null height 30 | |
add "journal_divider" xalign .5 | |
null height 50 | |
# a horizontal line to separate the categories - only if one has already been written | |
use evs_block(cat, evlist) | |
screen evs_block(cat, evlist, prefix=" {b}-{/b} ", completed_suffix="{image=completed}", unknown=_("? ? ?")): | |
label "~ "+__(cat)+" ~": | |
xalign .5 | |
text_color "#000" | |
null height 20 | |
for ev in evlist: | |
text prefix+(__(ev.name) if (ev.id in persistent.events) else __(unknown))+(completed_suffix if ev.id in events.set else ""): | |
size 25 and 35 | |
font "fonts/dumbledor/dumbledor1.ttf" | |
# style to apply to all entries | |
if ev.id in events: | |
pass | |
# style to apply when the event was done in this game | |
else: | |
italic True | |
# style to apply when the event was not done in this game | |
if ev.id in persistent.events: | |
at transform: | |
alpha .6 | |
# style to apply of the event was ever done | |
else: | |
at transform: | |
alpha .3 | |
# style to apply of the event was never done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment