Greasy Fork

[银河奶牛]怪物换皮 + 战败cg

替换怪物图标为自定义图片URL,替换玩家死亡和怪物死亡时为自定义图片URL

// ==UserScript==
// @name         [银河奶牛]怪物换皮 + 战败cg
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  替换怪物图标为自定义图片URL,替换玩家死亡和怪物死亡时为自定义图片URL
// @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',
    'crystal_colossus': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'giant_shoebill': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'marine_huntress': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'luna_empress': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'gobo_chieftain': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'the_watcher': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'chronofrost_sorcerer': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'red_panda': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'dusk_revenant': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
    'demonic_overlord': 'https://tupian.li/images/2025/04/18/680c4019ce7a1.gif',
  };

  const reviveImageUrl = 'https://tupian.li/images/2025/04/18/6801c297a15ef.gif'; // 玩家战败cg
  const monsterDeadImageUrl = '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 svgEl = useEl.closest('svg');
      if (!svgEl) return;

      const modelContainer = svgEl.closest('.CombatUnit_model__2qQML');
      if (!modelContainer) return;

      const href = useEl.getAttribute('href');
      const monsterId = Object.keys(monsterImageMap).find(id => href.endsWith(id));

      if (monsterId) {
        modelContainer.innerHTML = `
          <div style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
            <img src="${monsterImageMap[monsterId]}" alt="${monsterId}" style="max-height: 100px;" />
          </div>
        `;
      }
    });
  };

  // 怪物战败cg
  const checkMonsterDeathStatus = () => {
    const monsters = document.querySelectorAll('.CombatUnit_combatUnit__1m3XT');
    monsters.forEach((unit) => {
      const isDead = unit.classList.contains('CombatUnit_dead__10Kxb');
      const modelContainer = unit.querySelector('.CombatUnit_model__2qQML');
      if (!modelContainer) return;
      if (isDead && !unit._originalMonsterModel) {
        unit._originalMonsterModel = modelContainer.cloneNode(true);
        modelContainer.innerHTML = `
          <div style="width: 100%; height: 100%; display: flex; align-items: center; justify-content: center;">
            <img src="${monsterDeadImageUrl}" alt="已死亡" style="max-height: 100px;" />
          </div>
        `;
      } else if (!isDead && unit._originalMonsterModel) {
        modelContainer.replaceWith(unit._originalMonsterModel);
        unit._originalMonsterModel = null;
      }
    });
  };

  // 玩家战败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) return;
    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();
    checkMonsterDeathStatus();
    checkReviveStatus();
  });

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

  // 初始化
  setTimeout(() => {
    replaceIcons();
    checkMonsterDeathStatus();
    checkReviveStatus();
  }, 500);

  // 定时器
  setInterval(checkMonsterDeathStatus, 500);
  setInterval(checkReviveStatus, 500);

})();