cookie clicker but bigger
Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 
 
 

211 linhas
5.1 KiB

  1. "use strict";
  2. let belongings = {};
  3. let ownedUpgrades = [];
  4. let resources = {
  5. "food": 0
  6. };
  7. let updateRate = 60;
  8. function calculateProductivity() {
  9. let productivity = 0;
  10. for (const [key, value] of Object.entries(belongings)) {
  11. productivity += productivityOf(key);
  12. }
  13. return productivity;
  14. }
  15. // here's where upgrades will go :3
  16. function productivityOf(type) {
  17. let baseProd = buildings[type].prod;
  18. return baseProd * belongings[type].count;
  19. }
  20. function costOf(type) {
  21. let baseCost = buildings[type].cost
  22. let countCost = baseCost * Math.pow(1.15, belongings[type].count);
  23. return Math.round(countCost);
  24. }
  25. function buyBuilding(type) {
  26. let cost = costOf(type);
  27. if (resources.food > cost) {
  28. belongings[type].count += 1;
  29. resources.food -= cost;
  30. }
  31. }
  32. // update stuff
  33. function updateResources() {
  34. addResources();
  35. displayResources();
  36. displayBuildings();
  37. displayUpgrades();
  38. setTimeout(updateResources, 1000/updateRate);
  39. }
  40. function addResources() {
  41. resources.food += calculateProductivity() * 1 / updateRate;
  42. }
  43. function displayResources() {
  44. document.getElementById("resource-food").innerText = "Food: " + render(resources.food);
  45. }
  46. function displayBuildings() {
  47. for (const [key, value] of Object.entries(belongings)) {
  48. document.querySelector("#building-" + key + " > .building-button-name").innerText = value.count + " " + buildings[key].name + (value.count == 1 ? "" : "s");
  49. document.querySelector("#building-" + key + " > .building-button-cost").innerText = costOf(key) + " food";
  50. }
  51. }
  52. function displayUpgrades() {
  53. for (const [key, value] of Object.entries(upgrades)) {
  54. let button = document.querySelector("#upgrade-" + key);
  55. let valid = true;
  56. for (const [resource, amount] of Object.entries(upgrades[key].cost)) {
  57. if (resources[resource] < amount) {
  58. valid = false;
  59. break;
  60. }
  61. }
  62. if (valid) {
  63. button.classList.remove("upgrade-button-inactive");
  64. } else {
  65. button.classList.add("upgrade-button-inactive");
  66. }
  67. }
  68. }
  69. function eatMicro() {
  70. resources.food += 1;
  71. }
  72. // setup stuff lol
  73. // we'll initialize the dict of buildings we can own
  74. function setup() {
  75. initializeData();
  76. createButtons();
  77. registerListeners();
  78. }
  79. function initializeData() {
  80. for (const [key, value] of Object.entries(buildings)) {
  81. belongings[key] = {};
  82. belongings[key].count = 0;
  83. }
  84. }
  85. function registerListeners() {
  86. document.querySelectorAll(".building-button").forEach(function(button) {
  87. let id = button.id.replace("building-", "");
  88. button.addEventListener("click", function() { buyBuilding(id); });
  89. });
  90. document.querySelector("#tasty-micro").addEventListener("click", eatMicro);
  91. }
  92. function createButtons() {
  93. createBuildings();
  94. createUpgrades();
  95. }
  96. function createBuildings() {
  97. let container = document.querySelector("#buildings-area");
  98. for (const [key, value] of Object.entries(buildings)) {
  99. let button = document.createElement("div");
  100. button.classList.add("building-button");
  101. button.id = "building-" + key;
  102. let buttonName = document.createElement("div");
  103. buttonName.classList.add("building-button-name");
  104. let buttonCost = document.createElement("div");
  105. buttonCost.classList.add("building-button-cost");
  106. button.appendChild(buttonName);
  107. button.appendChild(buttonCost);
  108. container.appendChild(button);
  109. }
  110. }
  111. function renderCost(cost) {
  112. let list = [];
  113. for (const [key, value] of Object.entries(cost)) {
  114. list.push(value + " " + resourceTypes[key].name);
  115. }
  116. return list.join(", ");
  117. }
  118. function upgradeTooltip(id, event) {
  119. let tooltip = document.querySelector("#upgrade-tooltip");
  120. tooltip.style.setProperty("display", "block");
  121. let tooltipDesc = document.querySelector("#upgrade-tooltip-desc");
  122. tooltipDesc.innerText = upgrades[id].desc;
  123. let tooltipEffect = document.querySelector("#upgrade-tooltip-effect");
  124. tooltipEffect.innerText = upgrade_types[upgrades[id].effect.type].desc(buildings[upgrades[id].effect.target].name);
  125. let tooltipCost = document.querySelector("#upgrade-tooltip-cost");
  126. tooltipCost.innerText = renderCost(upgrades[id].cost);
  127. let yOffset = tooltip.parentElement.getBoundingClientRect().y;
  128. let yTrans = Math.round(event.clientY - yOffset);
  129. tooltip.style.setProperty("transform", "translate(-220px, " + yTrans + "px)");
  130. }
  131. function upgradeTooltipRemove() {
  132. let tooltip = document.querySelector("#upgrade-tooltip");
  133. tooltip.style.setProperty("display", "none");
  134. }
  135. function createUpgrades() {
  136. let container = document.querySelector("#upgrades-list");
  137. for (const [key, value] of Object.entries(upgrades)) {
  138. let button = document.createElement("div");
  139. button.classList.add("upgrade-button");
  140. button.id = "upgrade-" + key;
  141. let buttonName = document.createElement("div");
  142. buttonName.classList.add("upgrade-button-name");
  143. buttonName.innerText = value.name;
  144. button.appendChild(buttonName);
  145. button.addEventListener("mousemove", function(e) { upgradeTooltip(key, event); });
  146. button.addEventListener("mouseleave", function() { upgradeTooltipRemove(); });
  147. container.appendChild(button);
  148. }
  149. }
  150. window.onload = function() {
  151. setup();
  152. setTimeout(updateResources, 1000/updateRate);
  153. }