Topic: Feature Request - Average CMC
Having the average CMC for a deck would be a useful stat for deckbuilding in EDH. I imagine its a quick add too.
Edit: Current Code:
// ==UserScript==
// @name deckboxCMC
// @match https://deckbox.org/sets/*
// @description Calculates CMC in deckbox sets
// @version 0.6.1
// ==/UserScript==
// Initialize array and hash to hold mana costs
var manaCosts = {};
var totalCosts = [];
// Iterate through rows to get mana cost totals for each card
var x = document.getElementsByClassName("mtg_mana");
for (i = 0; i < x.length; i++) {
var re = /mtg_mana_[0-9URGBWCX]{1,2}/i;
//console.log("This is a mana cost item: " + x[i].outerHTML);
var row = x[i].parentElement.parentElement.id;
//console.log("Parent element is " + row);
//console.log("Card element looks like this: " + document.getElementById(row).innerHTML);
var cardName = document.getElementById(row).innerHTML.match(/(?:a class="simple" href="https:\/\/deckbox\.org\/mtg\/.*" target="_blank">)(.*)(?:<\/a>)/)[1];
//console.log("Card name is " + cardName);
var stripped = x[i].outerHTML.match(re).toString();
//console.log("This its stripped mana name: " + stripped);
var strippedMore = stripped.replace("mtg_mana_", "");
//console.log("Mana cost indicated: " + strippedMore);
var converted = strippedMore.replace(/[URGBWC]([URGBWC])?/, "1");
var converted = converted.replace(/X/, "0");
if (!manaCosts[row]) {
//console.log("Adding new item to manaCosts hash for card " + cardName);
//console.log("Found mana cost " + converted + " for card " + cardName);
manaCosts[row] = Number(converted);
} else {
manaCosts[row] += Number(converted);
//console.log("Found mana cost " + converted + " for card " + cardName);
}
//console.log("Total mana cost for " + cardName + " is " + manaCosts[row]);
}
// Summary of card costs by table row
console.log("Here's what we found in the main deck: ");
for (var card in manaCosts) {
// use hasOwnProperty to filter out keys from the Object.prototype
if (manaCosts.hasOwnProperty(card)) {
var cardName = document.getElementById(card).innerHTML.match(/(?:a class="simple" href="https:\/\/deckbox\.org\/mtg\/.*" target="_blank">)(.*)(?:<\/a>)/)[1];
if (document.getElementById(card).innerHTML.indexOf("wishlist") !== -1) {
//console.log("Deck list has a wishlist. I think this is YOUR deck.");
var cardCount = document.getElementById(card).innerHTML.match(/(?:<td class="card_count deck_count.*>(\n)?)([0-9]{1,2})(?:(\n)?<\/td>\n<script>)/);
cardCount = Number(cardCount[2]);
//console.log("Raw cardCount is " + cardCount);
//console.log("I think there are " + cardCount + " copies of " + cardName);
} else {
//console.log("Deck list DOESN'T have a wishlist. I think this is someone elses deck.");
var cardCount = document.getElementById(card).innerHTML.match(/(?:<td class="card_count">)([0-9]*)(?:<\/td>\n<td class="card_name">)/)[1];
//console.log("I think there are " + cardCount + " copies of " + cardName);
}
if (card.indexOf("main") !== -1) {
console.log(cardCount + " copies of " + cardName + " (" + manaCosts[card] + ")");
for(var i = 0; i < cardCount; i++) {
console.log("Adding mana cost " + manaCosts[card] + " for card " + cardName + " to the total.");
totalCosts.push(manaCosts[card]);
}
} else {
console.log("Card " + cardName + " is not in main deck. Will NOT use to calculate CMC average.");
}
}
}
// Get average
var total = 0;
console.log("Found " + totalCosts.length + " cards in the main deck.");
for(var i = 0; i < totalCosts.length; i++) {
//console.log("Adding mana cost number " + i + " to the total.");
total += totalCosts[i];
//console.log("Total is now: " + total);
}
console.log("Dividing total mana cost of " + total + " by " + totalCosts.length + " total cards to find the average.");
var avg = total / totalCosts.length;
console.log("Agerage CMC: " + avg);
// Create pop up with CMC average
var box = document.createElement( 'div' );
box.id = 'myAlertBox';
box.style.background = 'white';
box.style.border = '2px solid red';
box.style.padding = '4px';
box.style.position = 'absolute';
box.style.top = '8px';
box.style.left = '8px';
box.style.maxWidth = '400px';
box.textContent = "Converted mana cost: " + avg;
document.body.appendChild( box );
Last edited by tjdrake719 (2017-03-01 21:58:20)