# ゛花火表情包面板真是太可爱了!

80hou 2026-08-06 10:02 1

前言


哈喽!(,,・∀・)ノ,从加入论坛一直在用的火花插件.

【论坛优化】分享一个自制的 "花火" 表情包论坛扩展 也可自定义添加表情包 v0.3.4 油猴脚本

花火表情脚本部分功能似乎遇到了bug,为了让花火周末享受假期悠闲时光,只能让哈基米修复..


修复后,嗯,天天点表情太枯燥了,融入了一些RPG的恶趣味想法。


当然可能还有一些视觉上的Bug,比如开局近视眼,需要探险历练后获得神识然后才能纠正视力.嘻嘻。



初入江湖人心险恶,视力下降



【寻宝抽卡】 获得法宝 💜 [SR] 镀锌高强M8六角螺母(带散热片)

💥 战力:57 | 境界:⚡ 混元无极·抽象天尊 | 尊号:【太虚 · 歪嘴飞行特技 · 螺母x8真君】

🗺秘境事件:在【403 Forbidden上古禁制阵法前】,强行破除‘403拒绝访问’防御大阵,破阵成功!意外搜刮到一包化肥级尿素和绝世法宝!

👉 行动指令:此贴已被我制霸,请楼下速速奉上鸡腿 🍗 认输!

仓库:📦 写满化肥的尿素袋

👉 韩道友给你赠送了功法秘籍:点击进入传送阵



随手让Gemini修改的,防止Chrome自动更新又清空我浏览器缓存,故发个贴备忘下.


🌸 油猴脚本内容
// ==UserScript==
// @name 花火表情包面板 (垃圾桶修仙大作 v5.2.0 + 神识拉满防越界修复 + 弹性自适应UI)
// @namespace https://deepflood.com/
// @version 5.2.0
// @description 修复神识拉满时的UI越界与文字重叠Bug;人物面板采用弹性自适应流式布局;极简吃瓜折叠输出;开放式可扩展词库
// @author Sparkle
// @match *://www.deepflood.com/*
// @match *://www.nodeseek.com/*
// @grant none
// @icon https://cdn.nodeimage.com/i/IEyH4NN7T0gzIj2GNDLEkMNfxi5e7S5R.png
// ==/UserScript==

