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
145from random import *
#common, rare, epic, legendary
cards_nerfed = [2,5,4,0]
card_cap = [2,2,2,1]
classic = [94,81,37,33] #sum = 245
wotog = [50,36,27,21]
reg_de_amt = [5 , 40 , 100 , 400 ]
reg_full_amt = [40 , 100, 400 , 1600]
golden_de_amt = [50 , 100, 400 , 1600]
golden_full_amt = [400, 800, 1600, 3200]
num_sims = 1000
sim_granularity = 5
sim_range_start = 0
sim_range_end = 91
def main():
#start wotog 50 packs sim
dust_result_accu = 0.0
for i in range(num_sims):
dust_ctr = 0.0
card_collection = []
for j in range(len(wotog)):
card_collection.append([])
for k in range(0, wotog[j]):
card_collection[j].append([0,0])
# simulate pack openings
for j in range(5*50):
golden, rarity, num = generate_card(wotog)
card_collection[rarity][num][golden]= card_collection[rarity][num][golden]+1
for rarity in range(0,4):
for card_num in range(wotog[rarity]):
while( card_collection[rarity][card_num][0] +
card_collection[rarity][card_num][1] ) > card_cap[rarity]:
if card_collection[rarity][card_num][1] > 0:
card_collection[rarity][card_num][1] = card_collection[rarity][card_num][1] - 1
dust_ctr = dust_ctr + golden_de_amt[rarity]
else:
card_collection[rarity][card_num][0] = card_collection[rarity][card_num][0] - 1
dust_ctr = dust_ctr + reg_de_amt[rarity]
dust_ctr = dust_ctr + \
card_collection[rarity][card_num][1] * golden_de_amt[rarity] + \
card_collection[rarity][card_num][0] * reg_full_amt[rarity]
dust_result_accu = dust_result_accu + float(dust_ctr)/num_sims
print("Buying WotoG: " + str(int(dust_result_accu)) + " dust")
#Start classic sim
# number of cards able to be collected from set
cards_in_set = 0
working_set = classic
set_name = "classic"
cards_in_set = cards_in_set + working_set[0] * 2
cards_in_set = cards_in_set + working_set[1] * 2
cards_in_set = cards_in_set + working_set[2] * 2
cards_in_set = cards_in_set + working_set[3]
for collection_percent in range(sim_range_start, sim_range_end, sim_granularity):
dust_result_accu = 0.0
collection_gen_cond = int(cards_in_set * collection_percent * 0.01)
for i in range(num_sims):
nerfdust_ctr = 0.0
card_collection = []
prior_card_collection = []
# generate empty collection buckets
for j in range(len(working_set)):
prior_card_collection.append([])
card_collection.append([])
for k in range(0, working_set[j]):
prior_card_collection[j].append([0,0])
card_collection[j].append([0,0])
# generate a percentage of the user's working_set collection
# the beforehand collection (prior_card_collection) must be kept separate from the
# "opened today" collection (card_collection) because we cannot consider cards that were
# opened prior to opening our 50 packs.
completion = 0
while(completion < collection_gen_cond):
golden, rarity, num = generate_card(working_set)
if(prior_card_collection[rarity][num][0] + prior_card_collection[rarity][num][1]) < card_cap[rarity]:
prior_card_collection[rarity][num][golden] = prior_card_collection[rarity][num][golden]+1
completion = completion + 1
#simulate the opening of 50 packs
for j in range(5*50):
golden, rarity, num = generate_card(working_set)
card_collection[rarity][num][golden]= card_collection[rarity][num][golden] + 1
# for cards of all rarity
for rarity in range(0,4):
# for each card in each rarity
for card_num in range(working_set[rarity]):
# if this card has been nerfed (first N cards in each rarity are nerfed)
if card_num <= (cards_nerfed[rarity]-1):
# add full dust value of all opened cards to dust counter
nerfdust_ctr = nerfdust_ctr + \
card_collection[rarity][card_num][1] * golden_full_amt[rarity] + \
card_collection[rarity][card_num][0] * reg_full_amt[rarity]
# if this card was not nerfed
else:
# while we have more than enough of the current card
while( card_collection[rarity][card_num][0] +
card_collection[rarity][card_num][1] +
prior_card_collection[rarity][card_num][0] +
prior_card_collection[rarity][card_num][1] ) > card_cap[rarity]:
# try to disenchant a golden copy of the card
if card_collection[rarity][card_num][1] > 0:
card_collection[rarity][card_num][1] = card_collection[rarity][card_num][1] - 1
nerfdust_ctr = nerfdust_ctr + golden_de_amt[rarity]
# if there are no more golden copies, disenchant a regular one
else:
card_collection[rarity][card_num][0] = card_collection[rarity][card_num][0] - 1
nerfdust_ctr = nerfdust_ctr + reg_de_amt[rarity]
# add remaining cards opened in 50 packs
nerfdust_ctr = nerfdust_ctr + \
card_collection[rarity][card_num][1] * golden_de_amt[rarity] + \
card_collection[rarity][card_num][0] * reg_full_amt[rarity]
dust_result_accu = dust_result_accu + float(nerfdust_ctr)/num_sims
print(str(collection_percent) + "% " + set_name + " cards collected: " + str(int(dust_result_accu)) + " dust")
def generate_card(set):
ranum = randint(0,10000)
# GL
if ranum > (10000 - 7):
return 1, 3, randint(0,set[3]-1)
# GE
elif ranum > (10000 - 7 - 19):
return 1, 2, randint(0,set[2]-1)
# RL
elif ranum > (10000 - 7 - 19 - 94):
return 0, 3, randint(0,set[3]-1)
# GR
elif ranum > (10000 - 7 - 19 - 94 - 127):
return 1, 1, randint(0,set[1]-1)
# GC
elif ranum > (10000 - 7 - 19 - 94 - 127 - 148):
return 1, 0, randint(0,set[0]-1)
# RE
elif ranum > (10000 - 7 - 19 - 94 - 127 - 148 - 408):
return 0, 2, randint(0,set[2]-1)
# RR
elif ranum > (10000 - 7 - 19 - 94 - 127 - 148 - 408 - 2160):
return 0, 1, randint(0,set[1]-1)
# RC
else:
return 0, 0, randint(0,set[0]-1)
if __name__ == "__main__":
main()