// ==UserScript==
// @name Heart Clicker Cheat Panel
// @namespace http://tampermonkey.net/
// @version 1.1
// @description Adds a modern cheat panel to the Heart Clicker game with draggable functionality and additional features
// @match https://heart-io.github.io/Heart/
// @grant none
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
// Styles for the cheat panel and buttons
const style = document.createElement('style');
style.innerHTML = `
#cheat-panel {
position: absolute;
top: 20px;
left: 20px;
background: #fff;
border: 1px solid #333;
padding: 15px;
border-radius: 10px;
width: 350px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
z-index: 1000;
}
#cheat-panel h2 {
margin: 0;
font-size: 1.2em;
color: #333;
}
.item {
margin-bottom: 15px;
}
.item label {
display: block;
margin-bottom: 5px;
font-weight: bold;
}
.item input, .item select, .item button {
width: 100%;
padding: 10px;
margin-top: 5px;
font-size: 1em;
}
#close-cheat-panel, #reopen-cheat-panel {
background: #ff4d4d;
color: #fff;
border: none;
border-radius: 5px;
padding: 10px;
cursor: pointer;
font-size: 1em;
}
#reopen-cheat-panel {
position: fixed;
bottom: 20px;
right: 20px;
background: #4CAF50;
}
#warning-panel {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: rgba(0, 0, 0, 0.8);
color: #fff;
padding: 20px;
border-radius: 10px;
display: none;
z-index: 1001;
}
#warning-panel button {
margin: 5px;
padding: 10px;
font-size: 1em;
}
.bounce {
animation: bounce 2s infinite;
}
@keyframes bounce {
0%, 20%, 50%, 80%, 100% {
transform: translateY(0);
}
40% {
transform: translateY(-30px);
}
60% {
transform: translateY(-15px);
}
}
`;
document.head.appendChild(style);
// Create cheat panel HTML
const panelHtml = `
<div id="cheat-panel">
<h2>Cheat Panel</h2>
<div class="item">
<label for="set-hearts">Set Hearts:</label>
<input type="number" id="set-hearts" placeholder="Enter hearts" />
<button id="apply-hearts">Apply</button>
</div>
<div class="item">
<label for="heart-selection">Change Heart Character:</label>
<select id="heart-selection">
<!-- Dynamically filled with heart options -->
</select>
<button id="change-heart">Change</button>
</div>
<div class="item">
<button id="unlock-admin">Unlock Admin Character</button>
</div>
<div class="item">
<button id="realistic-mode">Realistic Mode</button>
</div>
<button id="close-cheat-panel">X</button>
</div>
<div id="warning-panel">
<p>This might disturb you. Are you sure you want it realistic?</p>
<button id="confirm-realistic">Yes</button>
<button id="cancel-realistic">No</button>
</div>
<button id="reopen-cheat-panel">Show Cheat Panel</button>
`;
document.body.insertAdjacentHTML('beforeend', panelHtml);
// Initialize heart characters
const heartCharacters = [
{ symbol: '💙', name: 'Blue Heart', cost: 100 },
{ symbol: '💚', name: 'Green Heart', cost: 150 },
{ symbol: '💛', name: 'Yellow Heart', cost: 200 },
{ symbol: '💜', name: 'Purple Heart', cost: 250 },
{ symbol: '🤍', name: 'White Heart', cost: 300 },
{ symbol: '🖤', name: 'Black Heart', cost: 350 },
{ symbol: '💖', name: 'Sparkling Heart', cost: 400 },
{ symbol: '💗', name: 'Growing Heart', cost: 450 },
{ symbol: '💝', name: 'Heart with Ribbon', cost: 500 },
{ symbol: '💘', name: 'Heart with Arrow', cost: 550 },
{ symbol: '❤️🔥', name: 'Heart on Fire', cost: 600 },
{ symbol: '💞', name: 'Revolving Hearts', cost: 650 },
{ symbol: '💕', name: 'Two Hearts', cost: 700 },
{ symbol: '💟', name: 'Heart Decoration', cost: 750 },
{ symbol: '❣️', name: 'Heavy Heart Exclamation', cost: 800 },
{ symbol: '❤️🩹', name: 'Heart with Bandage', cost: 850 }
];
// Populate heart selection
const heartSelection = document.getElementById('heart-selection');
heartCharacters.forEach(heart => {
const option = document.createElement('option');
option.value = heart.symbol;
option.text = heart.name;
heartSelection.add(option);
});
let heartCount = parseInt(localStorage.getItem('heartCount')) || 0;
let currentHeart = localStorage.getItem('currentHeart') || '❤️';
let realisticMode = false;
function updateHeartCount() {
const clicker = document.getElementById('clicker');
if (clicker) {
clicker.innerText = heartCount;
}
}
function saveGameState() {
localStorage.setItem('heartCount', heartCount);
localStorage.setItem('currentHeart', currentHeart);
}
document.getElementById('apply-hearts').addEventListener('click', () => {
const hearts = parseInt(document.getElementById('set-hearts').value);
if (!isNaN(hearts) && hearts >= 0) {
heartCount = hearts;
updateHeartCount();
saveGameState();
} else {
alert('Invalid heart count!');
}
});
document.getElementById('change-heart').addEventListener('click', () => {
const selectedHeart = document.getElementById('heart-selection').value;
currentHeart = selectedHeart;
const clicker = document.getElementById('clicker');
if (clicker) {
clicker.innerHTML = `<img src="${currentHeart}" style="width: 50px; height: 50px;">`;
updateHeartCount();
saveGameState();
}
});
document.getElementById('unlock-admin').addEventListener('click', () => {
currentHeart = 'https://i.ibb.co/txJkfHz/Untitled181-20240817233140.png'; // Admin Heart
heartCount = 10000;
const clicker = document.getElementById('clicker');
if (clicker) {
clicker.innerHTML = `<img src="${currentHeart}" style="width: 50px; height: 50px;">`;
updateHeartCount();
saveGameState();
}
});
document.getElementById('realistic-mode').addEventListener('click', () => {
document.getElementById('warning-panel').style.display = 'block';
});
document.getElementById('confirm-realistic').addEventListener('click', () => {
realisticMode = true;
currentHeart = 'https://i.ibb.co/xSVZBZq/IMG-7404.png'; // Realistic Heart
const clicker = document.getElementById('clicker');
if (clicker) {
clicker.innerHTML = `<img src="${currentHeart}" style="width: 50px; height: 50px;">`;
updateHeartCount();
startRealisticMode();
saveGameState();
document.getElementById('warning-panel').style.display = 'none';
}
});
document.getElementById('cancel-realistic').addEventListener('click', () => {
document.getElementById('warning-panel').style.display = 'none';
});
function startRealisticMode() {
setInterval(() => {
if (realisticMode) {
const clicker = document.getElementById('clicker');
if (clicker) {
clicker.classList.toggle('bounce');
playHeartPumpSound();
}
}
}, 2000);
}
function playHeartPumpSound() {
const audio = new Audio('https://www.soundjay.com/button/sounds/button-16.mp3'); // Replace with heart pump sound URL
audio.play();
}
// Draggable functionality
function makeDraggable(element) {
let offsetX, offsetY, isDragging = false;
element.addEventListener('mousedown', (e) => {
isDragging = true;
offsetX = e.clientX - parseInt(window.getComputedStyle(element).left);
offsetY = e.clientY - parseInt(window.getComputedStyle(element).top);
});
document.addEventListener('mousemove', (e) => {
if (isDragging) {
element.style.left = `${e.clientX - offsetX}px`;
element.style.top = `${e.clientY - offsetY}px`;
}
});
document.addEventListener('mouseup', () => {
isDragging = false;
});
}
makeDraggable(document.getElementById('cheat-panel'));
document.getElementById('close-cheat-panel').addEventListener('click', () => {
document.getElementById('cheat-panel').style.display = 'none';
document.getElementById('reopen-cheat-panel').style.display = 'block';
});
document.getElementById('reopen-cheat-panel').addEventListener('click', () => {
document.getElementById('cheat-panel').style.display = 'block';
document.getElementById('reopen-cheat-panel').style.display = 'none';
});
// Initialize
updateHeartCount();
})();