Tyranu Evavu Player [Fixed]

Autoplays Tyranu Evavu remembering which cards have been played

// ==UserScript==
// @name           Tyranu Evavu Player [Fixed]
// @version        1.1
// @description    Autoplays Tyranu Evavu remembering which cards have been played
// @match          https://www.neopets.com/games/tyranuevavu.phtml*
// @namespace https://greasyfork.org/users/1521429
// ==/UserScript==

var KEY_PLAY = 'playTyranuEvavu';
var KEY_CARDS = 'cards';

addToggleButton();

if (JSON.parse(localStorage.getItem(KEY_PLAY) || "false")) {
    setTimeout(execute, 1000 * (1 + Math.random()));
}

function execute() {
    startGame();
    playGame();
    endGame();
}

function addToggleButton() {
    var toggleButton = document.createElement('button');
    toggleButton.id = 'autoplayer';
    toggleButton.style.display = 'block';
    toggleButton.style.margin = '0 auto';
    toggleButton.addEventListener('click', toggleAutoPlay);

    var content = document.querySelector('.content, #content, body');
    if (content) content.prepend(toggleButton);

    updateButtonText();
}

function updateButtonText() {
    var autoplayIsOn = JSON.parse(localStorage.getItem(KEY_PLAY) || "false");
    document.getElementById('autoplayer').textContent = (autoplayIsOn ? 'Stop AP' : 'Start AP');
}

function toggleAutoPlay() {
    var autoplayIsOn = JSON.parse(localStorage.getItem(KEY_PLAY) || "false");
    localStorage.setItem(KEY_PLAY, !autoplayIsOn);
    updateButtonText();

    if (!autoplayIsOn) execute();
}

function startGame() {
    var form = document.querySelector('form[action*="tyranuevavu.phtml"]');
    if (form && form.querySelector('input[name="type"][value="play"]')) {
        var suits = ['hearts', 'clubs', 'diamonds', 'spades'];
        var cards = [];
        for (var i = 2; i <= 14; i++) {
            for (var s of suits) cards.push(i + '_' + s);
        }
        localStorage.setItem(KEY_CARDS, JSON.stringify(cards));
        form.submit();
    }
}

function playGame() {
    var tyranuButton = document.querySelector('a[href*="action=higher"]');
    var evavuButton  = document.querySelector('a[href*="action=lower"]');

    if (tyranuButton) {
        updateRound();
        var img = document.querySelector('img[src*="images.neopets.com/games/cards/"]');
        if (!img) return;
        var card = img.src.match(/cards\/(.+)\.gif/);

        var cards = JSON.parse(localStorage.getItem(KEY_CARDS) || "[]");
        var length = cards.length;
        var index = cards.indexOf(card[1]);

        if (index > -1) cards.splice(index, 1);
        localStorage.setItem(KEY_CARDS, JSON.stringify(cards));

        if (length > 1) {
            (index / (length - 1) > 0.5 ? evavuButton : tyranuButton).click();
        } else {
            alert('You have won the game!');
        }
    }
}

function updateRound() {
    var b = document.querySelector('.content center b');
    if (b) document.title += ' (' + parseInt(b.textContent) + ')';
}

function endGame() {
    var form = document.querySelector('form[action*="tyranuevavu.phtml"]');
    if (form && form.querySelector('input[name="type"][value="intro"]')) {
        form.submit();
    } else {
        limitReached();
    }
}

function limitReached() {
    if (document.querySelector('form[action="/gameroom.phtml"]')) {
        document.title += ' (Limit Reached)';
    }
}