Ramping deck analysis
This commit is contained in:
parent
79ab9c0f0d
commit
5d7e896415
3 changed files with 38 additions and 2 deletions
|
@ -1,6 +1,6 @@
|
||||||
import re
|
import re
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from mtgweb.lib.mtg import mtg
|
from mtgweb.lib.mtg import mtg, analyze
|
||||||
|
|
||||||
# Create your models here.
|
# Create your models here.
|
||||||
class CardType(models.Model):
|
class CardType(models.Model):
|
||||||
|
@ -87,6 +87,28 @@ class Deck(models.Model):
|
||||||
else:
|
else:
|
||||||
curve[cost] += included.count
|
curve[cost] += included.count
|
||||||
return curve
|
return curve
|
||||||
|
def ramp(self, type=None):
|
||||||
|
ramp = {}
|
||||||
|
deck_size = sum([i.count for i in self.included_set.all()])
|
||||||
|
lands = sum([i.count for i in self.included_set.all() if 'land' in i.card.type.name.split(' ')])
|
||||||
|
if type:
|
||||||
|
cards = [i for i in self.included_set.all() if type in i.card.type.name.split(' ')]
|
||||||
|
else:
|
||||||
|
cards = [i for i in self.included_set.all() if 'land' not in i.card.type.name.split(' ')]
|
||||||
|
card_count = sum([i.count for i in cards])
|
||||||
|
card_costs = sum([i.count * mtg.ManaCost(i.card.cost).converted() for i in cards])
|
||||||
|
max_cost = max([mtg.ManaCost(i.card.cost).converted() for i in cards])
|
||||||
|
avg_cost = card_costs / float(card_count)
|
||||||
|
avg_cost = int(round(avg_cost))
|
||||||
|
turns = []
|
||||||
|
for turn in range(avg_cost, max_cost + 1):
|
||||||
|
castable = sum([i.count for i in cards if mtg.ManaCost(i.card.cost).converted() <= turn])
|
||||||
|
p_land = 1 - analyze.draw_probability(lands, deck_size, avg_cost, turn)
|
||||||
|
p_spell = 1 - analyze.draw_probability(castable, deck_size, 1, turn, avg_cost)
|
||||||
|
probability = 1 - p_land - p_spell
|
||||||
|
turns.append({'turn': turn, 'probability': probability * 100})
|
||||||
|
return turns
|
||||||
|
|
||||||
class Included(models.Model):
|
class Included(models.Model):
|
||||||
card = models.ForeignKey(Card)
|
card = models.ForeignKey(Card)
|
||||||
deck = models.ForeignKey(Deck)
|
deck = models.ForeignKey(Deck)
|
||||||
|
|
|
@ -35,6 +35,20 @@ def detail(request, id):
|
||||||
symbol_chart.set_pie_labels([mtg.Mana.types[m] for m in symbols.keys()])
|
symbol_chart.set_pie_labels([mtg.Mana.types[m] for m in symbols.keys()])
|
||||||
symbol_chart.set_colours([colors[m] for m in symbols.keys()])
|
symbol_chart.set_colours([colors[m] for m in symbols.keys()])
|
||||||
|
|
||||||
|
ramp_data = deck.ramp()
|
||||||
|
min_range = min([t['probability'] for t in ramp_data]) // 5 * 5
|
||||||
|
ramp_chart = SimpleLineChart(250, 100, y_range=[min_range, 100])
|
||||||
|
ramp_chart.fill_solid(SimpleLineChart.BACKGROUND, 'FFFFFF00')
|
||||||
|
ramp_chart.add_data([t['probability'] for t in ramp_data])
|
||||||
|
labels_left = range(min_range, 100, (100 - min_range) // 5)
|
||||||
|
labels_left[0] = ''
|
||||||
|
ramp_chart.set_axis_labels(Axis.LEFT, labels_left)
|
||||||
|
ramp_chart.set_axis_labels(Axis.BOTTOM, ['Turn {0}'.format(t['turn']) for t in ramp_data])
|
||||||
|
for i in range(len(ramp_data)):
|
||||||
|
p = ramp_data[i]['probability']
|
||||||
|
ramp_chart.add_marker(0, i, 'd', '000000', 5)
|
||||||
|
#ramp_chart.add_marker(0, i, 't{0}%'.format(round(p)), '000000', 10)
|
||||||
|
|
||||||
curve = deck.mana_curve()
|
curve = deck.mana_curve()
|
||||||
for i in range(max(curve.keys()) + 1):
|
for i in range(max(curve.keys()) + 1):
|
||||||
if i not in curve:
|
if i not in curve:
|
||||||
|
|
2
lib/mtg
2
lib/mtg
|
@ -1 +1 @@
|
||||||
Subproject commit d5206fc6df410836b0b24d1e8d9eae34e4a1ea65
|
Subproject commit 9b5f01ab8b5701e1e3222ab6a29f728f82fbc0cb
|
Loading…
Reference in a new issue