Skip to content

Instantly share code, notes, and snippets.

@Gouvernathor
Last active July 16, 2021 15:04
Show Gist options
  • Save Gouvernathor/6a8c398cb7ca6616bc0bc37a96b1638e to your computer and use it in GitHub Desktop.
Save Gouvernathor/6a8c398cb7ca6616bc0bc37a96b1638e to your computer and use it in GitHub Desktop.
Events manager and journal screen to display it
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