|  | "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);
}
 |