// ==UserScript== // @name 喵喵插件~ // @namespace https://github.com/jiang-ruo/moescript // @description 游戏《猫国建设者/喵国建设者/Kittens Game》网页自动化插件(就是外挂),可以在页面->选项->MoeScript中开启/关闭自动化功能 // @version 2.0.2 // @author jiang // @author visnz // @match https://likexia.gitee.io/cat-zh/* // @match https://zhaolinxu.github.io/cat-zh/* // @match https://lolitalibrary.com/maomao/* // @match https://kittensgame.com/web/* // @resource dragula_css https://cdn.jsdelivr.net/npm/dragula@3.7.3/dist/dragula.min.css // @grant unsafeWindow // @grant GM_addStyle // @grant GM_getResourceText // @license GPL-3.0 // // @downloadURL https://update.greasyfork.icu/scripts/523304/%E5%96%B5%E5%96%B5%E6%8F%92%E4%BB%B6~.user.js // @updateURL https://update.greasyfork.icu/scripts/523304/%E5%96%B5%E5%96%B5%E6%8F%92%E4%BB%B6~.meta.js // ==/UserScript== // // 附猫国建设者百科:https://lolitalibrary.com/wiki // // 源码可以直接访问上方 @namespace 地址 // frok from: https://github.com/visnz/moescript // 基于@visnz的版本进行了二开,做一些符合个人喜好的改动,以及适配新的网址 // // 下面是声明变量: // game - 页面中自带的game对象 // initGame - 游戏加载完成后,会调用的函数 /* global initGame */ /* global game */ /* global $ */ /* global LZString */ var __defProp = Object.defineProperty; var __typeError = (msg) => { throw TypeError(msg); }; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg); var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj)); var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value); var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value); var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method); var _level, _module, _level2, _module2, _data, _Setting_instances, parseVersion_fn, verTo1_0_fn, verTo2_1_fn, verToLast_fn, _upgradeFn, loadConfig_fn, save_fn, _data2, _observe, _观测天空_instances, activate_fn, _光阴似箭_instances, activate_fn2, run_fn, _option, _selected, _val, _options, _span, _numInput, _config, _打猎_instances, getNumInput_fn, numInputEvent_fn, _config2, _备份助手_instances, activate_fn3, _config3, _classLeft, _classRight, _style, _喵喵职业助手_instances, cat2id_fn, load_fn, delete_fn, addLoader_fn, saveJobs_fn, _loaderBtn, addHtml_fn, activate_fn4, _QueueOptionManager_instances, canRun_fn, _radioInstance, _任务队列_instances, radio_get, _queue, _meta, _id, activate_fn5, deactivate_fn, buildQueue_fn, task2Html_fn, getTaskFromGame_fn, loadData_fn, refreshSelect_fn, refresh_fn, addTask_fn, removeTask_fn, _selected2, _sval, _unit, _uval, _a, _config4, _sourceNum, _span2, _generateNum, _generateSelect, _合成木材_instances, loadHtml_fn, deactivate_fn2, _from, _to, getCraftCount_fn, craft_fn, _selected3, _sval2, _unit2, _uval2, _b, _config5, _sourceNum2, _span3, _generateNum2, _generateSelect2, _合成木梁_instances, loadHtml_fn2, deactivate_fn3, _from2, _to2, _selected4, _sval3, _unit3, _uval3, _c, _config6, _sourceNum3, _span4, _generateNum3, _generateSelect3, _合成石板_instances, loadHtml_fn3, deactivate_fn4, _from3, _to3, _selected5, _sval4, _unit4, _uval4, _d, _config7, _sourceNum4, _span5, _generateNum4, _generateSelect4, _合成金属板_instances, loadHtml_fn4, deactivate_fn5, _from4, _to4, _selected6, _sval5, _unit5, _uval5, _config8, _sourceNum5, _span6, _generateNum5, _generateSelect5, _合成钢_instances, loadHtml_fn5, deactivate_fn6, _fromIron, _fromCoal, _to5, _config9, _numInput2, _container, _打猎后合成羊皮纸_instances, loadHtml_fn6, _from5, _to6, _MoeEventManager_instances, run_fn2, pause_fn, tabRender_fn, import_fn, unlock_fn, hunt_fn, addQueue_fn, _interval, _timers, _Moe_instances, startLoop_fn, stopLoop_fn; const LOG_PREFIX = "喵喵插件~:"; const DEFAULT_LOG_LEVEL = 7; const LOG_TAG = "moeLogger"; class ConsoleLog { constructor(module, level = DEFAULT_LOG_LEVEL) { __privateAdd(this, _level); //@ts-ignore - 忽略该变量未使用的问题。 __privateAdd(this, _module); __privateSet(this, _level, level ?? DEFAULT_LOG_LEVEL); __privateSet(this, _module, module); } error(...logs) { if (__privateGet(this, _level) < 1) return; console.error(LOG_PREFIX, ...logs); } warn(...logs) { if (__privateGet(this, _level) < 2) return; console.warn(LOG_PREFIX, ...logs); } info(...logs) { if (__privateGet(this, _level) < 3) return; console.log(LOG_PREFIX, ...logs); } http(...logs) { if (__privateGet(this, _level) < 4) return; this.info(...logs); } verbose(...logs) { if (__privateGet(this, _level) < 5) return; this.http(...logs); } debug(...logs) { if (__privateGet(this, _level) < 6) return; console.debug(LOG_PREFIX, ...logs); } silly(...logs) { if (__privateGet(this, _level) < 7) return; this.debug(...logs); } } _level = new WeakMap(); _module = new WeakMap(); class MoeLog { constructor(module, level = DEFAULT_LOG_LEVEL) { __privateAdd(this, _level2); //@ts-ignore - 忽略该变量未使用的问题。 __privateAdd(this, _module2); __privateSet(this, _level2, level ?? DEFAULT_LOG_LEVEL); __privateSet(this, _module2, module); } error(msg, noBullet = false) { if (__privateGet(this, _level2) < 1) return; game.msg(msg, "alert", LOG_TAG, noBullet); } warn(msg, noBullet = false) { if (__privateGet(this, _level2) < 2) return; game.msg(msg, "important", LOG_TAG, noBullet); } info(msg, noBullet = false) { if (__privateGet(this, _level2) < 3) return; game.msg(msg, "default", LOG_TAG, noBullet); } http(msg, noBullet = false) { if (__privateGet(this, _level2) < 4) return; this.info(msg, noBullet); } verbose(msg, noBullet = false) { if (__privateGet(this, _level2) < 5) return; this.http(msg, noBullet); } debug(msg, noBullet = false) { if (__privateGet(this, _level2) < 6) return; game.msg(msg, "notice", LOG_TAG, noBullet); } silly(msg, noBullet = false) { if (__privateGet(this, _level2) < 7) return; game.msg(msg, "urgent", LOG_TAG, noBullet); } } _level2 = new WeakMap(); _module2 = new WeakMap(); function getLogger(module, type = "console", option2) { if (type === "moe") { return new MoeLog(module, option2 == null ? void 0 : option2.level); } else { return new ConsoleLog(module, option2 == null ? void 0 : option2.level); } } const VERSION = "2.0.2"; const log$8 = getLogger("store", "console"); const STORAGE_KEY = "com.nuclearunicorn.kittengame.plugin.moe"; class Setting { constructor() { __privateAdd(this, _Setting_instances); /** * 插件的所有缓存数据 */ __publicField(this, "config", { flags: {}, version: VERSION, save: [] }); /** * 当前游戏存档对应的缓存数据 */ __privateAdd(this, _data, { guid: "", time: Date.now(), flags: {} }); __privateAdd(this, _upgradeFn, [ __privateMethod(this, _Setting_instances, verTo1_0_fn), __privateMethod(this, _Setting_instances, verTo2_1_fn), __privateMethod(this, _Setting_instances, verToLast_fn) ]); } init(game2, options) { __privateMethod(this, _Setting_instances, loadConfig_fn).call(this, game2); const crossFlag = options.map((opt) => opt.crossSaver ? opt.flag : void 0).filter((flag) => flag !== void 0); for (const flag of Object.keys(this.config.flags)) { log$8.debug("include:", crossFlag.includes(flag)); if (!crossFlag.includes(flag)) { delete this.config.flags[flag]; } } const flags = options.map((opt) => !opt.crossSaver ? opt.flag : void 0).filter((flag) => flag !== void 0); for (const flag of Object.keys(__privateGet(this, _data).flags)) { log$8.debug("include:", flags.includes(flag)); if (!flags.includes(flag)) { delete __privateGet(this, _data).flags[flag]; } } log$8.debug("config:", this.config); __privateMethod(this, _Setting_instances, save_fn).call(this); } /** * * @param flag * @returns undefined - 该flag未定义 */ flag(flag) { if (flag in this.config.flags) return this.config.flags[flag]; return __privateGet(this, _data).flags[flag]; } set(flag, value, crossSaver) { if (value === void 0) { this.del(flag, crossSaver); } else { if (crossSaver) { this.config.flags[flag] = value; } else { __privateGet(this, _data).flags[flag] = value; } log$8.debug(`设置${crossSaver ? "跨存档" : "当前存档"}选项 ${flag}:`, value); __privateMethod(this, _Setting_instances, save_fn).call(this); } } del(flag, crossSaver) { if (crossSaver) { delete this.config.flags[flag]; } else { delete __privateGet(this, _data).flags[flag]; } log$8.debug(`删除${crossSaver ? "跨存档" : "当前存档"}选项 ${flag}`); __privateMethod(this, _Setting_instances, save_fn).call(this); } } _data = new WeakMap(); _Setting_instances = new WeakSet(); parseVersion_fn = function(version) { if (!version) return 0; const [major, minor, _] = version.split("."); return Number.parseFloat(`${major}.${minor}`); }; /** * 游戏存档升级到1.0 */ verTo1_0_fn = function(sver, game2) { if (sver < 1) { log$8.debug("升级存档到1.0.x版本:", this.config); const config = { flags: this.config.flags, version: "1.0.0", save: [{ guid: game2.telemetry.guid, time: Date.now(), flags: JSON.parse(JSON.stringify(this.config.flags)) }] }; this.config = config; } }; /** * 游戏存档升级到2.1 */ verTo2_1_fn = function(sver) { if (sver < 2.1) { log$8.debug("升级存档到2.0.x版本:", this.config); for (const flag of Object.keys(this.config.flags)) { const val = this.config.flags[flag]; if (typeof val === "boolean") { this.config.flags[flag] = { activate: val }; } } for (const save of this.config.save) { for (const flag of Object.keys(save.flags)) { const val = save.flags[flag]; if (typeof val === "boolean") { save.flags[flag] = { activate: val }; } } } this.config.version = "2.1.0"; } }; /** * 版本无实质性变动,仅修改版本号 */ verToLast_fn = function(sver) { if (sver < __privateMethod(this, _Setting_instances, parseVersion_fn).call(this, VERSION)) { this.config.version = VERSION; } }; _upgradeFn = new WeakMap(); loadConfig_fn = function(game2) { const configStr = localStorage.getItem(STORAGE_KEY); let hasSave = false; if (configStr) { this.config = JSON.parse(configStr); const sver = __privateMethod(this, _Setting_instances, parseVersion_fn).call(this, this.config.version); if (sver < __privateMethod(this, _Setting_instances, parseVersion_fn).call(this, VERSION)) { for (const fn of __privateGet(this, _upgradeFn)) { fn.call(this, sver, game2); } } const saves = this.config.save; const year = 365 * 24 * 60 * 60 * 1e3; for (let i = saves.length - 1; i >= 0; i--) { const save = saves[i]; if (save.guid === game2.telemetry.guid) { hasSave = true; save.time = Date.now(); __privateSet(this, _data, save); } else { if (Date.now() - save.time > year) { saves.splice(saves.indexOf(save), 1); } } } } log$8.debug("hasSave:", hasSave); if (!hasSave) { __privateGet(this, _data).guid = game2.telemetry.guid; this.config.save.push(__privateGet(this, _data)); } }; save_fn = function() { localStorage.setItem(STORAGE_KEY, JSON.stringify(this.config)); }; const setting = new Setting(); const log$7 = getLogger("view", "console"); const moe$e = getLogger("view", "moe"); class Option { } __publicField(Option, "ALL_CLASS", "moe-moescript"); __publicField(Option, "CLASS_PREFIX", "moe-moescript-"); __publicField(Option, "ID_PREFIX", "moe-"); const _MoeDomImpl = class _MoeDomImpl { constructor(dom) { /** * 当前DOM节点本身 */ __publicField(this, "ele"); // [key in K]: Node | undefined; __privateAdd(this, _data2, {}); this.ele = dom; } set(key, value) { __privateGet(this, _data2)[key] = value; if (!_MoeDomImpl.fields.includes(key)) { Object.defineProperty(this, key, { get: () => __privateGet(this, _data2)[key] }); } } get(key) { return __privateGet(this, _data2)[key]; } }; _data2 = new WeakMap(); // 定义这个类的属性 __publicField(_MoeDomImpl, "fields", ["ele", "get", "set"]); let MoeDomImpl = _MoeDomImpl; function createMoeDom(dom) { return new MoeDomImpl(dom); } var view; ((view2) => { var _sec; let initialized = false; function init() { const OPTION_STYLES = ` .moe-tabs-header { border-bottom: 1px solid #999; margin-bottom: 15px; } .moe-tab { display: inline-block; padding: 5px 15px; margin-right: 5px; text-decoration: none; color: inherit; } .moe-tab.moe-active { border: 1px solid #999; border-bottom: none; background: #fff; } `; GM_addStyle(OPTION_STYLES); const optionsDiv = $("#optionsDiv"); const tabsHtmlPrefix = ` 关闭
游戏选项 ${NAME}
`; const tabsHtmlInner = `
`; const tabsHtmlSuffix = ` `; optionsDiv.wrapInner(tabsHtmlInner); optionsDiv.prepend(tabsHtmlPrefix); optionsDiv.append(tabsHtmlSuffix); $(".moe-tab").on("click", function(e) { e.preventDefault(); const targetTab = $(this).data("tab"); $(".moe-tab").removeClass("moe-active"); $(this).addClass("moe-active"); $(".moe-tab-content").hide(); $(`#${targetTab}Tab`).show(); }); initialized = true; } view2.init = init; class ViewInterval { constructor() { __privateAdd(this, _sec, {}); } // #min: {[key: string]: Option[]} = {}; addOption(opt) { if (!(opt.script && opt.period)) return; __privateGet(this, _sec)[opt.flag] = { time: opt.period.sec(), opt }; } removeOption(opt) { if (typeof opt === "string") { delete __privateGet(this, _sec)[opt]; } else { delete __privateGet(this, _sec)[opt.flag]; } } sec() { return () => { const flags = Object.keys(__privateGet(this, _sec)); for (const flag of flags) { const opt = __privateGet(this, _sec)[flag]; if (!opt) continue; opt.time--; if (opt.time > 0) continue; opt.time = opt.opt.period.sec(); opt.opt.script(); } }; } } _sec = new WeakMap(); view2.optionInterval = new ViewInterval(); function addOptions(options) { if (!initialized) { log$7.error("视图未初始化,请先调用view.init()"); } const optionMap = {}; for (const opt of options) { if (!optionMap[opt.panel]) { optionMap[opt.panel] = []; } optionMap[opt.panel].push(opt); } const moeTab = $("#moe-moeTab"); const flags = []; for (const panel in optionMap) { const opts = optionMap[panel].sort((a, b) => (a.index ?? 9999) - (b.index ?? 9999)); const doms = []; for (const opt of opts) { if (flags.includes(opt.flag)) { moe$e.error(`功能【${opt.name}】无法运行,存在同名缓存键: flag = ${opt.flag}`); continue; } else { flags.push(opt.flag); } const sval = setting.flag(opt.flag); log$7.debug(`选项【${opt.name}】的flag: ${opt.flag},值:`, sval); const p = $(`

`); const dom = opt.dom(sval, (config, option2) => { if (!(option2 == null ? void 0 : option2.justUpdate)) { if (config == null ? void 0 : config.activate) { moe$e.info(`开启选项【${opt.name}】${opt.description.activate}`); view2.optionInterval.addOption(opt); } else { moe$e.info(`关闭选项【${opt.name}】${opt.description.deactivate}`); view2.optionInterval.removeOption(opt.flag); } } setting.set(opt.flag, config, opt.crossSaver ?? false); }); p.append(dom); doms.push(p); if (sval == null ? void 0 : sval.activate) { view2.optionInterval.addOption(opt); } } const div = $(`
`).append(doms); const paneldiv = $(`

${panel}

`).append(div); moeTab.append(paneldiv); } return view2.optionInterval; } view2.addOptions = addOptions; })(view || (view = {})); class RadioComponent { constructor(option2) { __publicField(this, "dom"); __publicField(this, "update", (option2) => { this.update.label = option2.label; }); const span = $(``); const label = document.createTextNode((option2 == null ? void 0 : option2.label) ?? ""); span.append(label); this.dom = createMoeDom(span.get(0)); this.dom.set("label", label); const input = span.find("input"); this.dom.set("input", input.get(0)); Object.defineProperty(this.update, "label", { get: () => this.dom.label.nodeValue, set: (label2) => { this.dom.label.nodeValue = label2 ?? ""; } }); } get $dom() { return $(this.dom.ele); } get val() { return $(this.dom.input).is(":checked"); } set val(val) { $(this.dom.input).prop("checked", val); } create(config, callback) { const input = $(this.dom.input); input.prop("checked", config ?? false); input.on("change", (e) => { const activate = $(e.currentTarget).is(":checked"); callback(activate); }); return this.$dom; } } const log$6 = getLogger("option/观测天空", "console"); const moe$d = getLogger("option/观测天空", "moe"); class 观测天空 { constructor() { __privateAdd(this, _观测天空_instances); __publicField(this, "index"); __publicField(this, "panel", "杂项"); __publicField(this, "name", "自动观测天文现象"); __publicField(this, "condition"); __publicField(this, "description", { activate: "出现天文事件时将会自动观测天空", deactivate: "停止自动观测天空" }); __publicField(this, "flag", "观测天空"); __publicField(this, "crossSaver", true); __privateAdd(this, _observe); __publicField(this, "period"); __publicField(this, "script"); } dom(config, callback) { if (config == null ? void 0 : config.activate) __privateMethod(this, _观测天空_instances, activate_fn).call(this); return new RadioComponent({ label: this.name }).create(config == null ? void 0 : config.activate, (acti) => { var _a2; if (acti) { __privateMethod(this, _观测天空_instances, activate_fn).call(this); } else { (_a2 = __privateGet(this, _observe)) == null ? void 0 : _a2.disconnect(); __privateSet(this, _observe, void 0); } callback({ activate: acti }); }); } } _observe = new WeakMap(); _观测天空_instances = new WeakSet(); /** * 选项开启时,进行事件绑定。 */ activate_fn = function() { if (__privateGet(this, _observe)) return; __privateSet(this, _observe, new MutationObserver((mutations) => { if (mutations.length === 0) { log$6.warn("$('#observeButton') MutationObserver没有检测到任何变化!!!"); } else { if (mutations.length > 2) { log$6.info(`$('#observeButton') mutations数量: ${mutations.length}`); moe$d.error("异常情况,mutatioin大于2,请注意检查"); log$6.info("mutation:", mutations); } for (const mutation of mutations) { if (mutation.type === "childList") { const length = mutation.addedNodes.length; if (length > 0) { if (length > 1) { moe$d.error("异常情况,addNodes数量大于1"); log$6.info("mutation: ", mutation); } const game2 = Moe.getInstance().game; if (!game2.calendar.observeBtn) { moe$d.error("脚本异常,为检测到观测天空按钮"); } else { setTimeout(() => { moe$d.debug(`检测到天空中出现一种罕见的天文现象,自动进行“观测天空”操作`); game2.calendar.observeHandler(); }, 2e3); } } } } } })); __privateGet(this, _observe).observe($("#observeButton")[0], { childList: true, // 监听子节点变化 subtree: false, // 不监听子节点的子节点 attributes: false, // 不监听属性变化 characterData: false // 不监听文本内容变化 }); }; const option$c = new 观测天空(); const moe$c = getLogger("option/光阴似箭", "moe"); class 光阴似箭 { constructor() { __privateAdd(this, _光阴似箭_instances); __publicField(this, "index"); __publicField(this, "panel", "时间"); __publicField(this, "name", "自动开启【光阴似箭】"); __publicField(this, "condition", { science: ["calendar"] }); __publicField(this, "description", { activate: "进入游戏或暂停恢复时,自动开启【光阴似箭】", deactivate: "" }); __publicField(this, "flag", "光阴似箭"); __publicField(this, "crossSaver", true); __publicField(this, "period"); __publicField(this, "script"); } dom(config, callback) { if (config == null ? void 0 : config.activate) __privateMethod(this, _光阴似箭_instances, activate_fn2).call(this); return new RadioComponent({ label: this.name }).create(config == null ? void 0 : config.activate, (activate) => { callback({ activate }); if (activate) { __privateMethod(this, _光阴似箭_instances, activate_fn2).call(this); } else { const event = Moe.getInstance().event.off; event.pause(this.flag); event.import(this.flag); } }); } } _光阴似箭_instances = new WeakSet(); /** * 选项开启时,进行事件绑定。 */ activate_fn2 = function() { __privateMethod(this, _光阴似箭_instances, run_fn).call(this); const event = Moe.getInstance().event.on; event.pause(this.flag, (isPaused) => { if (!isPaused) __privateMethod(this, _光阴似箭_instances, run_fn).call(this); }); event.import(this.flag, () => { __privateMethod(this, _光阴似箭_instances, run_fn).call(this); }); }; /** * 执行加速功能 */ run_fn = function() { const game2 = Moe.getInstance().game; if (!game2.science.get("calendar").researched) return; if (game2.time.isAccelerated) return; if (game2.isPaused) return; if (game2.resPool.get("temporalFlux").value < 5) return; game2.time.isAccelerated = true; moe$c.debug("开启【光阴似箭】"); }; const option$b = new 光阴似箭(); const sec = (s) => s * 1e3; const min = (m) => m * sec(60); const hour = (h) => h * min(60); const day = (d) => d * hour(24); const __sec_for_timeobj = sec; const __min_for_timeobj = min; const __hour_for_timeobj = hour; const __day_for_timeobj = day; var timeobj; ((timeobj2) => { class Time { constructor(time) { __publicField(this, "__time"); this.__time = time; } /** * 返回时间的类型 */ get type() { return this.constructor.name; } /** * * @param digits 保留digits位小数 */ sec(digits = 0) { const sec3 = this.time / 1e3; if (digits > 0) { const secfixed = sec3.toFixed(digits); const secfloat = Number.parseFloat(secfixed); return secfloat; } else { return Math.round(sec3); } } min(digits = 0) { const min3 = this.sec() / 60; if (digits > 0) { const minfixed = min3.toFixed(digits); const minfloat = Number.parseFloat(minfixed); return minfloat; } else { return Math.round(min3); } } hour(digits = 0) { const hour3 = this.min() / 60; if (digits > 0) { const hourfixed = hour3.toFixed(digits); const hourfloat = Number.parseFloat(hourfixed); return hourfloat; } else { return Math.round(hour3); } } day(digits = 0) { const day3 = this.hour() / 24; if (digits > 0) { const dayfixed = day3.toFixed(digits); const dayfloat = Number.parseFloat(dayfixed); return dayfloat; } else { return Math.round(day3); } } } timeobj2.Time = Time; class Sec extends Time { constructor(s) { super(s); } get time() { return __sec_for_timeobj(this.__time); } } timeobj2.Sec = Sec; class Min extends Time { constructor(m) { super(m); } get time() { return __min_for_timeobj(this.__time); } } timeobj2.Min = Min; class Hour extends Time { constructor(h) { super(h); } get time() { return __hour_for_timeobj(this.__time); } } timeobj2.Hour = Hour; class Day extends Time { constructor(d) { super(d); } get time() { return __day_for_timeobj(this.__time); } } timeobj2.Day = Day; timeobj2.sec = (s) => new Sec(s); timeobj2.min = (m) => new Min(m); timeobj2.hour = (h) => new Hour(h); timeobj2.day = (d) => new Day(d); })(timeobj || (timeobj = {})); const moe$b = getLogger("src/option/component/Select"); class SelectComponent { constructor(options, option2) { __publicField(this, "dom"); __publicField(this, "update", (option2) => { this.update.prelabel = option2.prelabel; this.update.label = option2.label; this.update.options = option2.options; }); const prelabel = document.createTextNode((option2 == null ? void 0 : option2.prelabel) ?? ""); const label = document.createTextNode((option2 == null ? void 0 : option2.label) ?? ""); const select = $(``); const dom = $(``).append(prelabel, select, label); this.dom = createMoeDom(dom.get(0)); this.dom.set("prelabel", prelabel); this.dom.set("label", label); this.dom.set("select", select.get(0)); Object.defineProperty(this.update, "prelabel", { get: () => this.dom.prelabel.nodeValue, set: (prelabel2) => { this.dom.prelabel.nodeValue = prelabel2 ?? ""; } }); Object.defineProperty(this.update, "label", { get: () => this.dom.label.nodeValue, set: (label2) => { this.dom.label.nodeValue = label2 ?? ""; } }); Object.defineProperty(this.update, "options", { get: () => { const opts = []; const soptions = $(this.dom.select).find("option"); for (const option22 of soptions) { opts.push({ value: $(option22).val(), name: $(option22).text(), disable: $(option22).is(":disabled") }); } return opts; }, set: (options2) => { const select2 = $(this.dom.select); select2.empty(); if (!options2 || options2.length === 0) return; let optHtml = ""; for (const option22 of options2) { const disable = option22.disable ? "disabled" : ""; optHtml += ``; } select2.append(optHtml); select2.prop("selectedIndex", 0); } }); this.update.options = options; } get $dom() { return $(this.dom.ele); } get val() { return $(this.dom.select).val(); } /** * @param value K - 选项的value值 * @param value number - 选项的index值 */ set val(value) { const select = $(this.dom.select); if (value === void 0) { select.prop("selectedIndex", -1); return; } if (typeof value === "number") { const opts = select.find("option"); if (value < 0 || value >= opts.length) { const error = `SelectCompoent: 不存在第[${value}]个选项`; moe$b.error(error); throw new Error(error); } select.prop("selectedIndex", value); } else if (typeof value === "string") { select.val(value); } } create(config, callback) { const select = $(this.dom.select); this.val = config; select.on("change", (e) => { const selectElem = e.currentTarget; const select2 = selectElem.value; callback(select2); }); return this.$dom; } } class NumInputComponent { constructor(option2) { /** * input的最大最小值 */ __privateAdd(this, _option); __publicField(this, "dom"); __publicField(this, "update", (option2) => { this.update.min = option2.min; this.update.max = option2.max; this.update.step = option2.step; this.update.prelabel = option2.prelabel; this.update.label = option2.label; }); var _a2, _b2; __privateSet(this, _option, option2 ?? {}); const prelabel = document.createTextNode((option2 == null ? void 0 : option2.prelabel) ?? ""); const label = document.createTextNode((option2 == null ? void 0 : option2.label) ?? ""); const rangePrefx = document.createTextNode("["); const rangeMin = document.createTextNode(((_a2 = option2 == null ? void 0 : option2.min) == null ? void 0 : _a2.toString()) ?? "-∞"); const rangeMid = document.createTextNode(", "); const rangeMax = document.createTextNode(((_b2 = option2 == null ? void 0 : option2.max) == null ? void 0 : _b2.toString()) ?? "+∞"); const rangeSuffix = document.createTextNode("]"); const range = $(``).append(rangePrefx, rangeMin, rangeMid, rangeMax, rangeSuffix); const inputHtml = ``; const input = $(inputHtml); const dom = $(``).append(prelabel, input, label, range); this.dom = createMoeDom(dom.get(0)); this.dom.set("prelabel", prelabel); this.dom.set("label", label); this.dom.set("min", rangeMin); this.dom.set("max", rangeMax); this.dom.set("input", input.get(0)); Object.defineProperty(this.update, "min", { get: () => { var _a3; return (_a3 = __privateGet(this, _option)) == null ? void 0 : _a3.min; }, set: (min2) => { __privateGet(this, _option)["min"] = min2; $(this.dom.input).attr("min", (min2 == null ? void 0 : min2.toString()) ?? ""); this.dom.min.nodeValue = (min2 == null ? void 0 : min2.toString()) ?? ""; } }); Object.defineProperty(this.update, "max", { get: () => { var _a3; return (_a3 = __privateGet(this, _option)) == null ? void 0 : _a3.max; }, set: (max) => { __privateGet(this, _option)["max"] = max; $(this.dom.input).attr("max", (max == null ? void 0 : max.toString()) ?? ""); this.dom.max.nodeValue = (max == null ? void 0 : max.toString()) ?? ""; } }); Object.defineProperty(this.update, "step", { get: () => $(this.dom.input).attr("step"), set: (step) => { $(this.dom.input).attr("step", (step == null ? void 0 : step.toString()) ?? ""); } }); Object.defineProperty(this.update, "prelabel", { get: () => this.dom.prelabel.nodeValue, set: (prelabel2) => { this.dom.prelabel.nodeValue = prelabel2 ?? ""; } }); Object.defineProperty(this.update, "label", { get: () => this.dom.label.nodeValue, set: (label2) => { this.dom.label.nodeValue = label2 ?? ""; } }); } get $dom() { return $(this.dom.ele); } get val() { const input = $(this.dom.input); const val = Number(input.val()); if (isNaN(val)) { return NaN; } return val; } set val(value) { var _a2, _b2; const input = $(this.dom.input); if (value === void 0 || isNaN(value)) { input.val(""); return; } if (((_a2 = __privateGet(this, _option)) == null ? void 0 : _a2.min) && value < __privateGet(this, _option).min) { value = __privateGet(this, _option).min; } if (((_b2 = __privateGet(this, _option)) == null ? void 0 : _b2.max) && value > __privateGet(this, _option).max) { value = __privateGet(this, _option).max; } input.val(value.toString()); } create(config, callback) { const input = $(this.dom.input); this.val = config; input.on("change", () => { var _a2, _b2; const value = this.val; if (isNaN(value)) { callback(NaN); } else { let val = value; if (((_a2 = __privateGet(this, _option)) == null ? void 0 : _a2.min) && value < __privateGet(this, _option).min) { val = __privateGet(this, _option).min; } if (((_b2 = __privateGet(this, _option)) == null ? void 0 : _b2.max) && value > __privateGet(this, _option).max) { val = __privateGet(this, _option).max; } callback(val); } }); return this.$dom; } } _option = new WeakMap(); const log$5 = getLogger("option/打猎", "console"); const moe$a = getLogger("option/打猎", "moe"); class 打猎Description { constructor(selected, val) { __privateAdd(this, _selected); __privateAdd(this, _val); __publicField(this, "deactivate", "停止自动打猎"); __privateSet(this, _selected, selected); __privateSet(this, _val, val); } get activate() { const selected = __privateGet(this, _selected).call(this); if (selected === void 0) return ""; const val = __privateGet(this, _val).call(this); if (selected === "threshold") { return `喵力达到${val}%时派出所有猎人`; } else if (selected === "number") { return `可派出${val}次猎人时派出所有猎人`; } throw new Error("未设置打猎方式"); } } _selected = new WeakMap(); _val = new WeakMap(); const DEFAULT_ACTIVATE = Object.freeze({ activate: false, lastThreshold: 95, lastNumber: 1 }); class 打猎 { constructor() { __privateAdd(this, _打猎_instances); __publicField(this, "index"); __publicField(this, "panel", "杂项"); __publicField(this, "name", "自动打猎"); __publicField(this, "condition", { // 箭术 science: ["archery"] }); __publicField(this, "flag", "打猎"); __publicField(this, "crossSaver", true); __privateAdd(this, _options, [ { value: "", name: "" }, { value: "threshold", name: "按喵力阈值" }, { value: "number", name: "按打猎次数" } ]); __privateAdd(this, _span); __privateAdd(this, _numInput); __privateAdd(this, _config, { activate: false }); __publicField(this, "description", new 打猎Description(() => { var _a2; return (_a2 = __privateGet(this, _config)) == null ? void 0 : _a2.select; }, () => { var _a2; return (_a2 = __privateGet(this, _config)) == null ? void 0 : _a2.val; })); __publicField(this, "period", timeobj.min(1)); /** * TODO 计算喵力占喵力上限的百分比resMap[manpower] = res.value / res.maxValue * TODO 后续添加一个选项,用于平衡贸易和打猎 */ __publicField(this, "script", () => { if (!__privateGet(this, _config).activate) return false; const game2 = Moe.getInstance().game; const res = game2.resPool.get("manpower"); const val = __privateGet(this, _config).val; const huntNum = Math.floor(res.value / 100); let isdo = false; let msg = ""; if (__privateGet(this, _config).select === "threshold") { const threshold = +(res.value / res.maxValue * 100).toFixed(1); isdo = threshold >= val; msg = `喵力(${threshold}%)达到阈值(${val}%),执行打猎`; } else { isdo = huntNum >= val; msg = `可打猎次数(${huntNum})已达到设定值(${val}),执行打猎`; } if (isdo) { moe$a.debug(msg); game2.village.huntAll(); } return true; }); } /** * * @param config * @param callback * @returns */ dom(config, callback) { __privateSet(this, _config, config ? config : JSON.parse(JSON.stringify(DEFAULT_ACTIVATE))); const select = new SelectComponent(__privateGet(this, _options), { label: this.name }).create((config == null ? void 0 : config.select) ?? "", (select2) => { if (__privateGet(this, _config).select === "threshold") { __privateGet(this, _config).lastThreshold = __privateGet(this, _config).val; } else if (__privateGet(this, _config).select === "number") { __privateGet(this, _config).lastNumber = __privateGet(this, _config).val; } if (!select2) { delete __privateGet(this, _config).select; __privateGet(this, _config).activate = false; } else { if (select2 === "threshold") { __privateGet(this, _config).val = __privateGet(this, _config).lastThreshold; } else if (select2 === "number") { __privateGet(this, _config).val = __privateGet(this, _config).lastNumber; } __privateGet(this, _config).activate = true; __privateGet(this, _config).select = select2; } log$5.debug("打猎.bind:this.#config:", __privateGet(this, _config)); __privateMethod(this, _打猎_instances, numInputEvent_fn).call(this, callback); callback(JSON.parse(JSON.stringify(__privateGet(this, _config)))); }); const span = $(``); const dom = select.add(span); __privateSet(this, _span, span); __privateMethod(this, _打猎_instances, numInputEvent_fn).call(this, callback); return dom; } } _options = new WeakMap(); _span = new WeakMap(); _numInput = new WeakMap(); _config = new WeakMap(); _打猎_instances = new WeakSet(); getNumInput_fn = function() { if (!__privateGet(this, _config).activate) return; if (__privateGet(this, _config).select === "threshold") { return new NumInputComponent({ min: 1, max: 100, step: 1 }); } else if (__privateGet(this, _config).select === "number") { return new NumInputComponent({ min: 1, step: 1 }); } return; }; /** * 根据选择事件修改inputHtml */ numInputEvent_fn = function(callback) { const dom = __privateGet(this, _span); dom.empty(); __privateSet(this, _numInput, __privateMethod(this, _打猎_instances, getNumInput_fn).call(this)); if (!__privateGet(this, _config).activate) return; log$5.debug("渲染打猎数字框,配置: ", __privateGet(this, _config)); dom.append(__privateGet(this, _numInput).create(__privateGet(this, _config).val, (val) => { __privateGet(this, _config).val = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config)))); })); }; const option$a = new 打猎(); const moe$9 = getLogger("option/备份助手", "moe"); class 备份助手 { constructor() { __privateAdd(this, _备份助手_instances); __publicField(this, "panel", "杂项"); __publicField(this, "name", "快捷备份"); __publicField(this, "condition"); __publicField(this, "description", { activate: "在上方添加【保存备份】【导入备份】按钮", deactivate: "已恢复游戏页面" }); __publicField(this, "flag", "备份"); __publicField(this, "crossSaver", true); __privateAdd(this, _config2, { activate: false, save: "" }); } dom(config, callback) { if (config) __privateSet(this, _config2, config); const actcallback = (save) => { __privateGet(this, _config2).save = save; callback(JSON.parse(JSON.stringify(__privateGet(this, _config2))), { justUpdate: true }); }; if (config == null ? void 0 : config.activate) __privateMethod(this, _备份助手_instances, activate_fn3).call(this, actcallback); return new RadioComponent({ label: this.name }).create(config == null ? void 0 : config.activate, (activate) => { if (activate) { __privateGet(this, _config2).activate = true; __privateMethod(this, _备份助手_instances, activate_fn3).call(this, actcallback); } else { __privateGet(this, _config2).activate = false; $(`#${Option.ID_PREFIX}${this.flag}backup`).remove(); $(`#${Option.ID_PREFIX}${this.flag}import`).remove(); } callback(JSON.parse(JSON.stringify(__privateGet(this, _config2)))); }); } } _config2 = new WeakMap(); _备份助手_instances = new WeakSet(); activate_fn3 = function(callback) { $("#topBar .links-block").prepend(` 保存备份 | 导入备份 | `); $(`#${Option.ID_PREFIX}${this.flag}backup a`).on("click", () => { const moegame = Moe.getInstance(); callback(moegame.event.save(), true); moe$9.debug("已成功备份游戏存档!"); }); $(`#${Option.ID_PREFIX}${this.flag}import a`).on("click", () => { if (!__privateGet(this, _config2).save) { alert("请先备份游戏数据,才能使用进行导入功能"); return; } const game2 = Moe.getInstance().game; game2.saveImport(__privateGet(this, _config2).save); moe$9.debug("已成功导入备份的游戏存档!"); }); }; const option$9 = new 备份助手(); class TextInputComponent { constructor(option2) { __publicField(this, "dom"); __publicField(this, "update", (option2) => { this.update.placeholder = option2.placeholder; this.update.prelabel = option2.prelabel; this.update.label = option2.label; }); const prelabel = document.createTextNode((option2 == null ? void 0 : option2.prelabel) ?? ""); const label = document.createTextNode((option2 == null ? void 0 : option2.label) ?? ""); const input = $(``); const dom = $(``).append(prelabel, input, label); this.dom = createMoeDom(dom.get(0)); this.dom.set("prelabel", prelabel); this.dom.set("label", label); this.dom.set("input", input.get(0)); Object.defineProperty(this.update, "prelabel", { get: () => this.dom.prelabel.nodeValue, set: (prelabel2) => { this.dom.prelabel.nodeValue = prelabel2 ?? ""; } }); Object.defineProperty(this.update, "label", { get: () => this.dom.label.nodeValue, set: (label2) => { this.dom.label.nodeValue = label2 ?? ""; } }); Object.defineProperty(this.update, "placeholder", { get: () => $(this.dom.input).attr("placeholder"), set: (placeholder) => { $(this.dom.input).attr("placeholder", placeholder ?? ""); } }); } get $dom() { return $(this.dom.ele); } get val() { const val = $(this.dom.input).val(); return val; } set val(value) { const input = $(this.dom.input); input.val(value ?? ""); } create(config, callback) { const input = $(this.dom.input); input.val(config ?? ""); input.on("change", (e) => { const val = $(e.currentTarget).val(); callback(val ?? ""); }); return this.$dom; } } function compress(data) { return LZString.compressToBase64(data); } function decompress(data) { return LZString.decompressFromBase64(data); } const moe$8 = getLogger("option/喵喵职业助手", "moe"); const log$4 = getLogger("option/喵喵职业助手", "console"); class 喵喵职业助手 { constructor() { __privateAdd(this, _喵喵职业助手_instances); __publicField(this, "panel", "杂项"); __publicField(this, "name", "喵喵职业管理助手"); __publicField(this, "condition", { tab: ["Village"] }); __publicField(this, "description", { get activate() { const game2 = Moe.getInstance().game; const villageName = game2.villageTab.tabName; return `请到【${villageName}】中查看`; }, deactivate: "已保存的职业分配数据不会删除" }); __publicField(this, "flag", "喵喵职业助手"); __publicField(this, "crossSaver"); __privateAdd(this, _config3, { activate: false, save: [] }); __privateAdd(this, _classLeft, `${Option.CLASS_PREFIX}${this.flag}-job-panel-left`); __privateAdd(this, _classRight, `${Option.CLASS_PREFIX}${this.flag}-right`); // 因为游戏的contentDiv左右两侧有10px的padding,所以需要减去20px // @ts-ignore __privateAdd(this, _style, GM_addStyle(` .${__privateGet(this, _classLeft)} { width: 60%; float: left; } .${__privateGet(this, _classRight)} { width: calc(40% - 20px); float: left; } `)); // TODO 该功能开启的时候,会导致https://lolitalibrary.com/maomao/#页中第一个按钮变形 __privateAdd(this, _loaderBtn); } dom(config, callback) { if (config) __privateSet(this, _config3, config); const actcallback = () => { callback(JSON.parse(JSON.stringify(__privateGet(this, _config3))), { justUpdate: true }); }; if (config == null ? void 0 : config.activate) __privateMethod(this, _喵喵职业助手_instances, activate_fn4).call(this, actcallback); return new RadioComponent({ label: this.name }).create(config == null ? void 0 : config.activate, (acti) => { __privateGet(this, _config3).activate = acti; if (acti) { __privateMethod(this, _喵喵职业助手_instances, activate_fn4).call(this, actcallback); } else { const moegame = Moe.getInstance(); const panel = moegame.game.villageTab.jobsPanel; if (panel) { const content = $(panel.contentDiv).removeClass(__privateGet(this, _classLeft)); const right = content.next(); const clear = right.next(); right.remove(); clear.remove(); $(".loadout").css("float", "right"); } moegame.event.off.render("Village", this.flag); } callback(JSON.parse(JSON.stringify(__privateGet(this, _config3)))); }); } } _config3 = new WeakMap(); _classLeft = new WeakMap(); _classRight = new WeakMap(); _style = new WeakMap(); _喵喵职业助手_instances = new WeakSet(); cat2id_fn = function(cat) { return `name: ${cat.name} ${cat.surname} age: ${cat.age} trait: ${cat.trait.name} color: ${cat.color} variety: ${cat.variety}`; }; load_fn = function(name) { const jobData = __privateGet(this, _config3).save.find((job) => job.name === name); if (!jobData) { moe$8.error("未找到职业配置: " + name); return; } const game2 = Moe.getInstance().game; const village = game2.village; village.clearJobs(false); const jobs = JSON.parse(decompress(jobData.data)); if (jobData.type === "savebynumber") { const jobCount = {}; for (const job of jobs) { jobCount[job.job] = (jobCount[job.job] || 0) + 1; } log$4.debug("jobCount", jobCount); for (const job of Object.keys(jobCount)) { village.assignJob(village.getJob(job), jobCount[job]); } } else if (jobData.type === "savebyname") { const kittens = village.sim.kittens; for (const kitten of kittens) { const id = __privateMethod(this, _喵喵职业助手_instances, cat2id_fn).call(this, kitten); const data = jobs.find((data2) => data2.id === id); if (data) { kitten.job = data.job; village.getJob(data.job).value++; } } } moe$8.debug("加载职业配置成功: " + name); }; delete_fn = function(name, callback) { moe$8.debug("删除职业配置: " + name); __privateGet(this, _config3).save = __privateGet(this, _config3).save.filter((job) => job.name !== name); __privateMethod(this, _喵喵职业助手_instances, addLoader_fn).call(this, callback); }; addLoader_fn = function(callback) { const loader = __privateGet(this, _loaderBtn); loader.empty(); for (const job of __privateGet(this, _config3).save) { const span = $("

"); const button = $(``); button.on("click", () => __privateMethod(this, _喵喵职业助手_instances, load_fn).call(this, job.name)); const x = $(`[x]`); x.on("click", () => { __privateMethod(this, _喵喵职业助手_instances, delete_fn).call(this, job.name, callback); callback(JSON.parse(JSON.stringify(__privateGet(this, _config3))), true); }); span.append(button); span.append(x); loader.append(span); } }; saveJobs_fn = function(callback, type, name = "默认") { name = name ? name.trim() : "默认"; const game2 = Moe.getInstance().game; const kittens = game2.village.sim.kittens; const jobs = []; for (const kitten of kittens) { jobs.push({ id: __privateMethod(this, _喵喵职业助手_instances, cat2id_fn).call(this, kitten), job: kitten.job }); } const jobStr = compress(JSON.stringify(jobs)); const existingJob = __privateGet(this, _config3).save.find((job) => job.name === name); if (existingJob) { existingJob.data = jobStr; existingJob.type = type; existingJob.length = jobs.length; __privateGet(this, _config3).save.splice(__privateGet(this, _config3).save.indexOf(existingJob), 1); __privateGet(this, _config3).save.unshift(existingJob); moe$8.debug(`覆盖职业配置: ${name},小猫数量: ${jobs.length}`); } else { __privateGet(this, _config3).save.unshift({ name, type, data: jobStr, length: jobs.length }); moe$8.debug(`添加职业配置: ${name},小猫数量: ${jobs.length}`); } __privateMethod(this, _喵喵职业助手_instances, addLoader_fn).call(this, callback); }; _loaderBtn = new WeakMap(); addHtml_fn = function(callback) { const game2 = Moe.getInstance().game; const panel = game2.villageTab.jobsPanel; if (!panel) { moe$8.error("村庄职业面板未加载"); return; } const text = new TextInputComponent({ prelabel: `保存为: `, placeholder: "默认" }); $(text.dom.input).css("width", "120px"); const content = $(panel.contentDiv).addClass(__privateGet(this, _classLeft)); const html = $(`
`); const numberBtn = $(``); const nameBtn = $(``); const span = $(`
`).append(numberBtn, nameBtn); const div = $(`
`).append(text.$dom, "
", span); __privateSet(this, _loaderBtn, $(`
`)); html.append(div, __privateGet(this, _loaderBtn)); content.after(html); content.next().after(`
`); log$4.debug("loadout", $(".loadout").css("float", "")); numberBtn.on("click", () => { __privateMethod(this, _喵喵职业助手_instances, saveJobs_fn).call(this, callback, "savebynumber", text.val); callback(); }); nameBtn.on("click", () => { __privateMethod(this, _喵喵职业助手_instances, saveJobs_fn).call(this, callback, "savebyname", text.val); callback(); }); __privateMethod(this, _喵喵职业助手_instances, addLoader_fn).call(this, callback); }; activate_fn4 = function(callback) { const moegame = Moe.getInstance(); const village = moegame.game.villageTab; if (village.jobsPanel) { __privateMethod(this, _喵喵职业助手_instances, addHtml_fn).call(this, callback); } moegame.event.on.render("Village", this.flag, () => { __privateMethod(this, _喵喵职业助手_instances, addHtml_fn).call(this, callback); }); }; const option$8 = new 喵喵职业助手(); var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; function getDefaultExportFromCjs(x) { return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; } var atoa$1 = function atoa(a, n) { return Array.prototype.slice.call(a, n); }; var si = typeof setImmediate === "function", tick; if (si) { tick = function(fn) { setImmediate(fn); }; } else { tick = function(fn) { setTimeout(fn, 0); }; } var tickyBrowser = tick; var ticky = tickyBrowser; var debounce$1 = function debounce(fn, args, ctx) { if (!fn) { return; } ticky(function run() { fn.apply(ctx || null, args || []); }); }; var atoa2 = atoa$1; var debounce2 = debounce$1; var emitter$1 = function emitter(thing, options) { var opts = options || {}; var evt = {}; if (thing === void 0) { thing = {}; } thing.on = function(type, fn) { if (!evt[type]) { evt[type] = [fn]; } else { evt[type].push(fn); } return thing; }; thing.once = function(type, fn) { fn._once = true; thing.on(type, fn); return thing; }; thing.off = function(type, fn) { var c = arguments.length; if (c === 1) { delete evt[type]; } else if (c === 0) { evt = {}; } else { var et = evt[type]; if (!et) { return thing; } et.splice(et.indexOf(fn), 1); } return thing; }; thing.emit = function() { var args = atoa2(arguments); return thing.emitterSnapshot(args.shift()).apply(this, args); }; thing.emitterSnapshot = function(type) { var et = (evt[type] || []).slice(0); return function() { var args = atoa2(arguments); var ctx = this || thing; if (type === "error" && opts.throws !== false && !et.length) { throw args.length === 1 ? args[0] : args; } et.forEach(function emitter3(listen) { if (opts.async) { debounce2(listen, args, ctx); } else { listen.apply(ctx, args); } if (listen._once) { thing.off(type, listen); } }); return thing; }; }; return thing; }; var NativeCustomEvent = commonjsGlobal.CustomEvent; function useNative() { try { var p = new NativeCustomEvent("cat", { detail: { foo: "bar" } }); return "cat" === p.type && "bar" === p.detail.foo; } catch (e) { } return false; } var customEvent$1 = useNative() ? NativeCustomEvent : ( // IE >= 9 "undefined" !== typeof document && "function" === typeof document.createEvent ? function CustomEvent(type, params) { var e = document.createEvent("CustomEvent"); if (params) { e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail); } else { e.initCustomEvent(type, false, false, void 0); } return e; } : ( // IE <= 8 function CustomEvent2(type, params) { var e = document.createEventObject(); e.type = type; if (params) { e.bubbles = Boolean(params.bubbles); e.cancelable = Boolean(params.cancelable); e.detail = params.detail; } else { e.bubbles = false; e.cancelable = false; e.detail = void 0; } return e; } ) ); var eventmap$1 = []; var eventname = ""; var ron = /^on/; for (eventname in commonjsGlobal) { if (ron.test(eventname)) { eventmap$1.push(eventname.slice(2)); } } var eventmap_1 = eventmap$1; var customEvent = customEvent$1; var eventmap = eventmap_1; var doc$1 = commonjsGlobal.document; var addEvent = addEventEasy; var removeEvent = removeEventEasy; var hardCache = []; if (!commonjsGlobal.addEventListener) { addEvent = addEventHard; removeEvent = removeEventHard; } var crossvent$1 = { add: addEvent, remove: removeEvent, fabricate: fabricateEvent }; function addEventEasy(el, type, fn, capturing) { return el.addEventListener(type, fn, capturing); } function addEventHard(el, type, fn) { return el.attachEvent("on" + type, wrap(el, type, fn)); } function removeEventEasy(el, type, fn, capturing) { return el.removeEventListener(type, fn, capturing); } function removeEventHard(el, type, fn) { var listener = unwrap(el, type, fn); if (listener) { return el.detachEvent("on" + type, listener); } } function fabricateEvent(el, type, model) { var e = eventmap.indexOf(type) === -1 ? makeCustomEvent() : makeClassicEvent(); if (el.dispatchEvent) { el.dispatchEvent(e); } else { el.fireEvent("on" + type, e); } function makeClassicEvent() { var e2; if (doc$1.createEvent) { e2 = doc$1.createEvent("Event"); e2.initEvent(type, true, true); } else if (doc$1.createEventObject) { e2 = doc$1.createEventObject(); } return e2; } function makeCustomEvent() { return new customEvent(type, { detail: model }); } } function wrapperFactory(el, type, fn) { return function wrapper(originalEvent) { var e = originalEvent || commonjsGlobal.event; e.target = e.target || e.srcElement; e.preventDefault = e.preventDefault || function preventDefault() { e.returnValue = false; }; e.stopPropagation = e.stopPropagation || function stopPropagation() { e.cancelBubble = true; }; e.which = e.which || e.keyCode; fn.call(el, e); }; } function wrap(el, type, fn) { var wrapper = unwrap(el, type, fn) || wrapperFactory(el, type, fn); hardCache.push({ wrapper, element: el, type, fn }); return wrapper; } function unwrap(el, type, fn) { var i = find(el, type, fn); if (i) { var wrapper = hardCache[i].wrapper; hardCache.splice(i, 1); return wrapper; } } function find(el, type, fn) { var i, item; for (i = 0; i < hardCache.length; i++) { item = hardCache[i]; if (item.element === el && item.type === type && item.fn === fn) { return i; } } } var cache = {}; var start = "(?:^|\\s)"; var end = "(?:\\s|$)"; function lookupClass(className) { var cached = cache[className]; if (cached) { cached.lastIndex = 0; } else { cache[className] = cached = new RegExp(start + className + end, "g"); } return cached; } function addClass(el, className) { var current = el.className; if (!current.length) { el.className = className; } else if (!lookupClass(className).test(current)) { el.className += " " + className; } } function rmClass(el, className) { el.className = el.className.replace(lookupClass(className), " ").trim(); } var classes$1 = { add: addClass, rm: rmClass }; var emitter2 = emitter$1; var crossvent = crossvent$1; var classes = classes$1; var doc = document; var documentElement = doc.documentElement; function dragula(initialContainers, options) { var len = arguments.length; if (len === 1 && Array.isArray(initialContainers) === false) { options = initialContainers; initialContainers = []; } var _mirror; var _source; var _item; var _offsetX; var _offsetY; var _moveX; var _moveY; var _initialSibling; var _currentSibling; var _copy; var _renderTimer; var _lastDropTarget = null; var _grabbed; var o = options || {}; if (o.moves === void 0) { o.moves = always; } if (o.accepts === void 0) { o.accepts = always; } if (o.invalid === void 0) { o.invalid = invalidTarget; } if (o.containers === void 0) { o.containers = initialContainers || []; } if (o.isContainer === void 0) { o.isContainer = never; } if (o.copy === void 0) { o.copy = false; } if (o.copySortSource === void 0) { o.copySortSource = false; } if (o.revertOnSpill === void 0) { o.revertOnSpill = false; } if (o.removeOnSpill === void 0) { o.removeOnSpill = false; } if (o.direction === void 0) { o.direction = "vertical"; } if (o.ignoreInputTextSelection === void 0) { o.ignoreInputTextSelection = true; } if (o.mirrorContainer === void 0) { o.mirrorContainer = doc.body; } var drake = emitter2({ containers: o.containers, start: manualStart, end: end2, cancel, remove, destroy, canMove, dragging: false }); if (o.removeOnSpill === true) { drake.on("over", spillOver).on("out", spillOut); } events(); return drake; function isContainer(el) { return drake.containers.indexOf(el) !== -1 || o.isContainer(el); } function events(remove2) { var op = remove2 ? "remove" : "add"; touchy(documentElement, op, "mousedown", grab); touchy(documentElement, op, "mouseup", release); } function eventualMovements(remove2) { var op = remove2 ? "remove" : "add"; touchy(documentElement, op, "mousemove", startBecauseMouseMoved); } function movements(remove2) { var op = remove2 ? "remove" : "add"; crossvent[op](documentElement, "selectstart", preventGrabbed); crossvent[op](documentElement, "click", preventGrabbed); } function destroy() { events(true); release({}); } function preventGrabbed(e) { if (_grabbed) { e.preventDefault(); } } function grab(e) { _moveX = e.clientX; _moveY = e.clientY; var ignore = whichMouseButton(e) !== 1 || e.metaKey || e.ctrlKey; if (ignore) { return; } var item = e.target; var context = canStart(item); if (!context) { return; } _grabbed = context; eventualMovements(); if (e.type === "mousedown") { if (isInput(item)) { item.focus(); } else { e.preventDefault(); } } } function startBecauseMouseMoved(e) { if (!_grabbed) { return; } if (whichMouseButton(e) === 0) { release({}); return; } if (e.clientX !== void 0 && Math.abs(e.clientX - _moveX) <= (o.slideFactorX || 0) && (e.clientY !== void 0 && Math.abs(e.clientY - _moveY) <= (o.slideFactorY || 0))) { return; } if (o.ignoreInputTextSelection) { var clientX = getCoord("clientX", e) || 0; var clientY = getCoord("clientY", e) || 0; var elementBehindCursor = doc.elementFromPoint(clientX, clientY); if (isInput(elementBehindCursor)) { return; } } var grabbed = _grabbed; eventualMovements(true); movements(); end2(); start2(grabbed); var offset = getOffset(_item); _offsetX = getCoord("pageX", e) - offset.left; _offsetY = getCoord("pageY", e) - offset.top; classes.add(_copy || _item, "gu-transit"); renderMirrorImage(); drag(e); } function canStart(item) { if (drake.dragging && _mirror) { return; } if (isContainer(item)) { return; } var handle = item; while (getParent(item) && isContainer(getParent(item)) === false) { if (o.invalid(item, handle)) { return; } item = getParent(item); if (!item) { return; } } var source = getParent(item); if (!source) { return; } if (o.invalid(item, handle)) { return; } var movable = o.moves(item, source, handle, nextEl(item)); if (!movable) { return; } return { item, source }; } function canMove(item) { return !!canStart(item); } function manualStart(item) { var context = canStart(item); if (context) { start2(context); } } function start2(context) { if (isCopy(context.item, context.source)) { _copy = context.item.cloneNode(true); drake.emit("cloned", _copy, context.item, "copy"); } _source = context.source; _item = context.item; _initialSibling = _currentSibling = nextEl(context.item); drake.dragging = true; drake.emit("drag", _item, _source); } function invalidTarget() { return false; } function end2() { if (!drake.dragging) { return; } var item = _copy || _item; drop(item, getParent(item)); } function ungrab() { _grabbed = false; eventualMovements(true); movements(true); } function release(e) { ungrab(); if (!drake.dragging) { return; } var item = _copy || _item; var clientX = getCoord("clientX", e) || 0; var clientY = getCoord("clientY", e) || 0; var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY); var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY); if (dropTarget && (_copy && o.copySortSource || (!_copy || dropTarget !== _source))) { drop(item, dropTarget); } else if (o.removeOnSpill) { remove(); } else { cancel(); } } function drop(item, target) { var parent = getParent(item); if (_copy && o.copySortSource && target === _source) { parent.removeChild(_item); } if (isInitialPlacement(target)) { drake.emit("cancel", item, _source, _source); } else { drake.emit("drop", item, target, _source, _currentSibling); } cleanup(); } function remove() { if (!drake.dragging) { return; } var item = _copy || _item; var parent = getParent(item); if (parent) { parent.removeChild(item); } drake.emit(_copy ? "cancel" : "remove", item, parent, _source); cleanup(); } function cancel(revert) { if (!drake.dragging) { return; } var reverts = arguments.length > 0 ? revert : o.revertOnSpill; var item = _copy || _item; var parent = getParent(item); var initial = isInitialPlacement(parent); if (initial === false && reverts) { if (_copy) { if (parent) { parent.removeChild(_copy); } } else { _source.insertBefore(item, _initialSibling); } } if (initial || reverts) { drake.emit("cancel", item, _source, _source); } else { drake.emit("drop", item, parent, _source, _currentSibling); } cleanup(); } function cleanup() { var item = _copy || _item; ungrab(); removeMirrorImage(); if (item) { classes.rm(item, "gu-transit"); } if (_renderTimer) { clearTimeout(_renderTimer); } drake.dragging = false; if (_lastDropTarget) { drake.emit("out", item, _lastDropTarget, _source); } drake.emit("dragend", item); _source = _item = _copy = _initialSibling = _currentSibling = _renderTimer = _lastDropTarget = null; } function isInitialPlacement(target, s) { var sibling; if (s !== void 0) { sibling = s; } else if (_mirror) { sibling = _currentSibling; } else { sibling = nextEl(_copy || _item); } return target === _source && sibling === _initialSibling; } function findDropTarget(elementBehindCursor, clientX, clientY) { var target = elementBehindCursor; while (target && !accepted()) { target = getParent(target); } return target; function accepted() { var droppable = isContainer(target); if (droppable === false) { return false; } var immediate = getImmediateChild(target, elementBehindCursor); var reference = getReference(target, immediate, clientX, clientY); var initial = isInitialPlacement(target, reference); if (initial) { return true; } return o.accepts(_item, target, _source, reference); } } function drag(e) { if (!_mirror) { return; } e.preventDefault(); var clientX = getCoord("clientX", e) || 0; var clientY = getCoord("clientY", e) || 0; var x = clientX - _offsetX; var y = clientY - _offsetY; _mirror.style.left = x + "px"; _mirror.style.top = y + "px"; var item = _copy || _item; var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY); var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY); var changed = dropTarget !== null && dropTarget !== _lastDropTarget; if (changed || dropTarget === null) { out(); _lastDropTarget = dropTarget; over(); } var parent = getParent(item); if (dropTarget === _source && _copy && !o.copySortSource) { if (parent) { parent.removeChild(item); } return; } var reference; var immediate = getImmediateChild(dropTarget, elementBehindCursor); if (immediate !== null) { reference = getReference(dropTarget, immediate, clientX, clientY); } else if (o.revertOnSpill === true && !_copy) { reference = _initialSibling; dropTarget = _source; } else { if (_copy && parent) { parent.removeChild(item); } return; } if (reference === null && changed || reference !== item && reference !== nextEl(item)) { _currentSibling = reference; dropTarget.insertBefore(item, reference); drake.emit("shadow", item, dropTarget, _source); } function moved(type) { drake.emit(type, item, _lastDropTarget, _source); } function over() { if (changed) { moved("over"); } } function out() { if (_lastDropTarget) { moved("out"); } } } function spillOver(el) { classes.rm(el, "gu-hide"); } function spillOut(el) { if (drake.dragging) { classes.add(el, "gu-hide"); } } function renderMirrorImage() { if (_mirror) { return; } var rect = _item.getBoundingClientRect(); _mirror = _item.cloneNode(true); _mirror.style.width = getRectWidth(rect) + "px"; _mirror.style.height = getRectHeight(rect) + "px"; classes.rm(_mirror, "gu-transit"); classes.add(_mirror, "gu-mirror"); o.mirrorContainer.appendChild(_mirror); touchy(documentElement, "add", "mousemove", drag); classes.add(o.mirrorContainer, "gu-unselectable"); drake.emit("cloned", _mirror, _item, "mirror"); } function removeMirrorImage() { if (_mirror) { classes.rm(o.mirrorContainer, "gu-unselectable"); touchy(documentElement, "remove", "mousemove", drag); getParent(_mirror).removeChild(_mirror); _mirror = null; } } function getImmediateChild(dropTarget, target) { var immediate = target; while (immediate !== dropTarget && getParent(immediate) !== dropTarget) { immediate = getParent(immediate); } if (immediate === documentElement) { return null; } return immediate; } function getReference(dropTarget, target, x, y) { var horizontal = o.direction === "horizontal"; var reference = target !== dropTarget ? inside() : outside(); return reference; function outside() { var len2 = dropTarget.children.length; var i; var el; var rect; for (i = 0; i < len2; i++) { el = dropTarget.children[i]; rect = el.getBoundingClientRect(); if (horizontal && rect.left + rect.width / 2 > x) { return el; } if (!horizontal && rect.top + rect.height / 2 > y) { return el; } } return null; } function inside() { var rect = target.getBoundingClientRect(); if (horizontal) { return resolve(x > rect.left + getRectWidth(rect) / 2); } return resolve(y > rect.top + getRectHeight(rect) / 2); } function resolve(after) { return after ? nextEl(target) : target; } } function isCopy(item, container) { return typeof o.copy === "boolean" ? o.copy : o.copy(item, container); } } function touchy(el, op, type, fn) { var touch = { mouseup: "touchend", mousedown: "touchstart", mousemove: "touchmove" }; var pointers = { mouseup: "pointerup", mousedown: "pointerdown", mousemove: "pointermove" }; var microsoft = { mouseup: "MSPointerUp", mousedown: "MSPointerDown", mousemove: "MSPointerMove" }; if (commonjsGlobal.navigator.pointerEnabled) { crossvent[op](el, pointers[type], fn); } else if (commonjsGlobal.navigator.msPointerEnabled) { crossvent[op](el, microsoft[type], fn); } else { crossvent[op](el, touch[type], fn); crossvent[op](el, type, fn); } } function whichMouseButton(e) { if (e.touches !== void 0) { return e.touches.length; } if (e.which !== void 0 && e.which !== 0) { return e.which; } if (e.buttons !== void 0) { return e.buttons; } var button = e.button; if (button !== void 0) { return button & 1 ? 1 : button & 2 ? 3 : button & 4 ? 2 : 0; } } function getOffset(el) { var rect = el.getBoundingClientRect(); return { left: rect.left + getScroll("scrollLeft", "pageXOffset"), top: rect.top + getScroll("scrollTop", "pageYOffset") }; } function getScroll(scrollProp, offsetProp) { if (typeof commonjsGlobal[offsetProp] !== "undefined") { return commonjsGlobal[offsetProp]; } if (documentElement.clientHeight) { return documentElement[scrollProp]; } return doc.body[scrollProp]; } function getElementBehindPoint(point, x, y) { point = point || {}; var state = point.className || ""; var el; point.className += " gu-hide"; el = doc.elementFromPoint(x, y); point.className = state; return el; } function never() { return false; } function always() { return true; } function getRectWidth(rect) { return rect.width || rect.right - rect.left; } function getRectHeight(rect) { return rect.height || rect.bottom - rect.top; } function getParent(el) { return el.parentNode === doc ? null : el.parentNode; } function isInput(el) { return el.tagName === "INPUT" || el.tagName === "TEXTAREA" || el.tagName === "SELECT" || isEditable(el); } function isEditable(el) { if (!el) { return false; } if (el.contentEditable === "false") { return false; } if (el.contentEditable === "true") { return true; } return isEditable(getParent(el)); } function nextEl(el) { return el.nextElementSibling || manually(); function manually() { var sibling = el; do { sibling = sibling.nextSibling; } while (sibling && sibling.nodeType !== 1); return sibling; } } function getEventHost(e) { if (e.targetTouches && e.targetTouches.length) { return e.targetTouches[0]; } if (e.changedTouches && e.changedTouches.length) { return e.changedTouches[0]; } return e; } function getCoord(coord, e) { var host = getEventHost(e); var missMap = { pageX: "clientX", // IE8 pageY: "clientY" // IE8 }; if (coord in missMap && !(coord in host) && missMap[coord] in host) { coord = missMap[coord]; } return host[coord]; } var dragula_1 = dragula; const dragula$1 = /* @__PURE__ */ getDefaultExportFromCjs(dragula_1); const log$3 = getLogger("src/option/任务队列", "console"); const moe$7 = getLogger("src/option/任务队列", "moe"); class Folder extends Array { constructor(id, ...tasks) { super(...tasks); __publicField(this, "id"); this.id = id; } } class QueueOptionManager { constructor() { __privateAdd(this, _QueueOptionManager_instances); __publicField(this, "__options", []); this.__options = Queue.load(); } get panels() { const rs = []; for (const option2 of this.__options) { if (!rs.includes(option2.panel)) { if (__privateMethod(this, _QueueOptionManager_instances, canRun_fn).call(this, option2)) { rs.push(option2.panel); } } } return rs; } panel(panel) { const rs = []; for (const option2 of this.__options) { if (option2.panel === panel) { if (__privateMethod(this, _QueueOptionManager_instances, canRun_fn).call(this, option2)) { rs.push(option2); } } } rs.sort((a, b) => (a.index ?? Number.MAX_SAFE_INTEGER) - (b.index ?? Number.MAX_SAFE_INTEGER)); return rs; } flag(flag) { for (const option2 of this.__options) { if (option2.flag === flag) { return option2; } } return void 0; } } _QueueOptionManager_instances = new WeakSet(); canRun_fn = function(opt) { if ("onceable" in opt && "once" in opt && "repeat" in opt && "until" in opt) { moe$7.error(`【${NAME}】插件异常!队列任务不能同时支持onceable和repeatable`); return false; } if ("onceable" in opt && "once" in opt) return true; if ("repeat" in opt && "until" in opt) return true; return false; }; class 任务队列 { constructor() { __privateAdd(this, _任务队列_instances); __publicField(this, "panel", "杂项"); __publicField(this, "description", { get activate() { const game2 = Moe.getInstance().game; if (game2.time.queue) { return "任务队列支持并行任务"; } else { return ""; } }, get deactivate() { const game2 = Moe.getInstance().game; if (game2.time.queue) { return `【${NAME}】的任务将会从队列中删除`; } else { return "所有的任务都将被清空"; } } }); __publicField(this, "flag", "任务队列"); __privateAdd(this, _radioInstance); __publicField(this, "crossSaver", false); /** * 该字段用于在浏览器控制台显示option选项 */ __publicField(this, "queueOption"); __privateAdd(this, _queue); __privateAdd(this, _meta, (() => { const meta = { containerId: Option.ID_PREFIX + "rightTabQueue", btnId: Option.ID_PREFIX + "queueLink", queueAdderId: Option.ID_PREFIX + `${this.flag}-queue-adder`, folderClass: Option.CLASS_PREFIX + `${this.flag}-folder`, folderActiveClass: Option.CLASS_PREFIX + `${this.flag}-folder-active`, dataContainerClass: Option.CLASS_PREFIX + `${this.flag}-container`, folderProp: `moe-${this.flag}-data-id`, css: "", /** * 容器的模板 */ container: {}, // taskClass: Option.CLASS_PREFIX + `${this.flag}-task`, taskProp: `moe-${this.flag}-task-id`, typeOption: [ { name: "合成x次", value: "time" }, { name: "合成到x", value: "until" } ] }; meta.css = ` .${meta.folderActiveClass} { --folder-bg: #ffaecb !important; --folder-border-color: #ff98be !important; } .${meta.folderClass} { --folder-width: 35px; --folder-height: 15px; --folder-border-radius: 2px; --folder-bg: #cccccc; --folder-border-color: #cccccc; --min-height: 1em; /* 最小高度为1em */ position: relative; margin: calc(var(--folder-height) + 2px) auto 0; border-radius: 0 var(--folder-border-radius) var(--folder-border-radius) var(--folder-border-radius); border: 1px solid var(--folder-border-color); } .${meta.folderClass}::before { position: absolute; top: calc(0px - var(--folder-height)); left: 0; background-color: var(--folder-bg); width: var(--folder-width); height: var(--folder-height); border-radius: var(--folder-border-radius) 0 0 0; content: ''; cursor: move; } .${meta.folderClass}::after { position: absolute; top: calc(0px - var(--folder-height)); left: var(--folder-width); /* height: var(--folder-height); */ border-top: var(--folder-height) solid white; border-left: var(--folder-height) solid var(--folder-bg); content: ''; cursor: move; } .${meta.dataContainerClass} { min-height: var(--min-height); } .${meta.taskClass} { display: flex; } .${meta.taskClass}::before { content: ""; display: block; width: 20px; cursor: move; user-select: none; background-image: url('data:image/svg+xml;utf8,'); background-repeat: repeat-y; background-size: 20px 24px; } .${meta.taskClass}>p{ margin: 2px; width: 100%; } .${meta.taskClass}>p>span { cursor: pointer; } `; meta.container = { get: (id) => { return $(`.${meta.folderClass}[${meta.folderProp}="${id}"]`); }, id: (id) => { return function(strs, ...values) { const strarr = []; for (let i = 0; i < strs.length; i++) { strarr.push(strs[i]); if (values[i]) { strarr.push(values[i]); } } const html = strarr.join(""); return `
${html}
`; }; } }; return meta; })()); __privateAdd(this, _id, function* () { let i = 1; while (true) { yield i++; } }()); __publicField(this, "period", timeobj.sec(1)); __publicField(this, "script", () => { const tasks = [...__privateGet(this, _queue).task[0]]; const gqueue = Moe.getInstance().game.time.queue; for (const task of tasks) { if (task.type === "MoeTask") { const meta = task.meta; const opt = __privateGet(this, _queue).queueOption.flag(meta.flag); if (meta.type === "once") { if ("onceable" in opt) { if (opt.onceable && opt.once()) { __privateMethod(this, _任务队列_instances, removeTask_fn).call(this, task.id); } } else { moe$7.error("任务队列中选项错误,详细信息见控制台"); log$3.error("任务队列中选项错误: ", task); __privateMethod(this, _任务队列_instances, removeTask_fn).call(this, task.id); } } else if (meta.type === "time") { if ("repeat" in opt) { const time = opt.repeat(meta.value); if (meta.value - time > 0) { meta.value -= time; } else { __privateMethod(this, _任务队列_instances, removeTask_fn).call(this, task.id); } } else { moe$7.error("任务队列中选项错误,详细信息见控制台"); log$3.error("任务队列中选项错误: ", task); __privateMethod(this, _任务队列_instances, removeTask_fn).call(this, task.id); } } else if (meta.type === "until") { if ("until" in opt) { if (opt.until(meta.value)) { __privateMethod(this, _任务队列_instances, removeTask_fn).call(this, task.id); } } else { moe$7.error("任务队列中选项错误,详细信息见控制台"); log$3.error("任务队列中选项错误: ", task); __privateMethod(this, _任务队列_instances, removeTask_fn).call(this, task.id); } } } else if (task.type === "GameTask") { const olength = gqueue.queueItems.length; gqueue.queueItems.push(task.meta); gqueue.update(); if (gqueue.queueItems.length > olength) { gqueue.queueItems.pop(); } else { __privateMethod(this, _任务队列_instances, removeTask_fn).call(this, task.id); } } else { moe$7.error("任务队列中的任务类型错误,详细信息见控制台"); log$3.error("任务队列中的任务类型错误: ", task); } } return true; }); } get name() { const game2 = Moe.getInstance().game; if (game2.time.queue) { return "任务队列增强"; } else { return "任务队列"; } } dom(config, callback) { const activateCallback = (task) => { callback({ activate: true, task }, { justUpdate: true }); }; if (config == null ? void 0 : config.activate) { __privateMethod(this, _任务队列_instances, activate_fn5).call(this, config.task, activateCallback); } return __privateGet(this, _任务队列_instances, radio_get).create(config == null ? void 0 : config.activate, (activate) => { var _a2; if (activate) { __privateMethod(this, _任务队列_instances, activate_fn5).call(this, [], activateCallback); } else { __privateMethod(this, _任务队列_instances, deactivate_fn).call(this); } callback({ activate, task: (_a2 = __privateGet(this, _queue)) == null ? void 0 : _a2.task }); }); } /** * 该方法用于在浏览器控制台显示option选项 */ get options() { var _a2; return (_a2 = __privateGet(this, _queue)) == null ? void 0 : _a2.queueOption; } /** * 该字段用于在浏览器控制台显示task选项 */ get task() { var _a2; return (_a2 = __privateGet(this, _queue)) == null ? void 0 : _a2.task; } } _radioInstance = new WeakMap(); _任务队列_instances = new WeakSet(); radio_get = function() { if (!__privateGet(this, _radioInstance)) { __privateSet(this, _radioInstance, new RadioComponent({ label: this.name })); } return __privateGet(this, _radioInstance); }; _queue = new WeakMap(); _meta = new WeakMap(); _id = new WeakMap(); activate_fn5 = function(tasks, callback) { __privateMethod(this, _任务队列_instances, buildQueue_fn).call(this, callback); __privateMethod(this, _任务队列_instances, loadData_fn).call(this, tasks); }; deactivate_fn = function() { var _a2, _b2, _c2, _d2, _e, _f; const event = Moe.getInstance().event; event.off.queueAdd.before(this.flag); event.off.queueAdd.after(this.flag); event.off.import(this.flag); if (__privateGet(this, _queue)) { const game2 = Moe.getInstance().game; if (game2.time.queue) { const queueItems = []; for (const folder of __privateGet(this, _queue).task) { for (const task of folder) { if (task.type === "GameTask") queueItems.push(task.meta); } } for (const task of queueItems) { game2.time.queue.addToQueue(task.name, task.type, task.label); } if (game2.time.queue.queueItems.length > 0) { game2.save(); } } $(`#${__privateGet(this, _meta).containerId}`).remove(); if (game2.time.queue) { $("#queueViewport>.queue-container[data-reactid='.2']>div:nth-of-type(2)[data-reactid='.2.4']").removeAttr("style"); } else { $(`#${__privateGet(this, _meta).btnId}`).remove(); $("#rightTabLog").removeAttr("style"); $(`#logLink`).off("click", __privateGet(this, _queue).logclick); } (_b2 = (_a2 = __privateGet(this, _queue)) == null ? void 0 : _a2.css) == null ? void 0 : _b2.remove(); (_d2 = (_c2 = __privateGet(this, _queue)) == null ? void 0 : _c2.containerDrake) == null ? void 0 : _d2.destroy(); (_f = (_e = __privateGet(this, _queue)) == null ? void 0 : _e.taskDrake) == null ? void 0 : _f.destroy(); __privateSet(this, _queue, void 0); this.queueOption = void 0; } }; /** * 构建队列 * 注册事件+队列html * @param isload 是否是加载存档时调用 * @returns */ buildQueue_fn = function(callback) { if (__privateGet(this, _queue)) return; const css = GM_addStyle(GM_getResourceText("dragula_css") + __privateGet(this, _meta).css); const queueOption = new QueueOptionManager(); this.queueOption = queueOption; const panelOption = []; for (const panel of queueOption.panels) { panelOption.push({ value: panel, name: panel }); } const optOption = []; for (const opt of queueOption.panel(panelOption[0].value)) { optOption.push({ name: opt.label, value: opt.flag }); } __privateSet(this, _queue, { task: [], queueOption, callback, css, panelSelector: new SelectComponent(panelOption), optionSelector: new SelectComponent(optOption), typeSelector: new SelectComponent(__privateGet(this, _meta).typeOption), numInput: new NumInputComponent({ min: 1, step: 1, prelabel: "x = " }) }); const mgame = Moe.getInstance(); const event = mgame.event; const game2 = mgame.game; event.on.queueAdd.before(this.flag, () => { const g = Moe.getInstance().game; const tasks = [...g.time.queue.queueItems]; g.time.queue.queueItems.length = 0; const e = Moe.getInstance().event; e.on.queueAdd.afterOnce(this.flag, () => { const gtasks = __privateMethod(this, _任务队列_instances, getTaskFromGame_fn).call(this); __privateMethod(this, _任务队列_instances, addTask_fn).call(this, ...gtasks); __privateGet(this, _queue).callback(JSON.parse(JSON.stringify(__privateGet(this, _queue).task))); g.time.queue.queueItems.push(...tasks); }); }); event.on.import(this.flag, () => { __privateMethod(this, _任务队列_instances, loadData_fn).call(this); }); if (game2.time.queue) { $("#queueViewport>.queue-container[data-reactid='.2']>div:nth-of-type(2)[data-reactid='.2.4']").hide(); $("#queueViewport>.queue-container[data-reactid='.2']").append(`
`); } else { $(".right-tab-header").append(`队列`); $("#rightColumn").append(``); $(`#${__privateGet(this, _meta).btnId}`).on("click", () => { $("#rightTabLog").hide(); $(`#${__privateGet(this, _meta).containerId}`).show(); }); __privateGet(this, _queue).logclick = () => { $("#rightTabLog").show(); $(`#${__privateGet(this, _meta).containerId}`).hide(); }; $(`#logLink`).on("click", __privateGet(this, _queue).logclick); } const container = $(`#${__privateGet(this, _meta).containerId}`); const addBtn = $(""); const queueAdder = $(`
`).append( __privateGet(this, _queue).panelSelector.$dom, __privateGet(this, _queue).optionSelector.$dom, "
", __privateGet(this, _queue).typeSelector.$dom, __privateGet(this, _queue).numInput.$dom, addBtn ); container.append(queueAdder); __privateMethod(this, _任务队列_instances, refreshSelect_fn).call(this); __privateGet(this, _queue).panelSelector.create(panelOption[0].value, (select) => { const options = __privateGet(this, _queue).queueOption.panel(select); const opts = []; for (const opt of options) { opts.push({ name: opt.label, value: opt.flag }); } __privateGet(this, _queue).optionSelector.update.options = opts; __privateMethod(this, _任务队列_instances, refreshSelect_fn).call(this); }); __privateGet(this, _queue).optionSelector.create(optOption[0].value, (select) => { __privateMethod(this, _任务队列_instances, refreshSelect_fn).call(this, select); }); addBtn.on("click", () => { const option2 = __privateGet(this, _queue).queueOption.flag(__privateGet(this, _queue).optionSelector.val); if (!option2) { moe$7.error(`【${this.name}】插件异常!选择的OptionFlag在Option中不存在`); return; } const once = "once" in option2 ? option2.once : false; const repeat = "repeat" in option2 && "until" in option2; if (once && repeat) { moe$7.error(`【${this.name}】插件异常!${option2.flag}既可以once,又可以repeat`); return; } __privateMethod(this, _任务队列_instances, addTask_fn).call(this, { type: "MoeTask", id: __privateGet(this, _id).next().value, meta: { flag: option2.flag, type: repeat ? __privateGet(this, _queue).typeSelector.val : "once", value: repeat ? __privateGet(this, _queue).numInput.val : 1 } }); __privateGet(this, _queue).callback(JSON.parse(JSON.stringify(__privateGet(this, _queue).task))); }); const cdrake = dragula$1([container[0]], { // 没有用到的入参,以_开头(eslint) moves: (_el, _container2, handle) => { return handle ? $(handle).hasClass(__privateGet(this, _meta).folderClass) : false; } }); cdrake.on("drop", (el, _target, _source, sibling) => { const id = Number.parseInt(el.getAttribute(__privateGet(this, _meta).folderProp)); const index = __privateGet(this, _queue).task.findIndex((folder2) => folder2.id === id); const folder = __privateGet(this, _queue).task[index]; __privateGet(this, _queue).task.splice(index, 1); if (sibling) { const sid = Number.parseInt(sibling.getAttribute(__privateGet(this, _meta).folderProp)); const sindex = __privateGet(this, _queue).task.findIndex((folder2) => folder2.id === sid); __privateGet(this, _queue).task.splice(sindex, 0, folder); } else { __privateGet(this, _queue).task.push(folder); } __privateMethod(this, _任务队列_instances, refresh_fn).call(this); __privateGet(this, _queue).callback(JSON.parse(JSON.stringify(__privateGet(this, _queue).task))); }); __privateGet(this, _queue).containerDrake = cdrake; const tdrake = dragula$1($(`.${__privateGet(this, _meta).dataContainerClass}`).toArray(), { moves: (_el, _container2, handle) => { return handle ? $(handle).hasClass(__privateGet(this, _meta).taskClass) : false; } }); tdrake.on("drop", (el, target, source, sibling) => { const taskId = Number.parseInt(el.getAttribute(__privateGet(this, _meta).taskProp)); const tid = Number.parseInt($(target).parent().attr(__privateGet(this, _meta).folderProp)); const sid = Number.parseInt($(source).parent().attr(__privateGet(this, _meta).folderProp)); if (tid === sid) { const folder = __privateGet(this, _queue).task.find((folder2) => folder2.id === tid); const index = folder.findIndex((task2) => task2.id === taskId); const task = folder[index]; folder.splice(index, 1); if (sibling) { const silbId = Number.parseInt(sibling.getAttribute(__privateGet(this, _meta).taskProp)); const sindex = folder.findIndex((task2) => task2.id === silbId); folder.splice(sindex, 0, task); } else { folder.push(task); } } else { const sfolder = __privateGet(this, _queue).task.find((folder2) => folder2.id === sid); log$3.debug("taskId: ", taskId); log$3.debug("source: ", $(source).parent()); log$3.debug("sid: ", sid); log$3.debug("tid: ", tid); const sindex = sfolder.findIndex((task2) => task2.id === taskId); const task = sfolder[sindex]; sfolder.splice(sindex, 1); const folder = __privateGet(this, _queue).task.find((folder2) => folder2.id === tid); if (sibling) { const silbId = Number.parseInt(sibling.getAttribute(__privateGet(this, _meta).taskProp)); const sindex2 = folder.findIndex((task2) => task2.id === silbId); folder.splice(sindex2, 0, task); } else { folder.push(task); } } __privateMethod(this, _任务队列_instances, refresh_fn).call(this); __privateGet(this, _queue).callback(JSON.parse(JSON.stringify(__privateGet(this, _queue).task))); }); __privateGet(this, _queue).taskDrake = tdrake; }; task2Html_fn = function(...tasks) { const htmls = []; for (const task of tasks) { const type = task.type; let label = ""; if (type === "GameTask") { label = task.meta.label; } else { const option2 = __privateGet(this, _queue).queueOption.flag(task.meta.flag); const mid = task.meta.type === "time" ? "" : "到"; const suffix = task.meta.type === "time" ? "次" : ""; label = `合成${option2.label}${mid}${task.meta.value}${suffix}`; } const html = `

${label} [x]

`; htmls.push(html); } return htmls; }; /** * 获取游戏的任务队列并将其清空 */ getTaskFromGame_fn = function(save = false) { const tasks = []; const game2 = Moe.getInstance().game; if (game2.time.queue) { log$3.debug(`游戏原任务队列:`, game2.time.queue.queueItems); for (const gtask of game2.time.queue.queueItems) { for (let i = 0; i < gtask.value; i++) { tasks.push({ type: "GameTask", id: __privateGet(this, _id).next().value, meta: { name: gtask.name, label: gtask.label, type: gtask.type, value: 1 } }); } } if (game2.time.queue.queueItems.length > 0) { game2.time.queue.queueItems.length = 0; if (save) game2.save(); } } return tasks; }; /** * 加载任务队列数据 * @param tasks 缓存中的任务数据 */ loadData_fn = function(tasks = []) { __privateGet(this, _queue).task.length = 0; $(`#${__privateGet(this, _meta).containerId} > .${__privateGet(this, _meta).folderClass}`).remove(); const gtasks = __privateMethod(this, _任务队列_instances, getTaskFromGame_fn).call(this, true); for (const gtask of gtasks) { __privateGet(this, _queue).task.push(new Folder(__privateGet(this, _id).next().value, gtask)); } for (const folder of tasks) { const f = new Folder(__privateGet(this, _id).next().value); for (const task of folder) { task.id = __privateGet(this, _id).next().value; f.push(task); } __privateGet(this, _queue).task.push(f); } log$3.debug(`加载任务队列: `, __privateGet(this, _queue).task); const container = $(`#${__privateGet(this, _meta).containerId}`); for (const folder of __privateGet(this, _queue).task) { const taskHtml = __privateMethod(this, _任务队列_instances, task2Html_fn).call(this, ...folder).join(""); container.append(__privateGet(this, _meta).container.id(folder.id)`${taskHtml}`); } __privateMethod(this, _任务队列_instances, refresh_fn).call(this); }; /** * 根据选项刷新type */ refreshSelect_fn = function(flag) { if (!flag) flag = __privateGet(this, _queue).optionSelector.val; const option2 = __privateGet(this, _queue).queueOption.flag(flag); if (!option2) { moe$7.error(`选项${flag}不存在`); return; } let repeat = false; if ("repeat" in option2) { repeat = true; } if ("until" in option2) { repeat = true; } if (!repeat) { __privateGet(this, _queue).typeSelector.$dom.hide(); __privateGet(this, _queue).numInput.$dom.hide(); } else { __privateGet(this, _queue).typeSelector.val = 0; __privateGet(this, _queue).numInput.val = 1; __privateGet(this, _queue).typeSelector.$dom.show(); __privateGet(this, _queue).numInput.$dom.show(); } }; /** * 刷新任务, * 1. 删除为空的folder(最后一个除外) * 2. 添加容器后,刷新容器 * 3. 刷新任务的drake(负责任务的拖动排序) */ refresh_fn = function() { for (let i = __privateGet(this, _queue).task.length - 2; i >= 0; i--) { const folder = __privateGet(this, _queue).task[i]; if (folder.length === 0) { __privateGet(this, _queue).task.splice(i, 1); const fid = folder.id; $(`.${__privateGet(this, _meta).folderClass}[${__privateGet(this, _meta).folderProp}="${fid}"]`).remove(); } } const addLast = __privateGet(this, _queue).task.length === 0 || __privateGet(this, _queue).task[__privateGet(this, _queue).task.length - 1].length > 0; if (addLast) { const id = __privateGet(this, _id).next().value; __privateGet(this, _queue).task.push(new Folder(id)); $(`#${__privateGet(this, _meta).containerId}`).append(__privateGet(this, _meta).container.id(id)``); } $(`.${__privateGet(this, _meta).folderClass}`).off("click").on("click", (e) => { const t = $(e.target); if (t.hasClass(__privateGet(this, _meta).folderClass)) { t.toggleClass(__privateGet(this, _meta).folderActiveClass); } else { $(`.${__privateGet(this, _meta).folderClass}`).removeClass(__privateGet(this, _meta).folderActiveClass); t.addClass(__privateGet(this, _meta).folderActiveClass); } }); $(`.${__privateGet(this, _meta).taskClass}>p>span`).off("click").on("click", (e) => { const t = $(e.target); log$3.debug("current task: ", t.parent().parent()); const id = Number.parseInt(t.parent().parent().attr(__privateGet(this, _meta).taskProp)); log$3.debug("current task id: ", id); __privateMethod(this, _任务队列_instances, removeTask_fn).call(this, id); __privateGet(this, _queue).callback(JSON.parse(JSON.stringify(__privateGet(this, _queue).task))); }); __privateGet(this, _queue).taskDrake.containers.length = 0; __privateGet(this, _queue).taskDrake.containers.push(...$(`.${__privateGet(this, _meta).dataContainerClass}`).toArray()); }; addTask_fn = function(...tasks) { if (tasks.length === 0) return; const [task, ...ts] = tasks; const activeId = $(`.${__privateGet(this, _meta).folderClass}.${__privateGet(this, _meta).folderActiveClass}`).attr(__privateGet(this, _meta).folderProp); let folder; if (activeId) { folder = __privateGet(this, _queue).task.find((folder2) => folder2.id === Number(activeId)); } else { folder = __privateGet(this, _queue).task[__privateGet(this, _queue).task.length - 1]; } if (!folder) { moe$7.error(`【${this.name}】插件异常!选择的FolderId在Folder中不存在`); return; } folder.push(task); const id = folder.id; const taskhtml = __privateMethod(this, _任务队列_instances, task2Html_fn).call(this, task).join(""); log$3.debug(`添加任务: `, taskhtml); $(`.${__privateGet(this, _meta).folderClass}[${__privateGet(this, _meta).folderProp}="${id}"] > div`).append(taskhtml); if (ts.length > 0) { __privateMethod(this, _任务队列_instances, addTask_fn).call(this, ...ts); } else { __privateMethod(this, _任务队列_instances, refresh_fn).call(this); } }; removeTask_fn = function(id) { $(`.${__privateGet(this, _meta).taskClass}[${__privateGet(this, _meta).taskProp}="${id}"]`).remove(); for (const folder of __privateGet(this, _queue).task) { for (let i = 0; i < folder.length; i++) { const task = folder[i]; if (task.id === id) { folder.splice(i, 1); log$3.debug("removeTask,准备刷新: ", JSON.stringify(__privateGet(this, _queue).task)); __privateMethod(this, _任务队列_instances, refresh_fn).call(this); return; } } } }; const option$7 = new 任务队列(); const log$2 = getLogger("option/合成木材", "console"); const moe$6 = getLogger("option/合成木材", "moe"); let description$4 = (_a = class { constructor(selected, sval, unit, uval) { __privateAdd(this, _selected2); __privateAdd(this, _sval); __privateAdd(this, _unit); __privateAdd(this, _uval); __publicField(this, "deactivate", "停止自动合成木材"); __privateSet(this, _selected2, selected); __privateSet(this, _sval, sval); __privateSet(this, _unit, unit); __privateSet(this, _uval, uval); } get activate() { const unitMap = { threshold: "%", number: "次" }; const uval = __privateGet(this, _uval).call(this) + unitMap[__privateGet(this, _unit).call(this)]; const selected = __privateGet(this, _selected2).call(this); const sval = __privateGet(this, _sval).call(this); if (selected === "time") { return `可合成${sval}次木材时,合成${uval}木材`; } else if (selected === "threshold") { return `猫薄荷达到${sval}%时,合成${uval}木材`; } else if (selected === "number") { return `猫薄荷达到${sval}株时,合成${uval}木材`; } throw new Error("未设置合成木材方式"); } }, _selected2 = new WeakMap(), _sval = new WeakMap(), _unit = new WeakMap(), _uval = new WeakMap(), _a); class 合成木材 { constructor() { __privateAdd(this, _合成木材_instances); __publicField(this, "index", 1); __publicField(this, "panel", "合成"); __publicField(this, "name", "自动合成木材"); __publicField(this, "flag", "合成木材"); __publicField(this, "crossSaver", true); __privateAdd(this, _config4, { activate: false, select: "threshold", selectVal: 95, lastSelectTime: 1, lastSelectThreshold: 95, lastSelectNumber: 100, unit: "number", unitVal: 1, lastUnitThreshold: 95, lastUnitNumber: 1 }); __publicField(this, "description", new description$4( () => __privateGet(this, _config4).select, () => __privateGet(this, _config4).selectVal, () => __privateGet(this, _config4).unit, () => __privateGet(this, _config4).unitVal )); // 猫薄荷判断 __privateAdd(this, _sourceNum); __privateAdd(this, _span2); // 合成数量判断 __privateAdd(this, _generateNum); __privateAdd(this, _generateSelect, new SelectComponent([ { value: "threshold", name: "%" }, { value: "number", name: "次" } ])); __publicField(this, "period", timeobj.sec(30)); __privateAdd(this, _from, "catnip"); __privateAdd(this, _to, "wood"); __publicField(this, "label", "木材"); __publicField(this, "repeat", (t = 1) => { if (t < 1) return 0; const time = __privateMethod(this, _合成木材_instances, getCraftCount_fn).call(this); if (time < 1) return 0; const min2 = Math.min(time, t); const rs = __privateMethod(this, _合成木材_instances, craft_fn).call(this, min2, false); return rs ? min2 : 0; }); __publicField(this, "until", (num) => { const game2 = Moe.getInstance().game; const val = game2.resPool.get(__privateGet(this, _from)).value; if (val >= num) return true; const ctime = __privateMethod(this, _合成木材_instances, getCraftCount_fn).call(this); if (ctime < 1) return false; const subtraction = num - val; const to = game2.workshop.getCraft(__privateGet(this, _to)); const price = game2.workshop.getCraftPrice(to)[0]; const time = Math.ceil(subtraction / price.val); __privateMethod(this, _合成木材_instances, craft_fn).call(this, time); const nval = game2.resPool.get(__privateGet(this, _from)).value; return nval >= num; }); } /** * ${this.name}${sourceSelectHtml} * @param config * @param callback * @returns */ dom(config, callback) { if (config) __privateSet(this, _config4, config); const select = new SelectComponent([ { value: "", name: "" }, { value: "time", name: "可合成次数" }, { value: "threshold", name: "猫薄荷阈值" }, { value: "number", name: "猫薄荷数量" } ]).create((config == null ? void 0 : config.activate) ? config.select : "", (select2) => { if (!select2) { __privateMethod(this, _合成木材_instances, deactivate_fn2).call(this); __privateGet(this, _config4).activate = false; callback(JSON.parse(JSON.stringify(__privateGet(this, _config4)))); } else { if (__privateGet(this, _config4).activate && __privateGet(this, _config4).select === select2) return; if (__privateGet(this, _config4).selectVal) { if (__privateGet(this, _config4).select === "time") { __privateGet(this, _config4).lastSelectTime = __privateGet(this, _config4).selectVal; } else if (__privateGet(this, _config4).select === "threshold") { __privateGet(this, _config4).lastSelectThreshold = __privateGet(this, _config4).selectVal; } else if (__privateGet(this, _config4).select === "number") { __privateGet(this, _config4).lastSelectNumber = __privateGet(this, _config4).selectVal; } } if (select2 === "time") { __privateGet(this, _config4).selectVal = __privateGet(this, _config4).lastSelectTime; } else if (select2 === "threshold") { __privateGet(this, _config4).selectVal = __privateGet(this, _config4).lastSelectThreshold; } else if (select2 === "number") { __privateGet(this, _config4).selectVal = __privateGet(this, _config4).lastSelectNumber; } __privateGet(this, _config4).activate = true; __privateGet(this, _config4).select = select2; callback(JSON.parse(JSON.stringify(__privateGet(this, _config4)))); __privateMethod(this, _合成木材_instances, loadHtml_fn).call(this, callback); } }); __privateSet(this, _span2, $(``)); if (config == null ? void 0 : config.activate) __privateMethod(this, _合成木材_instances, loadHtml_fn).call(this, callback); const dom = $().add(document.createTextNode(this.name)).add(select).add(__privateGet(this, _span2)); return dom; } script() { if (!__privateGet(this, _config4).activate) return false; const game2 = Moe.getInstance().game; let isdo = false; let msg = ""; const select = __privateGet(this, _config4).select; const sval = __privateGet(this, _config4).selectVal; if (select === "time") { const time = __privateMethod(this, _合成木材_instances, getCraftCount_fn).call(this); isdo = time >= sval; msg = `可合成次数(${time})已达到设定值(${sval}),`; } else if (select === "threshold") { const cn = game2.resPool.get(__privateGet(this, _from)); const threshold = +(cn.value / cn.maxValue * 100).toFixed(1); isdo = threshold >= sval; msg = `猫薄荷数量(${threshold}%)达到阈值(${sval}%),`; } else if (select === "number") { const cnVal = game2.resPool.get(__privateGet(this, _from)).value; isdo = cnVal >= sval; msg = `猫薄荷数量(${cnVal})已达到设定值(${sval}),`; } if (!isdo) return false; const unit = __privateGet(this, _config4).unit; const uval = __privateGet(this, _config4).unitVal; if (unit === "threshold") { const source = game2.workshop.getCraft(__privateGet(this, _to)); const price = game2.workshop.getCraftPrice(source); const cnVal = game2.resPool.get(__privateGet(this, _from)).maxValue; const maxTime = Math.floor(cnVal / price[0].val); const time = Math.floor(maxTime * (uval / 100)); msg += `尝试合成${time}次(${uval}%)木材`; moe$6.debug(msg); return __privateMethod(this, _合成木材_instances, craft_fn).call(this, time); } else if (unit === "number") { msg += `尝试合成${uval}次木材`; moe$6.debug(msg); return __privateMethod(this, _合成木材_instances, craft_fn).call(this, uval); } return false; } } _config4 = new WeakMap(); _sourceNum = new WeakMap(); _span2 = new WeakMap(); _generateNum = new WeakMap(); _generateSelect = new WeakMap(); _合成木材_instances = new WeakSet(); // [--/可合成次数/猫薄荷数量/猫薄荷阈值]达到[number](次/株/%)时,合成(猫薄荷上限)[number][次/%]木材 loadHtml_fn = function(callback) { if (!__privateGet(this, _config4).activate) return; const container = __privateGet(this, _span2); container.empty(); if (__privateGet(this, _config4).select === "time") { __privateSet(this, _sourceNum, new NumInputComponent({ min: 1, step: 1, label: "次" })); } else if (__privateGet(this, _config4).select === "threshold") { __privateSet(this, _sourceNum, new NumInputComponent({ min: 1, max: 100, step: 1, label: "%" })); } else if (__privateGet(this, _config4).select === "number") { __privateSet(this, _sourceNum, new NumInputComponent({ min: 1, step: 1, label: "株" })); } if (__privateGet(this, _config4).unit === "threshold") { __privateSet(this, _generateNum, new NumInputComponent({ min: 1, step: 1, prelabel: "最大可合成次数" })); } else if (__privateGet(this, _config4).unit === "number") { __privateSet(this, _generateNum, new NumInputComponent({ min: 1, step: 1 })); } const sourceNum = __privateGet(this, _sourceNum).create(__privateGet(this, _config4).selectVal, (val) => { __privateGet(this, _config4).selectVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config4)))); }); const generateNum = __privateGet(this, _generateNum).create(__privateGet(this, _config4).unitVal, (val) => { __privateGet(this, _config4).unitVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config4)))); }); const generateSelect = __privateGet(this, _generateSelect).create(__privateGet(this, _config4).unit, (select) => { log$2.debug("合成木材", select); if (__privateGet(this, _config4).unit === select) return; if (__privateGet(this, _config4).unit === "threshold") { __privateGet(this, _config4).lastUnitThreshold = __privateGet(this, _config4).unitVal; } else if (__privateGet(this, _config4).unit === "number") { __privateGet(this, _config4).lastUnitNumber = __privateGet(this, _config4).unitVal; } if (select === "threshold") { __privateGet(this, _config4).unitVal = __privateGet(this, _config4).lastUnitThreshold; } else if (select === "number") { __privateGet(this, _config4).unitVal = __privateGet(this, _config4).lastUnitNumber; } __privateGet(this, _config4).unit = select; callback(JSON.parse(JSON.stringify(__privateGet(this, _config4)))); __privateMethod(this, _合成木材_instances, loadHtml_fn).call(this, callback); }); container.append( "达到", sourceNum, "时,合成", generateNum, generateSelect, "木材" ); }; deactivate_fn2 = function() { if (!__privateGet(this, _config4).activate) return; __privateGet(this, _config4).activate = false; __privateGet(this, _span2).empty(); __privateSet(this, _sourceNum, void 0); if (__privateGet(this, _config4).select === "time") { __privateGet(this, _config4).lastSelectTime = __privateGet(this, _config4).selectVal; } else if (__privateGet(this, _config4).select === "threshold") { __privateGet(this, _config4).lastSelectThreshold = __privateGet(this, _config4).selectVal; } else if (__privateGet(this, _config4).select === "number") { __privateGet(this, _config4).lastSelectNumber = __privateGet(this, _config4).selectVal; } __privateSet(this, _generateNum, void 0); }; _from = new WeakMap(); _to = new WeakMap(); /** * 获取可合成次数 * @returns 可合成次数 */ getCraftCount_fn = function() { const game2 = Moe.getInstance().game; const time = game2.workshop.getCraftAllCount(__privateGet(this, _to)); return time; }; /** * 合成num次木材 * @param num * @param forceAll 资源不足时是否退化为“尽可能合成全部” * @returns 是否合成成功 */ craft_fn = function(num, forceAll = true) { const game2 = Moe.getInstance().game; return game2.workshop.craft(__privateGet(this, _to), num, true, forceAll); }; const option$6 = new 合成木材(); const moe$5 = getLogger("option/合成木梁", "moe"); let description$3 = (_b = class { constructor(selected, sval, unit, uval) { __privateAdd(this, _selected3); __privateAdd(this, _sval2); __privateAdd(this, _unit2); __privateAdd(this, _uval2); __publicField(this, "deactivate", "停止自动合成木梁"); __privateSet(this, _selected3, selected); __privateSet(this, _sval2, sval); __privateSet(this, _unit2, unit); __privateSet(this, _uval2, uval); } get activate() { const unitMap = { threshold: "%", number: "次" }; const uval = __privateGet(this, _uval2).call(this) + unitMap[__privateGet(this, _unit2).call(this)]; const selected = __privateGet(this, _selected3).call(this); const sval = __privateGet(this, _sval2).call(this); if (selected === "time") { return `可合成${sval}次木梁时,合成${uval}木梁`; } else if (selected === "threshold") { return `木材达到${sval}%时,合成${uval}木梁`; } else if (selected === "number") { return `木材达到${sval}个时,合成${uval}木梁`; } throw new Error("未设置合成木梁方式"); } }, _selected3 = new WeakMap(), _sval2 = new WeakMap(), _unit2 = new WeakMap(), _uval2 = new WeakMap(), _b); class 合成木梁 { constructor() { __privateAdd(this, _合成木梁_instances); __publicField(this, "index", 2); __publicField(this, "panel", "合成"); __publicField(this, "name", "自动合成木梁"); __publicField(this, "flag", "合成木梁"); __publicField(this, "crossSaver", true); __privateAdd(this, _config5, { activate: false, select: "threshold", selectVal: 95, lastSelectTime: 1, lastSelectThreshold: 95, lastSelectNumber: 100, unit: "number", unitVal: 1, lastUnitThreshold: 95, lastUnitNumber: 1 }); __publicField(this, "description", new description$3( () => __privateGet(this, _config5).select, () => __privateGet(this, _config5).selectVal, () => __privateGet(this, _config5).unit, () => __privateGet(this, _config5).unitVal )); // 猫薄荷判断 __privateAdd(this, _sourceNum2); __privateAdd(this, _span3); // 合成数量判断 __privateAdd(this, _generateNum2); __privateAdd(this, _generateSelect2, new SelectComponent([ { value: "threshold", name: "%" }, { value: "number", name: "次" } ])); __publicField(this, "period", timeobj.sec(30)); __privateAdd(this, _from2, "wood"); __privateAdd(this, _to2, "beam"); } /** * ${this.name}${sourceSelectHtml} * @param config * @param callback * @returns */ dom(config, callback) { if (config) __privateSet(this, _config5, config); const select = new SelectComponent([ { value: "", name: "" }, { value: "time", name: "可合成次数" }, { value: "threshold", name: "木材阈值" }, { value: "number", name: "木材数量" } ]).create((config == null ? void 0 : config.activate) ? config.select : "", (select2) => { if (!select2) { __privateMethod(this, _合成木梁_instances, deactivate_fn3).call(this); __privateGet(this, _config5).activate = false; callback(JSON.parse(JSON.stringify(__privateGet(this, _config5)))); } else { if (__privateGet(this, _config5).activate && __privateGet(this, _config5).select === select2) return; if (__privateGet(this, _config5).selectVal) { if (__privateGet(this, _config5).select === "time") { __privateGet(this, _config5).lastSelectTime = __privateGet(this, _config5).selectVal; } else if (__privateGet(this, _config5).select === "threshold") { __privateGet(this, _config5).lastSelectThreshold = __privateGet(this, _config5).selectVal; } else if (__privateGet(this, _config5).select === "number") { __privateGet(this, _config5).lastSelectNumber = __privateGet(this, _config5).selectVal; } } if (select2 === "time") { __privateGet(this, _config5).selectVal = __privateGet(this, _config5).lastSelectTime; } else if (select2 === "threshold") { __privateGet(this, _config5).selectVal = __privateGet(this, _config5).lastSelectThreshold; } else if (select2 === "number") { __privateGet(this, _config5).selectVal = __privateGet(this, _config5).lastSelectNumber; } __privateGet(this, _config5).activate = true; __privateGet(this, _config5).select = select2; callback(JSON.parse(JSON.stringify(__privateGet(this, _config5)))); __privateMethod(this, _合成木梁_instances, loadHtml_fn2).call(this, callback); } }); __privateSet(this, _span3, $(``)); if (config == null ? void 0 : config.activate) __privateMethod(this, _合成木梁_instances, loadHtml_fn2).call(this, callback); const dom = $().add(document.createTextNode(this.name)).add(select).add(__privateGet(this, _span3)); return dom; } script() { if (!__privateGet(this, _config5).activate) return false; const game2 = Moe.getInstance().game; let isdo = false; let msg = ""; const select = __privateGet(this, _config5).select; const sval = __privateGet(this, _config5).selectVal; if (select === "time") { const time = game2.workshop.getCraftAllCount(__privateGet(this, _to2)); isdo = time >= sval; msg = `可合成次数(${time})已达到设定值(${sval}),`; } else if (select === "threshold") { const cn = game2.resPool.get(__privateGet(this, _from2)); const threshold = +(cn.value / cn.maxValue * 100).toFixed(1); isdo = threshold >= sval; msg = `木材数量(${threshold}%)达到阈值(${sval}%),`; } else if (select === "number") { const cnVal = game2.resPool.get(__privateGet(this, _from2)).value; isdo = cnVal >= sval; msg = `木材数量(${cnVal})已达到设定值(${sval}),`; } if (!isdo) return false; const unit = __privateGet(this, _config5).unit; const uval = __privateGet(this, _config5).unitVal; if (unit === "threshold") { const source = game2.workshop.getCraft(__privateGet(this, _to2)); const price = game2.workshop.getCraftPrice(source); const cnVal = game2.resPool.get(__privateGet(this, _from2)).maxValue; const maxTime = Math.floor(cnVal / price[0].val); const time = Math.floor(maxTime * (uval / 100)); msg += `尝试合成${time}次(${uval}%)木梁`; moe$5.debug(msg); return game2.workshop.craft(__privateGet(this, _to2), time, true, true, false); } else if (unit === "number") { msg += `尝试合成${uval}次木梁`; moe$5.debug(msg); return game2.workshop.craft(__privateGet(this, _to2), uval, true, true, false); } return false; } } _config5 = new WeakMap(); _sourceNum2 = new WeakMap(); _span3 = new WeakMap(); _generateNum2 = new WeakMap(); _generateSelect2 = new WeakMap(); _合成木梁_instances = new WeakSet(); // [--/可合成次数/木材数量/木材阈值]达到[number](次/个/%)时,合成(猫薄荷上限)[number][次/%]木梁 loadHtml_fn2 = function(callback) { if (!__privateGet(this, _config5).activate) return; const container = __privateGet(this, _span3); container.empty(); if (__privateGet(this, _config5).select === "time") { __privateSet(this, _sourceNum2, new NumInputComponent({ min: 1, step: 1, label: "次" })); } else if (__privateGet(this, _config5).select === "threshold") { __privateSet(this, _sourceNum2, new NumInputComponent({ min: 1, max: 100, step: 1, label: "%" })); } else if (__privateGet(this, _config5).select === "number") { __privateSet(this, _sourceNum2, new NumInputComponent({ min: 1, step: 1, label: "个" })); } if (__privateGet(this, _config5).unit === "threshold") { __privateSet(this, _generateNum2, new NumInputComponent({ min: 1, step: 1, prelabel: "最大可合成次数" })); } else if (__privateGet(this, _config5).unit === "number") { __privateSet(this, _generateNum2, new NumInputComponent({ min: 1, step: 1 })); } const sourceNum = __privateGet(this, _sourceNum2).create(__privateGet(this, _config5).selectVal, (val) => { __privateGet(this, _config5).selectVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config5)))); }); const generateNum = __privateGet(this, _generateNum2).create(__privateGet(this, _config5).unitVal, (val) => { __privateGet(this, _config5).unitVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config5)))); }); const generateSelect = __privateGet(this, _generateSelect2).create(__privateGet(this, _config5).unit, (select) => { if (__privateGet(this, _config5).unit === select) return; if (__privateGet(this, _config5).unit === "threshold") { __privateGet(this, _config5).lastUnitThreshold = __privateGet(this, _config5).unitVal; } else if (__privateGet(this, _config5).unit === "number") { __privateGet(this, _config5).lastUnitNumber = __privateGet(this, _config5).unitVal; } if (select === "threshold") { __privateGet(this, _config5).unitVal = __privateGet(this, _config5).lastUnitThreshold; } else if (select === "number") { __privateGet(this, _config5).unitVal = __privateGet(this, _config5).lastUnitNumber; } __privateGet(this, _config5).unit = select; callback(JSON.parse(JSON.stringify(__privateGet(this, _config5)))); __privateMethod(this, _合成木梁_instances, loadHtml_fn2).call(this, callback); }); container.append( "达到", sourceNum, "时,合成", generateNum, generateSelect, "木梁" ); }; deactivate_fn3 = function() { if (!__privateGet(this, _config5).activate) return; __privateGet(this, _config5).activate = false; __privateGet(this, _span3).empty(); __privateSet(this, _sourceNum2, void 0); if (__privateGet(this, _config5).select === "time") { __privateGet(this, _config5).lastSelectTime = __privateGet(this, _config5).selectVal; } else if (__privateGet(this, _config5).select === "threshold") { __privateGet(this, _config5).lastSelectThreshold = __privateGet(this, _config5).selectVal; } else if (__privateGet(this, _config5).select === "number") { __privateGet(this, _config5).lastSelectNumber = __privateGet(this, _config5).selectVal; } __privateSet(this, _generateNum2, void 0); }; _from2 = new WeakMap(); _to2 = new WeakMap(); const option$5 = new 合成木梁(); const moe$4 = getLogger("option/合成石板", "moe"); let description$2 = (_c = class { constructor(selected, sval, unit, uval) { __privateAdd(this, _selected4); __privateAdd(this, _sval3); __privateAdd(this, _unit3); __privateAdd(this, _uval3); __publicField(this, "deactivate", "停止自动合成石板"); __privateSet(this, _selected4, selected); __privateSet(this, _sval3, sval); __privateSet(this, _unit3, unit); __privateSet(this, _uval3, uval); } get activate() { const unitMap = { threshold: "%", number: "次" }; const uval = __privateGet(this, _uval3).call(this) + unitMap[__privateGet(this, _unit3).call(this)]; const selected = __privateGet(this, _selected4).call(this); const sval = __privateGet(this, _sval3).call(this); if (selected === "time") { return `可合成${sval}次石板时,合成${uval}石板`; } else if (selected === "threshold") { return `木材达到${sval}%时,合成${uval}石板`; } else if (selected === "number") { return `木材达到${sval}个时,合成${uval}石板`; } throw new Error("未设置合成石板方式"); } }, _selected4 = new WeakMap(), _sval3 = new WeakMap(), _unit3 = new WeakMap(), _uval3 = new WeakMap(), _c); class 合成石板 { constructor() { __privateAdd(this, _合成石板_instances); __publicField(this, "index", 3); __publicField(this, "panel", "合成"); __publicField(this, "name", "自动合成石板"); __publicField(this, "flag", "合成石板"); __publicField(this, "crossSaver", true); __privateAdd(this, _config6, { activate: false, select: "threshold", selectVal: 95, lastSelectTime: 1, lastSelectThreshold: 95, lastSelectNumber: 100, unit: "number", unitVal: 1, lastUnitThreshold: 95, lastUnitNumber: 1 }); __publicField(this, "description", new description$2( () => __privateGet(this, _config6).select, () => __privateGet(this, _config6).selectVal, () => __privateGet(this, _config6).unit, () => __privateGet(this, _config6).unitVal )); // 猫薄荷判断 __privateAdd(this, _sourceNum3); __privateAdd(this, _span4); // 合成数量判断 __privateAdd(this, _generateNum3); __privateAdd(this, _generateSelect3, new SelectComponent([ { value: "threshold", name: "%" }, { value: "number", name: "次" } ])); __publicField(this, "period", timeobj.sec(30)); __privateAdd(this, _from3, "minerals"); __privateAdd(this, _to3, "slab"); } /** * ${this.name}${sourceSelectHtml} * @param config * @param callback * @returns */ dom(config, callback) { if (config) __privateSet(this, _config6, config); const select = new SelectComponent([ { value: "", name: "" }, { value: "time", name: "可合成次数" }, { value: "threshold", name: "矿物阈值" }, { value: "number", name: "矿物数量" } ]).create((config == null ? void 0 : config.activate) ? config.select : "", (select2) => { if (!select2) { __privateMethod(this, _合成石板_instances, deactivate_fn4).call(this); __privateGet(this, _config6).activate = false; callback(JSON.parse(JSON.stringify(__privateGet(this, _config6)))); } else { if (__privateGet(this, _config6).activate && __privateGet(this, _config6).select === select2) return; if (__privateGet(this, _config6).selectVal) { if (__privateGet(this, _config6).select === "time") { __privateGet(this, _config6).lastSelectTime = __privateGet(this, _config6).selectVal; } else if (__privateGet(this, _config6).select === "threshold") { __privateGet(this, _config6).lastSelectThreshold = __privateGet(this, _config6).selectVal; } else if (__privateGet(this, _config6).select === "number") { __privateGet(this, _config6).lastSelectNumber = __privateGet(this, _config6).selectVal; } } if (select2 === "time") { __privateGet(this, _config6).selectVal = __privateGet(this, _config6).lastSelectTime; } else if (select2 === "threshold") { __privateGet(this, _config6).selectVal = __privateGet(this, _config6).lastSelectThreshold; } else if (select2 === "number") { __privateGet(this, _config6).selectVal = __privateGet(this, _config6).lastSelectNumber; } __privateGet(this, _config6).activate = true; __privateGet(this, _config6).select = select2; callback(JSON.parse(JSON.stringify(__privateGet(this, _config6)))); __privateMethod(this, _合成石板_instances, loadHtml_fn3).call(this, callback); } }); __privateSet(this, _span4, $(``)); if (config == null ? void 0 : config.activate) __privateMethod(this, _合成石板_instances, loadHtml_fn3).call(this, callback); const dom = $().add(document.createTextNode(this.name)).add(select).add(__privateGet(this, _span4)); return dom; } script() { if (!__privateGet(this, _config6).activate) return false; const game2 = Moe.getInstance().game; let isdo = false; let msg = ""; const select = __privateGet(this, _config6).select; const sval = __privateGet(this, _config6).selectVal; if (select === "time") { const time = game2.workshop.getCraftAllCount(__privateGet(this, _to3)); isdo = time >= sval; msg = `可合成次数(${time})已达到设定值(${sval}),`; } else if (select === "threshold") { const cn = game2.resPool.get(__privateGet(this, _from3)); const threshold = +(cn.value / cn.maxValue * 100).toFixed(1); isdo = threshold >= sval; msg = `矿物数量(${threshold}%)达到阈值(${sval}%),`; } else if (select === "number") { const cnVal = game2.resPool.get(__privateGet(this, _from3)).value; isdo = cnVal >= sval; msg = `矿物数量(${cnVal})已达到设定值(${sval}),`; } if (!isdo) return false; const unit = __privateGet(this, _config6).unit; const uval = __privateGet(this, _config6).unitVal; if (unit === "threshold") { const source = game2.workshop.getCraft(__privateGet(this, _to3)); const price = game2.workshop.getCraftPrice(source); const cnVal = game2.resPool.get(__privateGet(this, _from3)).maxValue; const maxTime = Math.floor(cnVal / price[0].val); const time = Math.floor(maxTime * (uval / 100)); msg += `尝试合成${time}次(${uval}%)石板`; moe$4.debug(msg); return game2.workshop.craft(__privateGet(this, _to3), time, true, true, false); } else if (unit === "number") { msg += `尝试合成${uval}次石板`; moe$4.debug(msg); return game2.workshop.craft(__privateGet(this, _to3), uval, true, true, false); } return false; } } _config6 = new WeakMap(); _sourceNum3 = new WeakMap(); _span4 = new WeakMap(); _generateNum3 = new WeakMap(); _generateSelect3 = new WeakMap(); _合成石板_instances = new WeakSet(); // [--/可合成次数/矿物数量/矿物阈值]达到[number](次/个/%)时,合成(猫薄荷上限)[number][次/%]石板 loadHtml_fn3 = function(callback) { if (!__privateGet(this, _config6).activate) return; const container = __privateGet(this, _span4); container.empty(); if (__privateGet(this, _config6).select === "time") { __privateSet(this, _sourceNum3, new NumInputComponent({ min: 1, step: 1, label: "次" })); } else if (__privateGet(this, _config6).select === "threshold") { __privateSet(this, _sourceNum3, new NumInputComponent({ min: 1, max: 100, step: 1, label: "%" })); } else if (__privateGet(this, _config6).select === "number") { __privateSet(this, _sourceNum3, new NumInputComponent({ min: 1, step: 1, label: "个" })); } if (__privateGet(this, _config6).unit === "threshold") { __privateSet(this, _generateNum3, new NumInputComponent({ min: 1, step: 1, prelabel: "最大可合成次数" })); } else if (__privateGet(this, _config6).unit === "number") { __privateSet(this, _generateNum3, new NumInputComponent({ min: 1, step: 1 })); } const sourceNum = __privateGet(this, _sourceNum3).create(__privateGet(this, _config6).selectVal, (val) => { __privateGet(this, _config6).selectVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config6)))); }); const generateNum = __privateGet(this, _generateNum3).create(__privateGet(this, _config6).unitVal, (val) => { __privateGet(this, _config6).unitVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config6)))); }); const generateSelect = __privateGet(this, _generateSelect3).create(__privateGet(this, _config6).unit, (select) => { if (__privateGet(this, _config6).unit === select) return; if (__privateGet(this, _config6).unit === "threshold") { __privateGet(this, _config6).lastUnitThreshold = __privateGet(this, _config6).unitVal; } else if (__privateGet(this, _config6).unit === "number") { __privateGet(this, _config6).lastUnitNumber = __privateGet(this, _config6).unitVal; } if (select === "threshold") { __privateGet(this, _config6).unitVal = __privateGet(this, _config6).lastUnitThreshold; } else if (select === "number") { __privateGet(this, _config6).unitVal = __privateGet(this, _config6).lastUnitNumber; } __privateGet(this, _config6).unit = select; callback(JSON.parse(JSON.stringify(__privateGet(this, _config6)))); __privateMethod(this, _合成石板_instances, loadHtml_fn3).call(this, callback); }); container.append( "达到", sourceNum, "时,合成", generateNum, generateSelect, "石板" ); }; deactivate_fn4 = function() { if (!__privateGet(this, _config6).activate) return; __privateGet(this, _config6).activate = false; __privateGet(this, _span4).empty(); __privateSet(this, _sourceNum3, void 0); if (__privateGet(this, _config6).select === "time") { __privateGet(this, _config6).lastSelectTime = __privateGet(this, _config6).selectVal; } else if (__privateGet(this, _config6).select === "threshold") { __privateGet(this, _config6).lastSelectThreshold = __privateGet(this, _config6).selectVal; } else if (__privateGet(this, _config6).select === "number") { __privateGet(this, _config6).lastSelectNumber = __privateGet(this, _config6).selectVal; } __privateSet(this, _generateNum3, void 0); }; _from3 = new WeakMap(); _to3 = new WeakMap(); const option$4 = new 合成石板(); const moe$3 = getLogger("option/合成金属板", "moe"); let description$1 = (_d = class { constructor(selected, sval, unit, uval) { __privateAdd(this, _selected5); __privateAdd(this, _sval4); __privateAdd(this, _unit4); __privateAdd(this, _uval4); __publicField(this, "deactivate", "停止自动合成石板"); __privateSet(this, _selected5, selected); __privateSet(this, _sval4, sval); __privateSet(this, _unit4, unit); __privateSet(this, _uval4, uval); } get activate() { const unitMap = { threshold: "%", number: "次" }; const uval = __privateGet(this, _uval4).call(this) + unitMap[__privateGet(this, _unit4).call(this)]; const selected = __privateGet(this, _selected5).call(this); const sval = __privateGet(this, _sval4).call(this); if (selected === "time") { return `可合成${sval}次石板时,合成${uval}石板`; } else if (selected === "threshold") { return `木材达到${sval}%时,合成${uval}石板`; } else if (selected === "number") { return `木材达到${sval}个时,合成${uval}石板`; } throw new Error("未设置合成石板方式"); } }, _selected5 = new WeakMap(), _sval4 = new WeakMap(), _unit4 = new WeakMap(), _uval4 = new WeakMap(), _d); class 合成金属板 { constructor() { __privateAdd(this, _合成金属板_instances); __publicField(this, "index", 4); __publicField(this, "panel", "合成"); __publicField(this, "name", "自动合成金属板"); __publicField(this, "flag", "合成金属板"); __publicField(this, "crossSaver", true); __privateAdd(this, _config7, { activate: false, select: "threshold", selectVal: 95, lastSelectTime: 1, lastSelectThreshold: 95, lastSelectNumber: 100, unit: "number", unitVal: 1, lastUnitThreshold: 95, lastUnitNumber: 1 }); __publicField(this, "description", new description$1( () => __privateGet(this, _config7).select, () => __privateGet(this, _config7).selectVal, () => __privateGet(this, _config7).unit, () => __privateGet(this, _config7).unitVal )); // 猫薄荷判断 __privateAdd(this, _sourceNum4); __privateAdd(this, _span5); // 合成数量判断 __privateAdd(this, _generateNum4); __privateAdd(this, _generateSelect4, new SelectComponent([ { value: "threshold", name: "%" }, { value: "number", name: "次" } ])); __publicField(this, "period", timeobj.sec(30)); __privateAdd(this, _from4, "iron"); __privateAdd(this, _to4, "plate"); } /** * ${this.name}${sourceSelectHtml} * @param config * @param callback * @returns */ dom(config, callback) { if (config) __privateSet(this, _config7, config); const select = new SelectComponent([ { value: "", name: "" }, { value: "time", name: "可合成次数" }, { value: "threshold", name: "铁矿阈值" }, { value: "number", name: "铁矿数量" } ]).create((config == null ? void 0 : config.activate) ? config.select : "", (select2) => { if (!select2) { __privateMethod(this, _合成金属板_instances, deactivate_fn5).call(this); __privateGet(this, _config7).activate = false; callback(JSON.parse(JSON.stringify(__privateGet(this, _config7)))); } else { if (__privateGet(this, _config7).activate && __privateGet(this, _config7).select === select2) return; if (__privateGet(this, _config7).selectVal) { if (__privateGet(this, _config7).select === "time") { __privateGet(this, _config7).lastSelectTime = __privateGet(this, _config7).selectVal; } else if (__privateGet(this, _config7).select === "threshold") { __privateGet(this, _config7).lastSelectThreshold = __privateGet(this, _config7).selectVal; } else if (__privateGet(this, _config7).select === "number") { __privateGet(this, _config7).lastSelectNumber = __privateGet(this, _config7).selectVal; } } if (select2 === "time") { __privateGet(this, _config7).selectVal = __privateGet(this, _config7).lastSelectTime; } else if (select2 === "threshold") { __privateGet(this, _config7).selectVal = __privateGet(this, _config7).lastSelectThreshold; } else if (select2 === "number") { __privateGet(this, _config7).selectVal = __privateGet(this, _config7).lastSelectNumber; } __privateGet(this, _config7).activate = true; __privateGet(this, _config7).select = select2; callback(JSON.parse(JSON.stringify(__privateGet(this, _config7)))); __privateMethod(this, _合成金属板_instances, loadHtml_fn4).call(this, callback); } }); __privateSet(this, _span5, $(``)); if (config == null ? void 0 : config.activate) __privateMethod(this, _合成金属板_instances, loadHtml_fn4).call(this, callback); const dom = $().add(document.createTextNode(this.name)).add(select).add(__privateGet(this, _span5)); return dom; } script() { if (!__privateGet(this, _config7).activate) return false; const game2 = Moe.getInstance().game; let isdo = false; let msg = ""; const select = __privateGet(this, _config7).select; const sval = __privateGet(this, _config7).selectVal; if (select === "time") { const time = game2.workshop.getCraftAllCount(__privateGet(this, _to4)); isdo = time >= sval; msg = `可合成次数(${time})已达到设定值(${sval}),`; } else if (select === "threshold") { const cn = game2.resPool.get(__privateGet(this, _from4)); const threshold = +(cn.value / cn.maxValue * 100).toFixed(1); isdo = threshold >= sval; msg = `铁矿数量(${threshold}%)达到阈值(${sval}%),`; } else if (select === "number") { const cnVal = game2.resPool.get(__privateGet(this, _from4)).value; isdo = cnVal >= sval; msg = `铁矿数量(${cnVal})已达到设定值(${sval}),`; } if (!isdo) return false; const unit = __privateGet(this, _config7).unit; const uval = __privateGet(this, _config7).unitVal; if (unit === "threshold") { const source = game2.workshop.getCraft(__privateGet(this, _to4)); const price = game2.workshop.getCraftPrice(source); const cnVal = game2.resPool.get(__privateGet(this, _from4)).maxValue; const maxTime = Math.floor(cnVal / price[0].val); const time = Math.floor(maxTime * (uval / 100)); msg += `尝试合成${time}次(${uval}%)金属板`; moe$3.debug(msg); return game2.workshop.craft(__privateGet(this, _to4), time, true, true, false); } else if (unit === "number") { msg += `尝试合成${uval}次金属板`; moe$3.debug(msg); return game2.workshop.craft(__privateGet(this, _to4), uval, true, true, false); } return false; } } _config7 = new WeakMap(); _sourceNum4 = new WeakMap(); _span5 = new WeakMap(); _generateNum4 = new WeakMap(); _generateSelect4 = new WeakMap(); _合成金属板_instances = new WeakSet(); // [--/可合成次数/铁矿数量/铁矿阈值]达到[number](次/个/%)时,合成(铁矿上限)[number][次/%]金属板 loadHtml_fn4 = function(callback) { if (!__privateGet(this, _config7).activate) return; const container = __privateGet(this, _span5); container.empty(); if (__privateGet(this, _config7).select === "time") { __privateSet(this, _sourceNum4, new NumInputComponent({ min: 1, step: 1, label: "次" })); } else if (__privateGet(this, _config7).select === "threshold") { __privateSet(this, _sourceNum4, new NumInputComponent({ min: 1, max: 100, step: 1, label: "%" })); } else if (__privateGet(this, _config7).select === "number") { __privateSet(this, _sourceNum4, new NumInputComponent({ min: 1, step: 1, label: "个" })); } if (__privateGet(this, _config7).unit === "threshold") { __privateSet(this, _generateNum4, new NumInputComponent({ min: 1, step: 1, prelabel: "最大可合成次数" })); } else if (__privateGet(this, _config7).unit === "number") { __privateSet(this, _generateNum4, new NumInputComponent({ min: 1, step: 1 })); } const sourceNum = __privateGet(this, _sourceNum4).create(__privateGet(this, _config7).selectVal, (val) => { __privateGet(this, _config7).selectVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config7)))); }); const generateNum = __privateGet(this, _generateNum4).create(__privateGet(this, _config7).unitVal, (val) => { __privateGet(this, _config7).unitVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config7)))); }); const generateSelect = __privateGet(this, _generateSelect4).create(__privateGet(this, _config7).unit, (select) => { if (__privateGet(this, _config7).unit === select) return; if (__privateGet(this, _config7).unit === "threshold") { __privateGet(this, _config7).lastUnitThreshold = __privateGet(this, _config7).unitVal; } else if (__privateGet(this, _config7).unit === "number") { __privateGet(this, _config7).lastUnitNumber = __privateGet(this, _config7).unitVal; } if (select === "threshold") { __privateGet(this, _config7).unitVal = __privateGet(this, _config7).lastUnitThreshold; } else if (select === "number") { __privateGet(this, _config7).unitVal = __privateGet(this, _config7).lastUnitNumber; } __privateGet(this, _config7).unit = select; callback(JSON.parse(JSON.stringify(__privateGet(this, _config7)))); __privateMethod(this, _合成金属板_instances, loadHtml_fn4).call(this, callback); }); container.append( "达到", sourceNum, "时,合成", generateNum, generateSelect, "金属板" ); }; deactivate_fn5 = function() { if (!__privateGet(this, _config7).activate) return; __privateGet(this, _config7).activate = false; __privateGet(this, _span5).empty(); __privateSet(this, _sourceNum4, void 0); if (__privateGet(this, _config7).select === "time") { __privateGet(this, _config7).lastSelectTime = __privateGet(this, _config7).selectVal; } else if (__privateGet(this, _config7).select === "threshold") { __privateGet(this, _config7).lastSelectThreshold = __privateGet(this, _config7).selectVal; } else if (__privateGet(this, _config7).select === "number") { __privateGet(this, _config7).lastSelectNumber = __privateGet(this, _config7).selectVal; } __privateSet(this, _generateNum4, void 0); }; _from4 = new WeakMap(); _to4 = new WeakMap(); const option$3 = new 合成金属板(); const moe$2 = getLogger("option/合成钢", "moe"); class description { constructor(selected, sval, unit, uval) { __privateAdd(this, _selected6); __privateAdd(this, _sval5); __privateAdd(this, _unit5); __privateAdd(this, _uval5); __publicField(this, "deactivate", "停止自动合成钢"); __privateSet(this, _selected6, selected); __privateSet(this, _sval5, sval); __privateSet(this, _unit5, unit); __privateSet(this, _uval5, uval); } get activate() { const unitMap = { threshold: "%", number: "次" }; const uval = __privateGet(this, _uval5).call(this) + unitMap[__privateGet(this, _unit5).call(this)]; const selected = __privateGet(this, _selected6).call(this); const sval = __privateGet(this, _sval5).call(this); if (selected === "time") { return `可合成${sval}次钢时,合成${uval}钢`; } else if (selected === "ironThreshold") { return `铁矿达到${sval}%时,合成${uval}钢`; } else if (selected === "ironNumber") { return `铁矿达到${sval}个时,合成${uval}钢`; } else if (selected === "coalThreshold") { return `煤矿达到${sval}%时,合成${uval}钢`; } else if (selected === "coalNumber") { return `煤矿达到${sval}个时,合成${uval}钢`; } throw new Error("未设置合成钢方式"); } } _selected6 = new WeakMap(); _sval5 = new WeakMap(); _unit5 = new WeakMap(); _uval5 = new WeakMap(); class 合成钢 { constructor() { __privateAdd(this, _合成钢_instances); __publicField(this, "index", 5); __publicField(this, "panel", "合成"); __publicField(this, "name", "自动合成钢"); __publicField(this, "flag", "合成钢"); __publicField(this, "crossSaver", true); __privateAdd(this, _config8, { activate: false, select: "coalThreshold", selectVal: 95, lastSelectTime: 1, lastSelectThreshold: 95, lastSelectNumber: 100, unit: "number", unitVal: 1, lastUnitThreshold: 95, lastUnitNumber: 1 }); __publicField(this, "description", new description( () => __privateGet(this, _config8).select, () => __privateGet(this, _config8).selectVal, () => __privateGet(this, _config8).unit, () => __privateGet(this, _config8).unitVal )); // 猫薄荷判断 __privateAdd(this, _sourceNum5); __privateAdd(this, _span6); // 合成数量判断 __privateAdd(this, _generateNum5); __privateAdd(this, _generateSelect5, new SelectComponent([ { value: "threshold", name: "%" }, { value: "number", name: "次" } ])); __publicField(this, "period", timeobj.sec(30)); __privateAdd(this, _fromIron, "iron"); __privateAdd(this, _fromCoal, "coal"); __privateAdd(this, _to5, "steel"); } /** * ${this.name}${sourceSelectHtml} * @param config * @param callback * @returns */ dom(config, callback) { if (config) __privateSet(this, _config8, config); const select = new SelectComponent([ { value: "", name: "" }, { value: "time", name: "可合成次数" }, { value: "ironThreshold", name: "铁矿阈值" }, { value: "ironNumber", name: "铁矿数量" }, { value: "coalThreshold", name: "煤矿阈值" }, { value: "coalNumber", name: "煤矿数量" } ]).create((config == null ? void 0 : config.activate) ? config.select : "", (select2) => { if (!select2) { __privateMethod(this, _合成钢_instances, deactivate_fn6).call(this); __privateGet(this, _config8).activate = false; callback(JSON.parse(JSON.stringify(__privateGet(this, _config8)))); } else { if (__privateGet(this, _config8).activate && __privateGet(this, _config8).select === select2) return; if (__privateGet(this, _config8).selectVal) { if (__privateGet(this, _config8).select === "time") { __privateGet(this, _config8).lastSelectTime = __privateGet(this, _config8).selectVal; } else if (__privateGet(this, _config8).select === "ironThreshold" || __privateGet(this, _config8).select === "coalThreshold") { __privateGet(this, _config8).lastSelectThreshold = __privateGet(this, _config8).selectVal; } else if (__privateGet(this, _config8).select === "ironNumber" || __privateGet(this, _config8).select === "coalNumber") { __privateGet(this, _config8).lastSelectNumber = __privateGet(this, _config8).selectVal; } } if (select2 === "time") { __privateGet(this, _config8).selectVal = __privateGet(this, _config8).lastSelectTime; } else if (select2 === "ironThreshold" || select2 === "coalThreshold") { __privateGet(this, _config8).selectVal = __privateGet(this, _config8).lastSelectThreshold; } else if (select2 === "ironNumber" || select2 === "coalNumber") { __privateGet(this, _config8).selectVal = __privateGet(this, _config8).lastSelectNumber; } __privateGet(this, _config8).activate = true; __privateGet(this, _config8).select = select2; callback(JSON.parse(JSON.stringify(__privateGet(this, _config8)))); __privateMethod(this, _合成钢_instances, loadHtml_fn5).call(this, callback); } }); __privateSet(this, _span6, $(``)); if (config == null ? void 0 : config.activate) __privateMethod(this, _合成钢_instances, loadHtml_fn5).call(this, callback); const dom = $().add(document.createTextNode(this.name)).add(select).add(__privateGet(this, _span6)); return dom; } script() { var _a2, _b2; if (!__privateGet(this, _config8).activate) return false; const game2 = Moe.getInstance().game; let isdo = false; let msg = ""; const select = __privateGet(this, _config8).select; const sval = __privateGet(this, _config8).selectVal; if (select === "time") { const time = game2.workshop.getCraftAllCount(__privateGet(this, _to5)); isdo = time >= sval; msg = `可合成次数(${time})已达到设定值(${sval}),`; } else if (select === "ironThreshold") { const cn = game2.resPool.get(__privateGet(this, _fromIron)); const threshold = +(cn.value / cn.maxValue * 100).toFixed(1); isdo = threshold >= sval; msg = `铁矿数量(${threshold}%)达到阈值(${sval}%),`; } else if (select === "ironNumber") { const cnVal = game2.resPool.get(__privateGet(this, _fromIron)).value; isdo = cnVal >= sval; msg = `铁矿数量(${cnVal})已达到设定值(${sval}),`; } else if (select === "coalThreshold") { const cn = game2.resPool.get(__privateGet(this, _fromCoal)); const threshold = +(cn.value / cn.maxValue * 100).toFixed(1); isdo = threshold >= sval; msg = `煤矿数量(${threshold}%)达到阈值(${sval}%),`; } else if (select === "coalNumber") { const cnVal = game2.resPool.get(__privateGet(this, _fromCoal)).value; isdo = cnVal >= sval; msg = `煤矿数量(${cnVal})已达到设定值(${sval}),`; } if (!isdo) return false; const unit = __privateGet(this, _config8).unit; const uval = __privateGet(this, _config8).unitVal; if (unit === "threshold") { const source = game2.workshop.getCraft(__privateGet(this, _to5)); const price = game2.workshop.getCraftPrice(source); const ironPrice = (_a2 = price.find((item) => item.name === "iron")) == null ? void 0 : _a2.val; const coalPrice = (_b2 = price.find((item) => item.name === "coal")) == null ? void 0 : _b2.val; const ironVal = game2.resPool.get(__privateGet(this, _fromIron)).maxValue; const ironMax = Math.floor(ironVal / ironPrice); const coalVal = game2.resPool.get(__privateGet(this, _fromCoal)).maxValue; const coalMax = Math.floor(coalVal / coalPrice); const maxTime = Math.min(ironMax, coalMax); const time = Math.floor(maxTime * (uval / 100)); msg += `尝试合成${time}次(${uval}%)钢`; moe$2.debug(msg); return game2.workshop.craft(__privateGet(this, _to5), time, true, true, false); } else if (unit === "number") { msg += `尝试合成${uval}次钢`; moe$2.debug(msg); return game2.workshop.craft(__privateGet(this, _to5), uval, true, true, false); } return false; } } _config8 = new WeakMap(); _sourceNum5 = new WeakMap(); _span6 = new WeakMap(); _generateNum5 = new WeakMap(); _generateSelect5 = new WeakMap(); _合成钢_instances = new WeakSet(); // [--/可合成次数/铁矿数量/铁矿阈值/煤矿数量/煤矿阈值]达到[number](次/个/%)时,合成(铁矿上限)[number][次/%]钢 loadHtml_fn5 = function(callback) { if (!__privateGet(this, _config8).activate) return; const container = __privateGet(this, _span6); container.empty(); if (__privateGet(this, _config8).select === "time") { __privateSet(this, _sourceNum5, new NumInputComponent({ min: 1, step: 1, label: "次" })); } else if (__privateGet(this, _config8).select === "ironThreshold" || __privateGet(this, _config8).select === "coalThreshold") { __privateSet(this, _sourceNum5, new NumInputComponent({ min: 1, max: 100, step: 1, label: "%" })); } else if (__privateGet(this, _config8).select === "ironNumber" || __privateGet(this, _config8).select === "coalNumber") { __privateSet(this, _sourceNum5, new NumInputComponent({ min: 1, step: 1, label: "个" })); } if (__privateGet(this, _config8).unit === "threshold") { __privateSet(this, _generateNum5, new NumInputComponent({ min: 1, step: 1, prelabel: "最大可合成次数" })); } else if (__privateGet(this, _config8).unit === "number") { __privateSet(this, _generateNum5, new NumInputComponent({ min: 1, step: 1 })); } const sourceNum = __privateGet(this, _sourceNum5).create(__privateGet(this, _config8).selectVal, (val) => { __privateGet(this, _config8).selectVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config8)))); }); const generateNum = __privateGet(this, _generateNum5).create(__privateGet(this, _config8).unitVal, (val) => { __privateGet(this, _config8).unitVal = val; callback(JSON.parse(JSON.stringify(__privateGet(this, _config8)))); }); const generateSelect = __privateGet(this, _generateSelect5).create(__privateGet(this, _config8).unit, (select) => { if (__privateGet(this, _config8).unit === select) return; if (__privateGet(this, _config8).unit === "threshold") { __privateGet(this, _config8).lastUnitThreshold = __privateGet(this, _config8).unitVal; } else if (__privateGet(this, _config8).unit === "number") { __privateGet(this, _config8).lastUnitNumber = __privateGet(this, _config8).unitVal; } if (select === "threshold") { __privateGet(this, _config8).unitVal = __privateGet(this, _config8).lastUnitThreshold; } else if (select === "number") { __privateGet(this, _config8).unitVal = __privateGet(this, _config8).lastUnitNumber; } __privateGet(this, _config8).unit = select; callback(JSON.parse(JSON.stringify(__privateGet(this, _config8)))); __privateMethod(this, _合成钢_instances, loadHtml_fn5).call(this, callback); }); container.append( "达到", sourceNum, "时,合成", generateNum, generateSelect, "钢" ); }; deactivate_fn6 = function() { if (!__privateGet(this, _config8).activate) return; __privateGet(this, _config8).activate = false; __privateGet(this, _span6).empty(); __privateSet(this, _sourceNum5, void 0); if (__privateGet(this, _config8).select === "time") { __privateGet(this, _config8).lastSelectTime = __privateGet(this, _config8).selectVal; } else if (__privateGet(this, _config8).select === "ironThreshold" || __privateGet(this, _config8).select === "coalThreshold") { __privateGet(this, _config8).lastSelectThreshold = __privateGet(this, _config8).selectVal; } else if (__privateGet(this, _config8).select === "ironNumber" || __privateGet(this, _config8).select === "coalNumber") { __privateGet(this, _config8).lastSelectNumber = __privateGet(this, _config8).selectVal; } __privateSet(this, _generateNum5, void 0); }; _fromIron = new WeakMap(); _fromCoal = new WeakMap(); _to5 = new WeakMap(); const option$2 = new 合成钢(); const log$1 = getLogger("option/合成羊皮纸.打猎后", "console"); const moe$1 = getLogger("option/合成羊皮纸.打猎后", "moe"); class 打猎后合成羊皮纸 { constructor() { __privateAdd(this, _打猎后合成羊皮纸_instances); __publicField(this, "index", 14); __publicField(this, "panel", "合成"); __publicField(this, "name", "打猎后合成羊皮纸"); __publicField(this, "description", { activate: "派出猎人后,会自动将毛皮合成为羊皮纸", deactivate: "" }); __publicField(this, "flag", "合成羊皮纸-打猎后"); __publicField(this, "crossSaver", true); __privateAdd(this, _config9, { activate: false, val: 0, select: "number" }); __privateAdd(this, _numInput2); __privateAdd(this, _container); __privateAdd(this, _from5, "furs"); __privateAdd(this, _to6, "parchment"); } // 打猎后自动合成(可合成次数)[number][次/%]羊皮纸 dom(config, callback) { if (config) __privateSet(this, _config9, config); const select = new SelectComponent([ { value: "number", name: "次" }, { value: "threshold", name: "%" } ]).create(__privateGet(this, _config9).select, (select2) => { if (select2 === __privateGet(this, _config9).select) return; __privateGet(this, _config9).select = select2; callback(JSON.parse(JSON.stringify(__privateGet(this, _config9))), { justUpdate: true }); __privateMethod(this, _打猎后合成羊皮纸_instances, loadHtml_fn6).call(this, callback); }); __privateSet(this, _container, $(``)); __privateMethod(this, _打猎后合成羊皮纸_instances, loadHtml_fn6).call(this, callback); if (__privateGet(this, _config9).activate) { const event = Moe.getInstance().event; event.on.hunt(this.flag, () => { this.script(); }); } return $().add(document.createTextNode("打猎后自动合成")).add(__privateGet(this, _container)).add(select).add(document.createTextNode("羊皮纸")); } /** * 执行合成羊皮纸 * @returns */ script() { if (!__privateGet(this, _config9).activate) return false; const game2 = Moe.getInstance().game; const select = __privateGet(this, _config9).select; const val = __privateGet(this, _config9).val; log$1.debug("打猎后合成羊皮纸: ", __privateGet(this, _config9)); if (select === "threshold") { const all = game2.workshop.getCraftAllCount(__privateGet(this, _to6)); if (all === 0) return false; const time = Math.floor(all * (val / 100)); let result = false; if (time > 0) { result = game2.workshop.craft(__privateGet(this, _to6), time, true, true, false); } moe$1.debug(`本次打猎后,可合成羊皮纸${all}次,尝试合成${time}次(${val}%)羊皮纸`); return result; } else if (select === "number") { const cnVal = game2.resPool.get(__privateGet(this, _from5)).value.toFixed(2); const result = game2.workshop.craft(__privateGet(this, _to6), val, true, true, false); moe$1.debug(`本次打猎后,毛皮数量为${cnVal},尝试合成${val}次羊皮纸`); return result; } return false; } } _config9 = new WeakMap(); _numInput2 = new WeakMap(); _container = new WeakMap(); _打猎后合成羊皮纸_instances = new WeakSet(); loadHtml_fn6 = function(callback) { let hasDe = false; if (__privateGet(this, _config9).select === "number") { __privateSet(this, _numInput2, new NumInputComponent({ min: 0, step: 1, label: "次" })); } else if (__privateGet(this, _config9).select === "threshold") { __privateSet(this, _numInput2, new NumInputComponent({ min: 0, max: 100, step: 1, label: "%", prelabel: "可合成次数" })); hasDe = true; } const container = __privateGet(this, _container); container.empty(); const num = __privateGet(this, _numInput2).create(__privateGet(this, _config9).val, (val) => { if (val > 0) { if (!__privateGet(this, _config9).activate) { __privateGet(this, _config9).activate = true; const event = Moe.getInstance().event; event.on.hunt(this.flag, () => { this.script(); }); } __privateGet(this, _config9).val = val; } else { const event = Moe.getInstance().event; event.off.hunt(this.flag); __privateGet(this, _config9).activate = false; __privateGet(this, _config9).val = 0; } callback(JSON.parse(JSON.stringify(__privateGet(this, _config9)))); }); container.append(num, hasDe ? "的" : ""); }; _from5 = new WeakMap(); _to6 = new WeakMap(); const option$1 = new 打猎后合成羊皮纸(); var option; ((option2) => { const options = Object.freeze([ option$c, option$b, option$a, option$9, option$8, option$7, option$6, option$5, option$4, option$3, option$2, option$1 ]); function load() { return options; } option2.load = load; })(option || (option = {})); var Queue; ((Queue2) => { const queueFunction = []; function isQueueFunction(option2) { if (!("label" in option2)) return false; if ("onceable" in option2 && "once" in option2 && typeof option2.once === "function") { return true; } if ("repeat" in option2 && typeof option2.repeat === "function" && "until" in option2 && typeof option2.until === "function") { return true; } return false; } function load() { const options = option.load(); const rs = [...queueFunction]; for (const option2 of options) { if (isQueueFunction(option2)) { rs.push(option2); } } return Object.freeze(rs); } Queue2.load = load; })(Queue || (Queue = {})); const log = getLogger("moe", "console"); const moe = getLogger("moe", "moe"); const NAME = "喵喵插件~"; const FLAG = "MOE"; class EventQueue { constructor() { __publicField(this, "before", {}); __publicField(this, "after", {}); } on(before, after) { const on = function(flag, fn) { on.after(flag, fn); }; if (before === "default") before = void 0; on.before = before ?? ((flag, fn) => { this.before[flag] = fn; }); on.after = after ?? ((flag, fn) => { this.after[flag] = fn; }); on.beforeOnce = (flag, fn) => { this.before[flag] = (...params) => { fn(...params); delete this.before[flag]; }; }; on.afterOnce = (flag, fn) => { this.after[flag] = (...params) => { fn(...params); delete this.after[flag]; }; }; return on; } off(before, after) { const off = function(flag) { off.after(flag); }; if (before === "default") before = void 0; off.before = before ?? ((flag) => { delete this.before[flag]; }); off.after = after ?? ((flag) => { delete this.after[flag]; }); return off; } } function createEventQueueOn(before, after, beforeOnce, afterOnce) { return Object.assign(function(...params) { after(...params); }, { before, after, beforeOnce, afterOnce }); } function createEventQueueOff(before, after) { return Object.assign(function(...params) { after(...params); }, { before, after }); } const _MoeEventManager = class _MoeEventManager { constructor() { __privateAdd(this, _MoeEventManager_instances); __publicField(this, "queue", { pause: new EventQueue(), render: {}, import: new EventQueue(), unlock: new EventQueue(), hunt: new EventQueue(), queueAdd: new EventQueue() }); /** * 注册/监听游戏事件 */ __publicField(this, "on", { /** * 游戏暂停/恢复事件 * @param flag * @param fn */ pause: this.queue.pause.on((flag, fn) => { if (flag in this.queue.pause.before) throw new Error(`游戏暂停/恢复(前)监听事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.pause.before[flag] = fn; }, (flag, fn) => { if (flag in this.queue.pause.after) throw new Error(`游戏暂停/恢复(后)监听事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.pause.after[flag] = fn; }), /** * ui渲染事件,渲染tab页时,会传入tabContainer参数,渲染Queue和Log时,无任何入参 * @param tabId * @param flag * @param fn */ render: createEventQueueOn((tabId, flag, fn) => { const queue = this.queue.render[tabId]; if (!queue) throw new Error(`【${tabId}】tab不存在,请检查是否加载。`); if (flag in queue.before) throw new Error(`${tabId}tab渲染(前)事件注册失败,标识【${flag}】已存在,请更换标识。`); queue.before[flag] = fn; }, (tabId, flag, fn) => { const queue = this.queue.render[tabId]; if (!queue) throw new Error(`【${tabId}】tab不存在,请检查是否加载。`); if (flag in queue.after) throw new Error(`${tabId}tab渲染(后)事件注册失败,标识【${flag}】已存在,请更换标识。`); queue.after[flag] = fn; }, (tabId, flag, fn) => { const queue = this.queue.render[tabId]; if (!queue) throw new Error(`【${tabId}】tab不存在,请检查是否加载。`); if (flag in queue.before) throw new Error(`${tabId}tab渲染(前)事件注册失败,标识【${flag}】已存在,请更换标识。`); queue.before[flag] = (tc) => { fn(tc); delete queue.before[flag]; }; }, (tabId, flag, fn) => { const queue = this.queue.render[tabId]; if (!queue) throw new Error(`【${tabId}】tab不存在,请检查是否加载。`); if (flag in queue.after) throw new Error(`${tabId}tab渲染(后)事件注册失败,标识【${flag}】已存在,请更换标识。`); queue.after[flag] = (tc) => { fn(tc); delete queue.after[flag]; }; }), /** * 游戏存档导入事件 * @param flag * @param fn */ import: this.queue.import.on((flag, fn) => { if (flag in this.queue.import.before) throw new Error(`游戏存档导入(前)事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.import.before[flag] = fn; }, (flag, fn) => { if (flag in this.queue.import.after) throw new Error(`游戏存档导入(后)事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.import.after[flag] = fn; }), /** * 游戏解锁事件 * @param flag * @param fn */ unlock: this.queue.unlock.on((flag, fn) => { if (flag in this.queue.unlock.before) throw new Error(`游戏解锁(前)事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.unlock.before[flag] = fn; }, (flag, fn) => { if (flag in this.queue.unlock.after) throw new Error(`游戏解锁(后)事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.unlock.after[flag] = fn; }), /** * 派出猎人事件 * @param flag * @param fn */ hunt: this.queue.hunt.on((flag, fn) => { if (flag in this.queue.hunt.before) throw new Error(`派出猎人(前)事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.hunt.before[flag] = fn; }, (flag, fn) => { if (flag in this.queue.hunt.after) throw new Error(`派出猎人(后)事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.hunt.after[flag] = fn; }), /** * 添加任务队列事件 * @param flag * @param fn */ queueAdd: this.queue.queueAdd.on((flag, fn) => { if (flag in this.queue.queueAdd.before) throw new Error(`添加任务队列(前)事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.queueAdd.before[flag] = fn; }, (flag, fn) => { if (flag in this.queue.queueAdd.after) throw new Error(`添加任务队列(后)事件注册失败,标识【${flag}】已存在,请更换标识。`); this.queue.queueAdd.after[flag] = fn; }) }); /** * 解除监听 */ __publicField(this, "off", { pause: this.queue.pause.off(), render: createEventQueueOff((tabId, flag) => { const queue = this.queue.render[tabId]; if (!queue) return; delete queue.before[flag]; }, (tabId, flag) => { const queue = this.queue.render[tabId]; if (!queue) return; delete queue.after[flag]; }), import: this.queue.import.off(), unlock: this.queue.unlock.off(), hunt: this.queue.hunt.off(), queueAdd: this.queue.queueAdd.off() }); } static getInstance() { var _a2, _b2, _c2, _d2, _e, _f; if (!_MoeEventManager.instance) { _MoeEventManager.instance = new _MoeEventManager(); __privateMethod(_a2 = _MoeEventManager.instance, _MoeEventManager_instances, pause_fn).call(_a2); __privateMethod(_b2 = _MoeEventManager.instance, _MoeEventManager_instances, tabRender_fn).call(_b2); __privateMethod(_c2 = _MoeEventManager.instance, _MoeEventManager_instances, import_fn).call(_c2); __privateMethod(_d2 = _MoeEventManager.instance, _MoeEventManager_instances, unlock_fn).call(_d2); __privateMethod(_e = _MoeEventManager.instance, _MoeEventManager_instances, hunt_fn).call(_e); __privateMethod(_f = _MoeEventManager.instance, _MoeEventManager_instances, addQueue_fn).call(_f); } return _MoeEventManager.instance; } /** * 因为game.village.gainHuntRes打猎没有消耗喵力,所以这里写一个打猎事件 * 该打猎事件,模拟game.village.huntAll实现 * @param squads 打猎次数 */ hunt(squads) { if (squads <= 0) { return; } const res = game.resPool.get("manpower"); const power = squads * 100; if (res.value < power) { moe.error(`喵力不足,无法执行打猎${squads}次事件`); return; } game.resPool.addResEvent("manpower", -power); game.village.gainHuntRes(squads); if (squads >= 1e3) { const challenge = game.challenges.getChallenge("pacifism"); if (!challenge.unlocked) { challenge.unlocked = true; } } } /** * 导出游戏存档 * @returns */ save() { var data = game.save(); data = JSON.stringify(data); return game.compressLZData(data); } }; _MoeEventManager_instances = new WeakSet(); run_fn2 = function(event, oqueue, ...params) { const flags = Object.keys(oqueue); for (const flag of flags) { try { const fn = oqueue[flag]; if (fn) fn(...params); } catch (e) { moe.error(`执行[${event}]事件时组件${flag}发生错误,详细信息请到浏览器控制台查看。`); log.error(`执行[${event}]事件时组件${flag}发生错误:`, e); } } }; /** * 游戏暂停/恢复事件 */ pause_fn = function() { const togglePause = game.togglePause; game.togglePause = () => { __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "游戏暂停/恢复(前)", this.queue.pause.before, game.isPaused); togglePause.apply(game); __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "游戏暂停/恢复(后)", this.queue.pause.after, game.isPaused); }; }; /** * 游戏ui(tab)渲染事件 */ tabRender_fn = function() { const tabs = game.tabs; for (const tab of tabs) { const id = tab.tabId; const render = tab.render; this.queue.render[id] = new EventQueue(); tab.render = (tabContainer) => { var _a2, _b2; __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, `${tab.tabName}tab渲染(前)`, ((_a2 = this.queue.render[id]) == null ? void 0 : _a2.before) ?? {}, tabContainer); render.call(tab, tabContainer); __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, `${tab.tabName}tab渲染(后)`, ((_b2 = this.queue.render[id]) == null ? void 0 : _b2.after) ?? {}, tabContainer); }; } if (game.ui.loadQueue) { const queueLoader = game.ui.loadQueue; this.queue.render["Queue"] = new EventQueue(); game.ui.loadQueue = () => { var _a2, _b2; __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "任务队列渲染(前)", ((_a2 = this.queue.render["Queue"]) == null ? void 0 : _a2.before) ?? {}); queueLoader.call(game.ui); __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "任务队列渲染(后)", ((_b2 = this.queue.render["Queue"]) == null ? void 0 : _b2.after) ?? {}); }; const logLoader = game.ui.loadLog; this.queue.render["Log"] = new EventQueue(); game.ui.loadLog = () => { var _a2, _b2; __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "日志渲染(前)", ((_a2 = this.queue.render["Log"]) == null ? void 0 : _a2.before) ?? {}); logLoader.call(game.ui); __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "日志渲染(后)", ((_b2 = this.queue.render["Log"]) == null ? void 0 : _b2.after) ?? {}); }; } }; /** * 游戏存档导入事件 */ import_fn = function() { const saveImport = game.saveImportDropboxText; game.saveImportDropboxText = (save, callback) => { saveImport.call(game, save, (e) => { __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "游戏导入(前)", this.queue.import.before, save); callback(e); __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "游戏导入(后)", this.queue.import.after, save); }); }; }; /** * 游戏解锁事件 */ unlock_fn = function() { const unlock = game.unlock; game.unlock = (lock) => { __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "解锁(前)", this.queue.unlock.before, lock); unlock.call(game, lock); __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "解锁(后)", this.queue.unlock.after, lock); }; }; hunt_fn = function() { const hunt = game.village.gainHuntRes; game.village.gainHuntRes = (huntCount) => { __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "派出猎人(前)", this.queue.hunt.before, huntCount); hunt.call(game.village, huntCount); __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "派出猎人(后)", this.queue.hunt.after, huntCount); }; }; /** * * @returns 任务队列添加事件 */ addQueue_fn = function() { if (!game.time.queue) return; const addToQueue = game.time.queue.addToQueue; game.time.queue.addToQueue = (name, type, label, addAll) => { __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "添加任务队列(前)", this.queue.queueAdd.before, name, type, label, addAll); addToQueue.call(game.time.queue, name, type, label, addAll); __privateMethod(this, _MoeEventManager_instances, run_fn2).call(this, "添加任务队列(后)", this.queue.queueAdd.after, name, type, label, addAll); }; }; __publicField(_MoeEventManager, "instance"); let MoeEventManager = _MoeEventManager; const _Moe = class _Moe { constructor() { __privateAdd(this, _Moe_instances); __privateAdd(this, _interval); __privateAdd(this, _timers, { min: { time: 60, // 每分钟60秒 timers: [] }, sec: { time: 1, // 每秒1秒 timers: [] } }); /** * 游戏中的事件控制器 */ __publicField(this, "event", MoeEventManager.getInstance()); /** * moe的选项,用于在浏览器控制台中查看 */ __publicField(this, "options"); } static getInstance() { if (!_Moe.instance) { _Moe.instance = new _Moe(); unsafeWindow.moe = _Moe.instance; } return _Moe.instance; } get game() { return game; } run() { log.info(`加载【${NAME}】`); this.event.on.pause(FLAG, (isPaused) => { if (isPaused) { __privateMethod(this, _Moe_instances, stopLoop_fn).call(this); } else { __privateMethod(this, _Moe_instances, startLoop_fn).call(this); } }); this.event.on.unlock(FLAG, (lock) => { log.debug("触发解锁事件:", lock); const keys = Object.keys(lock); for (const key of keys) { if (!["tabs", "tech", "buildings", "jobs", "pacts", "chronoforge", "policies", "upgrades", "crafts", "zebraUpgrades"].includes(key)) { moe.error(`检测到新的解锁项LockType: ${key},请到控制台查看详细信息。`); return; } } }); view.init(); log.info("加载可执行操作。"); const options = option.load(); this.options = options; setting.init(this.game, options); const viewTimeCreater = view.addOptions(options); this.addTimerCreater(viewTimeCreater); __privateMethod(this, _Moe_instances, startLoop_fn).call(this); } addTimerCreater(creator) { if (creator.sec) { __privateGet(this, _timers).sec.timers.push(creator.sec()); } if (creator.min) { __privateGet(this, _timers).min.timers.push(creator.min()); } } }; _interval = new WeakMap(); _timers = new WeakMap(); _Moe_instances = new WeakSet(); /** * 开启事件循环 */ startLoop_fn = function() { if (__privateGet(this, _interval)) return; __privateSet(this, _interval, setInterval(() => { const secTimers = __privateGet(this, _timers).sec.timers; for (const secTimer of secTimers) { try { secTimer(); } catch (e) { log.error("执行秒级事件时发生错误:", e); } } const min2 = __privateGet(this, _timers).min; min2.time--; if (min2.time <= 0) { min2.time = 60; for (const minTimer of min2.timers) { try { minTimer(); } catch (e) { log.error("执行分钟级事件时发生错误:", e); } } } }, 1e3)); }; /** * 停止事件循环 */ stopLoop_fn = function() { if (__privateGet(this, _interval)) { clearInterval(__privateGet(this, _interval)); __privateSet(this, _interval, void 0); } }; __publicField(_Moe, "instance"); let Moe = _Moe; async function createMoe() { return new Promise((resolve) => { let originalInitGame; function customInitGame() { if (originalInitGame) originalInitGame(); log.info("游戏初始化完成~~"); resolve(Moe.getInstance()); } function overrideInitGame() { if (typeof initGame !== "undefined") { originalInitGame = initGame; unsafeWindow.initGame = customInitGame; } else { setTimeout(overrideInitGame, 100); } } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", overrideInitGame); } else { overrideInitGame(); } }); } (async function() { const moe2 = await createMoe(); moe2.run(); })();