diff --git a/fftcg/carddb.py b/fftcg/carddb.py index e333f31..ef6743f 100644 --- a/fftcg/carddb.py +++ b/fftcg/carddb.py @@ -1,5 +1,7 @@ import yaml +from .ttsdeck import TTSDeck + _DictOfDicts = dict[str, dict[str, any]] @@ -36,8 +38,9 @@ class CardDB(_DictOfDicts): def make_deck(self, filters): # filter codes by card criteria codes = [ - code - for code, content in self.items() + content["card"].code + for content in self.values() if all([f(content["card"]) for f in filters]) ] - return codes + + return TTSDeck(codes, self) diff --git a/fftcg/ttsdeck.py b/fftcg/ttsdeck.py new file mode 100644 index 0000000..c81fc0f --- /dev/null +++ b/fftcg/ttsdeck.py @@ -0,0 +1,77 @@ +import json + +from .carddb import CardDB +from .code import Code + + +class TTSDeck(list[dict[str, any]]): + def __init__(self, codes: list[Code], carddb: CardDB): + super().__init__([carddb[str(code)] for code in codes]) + + def __str__(self) -> str: + face_urls = list(set([entry["file"] for entry in self])) + + custom_deck = { + str(i + 1): { + "NumWidth": "10", + "NumHeight": "7", + "FaceURL": url, + "BackURL": "http://cloud-3.steamusercontent.com/ugc/948455238665576576/85063172B8C340602E8D6C783A457122F53F7843/", + } for i, url in enumerate(face_urls) + } + + custom_deck_inv = { + url: i + 1 + for i, url in enumerate(face_urls) + } + + common_dict = { + "Transform": { + "scaleX": 2.17822933, + "scaleY": 1.0, + "scaleZ": 2.17822933 + }, + + "Locked": False, + "Grid": True, + "Snap": True, + "Autoraise": True, + "Sticky": True, + "Tooltip": True, + "GridProjection": False, + } + + contained_objects = [ + { + "Name": "Card", + "Nickname": entry["card"].name, + "Description": entry["card"].text, + + "CardID": 100 * custom_deck_inv[entry["file"]] + entry["index"], + + "Hands": True, + "SidewaysCard": False, + } | common_dict for entry in self + ] + + deck_ids = [ + contained_object["CardID"] + for contained_object in contained_objects + ] + + jsondict = {"ObjectStates": [ + { + "Name": "Deck", + "Nickname": "TODO Deck Name", + "Description": "TODO Deck Description", + + "Hands": False, + "SidewaysCard": False, + + "DeckIDs": deck_ids, + "CustomDeck": custom_deck, + "ContainedObjects": contained_objects, + } | common_dict + ]} + + return json.dumps(jsondict, indent=2) diff --git a/main.py b/main.py index 4a5535a..2bacb75 100755 --- a/main.py +++ b/main.py @@ -54,22 +54,28 @@ def main() -> None: def opus_filter(card: fftcg.Card): return card.code.opus == opus.number - def element_filter(element: str): - return lambda card: card.elements == [element] + filters: list + if opus.number == "PR": + filters = [[opus_filter]] - # simple cases: create lambdas for base elemental decks - base_elements = ["Fire", "Ice", "Wind", "Earth", "Lightning", "Water"] - element_filters = [element_filter(elem) for elem in base_elements] + else: - element_filters += [ - # light/darkness elemental deck - lambda card: card.elements == ["Light"] or card.elements == ["Darkness"], - # multi element deck - lambda card: len(card.elements) > 1, - ] + def element_filter(element: str): + return lambda card: card.elements == [element] - # add in the opus_filter for all elemental decks - filters = list(zip([opus_filter]*len(element_filters), element_filters)) + # simple cases: create lambdas for base elemental decks + base_elements = ["Fire", "Ice", "Wind", "Earth", "Lightning", "Water"] + element_filters = [element_filter(elem) for elem in base_elements] + + element_filters += [ + # light/darkness elemental deck + lambda card: card.elements == ["Light"] or card.elements == ["Darkness"], + # multi element deck + lambda card: len(card.elements) > 1, + ] + + # add in the opus_filter for all elemental decks + filters = list(zip([opus_filter]*len(element_filters), element_filters)) # make the decks for f in filters: