mirror of
https://github.com/zyllian/zyllian.github.io.git
synced 2025-01-18 19:52:35 -08:00
223 lines
5.8 KiB
JavaScript
223 lines
5.8 KiB
JavaScript
|
(function () {
|
||
|
"use strict";
|
||
|
|
||
|
const click = document.querySelector("#click");
|
||
|
const petsCounter = click.querySelector("#pets");
|
||
|
const petsPerSecondCounter = click.querySelector("#pets-per-second");
|
||
|
const barksCounter = click.querySelector("#barks");
|
||
|
const barksPerSecondCounter = click.querySelector("#barks-per-second");
|
||
|
const kissesCounter = click.querySelector("#kisses");
|
||
|
const kissesPerSecondCounter = click.querySelector("#kisses-per-second");
|
||
|
const barker = click.querySelector("#barker");
|
||
|
const toolsEl = click.querySelector(".tools");
|
||
|
|
||
|
const toolPriceFactor = 0.1;
|
||
|
const upgradePriceFactor = 0.2;
|
||
|
const upgradeProductionFactor = 1.1;
|
||
|
|
||
|
const toolData = {
|
||
|
hand: {
|
||
|
priceIn: "barks",
|
||
|
basePrice: 10,
|
||
|
petsPerSecond: 0.5,
|
||
|
},
|
||
|
puppy: {
|
||
|
priceIn: "pets",
|
||
|
basePrice: 5,
|
||
|
barksPerSecond: 0.5,
|
||
|
},
|
||
|
foodBowl: {
|
||
|
priceIn: "barks",
|
||
|
basePrice: 50,
|
||
|
barksPerSecond: 1.3,
|
||
|
},
|
||
|
kisser: {
|
||
|
priceIn: "pets",
|
||
|
basePrice: 500,
|
||
|
kissesPerSecond: 0.25,
|
||
|
},
|
||
|
};
|
||
|
|
||
|
let barks = 0;
|
||
|
let pets = 0;
|
||
|
let kisses = 0;
|
||
|
let tools = {};
|
||
|
|
||
|
let petsPerSecond = 0;
|
||
|
let barksPerSecond = 0;
|
||
|
let kissesPerSecond = 0;
|
||
|
|
||
|
function calcPrice(base, count) {
|
||
|
return Math.floor(base ** (1 + toolPriceFactor * count));
|
||
|
}
|
||
|
|
||
|
function calcUpgradePrice(base, count) {
|
||
|
return Math.floor((base * 2) ** (1 + upgradePriceFactor * count));
|
||
|
}
|
||
|
|
||
|
const getValue = (name) => {
|
||
|
if (name === "pets") {
|
||
|
return pets;
|
||
|
} else if (name === "barks") {
|
||
|
return barks;
|
||
|
} else if (name === "kisses") {
|
||
|
return kisses;
|
||
|
} else if (name === "petsPerSecond") {
|
||
|
return petsPerSecond;
|
||
|
} else if (name === "barksPerSecond") {
|
||
|
return barksPerSecond;
|
||
|
} else if (name === "kissesPerSecond") {
|
||
|
return kissesPerSecond;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const setValue = (name, value) => {
|
||
|
if (name === "pets") {
|
||
|
pets = value;
|
||
|
} else if (name === "barks") {
|
||
|
barks = value;
|
||
|
} else if (name === "kisses") {
|
||
|
kisses = value;
|
||
|
} else if (name === "petsPerSecond") {
|
||
|
petsPerSecond = value;
|
||
|
} else if (name === "barksPerSecond") {
|
||
|
barksPerSecond = value;
|
||
|
} else if (name === "kissesPerSecond") {
|
||
|
kissesPerSecond = value;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
const updatePerSecondValues = () => {
|
||
|
let pets = 0;
|
||
|
let barks = 0;
|
||
|
let kisses = 0;
|
||
|
|
||
|
for (const [id, tool] of Object.entries(tools)) {
|
||
|
pets +=
|
||
|
(toolData[id].petsPerSecond || 0) *
|
||
|
tool.count *
|
||
|
tool.upgrades *
|
||
|
upgradeProductionFactor;
|
||
|
barks +=
|
||
|
(toolData[id].barksPerSecond || 0) *
|
||
|
tool.count *
|
||
|
tool.upgrades *
|
||
|
upgradeProductionFactor;
|
||
|
kisses +=
|
||
|
(toolData[id].kissesPerSecond || 0) *
|
||
|
tool.count *
|
||
|
tool.upgrades *
|
||
|
upgradeProductionFactor;
|
||
|
}
|
||
|
|
||
|
petsPerSecond = pets;
|
||
|
barksPerSecond = barks;
|
||
|
kissesPerSecond = kisses;
|
||
|
};
|
||
|
|
||
|
const updateDisplay = () => {
|
||
|
petsCounter.innerText = pets;
|
||
|
petsPerSecondCounter.innerText = petsPerSecond.toFixed(2);
|
||
|
barksCounter.innerText = barks;
|
||
|
barksPerSecondCounter.innerText = barksPerSecond.toFixed(2);
|
||
|
kissesCounter.innerText = kisses;
|
||
|
kissesPerSecondCounter.innerText = kissesPerSecond.toFixed(2);
|
||
|
};
|
||
|
|
||
|
for (const el of toolsEl.querySelectorAll(".tool")) {
|
||
|
const id = el.getAttribute("data-tool");
|
||
|
if (id) {
|
||
|
const data = toolData[id];
|
||
|
if (data) {
|
||
|
const toolInfo = {
|
||
|
count: 0,
|
||
|
upgrades: 1,
|
||
|
};
|
||
|
tools[id] = toolInfo;
|
||
|
|
||
|
const count = el.querySelector(".count");
|
||
|
const level = el.querySelector(".level");
|
||
|
const buy = el.querySelector(".buy");
|
||
|
const upgrade = el.querySelector(".upgrade");
|
||
|
|
||
|
const updateText = () => {
|
||
|
count.innerText = toolInfo.count;
|
||
|
level.innerText = toolInfo.upgrades;
|
||
|
const price = calcPrice(data.basePrice, toolInfo.count);
|
||
|
const upgradePrice = calcUpgradePrice(
|
||
|
data.basePrice,
|
||
|
toolInfo.upgrades
|
||
|
);
|
||
|
buy.innerText = `buy - ${price} ${data.priceIn}`;
|
||
|
upgrade.innerText = `upgrade - ${upgradePrice} kisses`;
|
||
|
};
|
||
|
updateText();
|
||
|
|
||
|
buy.addEventListener("click", () => {
|
||
|
const price = calcPrice(data.basePrice, toolInfo.count);
|
||
|
const v = getValue(data.priceIn);
|
||
|
if (v >= price) {
|
||
|
setValue(data.priceIn, v - price);
|
||
|
toolInfo.count += 1;
|
||
|
updatePerSecondValues();
|
||
|
updateText();
|
||
|
updateDisplay();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
upgrade.addEventListener("click", () => {
|
||
|
const price = calcUpgradePrice(data.basePrice, toolInfo.upgrades);
|
||
|
if (kisses >= price) {
|
||
|
kisses -= price;
|
||
|
toolInfo.upgrades += 1;
|
||
|
updatePerSecondValues();
|
||
|
updateText();
|
||
|
updateDisplay();
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
barker.addEventListener("click", () => {
|
||
|
barks += 1;
|
||
|
updateDisplay();
|
||
|
});
|
||
|
|
||
|
let lastUpdate = 0;
|
||
|
let petsQueued = 0;
|
||
|
let barksQueued = 0;
|
||
|
let kissesQueued = 0;
|
||
|
|
||
|
const checkQueue = (name, queued) => {
|
||
|
const perSecond = getValue(`${name}PerSecond`);
|
||
|
if (perSecond > 0) {
|
||
|
const amount = 1000 / perSecond;
|
||
|
const toAdd = Math.floor(queued / amount);
|
||
|
setValue(name, getValue(name) + toAdd);
|
||
|
updateDisplay();
|
||
|
queued -= toAdd * amount;
|
||
|
} else {
|
||
|
queued = 0;
|
||
|
}
|
||
|
return queued;
|
||
|
};
|
||
|
|
||
|
const update = (ts) => {
|
||
|
requestAnimationFrame(update);
|
||
|
|
||
|
const diff = ts - lastUpdate;
|
||
|
petsQueued += diff;
|
||
|
barksQueued += diff;
|
||
|
kissesQueued += diff;
|
||
|
|
||
|
petsQueued = checkQueue("pets", petsQueued);
|
||
|
barksQueued = checkQueue("barks", barksQueued);
|
||
|
kissesQueued = checkQueue("kisses", kissesQueued);
|
||
|
|
||
|
lastUpdate = ts;
|
||
|
};
|
||
|
|
||
|
requestAnimationFrame(update);
|
||
|
})();
|