cookie clicker but bigger
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

253 lignes
6.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 costOfBuilding(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 = costOfBuilding(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. document.getElementById("productivity").innerText = (Math.round(calculateProductivity() * 10) / 10) + " food/sec";
  46. }
  47. function displayBuildings() {
  48. for (const [key, value] of Object.entries(belongings)) {
  49. document.querySelector("#building-" + key + " > .building-button-name").innerText = value.count + " " + (value.count == 1 ? buildings[key].name : buildings[key].plural);
  50. document.querySelector("#building-" + key + " > .building-button-cost").innerText = costOfBuilding(key) + " food";
  51. if (costOfBuilding(key) > resources.food) {
  52. document.querySelector("#building-" + key).classList.add("building-button-disabled");
  53. } else {
  54. document.querySelector("#building-" + key).classList.remove("building-button-disabled");
  55. }
  56. }
  57. }
  58. function canAfford(cost) {
  59. console.log(cost)
  60. for (const [resource, amount] of Object.entries(cost)) {
  61. if (resources[resource] < amount) {
  62. return false;
  63. }
  64. }
  65. return true;
  66. }
  67. function spend(cost) {
  68. for (const [resource, amount] of Object.entries(cost)) {
  69. resources[resource] -= amount;
  70. }
  71. }
  72. function displayUpgrades() {
  73. for (const [key, value] of Object.entries(upgrades)) {
  74. let button = document.querySelector("#upgrade-" + key);
  75. if (ownedUpgrades[key]) {
  76. button.style.display = "none";
  77. return;
  78. }
  79. if (canAfford(upgrades[key].cost)) {
  80. button.classList.remove("upgrade-button-inactive");
  81. } else {
  82. button.classList.add("upgrade-button-inactive");
  83. }
  84. }
  85. }
  86. function buyUpgrade(id) {
  87. if (ownedUpgrades[id]) {
  88. return;
  89. }
  90. let upgrade = upgrades[id];
  91. if (!canAfford(upgrade.cost)) {
  92. return;
  93. }
  94. spend(upgrade.cost);
  95. ownedUpgrades[id] = true;
  96. }
  97. function eatMicro() {
  98. resources.food += 1;
  99. }
  100. // setup stuff lol
  101. // we'll initialize the dict of buildings we can own
  102. function setup() {
  103. initializeData();
  104. createButtons();
  105. registerListeners();
  106. }
  107. function initializeData() {
  108. for (const [key, value] of Object.entries(buildings)) {
  109. belongings[key] = {};
  110. belongings[key].count = 0;
  111. }
  112. for (const [key, value] of Object.entries(upgrades)) {
  113. ownedUpgrades[key] = false;
  114. }
  115. }
  116. function registerListeners() {
  117. document.querySelectorAll(".building-button").forEach(function(button) {
  118. let id = button.id.replace("building-", "");
  119. button.addEventListener("click", function() { buyBuilding(id); });
  120. });
  121. document.querySelector("#tasty-micro").addEventListener("click", eatMicro);
  122. }
  123. function createButtons() {
  124. createBuildings();
  125. createUpgrades();
  126. }
  127. function createBuildings() {
  128. let container = document.querySelector("#buildings-area");
  129. for (const [key, value] of Object.entries(buildings)) {
  130. let button = document.createElement("div");
  131. button.classList.add("building-button");
  132. button.id = "building-" + key;
  133. let buttonName = document.createElement("div");
  134. buttonName.classList.add("building-button-name");
  135. let buttonCost = document.createElement("div");
  136. buttonCost.classList.add("building-button-cost");
  137. button.appendChild(buttonName);
  138. button.appendChild(buttonCost);
  139. container.appendChild(button);
  140. }
  141. }
  142. function renderCost(cost) {
  143. let list = [];
  144. for (const [key, value] of Object.entries(cost)) {
  145. list.push(value + " " + resourceTypes[key].name);
  146. }
  147. return list.join(", ");
  148. }
  149. function upgradeTooltip(id, event) {
  150. let tooltip = document.querySelector("#upgrade-tooltip");
  151. tooltip.style.setProperty("display", "block");
  152. let tooltipDesc = document.querySelector("#upgrade-tooltip-desc");
  153. tooltipDesc.innerText = upgrades[id].desc;
  154. let tooltipEffect = document.querySelector("#upgrade-tooltip-effect");
  155. tooltipEffect.innerText = upgrade_types[upgrades[id].effect.type].desc(buildings[upgrades[id].effect.target].name);
  156. let tooltipCost = document.querySelector("#upgrade-tooltip-cost");
  157. tooltipCost.innerText = renderCost(upgrades[id].cost);
  158. let yOffset = tooltip.parentElement.getBoundingClientRect().y;
  159. let yTrans = Math.round(event.clientY - yOffset);
  160. tooltip.style.setProperty("transform", "translate(-220px, " + yTrans + "px)");
  161. }
  162. function upgradeTooltipRemove() {
  163. let tooltip = document.querySelector("#upgrade-tooltip");
  164. tooltip.style.setProperty("display", "none");
  165. }
  166. function createUpgrades() {
  167. let container = document.querySelector("#upgrades-list");
  168. for (const [key, value] of Object.entries(upgrades)) {
  169. let button = document.createElement("div");
  170. button.classList.add("upgrade-button");
  171. button.id = "upgrade-" + key;
  172. let buttonName = document.createElement("div");
  173. buttonName.classList.add("upgrade-button-name");
  174. buttonName.innerText = value.name;
  175. button.appendChild(buttonName);
  176. button.addEventListener("mousemove", function(e) { upgradeTooltip(key, e); });
  177. button.addEventListener("mouseleave", function() { upgradeTooltipRemove(); });
  178. button.addEventListener("click", function() { buyUpgrade(key); });
  179. container.appendChild(button);
  180. }
  181. }
  182. window.onload = function() {
  183. setup();
  184. setTimeout(updateResources, 1000/updateRate);
  185. }