From eb947fe07f99178f1e70c19d2e03050be23b36f1 Mon Sep 17 00:00:00 2001 From: poslogithub Date: Fri, 4 Feb 2022 11:18:57 +0900 Subject: [PATCH 1/6] =?UTF-8?q?get=5Freal=5Fcards()=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/mtga/models/card.py | 6 ++++- source/mtga/models/card_set.py | 43 ++++++++++++++++++++++++++++++++ source/mtga/set_data/__init__.py | 2 +- source/mtga/set_data/dynamic.py | 22 ++++++++++++---- 4 files changed, 66 insertions(+), 7 deletions(-) diff --git a/source/mtga/models/card.py b/source/mtga/models/card.py index 32442b8..16af3aa 100644 --- a/source/mtga/models/card.py +++ b/source/mtga/models/card.py @@ -9,7 +9,8 @@ class Card(object): def __init__(self, name="", pretty_name="", cost=None, color_identity=None, card_type="", sub_types="", - abilities=None, set_id="", rarity="", collectible=True, set_number=-1, mtga_id=-1): + abilities=None, set_id="", rarity="", collectible=True, set_number=-1, mtga_id=-1, + is_token=False, is_secondary_card=False, is_rebalanced=False): self.name = name self.set = set_id self.pretty_name = pretty_name @@ -28,6 +29,9 @@ def __init__(self, name="", pretty_name="", cost=None, color_identity=None, card if abilities is None: abilities = [] self.abilities = abilities + self.is_token = is_token + self.is_secondary_card = is_secondary_card + self.is_rebalanced = is_rebalanced @property def abilities_decoded(self): diff --git a/source/mtga/models/card_set.py b/source/mtga/models/card_set.py index 56b2f10..784d3c2 100644 --- a/source/mtga/models/card_set.py +++ b/source/mtga/models/card_set.py @@ -128,7 +128,50 @@ def search(self, id_or_keyword, direct_match_returns_single=False): if keyword_clean in card.name: results.append(card) return results + + def get_real_cards(self, name="", pretty_name="", cost=None, color_identity=None, card_type="", sub_types="", + abilities=None, set="", rarity="", collectible=True, set_number=0, mtga_id=0, + is_token=False, is_secondary_card=False, is_rebalanced=False): + results = [] + for card in self.cards: + if name and card.name != name: + continue + if pretty_name and card.pretty_name != pretty_name: + continue + if cost and card.cost != cost: + continue + if color_identity and card.color_identity != color_identity: + continue + if card_type and card.card_type != card_type: + continue + if sub_types and card.sub_types != sub_types: + continue + if abilities and card.abilities != abilities: + continue + if set and card.set != set: + continue + if rarity and card.rarity != rarity: + continue + if card.collectible != collectible: + continue + if set_number and card.set_number != set_number: + continue + if mtga_id and card.mtga_id != mtga_id: + continue + if card.is_token != is_token: + continue + if card.is_secondary_card != is_secondary_card: + continue + if card.is_rebalanced != is_rebalanced: + continue + + results.append(card) + + return results + def open_booster(self, set, seed): + # レア/神話レア + rarity class Zone(Pool): def __init__(self, pool_name, zone_id=-1): diff --git a/source/mtga/set_data/__init__.py b/source/mtga/set_data/__init__.py index 8121f79..c3c8665 100644 --- a/source/mtga/set_data/__init__.py +++ b/source/mtga/set_data/__init__.py @@ -13,6 +13,7 @@ all_mtga_cards = Pool.from_sets("mtga_cards", sets=[*dynamic_sets], abilities=all_mtga_abilities) + except: print("WARNING! Could not dynamically generate card sets. Do you have Arena installed?") from mtga.set_data import xln, dom, rix, m19, ana, grn, rna, war, m20, eld, akh, arenasup, bfz, mi, roe, rtr @@ -31,4 +32,3 @@ arenasup.ArenaSup, bfz.BattleForZendikar, mi.Mirage, roe.RiseOfEldrazi, rtr.ReturnToRavnica], abilities=all_mtga_abilities) - diff --git a/source/mtga/set_data/dynamic.py b/source/mtga/set_data/dynamic.py index 239fc85..61be6f7 100644 --- a/source/mtga/set_data/dynamic.py +++ b/source/mtga/set_data/dynamic.py @@ -132,15 +132,15 @@ def del_ruby(s): output_lines = [] set_card_objs = [] for card in set_cards: + # TODO: card_name_snake_casedの日本語対応 try: - card_title = loc_map[card["titleId"]] + card_title = del_ruby(loc_map[card["titleId"]]) card_name_class_cased = re.sub('[^0-9a-zA-Z_]', '', card_title) card_name_class_cased_suffixed = card_name_class_cased card_suffix = 2 # To generate 'CardDictionary.csv' for ゆかりねっとコネクター NEO - card_name = del_ruby(card_title) - line = card_name + "," + card_name + "\n" + line = card_title + "," + card_title + "\n" if line not in card_dictionary_csv: card_dictionary_csv.append(line) @@ -161,7 +161,8 @@ def del_ruby(s): except KeyError: color_identity = [] try: - collectible = card["isCollectible"] + #collectible = card["isCollectible"] # "isCollectible" key is not exist. + collectible = bool(int(card["collectorMax"])) except KeyError: collectible = False @@ -204,6 +205,16 @@ def del_ruby(s): grp_id = card["grpid"] abilities = [] + try: + is_secondary_card = card["isSecondaryCard"] + except KeyError: + is_secondary_card = False + + try: + is_rebalanced = card["IsRebalanced"] + except KeyError: + is_rebalanced = False + try: abilities_raw = card["abilities"] except KeyError: @@ -239,7 +250,8 @@ def del_ruby(s): new_card_obj = Card(name=card_name_snake_cased, pretty_name=card_title, cost=cost, color_identity=color_identity, card_type=card_types, sub_types=sub_types, abilities=abilities, set_id=set_id, rarity=rarity, collectible=collectible, - set_number=set_number, mtga_id=grp_id) + set_number=set_number, mtga_id=grp_id, + is_token=is_token, is_secondary_card=is_secondary_card, is_rebalanced=is_rebalanced) set_card_objs.append(new_card_obj) except Exception: From be20833753189bd1e75a707c25a5212c33ef79b6 Mon Sep 17 00:00:00 2001 From: poslogithub Date: Sat, 19 Feb 2022 07:04:52 +0900 Subject: [PATCH 2/6] =?UTF-8?q?CardDictionary.csv=E5=87=BA=E5=8A=9B?= =?UTF-8?q?=E6=A9=9F=E8=83=BD=E3=82=92=E5=89=8A=E9=99=A4=EF=BC=88mtgatrack?= =?UTF-8?q?er=E5=81=B4=E3=81=A7=E3=82=84=E3=82=8B=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/mtga/models/card_set.py | 43 --------------------------------- source/mtga/set_data/dynamic.py | 16 ------------ 2 files changed, 59 deletions(-) diff --git a/source/mtga/models/card_set.py b/source/mtga/models/card_set.py index 784d3c2..56b2f10 100644 --- a/source/mtga/models/card_set.py +++ b/source/mtga/models/card_set.py @@ -128,50 +128,7 @@ def search(self, id_or_keyword, direct_match_returns_single=False): if keyword_clean in card.name: results.append(card) return results - - def get_real_cards(self, name="", pretty_name="", cost=None, color_identity=None, card_type="", sub_types="", - abilities=None, set="", rarity="", collectible=True, set_number=0, mtga_id=0, - is_token=False, is_secondary_card=False, is_rebalanced=False): - results = [] - for card in self.cards: - if name and card.name != name: - continue - if pretty_name and card.pretty_name != pretty_name: - continue - if cost and card.cost != cost: - continue - if color_identity and card.color_identity != color_identity: - continue - if card_type and card.card_type != card_type: - continue - if sub_types and card.sub_types != sub_types: - continue - if abilities and card.abilities != abilities: - continue - if set and card.set != set: - continue - if rarity and card.rarity != rarity: - continue - if card.collectible != collectible: - continue - if set_number and card.set_number != set_number: - continue - if mtga_id and card.mtga_id != mtga_id: - continue - if card.is_token != is_token: - continue - if card.is_secondary_card != is_secondary_card: - continue - if card.is_rebalanced != is_rebalanced: - continue - - results.append(card) - - return results - def open_booster(self, set, seed): - # レア/神話レア - rarity class Zone(Pool): def __init__(self, pool_name, zone_id=-1): diff --git a/source/mtga/set_data/dynamic.py b/source/mtga/set_data/dynamic.py index 61be6f7..c5189bd 100644 --- a/source/mtga/set_data/dynamic.py +++ b/source/mtga/set_data/dynamic.py @@ -99,10 +99,6 @@ def del_ruby(s): listed_cardsets = list(set([card["set"] for card in cards])) -# To generate 'CardDictionary.csv' for ゆかりねっとコネクター NEO -CARD_DICTIONARY_FILENAME = "CardDictionary.csv" -card_dictionary_csv = [] - for set_name in listed_cardsets: used_classnames = [] set_name_class_cased = re.sub('[^0-9a-zA-Z_]', '', set_name) @@ -139,11 +135,6 @@ def del_ruby(s): card_name_class_cased_suffixed = card_name_class_cased card_suffix = 2 - # To generate 'CardDictionary.csv' for ゆかりねっとコネクター NEO - line = card_title + "," + card_title + "\n" - if line not in card_dictionary_csv: - card_dictionary_csv.append(line) - while card_name_class_cased_suffixed in used_classnames: card_name_class_cased_suffixed = card_name_class_cased + str(card_suffix) card_suffix += 1 @@ -260,10 +251,3 @@ def del_ruby(s): # raise card_set_obj = Set(set_name_class_cased, cards=set_card_objs) dynamic_set_tuples.append((card_set_obj, all_abilities)) - -# To generate 'CardDictionary.csv' for ゆかりねっとコネクター NEO -card_dictionary_csv.sort(reverse=True) -with open(CARD_DICTIONARY_FILENAME, "w", encoding="utf-8") as f: - for line in card_dictionary_csv: - f.write(line) - print(os.path.abspath(CARD_DICTIONARY_FILENAME) + " was generated") From 89e58c18609137bf179b6f2f7611d0c336f61352 Mon Sep 17 00:00:00 2001 From: poslogithub Date: Fri, 11 Mar 2022 06:32:27 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=E3=82=AB=E3=83=BC=E3=83=89=E3=82=BF?= =?UTF-8?q?=E3=82=A4=E3=83=97=E5=88=A4=E5=88=A5=E9=96=A2=E6=95=B0=E3=82=92?= =?UTF-8?q?=E5=85=A5=E3=82=8C=E3=81=BE=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/generate_set_map.py | 10 +++++++--- source/mtga/models/card.py | 3 ++- source/mtga/models/card_set.py | 2 +- source/mtga/set_data/dynamic.py | 9 ++++++++- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/script/generate_set_map.py b/script/generate_set_map.py index 68ee264..6295961 100644 --- a/script/generate_set_map.py +++ b/script/generate_set_map.py @@ -81,6 +81,9 @@ def generate_set_map(loc, cards, enums, set_name): sub_types_ids = [enum_map["SubType"][sub_type] for sub_type in card["subtypes"]] sub_types = " ".join([loc_map[loc_id] for loc_id in sub_types_ids]) + super_types_ids = [enum_map["SuperType"][super_type] for super_type in card["supertypes"]] + super_types = " ".join([loc_map[loc_id] for loc_id in super_types_ids]) + set_id = set_name.upper() rarity = RARITY_ID_MAP[card["rarity"]] @@ -105,11 +108,11 @@ def generate_set_map(loc, cards, enums, set_name): abilities.append(aid) all_abilities[aid] = text indentation_length = len("{} = Card(".format(card_name_class_cased_suffixed)) - # params: name, pretty_name, cost, color_identity, card_type, sub_types, set_id, rarity, set_number, mtga_id + # params: name, pretty_name, cost, color_identity, card_type, sub_types, super_types, set_id, rarity, set_number, mtga_id # ex: "a_b_c", "A B C", ['3', 'W', 'W'], ['W'], "Creature", "Angel", "AKH", "Mythic Rare", 1, 64801 - # name, pretty_name, cost, color_identity, card_type, sub_types, set_id, rarity, set_number, mtga_id + # name, pretty_name, cost, color_identity, card_type, sub_types, super_types, set_id, rarity, set_number, mtga_id new_card_str = '{} = Card(name="{}", pretty_name="{}", cost={},\n' \ - '{{}}color_identity={}, card_type="{}", sub_types="{}",\n' \ + '{{}}color_identity={}, card_type="{}", sub_types="{}", super_types="{}",\n' \ '{{}}abilities={}, set_id="{}", rarity="{}", collectible={}, set_number={},\n' \ '{{}}mtga_id={})'.format( card_name_class_cased_suffixed, @@ -119,6 +122,7 @@ def generate_set_map(loc, cards, enums, set_name): color_identity, card_types, sub_types, + super_types, abilities, set_id, rarity, diff --git a/source/mtga/models/card.py b/source/mtga/models/card.py index 16af3aa..659c0a7 100644 --- a/source/mtga/models/card.py +++ b/source/mtga/models/card.py @@ -8,7 +8,7 @@ class Card(object): - def __init__(self, name="", pretty_name="", cost=None, color_identity=None, card_type="", sub_types="", + def __init__(self, name="", pretty_name="", cost=None, color_identity=None, card_type="", sub_types="", super_types="", abilities=None, set_id="", rarity="", collectible=True, set_number=-1, mtga_id=-1, is_token=False, is_secondary_card=False, is_rebalanced=False): self.name = name @@ -22,6 +22,7 @@ def __init__(self, name="", pretty_name="", cost=None, color_identity=None, card self.color_identity = color_identity self.card_type = card_type self.sub_types = sub_types + self.super_types = super_types self.set_number = set_number self.mtga_id = mtga_id self.rarity = rarity diff --git a/source/mtga/models/card_set.py b/source/mtga/models/card_set.py index 56b2f10..fe3f5fd 100644 --- a/source/mtga/models/card_set.py +++ b/source/mtga/models/card_set.py @@ -160,7 +160,7 @@ def generate_library(self, owner_id=-1): library = Library(self.pool_name, self.deck_id, owner_id, -1) for card in self.cards: game_card = GameCard(card.name, card.pretty_name, card.cost, card.color_identity, card.card_type, - card.sub_types, card.set, card.set_number, card.mtga_id, owner_id, -1) + card.sub_types, card.super_types, card.set, card.set_number, card.mtga_id, owner_id, -1) library.cards.append(game_card) return library diff --git a/source/mtga/set_data/dynamic.py b/source/mtga/set_data/dynamic.py index c5189bd..9e47afe 100644 --- a/source/mtga/set_data/dynamic.py +++ b/source/mtga/set_data/dynamic.py @@ -169,6 +169,13 @@ def del_ruby(s): sub_types_ids = [] sub_types = " ".join([loc_map[loc_id] for loc_id in sub_types_ids]) + # TODO: super_types + try: + super_types_ids = [enum_map["SuperType"][super_type] for super_type in card["supertypes"]] + except KeyError: + super_types_ids = [] + super_types = " ".join([loc_map[loc_id] for loc_id in super_types_ids]) + set_id = set_name.upper() try: @@ -239,7 +246,7 @@ def del_ruby(s): all_abilities[aid] = text new_card_obj = Card(name=card_name_snake_cased, pretty_name=card_title, cost=cost, - color_identity=color_identity, card_type=card_types, sub_types=sub_types, + color_identity=color_identity, card_type=card_types, sub_types=sub_types, super_types=super_types, abilities=abilities, set_id=set_id, rarity=rarity, collectible=collectible, set_number=set_number, mtga_id=grp_id, is_token=is_token, is_secondary_card=is_secondary_card, is_rebalanced=is_rebalanced) From 221fef1072114755ef30ceb362509e8698cbcec1 Mon Sep 17 00:00:00 2001 From: poslogithub Date: Fri, 11 Mar 2022 12:16:33 +0900 Subject: [PATCH 4/6] Update card.py --- source/mtga/models/card.py | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/source/mtga/models/card.py b/source/mtga/models/card.py index 659c0a7..aa0b6ea 100644 --- a/source/mtga/models/card.py +++ b/source/mtga/models/card.py @@ -85,10 +85,39 @@ def to_serializable(self): "color_identity": self.color_identity, "card_type": self.card_type, "sub_types": self.sub_types, + "super_types": self.super_types, "rarity": self.rarity, "set_number": self.set_number, "mtga_id": self.mtga_id } + + @property + def is_creature_card(self): + if "クリーチャー" in self.card_types or "Creature" in self.card_types: + return True + else: + return False + + @property + def is_land_card(self): + if "土地" in self.card_types or "Land" in self.card_types: + return True + else: + return False + + @property + def is_noncreature_spell_card(self): + if not self.is_creature_card and not self.is_land_card: + return True + else: + return False + + @property + def is_basic(self): + if "基本" in self.super_types or "Basic" in self.super_types: + return True + else: + return False @classmethod def from_dict(cls, obj): @@ -109,8 +138,8 @@ def __str__(self): class GameCard(Card): - def __init__(self, name, pretty_name, cost, color_identity, card_type, sub_types, set_id, rarity, set_number, mtga_id, owner_seat_id, game_id=-1): - super().__init__(name, pretty_name, cost, color_identity, card_type, sub_types, set_id, rarity, set_number, mtga_id) + def __init__(self, name, pretty_name, cost, color_identity, card_type, sub_types, super_types, set_id, rarity, set_number, mtga_id, owner_seat_id, game_id=-1): + super().__init__(name, pretty_name, cost, color_identity, card_type, sub_types, super_types, set_id, rarity, set_number, mtga_id) self.game_id = game_id self.previous_iids = [] self.owner_seat_id = owner_seat_id @@ -135,6 +164,7 @@ def transform_to(self, card_id): self.cost = new_card.cost self.card_type = new_card.card_type self.sub_types = new_card.sub_types + self.super_types = new_card.super_types self.set = new_card.set self.set_number = new_card.set_number self.mtga_id = new_card.mtga_id From 593765e776beb873dd78f5a40d7353c13f6724c7 Mon Sep 17 00:00:00 2001 From: poslogithub Date: Tue, 22 Mar 2022 06:07:04 +0900 Subject: [PATCH 5/6] Update card.py --- source/mtga/models/card.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/mtga/models/card.py b/source/mtga/models/card.py index aa0b6ea..f703788 100644 --- a/source/mtga/models/card.py +++ b/source/mtga/models/card.py @@ -93,14 +93,14 @@ def to_serializable(self): @property def is_creature_card(self): - if "クリーチャー" in self.card_types or "Creature" in self.card_types: + if "クリーチャー" in self.card_type or "Creature" in self.card_type: return True else: return False @property def is_land_card(self): - if "土地" in self.card_types or "Land" in self.card_types: + if "土地" in self.card_type or "Land" in self.card_type: return True else: return False From fc0ba7a1c24446386ac51e00937d918e1e5dd1df Mon Sep 17 00:00:00 2001 From: poslogithub Date: Tue, 26 Apr 2022 16:52:25 +0900 Subject: [PATCH 6/6] =?UTF-8?q?is=5Fdigital=5Fonly=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/mtga/models/card.py | 3 ++- source/mtga/set_data/dynamic.py | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/source/mtga/models/card.py b/source/mtga/models/card.py index f703788..5fd244b 100644 --- a/source/mtga/models/card.py +++ b/source/mtga/models/card.py @@ -10,7 +10,7 @@ class Card(object): def __init__(self, name="", pretty_name="", cost=None, color_identity=None, card_type="", sub_types="", super_types="", abilities=None, set_id="", rarity="", collectible=True, set_number=-1, mtga_id=-1, - is_token=False, is_secondary_card=False, is_rebalanced=False): + is_token=False, is_secondary_card=False, is_rebalanced=False, is_digital_only=False): self.name = name self.set = set_id self.pretty_name = pretty_name @@ -33,6 +33,7 @@ def __init__(self, name="", pretty_name="", cost=None, color_identity=None, card self.is_token = is_token self.is_secondary_card = is_secondary_card self.is_rebalanced = is_rebalanced + self.is_digital_only = is_digital_only @property def abilities_decoded(self): diff --git a/source/mtga/set_data/dynamic.py b/source/mtga/set_data/dynamic.py index 9e47afe..643fd09 100644 --- a/source/mtga/set_data/dynamic.py +++ b/source/mtga/set_data/dynamic.py @@ -212,6 +212,11 @@ def del_ruby(s): is_rebalanced = card["IsRebalanced"] except KeyError: is_rebalanced = False + + try: + is_digital_only = card["IsDigitalOnly"] + except KeyError: + is_digital_only = False try: abilities_raw = card["abilities"] @@ -249,7 +254,7 @@ def del_ruby(s): color_identity=color_identity, card_type=card_types, sub_types=sub_types, super_types=super_types, abilities=abilities, set_id=set_id, rarity=rarity, collectible=collectible, set_number=set_number, mtga_id=grp_id, - is_token=is_token, is_secondary_card=is_secondary_card, is_rebalanced=is_rebalanced) + is_token=is_token, is_secondary_card=is_secondary_card, is_rebalanced=is_rebalanced, is_digital_only=is_digital_only) set_card_objs.append(new_card_obj) except Exception: