From 0bf27770b318151a2b121fe449cbfa852be59d3c Mon Sep 17 00:00:00 2001
From: LDericher <40151420+ldericher@users.noreply.github.com>
Date: Tue, 17 Aug 2021 01:35:57 +0200
Subject: [PATCH] Create elemental decks

---
 fftcg/carddb.py  |  9 ++++--
 fftcg/ttsdeck.py | 77 ++++++++++++++++++++++++++++++++++++++++++++++++
 main.py          | 32 ++++++++++++--------
 3 files changed, 102 insertions(+), 16 deletions(-)
 create mode 100644 fftcg/ttsdeck.py

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: