Milkyway Idle 食物消耗计算器

左上角小黑白按钮,字体统一放大,界面优化

// ==UserScript==
// @name         Milkyway Idle 食物消耗计算器
// @namespace    http://tampermonkey.net/
// @version      1.3
// @description  左上角小黑白按钮,字体统一放大,界面优化
// @author       noonsleepbox
// @match        https://milkywayidle.com/*
// @match        https://shykai.github.io/MWICombatSimulatorTest/dist/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
  'use strict';

  const style = document.createElement('style');
  style.textContent = `
    #floatingButton {
      position: fixed;
      top: 20px;
      left: 20px;
      background: white;
      color: black;
      font-size: 36px;
      font-weight: bold;
      width: 60px;
      height: 60px;
      border-radius: 50%;
      text-align: center;
      line-height: 60px;
      cursor: move;
      z-index: 10000;
      user-select: none;
      box-shadow: 0 4px 10px rgba(0,0,0,0.3);
      border: 2px solid black;
    }

    #calcPanel {
      display: none;
      position: fixed;
      top: 100px;
      left: 20px;
      width: 800px;
      padding: 25px;
      background: #f9f9f9;
      border: 2px solid #bbb;
      border-radius: 14px;
      z-index: 10000;
      box-shadow: 0 0 15px rgba(0,0,0,0.2);
      font-size: 28px;
    }

    #calcPanel h3 {
      margin-top: 0;
      font-size: 28px;
      color: #2c3e50;
    }

    #calcPanel textarea {
      width: 100%;
      height: 200px;
      font-size: 28px;
      padding: 10px;
      border: 1px solid #ccc;
      border-radius: 6px;
      resize: none;
    }

    #calcPanel table {
      width: 100%;
      border-collapse: collapse;
      margin-top: 20px;
      font-size: 28px;
    }

    #calcPanel th, #calcPanel td {
      border: 1px solid #aaa;
      padding: 10px;
      text-align: center;
    }

    #calcPanel input[type="number"] {
      width: 150px;
      font-size: 28px;
      margin-left: 10px;
    }

    #calcPanel button {
      font-size: 28px;
      padding: 8px 16px;
      margin-left: 10px;
      cursor: pointer;
    }
  `;
  document.head.appendChild(style);

  const button = document.createElement('div');
  button.id = 'floatingButton';
  button.innerText = '+';

  const panel = document.createElement('div');
  panel.id = 'calcPanel';
  panel.innerHTML = `
    <h3>食物消耗量计算器</h3>
    <textarea id="inputText" placeholder="格式:食物\\n数值\\n..."></textarea><br><br>
    天数: <input type="number" id="days" value="1" min="1">
    <button id="confirmBtn">确认</button>
    <div id="output" style="margin-top: 20px;"></div>
  `;

  document.body.appendChild(button);
  document.body.appendChild(panel);

  // 拖动按钮逻辑
  let offsetX, offsetY, isDragging = false;
  button.addEventListener('mousedown', function(e) {
    isDragging = true;
    offsetX = e.clientX - button.getBoundingClientRect().left;
    offsetY = e.clientY - button.getBoundingClientRect().top;
  });
  document.addEventListener('mouseup', function() { isDragging = false; });
  document.addEventListener('mousemove', function(e) {
    if (isDragging) {
      let x = e.clientX - offsetX;
      let y = e.clientY - offsetY;
      const maxX = window.innerWidth - button.offsetWidth;
      const maxY = window.innerHeight - button.offsetHeight;
      x = Math.min(Math.max(0, x), maxX);
      y = Math.min(Math.max(0, y), maxY);
      button.style.left = x + 'px';
      button.style.top = y + 'px';
    }
  });

  // 拖动 panel(点击空白处)
  panel.addEventListener('mousedown', function(e) {
    if (e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'INPUT' && e.target.tagName !== 'BUTTON') {
      isDragging = true;
      offsetX = e.clientX - panel.getBoundingClientRect().left;
      offsetY = e.clientY - panel.getBoundingClientRect().top;
      e.preventDefault();
    }
  });
  document.addEventListener('mousemove', function(e) {
    if (isDragging) {
      let x = e.clientX - offsetX;
      let y = e.clientY - offsetY;
      const maxX = window.innerWidth - panel.offsetWidth;
      const maxY = window.innerHeight - panel.offsetHeight;
      panel.style.left = Math.min(Math.max(0, x), maxX) + 'px';
      panel.style.top = Math.min(Math.max(0, y), maxY) + 'px';
    }
  });
  document.addEventListener('mouseup', function() { isDragging = false; });

  // 显示/隐藏面板
  let panelVisible = false;
  button.addEventListener('click', () => {
    panelVisible = !panelVisible;
    panel.style.display = panelVisible ? 'block' : 'none';
  });

  // 计算逻辑
  document.addEventListener('click', (e) => {
    if (e.target.id === 'confirmBtn') {
      const input = document.getElementById('inputText').value.trim();
      const days = parseInt(document.getElementById('days').value);
      const lines = input.split('\n').map(l => l.trim()).filter(l => l !== '');
      const result = [];

      for (let i = 0; i < lines.length - 1; i += 2) {
        const name = lines[i];
        const value = parseFloat(lines[i + 1]);
        if (!isNaN(value)) {
          const daily = value * 24;
          const total = daily * days;
          result.push({ name, value, daily, total });
        }
      }

      let html = `<table>
        <tr><th>食物</th><th>每小时</th><th>每天</th><th>${days}天</th></tr>`;
      for (const item of result) {
        html += `<tr>
          <td>${item.name}</td>
          <td>${item.value}</td>
          <td>${item.daily}</td>
          <td>${item.total}</td>
        </tr>`;
      }
      html += `</table>`;

      document.getElementById('output').innerHTML = html;
    }
  });

  // 粘贴自动填充
  window.addEventListener('paste', (event) => {
    const text = event.clipboardData.getData('text');
    if (panelVisible && text.includes('\n')) {
      document.getElementById('inputText').value = text;
    }
  });

})();