diff --git a/game/scripts/utility/actions.rpy b/game/scripts/utility/actions.rpy new file mode 100644 index 00000000..5a772cbc --- /dev/null +++ b/game/scripts/utility/actions.rpy @@ -0,0 +1,68 @@ +init python: + class SwitchShopCategory(Action): + def __init__(self, category: str, items: list): + self.category = category + self.items = items + + def __call__(self): + cs = renpy.current_screen() + + if cs is None: + raise Exception("No current screen.") + + items = self.items + scope = cs.scope + + scope["shop_items"] = items + scope["selected_category"] = self.category + scope["selected_item"] = items[0] if items else None + + renpy.restart_interaction() + + class SortFilter(Action): + def __init__(self, screenvar: str, sort_keys=None, filter_keys=None): + self.screenvar = screenvar + self.filter_keys = filter_keys + self.sort_keys = sort_keys + + def __call__(self): + cs = renpy.current_screen() + + if cs is None: + raise Exception("No current screen.") + + scope = cs.scope + var = self.screenvar + + if var not in scope: + raise Exception("Screen var is missing.") + + items = scope[var] + + if self.filter_keys: + items = self.filter(items, self.filter_keys) + if self.sort_keys: + items = self.sort(items, self.sort_keys) + + scope[var] = items + renpy.restart_interaction() + + @staticmethod + def filter(items, keys): + for key in keys: + if key.startswith("not "): + attr = key[4:] + items = filter(lambda x: not getattr(x, attr), items) + else: + items = filter(lambda x: getattr(x, key), items) + return items + + @staticmethod + def sort(items, keys): + for key in keys: + items = sorted(items, key=lambda x: SortFilter.natsort(getattr(x, key))) + return items + + @staticmethod + def natsort(s, pattern=re.compile("([0-9]+)")): + return [int(t) if t.isdigit() else t.lower() for t in pattern.split(str(s))]