Greasy Fork is available in English.

Visual Ability Buttons

Creates visual ability buttons for ShuffleIt Dominion

ของเมื่อวันที่ 10-06-2019 ดู เวอร์ชันล่าสุด

// ==UserScript==
// @name         Visual Ability Buttons
// @namespace    http://tampermonkey.net/
// @version      0.22
// @description  Creates visual ability buttons for ShuffleIt Dominion
// @author       ceviri
// @match        https://dominion.games/
// @match        https://www.dominion.games/
// @require      http://code.jquery.com/jquery-3.3.1.min.js
// @grant        GM_addStyle
// ==/UserScript==

GM_addStyle('.call-text { position: absolute; color: white; font-family: TrajanPro-Bold; font-size: 1.5vh; margin: 0 auto; pointer-events: none; background-color: rgba(0, 0, 0, 0.6); overflow:hidden; padding: 2px; } .call-button .call-text { display: none; } .call-button:hover .call-text { display: initial; }');

dominion_VAB = {
    currentScale: 1,
    currentCards: [],
    makeButton: function(entry) {
        var scale = dominion_VAB.currentScale;
        var height = MINI_CARD_HEIGHT * scale / 4;
        var width = MINI_CARD_WIDTH * scale;
        var art = publicCardFactory.getNewAnonymousCard(entry.card).miniView.artURL;

        var inner = `<div class="call-text" style="left: 0px;"> ${LANGUAGE.getCardName[entry.card].singular} </div>`
        if (entry.count > 1) {
                    inner +=
`
<div class="new-card-counter-container ng-scope" style="transform:scale(${scale}); top:0px; left:0px; pointer-events: none;">
    <div class="new-card-counter-text-container" style="top:50%;">
        <div class="new-card-counter-text ng-binding" style="left:-50%;">${entry.count}
        </div>
    </div>
</div>`;
        }
        if (entry.extras.length > 0) {
            inner += entry.extras.map(c => `<div class="mini-info" style="width: ${width / 5}px; height: ${height * 0.8}px; margin: 2px; background-size: cover; background-image: url(${publicCardFactory.getNewAnonymousCard(c.cardName).miniView.artURL}); background-position: center center; border: 2px solid orange;"> </div>`.repeat(c.frequency)).join('');
        }

        return `<div class="call-button" style="width: ${width}px; height: ${height}px; position:relative; margin-bottom:6px;
                                                background-size: cover; background-image: url(${art}); background-position:center; border: 3px solid white;
                                                display: flex; flex-direction: row-reverse; align-items: center; z-index: 5000;"
        onclick="publicAbilityClicked({'which':1}, ${entry.index});"
        onmouseenter="this.style.border = '3px solid green';"
        onmouseleave="this.style.border = '3px solid white';"> ${inner}
        </div>`;
    },

    cardifyList: function(entries) {
        let inner = entries.map(e => dominion_VAB.makeButton(e)).join("");

        if (entries.length > 0 && activeGame.openQuestions[0].declineButtonId > 0) {
            $('.done-buttons-area .done-button').css("display", "none");
            var scale = dominion_VAB.currentScale;
            var height = MINI_CARD_HEIGHT * scale / 4;
            var width = MINI_CARD_WIDTH * scale;
            inner +=
`<div class="call-button-done" style="width: ${width}px; height: ${height}px; position:relative; margin-bottom:6px;
                                    background-size: cover; background-color: black; background-position:center; border: 3px solid white;
                                    display: flex; justify-content: center; align-items: center; z-index: 5000;"
onclick="angular.element(document.body).injector().get('answerCollector').sendDecline(7);"
onmouseenter="this.style.border = '3px solid green';"
onmouseleave="this.style.border = '3px solid white';"> <div class="call-text" style="font-size: 3vh;"> Done </div>
</div>`;
        }

        return `<div class="ability-container" style="overflow: hidden;">${inner}</div>`;
    },

    angular_debug_check: function () {
        if (typeof angular.element(document.body).scope() == 'undefined') {
            angular.reloadWithDebugInfo();
            return false;
        } else {
            return true;
        }
    },

    redraw: function(){
        if (angular.element($('.game-area')).length > 0){
            setTimeout(function() {
                var scale = publicPositionProperties.getPileProperties().scale;
                var currentCards = [];
                var reprs = new Object();
                var entries = [];

                var rcs = [];
                var rcCount = 0;
                var carriageIndices = [];
                var carriageRoot = -1;

                for (qn of activeGame.openQuestions) {
                    if (qn.type == 7) {
                        currentCards = qn.content.elements.map(x => activeGame.getCardNameById(x.association).name);

                        let abilityIndex = 0;
                        for (a of qn.content.elements) {
                            let card = activeGame.getCardNameById(a.association);
                            let nonStacks = new Set(["Archive", "Watchtower", "Blessed Village", "Prince", "Crypt", "Summon"]);

                            let args = [];
                            if (a.logEntryArguments.length > 0) {
                                args = a.logEntryArguments[0].argument;
                                if (!Array.isArray(args)) {
                                    args = [{'cardName': args, 'frequency': 1}];
                                }
                            }
                            if (a.name.name == "WATCHTOWER_TRASH_REACTION")
                                args = [{'cardName': CardNames.DONATE, 'frequency': 1}];
                            if (a.name.name == "WATCHTOWER_TOPDECK_REACTION")
                                args = [{'cardName': CardNames.ROYAL_SEAL, 'frequency': 1}];

                            if (card.name == 'Royal Carriage') {
                                if (qn.story.context != -1) {
                                    args = qn.story.context.argument.logEntryArguments[1].argument;
                                    if (!(rcs.includes(a.association))) {
                                        rcs.push(a.association);
                                    }
                                    carriageRoot = qn.story.context.argument.description.association;
                                    carriageIndices.push(abilityIndex);
                                    rcCount++ ;
                                }
                            }

                            else if (a.name.name == "CHANGELING_MAY_EXCHANGE") {
                                entries.push({'card': CardNames.CHANGELING, 'count': 1, 'index': 0, 'extras': a.logEntryArguments[0].argument});
                            } else if (a.name.name == "DUCHESS_MAY_GAIN") {
                                entries.push({'card': CardNames.DUCHESS, 'count': 1, 'index': 0, 'extras': []});
                            } else if (card in reprs) {
                                reprs[card].count++;
                            } else if (nonStacks.has(card.name)) {
                                entries.push({'card': card, 'count': 1, 'index': abilityIndex, 'extras': args});
                            } else {
                                reprs[card] = {'card': card, 'count': 1, 'index': abilityIndex, 'extras': args};
                                entries.push(reprs[card]);
                            }
                            abilityIndex++;
                        }
                    }
                }

                if (rcCount > 0) {
                    let rootName = activeGame.getCardNameById(carriageRoot);
                    if (rcCount == rcs.length) {
                        entries.push({'card': CardNames.ROYAL_CARRIAGE,
                                      'count': rcCount,
                                      'index': carriageIndices[0],
                                      'extras': [{'cardName': rootName}]});
                    } else {
                        let inPlays = publicPlayStacks.map(s => s.cards.map(c=>c.id)).reduce((x, y) => x.concat(y));
                        let rootIndex = inPlays.indexOf(carriageRoot);
                        let playables = new Object();
                        playables[rootName.name] = {'name': rootName, 'index': carriageIndices[0]};
                        if (rootName.name == "Vassal") {
                            let secondary = activeGame.getCardNameById(inPlays[rootIndex + 1]);
                            playables[secondary.name] = {'name': secondary, 'index': carriageIndices[carriageIndices.length - 1]};
                        }

                        for (let i = 1; i < 3 && i <= inPlays.length - 1 - rootIndex; i++) {
                            let target = activeGame.getCardNameById(inPlays[inPlays.length - i]);
                            let prior = activeGame.getCardNameById(inPlays[inPlays.length - i - 1]);
                            if (["Sauna", "Avanto"].includes(target.name)) {
                                if (["Sauna", "Avanto", "Vassal"].includes(prior.name)) {
                                    playables[target.name] = {'name': target, 'index': carriageIndices[i * rcs.length]};
                                }
                            }

                        }
                        for (target in playables) {
                            entries.push({'card': CardNames.ROYAL_CARRIAGE,
                                          'count': rcs.length,
                                          'index': playables[target].index,
                                          'extras': [{'cardName': playables[target].name}]});
                        }
                    }
                }

                var changed = false;
                if (scale != dominion_VAB.currentScale)
                    changed = true;
                if (currentCards.length != dominion_VAB.currentCards.length) {
                    changed = true;
                } else {
                    for (let i = 0; i < currentCards.length; i++) {
                        if (currentCards[i] != dominion_VAB.currentCards[i]) {
                            changed = true;
                            break;
                        }
                    }
                }

                dominion_VAB.currentScale = scale;
                dominion_VAB.currentCards = currentCards;
                inner = dominion_VAB.cardifyList(entries);
                if ($('.done-buttons-area .ability-container').length == 0){
                    $('.done-buttons-area').prepend(inner);
                } else if (changed) {
                    $('.done-buttons-area .ability-container').replaceWith(inner);
                }
            }, 100);
        }
    }
}

dominion_VAB.angular_debug_check();
setInterval(dominion_VAB.redraw, 200);