MoodClicker/js/game.js

340 lines
8.2 KiB
JavaScript

let mood = 0;
let moodPerClick = 1; // FOR TESTING PURPOSES, SHOULD BE 1 IN PRODUCTION
let purchasedUpgrades = [];
const upgradesContainer = document.getElementById('upgrades');
const moodCounter = document.getElementById('mood-counter');
const favicon = document.getElementById('favicon');
const upgradeInfoContainer = document.getElementById('upgrade-info');
const upgradeName = document.getElementById('upgrade-name');
const upgradeDesc = document.getElementById('upgrade-desc');
const upgradeCost = document.getElementById('upgrade-cost');
const rainRange = document.getElementById('rain-range');
const musicRange = document.getElementById('music-range');
const audioMusic = new Audio('./assets/audio/mood_not_found.mp3');
const audioRain = new Audio('./assets/audio/rain.mp3');
function updateMoodCounter() {
moodCounter.innerText = mood;
updateUpgrades();
if (mood < 100) {
favicon.setAttribute('href', './assets/favicons/1.ico');
} else if (mood < 1e3) {
favicon.setAttribute('href', './assets/favicons/2.ico');
} else if (mood < 1e5) {
favicon.setAttribute('href', './assets/favicons/3.ico');
} else if (mood < 1e9) {
favicon.setAttribute('href', './assets/favicons/4.ico');
} else if (mood < 1e16) {
favicon.setAttribute('href', './assets/favicons/5.ico');
} else if (mood < 1e19) {
favicon.setAttribute('href', './assets/favicons/6.ico');
} else if (mood < 1e22) {
favicon.setAttribute('href', './assets/favicons/7.ico');
}
}
function updateUpgradeInfo(upgrade) {
upgradeInfoContainer.style.visibility = 'visible';
upgradeName.innerText = upgrade.name;
upgradeDesc.innerText = upgrade.description;
upgradeCost.innerText = upgrade.cost + ' Mood';
}
function clearUpgradeInfo() {
upgradeInfoContainer.style.visibility = 'hidden';
}
function updateUpgrades() {
upgradesContainer.innerHTML = '';
upgrades.slice(0, 4).forEach((upgrade) => {
const upgradeBtn = document.createElement('button');
upgradeBtn.id = upgrade.id;
upgradeBtn.className = 'upgrade';
upgradeBtn.onclick = () => purchaseUpgrade(upgrade);
upgradeBtn.onmouseenter = () => updateUpgradeInfo(upgrade);
upgradeBtn.onmouseleave = clearUpgradeInfo;
upgradeBtn.oncontextmenu = () => false;
if (mood < upgrade.cost) {
upgradeBtn.style.opacity = 0.6;
upgradeBtn.style.cursor = 'not-allowed';
}
const upgradeImg = document.createElement('img');
upgradeImg.src = upgrade.image;
upgradeImg.alt = upgrade.name + ' Upgrade';
upgradeBtn.append(upgradeImg);
upgradesContainer.append(upgradeBtn);
});
}
function onLiftMoodClick() {
mood += moodPerClick;
updateMoodCounter();
}
function applyUpgrade(upgrade) {
const upgradeIndex = upgrades.indexOf(upgrade);
purchasedUpgrades.push(upgrade.id);
upgrades.splice(upgradeIndex, 1);
updateMoodCounter();
clearUpgradeInfo();
upgrade.onPurchase();
}
function purchaseUpgrade(upgrade) {
if (mood >= upgrade.cost) {
mood -= upgrade.cost;
applyUpgrade(upgrade);
}
}
// UPGRADES
// saves
function enableSaves() {
const saves = document.getElementById('upg-saves');
const savesText = document.getElementById('upg-saves-text');
saves.style.visibility = 'visible';
let counter = 5;
const updateCounter = () => {
if (counter === 0) {
const save = {
mood,
purchasedUpgrades,
};
localStorage.setItem('save', JSON.stringify(save));
counter = 6;
savesText.innerText = 'Saved!';
} else {
counter--;
savesText.innerText = 'Auto save in ' + counter;
}
}
setInterval(updateCounter, 1000);
updateCounter();
}
function loadSave() {
const save = localStorage.getItem('save');
if (save) {
const decodedSave = JSON.parse(save);
mood = decodedSave.mood;
const needUpgrades = upgrades.filter((upgrade) => decodedSave.purchasedUpgrades.includes(upgrade.id));
needUpgrades.forEach((nUpgrade) => {
applyUpgrade(nUpgrade);
});
updateMoodCounter();
}
}
function resetProgress() {
localStorage.removeItem('save');
location.reload();
}
function onResetProgressClick() {
const upgSavesReset = document.getElementById('upg-saves-reset');
if (upgSavesReset.innerText === 'Reset progress') {
upgSavesReset.innerText = 'Reset progress (are you sure?)';
} else {
resetProgress();
}
}
// emojis
function getRandomEmoji() {
const emojis = ['😎', '😆', '😛', '😏', '😔', '🥲', '😔', '😒', '😍', '😃', '🤓', '😊', '😁', '😄'];
return emojis[Math.floor(Math.random() * emojis.length)];
}
function addEmoji() {
const upgEmojis = document.getElementById('upg-emojis');
upgEmojis.style.display = 'block';
const emoji = document.createElement('span');
emoji.innerText = getRandomEmoji();
emoji.className = 'upg-emojis';
setTimeout(() => {
upgEmojis.append(emoji);
}, Math.random() * 1000);
setInterval(() => {
mood += Math.floor(Math.random() * 1000);
emoji.innerText = getRandomEmoji();
updateMoodCounter();
}, 5000);
}
// rain
function enableRain() {
audioRain.play();
audioRain.loop = true;
setInterval(() => {
if (audioRain.paused) {
audioRain.play();
rainRange.value = audioRain.volume * 100;
}
}, 1000);
}
// calm_music
function enableMusic() {
audioMusic.play();
audioMusic.loop = true;
setInterval(() => {
if (audioMusic.paused) {
audioMusic.play();
musicRange.value = audioMusic.volume * 100;
}
}, 1000);
}
// mixer
function enableMixer() {
const upgMixer = document.getElementById('upg-mixer');
upgMixer.style.visibility = 'visible';
}
function rainRangeChange(value) {
audioRain.volume = value / 100;
}
function musicRangeChange(value) {
audioMusic.volume = value / 100;
}
// cuteface
function showCuteface() {
const cuteface = document.getElementById('upg-cuteface');
cuteface.style.visibility = 'visible';
document.body.style.backgroundColor = '#93560e';
}
// credits
function showCredits() {
const credits = document.getElementById('upg-credits');
credits.style.display = 'block';
}
// cursor
function enableCursor() {
var allElements = document.querySelectorAll('body, .btn, .click-btn');
for (var i = 0; i < allElements.length; i++) {
allElements[i].style.cursor = 'url("./assets/img/cursors/cursor.png"), auto';
}
}
let upgrades = [
{
id: 'mood_lifter',
name: 'Mood Lifter',
description: 'Lift your Mood. +5/click',
image: '../assets/img/upgrades/mood_lifter.png',
cost: 50,
onPurchase: () => moodPerClick += 5,
},
{
id: 'saves',
name: 'Free Disk Space',
description: 'Enable saves',
image: '../assets/img/upgrades/saves.png',
cost: 300,
onPurchase: enableSaves,
},
{
id: 'emojis',
name: 'Emoji Thruster',
description: 'Flying emoji. Gives some amount of mood every 5 seconds.',
image: '../assets/img/upgrades/emojis.png',
cost: 500,
onPurchase: addEmoji,
},
{
id: 'rain',
name: 'Rain',
description: 'It\'s rainy outside...',
image: '../assets/img/upgrades/rain.png',
cost: 1000,
onPurchase: enableRain,
},
{
id: 'emojis2',
name: 'More Emoji Thrusters',
description: 'Let the emojis flyyyyyyy-- and get some more mood',
image: '../assets/img/upgrades/emojis2.png',
cost: 1500,
onPurchase: addEmoji,
},
{
id: 'calm_music',
name: 'Old Radio',
description: 'Listen to the hand-made music',
image: '../assets/img/upgrades/calm_music.png',
cost: 3000,
onPurchase: enableMusic,
},
{
id: 'cursor',
name: 'Cursor',
description: 'Click Clack. +400 mood/click',
image: '../assets/img/upgrades/cursor.png',
cost: 4000,
onPurchase: enableCursor,
},
{
id: 'mixer',
name: 'Mixer',
description: 'Control the sounds',
image: '../assets/img/upgrades/mixer.png',
cost: 4500,
onPurchase: enableMixer,
},
{
id: 'cuteface',
name: 'Cuteface',
description: 'A little bit... unusual background... no?..',
image: '../assets/img/upgrades/cuteface.png',
cost: 8000,
onPurchase: showCuteface,
},
{
id: 'credits',
name: 'Credits',
description: 'Congratulations!',
image: '../assets/img/upgrades/credits.png',
cost: 1,
onPurchase: showCredits,
},
];
loadSave();
updateUpgrades();