Greasy Fork

怪物换皮 + 战败cg

替换怪物图标为自定义图片,同时在玩家死亡时更换人物模型为复活图像

目前为 2025-04-26 提交的版本。查看 最新版本

// ==UserScript==
// @name         怪物换皮 + 战败cg
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  替换怪物图标为自定义图片,同时在玩家死亡时更换人物模型为复活图像
// @match        https://www.milkywayidle.com/*
// @grant        none
// @license      MIT
// ==/UserScript==

(function () {
  'use strict';

  const monsterImageMap = {
    'fly': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'rat': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'skunk': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'porcupine': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'slimy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'frog': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'snake': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'swampy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'alligator': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'sea_snail': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'crab': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'aquahorse': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'nom_nom': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'turtle': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'jungle_sprite': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'myconid': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'treant': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'centaur_archer': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'stabby': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'slashy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'smashy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'shooty': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'boomy': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'eye': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'eyes': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'veyes': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'novice_sorcerer': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'ice_sorcerer': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'flame_sorcerer': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'elementalist': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'gummy_bear': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'panda': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'black_bear': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'grizzly_bear': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'polar_bear': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'zombie': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'vampire': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'werewolf': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'abyssal_imp': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'soul_hunter': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'infernal_warlock': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'granite_golem': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'magnetic_golem': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    'stalactite_golem': 'https://tupian.li/images/2025/04/26/680c4019ce7a1.gif',
    // boss
    'crystal_colossus': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
    'giant_shoebill': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
    'marine_huntress': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
    'luna_empress': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
    'gobo_chieftain': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
    'the_watcher': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
    'chronofrost_sorcerer': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
    'red_panda': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
    'dusk_revenant': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
    'demonic_overlord': 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif',
  };

  const reviveImageUrl = 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif'; // 玩家战败cg
  let isPlayerReplaced = false;
  let originalPlayerModel = null;

  // 替换怪物图标
  const replaceIcons = () => {
    document.querySelectorAll('svg use[href*="combat_monsters_sprite"]').forEach(useEl => {
      const href = useEl.getAttribute('href');
      const monsterId = Object.keys(monsterImageMap).find(id => href.endsWith(id));
      if (monsterId) {
        const svgEl = useEl.closest('svg');
        if (svgEl) {
          const img = document.createElement('img');
          img.src = monsterImageMap[monsterId];
          img.style.width = svgEl.getAttribute('width') || '100%';
          img.style.height = svgEl.getAttribute('height') || '100%';
          img.style.objectFit = 'contain';
          svgEl.parentNode.replaceChild(img, svgEl);
        }
      }
    });
  };

  // 检查并替换玩家战败cg
  const checkReviveStatus = () => {
    const unit = document.querySelector('.CombatUnit_combatUnit__1m3XT');
    const reviveOverlay = unit?.querySelector('.CountdownOverlay_countdownOverlay__2QRmL');
    const modelContainer = unit?.querySelector('.CombatUnit_model__2qQML');

    if (unit && modelContainer) {
      if (reviveOverlay && !isPlayerReplaced) {
        // 保存原始内容
        originalPlayerModel = modelContainer.cloneNode(true);
        // 替换为复活图像
        modelContainer.innerHTML = `
          <div style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
            <img src="${reviveImageUrl}" alt="复活中" style="max-height: 100px;" />
          </div>
        `;
        isPlayerReplaced = true;
      } else if (!reviveOverlay && isPlayerReplaced && originalPlayerModel) {
        // 恢复原模型
        modelContainer.replaceWith(originalPlayerModel);
        isPlayerReplaced = false;
        originalPlayerModel = null;
      }
    }
  };

  // 启动监听器和定时器
  const observer = new MutationObserver(() => {
    replaceIcons();
    checkReviveStatus();
  });

  observer.observe(document.body, { childList: true, subtree: true });

  // 初始延迟触发一次
  setTimeout(() => {
    replaceIcons();
    checkReviveStatus();
  }, 500);

  // 定时检查(确保复活状态不会漏)
  setInterval(checkReviveStatus, 1000);
})();