DeadFrontier Ironman 2023

Disabled and redirects you away from potential disqualifiers for the 2023 ironman event

// ==UserScript==
// @name         DeadFrontier Ironman 2023
// @namespace    http://tampermonkey.net/
// @version      0.5
// @description  Disabled and redirects you away from potential disqualifiers for the 2023 ironman event
// @author       Runonstof
// @match        *fairview.deadfrontier.com/onlinezombiemmo/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=deadfrontier.com
// @grant        unsafeWindow
// ==/UserScript==

(function() {
    'use strict';
    //var data = unsafeWindow.document.querySelector('#sidebar');
    //console.log(data.childNodes[0].tagName)

    // # ========================================
    // # CONFIG
    // # ========================================

    // RIGHT NOW THE DEFAULT VALUES ARE SET FOR THE 2023 HARDCORE IRON MAN EVENT
    // BUT YOU CAN CHANGE THIS TO YOUR HEARTS CONTENT

    var reviveButtonEnabled = false; // If false, it hides the revive button on death screen, as your account is not ironman anymore if you revive

    var hiddenPages = [ //index.php?page=<pagenum>
        // Important to hide
        // Marketplace is handled with some special rules, this is to be able to accept items from helpbot
        // 35, //Uncomment to disable marketplace as a whole, else it will only show Help Bot
        61, //fast travel
        27, //private trade

        // Not important to hide, remove if you still want to see those pages
        21, //Arena
        22, //Records
        56, //Clan HQ
        0, //Arcade

        // Add more pages if you wish...
    ];

    // # =========== END CONFIG, ITS RECOMMENDED TO NOT EDIT ANYTHING BELOW THIS LINE

    // @credits to SilverScripts for the location check code
    var locations = {
        "inventories": [
            "fairview.deadfrontier.com/onlinezombiemmo/index.php?page=25",
            "fairview.deadfrontier.com/onlinezombiemmo/index.php?page=35",
            "fairview.deadfrontier.com/onlinezombiemmo/index.php?page=24",
            "fairview.deadfrontier.com/onlinezombiemmo/index.php?page=50",
            "fairview.deadfrontier.com/onlinezombiemmo/DF3D/DF3D_InventoryPage.php?page=31",
        ],
        "marketplace" : ["https://fairview.deadfrontier.com/onlinezombiemmo/index.php?page=35"],
        "yard" : ["fairview.deadfrontier.com/onlinezombiemmo/index.php?page=24"],
        "storage" : ["fairview.deadfrontier.com/onlinezombiemmo/index.php?page=50"],
        "ICInventory" : ["fairview.deadfrontier.com/onlinezombiemmo/DF3D/DF3D_InventoryPage.php?page=31"],
        "forum" : ["fairview.deadfrontier.com/onlinezombiemmo/index.php?board=","fairview.deadfrontier.com/onlinezombiemmo/index.php?action=forum","fairview.deadfrontier.com/onlinezombiemmo/index.php?topic="]
    };

    function isAtLocation(location){ // <-- by SilverScripts
        //Make an exception check for the homepage as its address is contained in each one
        if(location == "home"){
            if(window.location.href.split("fairview.deadfrontier.com/onlinezombiemmo/index.php")[1] == ""){
                return true;
            }else{
                return false;
            }
        }
        //Check if location name exists first
        if(locations[location] != undefined){
            for(var i=0;i<locations[location].length;i++){
                if(window.location.href.indexOf(locations[location][i]) != -1){
                   return true;
                }
            }
        }
        return false;
    }

    /////////////////////////////
    /// FUNCTIONS
    /////////////////////////////

    var helpBotUserId = 3; // Used to only show the 'View trade' button for HelpBot to claim rewards, all other incoming item-for-item will NOT show view trade button

    if (unsafeWindow.localStorage && unsafeWindow.localStorage.ironManAlert) {
        var text = unsafeWindow.localStorage.ironManAlert;
        delete unsafeWindow.localStorage.ironManAlert;
        setTimeout(function(){

            alert(text);
        }, 1000);

    }

    function GM_addStyle(css) {
        var style = document.getElementById("GM_addStyle_ironman") || (function() {
            var style = document.createElement('style');
            style.type = 'text/css';
            style.id = "GM_addStyle_ironman";
            document.head.appendChild(style);
            return style;
        })();
        var sheet = style.sheet;
        sheet.insertRule(css, (sheet.rules || sheet.cssRules || []).length);
    }

    function GM_addStyle_object(selector, styles) {
        var css = selector + "{";
        for (var key in styles) {
            css += key + ":" + styles[key] + ";";
        }
        css += "}";
        GM_addStyle(css);
    }

    // Insert ironman mode label
    var heldCreditsLabel = unsafeWindow.document.querySelector('.heldCredits');
    console.log(heldCreditsLabel)
    if (heldCreditsLabel) {
        // '<span class="" style="color: #0066ff; position: relative;">Ironman Mode</span>'
        var ironManLabel = document.createElement("span");
        // ironManLabel.classList.add('custom')
        ironManLabel.style.color = "#0066ff";
        ironManLabel.style.position = "relative";
        ironManLabel.innerText = "Ironman Mode";
        
        heldCreditsLabel.after(ironManLabel);
        ironManLabel.before(document.createElement("br"));
        ironManLabel.after(document.createElement("br"));

    }

    /////////////////////////////
    /// STYLES
    /////////////////////////////

    var selector = hiddenPages.map(function(pageId) {
        return '[data-page="' + pageId+ '"]' + (pageId == 21 ? '[data-mod="2"]' : '');
    }).join(', ');

    GM_addStyle_object(selector, { // Hide all hiddenPages buttons in outpost mode
        'display': 'none !important',
    });

    GM_addStyle_object('[data-action="switchMarket"][data-page="buy"], [data-action="switchMarket"][data-page="sell"], [data-action="switchMarket"][data-page="private"]', { // Hide Marketplace buttons, except for i-for-i
        'display': 'none !important',
    });
    GM_addStyle_object('[data-page="35"]', { // Rename marketplace button, it will only open HelpBot trade
        'visibility': 'hidden'
    });
    GM_addStyle_object('[data-page="35"]::after', { // Rename marketplace button, it will only open HelpBot trade
        'visibility': 'visible',
        'display': 'block',
        'content': '"Collect Rewards"'
    });

    GM_addStyle_object('#searchArea, #tradesLabels', { // Hide main marketplace screen
        'display': 'none !important',
    })
    GM_addStyle_object('#itemDisplay .tradeSlot button:not([data-target="' + helpBotUserId + '"]):not([data-action="declineTrade"])', { // Hide all view trades button except for Help Bot's
        'display': 'none !important',
    })
    GM_addStyle_object('.tradeSlot:has(button:not([data-target="' + helpBotUserId + '"]))', {
        'text-decoration': 'line-through !important',
    });

    GM_addStyle_object('#inventoryholder #pageLogo', { // Hide marketplace logo
        'background-image': 'unset !important',
    });
    // GM_addStyle_object('#inventoryholder #marketplace button:last-child:not([data-action="acceptTrade"])', { // Hide marketplace "Back to trades" button
    //     'display': 'none !important',
    // });
    GM_addStyle_object('#getRich', { // Hide buy credits button
        'display': 'none !important',
    });
    GM_addStyle_object('[data-action="mdye"], [data-action="mdye"]+div, [data-action="mdye"]+div+div', { // Hide master dye
        'display': 'none !important',
    });
    GM_addStyle_object('[data-action="godcraft"], [data-action="godcraft"]+div, [data-action="godcraft"]+div+div', { // Hide godcraft
        'display': 'none !important',
    });
    GM_addStyle_object('[data-action="rename"], [data-action="rename"]+div, [data-action="rename"]+div+div', { // Hide rename
        'display': 'none !important',
    });
    GM_addStyle_object('textarea.messages', {
        'display': 'none !important',
    });
    GM_addStyle_object('button[data-page="ironman_forum"]', {
        'font-size': '30px !important',
    });

    // Hide revive button
    GM_addStyle_object('#death button, #death div:not(#pageLogo):not(.custom)', {
        'display': 'none !important',
    });

    /////////////////////////////
    /// FUNCTION OVERRIDES
    /////////////////////////////
    var origInfoCard = unsafeWindow.infoCard || null;
    console.log({origInfoCard})
    if (origInfoCard) {
        inventoryHolder.removeEventListener("mousemove", origInfoCard, false);

        unsafeWindow.infoCard = function (e) {
            // infoBox.style.color = '';
            
            //Remove previous ironman warning
            var warnings = document.getElementsByClassName("ironmanWarning");
            for(var i = warnings.length - 1; i >= 0; i--) {
                warnings[i].parentNode.removeChild(warnings[i]);
            }

            origInfoCard(e);
            if(active || pageLock || !allowedInfoCard(e.target)) {
                return;
            }

            if (!e.target.dataset.type) {
                return;
            }

            var itemId = e.target.dataset.type.split('_')[0];
            var itemData = globalData[itemId] || null;

            if (!itemData || !['armour', 'weapon'].includes(itemData.itemcat)) {
                return;
            }


            var checkRequirement = parseInt(itemData.itemcat == 'armour' ? itemData.shop_level : itemData.pro_req);
            var checkLevel = itemData.itemcat == 'armour' ? 75 : 120;

            if (checkRequirement < checkLevel) {
                return;
            }

            
            var warning = document.createElement("div");
            warning.className = "itemData ironmanWarning";
            warning.style.color = "#ff0000";
            warning.style.textDecoration = "underline";
            warning.innerHTML = "This item is not allowed in ironman mode!";
            infoBox.appendChild(warning);
            infoBox.firstElementChild.after(warning.cloneNode(true));


            // At this point, we know the item is either a weapon or armour, and the requirement is high enough
            // Which means not allowed in ironman mode
            infoBox.style.borderColor = '#ff0000';
            // infoBox.style.color = '#ff0000';
        }.bind(unsafeWindow);

        inventoryHolder.addEventListener("mousemove", unsafeWindow.infoCard, false);
    }

    var origCompleteOutpostInit = unsafeWindow.completeOutpostInit;
    // console.log(outpostData);
    if (origCompleteOutpostInit) {
        var origChancePage = unsafeWindow.nChangePage;
        unsafeWindow.nChangePage = function(e) {
            var elem = e.target;
            var page = elem.dataset.page;
            if (page == 'ironman_forum') {
                window.location.href='https://fairview.deadfrontier.com/onlinezombiemmo/index.php?topic=955779.0';
                return;
            }
            return origChancePage(e);
        }

        unsafeWindow.completeOutpostInit = function() {
            outpostData.links.ironman = {
                content: 'Ironman Event 2023',
                location: {
                    top: 5,
                    left: 200,
                },
                page: 'ironman_forum',
            }
            // console.log(outpostData);
            return origCompleteOutpostInit();
        }
        // console.log('outpostContainer', outpostContainer)
        // var btnContainer = unsafeWindow.document.createElement("div");
        // btnContainer.style.top = '50px';
        // btnContainer.style.left = '300px';
        // div.classList.add('opElem');
        // var btn = unsafeWindow.document.createElement("button");
        // btn.innerText = "Ironman Event 2023";
        // btnContainer.appendChild(btn);
        // outpostContainer.appendChild(btnContainer);
    }

    // Check if death screen is open
    var deathElem = null;
    if (!reviveButtonEnabled && (deathElem = unsafeWindow.document.getElementById('death'))) {
        
        $(unsafeWindow.document).ajaxComplete(function(event, jqXHR, ajaxOptions) {
            if (ajaxOptions.url.indexOf('get_values.php') == -1) return;
            var response = jqXHR.responseText;
            var diedLevel = parseInt(response.match(/df_level=(\d+)/)[1]);
            var deathText = document.createElement("div");
            deathText.classList.add('custom')
            deathText.style.color = "#cccccc";
            deathText.style.fontSize = "10pt";
            deathText.style.fontWeight = "900";
            deathText.classList.add("opElem");
            deathText.style.top = "345px";
            deathText.style.left = "0px";
            deathText.style.right = "0px";
            deathText.style.textAlign = "center";
            deathText.style.fontFamily = "Courier New";
            var deathLines = [
                "Looks like you kinda ruined it, what a shame. Let's take a look at how you did:",
                "",
                "Level: " + diedLevel,
            ];
            
            if (diedLevel < 50) {
                deathLines.push("Well, that was a short run.");
            } else if (diedLevel < 100) {
                deathLines.push("Rough, but not too bad. You reached a decent level, but it probably hurts to lose all that progress")
            } else if (diedLevel < 150) {
                deathLines.push("Pretty good! Most normal accounts never reach this level. You should be proud of yourself.")
            } else if (diedLevel < 200) {
                deathLines.push("Wow, you really put in the hours! The vast majority of players have never reached this point on normal accounts! It sucks to lose it all but you clearly enjoyed it.")
            } else if (diedLevel < 220) {
                deathLines.push("An amazing accomplishment, but... Ouch. So close to the Dusk Shop milestone. But think about it; you went this long without making a mistake, something was bound to happen. Take a good long break and try again when you're in the right mindset!")
            } else if (diedLevel < 324) {
                deathLines.push("Honestly, losing all that progress really sucks. But you made it to level 220; the sole goal of the vast majority of players! In real terms, you basically won; past this point is honestly just New Game+. Try again some time when you're emotionally ready.")
            } else if (diedLevel == 324) {
                deathLines.push("What a shame. I wish there was something more I could say... What a rotten way to die. This is terrible... I'm so sorry.");
            } else if (diedLevel >= 325) {
                // max level
                deathLines.push("You only died to flex, didn't you? You defeated the Dragon and saved the Kingdom, GGs. What do you want? A Blue Peter Badge?</br></br>Same...");
            }
    
            deathText.innerHTML = deathLines.map(function(line) {
                return line ? "<span style='letter-spacing: 0px;'>" + line + "</span><br />" : '<br />';
            }).join('');
            // deathText.innerHTML = "<span style='letter-spacing: 0px;'>An overwhelming sense of agony grips your body as you fall to the</span><br />";
            // deathText.innerHTML += "<span style='letter-spacing: 0px;'>floor. Your vision blurs and the world around you slowly turns to</span><br />";
            // deathText.innerHTML += "<span style='letter-spacing: 0px;'>darkness. You are dead and must wait until the timer reaches zero</span><br />";
            // deathText.innerHTML += "<span style='letter-spacing: 0px;'>before you can return to life. Your corpse will most likely be</span><br />";
            // deathText.innerHTML += "<span style='letter-spacing: 0px;'>looted of all cash...</span>";
            
            deathElem.appendChild(deathText);
        })
        
    }

    // Check if should redirect away based on url
    var rawParams = unsafeWindow.location.search.replace(/^\?/, '').split('&');
    var params = {};
    for(var i = 0; i < rawParams.length; i++) {

        var keyValue = rawParams[i].split('=');
        params[keyValue[0]] = keyValue[1]
    }

    if (typeof params.page !== 'undefined') {
        if (hiddenPages.indexOf(parseInt(params.page)) > -1 && params.page != 21) {

            if (unsafeWindow.localStorage) {
                unsafeWindow.localStorage.ironManAlert = 'You cannot visit this page in ironman mode!';
            }
            unsafeWindow.location = '/onlinezombiemmo';
        }

        // Immediatly open marketplace item-for-item
        if (params.page == 35) {
            setTimeout(function(){ // Timeout to let SilverScripts not crash, if someone has that installed too.
                marketAction({ // Create a fake event object
                    target: {
                        dataset: {
                            action: 'switchMarket',
                            page: 'itemforitem'
                        }
                    }
                })
                // unsafeWindow.promptLoading("Opening Ironman Reward Collect...");
				// unsafeWindow.userVars.member_to_name = 'Help Bot';
				// unsafeWindow.loadPrivateItemForItem(helpBotUserId, '3');
            }, 500)

        }
    }

    // This is funny
    var origDisplayPlacementMessage = unsafeWindow.displayPlacementMessage || null;
    if (origDisplayPlacementMessage) {
        unsafeWindow.displayPlacementMessage = function(msg, x, y, type) {
            if(msg.match(/to dye this$/)) {
                var price = msg.match(/\$?[\d,]+(?:\s+credits)?/);
                if (price) {
                    price = price[0] || ''
                }
                msg = 'As an ironman this is a literal waste of ur money. Either way its ' + price + ' to dye this, but don\'t expect to win.';
            }
            origDisplayPlacementMessage(msg, x, y, type)
        }
    }


})();