Ted's market UI

Ted's Diamond Hunt 2 custom market user interface

目前为 2017-03-31 提交的版本。查看 最新版本

// ==UserScript==
// @name         Ted's market UI
// @namespace    Ted's market UI
// @version      1.227
// @description  Ted's Diamond Hunt 2 custom market user interface
// @author       ted120
// @match		 http://*.diamondhunt.co/game.php
// @match		 https://*.diamondhunt.co/game.php
// @run-at       document-idle
// @grant        none
// ==/UserScript==

$(document).ready(function () {
    // Customisable
    var hideItemList = ["Raw Shark","Stinger","Wheat","Bear Fur","Stone","Bones","Ashes","Snake Skin","Bat Skin","Raw Shrimp","Shrimp"];
    var notEnoughCoinsOpacity = true;
    var showMaxCanBuy = true;
    var itemTooltips = true;
    var smallMarketImages = true, marketImageSize = 30; //pixels, default:50, suggested: 30-40
    var marketSlotsCustomUi = false; //incomplete leave false

    /* TODO
    add one-click search all button on main market page
    */

    // Below is not intended to be changed

    var debugToConsole = false;
    var arrMarketItems = [];
    var arrMarketSlots = [[0, 0]]; //updateMarketSlots()
    var marketInterval;
    var marketOn = true;
    var quickCalcOn = false, quickCalcElement = document.createElement('div');
    var zMarket = document.createElement("div");

    function drawButtons() {
        zMarket = document.createElement("div");
        zMarket.innerHTML = "<button id='marketButton' type='button'>Ted's market UI = "+marketOn+"</button><button id='quickCalcButton' type='button'>quickCalc = "+quickCalcOn+"</button>";
        document.getElementById("game-div").appendChild(zMarket);
        document.getElementById("marketButton").addEventListener(
            "click", marketButtonClickAction, false
        );
        document.getElementById("quickCalcButton").addEventListener(
            "click", quickCalcButtonClickAction, false
        );
    }
    function removeButtons() {
        document.getElementById("game-div").removeChild(zMarket);
    }
    function buttonMain() {
        removeButtons();
        drawButtons();
    }
    function isInArray(array, search)
    {
        return array.indexOf(search) >= 0;
    }
    function itemNameFix(string) { // market style name to var style name; Bat Skin > batSkin
        var a = string.replace(/\s/g, "");
        return a.charAt(0).toLowerCase() + a.slice(1);
    }
    function numberWithCommas(x) {
        return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    }
    function addItemTooltips() {
        if (itemTooltips) {
            for (var i = 0; i < arrMarketItems.length; i++) {
                var fixedName = itemNameFix(arrMarketItems[i][0]);
                if (document.getElementById("tooltip-"+fixedName) !== null) {
                    var newTooltip = "<b>Market price: </b><img class='image-icon-20' src='images/coins.png'> "+numberWithCommas(arrMarketItems[i][2][0]);
                    if (document.getElementById("tooltip-"+fixedName).lastElementChild.tagName == "DIV") {
                        document.getElementById("tooltip-"+fixedName).removeChild(document.getElementById("tooltip-"+fixedName).lastChild);
                    }
                    var tooltipElement = document.createElement("div");
                    tooltipElement.innerHTML = newTooltip;
                    document.getElementById("tooltip-"+fixedName).appendChild(tooltipElement);
                }
            }
        }
    }
    function getMarketItems() {
        var currentItemId, itemName, itemId, itemPrice, itemAmount, itemMarketId, uniqueMarketItems = 0;
        arrMarketItems = [];
        for (var i = 1; i < document.getElementById("market-table").rows.length; i++) {
            if (typeof(document.getElementById("market-table").rows[i].childNodes[0]) != "undefined" && document.getElementById("market-table").rows[i].childNodes[0] !== null) {
                itemName = document.getElementById("market-table").rows[i].childNodes[0];
                itemId = document.getElementById("market-table").rows[i].getAttribute("data-market-itemid");
                itemPrice = document.getElementById("market-table").rows[i].getAttribute("data-market-price");
                itemAmount = document.getElementById("market-table").rows[i].getAttribute("data-market-amount");
                itemMarketId = document.getElementById("market-table").rows[i].getAttribute("data-market-marketid");
                if (itemId != currentItemId) {
                    currentItemId = itemId;
                    uniqueMarketItems++;
                    arrMarketItems.push([document.getElementById("market-table").rows[i].childNodes[0].innerHTML, itemId]);
                }
                arrMarketItems[uniqueMarketItems-1].push([itemPrice, itemAmount, itemMarketId, i]);
            }
        }
    }
    function alterMarketSlots() {
        if (marketSlotsCustomUi) {
            if (typeof(document.getElementsByClassName("market-slot")[0].childNodes[1].childNodes[1]) == "undefined") {
                var marketSlotFreeElement = document.createElement("div");
                marketSlotFreeElement.innerHTML = "<div id='dialogue-market-browse-all-div2' style='margin: 10px;' class='basic-smallbox-grey'><input type='image' data-item-name='All Items' onclick='openTradableItems(0, &quot;buy&quot;);postItemDialogue(document.getElementById(&quot;dialogue-market-postitem-buyorsell&quot;), &quot;ALL&quot;, this);$(this).closest(&quot;.ui-dialog-content&quot;).dialog(&quot;close&quot;);' src='images/icons/infinity.png' class='image-icon-50'></div>";
                document.getElementsByClassName("market-slot")[0].childNodes[1].appendChild(marketSlotFreeElement);
            }
        }
    }
    function alterMarketTable() {
        var i, a, s, maxCanBuy;
        document.getElementById("market-table").rows[0].style.backgroundColor = "gold";
        if (debugToConsole) { console.log(arrMarketItems); }
        for (i = 0; i < arrMarketItems.length; i++) {
            for (a = 2; a < arrMarketItems[i].length; a++) {
                if (smallMarketImages) {
                    document.getElementById("market-table").childNodes[0].childNodes[arrMarketItems[i][a][3]].childNodes[1].childNodes[0].style = "height: "+marketImageSize+"px;width: "+marketImageSize+"px;";
                }
                maxCanBuy = Math.floor(coins / arrMarketItems[i][a][0]);
                if (showMaxCanBuy) {
                    if (maxCanBuy < arrMarketItems[i][a][1]) {
                        document.getElementById("market-table").rows[arrMarketItems[i][a][3]].cells[3].append(" (x"+numberWithCommas(maxCanBuy)+")");
                    } else if (maxCanBuy >= arrMarketItems[i][a][1]) {
                        maxCanBuy = arrMarketItems[i][a][1];
                    }
                }
                if (notEnoughCoinsOpacity && maxCanBuy === 0) {
                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.opacity = "0.3";
                }
                if (document.getElementById("market-table").rows.length < 13) {
                    if (arrMarketItems[i].length >= 4) {
                        if (arrMarketItems[i][2][0] < Math.ceil(arrMarketItems[i][3][0] * 0.86) && arrMarketItems[i][2][0]) {
                            document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.backgroundColor = "#90ee90"; //lightgreen
                            document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.display = "";
                            document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.fontWeight = 700;
                            document.getElementById("market-table").rows[arrMarketItems[i][3][3]].style.backgroundColor = "#ffcc66"; //lightorange
                            document.getElementById("market-table").rows[arrMarketItems[i][3][3]].style.display = "";
                        }
                    }
                    for (s = 0; s < arrMarketSlots.length; s++) {
                        if (arrMarketSlots[s][1] === false) {
                            if (arrMarketItems[i][a][2] == arrMarketSlots[s][0]) {
                                if (a == 2) {
                                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.display = "";
                                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.backgroundColor = "#bffffd"; //lightblue
                                } else if (a > 2) {
                                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.backgroundColor = "#ffcccc"; //lighterred
                                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.display = "";
                                    document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.backgroundColor = "#ff7878"; //lightred
                                    document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.display = "";
                                } else console.log("for (a... error");
                            }
                        }
                    }
                } else if (document.getElementById("market-table").rows.length > 12) {
                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.backgroundColor = "red";
                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.display = "none";
                    for (s = 0; s < arrMarketSlots.length; s++) {
                        if (arrMarketSlots[s][1] === false) {
                            if (arrMarketItems[i][a][2] == arrMarketSlots[s][0]) {
                                if (a == 2) {
                                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.display = "";
                                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.backgroundColor = "#bffffd"; //lightblue
                                } else if (a > 2) {
                                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.backgroundColor = "#ffcccc"; //lighterred
                                    document.getElementById("market-table").rows[arrMarketItems[i][a][3]].style.display = "";
                                    document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.backgroundColor = "#ff7878"; //lightred
                                    document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.display = "";
                                } else console.log("for (a... error");
                            }
                        }
                    }
                    if (arrMarketItems[i].length == 3 && (!isInArray(hideItemList,arrMarketItems[i][0]))) {
                        document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.backgroundColor = "#ffff66"; //lightyellow
                        document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.display = "";
                    } else if (arrMarketItems[i].length >= 4 && (!isInArray(hideItemList,arrMarketItems[i][0]))) {
                        if (arrMarketItems[i][2][0] < Math.ceil(arrMarketItems[i][3][0] * 0.86) && arrMarketItems[i][2][0]) {
                            document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.backgroundColor = "#90ee90"; //lightgreen
                            document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.display = "";
                            document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.fontWeight = 700;
                            document.getElementById("market-table").rows[arrMarketItems[i][3][3]].style.backgroundColor = "#ffcc66"; //lightorange
                            document.getElementById("market-table").rows[arrMarketItems[i][3][3]].style.display = "";
                        }
                    }
                }
            }
        }
    }
    function updateMarketSlots() {
        arrMarketSlots = [[marketSlot1, false]];
        for (var i = 0; i < arrMarketSlots.length; i++) {
            if (document.getElementById("market-slot-"+(i + 1)+"-free").style.display === "") {
                arrMarketSlots[i][1] = true;
            }
        }
    }
    function marketReloaded() {
        if (typeof(document.getElementById("market-table").rows[0]) != "undefined" && document.getElementById("market-table").rows[0] !== null) {
            // exists
            if (document.getElementById("market-table").rows[0].style.backgroundColor == "silver") {
                updateMarketSlots();
                getMarketItems();
                addItemTooltips();
                alterMarketTable();
            }
        }
    }
    function marketMain() {
        if (marketOn === true) {
            marketInterval = setInterval(marketReloaded, 0);
        }
    }
    function marketButtonClickAction (zEvent) {
        if (marketOn === true) {
            marketOn = false;
            clearInterval(marketInterval);
            buttonMain();
        } else if (marketOn === false) {
            marketOn = true;
            marketMain();
            buttonMain();
        }
    }
    function quickCalcMain() {
        if (quickCalcOn) {
            var i, a, b;
            var arrQuickCalcHeat = ["Error, search for all (infinity symbol)", 999999, 0, 999999]; // name, heatprice, amount, logprice, heat
            var arrStargemInput = [["Blewit Mushroom",100,0,0],["Gold Leaf",1,0,0],["Sapphire",1,0,0],["Emerald",1,0,0],["Ruby",1,0,0],["Diamond",1,0,0]];//name,amt need, amt have, ttl price
            var arrStargemOutput = [["Stardust",0]];
            quickCalcElement.style.display = "";
            quickCalcElement.style.color = "#F5F5F5";
            quickCalcElement.innerHTML = "Quick calc: (for accurate data search market>all if you haven't in past 5 minutes)<br><br>";
            if (typeof(document.getElementById("market-table").rows[1]) == "undefined" || document.getElementById("market-table").rows[1] === null) {
                quickCalcElement.innerHTML += "Invalid data: search market for ALL first";
            } else if (typeof(document.getElementById("market-table").rows[1]) != "undefined" || document.getElementById("market-table").rows[1] !== null) {
                //heat calc
                for (i = 0; i < arrMarketItems.length; i++) {
                    var arrLogs = [["Logs",1],["Oak Logs",2],["Willow Logs",5],["Maple Logs",10],["Stardust Logs",20]];
                    for (a = 0; a < arrLogs.length; a++) {
                        if (arrMarketItems[i][0] == arrLogs[a][0]) {
                            if (arrMarketItems[i][2][0]/arrLogs[a][1] < arrQuickCalcHeat[1]) {
                                arrQuickCalcHeat[0] = arrMarketItems[i][0];
                                arrQuickCalcHeat[1] = arrMarketItems[i][2][0]/arrLogs[a][1];
                                arrQuickCalcHeat[2] = arrMarketItems[i][2][1];
                                arrQuickCalcHeat[3] = arrMarketItems[i][2][0];
                                arrQuickCalcHeat[4] = arrLogs[a][1];
                            }
                            if (debugToConsole) { console.log(arrMarketItems[i][0],arrMarketItems[i][2][0]/arrLogs[a][1],arrMarketItems[i][2][1]); }
                            if (debugToConsole) { console.log(arrQuickCalcHeat[0],arrQuickCalcHeat[1],arrQuickCalcHeat[2]); }
                        }
                    }
                    //stargem
                    for (a = 0; a < arrStargemInput.length; a++) {
                        if (arrMarketItems[i][0] == arrStargemInput[a][0]) {
                            for (b = 2; b < arrMarketItems[i].length; b++) {
                                if (arrStargemInput[a][2] < arrStargemInput[a][1]) {
                                    if (arrMarketItems[i][b][1] < arrStargemInput[a][1]-arrStargemInput[a][2]) {
                                        arrStargemInput[a][2] += arrMarketItems[i][b][1];
                                        arrStargemInput[a][3] += arrMarketItems[i][b][0]*arrMarketItems[i][b][1];
                                    } else if (arrMarketItems[i][b][1] >= arrStargemInput[a][1]-arrStargemInput[a][2]) {
                                        arrStargemInput[a][3] += (arrStargemInput[a][1]-arrStargemInput[a][2])*arrMarketItems[i][b][0];
                                        arrStargemInput[a][2] = arrStargemInput[a][1];
                                    }
                                    if (debugToConsole) { console.log(arrStargemInput[a][0], arrStargemInput[a][1], arrStargemInput[a][2], arrStargemInput[a][3]); }
                                }
                            }
                        }
                    }
                    for (a = 0; a < arrStargemOutput.length; a++) {
                        if (arrMarketItems[i][0] == arrStargemOutput[a][0]) {
                            arrStargemOutput[a][1] = arrMarketItems[i][2][0];
                            break;
                        }
                    }
                }
                quickCalcElement.innerHTML += "Cheapest heat:<br>"+arrQuickCalcHeat[0]+"<br>Total logs: "+numberWithCommas(arrQuickCalcHeat[2])+" | Total Heat: "+numberWithCommas(arrQuickCalcHeat[4]*arrQuickCalcHeat[2])+"<br>Heat price: "+numberWithCommas(arrQuickCalcHeat[1])+" | Log price: "+numberWithCommas(arrQuickCalcHeat[3])+" | Total price: "+numberWithCommas((arrQuickCalcHeat[3]*arrQuickCalcHeat[2]))+"<br><br>";
                quickCalcElement.innerHTML += "Stargem potion:<br>Input: ";
                for (a = 0; a < 2; a++) {
                    quickCalcElement.innerHTML += numberWithCommas(arrStargemInput[a][3])+" "+arrStargemInput[a][0]+" x"+arrStargemInput[a][1]+" + ";
                }
                for (a = 2; a < arrStargemInput.length; a++) {
                    quickCalcElement.innerHTML += "<br>"+numberWithCommas(arrStargemInput[a][3])+" "+arrStargemInput[a][0]+" = "+numberWithCommas((arrStargemInput[a][3]+arrStargemInput[0][3]+arrStargemInput[1][3]));
                }
                quickCalcElement.innerHTML += "<br>Output: "+arrStargemOutput[0][0]+"<br>@ "+arrStargemOutput[0][1]+" | @ "+(arrStargemOutput[0][1]-1)+" net gain/loss";
                for (a = 2; a < arrStargemInput.length; a++) {
                    var stargemNet, stargemNet1;
                    if (a == 5) {
                        stargemNet = numberWithCommas(((arrStargemOutput[0][1]-1)*(a*120000))-(arrStargemInput[a][3]+arrStargemInput[0][3]+arrStargemInput[1][3]));
                        stargemNet1 = numberWithCommas(((arrStargemOutput[0][1]-1)*(a*120000))-(arrStargemInput[a][3]+arrStargemInput[0][3]+arrStargemInput[1][3]));
                        quickCalcElement.innerHTML += "<br>"+stargemNet+" | "+stargemNet1+" "+arrStargemInput[a][0]+": "+arrStargemOutput[0][0]+ " x"+numberWithCommas(a*120000)+" = "+numberWithCommas((arrStargemOutput[0][1]*(a*120000)));
                        continue;
                    }
                    stargemNet = numberWithCommas((arrStargemOutput[0][1]*((a-1)*100000))-(arrStargemInput[a][3]+arrStargemInput[0][3]+arrStargemInput[1][3]));
                    stargemNet1 = numberWithCommas(((arrStargemOutput[0][1]-1)*((a-1)*100000))-(arrStargemInput[a][3]+arrStargemInput[0][3]+arrStargemInput[1][3]));
                    quickCalcElement.innerHTML += "<br>"+stargemNet+" | "+stargemNet1+" "+arrStargemInput[a][0]+": "+arrStargemOutput[0][0]+ " x"+numberWithCommas(((a-1)*100000))+" = "+numberWithCommas((arrStargemOutput[0][1]*((a-1)*100000)));
                }
            }
        } else if (quickCalcOn === false) {
            quickCalcElement.style.display = "none";
        }

    }
    function quickCalcButtonClickAction (zEvent) {
        if (quickCalcOn === true) {
            quickCalcOn = false;
            quickCalcMain();
            buttonMain();
        } else if (quickCalcOn === false) {
            quickCalcOn = true;
            quickCalcMain();
            buttonMain();
        }
    }
    drawButtons();
    marketMain();
    document.body.append(quickCalcElement);
    alterMarketSlots();
});