-
Notifications
You must be signed in to change notification settings - Fork 3
/
card_util.py
158 lines (136 loc) · 4.09 KB
/
card_util.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
import os_paths
import yugidb as db
from playfield import *
from collections import defaultdict
# Some common utils
# Search stats in list using id
def search_card(id, li):
for c in li:
if c["id"] == str(id):
return c
return None
# Expands a list of card names to count data to unitary card items.
def expand_cards(cards):
result = []
for c in cards:
for x in range(0, c["count"]):
result.append({k: v for k, v in c.items() if k != "count"})
return result
# Count recurring cards and print the count instead.
def compress_cards(cards):
comp = {}
for c in cards:
if c["name"] not in comp:
comp[c["name"]] = [1, {k: v for k, v in c.items()}]
else:
comp[c["name"]][0] += 1
result = []
for k, v in comp.items():
v[1]["count"] = v[0]
result.append(v[1])
return result
def count_compress_cards(cards):
count = 0
for c in cards:
count += int(c["count"])
return count
# Simple card print, dumps dictionary to string
def cards_to_string(cards, preserve_face=False):
clen = len(cards)
if clen == 0:
return ""
result = []
face = 0
name = cards[0]["name"]
if "cardface" in cards[0]:
face = cards[0]["cardface"]
face_str = cf_to_string(face)
if preserve_face and face < 0:
name = cf_to_string(face)
elif face_str != "":
name += " " + "(" + face_str + ")"
if "count" not in cards[0]:
result = name
else:
result = name + " (" + str(cards[0]["count"]) + ")"
for i in range(1, clen):
face = 0
if "cardface" in cards[i]:
face = cards[i]["cardface"]
name = cards[i]["name"]
face_str = cf_to_string(face)
if preserve_face and cards[i]["cardface"] < 0:
name = face_str
elif face_str != "":
name += " " + "(" + face_str + ")"
if "count" not in cards[i]:
result += "\n " + name
else:
result += "\n" + name + " (" + str(cards[i]["count"]) + ")"
return result
# Print cards in a mult-array setting like fields array
def multi_cards_to_string(cards, preserve_face=False):
res = ""
count = 0
for ar in cards:
res += "\nPos " + str(count) + "\n"
res += cards_to_string(ar, preserve_face)
count += 1
return res
# Counts cards in multi array settings
# like the field array
def multi_array_count(array):
count = 0
for p in array:
if len(p) != 0:
count += 1
return count
# Condense multidimensional array
# into single.
def condense_multi(array):
res = []
for p in array:
res += p
return res
# Helper function to group cards by type.
# Returns dictionary of index by cards
def group_card_type(cards):
res = defaultdict(list)
for i in range(0, len(cards)):
c = cards[i]
stats = db.get_card_stat(c["id"])
print(stats)
typ = gen_type(stats["type"])
res[typ].append(i)
return res
# Get card position to string
def cf_to_string(face):
if int(face) == FACE_DOWN_ATK:
return "Face Down"
elif int(face) == FACE_DOWN_DEF:
return "Face Down Defense"
elif int(face) == FACE_UP_ATK:
return "Face Up"
elif int(face) == FACE_UP_DEF:
return "Face Up Defense"
return ""
# Check if card is of a generic type. More coarse definition.
def gen_type(typ):
tokens = typ.lower().split(' ')
if tokens[0] == "fusion":
return "fusion"
elif tokens[0] == "link":
return "link"
elif tokens[0] == "synchro":
return "synchro"
elif tokens[0] == "xyz":
return "xyz"
elif tokens[-1] == "monster":
return "monster"
elif tokens[0] == "spell":
return "spell"
elif tokens[0] == "trap":
return "trap"
elif tokens[0] == "skill":
return "skill"
return "unkown"