1
0
Fork 0
mirror of https://github.com/ldericher/fftcgtool synced 2025-01-15 15:02:59 +00:00

'ffdecks' subcommand working

This commit is contained in:
Jörn-Michael Miehe 2021-09-03 02:46:04 +02:00
parent 336fb4dca5
commit fe2f0548e0
2 changed files with 74 additions and 15 deletions

View file

@ -84,12 +84,13 @@ class Opus(Cards):
def elemental_decks(self) -> list[TTSDeck]: def elemental_decks(self) -> list[TTSDeck]:
if self.number in ["PR", "B"]: if self.number in ["PR", "B"]:
return [TTSDeck( return [TTSDeck(
[ codes=[
card.code card.code
for card in self for card in self
], ],
f"{self.name}", name=f"{self.name}",
f"All {self.name} Cards" description=f"All {self.name} Cards",
face_down=False,
)] )]
else: else:
@ -116,11 +117,12 @@ class Opus(Cards):
cards.sort(key=lambda x: "Multi" if len(x.elements) > 1 else x.elements[0]) cards.sort(key=lambda x: "Multi" if len(x.elements) > 1 else x.elements[0])
return [TTSDeck( return [TTSDeck(
[ codes=[
card.code card.code
for card in cards for card in cards
if f(card) if f(card)
], ],
f"{self.name} {elem}", name=f"{self.name} {elem}",
f"All {self.name} Cards with {elem} element in alphabetical order" description=f"All {self.name} Cards with {elem} element in alphabetical order",
face_down=False,
) for elem, f in filters.items()] ) for elem, f in filters.items()]

View file

@ -13,9 +13,10 @@ from .utils import CARD_BACK_URL, DECKS_DIR_NAME
class TTSDeck(Cards): class TTSDeck(Cards):
def __init__(self, codes: list[Code], name: str, description: str): def __init__(self, codes: list[Code], name: str, description: str, face_down: bool):
super().__init__(name) super().__init__(name)
self.__description = description self.__description = description
self.__face_down = face_down
# get cards from carddb # get cards from carddb
carddb = CardDB() carddb = CardDB()
@ -28,15 +29,65 @@ class TTSDeck(Cards):
@classmethod @classmethod
def from_ffdecks_deck(cls, deck_id: str) -> TTSDeck: def from_ffdecks_deck(cls, deck_id: str) -> TTSDeck:
# api request
req = requests.get(TTSDeck.__FFDECKS_API_URL, params={"deck_id": deck_id}) req = requests.get(TTSDeck.__FFDECKS_API_URL, params={"deck_id": deck_id})
codes = [
Code(card["card"]["serial_number"])
for card in req.json()["cards"]
]
name = f"{req.json()['name']} ({deck_id})"
description = req.json()["description"]
return cls(codes, name, description) # pre-extract the used data
deck_cards = [{
"code": card["card"]["serial_number"],
"type": card["card"]["type"],
"cost": int(card["card"]["cost"]),
"count": int(card["quantity"]),
} for card in req.json()["cards"]]
# sort cards by type, then by cost
def by_type(data: dict[str, str | int]) -> int:
key_prios = {
"Forward": 1,
"Summon": 2,
"Monster": 3,
"Backup": 5,
}
if data["type"] in key_prios:
return key_prios[data["type"]]
else:
return 4
def by_cost(data: dict[str, str | int]) -> int:
return data["cost"]
deck_cards.sort(key=by_cost)
deck_cards.sort(key=by_type)
# ffdecks quirk: some full-art promos in database
replace_full_arts = {
# line format:
# full-art-id: normal id,
"PR-051": "11-083",
"PR-055": "11-062",
}
# replace with non
for card in deck_cards:
if card["code"] in replace_full_arts:
card["code"] = replace_full_arts[card["code"]]
codes = [
# create list of code objects
Code(card["code"])
# for each card
for card in deck_cards
# repeat to meet count
for _ in range(card["count"])
]
# general metadata
name = f"{req.json()['name']}"
description = deck_id
# create deck object
return cls(codes, name, description, True)
def tts_object(self, language: Language) -> dict[str, any]: def tts_object(self, language: Language) -> dict[str, any]:
carddb = CardDB() carddb = CardDB()
@ -100,7 +151,7 @@ class TTSDeck(Cards):
] ]
# create the deck dictionary # create the deck dictionary
return {"ObjectStates": [ deck_dict = {"ObjectStates": [
{ {
"Nickname": self.name, "Nickname": self.name,
"Description": self.__description, "Description": self.__description,
@ -114,6 +165,12 @@ class TTSDeck(Cards):
} | common_dict } | common_dict
]} ]}
if self.__face_down:
# flip the deck
deck_dict["ObjectStates"][0]["Transform"]["rotZ"] = 180.0
return deck_dict
def save(self, language: Language) -> None: def save(self, language: Language) -> None:
# only save if the deck contains cards # only save if the deck contains cards
if self: if self: