Makes the travel page better.
You may also like 🐭️ MouseHunt - Better Gifts / Gift Buttons.
// ==UserScript== // @name 🐭️ MouseHunt - Better Travel / Travel Tweaks // @description Makes the travel page better. // @version 3.1.0 // @license MIT // @author bradp // @namespace bradp // @match https://www.mousehuntgame.com/* // @icon https://i.mouse.rip/mh-improved/icon-64.png // @run-at document-end // @grant none // @require https://cdn.jsdelivr.net/npm/[email protected] // ==/UserScript== var mhui = (() => { var __defProp = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropNames = Object.getOwnPropertyNames; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp.call(b, prop)) __defNormalProp(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // src/modules/better-travel/index.js var better_travel_exports = {}; __export(better_travel_exports, { default: () => better_travel_default }); // src/utils/event-registry.js var eventsAdded = {}; var onEvent = (event, callback, remove = false) => { if (!eventRegistry) { return; } const id = `${event}-${remove.toString()}-${callback.toString()}`; if (eventsAdded[id]) { return; } eventsAdded[id] = true; eventRegistry.addEventListener(event, callback, null, remove); }; // src/utils/styles.js var addStylesDirect = (styles, identifier = "mh-utils-custom-styles", once = false) => { identifier = `mh-utils-${identifier}`; const existingStyles = document.querySelector(`#${identifier}`); if (existingStyles) { if (once) { return existingStyles; } existingStyles.innerHTML += styles; return existingStyles; } const style = document.createElement("style"); style.id = identifier; style.innerHTML = styles; document.head.append(style); return style; }; var addModuleStyles = (styles, identifier = "mh-improved-styles", replace = false) => { const existingStyles = document.querySelector(`#${identifier}`); styles = Array.isArray(styles) ? styles.join("\n") : styles; if (existingStyles) { if (replace) { existingStyles.innerHTML = styles; } else { existingStyles.innerHTML += styles; } return existingStyles; } const style = document.createElement("style"); style.id = identifier; style.innerHTML = styles; document.head.append(style); return style; }; var addStyles = (styles, module = false, identifier = "mh-improved-styles") => { if (!module) { throw new Error("Module ID is required for adding module styles.", module); } const key = `${identifier}-${module}`; let stylesEl = addModuleStyles(styles, key, true); onEvent(`mh-improved-settings-changed-${module}`, (enabled) => { if (enabled) { stylesEl = addModuleStyles(styles, key, true); } else if (stylesEl) { stylesEl.remove(); } }); }; // src/utils/settings.js var getSettingDirect = (key = null, defaultValue = null, identifier = "mousehunt-improved-settings") => { const settings = JSON.parse(localStorage.getItem(identifier)) || {}; if (!key) { return settings; } if (!key.includes(".")) { if (settings[key] === void 0) { return defaultValue; } return settings[key]; } const groupAndKey = getGroupAndKey(key); if (!groupAndKey.group) { if (settings[groupAndKey.key] === void 0) { return defaultValue; } return settings[groupAndKey.key]; } const groupSettings = settings[groupAndKey.group] || {}; if (groupSettings[groupAndKey.key] === void 0) { return defaultValue; } return groupSettings[groupAndKey.key]; }; var saveSettingDirect = (key, value, identifier = "mousehunt-improved-settings") => { const settings = getSettingDirect(null, {}, identifier); const groupAndKey = getGroupAndKey(key); if (groupAndKey.group) { if (!settings[groupAndKey.group]) { settings[groupAndKey.group] = {}; } settings[groupAndKey.group][groupAndKey.key] = value; } else { settings[key] = value; } localStorage.setItem(identifier, JSON.stringify(settings)); }; var getGroupAndKey = (key) => { const split = key.split("."); if (split.length === 1) { return { group: null, key: split[0] }; } if (split[0] === "location-huds-enabled") { return { group: "location-huds-enabled", key: split[1] }; } return { group: `${split[0]}-settings`, key: split[1] }; }; var getSetting = (key, defaultValue = false) => { return getSettingDirect(key, defaultValue, "mousehunt-improved-settings"); }; var saveSetting = (key, value) => { saveSettingDirect(key, value, "mousehunt-improved-settings"); return value; }; // src/utils/styles/favorite-button.css var favorite_button_default = ".custom-favorite-button{top:0;right:0;display:inline-block;width:35px;height:35px;vertical-align:middle;background:url(https://www.mousehuntgame.com/images/ui/camp/trap/star_empty.png?asset_cache_version=2) 50% 50% no-repeat;background-size:90%;border-radius:50%}.custom-favorite-button-small{width:20px;height:20px}.custom-favorite-button:hover{background-color:#fff;background-image:url(https://www.mousehuntgame.com/images/ui/camp/trap/star_favorite.png?asset_cache_version=2);outline:2px solid #ccc}.custom-favorite-button.active{background-image:url(https://www.mousehuntgame.com/images/ui/camp/trap/star_favorite.png?asset_cache_version=2)}.custom-favorite-button.busy{background-image:url(https://www.mousehuntgame.com/images/ui/loaders/small_spinner.gif?asset_cache_version=2)}\n"; // src/utils/elements.js var makeElement = (tag, classes = "", text = "", appendTo = null) => { const element = document.createElement(tag); if (Array.isArray(classes)) { classes = classes.join(" "); } if (classes && classes.length) { element.className = classes; } element.innerHTML = text; if (appendTo) { appendTo.append(element); return appendTo; } return element; }; var makeFavoriteButton = (options) => __async(void 0, null, function* () { addStylesDirect(favorite_button_default, "mh-improved-styles-favorite-button", true); const { id = null, target = null, size = "small", state = false, isSetting = true, defaultState = false, onChange = null, onActivate = null, onDeactivate = null } = options; const existing = document.querySelector(`#${id}`); if (existing) { existing.remove(); } const star = document.createElement("a"); star.classList.add("custom-favorite-button"); if (size === "small") { star.classList.add("custom-favorite-button-small"); } star.id = id; star.setAttribute("data-item-id", id); star.setAttribute("href", "#"); star.style.display = "inline-block"; let currentSetting = false; currentSetting = isSetting ? getSetting(id, defaultState) : state; if (currentSetting) { star.classList.add("active"); } else { star.classList.add("inactive"); } star.addEventListener("click", (e) => __async(void 0, null, function* () { star.classList.add("busy"); e.preventDefault(); e.stopPropagation(); const currentStar = e.target; const currentState = !currentStar.classList.contains("active"); if (onChange !== null) { yield onChange(currentState); } else if (isSetting) { saveSetting(id, currentState); } currentStar.classList.remove("inactive"); currentStar.classList.remove("active"); if (currentState) { currentStar.classList.add("active"); if (onActivate !== null) { yield onActivate(currentState); } } else { currentStar.classList.add("inactive"); if (onDeactivate !== null) { yield onDeactivate(currentState); } } setTimeout(() => { currentStar.classList.remove("busy"); }, 300); })); if (target) { target.append(star); } return star; }); var createPopup = (options) => { if ("undefined" === typeof jsDialog || !jsDialog) { return false; } const settings = Object.assign({}, { title: "", content: "", hasCloseButton: true, template: "default", show: true, className: "" }, options); const popup = new jsDialog(); popup.setIsModal(!settings.hasCloseButton); popup.setTemplate(settings.template); popup.addToken("{*title*}", settings.title); popup.addToken("{*content*}", settings.content); popup.setAttributes({ className: settings.className }); if (settings.show) { popup.show(); } return popup; }; // src/utils/db.js var database = (databaseName) => __async(void 0, null, function* () { return new Promise((resolve, reject) => { const request = indexedDB.open(`mh-improved-${databaseName}`, 6); request.onerror = (event) => { reject(event.target.error); }; request.onsuccess = (event) => { resolve(event.target.result); }; request.onupgradeneeded = (event) => { const db = event.target.result; if (!db.objectStoreNames.contains(databaseName)) { db.createObjectStore(databaseName, { keyPath: "id" }); } }; }); }); var dbGet = (databaseName, id) => __async(void 0, null, function* () { const db = yield database(databaseName); const transaction = db.transaction(databaseName, "readonly"); transaction.onerror = (event) => { throw new Error(event.target.error); }; const objectStore = transaction.objectStore(databaseName); const request = objectStore.get(id); return new Promise((resolve, reject) => { request.onsuccess = () => { resolve(request.result); }; request.onerror = () => { reject(request.error); }; transaction.oncomplete = () => { db.close(); }; }); }); var dbSet = (databaseName, data) => __async(void 0, null, function* () { const db = yield database(databaseName); const transaction = db.transaction(databaseName, "readwrite"); const objectStore = transaction.objectStore(databaseName); data = { data, id: data.id || Date.now() }; const request = objectStore.put(data); return new Promise((resolve, reject) => { request.onsuccess = () => { resolve(request.result); }; request.onerror = () => { reject(request.error); }; transaction.oncomplete = () => { db.close(); }; }); }); var dbDelete = (databaseName, id) => __async(void 0, null, function* () { const db = yield database(databaseName); const transaction = db.transaction(databaseName, "readwrite"); const objectStore = transaction.objectStore(databaseName); const request = objectStore.delete(id); return new Promise((resolve, reject) => { request.onsuccess = () => { resolve(request.result); }; request.onerror = () => { reject(request.error); }; transaction.oncomplete = () => { db.close(); }; }); }); var dbDeleteAll = (databaseName) => __async(void 0, null, function* () { const db = yield database(databaseName); const transaction = db.transaction(databaseName, "readwrite"); const objectStore = transaction.objectStore(databaseName); const request = objectStore.clear(); return new Promise((resolve, reject) => { request.onsuccess = () => { resolve(request.result); }; request.onerror = () => { reject(request.error); }; transaction.oncomplete = () => { db.close(); }; }); }); // src/utils/global.js var getGlobal = (key) => { if (window && window.mhui) { return window.mhui[key] || false; } if ("undefined" !== typeof app && app && app.mhui) { return app.mhui[key] || false; } return false; }; // src/utils/debug.js var debug = (message, ...args) => { if (getSetting("debug.module", false) || getGlobal("mh-improved-updating") || getGlobal("mh-improved-debug")) { console.log( `%cMH Improved%c: ${message}`, "color: #90588c; font-weight: 900", "color: inherit; font-weight: inherit", ...args ); } }; var debuglog = (module, message, ...args) => { if (getSetting("debug.all", false) || getSetting(`debug.${module}`, false) || getGlobal("mh-improved-updating")) { console.log( `%cMH Improved %c${module}%c ${message}`, "color: #90588c; font-weight: 900", "color: #90588c; font-weight: 400", "color: inherit; font-weight: inherit", ...args ); } }; // src/utils/data.js var validDataFiles = /* @__PURE__ */ new Set([ "effs", "environments-events", "environments", "item-thumbnails", "items-tradable", "m400-locations", "marketplace-hidden-items", "mice-groups", "mice-regions", "mice-thumbnails", "minlucks", "relic-hunter-hints", "scoreboards", "ultimate-checkmark", "upscaled-images", "wisdom" ]); var isValidDataFile = (file) => { return validDataFiles.has(file); }; var getCacheExpiration = (key = null) => __async(void 0, null, function* () { return yield cacheGet(`expiration-${key}`, false); }); var setCacheExpiration = (key) => __async(void 0, null, function* () { debuglog("utils-data", `Setting cache expiration for ${key}`); cacheSet(`expiration-${key}`, Date.now() + (Math.floor(Math.random() * 7) + 7) * 24 * 60 * 60 * 1e3); }); var isCacheExpired = (key) => __async(void 0, null, function* () { const expiration = yield getCacheExpiration(key); if (!expiration) { return true; } return expiration.date < Date.now(); }); var fetchData = (key, retries = 0) => __async(void 0, null, function* () { try { const data = yield fetch(`https://api.mouse.rip/${key}`, { method: "GET", headers: getHeaders() }); return yield data.json(); } catch (error) { console.error(`Error fetching data for ${key}:`, error); if (retries >= 3) { return false; } yield new Promise((resolve) => setTimeout(resolve, 500 * retries)); return fetchData(key, retries + 1); } }); var getData = (key) => __async(void 0, null, function* () { if (!isValidDataFile(key)) { debuglog("utils-data", `Cannot get data for ${key}, invalid key`); return false; } const isExpired = yield isCacheExpired(key); if (!isExpired) { const cachedData = yield dataCacheGet(key, false); if (cachedData) { return cachedData; } } debuglog("utils-data", `Fetching data for ${key}\u2026`); const data = yield fetchData(key); debuglog("utils-data", `Fetched data for ${key}`, data); if (data) { dataCacheSet(key, data); setCacheExpiration(key); } return data; }); var clearCaches = () => __async(void 0, null, function* () { validDataFiles.forEach((file) => { dbDelete("data", file); }); dbDeleteAll("ar-cache"); for (const key of Object.keys(localStorage)) { if (key.startsWith("mh-improved-cache")) { localStorage.removeItem(key); } } for (const key of Object.keys(sessionStorage)) { if (key.startsWith("mh-improved")) { sessionStorage.removeItem(key); } } yield dbDelete("cache", "expirations"); }); var getHeaders = () => { return { "Content-Type": "application/json", "X-MH-Improved": "true", "X-MH-Improved-Version": mhImprovedVersion || "unknown", "X-MH-Improved-Platform": mhImprovedPlatform || "unknown" }; }; var sessionSet = (key, value, retry = false) => { if (getSetting("debug.no-cache")) { return; } key = `mh-improved-${key}`; const stringified = JSON.stringify(value); try { sessionStorage.setItem(key, stringified); } catch (error) { if ("QuotaExceededError" === error.name && !retry) { clearCaches(); sessionSet(key, value, true); } } }; var sessionGet = (key, defaultValue = false) => { if (getSetting("debug.no-cache")) { return defaultValue; } key = `mh-improved-${key}`; const value = sessionStorage.getItem(key); if (!value) { return defaultValue; } return JSON.parse(value); }; var cacheSet = (key, value) => { dbSet("cache", { id: key, value }); }; var dataCacheSet = (key, value) => { dbSet("data", { id: key, value }); }; var cacheGetHelper = (key, defaultValue = false, db = "cache") => __async(void 0, null, function* () { var _a; const cached = yield dbGet(db, key); if (!((_a = cached == null ? void 0 : cached.data) == null ? void 0 : _a.value)) { return defaultValue; } return cached.data.value; }); var cacheGet = (key, defaultValue = false) => __async(void 0, null, function* () { return yield cacheGetHelper(key, defaultValue, "cache"); }); var dataCacheGet = (key, defaultValue = false) => __async(void 0, null, function* () { return yield cacheGetHelper(key, defaultValue, "data"); }); // src/utils/page.js var getCurrentPage = () => { var _a, _b, _c, _d; if (!((_b = (_a = hg == null ? void 0 : hg.utils) == null ? void 0 : _a.PageUtil) == null ? void 0 : _b.getCurrentPage)) { return null; } const page = hg.utils.PageUtil.getCurrentPage(); if (!page) { const query = ((_d = (_c = hg == null ? void 0 : hg.utils) == null ? void 0 : _c.PageUtil) == null ? void 0 : _d.getQueryParams()) || {}; if ((query == null ? void 0 : query.switch_to) && "mobile" === query.switch_to) { return "camp"; } return null; } return page.toLowerCase(); }; var setPage = (page, ...args) => { var _a, _b; if ("wiki" === page.toLowerCase()) { doEvent("mh-improved-open-wiki"); return; } page = page.charAt(0).toUpperCase() + page.slice(1); if ((_b = (_a = hg == null ? void 0 : hg.utils) == null ? void 0 : _a.PageUtil) == null ? void 0 : _b.setPage) { hg.utils.PageUtil.setPage(page, ...args); } }; var setTab = (tab, ...args) => { var _a, _b; if ((_b = (_a = hg == null ? void 0 : hg.utils) == null ? void 0 : _a.PageUtil) == null ? void 0 : _b.setPageTab) { hg.utils.PageUtil.setPageTab(tab, ...args); } }; var getCurrentTab = () => { var _a, _b; if (!((_b = (_a = hg == null ? void 0 : hg.utils) == null ? void 0 : _a.PageUtil) == null ? void 0 : _b.getCurrentPageTab)) { return getCurrentPage(); } const tab = hg.utils.PageUtil.getCurrentPageTab() || ""; if (tab.length <= 0) { return getCurrentPage(); } return tab.toLowerCase(); }; var getCurrentSubtab = () => { const subtab = hg.utils.PageUtil.getCurrentPageSubTab(); if (!subtab || subtab.length <= 0) { return getCurrentTab(); } return subtab.toLowerCase(); }; var isCurrentPage = (targetPage = null, targetTab = null, targetSubtab = null, forceCurrentPage = null, forceCurrentTab = null, forceCurrentSubtab = null) => { if (!targetPage) { return false; } const currentPage = forceCurrentPage || getCurrentPage(); if (!targetTab) { return currentPage === targetPage; } const currentTab = forceCurrentTab || getCurrentTab(); if (!targetSubtab) { return currentPage === targetPage && currentTab === targetTab; } const currentSubtab = forceCurrentSubtab || getCurrentSubtab(); if (currentSubtab === currentTab) { return currentPage === targetPage && currentTab === targetTab; } return currentPage === targetPage && currentTab === targetTab && currentSubtab === targetSubtab; }; // src/utils/location.js var getCurrentLocation = () => { const location = (user == null ? void 0 : user.environment_type) || ""; return location.toLowerCase(); }; var getRelicHunterLocation = () => { const cacheExpiry = 5 * 60 * 1e3; const cacheKey = "mh-improved-relic-hunter-location"; let cached = sessionGet(cacheKey); if (cached) { cached = JSON.parse(cached); } if (cached && cached.expiry > Date.now()) { return cached.data; } return fetch("https://rh-api.mouse.rip/", { headers: getHeaders() }).then((response) => response.json()).then((data) => { const expiry = Date.now() + cacheExpiry; sessionSet(cacheKey, JSON.stringify({ expiry, data })); return data; }).catch((error) => { console.error(error); }); }; // src/utils/horn.js var showHornMessage = (options) => { const huntersHornView = document.querySelector(".huntersHornView__messageContainer"); if (!huntersHornView) { return; } const settings = { title: options.title || "Hunters Horn", text: options.text || "This is a message from the Hunters Horn", button: options.button || "OK", action: options.action || (() => { }), dismiss: options.dismiss || null, type: options.type || "recent_linked_turn", classname: options.classname || "", image: options.image || null, imageLink: options.imageLink || null, imageCallback: options.imageCallback || null }; const backdrop = document.querySelector(".huntersHornView__backdrop"); if (backdrop) { backdrop.classList.add("huntersHornView__backdrop--active"); } const gameInfo = document.querySelector(".mousehuntHud-gameInfo"); if (gameInfo) { gameInfo.classList.add("blur"); } const messageWrapper = makeElement("div", ["huntersHornView__message huntersHornView__message--active", settings.classname]); const message = makeElement("div", ["huntersHornMessageView", `huntersHornMessageView--${settings.type}`]); makeElement("div", "huntersHornMessageView__title", settings.title, message); const content = makeElement("div", "huntersHornMessageView__content"); if (settings.image) { const imgWrapper = makeElement("div", "huntersHornMessageView__friend"); const img = makeElement("a", "huntersHornMessageView__friendProfilePic"); if (settings.imageLink) { img.href = settings.imageLink; } else if (settings.imageCallback) { img.addEventListener("click", settings.imageCallback); } else { img.href = "#"; } img.style.backgroundImage = `url(${settings.image})`; imgWrapper.append(img); content.append(imgWrapper); } makeElement("div", "huntersHornMessageView__text", settings.text, content); const buttonSpacer = makeElement("div", "huntersHornMessageView__buttonSpacer"); const button = makeElement("button", "huntersHornMessageView__action"); const buttonLabel = makeElement("div", "huntersHornMessageView__actionLabel"); makeElement("span", "huntersHornMessageView__actionText", settings.button, buttonLabel); button.append(buttonLabel); button.addEventListener("click", () => { if (settings.action) { settings.action(); } messageWrapper.innerHTML = ""; backdrop.classList.remove("huntersHornView__backdrop--active"); gameInfo.classList.remove("blur"); }); buttonSpacer.append(button); content.append(buttonSpacer); message.append(content); if (settings.dismiss) { const countdown = makeElement("button", ["huntersHornMessageView__countdown"]); makeElement("div", "huntersHornMessageView__countdownButtonImage", "", countdown); const svgMarkup = `<svg class="huntersHornMessageView__countdownSVG"> <circle r="46%" cx="50%" cy="50%" class="huntersHornMessageView__countdownCircleTrack"></circle> <circle r="46%" cx="50%" cy="50%" class="huntersHornMessageView__countdownCircle" style="animation-duration: ${settings.dismiss}ms;"></circle> </svg>`; countdown.innerHTML += svgMarkup; countdown.addEventListener("click", () => { countdown.classList.add("huntersHornMessageView__countdown--complete"); messageWrapper.innerHTML = ""; backdrop.classList.remove("huntersHornView__backdrop--active"); gameInfo.classList.remove("blur"); }); message.append(countdown); } messageWrapper.append(message); const existingMessages = huntersHornView.querySelector(".huntersHornView__message"); if (existingMessages) { existingMessages.remove(); } huntersHornView.append(messageWrapper); if (settings.dismiss) { setTimeout(() => { const countdown = messageWrapper.querySelector(".huntersHornMessageView__countdown"); if (countdown) { countdown.classList.add("huntersHornMessageView__countdown--complete"); } messageWrapper.innerHTML = ""; backdrop.classList.remove("huntersHornView__backdrop--active"); gameInfo.classList.remove("blur"); }, settings.dismiss); } }; // src/utils/events.js var getDialogMapping = () => { return { treasureMapPopup: "map", itemViewPopup: "item", mouseViewPopup: "mouse", largerImage: "image", convertibleOpenViewPopup: "convertible", adventureBookPopup: "adventureBook", marketplaceViewPopup: "marketplace", giftSelectorViewPopup: "gifts", supportPageContactUsForm: "support", MHCheckout: "premiumShop" }; }; var onDialogHide = (callback, overlay = null, once = false) => { eventRegistry.addEventListener("js_dialog_hide", () => { var _a, _b; const dialogType = ((_b = (_a = window == null ? void 0 : window.mhutils) == null ? void 0 : _a.lastDialog) == null ? void 0 : _b.overlay) || null; window.mhutils = window.mhutils ? __spreadProps(__spreadValues({}, window.mhutils), { lastDialog: null }) : null; if (!overlay) { return callback(); } const dialogMapping = getDialogMapping(); if (overlay === dialogType || overlay === dialogMapping[dialogType]) { return callback(); } }, null, once); }; var callbacks = []; var hasAddedNavigationListener = false; var onNavigation = (callback, options = {}) => { const defaults = { page: false, tab: false, subtab: false, onLoad: true, anyTab: false, anySubtab: false }; const { page, tab, subtab, onLoad, anyTab, anySubtab } = Object.assign(defaults, options); const bypassMatch = !page; if (onLoad && (bypassMatch || isCurrentPage( page, anyTab ? getCurrentTab() : tab, anySubtab ? getCurrentSubtab() : subtab ))) { callback(); } callbacks.push({ callback, page, tab, subtab, bypassMatch }); if (!hasAddedNavigationListener) { addNavigationListeners(); hasAddedNavigationListener = true; } }; var addNavigationListeners = () => { eventRegistry.addEventListener("set_page", (e) => { var _a; const tabs = ((_a = e == null ? void 0 : e.data) == null ? void 0 : _a.tabs) || {}; const currentTab = Object.keys(tabs).find((key) => tabs[key].is_active_tab); const forceCurrentTab = currentTab == null ? void 0 : currentTab.type; callbacks.forEach(({ callback, page, tab, subtab, bypassMatch }) => { if (bypassMatch) { callback(); return; } if (!subtab) { if (isCurrentPage(page, tab, false, getCurrentPage(), forceCurrentTab)) { callback(); } return; } if ((currentTab == null ? void 0 : currentTab.subtabs) && (currentTab == null ? void 0 : currentTab.subtabs.length) > 0) { const forceSubtab = currentTab.subtabs.find((searchTab) => searchTab.is_active_subtab).subtab_type; if (isCurrentPage(page, tab, subtab, getCurrentPage(), forceCurrentTab, forceSubtab)) { callback(); } } }); }); eventRegistry.addEventListener("set_tab", (e) => { callbacks.forEach(({ callback, page, tab, subtab, bypassMatch }) => { if (bypassMatch) { callback(); return; } if (isCurrentPage(page, tab, subtab, getCurrentPage(), e.page_arguments.tab, e.page_arguments.sub_tab)) { callback(); } }); }); }; // src/utils/flags.js var getFlag = (flag) => { return getSetting(`experiments.${flag}`, getFlags().includes(flag)); }; var getFlags = () => { return getSetting("override-flags", "").toLowerCase().replaceAll(" ", "").split(","); }; // src/utils/links.js var getCleanSubmenuLabel = (label) => { return label.toLowerCase().replaceAll(/[^\da-z]/g, "-"); }; var addSubmenuItem = (options) => { const settings = Object.assign({}, { id: null, menu: "kingdom", label: "", icon: "https://www.mousehuntgame.com/images/ui/hud/menu/special.png", href: "", class: "", callback: null, external: false }, options); const menuTarget = document.querySelector(`.mousehuntHud-menu .${settings.menu}`); if (!menuTarget) { return; } if (!menuTarget.classList.contains("hasChildren")) { menuTarget.classList.add("hasChildren"); } let hasSubmenu = true; let submenu = menuTarget.querySelector("ul"); if (!submenu) { hasSubmenu = false; submenu = document.createElement("ul"); } const item = document.createElement("li"); item.classList.add("custom-submenu-item"); const label = settings.label.length > 0 ? settings.label : settings.id; const cleanLabel = getCleanSubmenuLabel(label); const exists = document.querySelector(`#custom-submenu-item-${cleanLabel}`); if (exists) { exists.remove(); } item.id = settings.id ? `custom-submenu-item-${settings.id}` : `custom-submenu-item-${cleanLabel}`; if (settings.class) { const classes = settings.class.split(" "); item.classList.add(...classes); } const link = document.createElement("a"); link.href = settings.href || "#"; if (settings.callback) { link.addEventListener("click", (e) => { e.preventDefault(); settings.callback(); }); } const icon = document.createElement("div"); icon.classList.add("icon"); icon.style = `background-image: url(${settings.icon});`; const name = document.createElement("div"); name.classList.add("name"); name.innerHTML = settings.label; link.append(icon); link.append(name); if (settings.external) { const externalLinkIcon = document.createElement("div"); externalLinkIcon.classList.add("external_icon"); link.append(externalLinkIcon); link.target = "_blank"; link.rel = "noopener noreferrer"; } item.append(link); submenu.append(item); if (!hasSubmenu) { menuTarget.append(submenu); } }; var removeSubmenuItem = (id) => { id = getCleanSubmenuLabel(id); const item = document.querySelector(`#custom-submenu-item-${id}`); if (item) { item.remove(); } }; var addSubmenuDivider = (menu, className = "") => { addSubmenuItem({ menu, id: `mh-improved-submenu-divider-${className}`, label: "", icon: "", href: "", class: `mh-improved-submenu-divider ${className}` }); }; // src/utils/messages.js hadAddedErrorStyles = false; // src/utils/user.js var normalizeTitle = (title = "") => { if (!title) { return ""; } const normalizedTitle = title.toLowerCase().replaceAll(" ", "").replaceAll("/", "_").replaceAll("journeyman_journeywoman", "journeyman").replaceAll("journeywoman", "journeyman").replaceAll("lord_lady", "lord").replaceAll("lady", "lord").replaceAll("baron_baroness", "baron").replaceAll("baroness", "baron").replaceAll("count_countess", "count").replaceAll("countess", "count").replaceAll("grand_duke_grand_duchess", "grand_duke").replaceAll("grand_duchess", "grand_duke").replaceAll("archduke_archduchess", "archduke").replaceAll("archduchess", "archduke").replaceAll("duke_duchess", "duke").replaceAll("duke_dutchess", "duke").replaceAll("duchess", "duke").replaceAll("grand_duke", "grandduke").replaceAll("/", "").replaceAll(" ", "").toLowerCase(); return normalizedTitle; }; var isUserTitleAtLeast = (title) => { const titles = [ "novice", "recruit", "apprentice", "initiate", "journeyman", "master", "grandmaster", "legendary", "hero", "knight", "lord", "baron", "count", "duke", "grandduke", "archduke", "viceroy", "elder", "sage", "fable" ]; const titleIndex = titles.indexOf(normalizeTitle(user.title_name)); const checkIndex = titles.indexOf(normalizeTitle(title)); return titleIndex >= checkIndex; }; // src/modules/better-travel/travel-utils.js var getTravelSetting = (settingName, defaultValue) => { return getSetting(`better-travel.${settingName}`, defaultValue); }; var saveTravelSetting = (settingName, value) => { saveSetting(`better-travel.${settingName}`, value); }; var travelTo = (location) => { const header = document.querySelector(".mousehuntHeaderView"); if (header) { const existing = header.querySelector(".mh-improved-travel-message"); if (existing) { existing.remove(); } makeElement("div", ["mh-improved-travel-message", "travelPage-map-message"], "Traveling...", header); } app.pages.TravelPage.travel(location); }; // src/modules/better-travel/reminders.js var addReminders = () => { var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _A, _B, _C, _D, _E; const reminderOpts = { title: "Travel Reminder", dismiss: 4e3 }; switch (getCurrentLocation()) { case "rift_valour": if ((_b = (_a = user.quests) == null ? void 0 : _a.QuestRiftValour) == null ? void 0 : _b.is_fuel_enabled) { reminderOpts.text = "Champion's Fire is active."; reminderOpts.image = "https://www.mousehuntgame.com/images/items/stats/transparent_thumb/6622efd1db7028b30f48b15771138720.png?cv=2"; reminderOpts.button = "Deactivate"; reminderOpts.action = () => { const button = document.querySelector(".valourRiftHUD-fuelContainer-armButton"); if (button) { button.click(); } }; } break; case "queso_river": case "queso_plains": case "queso_quarry": case "queso_geyser": if (((_d = (_c = user.quests) == null ? void 0 : _c.QuestQuesoCanyon) == null ? void 0 : _d.is_wild_tonic_active) || ((_f = (_e = user.quests) == null ? void 0 : _e.QuestQuesoGeyser) == null ? void 0 : _f.is_wild_tonic_enabled)) { reminderOpts.text = "Wild Tonic is active."; reminderOpts.image = "https://www.mousehuntgame.com/images/items/stats/transparent_thumb/b6b9f97a1ee3692fdff0b5a206adf7e1.png?cv=2"; reminderOpts.button = "Deactivate"; reminderOpts.action = () => { const button = document.querySelector(".quesoHUD-wildTonic-button"); if (button) { button.click(); } }; } break; case "floating_islands": if ("launch_pad_island" === ((_i = (_h = (_g = user.quests) == null ? void 0 : _g.QuestFloatingIslands) == null ? void 0 : _h.hunting_site_atts) == null ? void 0 : _i.island_power_type)) { break; } if (!((_l = (_k = (_j = user.quests) == null ? void 0 : _j.QuestFloatingIslands) == null ? void 0 : _k.hunting_site_atts) == null ? void 0 : _l.is_fuel_enabled) && // BW not active. !(((_o = (_n = (_m = user.quests) == null ? void 0 : _m.QuestFloatingIslands) == null ? void 0 : _n.hunting_site_atts) == null ? void 0 : _o.is_vault_island) && // is SP. ((_s = (_r = (_q = (_p = user.quests) == null ? void 0 : _p.QuestFloatingIslands) == null ? void 0 : _q.hunting_site_atts) == null ? void 0 : _r.island_mod_panels[2]) == null ? void 0 : _s.is_complete))) { reminderOpts.text = "Bottled Wind is <strong>not</strong> active."; reminderOpts.image = "https://www.mousehuntgame.com/images/ui/hud/floating_islands/items/bottled_wind_stat_item.png?asset_cache_version=2"; reminderOpts.button = "Activate"; reminderOpts.action = () => { const button = document.querySelector(".floatingIslandsHUD-fuel-button"); if (button) { button.click(); } }; } break; case "foreword_farm": case "prologue_pond": case "table_of_contents": if (((_u = (_t = user.quests) == null ? void 0 : _t.QuestProloguePond) == null ? void 0 : _u.is_fuel_enabled) || ((_w = (_v = user.quests) == null ? void 0 : _v.QuestForewordFarm) == null ? void 0 : _w.is_fuel_enabled) || ((_y = (_x = user.quests) == null ? void 0 : _x.QuestTableOfContents) == null ? void 0 : _y.is_fuel_enabled)) { reminderOpts.text = "Condensed Creativity is active."; reminderOpts.button = "Deactivate"; } else { reminderOpts.text = "Condensed Creativity is <strong>not</strong> active."; reminderOpts.button = "Activate"; } reminderOpts.image = "https://www.mousehuntgame.com/images/items/stats/transparent_thumb/4f5d55c1eff77474c7363f0e52d03e49.png?cv=2"; reminderOpts.action = hg.views.HeadsUpDisplayFolkloreForestRegionView.toggleFuel; break; case "winter_hunt_grove": case "winter_hunt_workshop": case "winter_hunt_fortress": if (((_A = (_z = user.quests) == null ? void 0 : _z.QuestCinnamonTreeGrove) == null ? void 0 : _A.is_fuel_enabled) || ((_C = (_B = user.quests) == null ? void 0 : _B.QuestGolemWorkshop) == null ? void 0 : _C.is_fuel_enabled) || ((_E = (_D = user.quests) == null ? void 0 : _D.QuestIceFortress) == null ? void 0 : _E.is_fuel_enabled)) { reminderOpts.text = "Festive Spirit is active."; reminderOpts.button = "Deactivate"; } else if ("winter_hunt_forest" === getCurrentLocation()) { reminderOpts.text = "Festive Spirit is <strong>not</strong> active."; reminderOpts.button = "Activate"; } reminderOpts.image = "https://www.mousehuntgame.com/images/items/stats/large/cda292833fce3b65b7a6a38c000e8620.png?cv=2"; reminderOpts.action = () => { const toggle = document.querySelector(".headsUpDisplayWinterHuntRegionView__fuelButton"); if (toggle) { toggle.click(); } }; } if (reminderOpts.text) { showHornMessage(reminderOpts); } }; var reminders_default = addReminders; // src/modules/better-travel/travel-menu.css var travel_menu_default = ".mh-improved-travel-window.greatWinterHuntGolemDestinationView{padding:10px 0}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__content{align-items:flex-start;margin-right:5px;background-color:transparent}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environmentsScroller{height:auto;min-height:425px;max-height:650px;padding:0 0 10px 5px;margin-right:-5px}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__regionEnvironments{gap:15px 6px;justify-content:space-evenly}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__regionsContainer{display:none}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__regionName{margin:10px 0;font-size:16px;text-align:center;border:none}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environment{width:150px;overflow:hidden;border:1px solid #b4a481;box-shadow:0 2px 2px #7e7e7e}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__regionGroup{margin:0}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environmentName{position:absolute;right:0;left:0;z-index:2;height:20px;background-color:#ffffffe5;border-radius:0;transition:all .2s ease-in-out}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environmentName span{padding:5px;text-align:center}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environmentImage{border-radius:0;transition:all .2s ease-in-out}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environment:hover .greatWinterHuntGolemDestinationView__environmentImage,.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environment:focus .greatWinterHuntGolemDestinationView__environmentImage{background-position-y:30%}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environment:hover .greatWinterHuntGolemDestinationView__environmentName,.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environment:focus .greatWinterHuntGolemDestinationView__environmentName{background-color:#fff}.mh-improved-travel-window .greatWinterHuntGolemDestinationView__environment[data-environment-type=train_station] .greatWinterHuntGolemDestinationView__environmentName span{font-size:10px}.mh-improved-travel-window-footer{position:absolute;bottom:20px;display:flex;gap:10px;align-items:center;width:330px}.mh-improved-travel-window-edit{padding:0 15px;font-weight:400;line-height:24px}.mh-improved-travel-window--editing{border-radius:5px;outline:3px solid #f37c7c}.mh-improved-travel-window-description,.mh-improved-travel-window-hidden{display:none}.mh-improved-travel-window--editing .mh-improved-travel-window-hidden{display:block;filter:grayscale(1);opacity:.4}.mh-improved-travel-window--editing .mh-improved-travel-window-description{display:inline-block}.mh-improved-travel-window-environment-icon{cursor:pointer}\n"; // src/modules/better-travel/travel-window.js var getHiddenLocations = () => { return getTravelSetting("travel-window-hidden-locations", []); }; var toggleLocation = (location) => { if (isLocationHidden(location)) { unhideLocation(location); } else { hideLocation(location); } }; var hideLocation = (location) => { const hiddenLocations = getHiddenLocations(); if (hiddenLocations.includes(location)) { return; } hiddenLocations.push(location); saveTravelSetting("travel-window-hidden-locations", hiddenLocations); }; var unhideLocation = (location) => { const hiddenLocations = getHiddenLocations(); if (!hiddenLocations.includes(location)) { return; } hiddenLocations.splice(hiddenLocations.indexOf(location), 1); saveTravelSetting("travel-window-hidden-locations", hiddenLocations); }; var isLocationHidden = (location) => { const hiddenLocations = getHiddenLocations(); return hiddenLocations.includes(location); }; var openTravelWindow = () => __async(void 0, null, function* () { debug("Opening travel window"); const regions = [ { type: "gnawnia", name: "Gnawnia" }, { type: "valour", name: "Valour" }, { type: "whisker_woods", name: "Whisker Woods" }, { type: "burroughs", name: "Burroughs" }, { type: "furoma", name: "Furoma" }, { type: "bristle_woods", name: "Bristle Woods" }, { type: "tribal_isles", name: "Tribal Isles" }, { type: "varmint_valley", name: "Varmint Valley" }, { type: "desert", name: "Sandtail Desert" }, { type: "rodentia", name: "Rodentia" }, { type: "queso_canyon", name: "Queso Canyon" }, { type: "zokor_zone", name: "Hollow Heights" }, { type: "folklore_forest", name: "Folklore Forest" }, { type: "riftopia", name: "Rift Plane" } ]; environments = yield getData("environments"); const eventEnvironments = yield getData("environments-events"); environments = [...environments, ...eventEnvironments]; const currentEnvironment = environments.find((e) => e.id === getCurrentLocation()); const locationsToRemove = ["forbidden_grove"]; environments = environments.map((env) => { if (!isUserTitleAtLeast(env.title)) { locationsToRemove.push(env.id); } return env; }); environments = environments.filter((env) => !locationsToRemove.includes(env.id)); let content = '<div class="mh-improved-travel-window greatWinterHuntGolemDestinationView"><div class="greatWinterHuntGolemDestinationView__content">'; content += '<div class="greatWinterHuntGolemDestinationView__regionsContainer">'; for (const region of regions) { let buttonClass = "greatWinterHuntGolemDestinationView__regionButton"; if ((currentEnvironment == null ? void 0 : currentEnvironment.region) === (region == null ? void 0 : region.type)) { buttonClass += " greatWinterHuntGolemDestinationView__regionButton--active"; } content += `<button class="${buttonClass}" data-region-type="${region.type}">${region.name}</button>`; } content += "</div>"; const hasTitles = false; content += '<div class="greatWinterHuntGolemDestinationView__environmentsContainer"><div class="greatWinterHuntGolemDestinationView__environmentsScroller"><div class="greatWinterHuntGolemDestinationView__regionList">'; if (!hasTitles) { content += `<div class="greatWinterHuntGolemDestinationView__regionGroup" data-region-type="all"> <div class="greatWinterHuntGolemDestinationView__regionEnvironments">`; } for (const region of regions) { if (hasTitles) { content += `<div class="greatWinterHuntGolemDestinationView__regionGroup" data-region-type="${region.type}"> <div class="greatWinterHuntGolemDestinationView__regionName">${region.name}</div> <div class="greatWinterHuntGolemDestinationView__regionEnvironments">`; } const regionEnvironments = environments.filter((e) => e.region === region.type); regionEnvironments.forEach((environment) => { let envButtonClass = "greatWinterHuntGolemDestinationView__environment"; if (currentEnvironment.id === environment.id) { envButtonClass += " greatWinterHuntGolemDestinationView__environment--active"; } if (isLocationHidden(environment.id)) { envButtonClass += " mh-improved-travel-window-hidden"; } content += `<button class="${envButtonClass}" data-environment-type="${environment.id}"> <div class="greatWinterHuntGolemDestinationView__environmentName"> <span>${environment.name}</span> </div> <div class="greatWinterHuntGolemDestinationView__environmentImage" style="background-image:url(${environment.headerImage});" data-environment-type="${environment.id}"></div> </button>`; }); if (hasTitles) { content += "</div></div>"; } } if (!hasTitles) { content += "</div></div>"; } content += "</div></div></div>"; content += "</div>"; content += `<div class="mh-improved-travel-window-footer"> <div class="mh-improved-travel-window-edit mousehuntActionButton"><span>Edit</span></div> <div class="mh-improved-travel-window-description">Click on a location to toggle the visibility.</div> </div>`; content += "</div>"; const popup = createPopup({ id: "mh-improved-travel-window", title: "", content, className: "mh-improved-travel-window-popup jsDialogFixed", show: false }); popup.setOffsetHeight(0); popup.setPersistentOffsetHeight(0); popup.setIsModal(false); popup.show(); const travelWindow = document.querySelector(".mh-improved-travel-window"); if (!travelWindow) { return; } const editButton = document.querySelector(".mh-improved-travel-window-edit"); if (!editButton) { return; } const editButtonSpan = editButton.querySelector("span"); if (!editButtonSpan) { return; } const environmentButtons = document.querySelectorAll(".greatWinterHuntGolemDestinationView__environment"); if (!environmentButtons) { return; } editButton.addEventListener("click", () => { isEditing = !isEditing; if (isEditing) { travelWindow.classList.add("mh-improved-travel-window--editing"); editButtonSpan.textContent = "Save"; editButton.classList.add("active"); } else { travelWindow.classList.remove("mh-improved-travel-window--editing"); editButtonSpan.textContent = "Edit"; editButton.classList.remove("active"); } }); environmentButtons.forEach((button) => { const environmentType = button.getAttribute("data-environment-type"); button.addEventListener("click", () => { if (isEditing) { toggleLocation(environmentType); button.classList.toggle("mh-improved-travel-window-hidden"); } else { debug(`Traveling to ${environmentType}`); travelTo(environmentType); setPage("Camp"); popup.hide(); } }); }); onDialogHide(() => { isEditing = false; }); }); var isEditing = false; var environments = []; var makeMenuItem = () => { addSubmenuItem({ id: "mh-improved-travel-window", menu: "travel", label: "Travel Window", icon: "https://www.mousehuntgame.com/images/ui/hud/menu/special.png?asset_cache_version=2", callback: () => { openTravelWindow(); } }); }; var addEnvironmentIconListener = () => { const environmentIcon = document.querySelector(".mousehuntHud-environmentIcon"); if (!environmentIcon) { return; } environmentIcon.classList.add("mh-improved-travel-window-environment-icon"); environmentIcon.title = "Open Travel Window"; environmentIcon.addEventListener("click", () => { openTravelWindow(); }); }; var travel_window_default = () => __async(void 0, null, function* () { addStyles(travel_menu_default, "better-travel-travel-window"); makeMenuItem(); if (getSetting("better-travel.travel-window-environment-icon", true)) { addEnvironmentIconListener(); } onEvent("mh-improved-open-travel-window", openTravelWindow); environments = yield getData("environments"); }); // src/modules/better-travel/settings/index.js var settings_default = () => __async(void 0, null, function* () { return [ { id: "better-travel.default-to-simple-travel", title: "Show Simple Travel tab by default", default: false, description: "" }, { id: "better-travel.show-alphabetized-list", title: "Show alphabetized list on Simple Travel", default: false, description: "" }, { id: "better-travel.show-reminders", title: "Show Travel Reminders", default: true, description: "" }, { id: "better-travel.travel-window", title: "Travel Window", default: true, description: "" }, { id: "better-travel.travel-window-environment-icon", title: "Environment icon opens Travel Window", default: true, description: "" } ]; }); // src/modules/better-travel/styles.css var styles_default = '.travelPage-map-spacer,.travelPage-map-simpleToggle,.mousehuntHud-page-tabContent.map.full .travelPage-map-simpleToggle.full,.mousehuntHud-page-tabContent.map.full .travelPage-map-prefix.full{display:none}.travelPage-regionMenu{width:22%;overflow:scroll}.travelPage-map-environment-detailContainer{left:22%;width:78%}.travelPage-regionMenu-environmentLink.active{color:#000;background:#a4cafc}.travelPage-regionMenu-stats{color:#4d4d4d;background-color:#d8d8d8}.travelPage-regionMenu-numFriends{padding:0;background:none}.travelPage-mapContainer.full{height:auto;min-height:800px;max-height:900px;border:none}.travelPage-map-imageContainer{width:78%}.travelPage-map-zoomContainer{bottom:300px;transform:scale(1.5)}.travelPage-map-image-environment-name{top:70px;z-index:15;font-size:22px;font-variant:none;text-shadow:1px 1px #000,0 0 10px #000,8px 12px 9px #000}.travelPage-map-image-environment.locked .travelPage-map-image-environment-status{z-index:1;opacity:.5}.travelPage-map-image-environment-star{z-index:10}.travelPage-map-image-environment-button{top:100px;transform:scale(1.2)}.travelPage-regionMenu-environmentLink.mystery{display:inline-block;color:#9e9e9e;pointer-events:none}.travelPage-regionMenu-item[data-region=riftopia],.travelPage-regionMenu-item[data-region=riftopia] .travelPage-regionMenu-item-contents{display:block!important}.travelPage-regionMenu-regionLink:hover,.travelPage-regionMenu-regionLink:focus{cursor:unset}#mh-simple-travel-page .travelPage-map-prefix{display:block}#mh-simple-travel-page .travelPage-regionMenu{display:grid;grid-template-columns:repeat(5,1fr);width:100%;margin-bottom:10px;overflow:visible;background-color:transparent}#mh-simple-travel-page .travelPage-regionMenu-item{box-sizing:border-box;margin:1px;background-color:#e2e2e2;border:1px solid #4c71b4}#mh-simple-travel-page .travelPage-regionMenu-item[data-region=gnawnia],#mh-simple-travel-page .travelPage-regionMenu-item[data-region=valour],#mh-simple-travel-page .travelPage-regionMenu-item[data-region=whisker_woods],#mh-simple-travel-page .travelPage-regionMenu-item[data-region=burroughs],#mh-simple-travel-page .travelPage-regionMenu-item[data-region=furoma]{min-height:215px}#mh-simple-travel-page .travelPage-regionMenu-item[data-region=riftopia]{min-height:250px}#mh-simple-travel-page .travelPage-regionMenu-environments{width:145px;padding-left:2px;box-shadow:none}#mh-simple-travel-page .travelPage-regionMenu-item-contents{overflow:visible!important}#mh-simple-travel-page .travelPage-regionMenu-environmentLink.active{color:#4e6081}#mh-simple-travel-page .travelPage-regionMenu-environmentLink:hover,#mh-simple-travel-page .travelPage-regionMenu-environmentLink:focus{color:#fff;background-color:#6383bf}.huntersHornView__messageContent strong{font-weight:900}#mh-simple-travel-page .travelPage-alpha-wrapper .travelPage-regionMenu{display:block;width:100%}#mh-simple-travel-page .travelPage-alpha-wrapper .travelPage-regionMenu-environments{display:flex;flex-flow:column wrap;align-items:stretch;justify-content:flex-start;width:754px;height:425px;padding:4px 1px}#mh-simple-travel-page .travelPage-alpha-wrapper a.travelPage-regionMenu-environmentLink{width:112px;margin-left:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mhui-region-travel-item .icon{border-radius:5px}.mousehuntHud-menu ul li ul li.mhui-region-travel-item a .icon{top:6px;left:3px;width:22px;height:22px}#mh-simple-travel-page .travelPage-regionMenu .travelPage-regionMenu-environmentLink.active.highlight{margin-right:-3px;border-right:1px solid #4c71b4}#mh-simple-travel-page .travelPage-alpha-wrapper .travelPage-regionMenu-environmentLink.active.highlight{margin-right:0;border-right:none;border-radius:3px}.travelPage-regionMenu-environmentLink.relic-hunter-is-here:after{position:absolute;top:5px;right:5px;display:none;width:20px;height:20px;content:"";background-image:url(https://www.mousehuntgame.com/images/mice/thumb/d6980f1b00ff8ec688804706cba9370c.gif?cv=2);background-repeat:no-repeat;background-size:contain;border-radius:5px}.travelPage-regionMenu-environments:hover .travelPage-regionMenu-environmentLink.relic-hunter-is-here:after,.travelPage-regionMenu-environments:focus .travelPage-regionMenu-environmentLink.relic-hunter-is-here:after,.travelPage-regionMenu-environmentLink.relic-hunter-is-here:hover:after,.travelPage-regionMenu-environmentLink.relic-hunter-is-here:focus:after{display:block}.travelPage-regionMenu-environmentLink.relic-hunter-is-here{background-color:#e0f2d5}.mousehuntHud-page-tabContent.simple-travel .travelPage-regionMenu-environmentLink.relic-hunter-is-here{margin:0;border:none;border-radius:6px;outline:1px solid #ccc}.travelPage-alpha-wrapper .relic-hunter-is-here .travelPage-regionMenu-environmentLink-image{margin-left:0}.travelPage-map-image-environment .map-relic-hunter-is-here-image{position:absolute;top:5px;left:5px;width:60px;height:60px;overflow:hidden;background:url(https://www.mousehuntgame.com/images/mice/thumb/d6980f1b00ff8ec688804706cba9370c.gif?cv=2);filter:hue-rotate(-326deg);background-repeat:no-repeat;background-size:contain;border-radius:50%;transform:rotate(-70deg)}.map-relic-hunter-is-here.travelPage-map-image-environment-pointer{top:41px;left:86px;z-index:9;filter:hue-rotate(326deg);transform:rotate(70deg)}#mh-simple-travel-page .first-letter:first-letter{font-size:12px;font-weight:900}#mh-simple-travel-page .travelPage-alpha-wrapper:hover .first-letter:first-letter{border-bottom:1px solid #4e6081}#mh-simple-travel-page .travelPage-regionMenu .travelPage-regionMenu-environmentLink.active.highlight.event-location,#mh-simple-travel-page .travelPage-regionMenu .travelPage-regionMenu-environmentLink.event-location{color:#c01dff}#mh-simple-travel-page .travelPage-regionMenu .travelPage-regionMenu-environmentLink.active.highlight.event-location:after,#mh-simple-travel-page .travelPage-regionMenu .travelPage-regionMenu-environmentLink.event-location:after{position:absolute;top:1px;left:4px;width:15px;height:15px;content:"";background-image:url(https://www.mousehuntgame.com/images/ui/camp/trap/star_favorite.png?asset_cache_version=2);filter:drop-shadow(0 0 1px #fff);background-repeat:no-repeat;background-size:contain}.travelPage-map-environment-detail-title .custom-favorite-button{margin-top:-1px;margin-left:10px}.mousehuntHud-menu ul li ul li.mh-improved-better-travel-favorites-divider{height:1px;pointer-events:none;background-color:#6c3d0e7f}.mh-improved-better-travel-favorite-location:after{position:absolute;top:6px;right:4px;bottom:0;display:block;width:20px;height:20px;content:"";background:url(https://www.mousehuntgame.com/images/ui/map/star_gold_320.png?asset_cache_version=2);background-size:contain;opacity:.3}.mh-improved-better-travel-favorite-location:hover:after,.mh-improved-better-travel-favorite-location:focus:after{opacity:.1}.mh-improved-better-travel-menu-item .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mousehuntHud-environmentName{padding-top:0;margin-top:29px}.mh-improved-better-travel-region-location .icon{border:1px solid #9f9171;border-radius:3px}.mh-improved-travel-message.travelPage-map-message.active{top:46px;box-shadow:0 3px 6px -3px #333}.mh-improved-travel-message.travelPage-map-message .mousehuntActionButton{padding:3px 10px;font-size:11px}\n'; // src/modules/better-travel/travel-menu-hiding.css var travel_menu_hiding_default = "ul.fast-travel-list>li:not(.custom-submenu-item){display:none}\n"; // src/modules/better-travel/index.js var expandTravelRegions = () => { var _a, _b; if ("travel" !== getCurrentPage()) { return; } const hud = document.querySelector("#mousehuntHud"); if (hud) { const hudHeight = hud.offsetHeight + 30; const map = document.querySelector(".travelPage-mapContainer.full"); if (map) { map.style.height = `calc(100vh - ${hudHeight}px)`; } } const regionHeaders = document.querySelectorAll(".travelPage-regionMenu-regionLink"); if (regionHeaders) { regionHeaders.forEach((regionHeader) => { regionHeader.setAttribute("onclick", "return false;"); }); } const travelAreas = document.querySelectorAll(".travelPage-regionMenu-item"); if (travelAreas && travelAreas.length > 0) { travelAreas.forEach((area) => { area.classList.add("active"); area.classList.remove("contracted"); }); } const locations = document.querySelectorAll(".travelPage-map-image-environment.active"); if (locations && locations.length > 0) { locations.forEach((location) => { location.addEventListener("mouseover", () => { location.classList.add("highlight"); }); location.addEventListener("mouseout", () => { setTimeout(() => { location.classList.remove("highlight"); }, 1e3); }); }); } if ((_b = (_a = app == null ? void 0 : app.pages) == null ? void 0 : _a.TravelPage) == null ? void 0 : _b.zoomOut) { setTimeout(() => { app.pages.TravelPage.zoomOut(); }, 500); } }; var travelClickHandler = (event) => { var _a, _b; if ((_b = (_a = app == null ? void 0 : app.pages) == null ? void 0 : _a.TravelPage) == null ? void 0 : _b.travel) { travelTo(event.target.getAttribute("data-environment")); setPage("Camp"); } }; var cloneRegionMenu = () => { const regionMenu = document.querySelector(".travelPage-regionMenu"); if (!regionMenu) { return; } const regionMenuClone = regionMenu.cloneNode(true); const travelLinks = regionMenuClone.querySelectorAll(".travelPage-regionMenu-environmentLink"); if (travelLinks && travelLinks.length > 0) { travelLinks.forEach((link) => { link.setAttribute("onclick", "return false;"); link.addEventListener("click", travelClickHandler); }); } return regionMenuClone; }; var addTab = (id, label) => { if ("travel" !== getCurrentPage()) { return; } const exists = document.querySelector(`#mh-${id}-tab`); if (exists) { return; } const tabContainer = document.querySelector(".mousehuntHud-page-tabHeader-container"); if (!tabContainer) { return; } const tab = makeElement("a", "mousehuntHud-page-tabHeader"); tab.id = `mh-${id}-tab`; tab.setAttribute("data-tab", id); tab.setAttribute("onclick", "hg.utils.PageUtil.onclickPageTabHandler(this); return false;"); makeElement("span", "", label, tab); tabContainer.append(tab); }; var addPage = (id, content) => { if ("travel" !== getCurrentPage()) { return; } const exists = document.querySelector(`#mh-${id}-page`); if (exists) { return; } const pageContainer = document.querySelector(".mousehuntHud-page-tabContentContainer"); if (!pageContainer) { return; } const page = makeElement("div", ["mousehuntHud-page-tabContent", id]); page.id = `mh-${id}-page`; page.setAttribute("data-tab", id); if (content) { page.append(content); } else { const blank = makeElement("div"); page.append(blank); } pageContainer.append(page); }; var addAlphabetizedList = (regionMenu) => { const alphaWrapper = makeElement("div", "travelPage-alpha-wrapper"); const alphaContent = makeElement("div", "travelPage-regionMenu"); const alphaHeader = makeElement("div", ["travelPage-regionMenu-item", "active"]); const alphaList = makeElement("div", "travelPage-regionMenu-item-contents"); const alphaListContent = makeElement("div", "travelPage-regionMenu-environments"); const links = regionMenu.querySelectorAll(".travelPage-regionMenu-environmentLink"); const sortedLinks = [...links].sort((a, b) => { const aName = a.innerText; const bName = b.innerText; if (aName < bName) { return -1; } if (aName > bName) { return 1; } return 0; }); let lastLetter = ""; sortedLinks.forEach((link) => { const linkClone = link.cloneNode(true); alphaListContent.append(linkClone); linkClone.addEventListener("click", travelClickHandler); const firstLetter = linkClone.innerText.charAt(0).toLowerCase(); if (firstLetter !== lastLetter) { linkClone.classList.add("first-letter"); } lastLetter = firstLetter; const environment = environments2.find((env) => { return env.id === link.getAttribute("data-environment"); }); if (!environment) { linkClone.classList.add("event-location"); } }); alphaList.append(alphaListContent); alphaHeader.append(alphaList); alphaContent.append(alphaHeader); alphaWrapper.append(alphaContent); return alphaWrapper; }; var addSimpleTravelPage = () => { expandTravelRegions(); const wrapper = makeElement("div", "travelPage-wrapper"); if ("not-set" === getSetting("better-travel.default-to-simple-travel", "not-set")) { const settingTip = makeElement("div", ["travelPage-map-prefix", "simple-travel-tip"], 'You can set this as the default travel tab in the <a href="https://www.mousehuntgame.com/preferences.php?tab=mousehunt-improved-settings">MouseHunt Improved settings</a>.'); wrapper.append(settingTip); } const regionMenu = cloneRegionMenu(); if (getSetting("better-travel.show-alphabetized-list", false)) { wrapper.append(addAlphabetizedList(regionMenu)); } wrapper.append(regionMenu); addPage("simple-travel", wrapper); }; var addSimpleTravel = () => { if ("travel" !== getCurrentPage()) { return; } addTab("simple-travel", "Simple Travel"); addSimpleTravelPage(); }; var getPreviousLocation = () => { const previousLocation = getSetting("better-travel.previous-location", false); if (previousLocation && previousLocation !== getCurrentLocation()) { return environments2.find((environment) => { return environment.id === previousLocation; }); } return false; }; var goToPreviousLocation = () => { const previousLocation = getPreviousLocation(); if (previousLocation) { travelTo(previousLocation.id); } }; var addToTravelDropdown = () => __async(void 0, null, function* () { const currentLocation = getCurrentLocation(); const eventEnvironments = yield getData("environments-events"); environments2.push(...eventEnvironments); let currentRegion = environments2.find((environment) => { return environment.id === currentLocation; }); if (!currentRegion) { currentRegion = eventEnvironments.find((environment) => { return environment.id === currentLocation; }); if (!currentRegion) { return; } } const otherRegions = environments2.filter((environment) => { if (!(environment == null ? void 0 : environment.region) || !(currentRegion == null ? void 0 : currentRegion.region)) { return false; } return environment.region === currentRegion.region; }); otherRegions.splice(otherRegions.findIndex((environment) => { return environment.id === currentLocation; }), 1); const existingCustomSubmenuItems = document.querySelectorAll(".mh-improved-better-travel-menu-item"); if (existingCustomSubmenuItems) { existingCustomSubmenuItems.forEach((item) => { item.remove(); }); } const previousLocation = getPreviousLocation(); if (previousLocation) { addSubmenuItem({ menu: "travel", label: `Back to ${previousLocation.name}`, icon: "https://www.mousehuntgame.com/images/ui/puzzle/refresh.png", callback: goToPreviousLocation, class: "mh-improved-better-travel-menu-item mh-improved-better-travel-previous-location" }); } otherRegions.forEach((region) => { if (region.id === currentLocation) { return; } addSubmenuItem({ menu: "travel", label: region.name, icon: region.image, callback: () => { travelTo(region.id); }, class: "mh-improved-better-travel-menu-item mh-improved-better-travel-region-location" }); }); const favorites = getLocationFavorites(); if (favorites && favorites.length > 0) { addSubmenuDivider("travel", "mh-improved-better-travel-favorites-divider"); favorites.forEach((favorite) => { const favoriteRegion = environments2.find((environment) => { return environment.id === favorite; }); if (favoriteRegion) { addSubmenuItem({ menu: "travel", label: favoriteRegion.name, icon: favoriteRegion.image, callback: () => { travelTo(favoriteRegion.id); }, class: "mh-improved-better-travel-menu-item mh-improved-better-travel-favorite-location" }); } }); } }); var onTravelComplete = () => { onEvent("travel_complete", () => { saveTravelLocation(); setTimeout(() => { if (getSetting("better-travel.show-reminders", true)) { reminders_default(); } addToTravelDropdown(); }, 250); }); }; var initSimpleTab = () => { if ("simple-travel" === getCurrentTab()) { const isActive = document.querySelector(".mousehuntHud-page-tabContent.simple-travel"); if (!isActive || isActive && isActive.classList.contains("active")) { return; } setTab("simple-travel"); } }; var maybeSetTab = () => { if ("travel" !== getCurrentPage()) { return; } initSimpleTab(); if ("map" !== getCurrentTab()) { return; } if (!getSetting("better-travel.default-to-simple-travel", false)) { return; } setTab("simple-travel"); }; var addRhToSimpleTravel = () => __async(void 0, null, function* () { const location = yield getRelicHunterLocation(); if (!location) { return; } const travelLink = document.querySelectorAll(`.travelPage-regionMenu-environmentLink[data-environment="${location.id}"]`); if (!travelLink.length) { return; } travelLink.forEach((link) => { link.classList.add("relic-hunter-is-here"); }); }); var addRhToMap = () => __async(void 0, null, function* () { const location = yield getRelicHunterLocation(); if (!location) { return; } const mapLocation = document.querySelector(`.travelPage-map-image-environment[data-environment-type="${location.id}"]`); if (!mapLocation) { return; } const rh = makeElement("div", ["map-relic-hunter-is-here", "travelPage-map-image-environment-pointer"]); makeElement("div", ["map-relic-hunter-is-here-image", "travelPage-map-image-environment-pointer-image"], "", rh); mapLocation.append(rh); }); var maybeDoMapView = () => { if ("travel" !== getCurrentPage()) { return; } if ("map" !== getCurrentTab()) { return; } expandTravelRegions(); addRhToMap(); }; var _tabHandler = null; var listenTabChange = () => { var _a, _b; if (_tabHandler) { return; } if (!((_b = (_a = hg == null ? void 0 : hg.utils) == null ? void 0 : _a.PageUtil) == null ? void 0 : _b.onclickPageTabHandler)) { return; } _tabHandler = hg.utils.PageUtil.onclickPageTabHandler; hg.utils.PageUtil.onclickPageTabHandler = (tab) => { _tabHandler(tab); maybeDoMapView(); }; }; var saveTravelLocation = () => { const isLocationDashboardRefreshing = sessionGet("doing-location-refresh", false); if (isLocationDashboardRefreshing) { return; } const previousLocation = getTravelSetting("current-location", "not-set"); const currentLocation = getCurrentLocation(); if (currentLocation === previousLocation) { return; } saveTravelSetting("previous-location", previousLocation); saveTravelSetting("current-location", currentLocation); }; var getLocationFavorites = () => { const faves = getSetting("better-travel.favorites", []); return faves; }; var isLocationFavorite = (type) => { return getLocationFavorites().includes(type); }; var saveLocationFavorites = (favorites) => { saveTravelSetting("favorites", favorites); }; var addToLocationFavorites = (type) => { if (!isLocationFavorite(type)) { const faves = getLocationFavorites(); faves.push(type); saveLocationFavorites(faves); } }; var removeFromLocationFavorites = (type) => { if (getLocationFavorites()) { const faves = getLocationFavorites(); faves.splice(faves.indexOf(type), 1); saveLocationFavorites(faves); } }; var addFavoriteButtonsToTravelPage = () => __async(void 0, null, function* () { const locations = document.querySelectorAll(".travelPage-map-environment-detailContainer .travelPage-map-environment-detail"); if (!locations) { return; } const locationFavorites = getLocationFavorites(); locations.forEach((location) => { const type = location.getAttribute("data-environment-type"); if (!type) { return; } const isEventLocation = environments2.find((environment) => { return environment.id === type; }); if (isEventLocation) { return; } const isFavorite = locationFavorites.includes(type); makeFavoriteButton({ id: `better-travel-favorite-${type}`, target: location.querySelector(".travelPage-map-environment-detail-title"), size: "small", state: isFavorite, isSetting: false, defaultState: false, onActivate: () => { addToLocationFavorites(type); addToTravelDropdown(); }, onDeactivate: () => { removeFromLocationFavorites(type); removeSubmenuItem(type); } }); }); }); var main = () => { if (getSetting("better-travel.travel-window", true)) { travel_window_default(); } onNavigation(() => { addSimpleTravel(); addRhToSimpleTravel(); addFavoriteButtonsToTravelPage(); maybeSetTab(); }, { page: "travel" }); listenTabChange(); initSimpleTab(); maybeDoMapView(); onTravelComplete(); saveTravelLocation(); addToTravelDropdown(); onEvent("mh-improved-goto-previous-location", goToPreviousLocation); }; var environments2 = []; var init = () => __async(void 0, null, function* () { const stylesJoined = [styles_default]; if (!getFlag("no-travel-menu-hiding")) { stylesJoined.push(travel_menu_hiding_default); } addStyles(stylesJoined, "better-travel"); environments2 = yield getData("environments"); main(); }); var better_travel_default = { id: "better-travel", name: "Better Travel", type: "better", default: true, description: 'Adds locations in the current region to the Travel dropdown menu, a "Simple Travel" tab with a grid of locations, an optional alphabetized list, an indicator for where the Relic Hunter is.', load: init, settings: settings_default }; return __toCommonJS(better_travel_exports); })(); mhImprovedVersion = "0.0.0-userscript;" mhImprovedPlatform = "userscript"; mhui.default.load(); migrateUserscript('Better Travel / Travel Tweaks', 'https://greasyfork.org/en/scripts/452232-mousehunt-travel-tweaks');