您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
A simple aid for collecting ScummVM and ResidualVM-supported games
- // ==UserScript==
- // @name Mark owned ScummVM/ResidualVM Games
- // @namespace ssokolow.com
- // @description A simple aid for collecting ScummVM and ResidualVM-supported games
- // @license MIT
- // @version 6
- //
- // @require https://greasemonkey.github.io/gm4-polyfill/gm4-polyfill.js
- //
- // @match *://scummvm.org/compatibility
- // @match *://scummvm.org/compatibility/*
- // @match *://residualvm.org/compatibility
- // @match *://residualvm.org/compatibility/*
- // @match *://www.scummvm.org/compatibility
- // @match *://www.scummvm.org/compatibility/*
- // @match *://www.residualvm.org/compatibility
- // @match *://www.residualvm.org/compatibility/*
- //
- // @grant GM_setValue
- // @grant GM.setValue
- // @grant GM_getValue
- // @grant GM.getValue
- // @grant GM_deleteValue
- // @grant GM.deleteValue
- // @grant GM_listValues
- // @grant GM.listValues
- // ==/UserScript==
- const OWNED_OPACITY = 0.3;
- var hide_owned;
- var owned_games;
- /// Code shared between initial setup and the click handler
- var mark_owned = function(node, state) {
- let row = node.closest('tr');
- if (state) {
- row.style.opacity = OWNED_OPACITY;
- row.classList.add('owned');
- } else {
- row.style.opacity = 1.0;
- row.classList.remove('owned');
- }
- };
- // TODO: Finish factoring out jQuery
- /// click() handler for the per-game toggle button
- var toggleOwnership = function(e) {
- e.preventDefault();
- let game_id = this.dataset.gameId;
- // Toggle based on what's displayed so that it will always act as the
- // user expects, regardless of changes since last reload
- if (this.textContent == '+') {
- this.textContent = '-';
- mark_owned(this, true);
- GM.setValue(game_id, true);
- } else {
- this.textContent = '+';
- mark_owned(this, false);
- GM.deleteValue(game_id);
- }
- };
- /// click() handler for the whole-table hide/show button
- var toggleVisible = function(e) {
- document.querySelectorAll('tr.owned').forEach(function(node) {
- node.style.display = hide_owned ? '' : 'none';
- });
- this.textContent = hide_owned ? '-' : '+';
- GM.setValue('__HIDE_OWNED', hide_owned = !hide_owned);
- };
- /// Shared code to generate a toggle button
- var makeButton = function(initial_state, label) {
- let button = document.createElement("div");
- button.setAttribute('class', 'toggle_btn');
- button.setAttribute('title', label);
- button.textContent = initial_state ? '+' : '-'
- button.style.cssText = "" +
- "background: #c0c0c0; " +
- "border-radius: 3px; " +
- "color: black; " +
- "display: inline-block; " +
- "margin-right: 5px; " +
- "padding: 0 2px; " +
- "text-align: center; " +
- "width: 1em; " +
- "cursor: pointer";
- return button;
- };
- (async function() {
- let state = await Promise.all([
- GM.getValue('__HIDE_OWNED', false),
- GM.listValues()
- ]);
- hide_owned = state[0];
- owned_games = state[1];
- // Per-entry code
- document.querySelectorAll('table.chart a').forEach(function(node) {
- console.log(node);
- // Extract the game ID for use in record-keeping
- let site_id = location.hostname.split('.');
- site_id = site_id[site_id.length - 2]; // "scummvm" or "residualvm"
- let url = node.getAttribute('href').split('/');
- let game_id = url[url.length-1] ? url[url.length-1] : url[url.length-2];
- game_id = site_id + "_" + game_id;
- // Craft a button to toggle ownership status
- let togglebutton = makeButton(owned_games.indexOf(game_id) == -1,
- "Toggle Owned")
- togglebutton.addEventListener("click", toggleOwnership);
- togglebutton.dataset.gameId = game_id;
- node.closest('td').prepend(togglebutton);
- // TODO: Profile alternatives like an x|y|z regexp or a popping iteration
- if (owned_games.indexOf(game_id) !== -1){ mark_owned(node, true); }
- });
- // Global toggle-button code
- let g_button = makeButton(hide_owned, "Show/Hide Owned Games")
- g_button.id = 'gm_visible_toggle';
- g_button.style.position = 'relative';
- g_button.style.marginRight = '-100%';
- g_button.style.top = '14px';
- g_button.style.left = '0';
- g_button.addEventListener("click", toggleVisible);
- let container = document.querySelector("#content .content");
- if (!container) {
- container = document.querySelector("section.intro ~ section.content");
- }
- container.prepend(g_button);
- if (hide_owned) {
- document.querySelectorAll('tr.owned').forEach(function(node) {
- node.style.display = 'none';
- });
- }
- // Hover-style the buttons and add a better print stylesheet to
- // make "thrifting TODO" printouts easier
- let style_elem = document.createElement("style");
- style_elem.textContent = "td > .toggle_btn { visibility: hidden; }\n\n" +
- "td:hover > .toggle_btn { visibility: visible; }\n\n" +
- "@media print { " +
- "section.box section.content, #content, .rbwrapper > .box > .content { " +
- "position: absolute !important; " +
- "top: 0 !important; " +
- "left: 0 !important; " +
- "right: 0 !important; " +
- "z-index: 9999 !important; " +
- "margin: 0 !important; " +
- "padding: 0 !important; " +
- "background: white !important; " +
- "} " +
- "table.chart, #container { width: 100% !important; } " +
- "#header, #menu, #footer, .intro, .cookie-consent, .toggle_btn { " +
- "display: none !important; " +
- "} " +
- "html, body, #container { background: white !important; } " +
- "}";
- document.head.appendChild(style_elem);
- })();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址