"use strict"; let belongings = {}; let ownedUpgrades = {}; let remainingUpgrades = []; let resources = {}; let updateRate = 60; function calculateProductivity() { let productivity = 0; for (const [key, value] of Object.entries(belongings)) { productivity += productivityOf(key); } return productivity; } // here's where upgrades will go :3 function productivityOf(type) { let baseProd = buildings[type].prod; for (const [key, value] of Object.entries(upgrades)) { if (!ownedUpgrades[key]) { continue; } if (value.effect.type == "prod-2x") { if (value.effect.target == type) { baseProd *= 2; } } } return baseProd * belongings[type].count; } function costOfBuilding(type) { let baseCost = buildings[type].cost let countCost = baseCost * Math.pow(1.15, belongings[type].count); return Math.round(countCost); } function buyBuilding(type) { let cost = costOfBuilding(type); if (resources.food >= cost) { belongings[type].count += 1; resources.food -= cost; } } // update stuff function updateResources() { addResources(); displayResources(); displayBuildings(); displayUpgrades(); setTimeout(updateResources, 1000/updateRate); } function addResources() { resources.food += calculateProductivity() * 1 / updateRate; } function displayResources() { document.getElementById("resource-food").innerText = "Food: " + render(resources.food); document.getElementById("productivity").innerText = (Math.round(calculateProductivity() * 10) / 10) + " food/sec"; } function displayBuildings() { for (const [key, value] of Object.entries(belongings)) { let button = document.querySelector("#building-" + key); document.querySelector("#building-" + key + " > .building-button-name").innerText = value.count + " " + (value.count == 1 ? buildings[key].name : buildings[key].plural); document.querySelector("#building-" + key + " > .building-button-cost").innerText = costOfBuilding(key) + " food"; if (costOfBuilding(key) > resources.food) { button.classList.add("building-button-disabled"); } else { button.classList.remove("building-button-disabled"); } } } function canAfford(cost) { for (const [resource, amount] of Object.entries(cost)) { if (resources[resource] < amount) { return false; } } return true; } function spend(cost) { for (const [resource, amount] of Object.entries(cost)) { resources[resource] -= amount; } } function displayUpgrades() { for (let id of remainingUpgrades) { let button = document.querySelector("#upgrade-" + id); if (ownedUpgrades[id]) { button.style.display = "none"; continue; } if (upgradeAvailable(id)) { button.classList.remove("upgrade-button-inactive"); } else { button.classList.add("upgrade-button-inactive"); } } // now we throw out stuff for (let i = remainingUpgrades.length-1; i >= 0; i--) { if (ownedUpgrades[remainingUpgrades[i]]) { remainingUpgrades.splice(i, 1); } } } function buyUpgrade(id) { if (ownedUpgrades[id]) { return; } let upgrade = upgrades[id]; if (!canAfford(upgrade.cost)) { return; } spend(upgrade.cost); ownedUpgrades[id] = true; } function eatMicro() { resources.food += 1; } // setup stuff lol // we'll initialize the dict of buildings we can own function setup() { initializeData(); createButtons(); createDisplays(); registerListeners(); } function initializeData() { for (const [key, value] of Object.entries(buildings)) { belongings[key] = {}; belongings[key].count = 0; } for (const [key, value] of Object.entries(upgrades)) { ownedUpgrades[key] = false; } } function registerListeners() { document.querySelectorAll(".building-button").forEach(function(button) { let id = button.id.replace("building-", ""); button.addEventListener("click", function() { buyBuilding(id); }); }); document.querySelector("#tasty-micro").addEventListener("click", eatMicro); } function createButtons() { createBuildings(); createUpgrades(); } function createBuildings() { let container = document.querySelector("#buildings-area"); for (const [key, value] of Object.entries(buildings)) { let button = document.createElement("div"); button.classList.add("building-button"); button.id = "building-" + key; let buttonName = document.createElement("div"); buttonName.classList.add("building-button-name"); let buttonCost = document.createElement("div"); buttonCost.classList.add("building-button-cost"); button.appendChild(buttonName); button.appendChild(buttonCost); container.appendChild(button); } } function upgradeAvailable(id) { if (ownedUpgrades[id]) { return false; } if (!canAfford(upgrades[id].cost)) { return false; } for (const [type, reqs] of Object.entries(upgrades[id].prereqs)) { if (type == "buildings") { for (const [building, amount] of Object.entries(upgrades[id].prereqs[type])) { if (belongings[building].count < amount) { return false; } } } } return true; } function createUpgrades() { let container = document.querySelector("#upgrades-list"); for (const [key, value] of Object.entries(upgrades)) { remainingUpgrades.push(key); let button = document.createElement("div"); button.classList.add("upgrade-button"); button.id = "upgrade-" + key; let buttonName = document.createElement("div"); buttonName.classList.add("upgrade-button-name"); buttonName.innerText = value.name; button.appendChild(buttonName); button.addEventListener("mousemove", function(e) { upgradeTooltip(key, e); }); button.addEventListener("mouseleave", function() { upgradeTooltipRemove(); }); button.addEventListener("click", function() { buyUpgrade(key); }); container.appendChild(button); } } function createDisplays() { let resourceList = document.querySelector("#resource-list"); for (const [key, value] of Object.entries(resourceTypes)) { resources[key] = 0; let line = document.createElement("div"); line.id = "resource-" + key; resourceList.appendChild(line); } } function renderLine(line) { let div = document.createElement("div"); div.innerText = line.text; if (line.valid !== undefined) { if (line.valid) { div.classList.add("cost-met"); } else { div.classList.add("cost-unmet"); } } return div; } function renderLines(lines) { let divs = []; for (let line of lines) { divs.push(renderLine(line)); } return divs; } function renderCost(cost) { let list = []; list.push({ "text": "Cost:" }); for (const [key, value] of Object.entries(cost)) { list.push({ "text": value + " " + resourceTypes[key].name, "valid": resources[key] >= value }); } return renderLines(list); } function renderPrereqs(prereqs) { let list = []; list.push({ "text": "Own:" }); for (const [key, value] of Object.entries(prereqs)) { if (key == "buildings") { for (const [id, amount] of Object.entries(prereqs.buildings)) { list.push({ "text": buildings[id].name + " x" + amount, "valid": belongings[id].count >= amount }); } } } return renderLines(list); } function upgradeTooltip(id, event) { let tooltip = document.querySelector("#upgrade-tooltip"); tooltip.style.setProperty("display", "block"); let tooltipDesc = document.querySelector("#upgrade-tooltip-desc"); tooltipDesc.innerText = upgrades[id].desc; let tooltipEffect = document.querySelector("#upgrade-tooltip-effect"); tooltipEffect.innerText = upgrade_types[upgrades[id].effect.type].desc(buildings[upgrades[id].effect.target].name); let tooltipCost = document.querySelector("#upgrade-tooltip-cost"); replaceChildren(tooltipCost, renderCost(upgrades[id].cost)); let tooltipPrereqs = document.querySelector("#upgrade-tooltip-prereqs"); replaceChildren(tooltipPrereqs, renderPrereqs(upgrades[id].prereqs)); let yOffset = tooltip.parentElement.getBoundingClientRect().y; let yTrans = Math.round(event.clientY - yOffset); tooltip.style.setProperty("transform", "translate(-220px, " + yTrans + "px)"); } function upgradeTooltipRemove() { let tooltip = document.querySelector("#upgrade-tooltip"); tooltip.style.setProperty("display", "none"); } window.onload = function() { setup(); setTimeout(updateResources, 1000/updateRate); }