// ==UserScript==
// @name Torn Set Calculator
// @version 0.5c
// @description Calculates prices of plushie and flower sets
// @author MrHat / foilman
// @namespace MrHat.Torn
// @require http://cdnjs.cloudflare.com/ajax/libs/accounting.js/0.4.1/accounting.min.js
// @match http://www.torn.com/imarket.php*
// @match https://www.torn.com/imarket.php*
// ==/UserScript==
// List item sets
var itemSets = [
{
name: "Plushie Set",
points: 10,
itemIds: ["186", "215", "187", "261", "618", "258", "273", "269", "266", "268", "281", "274", "384"]
}, {
name: "Exotic Flower Set",
points: 10,
itemIds: ["260", "617", "263", "272", "264", "271", "267", "277", "282", "276", "385"]
}, {
name: "Medieval Coin Set",
points: 100,
itemIds: ["450", "451", "452"]
}, {
name: "Vairocana Buddha",
points: 100,
itemIds: ["454"]
}, {
name: "Ganesha Sculpture",
points: 250,
itemIds: ["453"]
}, {
name: "Shabti Sculpture",
points: 500,
itemIds: ["458"]
}, {
name: "Scripts from the Quran Set",
points: 1000,
itemIds: ["455", "456", "457"]
}, {
name: "Senet Game Set",
points: 2000,
itemIds: ["460", "460", "460", "460", "460", "461", "461", "461", "461", "461", "462"]
}, {
name: "Egyptian Amulet",
points: 10000,
itemIds: ["459"]
}];
function itemsLoaded(items) {
// Show results on page (attempt to find container, if it's not there we create it)
var container = $('#setCalculator');
if (!container.length) {
container = $('<div>').attr('id', 'setCalculator').addClass('msg right-round');
var wrapper = $('<div>').addClass('info-msg border-round').html($('<i>').addClass('info-icon'));
wrapper.append(container);
wrapper.prependTo($('.main-market-page'));
}
// Clear text
container.empty();
// Loop over itemsets and create a result message
var setResults = [];
$.each(itemSets, function(i, itemSet) {
var sum = 0;
$.each(items, function(j, item) {
// Lookup how many times this item is required in this given set
var occurence = $.grep(itemSet.itemIds, function (itemId) {
return itemId === item.itemID;
}).length;
// We add the total price for this item
sum += (parseInt(item.price) * occurence);
});
if (sum > 0) {
setResults.push({
set: itemSet,
totalCost: sum,
individualCost: sum/itemSet.points
});
}
});
// Show message on page
if (setResults.length) {
// Sort sets from cheap to expensive
var sortedResults = setResults.sort(function(a, b) {
return a.individualCost > b.individualCost;
});
// Generate final message
var message = sortedResults.map(function(setResult) {
return "One " + setResult.set.name + " costs <b>" + accounting.formatMoney(setResult.totalCost, "$", 0) + "</b>. This equals to <b>" + accounting.formatMoney(setResult.individualCost, "$", 0) + "</b> per point.<br/>";
});
// Append the message to the container
container.append($('<span>').html(message));
} else {
// No sets were present on this page
container.append($('<span>').html('No sets available.'));
}
};
$(document).ajaxComplete(function(e,xhr,settings){
var marketRegex = /^imarket.php\?rfcv=(.+)$/;
if (marketRegex.test(settings.url)) {
// Process the items and their prices
var items = JSON.parse(xhr.responseText);
if (items) itemsLoaded(items);
}
});