cookie clicker but bigger
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

277 lines
6.7 KiB

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