cookie clicker but bigger
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

1677 rindas
38 KiB

  1. "use strict";
  2. const start_color = "#882222";
  3. const end_color = "#228888";
  4. //const range = chroma.scale([start_color, end_color]).mode("lab");
  5. const range = chroma.cubehelix().scale().domain([-0.2, 1]).mode("lab");
  6. // literally just stealing these from cookie clicker
  7. const tiers = [
  8. "#fffeff",
  9. "#fa8ce3",
  10. "#00dffe",
  11. "#ffca32",
  12. "#e8d676",
  13. "#a7c091",
  14. "#6c5759",
  15. "#d4c1bc",
  16. "#9bb637",
  17. "#05ddf8",
  18. "#b76133",
  19. "#e1dfde"
  20. ]
  21. const resourceTypes = {
  22. "food": {
  23. name: "food",
  24. generated: true
  25. },
  26. "powerups": {
  27. name: "power crystals",
  28. generated: false
  29. }
  30. }
  31. deepFreeze(resourceTypes);
  32. const buildings = {
  33. "micro": {
  34. "name": "Micro",
  35. "plural": "Micros",
  36. "desc": "A tasty, squirmy treat.",
  37. "cost": {
  38. "food": 1e1
  39. },
  40. "prod": {
  41. "food": 1e-1 / 1
  42. },
  43. "icon": "fa-universal-access"
  44. },
  45. "anthro": {
  46. "name": "Anthro",
  47. "plural": "Anthros",
  48. "desc": "Something more substantial to sate your hunger.",
  49. "cost": {
  50. "food": 1e2
  51. },
  52. "prod": {
  53. "food": 1e0 / 1.1
  54. },
  55. "icon": "fa-male"
  56. },
  57. "car": {
  58. "name": "Car",
  59. "plural": "Cars",
  60. "desc": "Crunchy shell, tasty center.",
  61. "cost": {
  62. "food": 1.2e3
  63. },
  64. "prod": {
  65. "food": 1e1 / 1.2
  66. },
  67. "icon": "fa-car"
  68. },
  69. "bus": {
  70. "name": "Bus",
  71. "plural": "Buses",
  72. "desc": "Probably the worst place to be when a macro is aroud.",
  73. "cost": {
  74. "food": 1.4e4
  75. },
  76. "prod": {
  77. "food": 1e2 / 1.3
  78. },
  79. "icon": "fa-bus"
  80. },
  81. "house": {
  82. "name": "House",
  83. "plural": "Houses",
  84. "desc": "Home sweet home - but it doesn't taste sweet?",
  85. "cost": {
  86. "food": 1.6e5
  87. },
  88. "prod": {
  89. "food": 1e3 / 1.4
  90. },
  91. "icon": "fa-home"
  92. },
  93. "apartment": {
  94. "name": "Apartment",
  95. "plural": "Apartments",
  96. "desc": "More snacks, less packaging.",
  97. "cost": {
  98. "food": 1.8e6
  99. },
  100. "prod": {
  101. "food": 1e4 / 1.5
  102. },
  103. "icon": "fa-building"
  104. },
  105. "block": {
  106. "name": "Block",
  107. "plural": "Blocks",
  108. "desc": "A whole pile of buildings.",
  109. "cost": {
  110. "food": 2e7
  111. },
  112. "prod": {
  113. "food": 1e5 / 1.6
  114. },
  115. "icon": "fa-warehouse"
  116. },
  117. "town": {
  118. "name": "Town",
  119. "plural": "Towns",
  120. "desc": "'Tourist trap' has never been this literal.",
  121. "cost": {
  122. "food": 2.2e8
  123. },
  124. "prod": {
  125. "food": 1e6 / 1.7
  126. },
  127. "icon": "fa-store"
  128. },
  129. "city": {
  130. "name": "City",
  131. "plural": "Cities",
  132. "desc": "Please no sitty on our city.",
  133. "cost": {
  134. "food": 2.4e9
  135. },
  136. "prod": {
  137. "food": 1e7 / 1.8
  138. },
  139. "icon": "fa-city"
  140. },
  141. "metro": {
  142. "name": "Metropolis",
  143. "plural": "Metropolises",
  144. "desc": "A big ol' city. Tasty, too.",
  145. "cost": {
  146. "food": 2.6e10
  147. },
  148. "prod": {
  149. "food": 1e8 / 1.9
  150. },
  151. "icon": "fa-landmark"
  152. },
  153. "county": {
  154. "name": "County",
  155. "plural": "Counties",
  156. "desc": "Why salt the land when you can slurp it?",
  157. "cost": {
  158. "food": 2.8e11
  159. },
  160. "prod": {
  161. "food": 1e9 / 2
  162. },
  163. "icon": "fa-map"
  164. },
  165. "state": {
  166. "name": "State",
  167. "plural": "States",
  168. "desc": "The United States is made up of...43 states - no, 42...",
  169. "cost": {
  170. "food": 3e12
  171. },
  172. "prod": {
  173. "food": 1e10 / 2.1
  174. },
  175. "icon": "fa-map-signs"
  176. },
  177. "country": {
  178. "name": "Country",
  179. "plural": "Countries",
  180. "desc": "One nation, under paw.",
  181. "cost": {
  182. "food": 3.2e13
  183. },
  184. "prod": {
  185. "food": 1e11 / 2.2
  186. },
  187. "icon": "fa-flag"
  188. },
  189. "continent": {
  190. "name": "Continent",
  191. "plural": "Continents",
  192. "desc": "Earth-shattering appetite!",
  193. "cost": {
  194. "food": 3.4e14
  195. },
  196. "prod": {
  197. "food": 1e12 / 2.3
  198. },
  199. "icon": "fa-mountain"
  200. },
  201. "planet": {
  202. "name": "Planet",
  203. "plural": "Planets",
  204. "desc": "Earth appetite!",
  205. "cost": {
  206. "food": 3.6e15
  207. },
  208. "prod": {
  209. "food": 1e13 / 2.4
  210. },
  211. "icon": "fa-globe-europe"
  212. },
  213. "solar-system": {
  214. "name": "Solar System",
  215. "plural": "Solar Systems",
  216. "desc": "Earths appetite!",
  217. "cost": {
  218. "food": 3.8e16
  219. },
  220. "prod": {
  221. "food": 1e14 / 2.5
  222. },
  223. "icon": "fa-meteor"
  224. },
  225. "galaxy": {
  226. "name": "Galaxy",
  227. "plural": "Galaxies",
  228. "desc": "In a galaxy far, far down your gullet...",
  229. "cost": {
  230. "food": 4.0e17
  231. },
  232. "prod": {
  233. "food": 1e15 / 2.6
  234. },
  235. "icon": "fa-sun"
  236. },
  237. "universe": {
  238. "name": "Universe",
  239. "plural": "Universes",
  240. "desc": "Into the you-verse.",
  241. "cost": {
  242. "food": 4.2e18
  243. },
  244. "prod": {
  245. "food": 1e16 / 2.7
  246. },
  247. "icon": "fa-asterisk"
  248. },
  249. "multiverse": {
  250. "name": "Multiverse",
  251. "plural": "Multiverses",
  252. "desc": "This is getting very silly.",
  253. "cost": {
  254. "food": 4.4e19
  255. },
  256. "prod": {
  257. "food": 1e17 / 2.8
  258. },
  259. "icon": "fa-infinity"
  260. }
  261. }
  262. deepFreeze(buildings);
  263. const effect_types = {
  264. "prod": {
  265. "apply": function (effect, productivity) {
  266. return scaleCost(productivity, effect.amount);
  267. },
  268. "desc": function (effect) {
  269. return round(effect.amount, 2) + "x food production from " + buildings[effect.target].plural;
  270. }
  271. },
  272. "prod-all": {
  273. "apply": function (effect, productivity) {
  274. return scaleCost(productivity, effect.amount);
  275. },
  276. "desc": function (effect) {
  277. return round((effect.amount - 1) * 100) + "% increase to food production";
  278. }
  279. },
  280. "helper": {
  281. "apply": function (effect, productivity, helperCount) {
  282. return scaleCost(productivity, 1 + effect.amount * helperCount);
  283. },
  284. "desc": function (effect) {
  285. return "+" + round(effect.amount * 100) + "% food/sec from " + buildings[effect.helped].name + " for every " + buildings[effect.helper].name + " owned.";
  286. }
  287. },
  288. "click": {
  289. "apply": function (effect, bonus, productivity) {
  290. return bonus + productivity * effect.amount;
  291. },
  292. "desc": function (effect) {
  293. return round(effect.amount * 100) + "% of food/sec gained per click";
  294. }
  295. },
  296. "click-victim": {
  297. "desc": function (effect) {
  298. return "Devour larger prey";
  299. }
  300. },
  301. "powerup-freq": {
  302. "apply": function (effect, delay) {
  303. return delay * effect.amount;
  304. },
  305. "desc": function (effect) {
  306. return "Speed up powerup spawns by " + Math.round((1 / effect.amount - 1) * 100) + "%";
  307. }
  308. }
  309. }
  310. deepFreeze(effect_types);
  311. let upgrades = {
  312. }
  313. function createTemplateUpgrades() {
  314. createProdUpgrades();
  315. createProdAllUpgrades();
  316. createClickUpgrades();
  317. createHelperUpgrades();
  318. createClickVictimUpgrades();
  319. createPowerupFreqUpgrades();
  320. createFreeBuildingPowerups();
  321. createNews();
  322. deepFreeze(upgrades);
  323. deepFreeze(powerups);
  324. deepFreeze(news);
  325. }
  326. const prodUpgradeCounts = [1, 25, 50, 100, 150];
  327. const prodUpgradeColors = range.colors(5);
  328. function createProdUpgrades() {
  329. for (const [key, value] of Object.entries(prodUpgradeText)) {
  330. let counter = 1;
  331. let prefix = key + "-prod-";
  332. for (let contents of value) {
  333. upgrades[prefix + counter] = {
  334. "name": contents.name,
  335. "desc": contents.desc,
  336. "icon": [
  337. { icon: buildings[key].icon, color: tiers[counter - 1] }
  338. ],
  339. "cost": {
  340. "food": buildings[key].cost.food * 5 * Math.pow(10, counter - 1)
  341. },
  342. "effects": [
  343. {
  344. "type": "prod",
  345. "amount": 2 + (counter - 1) * 0.25,
  346. "target": key
  347. }
  348. ]
  349. };
  350. upgrades[prefix + counter]["prereqs"] = {};
  351. upgrades[prefix + counter]["prereqs"]["buildings"] = {};
  352. upgrades[prefix + counter]["prereqs"]["buildings"][key] = prodUpgradeCounts[counter - 1];
  353. if (counter > 1) {
  354. upgrades[prefix + counter]["prereqs"]["upgrades"] = [
  355. prefix + (counter - 1)
  356. ];
  357. }
  358. counter += 1;
  359. }
  360. }
  361. }
  362. const prodAllUpgradeColors = range.colors(10)
  363. function createProdAllUpgrades() {
  364. let prefix = "prod-all-"
  365. let counter = 1;
  366. for (let contents of prodAllUpgradeText) {
  367. upgrades[prefix + counter] = {
  368. "name": contents.name,
  369. "desc": contents.desc,
  370. "icon": [
  371. { icon: "fa-cogs", color: tiers[counter - 1] }
  372. ],
  373. "cost": {
  374. "food": 5 * Math.pow(10, counter + 1)
  375. },
  376. "effects": [
  377. {
  378. "type": "prod-all",
  379. "amount": 1.05
  380. }
  381. ],
  382. "prereqs": {
  383. "productivity": {
  384. "food": Math.pow(10, counter)
  385. }
  386. }
  387. };
  388. if (counter > 1) {
  389. upgrades[prefix + counter]["prereqs"].upgrades = [
  390. prefix + (counter - 1)
  391. ];
  392. }
  393. counter += 1;
  394. }
  395. }
  396. const clickUpgradeColors = range.colors(10);
  397. function createClickUpgrades() {
  398. let prefix = "prod-click-";
  399. let counter = 1;
  400. for (let contents of clickUpgradeText) {
  401. upgrades[prefix + counter] = {
  402. name: contents.name,
  403. desc: contents.desc,
  404. icon: [
  405. { icon: "fa-hand-pointer", color: tiers[counter - 1] }
  406. ],
  407. cost: {
  408. food: Math.pow(10, (counter * 2) + 1)
  409. },
  410. effects: [
  411. {
  412. type: "click",
  413. amount: 0.01
  414. }
  415. ],
  416. prereqs: {
  417. productivity: {
  418. food: Math.pow(10, counter)
  419. }
  420. }
  421. };
  422. if (counter > 1) {
  423. upgrades[prefix + counter]["prereqs"].upgrades = [
  424. prefix + (counter - 1)
  425. ];
  426. }
  427. counter += 1;
  428. }
  429. }
  430. const helperUpgradeColors = range.colors(3);
  431. function createHelperUpgrades() {
  432. const infix = "-help-";
  433. let previousHelped = undefined;
  434. Object.entries(helperUpgradeText).forEach(([helper, helpees]) => {
  435. const prefix = helper;
  436. Object.entries(helpees).forEach(([helped, texts]) => {
  437. const suffix = helped;
  438. let counter = 1;
  439. for (let text of texts) {
  440. const key = prefix + infix + suffix + "-" + counter;
  441. upgrades[key] = {
  442. "name": text.name,
  443. "desc": text.desc,
  444. "icon": [
  445. { icon: "fa-hand-holding", color: "black" },
  446. { icon: buildings[helped].icon, color: tiers[counter - 1], transform: "scale(0.5, 0.5) translate(0, -30px)" }
  447. ],
  448. "cost": {
  449. "food": buildings[helper].cost.food * 25 * counter + buildings[helped].cost.food * 50 * counter
  450. },
  451. "effects": [
  452. {
  453. "type": "helper",
  454. "helper": helper,
  455. "helped": helped,
  456. "amount": 0.01 * counter
  457. }
  458. ],
  459. "prereqs": {
  460. "buildings": {
  461. },
  462. "upgrades": [
  463. helper + "-prod-1"
  464. ]
  465. }
  466. };
  467. upgrades[key]["prereqs"]["buildings"][helper] = 10 * counter;
  468. upgrades[key]["prereqs"]["buildings"][helped] = 1;
  469. if (counter > 1) {
  470. upgrades[key]["prereqs"]["upgrades"].push(prefix + infix + suffix + "-" + (counter - 1))
  471. }
  472. if (previousHelped !== undefined && counter == 1) {
  473. upgrades[key]["prereqs"]["upgrades"].push(prefix + infix + previousHelped + "-" + "1")
  474. }
  475. counter += 1;
  476. }
  477. previousHelped = helped;
  478. });
  479. });
  480. }
  481. const clickVictimUpgradeColors = range.colors(Object.keys(buildings).length - 1);
  482. function createClickVictimUpgrades() {
  483. const prefix = "click-";
  484. let counter = 1;
  485. let previous = "micro";
  486. Object.entries(clickVictimUpgradeText).forEach(([key, text]) => {
  487. let newColor = clickVictimUpgradeColors[counter - 1] + "dd";
  488. upgrades[prefix + key] = {
  489. "name": text.name,
  490. "desc": text.desc,
  491. "icon": [
  492. { icon: buildings[key].icon, color: "#eee" },
  493. { icon: "fa-hand-pointer", color: newColor, transform: "scale(0.75, 0.75) translate(20px, 20px) rotate(-15deg)" }
  494. ],
  495. "cost": {
  496. "food": 1000 * Math.pow(10, counter)
  497. },
  498. "effects": [
  499. {
  500. "type": "click-victim",
  501. "id": key
  502. }
  503. ],
  504. "prereqs": {
  505. "upgrades": [
  506. ]
  507. }
  508. };
  509. if (counter > 1) {
  510. upgrades[prefix + key].prereqs.upgrades.push(prefix + previous);
  511. }
  512. counter += 1;
  513. previous = key;
  514. });
  515. }
  516. const powerupFreqColors = range.colors(5);
  517. function createPowerupFreqUpgrades() {
  518. const prefix = "powerup-freq-";
  519. let counter = 1;
  520. powerupFreqUpgradeText.forEach(text => {
  521. upgrades[prefix + counter] = {
  522. "name": text.name,
  523. "desc": text.desc,
  524. "icon": [
  525. { icon: "fa-drumstick-bite", color: tiers[counter - 1] }
  526. ],
  527. "cost": {
  528. "food": Math.pow(10, counter+3),
  529. "powerups": Math.pow(counter, 2)
  530. },
  531. "effects": [
  532. {
  533. "type": "powerup-freq",
  534. "id": prefix + counter,
  535. "amount": 0.75 + 0.03 * (counter - 1)
  536. }
  537. ],
  538. "prereqs": {
  539. "upgrades": [
  540. ],
  541. "stats": {
  542. "powerups": 1
  543. }
  544. }
  545. };
  546. if (counter > 1) {
  547. upgrades[prefix + counter].prereqs.upgrades.push(prefix + (counter - 1));
  548. }
  549. counter += 1;
  550. });
  551. }
  552. let prodUpgradeText = {
  553. "micro": [
  554. {
  555. "name": "Bigger Micros",
  556. "desc": "A macro micro? It's more filling, for sure.",
  557. },
  558. {
  559. "name": "Beefy Micros",
  560. "desc": "25% more protein, 10% fewer carbs."
  561. },
  562. {
  563. "name": "Delicious Micros",
  564. "desc": "Betcha' can't eat just one."
  565. },
  566. {
  567. "name": "Irresistable Micros",
  568. "desc": "Genetically engineered to be delectable."
  569. },
  570. {
  571. "name": "Exquisite Micros",
  572. "desc": "Dangerously delicious."
  573. }
  574. ],
  575. "anthro": [
  576. {
  577. "name": "Willing Prey",
  578. "desc": "Why bother chasing down your meal?"
  579. },
  580. {
  581. "name": "Fattened Prey",
  582. "desc": "9 calories per gram!"
  583. },
  584. {
  585. "name": "Mesmerized Prey",
  586. "desc": "Why bother walking to your meal?"
  587. },
  588. {
  589. "name": "Food-Safe Lubricant",
  590. "desc": "Ease them down your gullet with ease. Thanks, chemistry!"
  591. },
  592. {
  593. "name": "Mandatory Meal Training",
  594. "desc": "Educating prey on basic food etiquette helps reduce maw congestion and speeds digestion by 27%."
  595. }
  596. ],
  597. "car": [
  598. {
  599. "name": "HOV Lane",
  600. "desc": "Think of the environment! And of your impending digestion, I guess."
  601. },
  602. {
  603. "name": "Lightweight Frames",
  604. "desc": "Although crunchy, the shell around the snacks isn't very appetizing."
  605. },
  606. {
  607. "name": "Traffic Engineering",
  608. "desc": "Maximizing throughput into your gullet."
  609. },
  610. {
  611. "name": "Super Highways",
  612. "desc": "Six lanes! Fresh pavement! A ravenous maw!"
  613. },
  614. {
  615. "name": "Stacked Cars",
  616. "desc": "When we couldn't make the roads any wider, we tried stacking the cars higher."
  617. }
  618. ],
  619. "bus": [
  620. {
  621. "name": "Bus Passes",
  622. "desc": "Save on greenhouse emissions. Save your predator's effort. Everyone wins!"
  623. },
  624. {
  625. "name": "Double Deckers",
  626. "desc": "Stack 'em up! Slurp 'em down!"
  627. },
  628. {
  629. "name": "Articulated Buses",
  630. "desc": "The bend really helps them slip down your throat."
  631. },
  632. {
  633. "name": "Tour Buses",
  634. "desc": "People come from around the world to see your intestinal tract.",
  635. },
  636. {
  637. "name": "Double Double Deckers",
  638. "desc": "Hard to swallow, true, but filling nonetheless."
  639. }
  640. ],
  641. "house": [
  642. {
  643. "name": "Second Story",
  644. "desc": "Twice as many snacks, half as much chewing."
  645. },
  646. {
  647. "name": "Remodeling",
  648. "desc": "Strip out that icky asbestos."
  649. },
  650. {
  651. "name": "Smaller Yards",
  652. "desc": "Less wasted space. More wasted homes."
  653. },
  654. {
  655. "name": "House Parties",
  656. "desc": "More people! More party! More prey!"
  657. },
  658. {
  659. "name": "Suburbia",
  660. "desc": "It's like a buffet line!"
  661. }
  662. ],
  663. "apartment": [
  664. {
  665. "name": "Rent Subsidies",
  666. "desc": "Encourage high-density living. Enjoy the result."
  667. },
  668. {
  669. "name": "High-Rises",
  670. "desc": "These sure are some Tilted Towers..."
  671. },
  672. {
  673. "name": "Reverse Eviction",
  674. "desc": "Forcibly putting people IN your lunch!"
  675. },
  676. {
  677. "name": "Higher High-Rises",
  678. "desc": "Almost as tall as you! Almost."
  679. },
  680. {
  681. "name": "Vertical Beds",
  682. "desc": "You can fit way more people in a studio apartment with this one weird tip..."
  683. }
  684. ],
  685. "block": [
  686. {
  687. "name": "Street Sweepers",
  688. "desc": "Keeps the gunk off the sidewalk, and thus, off your tongue."
  689. },
  690. {
  691. "name": "Zoning Laws",
  692. "desc": "Mandatory prey-per-square-meter requirements."
  693. },
  694. {
  695. "name": "Alleyway Appetizers",
  696. "desc": "You can fit people *between* the buildings."
  697. },
  698. {
  699. "name": "Block Party",
  700. "desc": "Everyone's invited!"
  701. },
  702. {
  703. "name": "Vertical Blocks",
  704. "desc": "There's no reason you can't stack them on top of each other, right?"
  705. }
  706. ],
  707. "town": [
  708. {
  709. "name": "Going to Town",
  710. "desc": "That's where the food is."
  711. },
  712. {
  713. "name": "Going to Town, II: Revelations",
  714. "desc": "That's where the food is, again."
  715. },
  716. {
  717. "name": "Going to Town 0: Origins",
  718. "desc": "That's where the food was."
  719. },
  720. {
  721. "name": "Going to Town III: Revengeance",
  722. "desc": "Look, it's just how nature works. Food gets ate."
  723. },
  724. {
  725. "name": "Going to Town IV: Endgame",
  726. "desc": "Food IS something one considers when eating the universe."
  727. }
  728. ],
  729. "city": [
  730. {
  731. "name": "Gridlock",
  732. "desc": "Keeps people within arm's reach."
  733. },
  734. {
  735. "name": "Skyscrapers",
  736. "desc": "Corn on the cob? Corn on the cob."
  737. },
  738. {
  739. "name": "Protest March",
  740. "desc": "\"We have rights!\" chants the crowd. Unfortunately, they also have calories."
  741. },
  742. {
  743. "name": "Urban Sprawl",
  744. "desc": "What a lovely spread of Hors d'oeuvres!"
  745. },
  746. {
  747. "name": "Sim City",
  748. "desc": "You wouldn't download a city."
  749. }
  750. ],
  751. "metro": [
  752. {
  753. "name": "Suburbia",
  754. "desc": "As far as the eye can see!"
  755. },
  756. {
  757. "name": "Mass Transit",
  758. "desc": "Mass transit? Ass transit."
  759. },
  760. {
  761. "name": "Slackened Building Codes",
  762. "desc": "Who cares about things over 'overcrowding'?"
  763. },
  764. {
  765. "name": "Over-Ground Subway",
  766. "desc": "Putting the subway above-ground makes it a *lot* easier to feed on."
  767. },
  768. {
  769. "name": "No Building Codes",
  770. "desc": "Just cram people inside."
  771. }
  772. ],
  773. "county": [
  774. {
  775. "name": "County Roads",
  776. "desc": "Eh, close enough."
  777. },
  778. {
  779. "name": "Redistricting",
  780. "desc": "Optimize your snacking excursions."
  781. },
  782. {
  783. "name": "Peoplesheds",
  784. "desc": "Like watersheds, but, you know, people."
  785. },
  786. {
  787. "name": "Economic Stimulus",
  788. "desc": "Just kidding! It's just an excuse to devour more people."
  789. },
  790. {
  791. "name": "Giant Pile of People",
  792. "desc": "Literally no pretenses anymore. You're just eating big piles of people."
  793. }
  794. ],
  795. "state": [
  796. {
  797. "name": "States' Rights",
  798. "desc": "...to feed you lots and lots of people."
  799. },
  800. {
  801. "name": "Interstate Commerce",
  802. "desc": "Exports: People. Imports: Not people."
  803. },
  804. {
  805. "name": "Gerrymandering",
  806. "desc": "Unethical? Yes. Illegal? Maybe. Delicious? Absolutely!"
  807. },
  808. {
  809. "name": "State of Hunger",
  810. "desc": "It's a regional emergency! Feed the poor beast!"
  811. },
  812. {
  813. "name": "Arcologies",
  814. "desc": "Just put everyone in one building. One big building."
  815. }
  816. ],
  817. "country": [
  818. {
  819. "name": "Country Roads",
  820. "desc": "Take me hooooooome / to the plaaaaaace / where GULP."
  821. },
  822. {
  823. "name": "Election Mawnth",
  824. "desc": "Get out the vote! Get in the monster!"
  825. },
  826. {
  827. "name": "Voretime Economy",
  828. "desc": "Better than a wartime economy."
  829. },
  830. {
  831. "name": "Two-Party Stomach",
  832. "desc": "We take the parties, and we put them in the stomach. Truly bipartisan!"
  833. },
  834. {
  835. "name": "Civil Vore",
  836. "desc": "I ran out of puns."
  837. },
  838. ],
  839. "continent": [
  840. {
  841. "name": "Continental Drift",
  842. "desc": "Drifting right into your mouth."
  843. },
  844. {
  845. "name": "Queso",
  846. "desc": "To go with the continent chips."
  847. },
  848. {
  849. "name": "More Queso",
  850. "desc": "To go with the queso and the continent chips."
  851. },
  852. {
  853. "name": "Pangaea",
  854. "desc": "It's like a BIG corn chip."
  855. },
  856. {
  857. "name": "Extra Dip",
  858. "desc": "MORE."
  859. }
  860. ],
  861. "planet": [
  862. {
  863. "name": "Flat Earth Rebuttal",
  864. "desc": "A flat earth wouldn't have the chewy center."
  865. },
  866. {
  867. "name": "Extra Quarters",
  868. "desc": "To put in the gumball machine."
  869. },
  870. {
  871. "name": "Earth-Like Planets",
  872. "desc": "They're a *lot* easier to eat than the gas giants."
  873. },
  874. {
  875. "name": "Ringworlds",
  876. "desc": "They're artificial, yes, but they're very nutritious."
  877. },
  878. {
  879. "name": "BFG",
  880. "desc": "The Big Fucking Gumball"
  881. }
  882. ],
  883. "solar-system": [
  884. {
  885. "name": "Sol Survivor",
  886. "desc": "Just kidding! Sol didn't survive."
  887. },
  888. {
  889. "name": "Solar Snacks",
  890. "desc": "Betcha' can't just eat one."
  891. },
  892. {
  893. "name": "Orbital Plain",
  894. "desc": "Sometimes you just want the vanilla flavor."
  895. },
  896. {
  897. "name": "Comet Cruncher",
  898. "desc": "A refreshing icy treat."
  899. },
  900. {
  901. "name": "Vorrery",
  902. "desc": "Orrery. Vorrery. Heh."
  903. }
  904. ],
  905. "galaxy": [
  906. {
  907. "name": "Galactic Hitman",
  908. "desc": "You're basically a hitman, right? You're taking people out."
  909. },
  910. {
  911. "name": "Mass Effect",
  912. "desc": "All of the mass you're eating is gonna have an effect on your waistline."
  913. },
  914. {
  915. "name": "Star Vores",
  916. "desc": "Munch."
  917. },
  918. {
  919. "name": "Star Citizens",
  920. "desc": "I'm sure we'll get to eat them eventually."
  921. },
  922. {
  923. "name": "Good Old Galaxies",
  924. "desc": "There are some great gems out there."
  925. }
  926. ],
  927. "universe": [
  928. {
  929. "name": "Universal Healthcare",
  930. "desc": "Gotta keep everyone in peak condition, right?"
  931. },
  932. {
  933. "name": "Big Crunch",
  934. "desc": "A heckin cromch."
  935. },
  936. {
  937. "name": "Bigger Cosmological Constant",
  938. "desc": "I don't know what this does, but it sure makes things tastier!"
  939. },
  940. {
  941. "name": "Big Bang 2",
  942. "desc": "If the big bang was so good..."
  943. },
  944. {
  945. "name": "Spacetime Salad",
  946. "desc": "Don't forget the quantum salt!"
  947. }
  948. ],
  949. "multiverse": [
  950. {
  951. "name": "Theory of Everything",
  952. "desc": "My theory: everything is edible."
  953. },
  954. {
  955. "name": "Extradimensional Fork",
  956. "desc": "To eat the multiverses with, duh."
  957. },
  958. {
  959. "name": "Multi-Multiverses",
  960. "desc": "Eh, why not?"
  961. },
  962. {
  963. "name": "More Food",
  964. "desc": "We're running out of ideas here."
  965. },
  966. {
  967. "name": "Gorge 2",
  968. "desc": "Coming Soon™"
  969. }
  970. ],
  971. }
  972. let prodAllUpgradeText = [
  973. {
  974. "name": "Sloth Metabolism",
  975. "desc": "Burn those calories. Eventually."
  976. },
  977. {
  978. "name": "Decent Metabolism",
  979. "desc": "Picking up the pace."
  980. },
  981. {
  982. "name": "Perky Metabolism",
  983. "desc": "Sweat a little."
  984. },
  985. {
  986. "name": "Quick Metabolism",
  987. "desc": "Burn those calories."
  988. },
  989. {
  990. "name": "Speedy Metabolism",
  991. "desc": "More prey, more power."
  992. },
  993. {
  994. "name": "Fast Metabolism",
  995. "desc": "You're a furnace. Fueled by people."
  996. },
  997. {
  998. "name": "Powerful Metabolism",
  999. "desc": "Digest them all."
  1000. },
  1001. {
  1002. "name": "Unbelievable Metabolism",
  1003. "desc": "Digest them all and more."
  1004. },
  1005. {
  1006. "name": "Supernatural Metabolism",
  1007. "desc": "Digest everything."
  1008. },
  1009. {
  1010. "name": "Godly Metabolism",
  1011. "desc": "Digest."
  1012. }
  1013. ]
  1014. const clickUpgradeText = [
  1015. {
  1016. "name": "Grabby Hands",
  1017. "desc": "Gathers prey, opens rooftops"
  1018. },
  1019. {
  1020. "name": "Long Tongue",
  1021. "desc": "Catches stragglers, tastes architecture"
  1022. },
  1023. {
  1024. "name": "Sharp Eyes",
  1025. "desc": "Spots snacks, probably unblinking"
  1026. },
  1027. {
  1028. "name": "Sensitive Nose",
  1029. "desc": "Sniffs meals, savors scents"
  1030. },
  1031. {
  1032. "name": "Sensitive Ears",
  1033. "desc": "Hears screams, finds leftovers"
  1034. },
  1035. {
  1036. "name": "Greedy Hands",
  1037. "desc": "Hoards prey, no leftovers"
  1038. },
  1039. {
  1040. "name": "Nimble Tongue",
  1041. "desc": "Snares snacks, without escape"
  1042. },
  1043. {
  1044. "name": "Eagle Eyes",
  1045. "desc": "Scans streets, always keen"
  1046. },
  1047. {
  1048. "name": "Keen Nose",
  1049. "desc": "Finds prey, never fooled"
  1050. },
  1051. {
  1052. "name": "Perfect Ears",
  1053. "desc": "Senses scuttles, won't relent"
  1054. },
  1055. ]
  1056. const helperUpgradeText = {
  1057. "anthro": {
  1058. "micro": [
  1059. {
  1060. "name": "Gatherers",
  1061. "desc": "Why bother chasing them, really?"
  1062. },
  1063. {
  1064. "name": "Servants",
  1065. "desc": "Why bother walking anywhere, really?"
  1066. }
  1067. ],
  1068. "car": [
  1069. {
  1070. name: "Drivers",
  1071. desc: "Better than a baby driver"
  1072. }
  1073. ],
  1074. bus: [
  1075. {
  1076. name: "Thank the bus driver",
  1077. desc: "Thank the bus driver"
  1078. }
  1079. ],
  1080. house: [
  1081. {
  1082. name: "Carpenters",
  1083. desc: "It's tool time!"
  1084. }
  1085. ],
  1086. apartment: [
  1087. {
  1088. name: "Landlords",
  1089. desc: "Eat 'em"
  1090. }
  1091. ],
  1092. block: [
  1093. {
  1094. name: "Inspectors",
  1095. desc: "Bringing everything up to code"
  1096. }
  1097. ],
  1098. town: [
  1099. {
  1100. name: "Mayors",
  1101. desc: "Vote!"
  1102. }
  1103. ],
  1104. city: [
  1105. {
  1106. name: "Councils",
  1107. desc: "Pass those ordinances"
  1108. }
  1109. ],
  1110. metro: [
  1111. {
  1112. name: "Urban Planners",
  1113. desc: "Blueprints? Chewprints."
  1114. }
  1115. ],
  1116. }
  1117. }
  1118. const clickVictimUpgradeText = {
  1119. "anthro": {
  1120. "name": "Same-Size Prey",
  1121. "desc": "Devour an anthro with every click"
  1122. },
  1123. "car": {
  1124. "name": "Car Crusher",
  1125. "desc": "Consume a car with every click"
  1126. },
  1127. "bus": {
  1128. "name": "Bus Buffet",
  1129. "desc": "Swallow an entire bus with every click"
  1130. },
  1131. "house": {
  1132. "name": "Homewrecker",
  1133. "desc": "Eat a home with every click"
  1134. },
  1135. "apartment": {
  1136. "name": "Rent-Seeker",
  1137. "desc": "Guzzle an apartment with every click"
  1138. },
  1139. "block": {
  1140. "name": "Block Breaker",
  1141. "desc": "Gulp an entire block with every click"
  1142. },
  1143. "town": {
  1144. "name": "Town Terrorizer",
  1145. "desc": "Bolt down a whole town with every click"
  1146. },
  1147. "city": {
  1148. "name": "City Cafe",
  1149. "desc": "Feast on an entire city with every click"
  1150. },
  1151. "metro": {
  1152. "name": "Metro Muncher",
  1153. "desc": "Polish off a metropolis with every click"
  1154. },
  1155. "county": {
  1156. "name": "County Glurk",
  1157. "desc": "Ingest an entire county with every click"
  1158. },
  1159. "state": {
  1160. "name": "Stomached State",
  1161. "desc": "Gobble an entire state with every click"
  1162. },
  1163. "country": {
  1164. "name": "Country Chow",
  1165. "desc": "Erase a country with every click"
  1166. },
  1167. "continent": {
  1168. "name": "Continental Drift",
  1169. "desc": "Chow down on a continent with every click"
  1170. },
  1171. "planet": {
  1172. "name": "Popcorn Planets",
  1173. "desc": "Ingest a planet whole with every click"
  1174. },
  1175. "solar-system": {
  1176. "name": "Solar Snacks",
  1177. "desc": "Dine on whole solar systems with every click"
  1178. },
  1179. "galaxy": {
  1180. "name": "Galactic Center",
  1181. "desc": "Dispatch a galaxy with every click"
  1182. },
  1183. "universe": {
  1184. "name": "Universal Predator",
  1185. "desc": "Digest a universe with every click"
  1186. },
  1187. "multiverse": {
  1188. "name": "Omniscience",
  1189. "desc": "Gorge on the multiverse"
  1190. }
  1191. };
  1192. const powerupFreqUpgradeText = [
  1193. {
  1194. name: "All-You-Can-Eat",
  1195. desc: "Pour on the powerups.",
  1196. },
  1197. {
  1198. name: "Buffet",
  1199. desc: "Chow down on more and more.",
  1200. },
  1201. {
  1202. name: "Bottomless Bowl",
  1203. desc: "Eat up!",
  1204. },
  1205. {
  1206. name: "Endless Edibles",
  1207. desc: "For every one you eat, two more appear.",
  1208. },
  1209. {
  1210. name: "UNLIMITED BREADSTICKS",
  1211. desc: "UNLIMITED BREADSTICKS",
  1212. }
  1213. ]
  1214. // to avoid yoinking stuff from global variables directly...
  1215. // state.ownedUpgrades == ownedUpgrades
  1216. // state.resources == resources
  1217. // state.currentProductivity == currentProductivity
  1218. // state.belongings == belongings
  1219. const news = [
  1220. {
  1221. condition: state => {
  1222. return true;
  1223. },
  1224. lines: [
  1225. state => "SPORTS!"
  1226. ]
  1227. }
  1228. ]
  1229. function createNews() {
  1230. createNewsFoodAmount();
  1231. createNewsStart();
  1232. createNewsFoodRate();
  1233. createNewsFoodRatePermanent();
  1234. createNewsBuildingCount();
  1235. }
  1236. function createNewsFoodAmount() {
  1237. }
  1238. function createNewsStart() {
  1239. let counter = 0;
  1240. for (let set of newsStartText) {
  1241. const factor = counter;
  1242. let cond;
  1243. cond = state => {
  1244. return state.currentProductivity.food < 5
  1245. }
  1246. news.push({
  1247. condition: cond,
  1248. lines: set
  1249. });
  1250. counter += 1;
  1251. };
  1252. }
  1253. function createNewsFoodRate() {
  1254. let counter = 0;
  1255. for (let set of newsFoodRateText) {
  1256. const factor = counter;
  1257. let cond;
  1258. if (counter + 1 == newsFoodRateText.length) {
  1259. cond = state => {
  1260. return state.currentProductivity.food >= 5*Math.pow(10, factor)
  1261. }
  1262. } else {
  1263. cond = state => {
  1264. return state.currentProductivity.food >= 5*Math.pow(10, factor) &&
  1265. state.currentProductivity.food < 5*Math.pow(10, (factor+1))
  1266. }
  1267. }
  1268. news.push({
  1269. condition: cond,
  1270. lines: set
  1271. });
  1272. counter += 1;
  1273. };
  1274. }
  1275. function createNewsFoodRatePermanent() {
  1276. let counter = 0;
  1277. for (let set of newsFoodRatePermanentText) {
  1278. const factor = counter;
  1279. let cond = state => {
  1280. return state.currentProductivity.food >= 5*Math.pow(10, factor)
  1281. }
  1282. news.push({
  1283. condition: cond,
  1284. lines: set
  1285. });
  1286. counter += 1;
  1287. };
  1288. }
  1289. function createNewsBuildingCount() {
  1290. Object.entries(newsBuildingCountText).forEach(([key, sets]) => {
  1291. for (let [i, set] of sets.entries()) {
  1292. const conditions = [];
  1293. conditions.push(state => state.belongings[key].count >= newsBuildingCountCutoffs[i]);
  1294. news.push({
  1295. condition: state => conditions.every(cond => cond(state)),
  1296. lines: set
  1297. })
  1298. }
  1299. });
  1300. }
  1301. const newsBuildingCountCutoffs = [
  1302. 1,
  1303. 25,
  1304. 50,
  1305. 100,
  1306. 150,
  1307. 200,
  1308. 300,
  1309. 400,
  1310. 500
  1311. ]
  1312. const newsStartText = [
  1313. state => "This just in: Everything is fine",
  1314. state => "\"Kinda hungry ngl,\" tweets " + macroDesc.name,
  1315. state => "There are no giant monsters!"
  1316. ]
  1317. const newsFoodRateText = [
  1318. [
  1319. state => "Your neighbors are complaining about the noise",
  1320. state => "You are a very hungry caterpillar",
  1321. state => "You're hungry enough to eat an entire burger"
  1322. ],
  1323. [
  1324. state => "You ate your neighbors",
  1325. state => "Your former neighbors' neighbors are complaining about the noise",
  1326. state => "You're hungry enough to eat a whole turkey",
  1327. ],
  1328. [
  1329. state => "You no longer have any neighbors",
  1330. state => "You're hungry enough to eat a whole person"
  1331. ],
  1332. [
  1333. state => "You're hungry enough to eat a whole bunch of people"
  1334. ],
  1335. [
  1336. state => "You're hungry enough to eat a LOT of people"
  1337. ],
  1338. [
  1339. state => "You're very hungry"
  1340. ]
  1341. ]
  1342. const newsFoodRatePermanentText = [
  1343. [
  1344. state => "Should we be concerned by " + macroDesc.name + "'s ever-growing hunger? \"No,\" says local " + macroDesc.species + "."
  1345. ],
  1346. [
  1347. state => weekday() + " night football game cancelled due to " + macroDesc.species + " slobbering all over the field."
  1348. ],
  1349. [
  1350. state => weekday() + " night football game cancelled due to " + macroDesc.species + " eating everyone involved."
  1351. ]
  1352. ]
  1353. const newsBuildingCountText = {
  1354. micro: [
  1355. [
  1356. state => "Micro-only diet: fad or fact? Our experts weigh in.",
  1357. state => "\"What's the deal with micros, anyway?\" asks local comedian."
  1358. ],
  1359. [
  1360. state => "\"I don't have a problem,\" says macro eating " + showBuilding("micro") + " per second",
  1361. state => "\"Isn't it weird how macros eat so many micros?\" asked confused citizen. \"Like, doesn't that mean they're double micros?\""
  1362. ],
  1363. [
  1364. state => "Local macro celebrated for cleaning up the \"unending tide\" of micros",
  1365. ],
  1366. [
  1367. state => "That's a lot of micros."
  1368. ]
  1369. ],
  1370. anthro: [
  1371. [
  1372. state => "\"Nobody liked those guys anyway\" - few people concerned about " + macroDesc.name + "'s newly-acquired taste for people"
  1373. ],
  1374. [
  1375. state => "#FeedThe" + capitalize(macroDesc.species) + " is trending on Twitter."
  1376. ],
  1377. [
  1378. state => "\"average person eats 3 people a year\" factoid actualy just statistical error. average person eats 0 people per year. Peoples " + macroDesc.name + ", who lives on planet & eats over " + 8640 * belongings.anthro.count + " each day, is an outlier adn should not have been counted"
  1379. ],
  1380. [
  1381. state => "A new study finds that " + macroDesc.name + " has, indeed, eaten everyone."
  1382. ],
  1383. [
  1384. state => "A newer study finds that " + macroDesc.name + " has, actually eaten everyone <i>TWICE</i>."
  1385. ]
  1386. ],
  1387. car: [
  1388. [
  1389. state => "Car insurance premiums up " + (state.belongings.car.count * 3 + 12) + "%. Why? Our experts weigh in."
  1390. ]
  1391. ],
  1392. bus: [
  1393. [
  1394. state => "Macro craze fuels explosion in bus ridership."
  1395. ],
  1396. [
  1397. state => "Isn't it kind of weird how well-designed buses are for macros? Like, really. I saw a " + macroDesc.name + " stick one up " + macroDesc.proPossessive + " a-"
  1398. ]
  1399. ],
  1400. house: [
  1401. [
  1402. state => "Property values skyrocket as the huge " + macroDesc.species + " starts munching on buildings."
  1403. ],
  1404. [
  1405. state => "\"Full House\" eclipsed by new sitcom, \"Full Of House\""
  1406. ]
  1407. ],
  1408. apartment: [
  1409. [
  1410. state => "Construction is booming thanks to the macro's thooming"
  1411. ]
  1412. ],
  1413. block: [
  1414. [
  1415. state => "BLOCK PARTY! WOOO!"
  1416. ]
  1417. ],
  1418. town: [
  1419. [
  1420. state => "Yes, we get it. " + macroDesc.name + " is going to town. Good one."
  1421. ]
  1422. ],
  1423. city: [
  1424. [
  1425. state => "Public opinion remains indifferent about consumption of whole cities - \"downtown was kind of ugly; someone had to take intiative,\" claims local citizen."
  1426. ]
  1427. ],
  1428. metro: [
  1429. [
  1430. state => "What is a metro? Why did " + macroDesc.name + " start eating them? Our experts weigh in."
  1431. ]
  1432. ],
  1433. county: [
  1434. [
  1435. state => "\"Obviously,\" says an unfazed governor, \"we didn't really need that many counties. No need to worry.\""
  1436. ]
  1437. ],
  1438. state: [
  1439. [
  1440. state => "\"Obviously,\" says an unfazed governor, \"we were planning to move the capital to " + macroDesc.name + "'s digestive tract all along. No need to worry.\""
  1441. ]
  1442. ],
  1443. country: [
  1444. [
  1445. state => "State governor realizes the entire country got ate; sources report that he is \"mildly fazed\"."
  1446. ]
  1447. ],
  1448. continent: [
  1449. [
  1450. state => "Tonight at 11: Multiple reports from Australia that the continent \"ƃoʇ qloopʎ ɐʇǝ\". Why? Our experts weigh in."
  1451. ]
  1452. ],
  1453. planet: [
  1454. [
  1455. state => "The Earth has been eaten. Everyone on it has been eaten.",
  1456. state => macroDesc.name + " has eaten the entire planet."
  1457. ]
  1458. ],
  1459. "solar-system": [
  1460. [
  1461. state => "Scientists propose new \"" + macroDesc.name + " Unit\" to replace the outdated Astronomical Unit."
  1462. ]
  1463. ],
  1464. galaxy: [
  1465. [
  1466. state => "\"Please stop telling us that this is Star Vores\", pleads an exasperated news anchor. \"We know.\""
  1467. ]
  1468. ],
  1469. universe: [
  1470. [
  1471. state => "Decades of scientific speculation have been abruptly resolved by the Big " + macroDesc.name + " Theory."
  1472. ]
  1473. ],
  1474. multiverse: [
  1475. [
  1476. state => "BIG munch"
  1477. ]
  1478. ],
  1479. }
  1480. const powerups = {
  1481. "instant-food": {
  1482. name: "Free Food",
  1483. description: "Tasty!",
  1484. icon: "fa-drumstick-bite",
  1485. prereqs: state => true,
  1486. effect: state => state.resources.food += state.currentProductivity.food * 300,
  1487. popup: (self, e) => {
  1488. clickPopup("GULP!", "gulp", [e.clientX, e.clientY]);
  1489. clickPopup("+300 seconds of food", "food", [e.clientX, e.clientY]);
  1490. }
  1491. },
  1492. "double": {
  1493. name: "Double Dip",
  1494. description: "Quintupled productivity!",
  1495. icon: "fa-cogs",
  1496. duration: 30000,
  1497. prereqs: state => true,
  1498. effect: state => state.currentProductivity.food *= 5,
  1499. popup: (self, e) => {
  1500. clickPopup("VROOM!", "gulp", [e.clientX, e.clientY]);
  1501. }
  1502. },
  1503. "click": {
  1504. name: "Chaos Click",
  1505. description: "A hundred times the clicking!",
  1506. icon: "fa-hand-pointer",
  1507. duration: 20000,
  1508. prereqs: state => true,
  1509. effect: state => state.clickPowers.clickMultiplier *= 100,
  1510. popup: (self, e) => clickPopup("CLICK TIME!!", "gulp", [e.clientX, e.clientY])
  1511. }
  1512. }
  1513. function createFreeBuildingPowerups() {
  1514. const prefix = "free-";
  1515. Object.entries(freeBuildingPowerupText).forEach(([building, text]) => {
  1516. const key = prefix + building;
  1517. powerups[key] = {
  1518. name: text.name,
  1519. description: text.desc,
  1520. icon: buildings[building].icon,
  1521. prereqs: state => state.belongings[building].count > 0 && state.belongings[building].count < 100,
  1522. effect: state => state.belongings[building].count += 1,
  1523. popup: (self, e) => clickPopup("+1 " + buildings[building].name, "food", [e.clientX, e.clientY])
  1524. }
  1525. });
  1526. }
  1527. const freeBuildingPowerupText = {
  1528. car: {
  1529. name: "Free Car",
  1530. desc: "It's FREE!"
  1531. },
  1532. bus: {
  1533. name: "Deserted Bus",
  1534. desc: "Just kidding. It's full of people."
  1535. }
  1536. }
  1537. const statTypes = {
  1538. powerups: {
  1539. name: "Powerups Clicked"
  1540. },
  1541. seconds: {
  1542. name: "Seconds Played"
  1543. },
  1544. clicks: {
  1545. name: "Clicks"
  1546. },
  1547. foodClicked: {
  1548. name: "Food from clicks"
  1549. },
  1550. food: {
  1551. name: "Total food"
  1552. }
  1553. }
  1554. const options = {
  1555. name: {
  1556. name: "Name",
  1557. type: "text",
  1558. set: value => macroDesc.name = value,
  1559. get: () => macroDesc.name
  1560. },
  1561. species: {
  1562. name: "Species",
  1563. type: "text",
  1564. set: value => macroDesc.species = value,
  1565. get: () => macroDesc.species
  1566. },
  1567. subject: {
  1568. name: "Subject pronoun (e.g. he/she)",
  1569. type: "text",
  1570. set: value => macroDesc.proSubject = value,
  1571. get: () => macroDesc.proSubject
  1572. },
  1573. possessive: {
  1574. name: "Possessive pronoun (e.g. his/her)",
  1575. type: "text",
  1576. set: value => macroDesc.proPossessive = value,
  1577. get: () => macroDesc.proPossessive
  1578. },
  1579. object: {
  1580. name: "Object pronoun (e.g. him/her)",
  1581. type: "text",
  1582. set: value => macroDesc.proObject = value,
  1583. get: () => macroDesc.proObject
  1584. }
  1585. }
  1586. deepFreeze(prodUpgradeText);
  1587. deepFreeze(prodAllUpgradeText);
  1588. deepFreeze(clickUpgradeText);
  1589. deepFreeze(helperUpgradeText);
  1590. deepFreeze(clickVictimUpgradeText);
  1591. deepFreeze(powerupFreqUpgradeText);