WFMario / Overview Tweaks

// ==UserScript==
// @name         Overview Tweaks
// @version      2024-10-12
// @author       Mario
// @license MIT
// @match        https://*.atmoburn.com/overview.php*
// @grant        unsafeWindow
// ==/UserScript==

eval(unsafeWindow.byId.toString());

if (document.URL.includes("overview.php?view=14")) { // Production
// now in the game itself
    // unsafeWindow.eval(createColonyWrappers.toString());
    // unsafeWindow.eval(arrangeColonyStats.toString());
    // unsafeWindow.eval(createResourceOptionsB3.toString());
    // unsafeWindow.eval(createResourceOptionsB4.toString());
    // unsafeWindow.eval(createSortingElements.toString());
    // unsafeWindow.eval(sortOverview.toString());

    // createColonyWrappers();
    // createSortingElements();
} else if (document.URL.includes("overview.php?view=1")) { // Colony management
    unsafeWindow.eval(getColonyGroupInfo.toString());


    let colonyGroupInfo = getColonyGroupInfo();
    let colonies = colonyGroupInfo[0];
    let colonyGroups = colonyGroupInfo[1];
    // console.log(colonies);

    Array.from(document.getElementsByClassName("flexTable flexwrap margintop alignleft highlight")).forEach(colonyElement => {
        if (colonyElement.nextElementSibling) { // ignore the last result, that's not a colony
            let colony = colonies[colonyElement.children[0].children[0].href.split("=")[1]];
            colony.element = colonyElement;

            let colonyGroupElement = document.createElement('span');
            colonyGroupElement.className = "padding5";
            colonyGroupElement.innerHTML = colony.group;
            colonyElement.children[0].children[0].after(colonyGroupElement);

        }
    })

    // filter on colony group
    let groupFilter = document.createElement('select');
    groupFilter.className = "darkselect";
    groupFilter.id = "groupFilter";
    groupFilter.addEventListener('change', function() {filterGroups(colonies)});

    let val = 1;
    colonyGroups.unshift("all colonies");
    colonyGroups.forEach(colonyGroup => {
        let groupOption = document.createElement('option');
        groupOption.value = val;
        groupOption.innerHTML = colonyGroup;
        groupFilter.append(groupOption);
        val += 1
    })
    document.getElementsByClassName("highlight padding5 aligncenter")[0].append(groupFilter);



    // wealth shit
    let wealthOk = 210;
    let wealthNotOk = 190;

    let listWealthNotOk = [];

    Array.from(document.getElementsByClassName("alignleft flexwrap flex_center dark")).forEach(colony => {
        let wealthElement = colony.children[1].getElementsByTagName("tr")[2].children[1];
        if (parseInt(wealthElement.childNodes[0].textContent.replace(",","")) <= wealthNotOk) {
            wealthElement.className = "padding5 warn";
            listWealthNotOk.push(wealthElement);
        } else if (parseInt(wealthElement.childNodes[0].textContent.replace(",","")) >= wealthOk) {
            wealthElement.className = "padding5 ok";
        } else {
            wealthElement.className = "padding5";
        }
    })
}

function getColonyGroupInfo() {
    // Goes over the colony sidemenu to collect information about the groups. Note that if you have capital set to top of list but have it grouped, then all ungrouped will be categorized as part of the capital group, this is a "bug" in the game.
    // returns [colonies, colonyGroups]
    // where colonies = {colonyID: colony, ...}
    // colony = {id: colonyID, name: colonyName, group: colonyGroup}
    // colonyGroups = [colonyGroup, ...]

    // get all colonies from the colonymenu
    let colonyGroupElements = [];
    Array.from(byId("colonylist").getElementsByClassName("sidemenu_group")).forEach(colonyGroup => {
        colonyGroupElements.push(colonyGroup.parentElement);
    })
    let colonies = {};
    let colonyGroups = [];
    let colonyGroup = "ungrouped";
    Array.from(byId("colonylist").getElementsByClassName("colmenu_name")).forEach(colonyElement => {
        if (colonyGroupElements.includes(colonyElement.parentElement)) {
            colonyGroup = colonyElement.parentElement.children[0].textContent;
            // console.log(colonyGroup);
        }
        let colony = {
            "id": colonyElement.href.split("=")[1],
            "name": colonyElement.textContent,
            "group": colonyGroup
        }
        colonies[colony.id] = colony;
        if (!colonyGroups.includes(colonyGroup)) {colonyGroups.push(colonyGroup)}
    })
    return [colonies, colonyGroups];
}

