Jstris Replay PC Number

Shows PC number on Jstris replays

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         Jstris Replay PC Number
// @namespace    Jstris Replay PC Number
// @version      0.0.5
// @description  Shows PC number on Jstris replays
// @author       smdbs
// @match        https://jstris.jezevec10.com/replay*
// @grant        none
// ==/UserScript==

(function setupStats() {
    'use strict';
    try {
        if(document.getElementsByClassName('formulaElement').length<1){ // To not create too many elements
            $("<div class='formulaElement' style='display:none;color:#999;font-size: 32px;text-align: center;margin-top: 15px;'>1st</div>").insertBefore("#lrem");
        }
        const formulaElement = $('.formulaElement').first();
        const sprintText = $('#stPC')[0];
        var observer1 = new MutationObserver(function(mutations){
            if(sprintText.style.display=='block'){
                   $('.formulaElement').first().css('display','block'); // If PCMode then display
               }
        });
        observer1.observe(sprintText, {
            attributes:    true,
        });

        const pcElement = $('#sprintInfo div').filter('#lrem').last()[0];
        var lastPCNumber = 0
        var lastPiecesNumber = 0;
        const suffixes = ['th','st','nd','rd','th','th','th','th'];

        var observer = new MutationObserver(function(mutations) { // Listens to change on number of PCs
            let piecesElement = $("#statTable tr td").filter(function(index){return this.textContent=="#"}).next()[0];
            let newPiecesNumber = parseInt(piecesElement.innerHTML); // piece number
            let newPCNumber = parseInt(pcElement.innerHTML); // pc number
            if(newPCNumber==0){
                formulaElement.text("1st");
                return;
            }
            let displayNumber;
            if(newPiecesNumber % 5 != 0){
                /*
                14 blocks = 5 or 10 blocks @ the start
                18 blocks = 10 or 15 blocks @ the start
                */
                if (newPiecesNumber % 10 < 5) displayNumber = ((newPiecesNumber - 5) - (newPiecesNumber - 5) % 5) * 5 % 7 + 1;
                else displayNumber = (newPiecesNumber - newPiecesNumber % 10) * 5 % 7 + 1;
            }else{
                displayNumber = newPiecesNumber*5%7+1; //
            }
            let text = displayNumber+suffixes[displayNumber];

            if(newPCNumber - lastPCNumber != 1 || (newPiecesNumber - lastPiecesNumber) % 5 > 0){
                let displayNumber2 = (displayNumber + 3) % 7 + 1;
                text += '/' + displayNumber2+suffixes[displayNumber2];
            }

            formulaElement.text(text);
            lastPiecesNumber = newPiecesNumber-newPiecesNumber%5;
            lastPCNumber = newPCNumber;
        });

        observer.observe(pcElement, {
            attributes:    true,
            childList:     true,
            characterData: true
        });

    } catch (e) { // Rerun on error
        setTimeout(setupStats, 1000);
    }
})();