feat: init repo
This commit is contained in:
@@ -0,0 +1,736 @@
|
|||||||
|
// ==UserScript==
|
||||||
|
// @name Theresmore 助手
|
||||||
|
// @namespace http://tampermonkey.net/
|
||||||
|
// @version 20240907
|
||||||
|
// @license MIT
|
||||||
|
// @description Theresmore 助手, 包含 加速, 自动升级建筑, 一键研究, 一键施法, 批量探索, 一键攻击 等功能
|
||||||
|
// @author liooil
|
||||||
|
// @match https://www.theresmoregame.com/play/
|
||||||
|
// @match https://theresmoregame.g8hh.com/
|
||||||
|
// @match https://theresmoregame.g8hh.com.cn/
|
||||||
|
// @icon https://www.theresmoregame.com/play/favicon.ico
|
||||||
|
// ==/UserScript==
|
||||||
|
|
||||||
|
const customSpeed = 60; //自定义倍速,可自行修改,默认10倍速,修改后刷新游戏生效(不可动态修改 否则会出错)
|
||||||
|
const 军队加速 = true;
|
||||||
|
const 进攻失败不损失部队 = true;
|
||||||
|
const 一键祈祷 = true;
|
||||||
|
const 将军数量跟随建筑数量 = true;
|
||||||
|
const 扫描间隔 = 1000 * 2;
|
||||||
|
|
||||||
|
performance.realNow = performance.now;
|
||||||
|
performance.now = () => {
|
||||||
|
return performance.realNow() * customSpeed;
|
||||||
|
};
|
||||||
|
/** 建筑自动升级采用白名单 */
|
||||||
|
let updateStore = getUpdateStore();
|
||||||
|
let oldList = [];
|
||||||
|
/** 研究/人口手动升级采用黑名单 */
|
||||||
|
let blackList = getBlackList();
|
||||||
|
let 自动升级建筑 = true;
|
||||||
|
let 自动升级所有标签页面 = false;
|
||||||
|
let 自动结盟 = false;
|
||||||
|
let 咒语已全部激活 = false;
|
||||||
|
let 搜索次数 = 0;
|
||||||
|
|
||||||
|
function getUpdateStore() {
|
||||||
|
const value = localStorage.getItem("updateStore");
|
||||||
|
if (value) {
|
||||||
|
return new Set(JSON.parse(value));
|
||||||
|
}
|
||||||
|
return new Set([
|
||||||
|
"钢铁厂",
|
||||||
|
"秘密会议",
|
||||||
|
"宗教部",
|
||||||
|
"修道院",
|
||||||
|
"有人值守仓库",
|
||||||
|
"大型库房",
|
||||||
|
"远古保险库",
|
||||||
|
"储物间",
|
||||||
|
"圣谷",
|
||||||
|
"炼金实验室",
|
||||||
|
"建筑工区域",
|
||||||
|
"亡者兽群",
|
||||||
|
"巨型工作区",
|
||||||
|
"锯木厂",
|
||||||
|
"铸造厂",
|
||||||
|
"天文台",
|
||||||
|
"大学",
|
||||||
|
"登攀者世界图书馆",
|
||||||
|
"智慧大厅",
|
||||||
|
"学校",
|
||||||
|
"诸神的机器",
|
||||||
|
"马厩",
|
||||||
|
"难民区组件",
|
||||||
|
"证券交易所组件",
|
||||||
|
"钢铁宫殿组件",
|
||||||
|
"联盟大使馆",
|
||||||
|
"内政部",
|
||||||
|
"粮仓",
|
||||||
|
"伐木工营地",
|
||||||
|
"好运之森",
|
||||||
|
"魔法环",
|
||||||
|
"战争部",
|
||||||
|
"魔法塔",
|
||||||
|
"献祭圣坛",
|
||||||
|
"神之荣耀",
|
||||||
|
"寺庙",
|
||||||
|
"物质转化器",
|
||||||
|
"工匠作坊",
|
||||||
|
"市场",
|
||||||
|
"卡纳瓦贸易站",
|
||||||
|
"农场",
|
||||||
|
"住宅区",
|
||||||
|
"法力深井组件",
|
||||||
|
"市政厅",
|
||||||
|
"宅邸",
|
||||||
|
"矿井",
|
||||||
|
"工匠公会",
|
||||||
|
"木匠工坊",
|
||||||
|
"采石场",
|
||||||
|
"石匠坊",
|
||||||
|
"封地",
|
||||||
|
"食品杂货店",
|
||||||
|
"钠红石精炼厂",
|
||||||
|
"金库",
|
||||||
|
"城墙组件",
|
||||||
|
"工业厂房",
|
||||||
|
"光之城组件",
|
||||||
|
"海湾区组件",
|
||||||
|
"银行",
|
||||||
|
"信用社",
|
||||||
|
"研究工厂",
|
||||||
|
"壁垒组件",
|
||||||
|
"磐石巨墙组件",
|
||||||
|
"大型仓库",
|
||||||
|
"钠红石仓库",
|
||||||
|
"存储设施",
|
||||||
|
"精神花园",
|
||||||
|
"伊甸园",
|
||||||
|
"普通房屋",
|
||||||
|
"军官训练场",
|
||||||
|
"攻城机器厂",
|
||||||
|
"雷区",
|
||||||
|
"军事学院",
|
||||||
|
"钠红石气球",
|
||||||
|
"弩炮",
|
||||||
|
"新兵训练中心",
|
||||||
|
"兵营",
|
||||||
|
"炮兵靶场",
|
||||||
|
"守望者前哨",
|
||||||
|
"超级大炮组件",
|
||||||
|
"钠红石护盾",
|
||||||
|
"亡者大厅",
|
||||||
|
"撒尔喀特帝国 ",
|
||||||
|
"鳞岩部落 ",
|
||||||
|
"恩索诸众 ",
|
||||||
|
"岛屿前哨",
|
||||||
|
"定居点大厅",
|
||||||
|
"棚屋",
|
||||||
|
"建筑工联合体",
|
||||||
|
"工匠联合体",
|
||||||
|
"朝觐者营地",
|
||||||
|
"炼金联合体",
|
||||||
|
"旧神教堂",
|
||||||
|
"发展部",
|
||||||
|
"火车站",
|
||||||
|
"物流中心",
|
||||||
|
"法力提取器",
|
||||||
|
"大型棚屋",
|
||||||
|
"战壕",
|
||||||
|
"工厂",
|
||||||
|
"自动化联合体组件",
|
||||||
|
"精灵营地",
|
||||||
|
"书籍",
|
||||||
|
"灵魂",
|
||||||
|
"法力反应堆",
|
||||||
|
"应许之地组件",
|
||||||
|
"英雄事迹大厅组件",
|
||||||
|
"税收检查站",
|
||||||
|
"精灵村庄",
|
||||||
|
"法力之塔组件",
|
||||||
|
"丰饶之谷",
|
||||||
|
"栅栏组件",
|
||||||
|
"市中心组件",
|
||||||
|
"超大集市组件",
|
||||||
|
"大教堂组件",
|
||||||
|
"自由思想家学院组件",
|
||||||
|
"繁荣之泉",
|
||||||
|
"精炼厂",
|
||||||
|
"码头",
|
||||||
|
"海关",
|
||||||
|
"庄园",
|
||||||
|
"美德雕像组件",
|
||||||
|
"佣兵前哨",
|
||||||
|
"凯旋门组件",
|
||||||
|
"法力场",
|
||||||
|
"魔法工坊",
|
||||||
|
"魔法马厩",
|
||||||
|
"门之解密",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
function saveUpdateStore(updateStore) {
|
||||||
|
localStorage.setItem("updateStore", JSON.stringify([...updateStore]));
|
||||||
|
}
|
||||||
|
function getBlackList() {
|
||||||
|
const value = localStorage.getItem("blackList");
|
||||||
|
if (value) {
|
||||||
|
return new Set(JSON.parse(value));
|
||||||
|
}
|
||||||
|
return new Set();
|
||||||
|
}
|
||||||
|
function saveBlackList(list) {
|
||||||
|
localStorage.setItem("blackList", JSON.stringify([...list]));
|
||||||
|
}
|
||||||
|
|
||||||
|
let timer = setInterval(() => {
|
||||||
|
//setInterval摆烂
|
||||||
|
if (document.querySelector("#main-tabs")) {
|
||||||
|
clearInterval(timer);
|
||||||
|
const MainStore = Object.values(document.querySelector("#main-tabs"))[1]
|
||||||
|
.children._owner.stateNode.props.MainStore;
|
||||||
|
window.MainStore = MainStore; //暴露存储变量
|
||||||
|
console.log(MainStore);
|
||||||
|
customFunction(MainStore);
|
||||||
|
}
|
||||||
|
}, 100);
|
||||||
|
|
||||||
|
const handlers = [];
|
||||||
|
|
||||||
|
setInterval(() => {
|
||||||
|
const tabListNode = document
|
||||||
|
.querySelector("#main-tabs")
|
||||||
|
.querySelector(`div[role=tablist]`);
|
||||||
|
for (let page = 0; page < tabListNode.childNodes.length; page++) {
|
||||||
|
const tabNode = tabListNode.childNodes[page];
|
||||||
|
const handler = handlers[page];
|
||||||
|
if (tabNode && tabNode.getAttribute("aria-selected") === "true") {
|
||||||
|
const id = tabNode.getAttribute("aria-controls");
|
||||||
|
const containerNode = document.getElementById(id);
|
||||||
|
handler?.(tabNode, containerNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 保存
|
||||||
|
registerSave();
|
||||||
|
|
||||||
|
// 将军/指挥官数量跟随军事学院数量
|
||||||
|
const commnder = MainStore.ArmyStore.visibleArmy.find(
|
||||||
|
(e) => e.id === "commander",
|
||||||
|
);
|
||||||
|
const general = MainStore.ArmyStore.visibleArmy.find(
|
||||||
|
(e) => e.id === "general",
|
||||||
|
);
|
||||||
|
const military_academy = MainStore.run.buildings.find(
|
||||||
|
(v) => v.id === "military_academy",
|
||||||
|
);
|
||||||
|
if (commnder && general && military_academy) {
|
||||||
|
general.cap = military_academy.value;
|
||||||
|
commnder.cap = military_academy.value;
|
||||||
|
}
|
||||||
|
// 战略家数量跟随魔法塔数量
|
||||||
|
const strategist = MainStore.ArmyStore.visibleArmy.find(
|
||||||
|
(e) => e.id === "strategist",
|
||||||
|
);
|
||||||
|
const magical_tower = MainStore.run.buildings.find(
|
||||||
|
(v) => v.id === "magical_tower",
|
||||||
|
);
|
||||||
|
if (strategist && magical_tower) {
|
||||||
|
strategist.cap = magical_tower.value;
|
||||||
|
}
|
||||||
|
// 法力堡垒数量跟随魔法工坊
|
||||||
|
}, 扫描间隔);
|
||||||
|
|
||||||
|
// 建筑
|
||||||
|
handlers[0] = async (tabNode, containerNode) => {
|
||||||
|
if (containerNode.firstChild.id !== "auto-upgrade") {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.id = "auto-upgrade";
|
||||||
|
btn.classList.add("btn", "w-full", "mb-2");
|
||||||
|
btn.textContent = "A";
|
||||||
|
if (自动升级建筑) {
|
||||||
|
btn.classList.add("btn-green");
|
||||||
|
} else {
|
||||||
|
btn.classList.add("btn-gray");
|
||||||
|
}
|
||||||
|
btn.onclick = () => {
|
||||||
|
自动升级建筑 = !自动升级建筑;
|
||||||
|
if (自动升级建筑) {
|
||||||
|
btn.classList.remove("btn-gray");
|
||||||
|
btn.classList.add("btn-green");
|
||||||
|
} else {
|
||||||
|
btn.classList.remove("btn-green");
|
||||||
|
btn.classList.add("btn-gray");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
containerNode.prepend(btn);
|
||||||
|
}
|
||||||
|
const subTabNodes = containerNode.querySelector(`div[role=tablist]`);
|
||||||
|
if (subTabNodes) {
|
||||||
|
if (subTabNodes.lastChild.textContent !== "A") {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.classList.add("btn", "mb-2");
|
||||||
|
btn.id = "auto-upgrade-all";
|
||||||
|
btn.textContent = "A";
|
||||||
|
if (自动升级所有标签页面) {
|
||||||
|
btn.classList.add("btn-green");
|
||||||
|
} else {
|
||||||
|
btn.classList.add("btn-gray");
|
||||||
|
}
|
||||||
|
btn.onclick = () => {
|
||||||
|
自动升级所有标签页面 = !自动升级所有标签页面;
|
||||||
|
if (自动升级所有标签页面) {
|
||||||
|
btn.classList.remove("btn-gray");
|
||||||
|
btn.classList.add("btn-green");
|
||||||
|
} else {
|
||||||
|
btn.classList.remove("btn-green");
|
||||||
|
btn.classList.add("btn-gray");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
subTabNodes.appendChild(btn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const list = containerNode.querySelectorAll(`button.btn`);
|
||||||
|
let newList = [];
|
||||||
|
for (const node of list) {
|
||||||
|
if (node.id === "auto-upgrade" || node.id === "auto-upgrade-all") continue;
|
||||||
|
const name = node.firstChild.textContent;
|
||||||
|
newList.push(node);
|
||||||
|
if (!oldList.includes(node)) {
|
||||||
|
const button = document.createElement("button");
|
||||||
|
button.classList.add(
|
||||||
|
"absolute",
|
||||||
|
"-bottom-0",
|
||||||
|
"right-0",
|
||||||
|
"inline-block",
|
||||||
|
"py-px",
|
||||||
|
"px-2",
|
||||||
|
"rounded-full",
|
||||||
|
"font-bold",
|
||||||
|
"text-xs",
|
||||||
|
);
|
||||||
|
button.textContent = "A";
|
||||||
|
if (updateStore.has(name)) {
|
||||||
|
button.classList.add("text-green-600");
|
||||||
|
} else {
|
||||||
|
button.classList.add("text-gray-600");
|
||||||
|
}
|
||||||
|
button.onclick = (ev) => {
|
||||||
|
ev.stopPropagation();
|
||||||
|
if (updateStore.has(name)) {
|
||||||
|
updateStore.delete(name);
|
||||||
|
button.classList.remove("text-green-600");
|
||||||
|
button.classList.add("text-gray-600");
|
||||||
|
} else {
|
||||||
|
updateStore.add(name);
|
||||||
|
button.classList.remove("text-gray-600");
|
||||||
|
button.classList.add("text-green-600");
|
||||||
|
}
|
||||||
|
saveUpdateStore(updateStore);
|
||||||
|
};
|
||||||
|
node.appendChild(button);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
oldList = newList;
|
||||||
|
|
||||||
|
if (自动升级建筑) {
|
||||||
|
if (自动升级所有标签页面) {
|
||||||
|
let currentSubTab = subTabNodes.querySelector(
|
||||||
|
`button[aria-selected=true]`,
|
||||||
|
); // 当前选中的子tab页
|
||||||
|
for (let i = 0; i < subTabNodes.childElementCount; ++i) {
|
||||||
|
const subTabNode = subTabNodes.childNodes[i];
|
||||||
|
if (
|
||||||
|
subTabNode === currentSubTab ||
|
||||||
|
subTabNode.id === "auto-upgrade-all"
|
||||||
|
)
|
||||||
|
continue;
|
||||||
|
subTabNode.click();
|
||||||
|
await sleep(100);
|
||||||
|
for (const node of containerNode.querySelectorAll(`button.btn`)) {
|
||||||
|
if (node.id === "auto-upgrade" || node.id === "auto-upgrade-all")
|
||||||
|
continue;
|
||||||
|
const name = node.firstChild.textContent;
|
||||||
|
if (
|
||||||
|
updateStore.has(name) &&
|
||||||
|
!node.classList.value.includes("btn-off")
|
||||||
|
) {
|
||||||
|
node.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
currentSubTab.click();
|
||||||
|
await sleep(100);
|
||||||
|
}
|
||||||
|
for (const node of containerNode.querySelectorAll(`button.btn`)) {
|
||||||
|
if (node.id === "auto-upgrade" || node.id === "auto-upgrade-all")
|
||||||
|
continue;
|
||||||
|
const name = node.firstChild.textContent;
|
||||||
|
if (updateStore.has(name) && !node.classList.value.includes("btn-off")) {
|
||||||
|
node.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 研究
|
||||||
|
handlers[1] = (tabNode, containerNode) => {
|
||||||
|
const id = "research-all";
|
||||||
|
|
||||||
|
const list = containerNode.querySelectorAll(`button.btn`);
|
||||||
|
for (const node of list) {
|
||||||
|
if (node.id === id) continue;
|
||||||
|
const name = node.firstChild.textContent;
|
||||||
|
if (!node.querySelector("button.btn")) {
|
||||||
|
const button = document.createElement("button");
|
||||||
|
button.classList.add(
|
||||||
|
"-bottom-0",
|
||||||
|
"right-0",
|
||||||
|
"inline-block",
|
||||||
|
"py-px",
|
||||||
|
"px-2",
|
||||||
|
"rounded-full",
|
||||||
|
"font-bold",
|
||||||
|
"text-xs",
|
||||||
|
);
|
||||||
|
button.textContent = "A";
|
||||||
|
if (blackList.has(name)) {
|
||||||
|
button.classList.add("text-gray-600");
|
||||||
|
} else {
|
||||||
|
button.classList.add("text-green-600");
|
||||||
|
}
|
||||||
|
button.onclick = (ev) => {
|
||||||
|
ev.stopPropagation();
|
||||||
|
if (blackList.has(name)) {
|
||||||
|
blackList.delete(name);
|
||||||
|
button.classList.remove("text-gray-600");
|
||||||
|
button.classList.add("text-green-600");
|
||||||
|
} else {
|
||||||
|
blackList.add(name);
|
||||||
|
button.classList.remove("text-green-600");
|
||||||
|
button.classList.add("text-gray-600");
|
||||||
|
}
|
||||||
|
saveBlackList(blackList);
|
||||||
|
};
|
||||||
|
node.appendChild(button);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (containerNode.firstChild.textContent === "ALL") return;
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.id = id;
|
||||||
|
btn.classList.add("btn", "btn-green", "w-full", "mb-2");
|
||||||
|
btn.textContent = "ALL";
|
||||||
|
btn.onclick = () => {
|
||||||
|
for (const node of containerNode.querySelectorAll(`button.btn`)) {
|
||||||
|
if (node.id === id) continue;
|
||||||
|
const name = node.firstChild.textContent;
|
||||||
|
if (blackList.has(name)) continue;
|
||||||
|
if (!node.classList.value.includes("btn-off")) {
|
||||||
|
node.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
containerNode.prepend(btn);
|
||||||
|
};
|
||||||
|
|
||||||
|
// 人口
|
||||||
|
handlers[2] = (tabNode, containerNode) => {
|
||||||
|
if (containerNode.firstChild.id !== "auto-employ") {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.id = "auto-employ";
|
||||||
|
btn.classList.add("btn", "btn-green", "w-full", "mb-2");
|
||||||
|
btn.textContent = "ALL";
|
||||||
|
btn.onclick = () => {
|
||||||
|
for (const jobTitle of containerNode.querySelectorAll(`h5`)) {
|
||||||
|
const job = jobTitle.textContent;
|
||||||
|
if (!blackList.has(job)) {
|
||||||
|
jobTitle.parentNode.parentNode
|
||||||
|
.querySelector(`button.btn.btn-green.shadow-none`)
|
||||||
|
?.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
containerNode.prepend(btn);
|
||||||
|
}
|
||||||
|
for (const jobTitle of containerNode.querySelectorAll(`h5`)) {
|
||||||
|
const job = jobTitle.textContent;
|
||||||
|
let btn;
|
||||||
|
if (jobTitle.parentNode.firstChild.tagName === "BUTTON") {
|
||||||
|
btn = jobTitle.parentNode.firstChild;
|
||||||
|
} else {
|
||||||
|
btn = document.createElement("button");
|
||||||
|
btn.textContent = "A";
|
||||||
|
if (blackList.has(job)) {
|
||||||
|
btn.classList.add("text-gray-600");
|
||||||
|
} else {
|
||||||
|
btn.classList.add("text-green-600");
|
||||||
|
}
|
||||||
|
btn.onclick = () => {
|
||||||
|
if (blackList.has(job)) {
|
||||||
|
blackList.delete(job);
|
||||||
|
btn.classList.remove("text-gray-600");
|
||||||
|
btn.classList.add("text-green-600");
|
||||||
|
} else {
|
||||||
|
blackList.add(job);
|
||||||
|
btn.classList.remove("text-green-600");
|
||||||
|
btn.classList.add("text-gray-600");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
jobTitle.parentNode.prepend(btn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 魔法
|
||||||
|
handlers[3] = (tabNode, containerNode) => {
|
||||||
|
const subTabNodes = containerNode.querySelector(`div[role=tablist]`);
|
||||||
|
const currentSubTab = subTabNodes.querySelector(`button[aria-selected=true]`); // 当前选中的子tab页
|
||||||
|
if (currentSubTab.textContent.includes("咒语")) {
|
||||||
|
咒语已全部激活 = [...containerNode.querySelectorAll(`button.btn`)].every(
|
||||||
|
(node) => node.id === "auto-pray" || node.textContent === "取消咒语",
|
||||||
|
);
|
||||||
|
if (containerNode.firstChild.id === "auto-pray") {
|
||||||
|
containerNode.firstChild.remove();
|
||||||
|
}
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.id = "auto-pray";
|
||||||
|
btn.classList.add("btn", "btn-green", "w-full", "mb-2");
|
||||||
|
btn.textContent = 咒语已全部激活 ? "全部取消" : "全部释放";
|
||||||
|
btn.onclick = () => {
|
||||||
|
const list = containerNode.querySelectorAll(`button.btn`);
|
||||||
|
for (const node of list) {
|
||||||
|
if (node.id === "auto-pray" || node.classList.value.includes("btn-off"))
|
||||||
|
continue;
|
||||||
|
if (!咒语已全部激活 && node.textContent === "取消咒语") continue;
|
||||||
|
node.click();
|
||||||
|
}
|
||||||
|
咒语已全部激活 = !咒语已全部激活;
|
||||||
|
btn.textContent = 咒语已全部激活 ? "全部取消" : "全部释放";
|
||||||
|
};
|
||||||
|
containerNode.prepend(btn);
|
||||||
|
} else if (currentSubTab.textContent.includes("祈祷")) {
|
||||||
|
if (containerNode.firstChild.id === "auto-pray") {
|
||||||
|
containerNode.firstChild.remove();
|
||||||
|
}
|
||||||
|
if (containerNode.querySelector(`button.btn`)) {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.id = "auto-pray";
|
||||||
|
btn.classList.add("btn", "btn-green", "w-full", "mb-2");
|
||||||
|
btn.textContent = "全部祈祷";
|
||||||
|
btn.onclick = () => {
|
||||||
|
const list = containerNode.querySelectorAll(`button.btn`);
|
||||||
|
for (const node of list) {
|
||||||
|
if (
|
||||||
|
node.id === "auto-pray" ||
|
||||||
|
node.classList.value.includes("btn-off")
|
||||||
|
)
|
||||||
|
continue;
|
||||||
|
node.click();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
containerNode.prepend(btn);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 军队
|
||||||
|
handlers[4] = async (tabNode, containerNode) => {
|
||||||
|
const subTabNodes = containerNode.querySelector(`div[role=tablist]`);
|
||||||
|
const currentSubTab = subTabNodes.querySelector(`button[aria-selected=true]`); // 当前选中的子tab页
|
||||||
|
if (currentSubTab.firstChild.textContent === "探索") {
|
||||||
|
const exploreBtn = containerNode.querySelector(`button.btn.btn-blue`);
|
||||||
|
if (exploreBtn) {
|
||||||
|
if (exploreBtn.lastChild.id !== "auto-explore") {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.id = "auto-explore";
|
||||||
|
btn.textContent = "X10";
|
||||||
|
btn.classList.add(
|
||||||
|
"absolute",
|
||||||
|
"-bottom-0",
|
||||||
|
"right-0",
|
||||||
|
"inline-block",
|
||||||
|
"py-px",
|
||||||
|
"px-2",
|
||||||
|
"rounded-full",
|
||||||
|
"font-bold",
|
||||||
|
"text-xs",
|
||||||
|
);
|
||||||
|
btn.onclick = (ev) => {
|
||||||
|
ev.stopPropagation();
|
||||||
|
搜索次数 += 10;
|
||||||
|
};
|
||||||
|
exploreBtn.appendChild(btn);
|
||||||
|
}
|
||||||
|
if (搜索次数 > 0) {
|
||||||
|
exploreBtn.click();
|
||||||
|
搜索次数--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (currentSubTab.firstChild.textContent === "攻击") {
|
||||||
|
const chooseBtn = containerNode.querySelector(`button.btn.btn-dark`);
|
||||||
|
if (chooseBtn && chooseBtn.firstChild.textContent !== "没有敌人可供攻击") {
|
||||||
|
if (chooseBtn.lastChild.id !== "auto-attack") {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.id = "auto-attack";
|
||||||
|
btn.textContent = "ALL";
|
||||||
|
btn.classList.add(
|
||||||
|
"absolute",
|
||||||
|
"-bottom-0",
|
||||||
|
"right-0",
|
||||||
|
"inline-block",
|
||||||
|
"py-px",
|
||||||
|
"px-2",
|
||||||
|
"rounded-full",
|
||||||
|
"font-bold",
|
||||||
|
"text-xs",
|
||||||
|
);
|
||||||
|
btn.onclick = async (ev) => {
|
||||||
|
ev.stopPropagation();
|
||||||
|
chooseBtn.click();
|
||||||
|
await sleep(100);
|
||||||
|
const dialogNode = document.querySelector("#headlessui-portal-root");
|
||||||
|
const enemies = [];
|
||||||
|
let firstEnemy;
|
||||||
|
for (const node of dialogNode.querySelectorAll(`h5`)) {
|
||||||
|
const enemy = node.textContent;
|
||||||
|
if (!firstEnemy) {
|
||||||
|
firstEnemy = node;
|
||||||
|
} else {
|
||||||
|
enemies.push(enemy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (firstEnemy) {
|
||||||
|
firstEnemy.click();
|
||||||
|
await sleep(100);
|
||||||
|
const attackBtn = containerNode.querySelector(`button.btn.btn-red`);
|
||||||
|
attackBtn.click();
|
||||||
|
await sleep(2000);
|
||||||
|
} else {
|
||||||
|
dialogNode.querySelector(".sr-only").parentNode.click();
|
||||||
|
await sleep(100);
|
||||||
|
}
|
||||||
|
await sleep(100);
|
||||||
|
for (const enemy of enemies) {
|
||||||
|
await attack(containerNode, enemy);
|
||||||
|
await sleep(2000);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
chooseBtn.appendChild(btn);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MainStore.ArmyStore._fight("oracle")) {
|
||||||
|
chooseBtn.classList.remove("dark:border-red-700");
|
||||||
|
chooseBtn.classList.add("dark:border-green-700");
|
||||||
|
} else {
|
||||||
|
chooseBtn.classList.remove("dark:border-green-700");
|
||||||
|
chooseBtn.classList.add("dark:border-red-700");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
async function attack(containerNode, name) {
|
||||||
|
const chooseBtn = containerNode.querySelector(`button.btn.btn-dark`);
|
||||||
|
chooseBtn.click();
|
||||||
|
await sleep(100);
|
||||||
|
const dialogNode = document.querySelector("#headlessui-portal-root");
|
||||||
|
for (const node of dialogNode.querySelectorAll(`h5`)) {
|
||||||
|
if (node.textContent === name) {
|
||||||
|
node.click();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await sleep(100);
|
||||||
|
const attackBtn = containerNode.querySelector(`button.btn.btn-red`);
|
||||||
|
attackBtn.click();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 外交
|
||||||
|
handlers[5] = (tabNode, containerNode) => {
|
||||||
|
if (containerNode.firstChild.id !== "auto-improve") {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.id = "auto-improve";
|
||||||
|
btn.classList.add("btn", "w-full", "mb-2");
|
||||||
|
btn.textContent = "A";
|
||||||
|
if (自动结盟) {
|
||||||
|
btn.classList.add("btn-green");
|
||||||
|
} else {
|
||||||
|
btn.classList.add("btn-gray");
|
||||||
|
}
|
||||||
|
btn.onclick = () => {
|
||||||
|
自动结盟 = !自动结盟;
|
||||||
|
if (自动结盟) {
|
||||||
|
btn.classList.remove("btn-gray");
|
||||||
|
btn.classList.add("btn-green");
|
||||||
|
} else {
|
||||||
|
btn.classList.remove("btn-green");
|
||||||
|
btn.classList.add("btn-gray");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
containerNode.prepend(btn);
|
||||||
|
}
|
||||||
|
|
||||||
|
const list = containerNode.querySelectorAll(`button.btn`);
|
||||||
|
if (自动结盟) {
|
||||||
|
for (const node of list) {
|
||||||
|
if (node.id === "auto-improve") continue;
|
||||||
|
if (node.classList.value.includes("btn-off")) continue;
|
||||||
|
if (
|
||||||
|
node.textContent.includes("派出代表团") ||
|
||||||
|
node.textContent.includes("改善关系") ||
|
||||||
|
node.textContent.includes("联盟")
|
||||||
|
) {
|
||||||
|
node.click();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 保存
|
||||||
|
function registerSave() {
|
||||||
|
const dialogNode = document.querySelector("#headlessui-portal-root");
|
||||||
|
if (dialogNode?.querySelector("h3")?.textContent !== "设置") return;
|
||||||
|
if (dialogNode.querySelector(`#save_url`)) return;
|
||||||
|
const importBtn = dialogNode.querySelector(`button.btn.btn-green`);
|
||||||
|
if (!importBtn) return;
|
||||||
|
const urlIpt = document.createElement("input");
|
||||||
|
urlIpt.id = "save_url";
|
||||||
|
urlIpt.type = "url";
|
||||||
|
importBtn.parentNode.appendChild(urlIpt);
|
||||||
|
const uploadBtn = document.createElement("button");
|
||||||
|
uploadBtn.onclick = async () => {
|
||||||
|
const saveString = MainStore.SettingsStore._getSaveString();
|
||||||
|
await fetch(urlIpt.value, { method: "PUT", body: saveString });
|
||||||
|
};
|
||||||
|
importBtn.parentNode.appendChild(uploadBtn);
|
||||||
|
const downloadBtn = document.createElement("button");
|
||||||
|
downloadBtn.onclick = async () => {
|
||||||
|
const res = await fetch(urlIpt.value);
|
||||||
|
const saveString = await res.text();
|
||||||
|
MainStore.SettingsStore.loadFromText(saveString);
|
||||||
|
};
|
||||||
|
importBtn.parentNode.appendChild(downloadBtn);
|
||||||
|
}
|
||||||
|
|
||||||
|
function customFunction(MainStore) {
|
||||||
|
//额外功能
|
||||||
|
if (军队加速) {
|
||||||
|
MainStore.ArmyStore.waitTime /= customSpeed;
|
||||||
|
}
|
||||||
|
if (进攻失败不损失部队) {
|
||||||
|
MainStore.ArmyStore.realDestroyArmy = MainStore.ArmyStore.destroyArmy;
|
||||||
|
MainStore.ArmyStore.destroyArmy = function (...args) {
|
||||||
|
if (!(args[2] == "army" && args[3] != !0)) {
|
||||||
|
return this.realDestroyArmy(...args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sleep(time) {
|
||||||
|
return new Promise((resolve) => {
|
||||||
|
setTimeout(resolve, time);
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user