function filterGroups(colonies) {
    let selectedGroup = byId("groupFilter").options[byId("groupFilter").selectedIndex].textContent
    Object.values(colonies).forEach(colony => {
        if (selectedGroup == "all colonies" || colony.group == selectedGroup) {
            colony.element.style.display = '';
            colony.element.nextElementSibling.style.display = '';
        } else {
            colony.element.style.display = "none";
            colony.element.nextElementSibling.style.display = "none";
        }
    })
}


// functions for the production tab

function createColonyWrappers() {
    // wraps each colony in a div with className "colonyWrapper"
    let overviewHeader = byId("midcolumn").getElementsByClassName("light padding5 aligncenter")[0];
    let colonyStartingElements = byId("midcolumn").getElementsByClassName("highlight padding5 margintop aligncenter bold");
    let numberOfRows = document.domain.includes("beta3") ? 13 : 16;
    for (let i=colonyStartingElements.length-1; i>=0; i--) {
        let nextElement = colonyStartingElements[colonyStartingElements.length-1]; // HTMLCollections keep the order in which its content appears in the DOM so when you put the last one on a higher spot in the DOM they will also be moved to a higher spot in the HTMLCollection
        let colony = [nextElement];
        for (let j=0; j<numberOfRows; j++) {
            nextElement = nextElement.nextElementSibling;
            colony.push(nextElement);
        }
        let colonyElement = document.createElement("div");
        colonyElement.className = "colonyWrapper";
        colony.forEach(colonyPiece => {colonyElement.append(colonyPiece)});
        overviewHeader.after(colonyElement);
    }
}

function arrangeColonyStats() {
    // creates an array with "colonyStats"
    // each "colonyStat" is an array starting with the respective colonyWrapper element followed by each "resource".
    // each "resource" is an array consisting of the resource name, its abundance, its daily average, and the current amount in storage, all within the respective colony.
    let colonies = [];
    Array.from(document.getElementsByClassName("colonyWrapper")).forEach(colony => {
        let colonyArray = [colony];
        Array.from(colony.getElementsByClassName("light flexTable")).forEach(resource => {
            let resourceArray = [];
            resourceArray.push(resource.children[0].children[1].textContent.replaceAll(" ", "")); // name
            resourceArray.push(parseInt(resource.children[0].children[1].textContent.replaceAll(" ","").replace("%",""))); // abundance
            resourceArray.push(parseInt(resource.children[1].children[1].textContent.replaceAll(" ","").replaceAll(",","").replace("units",""))); // units per day
            resourceArray.push(parseInt(resource.children[1].children[2].textContent.replaceAll(" ","").replaceAll(",","").replace("units",""))); // units stored
            colonyArray.push(resourceArray);
        });
        colonies.push(colonyArray);
    })
    return colonies
}

function sortOverview() {
    let resource = parseInt(byId("sortResource").value);
    let sortType = parseInt(byId("sortType").value);
    let colonies = arrangeColonyStats();
    let ascendDescend = parseInt(byId("ascendDescend").value);

    colonies.sort(function(first, second) {
        return ascendDescend * (second[resource][sortType] - first[resource][sortType]);
    });
    let overviewHeader = byId("midcolumn").getElementsByClassName("light padding5 aligncenter")[0]
    colonies.forEach(colony => {
        overviewHeader.after(colony[0]);
    })
}

function createSortingElements() {
    let sortSpan = document.createElement('span');
    sortSpan.className = "largetext120";
    sortSpan.innerHTML = "Sort by: ";
    sortSpan.style.marginLeft = "5px";
    byId("midcolumn").children[1].children[0].append(sortSpan);

    if (document.domain.includes("beta3")) {
        createResourceOptionsB3()
    } else {
        createResourceOptionsB4()
    }

    let sortType = document.createElement('select');
    sortType.className = "darkselect";
    sortType.id = "sortType";
    sortType.addEventListener('change', sortOverview);

    let sortAbundance = document.createElement('option');
    sortAbundance.value = 1;
    sortAbundance.innerHTML = "Abundance";
    sortType.append(sortAbundance);

    let sortProduction = document.createElement('option');
    sortProduction.value = 2;
    sortProduction.innerHTML = "Daily Average";
    sortType.append(sortProduction);

    let sortStorage = document.createElement('option');
    sortStorage.value = 3;
    sortStorage.innerHTML = "In Storage";
    sortType.append(sortStorage);

    byId("midcolumn").children[1].children[0].append(sortType);

    let ascendDescend = document.createElement('select');
    ascendDescend.className = "darkselect";
    ascendDescend.id = "ascendDescend";
    ascendDescend.addEventListener('change', sortOverview);

    let sortAscend = document.createElement('option');
    sortAscend.value = 1;
    sortAscend.innerHTML = "Ascend";
    ascendDescend.append(sortAscend);

    let sortDescend = document.createElement('option');
    sortDescend.value = -1;
    sortDescend.innerHTML = "Descend";
    ascendDescend.append(sortDescend);

    byId("midcolumn").children[1].children[0].append(ascendDescend);
}

