Ted's market UI

Ted's Diamond Hunt 2 custom market user interface

目前為 2017-04-01 提交的版本,檢視 最新版本

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         Ted's market UI
// @namespace    Ted's market UI
// @version      1.231
// @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 myItemList = [["Shark",9999999],["Dotted Green Leaf",25000],["Skeleton Sword",15000000]]; //itemname,price - highlights these pink if matched price or lower (has priority over hideItemList)
    var hideItemList = ["Raw Shark","Stinger","Iron Dagger","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");
    var zMap = document.createElement("span");
    zMap.setAttribute("id","mapSpan");
    zMap.setAttribute("style","color:gold");
    zMap.innerHTML = " You have an incomplete map!";
    var tickStart = new Date().getTime();
    var tickEnd = new Date().getTime();
    var tickTime = tickEnd - tickStart;
    var tickCheck = 0;

    function drawButtons() {
        zMarket = document.createElement("div");
        zMarket.setAttribute("id","zMarketId");
        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("zMarketId").appendChild(zMap);
        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 nextTick() {
        if (playtime > tickCheck) {
            tickCheck = playtime;
            tickEnd = new Date().getTime();
            tickTime = tickEnd - tickStart;
            if (debugToConsole) { console.log("Tick time: "+ tickTime); }
            tickStart = new Date().getTime();
            return true;
        } else return false;
    }
    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 = "";
                        }
                    }
                    // myItemList
                    for (var b = 0; b < myItemList.length; b++) {
                        if (myItemList[b][0] == arrMarketItems[i][0]) {
                            if (arrMarketItems[i][2][0] <= myItemList[b][1]) {
                                document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.backgroundColor = "#ff99ff"; //pink
                                document.getElementById("market-table").rows[arrMarketItems[i][2][3]].style.display = "";
                                if (arrMarketItems[i].length >= 4) {
                                    document.getElementById("market-table").rows[arrMarketItems[i][3][3]].style.backgroundColor = "#ffccff"; //pink
                                    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 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 before using Quick Calc)<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++) {
                    if (arrStargemInput[a][2] != arrStargemInput[a][1]) {
                        quickCalcElement.innerHTML += "!!! < "+arrStargemInput[a][1]+" "+arrStargemInput[a][0]+" x"+arrStargemInput[a][2]+" + ";
                    } else quickCalcElement.innerHTML += numberWithCommas(arrStargemInput[a][3])+" "+arrStargemInput[a][0]+" x"+arrStargemInput[a][2]+" + ";
                }
                for (a = 2; a < arrStargemInput.length; a++) {
                    if (arrStargemInput[a][2] != arrStargemInput[a][1]) {
                        quickCalcElement.innerHTML += "<br>!!! < "+arrStargemInput[a][1]+" "+arrStargemInput[a][0]+" x"+arrStargemInput[a][2]+" + ";
                    } else 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++) {
                    if (arrStargemInput[a][2] != arrStargemInput[a][1]) {
                        //
                    } else if (arrStargemInput[a][2] == arrStargemInput[a][1]) {
                        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();
        }
    }
    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();
                quickCalcMain();
            }
        }
    }
    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 persistentInterval() {
        if (nextTick()) {
            if (treasureMap > 0) {
                document.getElementById("mapSpan").style.display = "";
            } else if (treasureMap === 0) {
                document.getElementById("mapSpan").style.display = "none";
            }
        }
    }
    drawButtons();
    marketMain();
    document.body.append(quickCalcElement);
    alterMarketSlots();
    setInterval(persistentInterval, 100);
});