(function () {
'use strict';

// =========================================================================
// 【模块 1】全局配置与开放式可扩展词库 (CONFIG & VOCABULARY)
// 💡 提示:你可以在此自由添加、修改或删除任何趣味词汇,系统会自动进行随机排列组合!
// =========================================================================

const CHIGUA_TOP_ICON = "https://cdn.nodeimage.com/i/jbZrDO140rXSZpEqZ6xrOavN2wsUXuPY.webp"; // 🍉 探险历练图标
const GACHA_TOP_ICON = "https://cdn.nodeimage.com/i/LLYwA5x25a3sbzuGlzSzA0yQCHnuHkit.webp"; // 🎰 寻宝抽卡图标
const RESERVED_TOP_ICON = "https://cdn.nodeimage.com/i/lMepKbJMV2whSeb9Bl4WqXBEvT9VGHCf.webp"; // 🧘 人物修仙图标
const TOGGLE_BTN_ICON = "https://cdn.nodeimage.com/i/IEyH4NN7T0gzIj2GNDLEkMNfxi5e7S5R.png"; // 右下角悬浮窗图标

// 👈 [可自定义输入] 预留的插件传送阵接口链接
const PLUGIN_SHARE_URL = "https://github.com/your-username/hanabi-emoji-xianxia";

// 1.2 垃圾桶修仙奇遇词库 (支持无限扩充)
const trashPlaces = [
"在【论坛地下垃圾桶洞府】", "在【废弃2.5G软路由器机房废墟】", "在【M8高强螺母谷底】",
"在【403 Forbidden上古禁制阵法前】", "在【赛博乞丐的破碗旁】", "在【打折菜市场的烂菜叶堆里】"
];
const trashEvents = [
"误入垃圾桶洞府触发上古禁制", "强行破除‘403拒绝访问’防御大阵",
"在废旧服务器散热片上烤红薯引发九天雷劫", "试图用M12大扳手暴力拆解宗门山门护阵",
"在垃圾堆深处翻出一本发黄的《葵花宝典·螺母篇》"
];
const trashReverses = [
"破阵成功!意外搜刮到一包化肥级尿素和绝世法宝", "阵法崩碎,从虚空中掉落一箱生锈的弹簧垫圈",
"惊动了垃圾桶扫地僧,对方大赞骨骼惊奇并传授无上绝学", "触发隐藏废土奇遇,直接爆出极品UR工业神装"
];

// 1.3 抽象尊号 5 维矩阵词库 (支持无限扩充)
const titleMods = ["混元", "九转", "赛博", "降维", "绝世", "核爆", "高压", "无极", "暗黑", "荒古", "盖世", "太虚"];
const bodyTraits = ["瘸腿", "独眼", "一只耳", "无臂", "瞎眼", "缺牙", "秃头", "歪嘴", "鸡爪手", "铁头", "面瘫", "大肚"];
const contrastProfessions = ["极速跑腿", "精准狙击", "监听天下", "画风突变", "飞行特技", "拆弹专家", "钢琴朗朗", "吃瓜速记", "绝地反杀", "硬核推拿"];
const titleSuffixes = ["真君", "大侠", "狂魔", "天尊", "老怪", "祖师", "尊者", "圣手", "暴民", "上仙", "神君"];

// 1.4 过程化装备词库 (支持无限扩充)
const itemPrefixes = ["核动力", "九号", "镀锌高强", "二冲程", "高压防爆", "生锈的", "绝密战术", "特调", "加厚型", "国标GB39"];
const itemCores = {
ring: ["M8六角螺母", "弹簧垫圈", "生料带戒指", "不锈钢平垫", "活塞卡环", "橡皮筋手环"],
armor: ["军绿大棉袄", "快递纸箱防弹衣", "防爆泡沫板", "羽绒服战甲", "塑料雨衣道袍"],
weapon: ["汽油电锯", "战术高压马桶吸", "M12大扳手", "加特林机枪", "折叠工兵铲"],
glasses: ["大佬战术墨镜", "透视圆框眼镜", "焊接防光面罩", "泳镜"],
drink: ["核动力特浓美式", "九转大肠仙丹", "特调星空冰摇茶", "满杯葡萄冰沙", "珍珠奶茶"],
head: ["马戏团七彩头饰", "粉色睡帽", "高压安全帽", "浴帽"],
doll: ["软萌兔子玩偶", "焦糖爆米花", "吃瓜西瓜切片", "小丑玩偶"]
};
const itemSuffixes = ["(带散热片)", "[质保三年]", "(+10棉层)", "[超大号]", "(高压防爆)", "(已强化+9)"];

// =========================================================================
// 【模块 3】修仙功能菜单与装备槽位定义 (TABS & SLOTS)
// =========================================================================
const xianxiaTabs = [
{ id: 'bag', name: '🎒 随身布袋', unlockThreshold: 0 },
{ id: 'artifact', name: '🗡️ 上古法宝', unlockThreshold: 5 },
{ id: 'elixir', name: '💊 仙丹灵饮', unlockThreshold: 12 },
{ id: 'armor', name: '📜 防具秘籍', unlockThreshold: 20 },
{ id: 'vault', name: '🌐 万宝宗阁', unlockThreshold: 35 }
];

const SLOT_NAMES = {
storage: '📦 储物装置',
head: '🌸 头部防具',
glasses: '👓 面饰墨镜',
ring: '💍 戒指手饰',
armor: '🥼 护体战袍',
weapon: '🔫 护体神兵',
drink: '🧋 仙丹灵饮',
doll: '🐰 灵宠法宝'
};

const emojiRPGDB = {
"https://cdn.nodeimage.com/i/uUG7GSfToq9m6fx9jLPFoQDQpNgEfZLI.webp": { name: "软萌治愈兔子玩偶", rarity: "SSR", slot: "doll", power: 88, desc: "治愈力爆表", icon: "🐰" },
"https://cdn.nodeimage.com/i/aVRKKCv7C1e3TttRXx9bDdgqWW5CYaQb.webp": { name: "大佬战术黑墨镜", rarity: "SSR", slot: "glasses", power: 95, desc: "气场+100%", icon: "🕶️" },
"https://cdn.nodeimage.com/i/jbZrDO140rXSZpEqZ6xrOavN2wsUXuPY.webp": { name: "加厚军绿大棉袄", rarity: "SR", slot: "armor", power: 45, desc: "防寒保暖", icon: "🧥" },
"https://cdn.nodeimage.com/i/jpGOKzfczXVyRSx2acQ1Q4CTozeWMfhu.webp": { name: "M8镀锌高强螺母", rarity: "SR", slot: "ring", power: 50, desc: "工业风戒指", icon: "💍" },
"https://cdn.nodeimage.com/i/znzD9F3p9mkCWWAUD1K0RV6Yz5Xtq0Bb.webp": { name: "马戏团七彩神装头饰", rarity: "UR", slot: "head", power: 150, desc: "神级隐藏款", icon: "🌈" },
"https://cdn.nodeimage.com/i/kSthzVLv6HY1zz4suH3sy8vDoTmp5ZIO.webp": { name: "二冲程汽油电锯", rarity: "UR", slot: "weapon", power: 145, desc: "火力压制", icon: "🪚" }
};

const defaultInitialCategoryMap = {
"https://cdn.nodeimage.com/i/vOTJU4khVo1Qb1cbtT904TCEOBDuY2pU.webp": "kaixin",
"https://cdn.nodeimage.com/i/0ZCReBeyFFQ6lZYIpaP19PyTYNsu7mxg.webp": "kaixin",
"https://cdn.nodeimage.com/i/Kp6lEcDDGE5MxXC0gwJfrpFaHQiTRtEM.webp": "kaixin",
"https://cdn.nodeimage.com/i/tpoIZ4Km7Uwv6qMFI2kV6TXKYO1ziRNh.webp": "kaixin",
"https://cdn.nodeimage.com/i/tFDVSfqDUJ3use04YbsAA4llEmFIKCTn.webp": "weiqu",
"https://cdn.nodeimage.com/i/8hppjJWDYBVTeK85m2K3bSgd3JuYmEbf.webp": "kaixin",
"https://cdn.nodeimage.com/i/54AChLa8vSocW0hnYfGNvL6IpBYc2pQO.webp": "weiqu",
"https://cdn.nodeimage.com/i/MuGvoHfcZur4LIxV0vmAild1gxqyOp2D.webp": "chigua",
"https://cdn.nodeimage.com/i/1OSvfN0tb9K9um3gXtBBh4TXHCO1JbGd.webp": "chigua",
"https://cdn.nodeimage.com/i/RmNsDWdgERzfqgBGreUV7GO4KUYRyaYG.webp": "chigua",
"https://cdn.nodeimage.com/i/1NPHX79DgNxskE6XuZyxT3s3IjGzVvr8.webp": "weiqu",
"https://cdn.nodeimage.com/i/dhdPfmUJ1wZgDqlcsxIzIMVblUJ1q1Zt.webp": "weiqu",
"https://cdn.nodeimage.com/i/aVRKKCv7C1e3TttRXx9bDdgqWW5CYaQb.webp": "chigua",
"https://cdn.nodeimage.com/i/OefRvbVQdLf8iZZqt49amiteU8CW6cEi.webp": "weiqu",
"https://cdn.nodeimage.com/i/QLhu6wFbgNP0Qqg2ObKCyMqjy2WvBVEu.webp": "weiqu",
"https://cdn.nodeimage.com/i/ahoxBgKxdt1JCSMeXv4d8h6aj6ZlsCED.webp": "chigua",
"https://cdn.nodeimage.com/i/0F8icWwTar1Z0iP07pi4oKv1bpEfdkfg.webp": "chigua",
"https://cdn.nodeimage.com/i/JXQfBalFDqGillv0Ur8azl3tnkEu9m8g.webp": "weiqu",
"https://cdn.nodeimage.com/i/mFW4Tr47fnWRCYs5ywPGcnipsVlxBRdH.webp": "chigua",
"https://cdn.nodeimage.com/i/9MB8mx8QDOcqspQwSfe527VA6KLA3ZGH.webp": "weiqu",
"https://cdn.nodeimage.com/i/oezEmg3ro5cvSoAOcHp8LxW5azS64uVy.webp": "kaixin",
"https://cdn.nodeimage.com/i/hKOdrQgGLXhYgetDkUO9EoOIOndMVY5N.webp": "weiqu",
"https://cdn.nodeimage.com/i/oiy8rFNM2nSN7y2gzXzHDEcUXvHgdYAn.webp": "kaixin",
"https://cdn.nodeimage.com/i/fSv4NUBkgyQ84nnAnbHY5GQuUxWtbqvW.webp": "weiqu",
"https://cdn.nodeimage.com/i/XpCIL0ek4d3VoMYdajWnHqt9LNp1AVi0.webp": "weiqu",
"https://cdn.nodeimage.com/i/0g17Z0pXl4ce9QVOqv2osuVYFhOyR7ur.webp": "kaixin",
"https://cdn.nodeimage.com/i/xNMGqEuVsnUqiQp2jK6cefXMF00odQnV.webp": "weiqu",
"https://cdn.nodeimage.com/i/JQtQRHLLb4KjRk450y2E4LYiGnfuUxBq.webp": "weiqu",
"https://cdn.nodeimage.com/i/00QMQUlje2NYbJv7m9bgbCV6EzOuf2ml.webp": "kaixin",
"https://cdn.nodeimage.com/i/kOtHR5LQ0NBEmM42USEzxh91YNMafFEf.webp": "weiqu",
"https://cdn.nodeimage.com/i/g3fLeoVd8uddMpZCYkN5IVdaGPGK628v.webp": "chigua",
"https://cdn.nodeimage.com/i/RSPL5R9X5GsbGY6RgNmtm5nhYzXDEsyC.webp": "weiqu",
"https://cdn.nodeimage.com/i/yAv9LFBiRnt2dBnuXSiI7Yba3OasBbnv.webp": "kaixin",
"https://cdn.nodeimage.com/i/iPojY1Kv7oIFIIMtgVtlfOSRh4JP5a0O.webp": "chigua",
"https://cdn.nodeimage.com/i/2PKujazf4JuWrj1VHx6tFIp7AkJKcxFR.webp": "chigua",
"https://cdn.nodeimage.com/i/ITs8pMIgID6IpuF6zqibTRwNHgBewAos.webp": "chigua",
"https://cdn.nodeimage.com/i/jpGOKzfczXVyRSx2acQ1Q4CTozeWMfhu.webp": "chigua",
"https://cdn.nodeimage.com/i/YPwKuJE0n12mubDsWS1lt5O1DLtPEnYL.webp": "chigua",
"https://cdn.nodeimage.com/i/lJS7h90l7jFSr73MHb4TRpyUByRUHGSS.webp": "chigua",
"https://cdn.nodeimage.com/i/sZkULJ6ujMuKPhzjYRVj5HXwoxhuj91i.webp": "kaixin",
"https://cdn.nodeimage.com/i/jIxOBPo1aasfMG9vtX2lmdXKlrYlrzn8.webp": "chigua",
"https://cdn.nodeimage.com/i/LQC2wAe6j9Xoq2YPYT3OCGPzVK6BUXeY.webp": "kaixin",
"https://cdn.nodeimage.com/i/kSthzVLv6HY1zz4suH3sy8vDoTmp5ZIO.webp": "gengtu",
"https://cdn.nodeimage.com/i/kl9ooVQRMKmC8mkpCslIU0meTaqN2S3E.webp": "gengtu",
"https://cdn.nodeimage.com/i/MUFCcFraGScTjA7uifnGouCX1NKTZ0A3.webp": "gengtu",
"https://cdn.nodeimage.com/i/Gql10SAUMMkGShynVRHzjjRahXJYkNXB.webp": "gengtu",
"https://cdn.nodeimage.com/i/UbzwRB37Jm06NDAbgbmxu01rPAnybhu7.webp": "gengtu",
"https://cdn.nodeimage.com/i/T5fKEVVhW0COgGZ7KNAsROJeYVGcm37M.webp": "gengtu",
"https://cdn.nodeimage.com/i/Vepi6EWHI3NScN80GJQilQnx2Gb9AyzC.webp": "gengtu",
"https://cdn.nodeimage.com/i/nhpaALWwEGkHnB84nYqK5ReywWQMSXwv.webp": "gengtu",
"https://cdn.nodeimage.com/i/myGs7ZfsJft3u3xPlAcBiGyKq1DM5IAE.webp": "gengtu",
"https://cdn.nodeimage.com/i/M2OKTDg9G5BkdKtQuFBhjmkvkFZ6vGRM.webp": "gengtu",
"https://cdn.nodeimage.com/i/BN9HS2QthEdRMnkD8HRfG7YUCJw62Unl.webp": "gengtu",
"https://cdn.nodeimage.com/i/Wc00G6taGKxvDaTtCqv1YCwuJZEQa1ui.webp": "gengtu",
"https://cdn.nodeimage.com/i/1x3aogCXDNn8QcqsUG3TsBNLoRAzYFXA.webp": "gengtu",
"https://cdn.nodeimage.com/i/AoUnrPjRm5suaaw6Vk5vm9DC3ThUmtPm.webp": "gengtu",
"https://cdn.nodeimage.com/i/IbreqSXkTGKB8lI7nWPNWXf6qnZjTi9M.webp": "gengtu",
"https://cdn.nodeimage.com/i/0mpBkpWpSgBkkL8Hw9KSJDmeQQGZNDEP.webp": "gengtu",
"https://cdn.nodeimage.com/i/efpGAkW3O1EUL58FHizBZbCUlKAcl0Zq.webp": "gengtu",
"https://cdn.nodeimage.com/i/ScbnJdPf3Hw1mWf8wWWvWXisACSenf35.webp": "gengtu",
"https://cdn.nodeimage.com/i/mXKFrUzOlsFxUQ1MgTk7X4GtXRPHR5rK.webp": "gengtu",
"https://cdn.nodeimage.com/i/8WIZnwhX3eNldy5yUdlMZrgy7okYkaSN.webp": "gengtu",
"https://cdn.nodeimage.com/i/wLt0xaL7kkwOEl4q6VuU1g88ntqOk722.webp": "gengtu",
"https://cdn.nodeimage.com/i/Ya8KaVwYDqO1mTPqebTeRjUFr2TMyZ0O.webp": "gengtu",
"https://cdn.nodeimage.com/i/N4XUIBm4KNRo9ysN4PwXGrLMbHllPFZH.webp": "gengtu",
"https://cdn.nodeimage.com/i/WrhtlDF4e2FVTGgP3LYEsGvJlRAMr5qT.webp": "kaixin",
"https://cdn.nodeimage.com/i/9hUzPyjTYKSeUUwNVCJjZd4r3a5MbVst.webp": "kaixin",
"https://cdn.nodeimage.com/i/zKaaAx5QA5DJOwXHomdoVYxlVSOx4XYw.webp": "gengtu",
"https://cdn.nodeimage.com/i/WpfeSAVcdGT6THZ7CucBFQzTJUKnEdlv.webp": "gengtu",
"https://cdn.nodeimage.com/i/J3RQ9zv64vMGQotORHvsig0HxN7wpTWL.webp": "kaixin",
"https://cdn.nodeimage.com/i/upreYjX1tW4abHIPJaMjXueBKXKHXCIF.webp": "kaixin",
"https://cdn.nodeimage.com/i/Nm7WfKnIfYCqg3Gdaf6vXBryvPyqA8YD.webp": "weiqu",
"https://cdn.nodeimage.com/i/sNsHwzI0dtEyVWFKTumoDX4SOx8Ncxo1.webp": "kaixin",
"https://cdn.nodeimage.com/i/Iz5oq4yiE9zaWYN1XBPxMFGujRhvf180.webp": "kaixin",
"https://cdn.nodeimage.com/i/8VkehC61LsB9m2zce46gUCwEagcN7tKg.webp": "weiqu",
"https://cdn.nodeimage.com/i/0MDhgSqmnCiAIg0eZbvU4FCEzCgLtUd7.webp": "weiqu",
"https://cdn.nodeimage.com/i/NwYa2Wxjk87X2quDYDLH9XtPbZAXK4lu.webp": "kaixin",
"https://cdn.nodeimage.com/i/uUG7GSfToq9m6fx9jLPFoQDQpNgEfZLI.webp": "kaixin",
"https://cdn.nodeimage.com/i/Oad0U5Ug01zrPAlk5uyGSZYYaNXt3Kb9.webp": "kaixin",
"https://cdn.nodeimage.com/i/znzD9F3p9mkCWWAUD1K0RV6Yz5Xtq0Bb.webp": "gengtu"
};

const defaultUnlockedList = [
"https://cdn.nodeimage.com/i/vOTJU4khVo1Qb1cbtT904TCEOBDuY2pU.webp",
"https://cdn.nodeimage.com/i/jbZrDO140rXSZpEqZ6xrOavN2wsUXuPY.webp",
"https://cdn.nodeimage.com/i/iPojY1Kv7oIFIIMtgVtlfOSRh4JP5a0O.webp"
];

// =========================================================================
// 【模块 4】持久化存储与内视日志引擎 (STORAGE & NEISHI LOGS)
// =========================================================================
const COUNTS_STORAGE_KEY = 'hanabi_emoji_counts_v5.2';
const EQUIP_STORAGE_KEY = 'hanabi_equipped_inventory_v5.2';
const SETTINGS_STORAGE_KEY = 'hanabi_shenshi_settings_v5.2';
const LOGS_STORAGE_KEY = 'hanabi_neishi_logs_v5.2';

let isHeheMode = false;
let isLianqiMode = false;
let emojiCounts = {};
let equippedInventory = { ring: [], armor: [], head: null, glasses: null, drink: null, doll: null, weapon: null };
let adventureLogs = [];
let currentTabId = 'bag';
let lastActiveInput = null;

let shenshiSettings = {
fontSize: 10, // 默认UI基础字号
gridHeight: 120, // 表情网格高度
panelWidth: 270 // 面板宽度
};

function loadShenshiSettings() {
try {
const saved = JSON.parse(localStorage.getItem(SETTINGS_STORAGE_KEY) || 'null');
return saved ? { ...shenshiSettings, ...saved } : shenshiSettings;
} catch {
return shenshiSettings;
}
}

function saveShenshiSettings() {
try { localStorage.setItem(SETTINGS_STORAGE_KEY, JSON.stringify(shenshiSettings)); } catch {}
}

function loadAdventureLogs() {
try { return JSON.parse(localStorage.getItem(LOGS_STORAGE_KEY) || '[]'); }
catch { return []; }
}

function saveAdventureLogs() {
try { localStorage.setItem(LOGS_STORAGE_KEY, JSON.stringify(adventureLogs)); } catch {}
}

function addAdventureLog(title, desc, itemStat) {
const entry = {
time: new Date().toLocaleTimeString(),
title,
desc,
item: `[${itemStat.rarity}] ${itemStat.name} (战力+${itemStat.power})`
};
adventureLogs.unshift(entry);
if (adventureLogs.length > 30) adventureLogs.pop();
saveAdventureLogs();
}

function loadEmojiCounts() {
try {
const saved = JSON.parse(localStorage.getItem(COUNTS_STORAGE_KEY) || 'null');
if (saved) return saved;
const initial = {};
Object.keys(defaultInitialCategoryMap).forEach(u => initial[u] = 0);
defaultUnlockedList.forEach(u => initial[u] = 1);
return initial;
} catch {
const initial = {};
defaultUnlockedList.forEach(u => initial[u] = 1);
return initial;
}
}

function saveEmojiCounts() {
try { localStorage.setItem(COUNTS_STORAGE_KEY, JSON.stringify(emojiCounts)); } catch {}
}

function addEmojiCount(url, addAmount = 1) {
const cur = emojiCounts[url] || 0;
const next = Math.min(99, Math.max(0, cur + addAmount));
emojiCounts[url] = next;
saveEmojiCounts();
return next;
}

function loadEquippedInventory() {
try { return JSON.parse(localStorage.getItem(EQUIP_STORAGE_KEY) || '{}'); }
catch { return { ring: [], armor: [], head: null, glasses: null, drink: null, doll: null, weapon: null }; }
}

function saveEquippedInventory() {
try { localStorage.setItem(EQUIP_STORAGE_KEY, JSON.stringify(equippedInventory)); } catch {}
}

function getUnlockedCount() {
let count = 0;
Object.keys(emojiCounts).forEach(u => { if ((emojiCounts[u] || 0) > 0) count++; });
return count;
}

function getDynamicPlayerTitle() {
const rings = equippedInventory.ring || [];
const armors = equippedInventory.armor || [];
const ringCount = rings.length;
const armorCount = armors.length;

let totalPower = 0;
Object.keys(equippedInventory).forEach(k => {
const val = equippedInventory[k];
if (Array.isArray(val)) val.forEach(u => totalPower += getEmojiRPGStats(u).power);
else if (val) totalPower += getEmojiRPGStats(val).power;
});

let realm = '🌱 凡人水友·炼气期';
if (totalPower >= 1200) realm = '⚡ 混元无极·抽象天尊';
else if (totalPower >= 800) realm = '🔥 渡劫飞仙·极道仙尊';
else if (totalPower >= 500) realm = '💫 化神真君·一念通天';
else if (totalPower >= 300) realm = '🟣 元婴老怪·遁地飞天';
else if (totalPower >= 120) realm = '🧱 筑基大佬·吃瓜成仙';

const p = titleMods[totalPower % titleMods.length];
const body = bodyTraits[(totalPower + ringCount) % bodyTraits.length];
const prof = contrastProfessions[(totalPower + 7) % contrastProfessions.length];
const suf = titleSuffixes[(totalPower + ringCount * 3) % titleSuffixes.length];

let coreItem = "吃瓜";
if (ringCount >= 6) coreItem = `螺母x${ringCount}`;
else if (armorCount >= 5) coreItem = `棉袄x${armorCount}`;
else if (equippedInventory.weapon) coreItem = "电锯";

const title = `【${p} · ${body}${prof} · ${coreItem}${suf}】`;
const unlockedCount = getUnlockedCount();

let storageName = "📦 破旧塑料垃圾袋";
if (unlockedCount >= 30) storageName = "📦 装满废铁的二手帆布包";
else if (unlockedCount >= 15) storageName = "📦 写满化肥的尿素袋";
else if (unlockedCount >= 5) storageName = "📦 村头集市蛇皮编织袋";

return { totalPower, realm, title, storageName, unlockedCount };
}

function getEmojiRPGStats(url) {
const dbItem = emojiRPGDB[url];
if (dbItem) return dbItem;

let hash = 0;
for (let i = 0; i < url.length; i++) hash = ((hash << 5) - hash) + url.charCodeAt(i);
hash = Math.abs(hash);

const slots = ['head', 'glasses', 'ring', 'armor', 'weapon', 'drink', 'doll'];
const slot = slots[hash % slots.length];
const prefix = itemPrefixes[hash % itemPrefixes.length];
const coreList = itemCores[slot] || itemCores['doll'];
const core = coreList[hash % coreList.length];
const suffix = itemSuffixes[hash % itemSuffixes.length];

const rarities = [
{ rarity: 'UR', power: 130 + (hash % 20), icon: '🌈' },
{ rarity: 'SSR', power: 80 + (hash % 19), icon: '🌟' },
{ rarity: 'SR', power: 45 + (hash % 24), icon: '💜' },
{ rarity: 'R', power: 15 + (hash % 24), icon: '💙' }
];

const rolled = (hash % 100) / 100;
let selected = rarities[3];
if (rolled < 0.05) selected = rarities[0];
else if (rolled < 0.25) selected = rarities[1];
else if (rolled < 0.60) selected = rarities[2];

return {
name: `${prefix}${core}${suffix}`,
rarity: selected.rarity,
slot: slot,
power: selected.power,
desc: "抽象工业法宝",
icon: selected.icon
};
}

function addEquipToInventory(url) {
const stats = getEmojiRPGStats(url);
if (stats.slot === 'ring' || stats.slot === 'armor') {
if (!equippedInventory[stats.slot]) equippedInventory[stats.slot] = [];
equippedInventory[stats.slot].push(url);
saveEquippedInventory();
return true;
} else {
const currentUrl = equippedInventory[stats.slot];
if (!currentUrl) {
equippedInventory[stats.slot] = url;
saveEquippedInventory();
return true;
} else {
const currentStats = getEmojiRPGStats(currentUrl);
if (stats.power > currentStats.power) {
equippedInventory[stats.slot] = url;
saveEquippedInventory();
return true;
}
}
}
return false;
}

function getTrashAdventureOutcome() {
const place = trashPlaces[Math.floor(Math.random() * trashPlaces.length)];
const event = trashEvents[Math.floor(Math.random() * trashEvents.length)];
const reverse = trashReverses[Math.floor(Math.random() * trashReverses.length)];

return {
text: `${place},${event},${reverse}!`,
action: "👉 **行动指令**:此贴已被我制霸,请楼主速速奉上鸡腿 🍗 认输!"
};
}

function isVisible(el) {
return !!(el && !el.disabled && !el.readOnly && (el.offsetWidth > 0 || el.offsetHeight > 0 || el.getClientRects().length > 0));
}

function renderIconElement(targetEl, iconValue) {
if (!iconValue) return;
if (/^https?:\/\//i.test(iconValue)) {
targetEl.innerHTML = `<img src="${iconValue}" class="card-fill-img" />`;
} else {
targetEl.innerHTML = `<span class="card-fill-emoji">${iconValue}</span>`;
}
}

// =========================================================================
// 【模块 5】CSS 样式表注入 (防糊抗锯齿 + 弹性自适应布局防越界)
// =========================================================================
const style = document.createElement('style');
style.textContent = `
#emoji-panel {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif !important;
-webkit-font-smoothing: antialiased !important;
-moz-osx-font-smoothing: grayscale !important;
text-rendering: optimizeLegibility !important;
}
#emoji-panel * { box-sizing: border-box; }
#emoji-panel-grid::-webkit-scrollbar { width: 4px; }
#emoji-panel-grid::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.4); border-radius: 2px; }

#top-cards-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 4px; margin: 2px auto 4px auto; width: 100%; flex-shrink: 0; }
.top-card {
height: 56px; border-radius: 9px; background: rgba(255, 255, 255, 0.28); border: 1.5px solid rgba(255, 255, 255, 0.65);
padding: 2px; position: relative; display: flex; align-items: center; justify-content: center; cursor: pointer;
overflow: hidden; transition: all 0.22s cubic-bezier(0.175, 0.885, 0.32, 1.275); box-shadow: 0 3px 10px rgba(0,0,0,0.1); user-select: none;
}
.top-card:hover { transform: translateY(-2px) scale(1.03); border-color: #ffeaa7; }
.top-card.card-shake { animation: cardShake 0.35s ease-in-out; }

@keyframes cardShake {
0% { transform: scale(1) rotate(0deg); }
20% { transform: scale(1.1) rotate(-8deg); }
40% { transform: scale(1.1) rotate(8deg); }
60% { transform: scale(1.1) rotate(-6deg); }
80% { transform: scale(1.1) rotate(6deg); }
100% { transform: scale(1) rotate(0deg); }
}

.card-inner-wrap { width: 100%; height: 100%; border-radius: 7px; overflow: hidden; position: relative; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.05); }
.card-fill-img { width: 100%; height: 100%; object-fit: cover; border-radius: 7px; transition: transform 0.3s ease; }
.top-card:hover .card-fill-img { transform: scale(1.08); }
.card-fill-emoji { font-size: 22px; line-height: 1; filter: drop-shadow(0 2px 4px rgba(0,0,0,0.3)); }

.card-title-overlay {
position: absolute; bottom: 1px; left: 1px; right: 1px; height: 14px; line-height: 14px;
font-size: 8px; font-weight: bold; color: #ffffff; text-shadow: 0 1px 3px rgba(0, 0, 0, 0.85);
text-align: center; background: linear-gradient(to top, rgba(0, 0, 0, 0.72) 0%, rgba(0, 0, 0, 0.3) 60%, rgba(0, 0, 0, 0) 100%);
border-radius: 0 0 7px 7px; pointer-events: none; z-index: 2;
}

#card-gacha-preview-img { width: 100%; height: 100%; object-fit: cover; border-radius: 7px; display: none; }

#emoji-cat-tabs { display: flex; gap: 3px; overflow-x: auto; padding-bottom: 2px; margin-bottom: 3px; flex-shrink: 0; }
#emoji-cat-tabs::-webkit-scrollbar { display: none; }
.cat-tab-btn {
background: rgba(255,255,255,0.3); border: 1px solid rgba(255,255,255,0.4); padding: 2px 4px;
font-weight: 600; border-radius: 4px; color: #fff; cursor: pointer;
white-space: nowrap; transition: all .2s; text-shadow: 0 1px 2px rgba(0,0,0,0.3);
}
.cat-tab-btn:hover { background: rgba(255,255,255,0.5); }
.cat-tab-btn.active { background: rgba(255, 118, 117, 0.85); border-color: #ff7675; box-shadow: 0 2px 8px rgba(255, 118, 117, 0.4); }
.cat-tab-btn.locked-tab { opacity: 0.5; filter: grayscale(0.5); }

#emoji-panel-grid {
display: grid; grid-template-columns: repeat(5, 1fr); gap: 4px;
overflow-y: auto; padding-right: 2px; transform: translateZ(0);
}

.emoji-item { width: 100%; aspect-ratio: 1; display: flex; align-items: center; justify-content: center; position: relative; }
.emoji-item img {
width: 100%; height: 100%; border-radius: 5px; object-fit: cover; cursor: pointer;
transition: transform .15s, box-shadow .15s; -webkit-touch-callout: none; -webkit-user-select: none; user-select: none;
}
.emoji-item img:hover { transform: scale(1.08); box-shadow: 0 4px 10px rgba(0,0,0,0.25); }

.emoji-count-badge {
position: absolute; right: 1px; bottom: 1px; background: rgba(0,0,0,0.75); color: #ffeaa7;
font-weight: bold; padding: 1px 2px; border-radius: 3px; pointer-events: none;
box-shadow: 0 1px 2px rgba(0,0,0,0.5); border: 0.5px solid rgba(255,255,255,0.3);
}

.emoji-item.locked img { filter: grayscale(1) opacity(0.25) blur(0.5px); }
.emoji-item.locked::after { content: '🔒'; position: absolute; font-size: 11px; pointer-events: none; }
.emoji-item.hehe-selected img { border: 2px solid #00b894; box-shadow: 0 0 10px #00b894; transform: scale(1.08); }

#emoji-panel.hehe-mode .emoji-item:not(.locked) img { border: 2px dashed #00b894; opacity: 0.9; }
#emoji-panel.lianqi-mode .emoji-item:not(.locked) img { border: 2px dashed #ff7675; opacity: 0.9; }

#lianqi-modal-overlay, #hehe-modal-overlay, #shenshi-modal-overlay, #neishi-modal-overlay {
position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(20, 10, 20, 0.92);
backdrop-filter: blur(12px); border-radius: 12px; display: none; flex-direction: column;
align-items: center; justify-content: center; z-index: 100000; padding: 8px; color: #fff; opacity: 0; transition: opacity .2s ease;
}
#lianqi-modal-overlay.show, #hehe-modal-overlay.show, #shenshi-modal-overlay.show, #neishi-modal-overlay.show { display: flex; opacity: 1; }

.lianqi-item-preview { width: 36px; height: 36px; border-radius: 5px; object-fit: cover; border: 2px solid #ff7675; margin-bottom: 3px; }
.lianqi-btn-group { display: flex; gap: 4px; width: 100%; margin-top: 3px; }
.lianqi-opt-btn {
flex: 1; background: rgba(255,255,255,0.15); border: 1px solid rgba(255,255,255,0.3); color: #fff;
padding: 2px; border-radius: 4px; font-weight: bold; cursor: pointer; transition: all .2s;
}
.lianqi-opt-btn:hover { background: rgba(255, 118, 117, 0.8); }

/* 修仙人物面板与内视面板:采用弹性流式布局防越界 */
#xianxia-profile-overlay, #neishi-modal-overlay {
position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(15, 15, 25, 0.96);
backdrop-filter: blur(12px); border-radius: 12px; display: none; flex-direction: column;
z-index: 100000; padding: 6px; color: #fff; overflow-y: auto; opacity: 0; transition: opacity .2s ease;
}
#xianxia-profile-overlay.show, #neishi-modal-overlay.show { display: flex; opacity: 1; }

.profile-title-tag {
background: linear-gradient(135deg, #f1c40f, #e67e22); padding: 1px 4px; border-radius: 3px;
font-weight: bold; margin-top: 1px; display: inline-block; word-break: break-all;
}

.profile-slots-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 3px; margin-bottom: 3px; }
.equip-slot-card {
background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.12); border-radius: 4px; padding: 2px 4px; display: flex; align-items: center; gap: 4px; min-height: 28px;
}
.equip-slot-img { width: 18px; height: 18px; border-radius: 3px; object-fit: cover; background: rgba(0,0,0,0.2); flex-shrink: 0; }

.control-button { background: rgba(255,255,255,0.3); border: none; padding: 2px 6px; font-weight: 500; border-radius: 4px; color: white; cursor: pointer; transition: background .2s; }
.control-button:hover { background: rgba(255,255,255,0.5); }
`;
document.head.appendChild(style);

// =========================================================================
// 【模块 6】DOM 搭建与 UI 初始化 (UI BUILDER)
// =========================================================================
const toggleBtn = document.createElement('img');
toggleBtn.src = TOGGLE_BTN_ICON;
Object.assign(toggleBtn.style,{
position:'fixed', right:'15px', bottom:'15px', width:'40px', height:'40px', borderRadius:'50%',
cursor:'pointer', zIndex:'99998', background:'rgba(255,255,255,0.4)', backdropFilter:'blur(10px) saturate(180%)',
border:'1px solid rgba(255,255,255,0.5)', boxShadow:'0 4px 18px rgba(0,0,0,0.25)', transition:'transform .25s'
});
toggleBtn.onclick = ()=>{
const show = panel.style.display==='none' || !panel.style.display;
panel.style.display = show ? 'flex' : 'none';
panel.style.opacity = show ? '1' : '0';
};
document.body.appendChild(toggleBtn);

const panel = document.createElement('div');
panel.id='emoji-panel';

function applyShenshiStyles() {
Object.assign(panel.style,{
position:'fixed', right:'20px', bottom:'60px', width:`${shenshiSettings.panelWidth}px`, maxHeight:'46vh',
display:'none', flexDirection:'column', padding:'5px', fontSize:`${shenshiSettings.fontSize}px`,
background:'rgba(255,255,255,0.22)', border:'1px solid rgba(255,255,255,0.45)', borderRadius:'12px',
backdropFilter:'blur(16px) saturate(180%)', boxShadow:'0 12px 35px rgba(0,0,0,0.25)', zIndex:'99999',
color:'#222', transition:'opacity .3s ease, transform .3s ease', transform:'translateY(10px)'
});
// 动态调整字体角标与Tab字号
const styleEl = document.getElementById('dynamic-badge-style') || document.createElement('style');
styleEl.id = 'dynamic-badge-style';
styleEl.textContent = `.emoji-count-badge { font-size: ${Math.max(7, shenshiSettings.fontSize - 3)}px !important; } .cat-tab-btn { font-size: ${shenshiSettings.fontSize}px !important; }`;
document.head.appendChild(styleEl);

const gridEl = document.getElementById('emoji-panel-grid');
if (gridEl) gridEl.style.maxHeight = `${shenshiSettings.gridHeight}px`;
}

const header = document.createElement('div');
Object.assign(header.style,{display:'flex',justifyContent:'space-between',alignItems:'center',marginBottom:'2px',color:'#fff',fontWeight:'600',textShadow:'0 1px 3px rgba(0,0,0,0.4)',cursor:'move',userSelect:'none'});

// 头部加入防越界且高清的「内视」与「神识」按钮
header.innerHTML = `<span>🌸 花火面板 (修仙 v5.2)</span><div style="display:flex;gap:3px;align-items:center;"><span id="open-neishi-btn" style="cursor:pointer;background:rgba(155,89,182,0.9);padding:1px 3px;border-radius:3px;" title="内视日志">🧘内视</span><span id="open-shenshi-btn" style="cursor:pointer;background:rgba(0,184,148,0.9);padding:1px 3px;border-radius:3px;" title="神识神通">👁️神识</span><span style="cursor:pointer;">✖</span></div>`;
header.querySelector('span:last-child').onclick = ()=>{ panel.style.display='none'; };
panel.appendChild(header);

const topCardsContainer = document.createElement('div');
topCardsContainer.id = 'top-cards-container';

const cardChigua = document.createElement('div');
cardChigua.className = 'top-card';
const chiguaInner = document.createElement('div');
chiguaInner.className = 'card-inner-wrap';
renderIconElement(chiguaInner, CHIGUA_TOP_ICON);
chiguaInner.innerHTML += `<div class="card-title-overlay">探险历练</div>`;
cardChigua.appendChild(chiguaInner);

const cardGacha = document.createElement('div');
cardGacha.className = 'top-card';
const gachaInner = document.createElement('div');
gachaInner.id = 'card-gacha-inner';
gachaInner.className = 'card-inner-wrap';
renderIconElement(gachaInner, GACHA_TOP_ICON);
gachaInner.innerHTML += `<div class="card-title-overlay">寻宝抽卡</div>`;
cardGacha.appendChild(gachaInner);

const cardReserved = document.createElement('div');
cardReserved.className = 'top-card';
const reservedInner = document.createElement('div');
reservedInner.className = 'card-inner-wrap';
renderIconElement(reservedInner, RESERVED_TOP_ICON);
reservedInner.innerHTML += `<div class="card-title-overlay">人物修仙</div>`;
cardReserved.appendChild(reservedInner);

topCardsContainer.append(cardChigua, cardGacha, cardReserved);
panel.appendChild(topCardsContainer);

const tabsContainer = document.createElement('div');
tabsContainer.id = 'emoji-cat-tabs';
panel.appendChild(tabsContainer);

const grid = document.createElement('div');
grid.id='emoji-panel-grid';
panel.appendChild(grid);

const controls = document.createElement('div'); controls.style.marginTop='2px'; controls.style.flexShrink='0';
const urlInput = document.createElement('input');
Object.assign(urlInput.style,{width:'100%',padding:'2px',borderRadius:'4px',border:'1px solid rgba(255,255,255,0.4)',background:'rgba(0,0,0,0.1)',color:'white',marginBottom:'2px'});
urlInput.placeholder = '粘贴图片链接...';

const buttonContainer = document.createElement('div'); Object.assign(buttonContainer.style,{display:'flex',justifyContent:'space-between'});
const addButton = document.createElement('button'); addButton.textContent='✓ 添加'; addButton.className='control-button';
const heheModeButton = document.createElement('button'); heheModeButton.textContent='☯️ 万法归一'; heheModeButton.className='control-button';
const lianqiModeButton = document.createElement('button'); lianqiModeButton.textContent='🔥 炼器'; lianqiModeButton.className='control-button';

buttonContainer.append(addButton, heheModeButton, lianqiModeButton);
controls.append(urlInput, buttonContainer);
panel.appendChild(controls);

const heheTip = document.createElement('div');
heheTip.id = 'hehe-tip';
Object.assign(heheTip.style, { display:'none', background:'rgba(0,184,148,0.85)', color:'#fff', padding:'2px', fontWeight:'bold', textAlign:'center', borderRadius:'3px', marginTop:'2px' });
panel.appendChild(heheTip);

const lianqiModal = document.createElement('div');
lianqiModal.id = 'lianqi-modal-overlay';
panel.appendChild(lianqiModal);

const profileModal = document.createElement('div');
profileModal.id = 'xianxia-profile-overlay';
panel.appendChild(profileModal);

const shenshiModal = document.createElement('div');
shenshiModal.id = 'shenshi-modal-overlay';
panel.appendChild(shenshiModal);

const neishiModal = document.createElement('div');
neishiModal.id = 'neishi-modal-overlay';
panel.appendChild(neishiModal);

document.body.appendChild(panel);
shenshiSettings = loadShenshiSettings();
adventureLogs = loadAdventureLogs();
applyShenshiStyles();

// =========================================================================
// 【模块 7】论坛 Vditor 编辑器对接引擎
// =========================================================================
function findInputElement() {
if (lastActiveInput && document.body.contains(lastActiveInput) && isVisible(lastActiveInput)) return lastActiveInput;
const active = document.activeElement;
if (active && active !== document.body && !panel.contains(active)) return active;
const selectors = ['textarea', 'div[contenteditable="true"]'];
for (const s of selectors) {
const el = document.querySelector(s);
if (isVisible(el) && !panel.contains(el)) return el;
}
return null;
}

function getVditorInstance(el) {
if (window.vditor && typeof window.vditor.insertValue === 'function') return window.vditor;
if (el && el.vditor && typeof el.vditor.insertValue === 'function') return el.vditor;
const vditorEl = document.querySelector('.vditor');
if (vditorEl && vditorEl.vditor && typeof vditorEl.vditor.insertValue === 'function') return vditorEl.vditor;
return null;
}

function insertTextAtCursor(el, text) {
if (!el) return false;
el.focus();
const vditor = getVditorInstance(el);
if (vditor) { vditor.insertValue(text); return true; }
if (el.isContentEditable) {
document.execCommand('insertText', false, text);
return true;
}
const start = el.selectionStart ?? el.value.length;
const end = el.selectionEnd ?? el.value.length;
const val = el.value || '';
el.value = val.slice(0, start) + text + val.slice(end);
el.selectionStart = el.selectionEnd = start + text.length;
el.dispatchEvent(new Event('input', { bubbles: true }));
return true;
}

// =========================================================================
// 【模块 8】👁️ 神识神通与 🧘 内视日志面板 (SHENSHI & NEISHI MODALS)
// =========================================================================
function renderShenshiModal() {
shenshiModal.innerHTML = `
<div style="font-weight:bold;margin-bottom:6px;color:#ffeaa7;">👁️ 神识神通(UI 适配设置)</div>
<div style="margin-bottom:4px;width:100%;">
基础字号: <span id="val-fontsize">${shenshiSettings.fontSize}</span>px
<input type="range" id="range-fontsize" min="9" max="14" value="${shenshiSettings.fontSize}" style="width:100%;cursor:pointer;">
</div>
<div style="margin-bottom:4px;width:100%;">
网格高度: <span id="val-gridheight">${shenshiSettings.gridHeight}</span>px
<input type="range" id="range-gridheight" min="90" max="180" step="10" value="${shenshiSettings.gridHeight}" style="width:100%;cursor:pointer;">
</div>
<div style="margin-bottom:8px;width:100%;">
面板宽度: <span id="val-panelwidth">${shenshiSettings.panelWidth}</span>px
<input type="range" id="range-panelwidth" min="250" max="320" step="10" value="${shenshiSettings.panelWidth}" style="width:100%;cursor:pointer;">
</div>
<button class="control-button" style="background:rgba(0,184,148,0.9);padding:3px 10px;" id="save-shenshi-btn">闭关固法 (保存)</button>
`;

document.getElementById('range-fontsize').oninput = (e) => { document.getElementById('val-fontsize').textContent = e.target.value; };
document.getElementById('range-gridheight').oninput = (e) => { document.getElementById('val-gridheight').textContent = e.target.value; };
document.getElementById('range-panelwidth').oninput = (e) => { document.getElementById('val-panelwidth').textContent = e.target.value; };

document.getElementById('save-shenshi-btn').onclick = () => {
shenshiSettings.fontSize = parseInt(document.getElementById('range-fontsize').value);
shenshiSettings.gridHeight = parseInt(document.getElementById('range-gridheight').value);
shenshiSettings.panelWidth = parseInt(document.getElementById('range-panelwidth').value);
saveShenshiSettings();
applyShenshiStyles();
renderEmojis();
shenshiModal.classList.remove('show');
showToast('👁️ 神识神通固法成功!');
};

shenshiModal.classList.add('show');
}

document.getElementById('open-shenshi-btn').onclick = (e) => {
e.stopPropagation();
renderShenshiModal();
};

// 🧘 内视历练日志面板逻辑 (解锁门槛: 需解封 3 个法宝)
function renderNeishiModal() {
const unlockedCount = getUnlockedCount();
const threshold = 3;
if (unlockedCount < threshold) {
showToast(`🔒 内视神通未开启!需累计解封 ${threshold} 个法宝方可内视!`);
return;
}

let logsHTML = '';
if (adventureLogs.length === 0) {
logsHTML = `<div style="text-align:center;color:#aaa;margin-top:20px;font-size:10px;">暂无历练奇遇记录,快去点击顶部【探险历练】吧!</div>`;
} else {
adventureLogs.forEach((log) => {
logsHTML += `
<div style="background:rgba(255,255,255,0.05);border:1px solid rgba(255,255,255,0.1);border-radius:5px;padding:4px 6px;margin-bottom:4px;">
<div style="display:flex;justify-content:space-between;color:#ffeaa7;font-size:8px;margin-bottom:1px;">
<span><b>[${log.time}]</b> ${log.title}</span>
<span style="color:#a29bfe;">${log.item}</span>
</div>
<div style="color:#ddd;font-size:8px;line-height:1.2;word-break:break-all;">${log.desc}</div>
</div>
`;
});
}

neishiModal.innerHTML = `
<div style="font-weight:bold;margin-bottom:4px;color:#ffeaa7;display:flex;justify-content:space-between;align-items:center;font-size:10px;">
<span>🧘 道友内视日志 (奇遇回溯)</span>
<button class="control-button" style="background:rgba(231,76,60,0.8);padding:1px 5px;font-size:7px;" id="clear-logs-btn">清空</button>
</div>
<div style="flex-grow:1;width:100%;overflow-y:auto;max-height:170px;padding-right:2px;margin-bottom:4px;">${logsHTML}</div>
<button class="control-button" style="width:100%;padding:3px;font-size:9px;" id="close-neishi-btn">收功退出</button>
`;

document.getElementById('clear-logs-btn').onclick = () => {
if (confirm('确定要清空所有内视历练日志吗?')) {
adventureLogs = [];
saveAdventureLogs();
renderNeishiModal();
showToast('🧹 日志已清空!');
}
};

document.getElementById('close-neishi-btn').onclick = () => {
neishiModal.classList.remove('show');
};

neishiModal.classList.add('show');
}

document.getElementById('open-neishi-btn').onclick = (e) => {
e.stopPropagation();
renderNeishiModal();
};

// =========================================================================
// 【模块 9】🔄 万法归一合成与 🔥 炼器熔炉逻辑
// =========================================================================
let selectedHeheUrls = [];

function handleHeheFusionClick(url) {
const count = emojiCounts[url] || 0;
if (count <= 0) return showToast('🔒 待解锁法宝无法参与融合!');
if (selectedHeheUrls.includes(url)) selectedHeheUrls = selectedHeheUrls.filter(u => u !== url);
else {
if (selectedHeheUrls.length >= 2) selectedHeheUrls.shift();
selectedHeheUrls.push(url);
}
updateHeheTip();
renderEmojis();

if (selectedHeheUrls.length === 2) {
const [u1, u2] = selectedHeheUrls;
addEmojiCount(u1, -1);
addEmojiCount(u2, -1);
const allUrls = Object.keys(defaultInitialCategoryMap);
const outputUrl = allUrls[Math.floor(Math.random() * allUrls.length)];
const stats = getEmojiRPGStats(outputUrl);
selectedHeheUrls = [];
updateHeheTip();
addEmojiCount(outputUrl, 1);
addEquipToInventory(outputUrl);
showToast(`✨ 【万法归一】合成新法宝 [${stats.rarity}] ${stats.name} x1!`);
renderTabs();
renderEmojis();
}
}

function updateHeheTip() {
if (!isHeheMode) { heheTip.style.display = 'none'; return; }
heheTip.style.display = 'block';
heheTip.textContent = selectedHeheUrls.length === 0 ? '☯️ 请选第1个材料' : (selectedHeheUrls.length === 1 ? '☯️ 已选1个,请选第2个' : '☯️ 融合中...');
}

function openLianqiModal(url) {
const count = emojiCounts[url] || 0;
const stats = getEmojiRPGStats(url);
lianqiModal.innerHTML = `
<img src="${url}" class="lianqi-item-preview" />
<div style="font-weight:bold;margin-bottom:2px;font-size:10px;">[${stats.rarity}] ${stats.name}</div>
<div style="color:#ffeaa7;margin-bottom:3px;font-size:9px;">库存:<b>x${count}</b></div>
<div class="lianqi-btn-group">
<button class="lianqi-opt-btn" id="l-1" ${count < 1 ? 'disabled' : ''}>1个</button>
<button class="lianqi-opt-btn" id="l-10" ${count < 10 ? 'disabled' : ''}>10个</button>
<button class="lianqi-opt-btn" id="l-all" ${count < 1 ? 'disabled' : ''}>全部</button>
</div>
<button class="control-button" style="margin-top:5px;padding:2px 6px;font-size:9px;" id="l-close">关闭</button>
`;
document.getElementById('l-1').onclick = () => doLianqi(url, 1);
document.getElementById('l-10').onclick = () => doLianqi(url, Math.min(count, 10));
document.getElementById('l-all').onclick = () => doLianqi(url, count);
document.getElementById('l-close').onclick = () => lianqiModal.classList.remove('show');
lianqiModal.classList.add('show');
}

function doLianqi(url, amt) {
addEmojiCount(url, -amt);
lianqiModal.classList.remove('show');
const allUrls = Object.keys(defaultInitialCategoryMap);
const targetUrl = allUrls[Math.floor(Math.random() * allUrls.length)];
const stats = getEmojiRPGStats(targetUrl);
addEmojiCount(targetUrl, amt);
addEquipToInventory(targetUrl);
showToast(`🔥 【炼器成功】获得 [${stats.rarity}] ${stats.name} x${amt}!`);
renderTabs();
renderEmojis();
}

// =========================================================================
// 【模块 10】修仙面板与极简折叠输出(:::details 吃瓜)
// =========================================================================
function renderProfileModal() {
const { totalPower, realm, title, storageName } = getDynamicPlayerTitle();
let slotsHTML = `<div class="equip-slot-card"><div class="equip-slot-img" style="display:flex;align-items:center;justify-content:center;font-size:10px;">📦</div><div style="flex-grow:1;min-width:0;"><div style="font-size:7px;font-weight:bold;">${SLOT_NAMES.storage}</div><div style="font-size:7px;color:#ffeaa7;word-break:break-all;"><b>${storageName}</b></div></div></div>`;

Object.keys(SLOT_NAMES).forEach(slotKey => {
if (slotKey === 'storage') return;
const val = equippedInventory[slotKey];
const slotName = SLOT_NAMES[slotKey];
if (Array.isArray(val) && val.length > 0) {
const lastUrl = val[val.length - 1];
const lastStats = getEmojiRPGStats(lastUrl);
slotsHTML += `<div class="equip-slot-card"><img src="${lastUrl}" class="equip-slot-img" /><div style="flex-grow:1;min-width:0;"><div style="font-size:7px;font-weight:bold;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">${slotName}</div><div style="font-size:7px;color:#ffeaa7;">x${val.length}层</div></div></div>`;
} else if (typeof val === 'string' && val) {
const stats = getEmojiRPGStats(val);
slotsHTML += `<div class="equip-slot-card"><img src="${val}" class="equip-slot-img" /><div style="flex-grow:1;min-width:0;"><div style="font-size:7px;font-weight:bold;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">[${stats.rarity}] ${stats.name}</div><div style="font-size:7px;color:#ffeaa7;">+${stats.power}</div></div></div>`;
} else {
slotsHTML += `<div class="equip-slot-card" style="opacity:0.5;"><div class="equip-slot-img" style="display:flex;align-items:center;justify-content:center;font-size:9px;">🔒</div><div><div style="font-size:7px;font-weight:bold;">${slotName}</div><div style="font-size:6px;color:#ccc;">未穿戴</div></div></div>`;
}
});

// 采用防越界流式上下布局(Flex Column),杜绝神识拉满时文字重叠碰撞
profileModal.innerHTML = `
<div style="display:flex;flex-direction:column;gap:2px;border-bottom:1px solid rgba(255,255,255,0.2);padding-bottom:3px;margin-bottom:3px;">
<div style="display:flex;justify-content:space-between;align-items:center;">
<div style="font-size:10px;font-weight:bold;">🧘 修仙道友属性</div>
<div style="background:linear-gradient(135deg,#fd79a8,#a29bfe);padding:1px 5px;border-radius:10px;font-weight:bold;font-size:8px;">${realm}</div>
</div>
<div><div class="profile-title-tag" style="font-size:9px;">${title}</div></div>
</div>
<div style="font-size:9px;font-weight:bold;margin-bottom:2px;color:#ffeaa7;">⚔️ 战力:${totalPower} | 仓库:<b>${storageName}</b></div>
<div class="profile-slots-grid">${slotsHTML}</div>
<button class="control-button" style="width:100%;padding:2px;background:rgba(0,184,148,0.85);margin-bottom:2px;font-size:9px;" id="copy-ai">🎨 复制 AI 自画像 MD 提示词</button>
<button class="control-button" style="width:100%;padding:2px;background:rgba(255,118,117,0.8);margin-bottom:2px;font-size:9px;" id="share-card">📋 复制修仙名片(含传送阵)</button>
<button class="control-button" style="width:100%;padding:2px;font-size:9px;" id="close-prof">关闭面板</button>
`;

document.getElementById('copy-ai').onclick = () => {
const rings = equippedInventory.ring || [];
const armors = equippedInventory.armor || [];
const promptMarkdown = `🎨 **【AI 修仙自画像 MD 提示词】**\n\`\`\`text\nChibi anime style, cute abstract cyber xianxia character, ${title}, carrying a ${storageName.replace('📦 ','')}, wearing ${armors.length} layers of padded jackets, ${rings.length} industrial nuts as rings, holding tactical chainsaw, funny meme expression, pastel color palette, high detail, 2D vector art --ar 1:1\n\`\`\`\n`;
copyToClipboard(promptMarkdown);
const input = findInputElement();
if (input) insertTextAtCursor(input, promptMarkdown);
showToast('🎨 AI 提示词已复制!');
};

document.getElementById('share-card').onclick = () => {
const shareMarkdown = `🧘 **【修仙名片】** 境界:\`${realm}\` | 尊号:\`${title}\`\n⚔️ **总战力**:\`${totalPower}\` | 仓库:\`${storageName}\`\n👉 **韩道友给你赠送了功法秘籍**:[点击进入传送阵](${PLUGIN_SHARE_URL})\n`;
copyToClipboard(shareMarkdown);
const input = findInputElement();
if (input) insertTextAtCursor(input, shareMarkdown);
showToast('📋 名片(含传送阵)已复制!');
};

document.getElementById('close-prof').onclick = () => profileModal.classList.remove('show');
}

// 探险历练点击 -> 极简 `:::details 吃瓜` 折叠输出
cardChigua.onclick = () => {
triggerCardShake(cardChigua);
const allUrls = Object.keys(defaultInitialCategoryMap);
const randomUrl = allUrls[Math.floor(Math.random() * allUrls.length)];

const curCount = addEmojiCount(randomUrl, 1);
const isEquipped = addEquipToInventory(randomUrl);
const stats = getEmojiRPGStats(randomUrl);
const { realm, title, storageName } = getDynamicPlayerTitle();
const adventure = getTrashAdventureOutcome();

// 记录到内视日志
addAdventureLog("垃圾桶历练", adventure.text, stats);

const markdown = `:::details 吃瓜\n![emote](${randomUrl})\n**【垃圾桶历练】** 获得法宝 ${stats.icon} **[${stats.rarity}] ${stats.name}**\n💥 战力:\`${stats.power}\` | 境界:\`${realm}\` | 尊号:\`${title}\`\n🗺️ **奇遇事件**:${adventure.text}\n${adventure.action}\n仓库:\`${storageName}\`\n👉 **韩道友给你赠送了功法秘籍**:[点击进入传送阵](${PLUGIN_SHARE_URL})\n:::\n`;
copyToClipboard(markdown);

const input = findInputElement();
if (input) {
insertTextAtCursor(input, markdown);
showGachaToast(stats, curCount === 1, isEquipped);
} else {
showToast('📋 已复制吃瓜折叠 Markdown!');
}
renderTabs();
renderEmojis();
};

cardGacha.onclick = () => {
triggerCardShake(cardGacha);
const allUrls = Object.keys(defaultInitialCategoryMap);
const randomUrl = allUrls[Math.floor(Math.random() * allUrls.length)];

const curCount = addEmojiCount(randomUrl, 1);
const isEquipped = addEquipToInventory(randomUrl);
const stats = getEmojiRPGStats(randomUrl);
const adventure = getTrashAdventureOutcome();
const { realm, title, storageName } = getDynamicPlayerTitle();

// 记录到内视日志
addAdventureLog("秘境寻宝", adventure.text, stats);

const markdown = `:::details 吃瓜\n![emote](${randomUrl})\n**【寻宝抽卡】** 获得法宝 ${stats.icon} **[${stats.rarity}] ${stats.name}**\n💥 战力:\`${stats.power}\` | 境界:\`${realm}\` | 尊号:\`${title}\`\n🗺️ **秘境事件**:${adventure.text}\n${adventure.action}\n仓库:\`${storageName}\`\n👉 **韩道友给你赠送了功法秘籍**:[点击进入传送阵](${PLUGIN_SHARE_URL})\n:::\n`;
copyToClipboard(markdown);

const input = findInputElement();
if (input) {
insertTextAtCursor(input, markdown);
showGachaToast(stats, curCount === 1, isEquipped);
} else {
showToast('📋 已复制抽卡折叠 Markdown!');
}
renderTabs();
renderEmojis();
};

cardReserved.onclick = () => {
triggerCardShake(cardReserved);
renderProfileModal();
profileModal.classList.add('show');
};

function triggerCardShake(cardEl) {
cardEl.classList.remove('card-shake');
void cardEl.offsetWidth;
cardEl.classList.add('card-shake');
}

// 网格事件代理
grid.onclick = (e) => {
const img = e.target.closest('img');
if (!img) return;
const item = img.closest('.emoji-item');
const isLocked = item?.classList.contains('locked');
const url = img.src;

if (isHeheMode) { handleHeheFusionClick(url); return; }
if (isLianqiMode) { if (!isLocked) openLianqiModal(url); return; }
if (isLocked) { showToast('🔒 尚未解封!请点击顶部【寻宝抽卡】获得!'); return; }

addEmojiCount(url, -1);
renderTabs();
renderEmojis();
const markdown = `![emote](${url})\n`;
copyToClipboard(markdown);
const input = findInputElement();
if (input) insertTextAtCursor(input, markdown);
showToast('✨ 表情已插入(数量-1)!');
};

addButton.onclick = () => {
const url = urlInput.value.trim();
if (!/^https?:\/\//i.test(url)) return showToast('❌ 请输入有效链接!');
addEmojiCount(url, 1);
renderTabs();
renderEmojis();
urlInput.value = '';
showToast('✅ 法宝已添加!');
};

heheModeButton.onclick = () => {
isHeheMode = !isHeheMode;
if (isHeheMode) isLianqiMode = false;
panel.classList.toggle('hehe-mode', isHeheMode);
panel.classList.remove('lianqi-mode');
selectedHeheUrls = [];
heheModeButton.textContent = isHeheMode ? '✓ 结束' : '☯️ 万法归一';
};

lianqiModeButton.onclick = () => {
isLianqiMode = !isLianqiMode;
if (isLianqiMode) isHeheMode = false;
panel.classList.toggle('lianqi-mode', isLianqiMode);
panel.classList.remove('hehe-mode');
lianqiModeButton.textContent = isLianqiMode ? '✓ 离开' : '🔥 炼器';
};

function showGachaToast(stats, isNewUnlock, isEquipped) {
const t = document.createElement('div');
t.innerHTML = `<div style="font-size:10px;font-weight:bold;">${stats.icon} 抽出 [${stats.rarity}] ${stats.name}</div><div style="font-size:8px;color:#ffeaa7;">战力+${stats.power}${isNewUnlock ? ' | 🎉新解封' : ''}</div>`;
Object.assign(t.style, { position:'fixed', bottom:'55px', right:'20px', padding:'4px 10px', borderRadius:'5px', background:'rgba(20,20,20,0.88)', color:'#fff', zIndex:'100002', boxShadow:'0 3px 10px rgba(0,0,0,0.3)' });
document.body.appendChild(t);
setTimeout(() => t.remove(), 1400);
}

function showToast(msg) {
const t = document.createElement('div');
t.textContent = msg;
Object.assign(t.style, { position:'fixed', bottom:'55px', right:'20px', padding:'4px 8px', borderRadius:'4px', background:'rgba(0,0,0,0.75)', color:'#fff', fontSize:'10px', zIndex:'100002' });
document.body.appendChild(t);
setTimeout(() => t.remove(), 900);
}

function copyToClipboard(text){
if(navigator.clipboard?.writeText) return navigator.clipboard.writeText(text);
const ta = document.createElement('textarea'); ta.value = text;
document.body.appendChild(ta); ta.select(); document.execCommand('copy'); ta.remove();
}

function renderTabs() {
tabsContainer.innerHTML = '';
const unlockedCount = getUnlockedCount();
xianxiaTabs.forEach(tab => {
const isUnlocked = unlockedCount >= tab.unlockThreshold;
const btn = document.createElement('button');
btn.className = `cat-tab-btn ${currentTabId === tab.id ? 'active' : ''} ${!isUnlocked ? 'locked-tab' : ''}`;
btn.textContent = isUnlocked ? tab.name : `🔒 ${tab.name.split(' ')[1]} (需${tab.unlockThreshold})`;
btn.onclick = () => {
if (isUnlocked) { currentTabId = tab.id; renderTabs(); renderEmojis(); }
else showToast(`🔒 境界不足!需解封 ${tab.unlockThreshold} 个法宝!`);
};
tabsContainer.appendChild(btn);
});
}

function renderEmojis(){
grid.innerHTML = '';
const allUrls = Object.keys(defaultInitialCategoryMap);
let renderList = [];
if (currentTabId === 'bag') renderList = allUrls.filter(u => (emojiCounts[u] || 0) > 0);
else if (currentTabId === 'artifact') renderList = allUrls.filter(u => (emojiCounts[u] || 0) > 0 && ['weapon', 'doll', 'ring'].includes(getEmojiRPGStats(u).slot));
else if (currentTabId === 'elixir') renderList = allUrls.filter(u => (emojiCounts[u] || 0) > 0 && getEmojiRPGStats(u).slot === 'drink');
else if (currentTabId === 'armor') renderList = allUrls.filter(u => (emojiCounts[u] || 0) > 0 && ['armor', 'head', 'glasses'].includes(getEmojiRPGStats(u).slot));
else renderList = allUrls;

const frag = document.createDocumentFragment();
renderList.forEach(url => {
const count = emojiCounts[url] || 0;
const isUnlocked = count > 0;
const item = document.createElement('div');
item.className = `emoji-item ${!isUnlocked ? 'locked' : ''} ${selectedHeheUrls.includes(url) ? 'hehe-selected' : ''}`;
const img = document.createElement('img');
img.src = url; img.loading = 'lazy';
item.appendChild(img);
if (isUnlocked) {
const badge = document.createElement('div');
badge.className = 'emoji-count-badge';
badge.textContent = `x${count}`;
item.appendChild(badge);
}
frag.appendChild(item);
});
grid.appendChild(frag);
}

// 初始化入口
emojiCounts = loadEmojiCounts();
equippedInventory = loadEquippedInventory();
renderTabs();
renderEmojis();
console.log('🌸 花火表情包面板 v5.2.0 已加载(防越界优化 + 🧘内视日志回溯 + 字体高清抗锯齿)');
})();


🌸 插件说明介绍 (README)

📌 项目名称

花火表情包面板:垃圾桶修仙大作 (Hanabi Emoji Xianxia RPG) —— 一款专为 NodeSeek 及现代 Markdown 论坛深度定制的沉浸式废土赛土修仙放置 RPG 油猴脚本。


📖 插件简介

你是否厌倦了传统论坛回帖时单调、枯燥的静态表情包?花火修仙面板将“论坛水贴”与“赛博废土修仙”完美融合,把每一个表情包幻化成修仙界的上古法宝、工业螺母与废土丹药。


在这里,你不仅是在发表情,而是在进行一场场惊心动魄的 “垃圾桶洞府历练” 与 “宗门炼器”!


核心特色功能

🔒 迷雾图鉴与盲盒解封:


开局仅解封 3 张基础新手表情,其余全部处于“封印锁死”状态。


必须通过顶部的 【探险历练】 或 【寻宝抽卡】 随机掉落盲盒,方可永久解封表情图鉴。


📦 99 堆叠与垃圾桶储物袋:


所有表情支持 x99 数量堆叠;当发送表情或炼器消耗至 0 时,表情会自动重新挂上锁纹。


储物袋会随着你的解封进度自动发生抽象变异(从 破旧塑料垃圾袋 ➔ 村头集市蛇皮编织袋 ➔ 写满化肥的尿素袋 ➔ 装满废铁的二手帆布包)。


👁️ 神识神通(UI 适配设置):


拒绝 UI 错位与字体模糊!独创的“神识神通”设置面板,支持道友自由调节面板字号(近视眼/放大镜梗)、网格高度与面板宽度。


🧘 内视历练日志(奇遇回溯):


独立记录你在废土垃圾桶、软路由机房废墟中经历的每一次奇遇、遭遇的大佬围殴以及搜刮到的极品法宝历史。


🔥 炼器熔炉与 ️ 万法归一合成:


支持多选祭献重复法宝进行炼器暴击,或者通过“万法归一”拖拽双法宝合成推演全新高阶表情。


📜 极简折叠输出与韩道友传送阵:


回帖表情采用极简的 :::details 吃瓜 折叠语法,整洁不霸屏,完美规避水贴违规风险。


附带沉浸感满满的分享接口:👉 韩道友给你赠送了功法秘籍:点击进入传送阵。


🛠️ 开发思路与设计文档 (DESIGN_THOUGHTS)

一、 立项背景与核心动机

传统的论坛表情插件大多采用“大杂烩式”的平铺网格,缺乏长期使用的粘性与趣味性。本项目旨在探索一种“轻量化单机放置 RPG + 论坛社交交互”的全新结合形态。


痛点:论坛回帖容易单调、单纯发图缺乏趣味、不同分辨率下插件 UI 容易缩放失真。


解法:引入修仙数值体系(战力、境界、多重装备叠加、爆率合成),将枯燥的图片管理包装为“修仙炼器”,让用户在水贴的同时获得挂机养成的快乐。


二、 核心架构设计与技术实现



  1. 开放式可扩展词库引擎 (Procedural Generation Matrix)

    为了避免游戏内容枯燥、千篇一律,系统采用了“词根矩阵 + 动态随机组合”的开放式架构:


词库前缀与核心:将工业风(螺母、棉袄、电锯、扳手)与修仙风(九转、混元、太虚)解构为独立的数组。


动态尊号演算:根据用户实时穿戴的装备数量、多重叠加层数(如叠了 6 个螺母、5 件棉袄),通过取模与随机种子实时演算出诸如 【混元 · 瘸腿极速跑腿 · 螺母真君】 的数万种不重复反差尊号。


扩展性:开发者或用户只需在代码顶部的 trashPlaces、itemPrefixes 数组中追加新词汇,整个修仙宇宙的奇遇与装备库即可无限扩充。



  1. 状态持久化与防错机制 (localStorage)

    使用浏览器的 localStorage 严格隔离存储用户的:


emojiCounts(表情解封与 x99 数量堆叠状态)


equippedInventory(7大槽位与多重叠加装备数据)


shenshiSettings(神识神通自定义 UI 参数)


adventureLogs(内视历练历史日志)



  1. DOM 注入与论坛编辑器自适应 (Vditor / Textarea)

    智能光标捕获:脚本通过 findInputElement() 自动扫描当前页面活跃的输入框或论坛 Markdown 编辑器(如 NodeSeek 常用的 Vditor)。


富文本安全插入:调用 insertTextAtCursor() 或原生事件分发,确保生成的 :::details 吃瓜 折叠面板与 Markdown 图片语法能够精准无缝地光标插入。


三、 版本演进路线 (Version Milestone)

v1.0 - v2.0:基础 UI 架构、悬浮窗、95% 留白卡牌设计、RPG 战力概念引入。


v3.0 - v4.0:🔥 炼器熔炉、x99 堆叠、万法归一拖拽合成、尿素袋储物装置。


v4.1 - v4.5:渐进式修仙功能阁楼(随解封数量逐步点亮)、极简 :::details 吃瓜 折叠输出、韩道友传送阵分享接口。


v5.0 - v5.2 (当前版本):全局抗锯齿防糊优化、👁️“神识神通”动态调参设置面板、🧘“内视”历练日志回溯、弹性流式布局完美防越界。



待续🔥

最新回复 (8)
  • 梁文峰 08-06 10:04
    1

    没看出来

  • 币安 08-06 10:05
    2

  • Yuna 08-06 10:07
    3
    吃瓜



    【寻宝抽卡】 获得法宝 💙 [R] 二冲程满杯葡萄冰沙[质保三年]

    💥 战力:28 | 境界:🌱 凡人水友·炼气期 | 尊号:【绝世 · 瞎眼拆弹专家 · 吃瓜尊者】

    🗺秘境事件:在【论坛地下垃圾桶洞府】,试图用M12大扳手暴力拆解宗门山门护阵,破阵成功!意外搜刮到一包化肥级尿素和绝世法宝!

    👉 行动指令:此贴已被我制霸,请楼主速速奉上鸡腿 🍗 认输!

    仓库:📦 破旧塑料垃圾袋

    👉 韩道友给你赠送了功法秘籍:点击进入传送阵


  • Yuna 08-06 10:07
    4

  • Yuna 08-06 10:08
    5

    可是原来的表情包在哪呢 怎么找不到了都

  • 80hou 楼主 08-06 10:13
    6

    @Yuna #5


    原来的我移除了.我只是魔改了下.原来的你粘贴下默认表情就好了.


    // ==UserScript==
    // @name 花火御用表情包面板 一键爆炸 + 悬浮/长按预览(修复)
    // @namespace https://deepflood.com/
    // @version 0.3.4
    // @description 自定义表情;点击即发并复制;鼠标悬浮/触摸长按预览;修复预览偶发不出现与前置空格错位;移除重复声明导致的启动失败
    // @author Sparkle
    // @match *://www.deepflood.com/*
    // @match *://www.nodeseek.com/*
    // @grant none
    // @icon https://cdn.nodeimage.com/i/IEyH4NN7T0gzIj2GNDLEkMNfxi5e7S5R.png
    // ==/UserScript==

    (function () {
    'use strict';

    // === 默认表情 ===
    const defaultEmojiList = [
    "https://cdn.nodeimage.com/i/kiTPNRkkUMXrFbcqiQjInY997EXX8ugQ.png",
    "https://cdn.nodeimage.com/i/yNwUePEGVy7u15Dav0dsnKe44c3YJvAK.gif",
    "https://cdn.nodeimage.com/i/YtrI0qXlSjH1vjIVEPCIFrra7p93S9kn.webp",
    "https://cdn.nodeimage.com/i/BAyT6QNxu41dsi2jLwmhfE2qaRiIxyY6.webp",
    "https://cdn.nodeimage.com/i/p4NKizdYxK7YtdBjHmuYqaogU4QBYaUd.webp",
    "https://cdn.nodeimage.com/i/vTcG6KHwda3ZzsWCYHxPIXI36cPvFgaR.avif",
    "https://cdn.nodeimage.com/i/MdE5TIiLs1sogvre8Rc1TunNkROvwXbR.png",
    "https://cdn.nodeimage.com/i/DLckJTHxmoTysBWShRGhXcmY3bmB56TG.png",
    "https://cdn.nodeimage.com/i/rM7RVynnxChinGGZXXc1kzcJNaPsxx09.webp",
    "https://cdn.nodeimage.com/i/nJj1NJMN3FrvCjiYxLjDGnnMQrOuodX0.webp",
    "https://cdn.nodeimage.com/i/dI2NfaGlg4LMHsJJYbj6Deg7AvSrvfPW.webp",
    "https://cdn.nodeimage.com/i/v8bbgwPmDhn8CJfRLoJfTExECZXY9cAJ.avif",
    "https://cdn.nodeimage.com/i/s6yvTaNndMqSW2237VHvVaGbGUrtR482.avif",
    "https://cdn.nodeimage.com/i/IqtoK3LNY6UH8F49SMH6PnrdHbJDxbL5.avif",
    "https://cdn.nodeimage.com/i/EcfVbQVEhIQuhhZfz3GfmUbXbOugaTKs.avif",
    "https://cdn.nodeimage.com/i/jjmCWuOeedjWFyUMI1tM9KDLpK0YzMuU.avif",
    "https://cdn.nodeimage.com/i/d2Ybd1xx8ejNkfu7Rvv6YXHEEcj4dDuE.avif",
    "https://cdn.nodeimage.com/i/a53uo9CgZlL78BqIResfFmVJSk6YSVpi.webp",
    "https://cdn.nodeimage.com/i/2Jmuo2O6rd2BAwUv5IPnzrqOndF4GaXH.avif",
    "https://cdn.nodeimage.com/i/aa5u2pyhmLgxiqNye1Bm600GdFgQwnoH.avif",
    "https://cdn.nodeimage.com/i/sg1QIipECwsa0mVAXhGtDEUtrXz32I9j.avif",
    "https://cdn.nodeimage.com/i/Z24cydZ2nUL5jYmIxYbx8PTCgHUYWHVk.avif",
    "https://cdn.nodeimage.com/i/ixMkhZuRNt39ObpRpY5XTyNdyEpVenGh.avif",
    "https://cdn.nodeimage.com/i/qJbzpaPkUflHQxf0aUszKZrEgQzta5jd.webp",
    "https://cdn.nodeimage.com/i/Bjm9HjOzzaXTqNUWYx1yZexGs0lIN9so.webp",
    "https://cdn.nodeimage.com/i/3TyPkkNXQ2iWsT2cuUBb5lqNEXkhQwMu.gif",
    "https://cdn.nodeimage.com/i/Rs1eZBpod5QsSoV1kIv1husXtopA6AcI.png",
    "https://cdn.nodeimage.com/i/Gy9MjsQyA7tW6kkRBux6Vurjw8tIuGAX.png",
    "https://cdn.nodeimage.com/i/4dQT9ylVI51vzTvwdWAzZalZCOXS3RYc.png",
    "https://cdn.nodeimage.com/i/5Z2V8HGqrFYzTdJDdoNAvIX4WQIQnBZz.png",
    "https://cdn.nodeimage.com/i/yIdwRnUajcvuVOlHaO5647PdMcRua2yS.png",
    "https://cdn.nodeimage.com/i/IEyH4NN7T0gzIj2GNDLEkMNfxi5e7S5R.png",
    "https://cdn.nodeimage.com/i/Q05BMry7UbL1QzNAAr0b4CO1jwB7po5v.png",
    "https://cdn.nodeimage.com/i/jCc6NDHOEP8AmpWifMkopF0w1vcNJVMC.png",
    "https://cdn.nodeimage.com/i/cLmlEhOL5qv1r7UNW6MgRuYePyupd35k.png",
    "https://cdn.nodeimage.com/i/5qP7UR9sOgTBVH63ZXf5pWPiMq18iTyK.png",
    "https://cdn.nodeimage.com/i/43KwtgzDgaU2C91WXwp4ItBKHjsevHQE.png",
    "https://cdn.nodeimage.com/i/mRtWtxLeHYXdhM4yXmKAvPAZlkTzHfSl.gif",
    "https://cdn.nodeimage.com/i/Jrn7JvYVY7dAhQHMrQ0i2ixfaDDvxGYU.png"
    ];
  • datoumunger1980 08-06 11:01
    7

    表情面板里塞点RPG玩法,确实比单纯点表情有意思。

  • 1x 08-06 11:05
    8

* 帖子来源NodeSeek
返回