function createResourceOptionsB3() {
    let sortResource = document.createElement('select');
    sortResource.className = "darkselect";
    sortResource.id = "sortResource";
    sortResource.addEventListener('change', sortOverview);

    let sortIron = document.createElement('option');
    sortIron.value = 1;
    sortIron.innerHTML = "Iron";
    sortResource.append(sortIron);

    let sortCopper = document.createElement('option');
    sortCopper.value = 2;
    sortCopper.innerHTML = "Copper";
    sortResource.append(sortCopper);

    let sortSilver = document.createElement('option');
    sortSilver.value = 3;
    sortSilver.innerHTML = "Silver";
    sortResource.append(sortSilver);

    let sortTitanium = document.createElement('option');
    sortTitanium.value = 4;
    sortTitanium.innerHTML = "Titanium";
    sortResource.append(sortTitanium);

    let sortGold = document.createElement('option');
    sortGold.value = 5;
    sortGold.innerHTML = "Gold";
    sortResource.append(sortGold);

    let sortUranium = document.createElement('option');
    sortUranium.value = 6;
    sortUranium.innerHTML = "Uranium";
    sortResource.append(sortUranium);

    let sortPlatinum = document.createElement('option');
    sortPlatinum.value = 7;
    sortPlatinum.innerHTML = "Platinum";
    sortResource.append(sortPlatinum);

    let sortDiamonds = document.createElement('option');
    sortDiamonds.value = 8;
    sortDiamonds.innerHTML = "Diamonds";
    sortResource.append(sortDiamonds);

    let sortOil = document.createElement('option');
    sortOil.value = 9;
    sortOil.innerHTML = "Oil";
    sortResource.append(sortOil);

    let sortWater = document.createElement('option');
    sortWater.value = 10;
    sortWater.innerHTML = "Water";
    sortResource.append(sortWater);

    let sortFood = document.createElement('option');
    sortFood.value = 11;
    sortFood.innerHTML = "Food";
    sortResource.append(sortFood);

    byId("midcolumn").children[1].children[0].append(sortResource);
}

function createResourceOptionsB4() {
    let sortResource = document.createElement('select');
    sortResource.className = "darkselect";
    sortResource.id = "sortResource";
    sortResource.addEventListener('change', sortOverview);

    let sortSteel = document.createElement('option');
    sortSteel.value = 1;
    sortSteel.innerHTML = "Steel";
    sortResource.append(sortSteel);

    let sortAluminum = document.createElement('option');
    sortAluminum.value = 2;
    sortAluminum.innerHTML = "Aluminum";
    sortResource.append(sortAluminum);

    let sortTitanium = document.createElement('option');
    sortTitanium.value = 3;
    sortTitanium.innerHTML = "Titanium";
    sortResource.append(sortTitanium);

    let sortTungsten = document.createElement('option');
    sortTungsten.value = 4;
    sortTungsten.innerHTML = "Tungsten alloy";
    sortResource.append(sortTungsten);

    let sortUranium = document.createElement('option');
    sortUranium.value = 5;
    sortUranium.innerHTML = "Uranium";
    sortResource.append(sortUranium);

    let sortCopper = document.createElement('option');
    sortCopper.value = 6;
    sortCopper.innerHTML = "Copper";
    sortResource.append(sortCopper);

    let sortGold = document.createElement('option');
    sortGold.value = 7;
    sortGold.innerHTML = "Gold";
    sortResource.append(sortGold);

    let sortLithium = document.createElement('option');
    sortLithium.value = 8;
    sortLithium.innerHTML = "Lithium";
    sortResource.append(sortLithium);

    let sortSilicium = document.createElement('option');
    sortSilicium.value = 9;
    sortSilicium.innerHTML = "Silicium";
    sortResource.append(sortSilicium);

    let sortDiamonds = document.createElement('option');
    sortDiamonds.value = 10;
    sortDiamonds.innerHTML = "Diamonds";
    sortResource.append(sortDiamonds);

    let sortCement = document.createElement('option');
    sortCement.value = 11;
    sortCement.innerHTML = "Cement";
    sortResource.append(sortCement);

    let sortWood = document.createElement('option');
    sortWood.value = 12;
    sortWood.innerHTML = "Wood";
    sortResource.append(sortWood);

    let sortPlastic = document.createElement('option');
    sortPlastic.value = 13;
    sortPlastic.innerHTML = "Plastic";
    sortResource.append(sortPlastic);

    let sortFood = document.createElement('option');
    sortFood.value = 14;
    sortFood.innerHTML = "Food";
    sortResource.append(sortFood);

    byId("midcolumn").children[1].children[0].append(sortResource);
}