// ==UserScript==
// @name Shell Shockers Party Theme 🎉
// @version 1.5
// @namescpace
// @description Boring shell shockers colors? Bore no more! This theme introduces a gui that gives options to change the colors. Some features like the Performance Settings are still in making. Thank you. Make sure to subscribe to my channel.
// @match https://algebra.best/*
// @match https://algebra.vip/*
// @match https://biologyclass.club/*
// @match https://deadlyegg.com/*
// @match https://deathegg.world/*
// @match https://egg.dance/*
// @match https://eggboy.club/*
// @match https://eggboy.xyz/*
// @match https://eggcombat.com/*
// @match https://eggfacts.fun/*
// @match https://egghead.institute/*
// @match https://eggisthenewblack.com/*
// @match https://eggsarecool.com/*
// @match https://eggshooter.best/*
// @match https://geometry.best/*
// @match https://geometry.monster/*
// @match https://geometry.pw/*
// @match https://geometry.report/*
// @match https://hardboiled.life/*
// @match https://hardshell.life/*
// @match https://humanorganising.org/*
// @match https://mathactivity.xyz/*
// @match https://mathdrills.info/*
// @match https://mathdrills.life/*
// @match https://mathfun.rocks/*
// @match https://mathgames.world/*
// @match https://math.international/*
// @match https://mathlete.fun/*
// @match https://mathlete.pro/*
// @match https://new.shellshock.io/*
// @match https://overeasy.club/*
// @match https://scrambled.best/*
// @match https://scrambled.tech/*
// @match https://scrambled.today/*
// @match https://scrambled.us/*
// @match https://shellshock.io/*
// @match https://scrambled.world/*
// @match https://shellshockers.today/*
// @match https://shellsocks.com/*
// @match https://shellshockers.club/*
// @match https://shellshockers.site/*
// @match https://shellshockers.today/*
// @match https://shellshockers.us/*
// @match https://shellshockers.world/*
// @match https://shellshockers.xyz/*
// @match https://softboiled.club/*
// @match https://urbanegger.com/*
// @match https://violentegg.club/*
// @match https://violentegg.fun/*
// @match https://yolk.best/*
// @match https://yolk.life/*
// @match https://yolk.quest/*
// @match https://yolk.rocks/*
// @match https://yolk.tech/*
// @match https://yolk.today/*
// @match https://zygote.cafe/*
// @license GPL 3.0
// @grant none
// @namespace https://greasyfork.org/users/1374094
// @downloadURL https://update.greasyfork.cloud/scripts/533367/Shell%20Shockers%20Party%20Theme%20%F0%9F%8E%89.user.js
// @updateURL https://update.greasyfork.cloud/scripts/533367/Shell%20Shockers%20Party%20Theme%20%F0%9F%8E%89.meta.js
// ==/UserScript==
(function() {
'use strict';
const styles = document.createElement('style');
styles.innerHTML = `
@keyframes rainbowHue {
0% { filter: hue-rotate(0deg); }
100% { filter: hue-rotate(360deg); }
}
@keyframes pulseGlow {
0%, 100% { filter: brightness(1) contrast(1) saturate(1); }
50% { filter: brightness(1.4) contrast(1.4) saturate(2); }
}
@keyframes synthGlow {
0%, 100% { filter: brightness(0.9) contrast(1.2) hue-rotate(280deg) saturate(2); }
50% { filter: brightness(1.1) contrast(1.5) hue-rotate(320deg) saturate(3); }
}
@keyframes xrayFlash {
0% { filter: grayscale(1) contrast(2) hue-rotate(0deg); }
50% { filter: grayscale(0.5) contrast(2.5) hue-rotate(180deg); }
100% { filter: grayscale(1) contrast(2) hue-rotate(360deg); }
}
@keyframes iceFade {
0% { filter: hue-rotate(180deg) brightness(0.9); }
50% { filter: hue-rotate(200deg) brightness(1.1); }
100% { filter: hue-rotate(180deg) brightness(0.9); }
}
@keyframes flameWave {
0% { filter: hue-rotate(10deg) brightness(1); }
50% { filter: hue-rotate(30deg) brightness(1.2) saturate(1.5); }
100% { filter: hue-rotate(10deg) brightness(1); }
}
#visual-mode-menu {
position: fixed;
top: 20px;
left: 20px;
background: rgba(0, 0, 0, 0.6);
color: white;
padding: 6px;
border-radius: 8px;
font-family: sans-serif;
font-size: 13px;
z-index: 99999;
width: 220px;
overflow-y: auto;
}
#visual-mode-menu summary {
cursor: pointer;
font-weight: bold;
margin-bottom: 5px;
}
.mode-option, .slider-option {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 4px;
}
.mode-option label, .slider-option label {
flex: 1;
}
.mode-option input[type="checkbox"], .slider-option input[type="checkbox"] {
margin-left: 6px;
}
.slider {
width: 70%;
}
.slider-value {
width: 30%;
text-align: center;
}
`;
document.head.appendChild(styles);
const modes = {
rainbow: { anim: 'rainbowHue 5s linear infinite', key: '1' },
pulse: { anim: 'pulseGlow 4s ease-in-out infinite', key: '2' },
synth: { anim: 'synthGlow 6s ease-in-out infinite', key: '3' },
xray: { anim: 'xrayFlash 3s linear infinite', key: '4' },
ice: { anim: 'iceFade 5s ease-in-out infinite', key: '5' },
flame: { anim: 'flameWave 4s ease-in-out infinite', key: '6' },
disco: { anim: 'disco', key: '7' } // handled separately
};
let activeMode = null;
let settings = {
animationSpeed: 1, // 1 is default, can be adjusted with a slider
animationIntensity: 1, // 1 is default, can be adjusted with a slider
disableEffects: [], // stores the list of effects that are disabled
guiSize: 220, // default GUI size
draggable: false // draggable option
};
const container = document.body;
const gameElements = ["body", "canvas", "#game-shell"];
const applyMode = (mode) => {
clearDisco();
activeMode = mode;
gameElements.forEach(sel => {
const el = document.querySelector(sel);
if (el) el.style.animation = mode === 'disco' ? '' : modes[mode].anim;
});
if (mode === 'disco') {
startDisco();
}
};
const clearDisco = () => {
clearInterval(window._discoInterval);
container.style.filter = '';
};
const startDisco = () => {
window._discoInterval = setInterval(() => {
const deg = Math.floor(Math.random() * 360);
container.style.filter = `hue-rotate(${deg}deg) brightness(1.2)`;
}, 1000);
};
const makeGUI = () => {
const menu = document.createElement('details');
menu.id = 'visual-mode-menu';
const summary = document.createElement('summary');
summary.textContent = '🎉 Party Theme Modes';
menu.appendChild(summary);
Object.keys(modes).forEach(mode => {
const option = document.createElement('div');
option.className = 'mode-option';
const label = document.createElement('label');
label.textContent = `${mode.charAt(0).toUpperCase() + mode.slice(1)} [${modes[mode].key}]`;
const toggle = document.createElement('input');
toggle.type = 'checkbox';
toggle.onchange = () => {
if (toggle.checked) {
applyMode(mode);
} else {
clearDisco();
activeMode = null;
gameElements.forEach(sel => {
const el = document.querySelector(sel);
if (el) el.style.animation = '';
});
}
};
option.appendChild(label);
option.appendChild(toggle);
menu.appendChild(option);
});
// Performance Settings Section
const performanceSection = document.createElement('details');
performanceSection.innerHTML = 'Performance Settings';
const animationSpeedLabel = document.createElement('label');
animationSpeedLabel.textContent = 'Animation Speed';
const animationSpeedSlider = document.createElement('input');
animationSpeedSlider.type = 'range';
animationSpeedSlider.min = '0.1';
animationSpeedSlider.max = '2';
animationSpeedSlider.step = '0.1';
animationSpeedSlider.value = settings.animationSpeed;
animationSpeedSlider.className = 'slider';
const animationSpeedValue = document.createElement('input');
animationSpeedValue.type = 'number';
animationSpeedValue.value = settings.animationSpeed;
animationSpeedValue.className = 'slider-value';
animationSpeedSlider.oninput = (e) => {
settings.animationSpeed = e.target.value;
animationSpeedValue.value = e.target.value;
updateAnimationSpeed();
};
animationSpeedValue.oninput = (e) => {
settings.animationSpeed = e.target.value;
animationSpeedSlider.value = e.target.value;
updateAnimationSpeed();
};
const speedOption = document.createElement('div');
speedOption.className = 'slider-option';
speedOption.appendChild(animationSpeedLabel);
speedOption.appendChild(animationSpeedSlider);
speedOption.appendChild(animationSpeedValue);
performanceSection.appendChild(speedOption);
const animationIntensityLabel = document.createElement('label');
animationIntensityLabel.textContent = 'Animation Intensity';
const animationIntensitySlider = document.createElement('input');
animationIntensitySlider.type = 'range';
animationIntensitySlider.min = '0.1';
animationIntensitySlider.max = '2';
animationIntensitySlider.step = '0.1';
animationIntensitySlider.value = settings.animationIntensity;
const animationIntensityValue = document.createElement('input');
animationIntensityValue.type = 'number';
animationIntensityValue.value = settings.animationIntensity;
animationIntensityValue.className = 'slider-value';
animationIntensitySlider.oninput = (e) => {
settings.animationIntensity = e.target.value;
animationIntensityValue.value = e.target.value;
updateAnimationIntensity();
};
animationIntensityValue.oninput = (e) => {
settings.animationIntensity = e.target.value;
animationIntensitySlider.value = e.target.value;
updateAnimationIntensity();
};
const intensityOption = document.createElement('div');
intensityOption.className = 'slider-option';
intensityOption.appendChild(animationIntensityLabel);
intensityOption.appendChild(animationIntensitySlider);
intensityOption.appendChild(animationIntensityValue);
performanceSection.appendChild(intensityOption);
const disableEffectsLabel = document.createElement('label');
disableEffectsLabel.textContent = 'Disable Heavy Effects (Disco, X-ray)';
const disableEffectsCheckbox = document.createElement('input');
disableEffectsCheckbox.type = 'checkbox';
disableEffectsCheckbox.onchange = () => {
if (disableEffectsCheckbox.checked) {
settings.disableEffects.push('disco', 'xray');
} else {
settings.disableEffects = settings.disableEffects.filter(effect => effect !== 'disco' && effect !== 'xray');
}
};
performanceSection.appendChild(disableEffectsLabel);
performanceSection.appendChild(disableEffectsCheckbox);
// GUI Settings Section
const guiSettingsSection = document.createElement('details');
guiSettingsSection.innerHTML = 'GUI Settings';
const draggableLabel = document.createElement('label');
draggableLabel.textContent = 'Enable Draggable GUI';
const draggableCheckbox = document.createElement('input');
draggableCheckbox.type = 'checkbox';
draggableCheckbox.onchange = () => {
settings.draggable = draggableCheckbox.checked;
if (settings.draggable) makeDraggable(menu);
};
guiSettingsSection.appendChild(draggableLabel);
guiSettingsSection.appendChild(draggableCheckbox);
const guiSizeLabel = document.createElement('label');
guiSizeLabel.textContent = 'GUI Size';
const guiSizeSlider = document.createElement('input');
guiSizeSlider.type = 'range';
guiSizeSlider.min = '180';
guiSizeSlider.max = '300';
guiSizeSlider.step = '10';
guiSizeSlider.value = settings.guiSize;
guiSizeSlider.className = 'slider';
const guiSizeValue = document.createElement('input');
guiSizeValue.type = 'number';
guiSizeValue.value = settings.guiSize;
guiSizeValue.className = 'slider-value';
guiSizeSlider.oninput = (e) => {
settings.guiSize = e.target.value;
guiSizeValue.value = e.target.value;
updateGUI();
};
guiSizeValue.oninput = (e) => {
settings.guiSize = e.target.value;
guiSizeSlider.value = e.target.value;
updateGUI();
};
const guiSizeOption = document.createElement('div');
guiSizeOption.className = 'slider-option';
guiSizeOption.appendChild(guiSizeLabel);
guiSizeOption.appendChild(guiSizeSlider);
guiSizeOption.appendChild(guiSizeValue);
guiSettingsSection.appendChild(guiSizeOption);
menu.appendChild(performanceSection);
menu.appendChild(guiSettingsSection);
document.body.appendChild(menu);
};
const updateGUI = () => {
const menu = document.getElementById('visual-mode-menu');
menu.style.width = `${settings.guiSize}px`;
};
const updateAnimationSpeed = () => {
Object.keys(modes).forEach(mode => {
if (!settings.disableEffects.includes(mode)) {
const speed = settings.animationSpeed;
modes[mode].anim = `${modes[mode].anim.split(' ')[0]} ${speed}s linear infinite`;
}
});
};
const updateAnimationIntensity = () => {
Object.keys(modes).forEach(mode => {
if (!settings.disableEffects.includes(mode)) {
const intensity = settings.animationIntensity;
// Adjust intensity in your effects here if necessary
}
});
};
const makeDraggable = (menu) => {
let isDragging = false;
let offsetX, offsetY;
menu.addEventListener('mousedown', (e) => {
isDragging = true;
offsetX = e.clientX - menu.getBoundingClientRect().left;
offsetY = e.clientY - menu.getBoundingClientRect().top;
});
window.addEventListener('mousemove', (e) => {
if (isDragging) {
menu.style.left = `${e.clientX - offsetX}px`;
menu.style.top = `${e.clientY - offsetY}px`;
}
});
window.addEventListener('mouseup', () => {
isDragging = false;
});
};
makeGUI();
const keybinds = {
'1': 'rainbow',
'2': 'pulse',
'3': 'synth',
'4': 'xray',
'5': 'ice',
'6': 'flame',
'7': 'disco',
'0': 'off'
};
document.addEventListener('keydown', (e) => {
const key = e.key;
if (keybinds[key]) {
if (keybinds[key] === 'off') {
clearDisco();
activeMode = null;
gameElements.forEach(sel => {
const el = document.querySelector(sel);
if (el) el.style.animation = '';
});
document.querySelectorAll('.mode-option input[type="checkbox"]').forEach(cb => cb.checked = false);
} else {
applyMode(keybinds[key]);
document.querySelectorAll('.mode-option input[type="checkbox"]').forEach(cb => cb.checked = false);
const label = [...document.querySelectorAll('.mode-option label')].find(l => l.textContent.toLowerCase().startsWith(keybinds[key]));
if (label && label.nextElementSibling) label.nextElementSibling.checked = true;
}
}
});
})();