Ted's market UI

Ted's Diamond Hunt 2 custom market user interface

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

// ==UserScript==
// @name         Ted's market UI
// @namespace    Ted's market UI
// @version      1.225
// @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 () {
    var hideItemList = ["Raw Shark","Stinger","Wheat","Bear Fur","Stone","Bones","Ashes","Snake Skin","Bat Skin","Raw Shrimp","Shrimp"];
    //alter hideItemList as necessary, use marketstyle name caps, "Bat Skin" and not "batSkin" etc
    var notEnoughCoinsOpacity = true, showMaxCanBuy = true, itemTooltips = true, marketSlotsCustomUi = false; //incomplete leave false

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

    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++) {
                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) {
            quickCalcElement.style.display = "";
            quickCalcElement.style.color = "#F5F5F5";
            quickCalcElement.innerHTML = "Quick calc: <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) {
                var arrHeat = ["Error, search for all (infinity symbol)", 999999, 0]; // name, price, amount
                for (var i = 0; i < arrMarketItems.length; i++) {
                    if (arrMarketItems[i][0] == "Logs" && arrMarketItems[i][2][0] < arrHeat[1]) {
                        arrHeat[0] = arrMarketItems[i][0];
                        arrHeat[1] = arrMarketItems[i][2][0];
                        arrHeat[2] = arrMarketItems[i][2][1];
                    } else if (arrMarketItems[i][0] == "Oak Logs" && arrMarketItems[i][2][0] < (arrHeat[1] * 2)) {
                        arrHeat[0] = arrMarketItems[i][0];
                        arrHeat[1] = arrMarketItems[i][2][0];
                        arrHeat[2] = arrMarketItems[i][2][1];
                    } else if (arrMarketItems[i][0] == "Willow Logs" && arrMarketItems[i][2][0] < (arrHeat[1] * 5)) {
                        arrHeat[0] = arrMarketItems[i][0];
                        arrHeat[1] = arrMarketItems[i][2][0];
                        arrHeat[2] = arrMarketItems[i][2][1];
                    } else if (arrMarketItems[i][0] == "Maple Logs" && arrMarketItems[i][2][0] < (arrHeat[1] * 10)) {
                        arrHeat[0] = arrMarketItems[i][0];
                        arrHeat[1] = arrMarketItems[i][2][0];
                        arrHeat[2] = arrMarketItems[i][2][1];
                    } else if (arrMarketItems[i][0] == "Stardust Logs" && arrMarketItems[i][2][0] < (arrHeat[1] * 20)) {
                        arrHeat[0] = arrMarketItems[i][0];
                        arrHeat[1] = arrMarketItems[i][2][0];
                        arrHeat[2] = arrMarketItems[i][2][1];
                    }
                }
                var pricePerHeat;
                if (arrHeat[0] == "Logs") {pricePerHeat = (arrHeat[1]/1); }
                if (arrHeat[0] == "Oak Logs") {pricePerHeat = (arrHeat[1]/2); }
                if (arrHeat[0] == "Willow Logs") {pricePerHeat = (arrHeat[1]/5); }
                if (arrHeat[0] == "Maple Logs") {pricePerHeat = (arrHeat[1]/10); }
                if (arrHeat[0] == "Stardust Logs") {pricePerHeat = (arrHeat[1]/20); }
                quickCalcElement.innerHTML += "Best heat:<br>Type: "+arrHeat[0]+"<br>Heat cost: "+pricePerHeat+"<br>Amount: "+arrHeat[2]+"<br>";
            }
        } 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();
});