您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Add a recreate button to the epicmafia.com setup pages
// ==UserScript== // @name Recreate Setup on epicmafia.com // @namespace https://greasyfork.org/en/users/159342-cleresd // @description Add a recreate button to the epicmafia.com setup pages // @version 1.05 // @match https://epicmafia.com/setup/* // @include https://epicmafia.com/game/new // @grant GM_setValue // @grant GM_getValue // @run-at document-end // ==/UserScript== // Примечание: Опция Multiple Mafias не работает в Main lobby $(document).ready(function () { setTimeout(() => { getMy(); if ($('.setup_actions').length) { let recreateButtonHtml = '<div class="play_menu" onclick="my.reCreateSetup()" onmouseover="this.style.borderColor=\'#b11\';this.style.backgroundColor=\'#eee\';" onmouseout="this.style.borderColor=\'#999\';this.style.backgroundColor=\'#eee\';" style="width: 65px"><div class="play_menu_text" style="color: rgb(205, 136, 211);">Recreate</div></div></div>'; $('.setup_actions').after(recreateButtonHtml); } else if ($('#subnav').find('li.sel > a.sel').text() === 'Create game') { console.log(GM_getValue("myRecreateSetupFunctionText")); let recreateSetupFunctionText = GM_getValue("myRecreateSetupFunctionText"); my.bodyAppendScript(my.getTextThatAddAbilityToFastRemoveRoles()); if (recreateSetupFunctionText !== undefined && recreateSetupFunctionText !== '') { my.bodyAppendScript(GM_getValue("myRecreateSetupFunctionText")); GM_setValue("myRecreateSetupFunctionText", ''); } } }, 1000); }); function getMy() { my = {}; my.reCreateSetup = function () { let getDataFromSetupObject = { result: '(function(){', gameOptionIds: [], roles: [], gameSetup: $('.gamesetup').children(), getDataFromFixedSetup: function () { for (let i = 0; i < this.gameSetup.length - 3; i++) { let currEl = this.gameSetup[i]; if (currEl.classList.contains('false')) { // get game's option let optionId = '#add_' + currEl.classList[0].split('-')[0]; this.gameOptionIds.push(optionId); } else if (currEl.firstElementChild.classList.contains('roleimg')) { // get role // get role's count let roleName = currEl.firstElementChild.classList[1]; roleName += currEl.firstElementChild.classList.contains('mafia_red') ? '.mafia_red' : ':not(.mafia_red)'; let roleCount = currEl.firstElementChild.hasChildNodes() ? currEl.firstElementChild.firstElementChild.textContent : 1; this.addRoles(roleName, roleCount); } } }, addRoles: function (roleName, roleCount) { for (let j = 0; j < roleCount; j++) { this.roles.push('\'.' + roleName + '\''); } }, getDataFromRandomSetup: function () { for (let i = 0; i < this.gameSetup.length - 3; i++) { let currEl = this.gameSetup[i]; if (currEl.classList.contains('false')) { // get game option let optionId = '#add_' + currEl.classList[0].split('-')[0]; this.gameOptionIds.push(optionId); } else { let isMultipleMafiaTeams = this.gameOptionIds.indexOf('#add_multiple') !== -1; // get roles let $allRoles = $('.allroles_align').children(); let allRoleCount = $allRoles.length; if (isMultipleMafiaTeams) { let villagerRoleCount = $('#prob_village').find('div.allroles_align').children().length; let mafiaRoleCount = $('#prob_mafia').find('div.allroles_align').children().length; let villagerAndMafiaRoleCount = villagerRoleCount + mafiaRoleCount; let firstPartOfMafiaRoleCount = Math.round(mafiaRoleCount / 2); let secondPartOfMafiaRoleCount = mafiaRoleCount - firstPartOfMafiaRoleCount; for (let i = 0; i < villagerRoleCount; i++) { this.addRandomRole($allRoles[i]); } for (let i = villagerRoleCount; i < villagerRoleCount + firstPartOfMafiaRoleCount; i++) { this.addRandomRoleMafia($allRoles[i], false); } for (let i = villagerRoleCount + firstPartOfMafiaRoleCount; i < villagerRoleCount + firstPartOfMafiaRoleCount + secondPartOfMafiaRoleCount; i++) { this.addRandomRoleMafia($allRoles[i], true); } for (let i = villagerAndMafiaRoleCount; i < allRoleCount; i++) { this.addRandomRole($allRoles[i]); } } else { for (let i = 0; i < allRoleCount; i++) { this.addRandomRole($allRoles[i]); } } } } }, addRandomRole: function (randomRole) { let roleName = randomRole.classList[1]; roleName += randomRole.classList.contains('mafia_red') ? '.mafia_red' : ':not(.mafia_red)'; this.roles.push('\'.' + roleName + '\''); }, addRandomRoleMafia: function (randomRole, redTeam) { let roleName = randomRole.classList[1]; roleName += redTeam ? '.mafia_red' : ':not(.mafia_red)'; this.roles.push('\'.' + roleName + '\''); }, getOptionsBeforeRoles: function () { let addBeforeRoles = ''; // closed roles on the top to add all roles in correct way let closedRolesOptionIndex; if ((closedRolesOptionIndex = this.gameOptionIds.indexOf('#add_closedroles')) !== -1) { // if exist this.gameOptionIds.splice(closedRolesOptionIndex, 1); addBeforeRoles += '\n$(\'#add_closedroles\').click();\n'; } return addBeforeRoles; }, getOptionsAfterRoles: function () { let addAfterRoles = ''; // make sure it would be all right with whisper game option let whisperOptionIndex; if ((whisperOptionIndex = this.gameOptionIds.indexOf('#add_whisper')) !== -1) { // if exist this.gameOptionIds.splice(whisperOptionIndex, 1); } else { // if doesn't exist this.gameOptionIds.push('#add_whisper'); } // add all game options to the result line for (let i = 0; i < this.gameOptionIds.length; i++) { let optionId = this.gameOptionIds[i]; addAfterRoles += '$(\'' + optionId + '\').click();\n'; } if ($('#prob_village').find('> div > .uniquealign').length === 1) { addAfterRoles += '$(\'#add_unique_village\').click();\n'; } if ($('#prob_mafia').find('> div > .uniquealign').length === 1) { addAfterRoles += '$(\'#add_unique_mafia\').click();\n'; } if ($('#prob_third').find('> div > .uniquealign').length === 1) { addAfterRoles += '$(\'#add_unique_third\').click();\n'; } return addAfterRoles; }, getFinalResult: function (addBeforeRoles, addAfterRoles) { this.result += '\nlet roles = [' + this.roles + '];\n'; this.result += ` let checkExist = setInterval(function() { if ($(roles[0]).length) { clearInterval(checkExist);\n` + addBeforeRoles + ` for (let i = 0; i < roles.length; i++) { $(roles[i]).prev().children('.inc').click(); }\n` + addAfterRoles + ` } }, 500);\n`; }, getFinalResultFromMultisetup: function (addBeforeRoles, addAfterRoles) { let roleCountInOneSetup = Number($('.rolecont > .roleimg.role-unknown > .sup').text()); let setupCount = this.roles.length / roleCountInOneSetup; function addEmptySetups() { let result = ''; for (let i = 0; i < setupCount - 1; i++) { result += "$('#addgroup').click();\n"; } return result; } this.result += '\nlet roles = [' + this.roles + '];\n'; this.result += ` function addSetups(currentSetup) { let result = ''; let startId = currentSetup * roleCountInOneSetup; let endId = startId + roleCountInOneSetup; for (let i = startId; i < endId; i++) { $(roles[i]).prev().children('.inc').click(); } return result; } let roleCountInOneSetup = ` + roleCountInOneSetup + `; let setupCount = ` + setupCount + `; let currentSetup = 0; let checkExist = setInterval(function() { if ($(roles[0]).length) { clearInterval(checkExist);\n` + addBeforeRoles + addEmptySetups() + ` for (let i = 0; i < setupCount; i++){ $('#gameicons').children().eq(i).click(); addSetups(i); }\n` + addAfterRoles + ` } }, 500);\n`; }, getResult: function () { if ($('.gamesetup > .probabilities').length === 1) { this.getDataFromRandomSetup(); } else { this.getDataFromFixedSetup(); } let addBeforeRoles = this.getOptionsBeforeRoles(); let addAfterRoles = this.getOptionsAfterRoles(); // add all roles to the result line if (this.gameSetup.parent().find('li.selsetup').length === 1) { this.getFinalResultFromMultisetup(addBeforeRoles, addAfterRoles); } else { this.getFinalResult(addBeforeRoles, addAfterRoles); } this.result += '\n})();'; } }; getDataFromSetupObject.getResult(); console.log(getDataFromSetupObject.result); GM_setValue("myRecreateSetupFunctionText", getDataFromSetupObject.result); window.open('https://epicmafia.com/game/new', '_blank'); }; my.bodyAppendScript = function (scriptText) { $(document.body).append('<script type="text/javascript">' + scriptText + '</script>'); }; my.getTextThatAddAbilityToFastRemoveRoles = function () { return ` function removeRole(e) { let isRowSelected = e.target.parentElement.parentElement.classList.contains('sel'); let roleName = e.target.classList[1]; let redMafia = e.target.classList[2] !== undefined ? '.mafia_red' : ':not(.mafia_red)'; let actionString = '.dec'; doActionWithRole(isRowSelected, roleName, redMafia, actionString); } function addRole(e) { let isRowSelected = e.target.parentElement.parentElement.classList.contains('sel'); let roleName = e.target.classList[1]; let redMafia = e.target.classList[2] !== undefined ? '.mafia_red' : ':not(.mafia_red)'; let actionString = '.inc'; doActionWithRole(isRowSelected, roleName, redMafia, actionString); } function doActionWithRole(isRowSelected, roleName, redMafia, actionString) { if (isRowSelected) { $('div.' + roleName + redMafia).prev().children(actionString).click(); } } var observerThatAddAbilityToRemoveAddedRoles = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { if (mutation.addedNodes.length && mutation.addedNodes[0].classList.contains('roleimg')) { $(mutation.addedNodes[0]).click((e) => { if (e.ctrlKey) addRole(e); else removeRole(e); }) } }); }); var observerAddingNewSetups = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { if (mutation.addedNodes.length) { $(mutation.addedNodes[0]).children().children('.roleimg').click((e) => { if (e.ctrlKey) addRole(e); else removeRole(e); }); observerThatAddAbilityToRemoveAddedRoles.observe(mutation.addedNodes[0], { childList: true, subtree: true }); } }); }); observerThatAddAbilityToRemoveAddedRoles.observe($('#gameicons > div.createsetup.sel')[0], { childList: true, subtree: true }); observerAddingNewSetups.observe($('#gameicons')[0], { childList: true});` }; }