RubixYT1

incrementallity textwall v1.4.2

Mar 15th, 2026 (edited)
146
1
Never
13
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 46.91 KB | None | 1 0
  1. (async function IncrementalityGame() {
  2. /* ═══════════════════════════════════════════════
  3. INCREMENTALLITY v1.4.2
  4. ═══════════════════════════════════════════════ */
  5.  
  6. await new Promise((res, rej) => {
  7. if (typeof Decimal !== "undefined") return res();
  8. const s = document.createElement("script");
  9. s.src = "https://cdn.jsdelivr.net/npm/break_eternity.js";
  10. s.onload = res;
  11. s.onerror = () => {
  12. const s2 = document.createElement("script");
  13. s2.src = "https://unpkg.com/break_eternity.js";
  14. s2.onload = res;
  15. s2.onerror = rej;
  16. document.head.appendChild(s2);
  17. };
  18. document.head.appendChild(s);
  19. });
  20.  
  21. const D = v => new Decimal(v);
  22.  
  23. const COOLDOWN = 5;
  24. const WIN_W = 60;
  25. const WIN_H = 24;
  26. const UPG_PER_PAGE = 3;
  27.  
  28. let running = false;
  29. let stopped = false;
  30. let points = D(0);
  31. let pointGain = D(1);
  32. let gx = 0, gy = 0;
  33. let selfSending = false;
  34. let currentPage = 1;
  35. let renderBusy = false;
  36. let automationOn = false;
  37. let boosterOn = false;
  38. let fullAutoOn = false;
  39. let rbPointBoost = false;
  40. let rbDoubler = false;
  41. let rbX2Level = 0;
  42. let rebirths = 0;
  43. let increments = D(0);
  44. let greaterGainMul = D(1);
  45. const timers = [];
  46. const rebirthPages = [];
  47.  
  48. /* ══════════════════════════════════════
  49. SOFTCAP SYSTEM
  50. ══════════════════════════════════════
  51. Thresholds per upgrade level:
  52. softcap = base * 50
  53. softcap^2 = base * 500
  54. softcap^3 = base * 5000
  55. hardcap = base * 50000
  56.  
  57. At softcap: cost scaling *= 2
  58. At softcap^2: cost scaling *= 4
  59. At softcap^3: cost scaling *= 8
  60. At hardcap: cannot buy more
  61.  
  62. For prestige (increment) gains:
  63. softcap at 1e20 Inc earned
  64. softcap^2 at 1e40
  65. softcap^3 at 1e60
  66. hardcap at 1e80
  67. */
  68.  
  69. const SOFTCAP_THRESHOLDS = {
  70. 1: { sc:50, sc2:500, sc3:5000, hc:50000 },
  71. 2: { sc:30, sc2:300, sc3:3000, hc:30000 },
  72. 3: { sc:40, sc2:400, sc3:4000, hc:40000 },
  73. 4: { sc:1, sc2:1, sc3:1, hc:1 },
  74. 5: { sc:20, sc2:200, sc3:2000, hc:20000 },
  75. 6: { sc:1, sc2:1, sc3:1, hc:1 },
  76. 7: { sc:25, sc2:250, sc3:2500, hc:25000 }
  77. };
  78.  
  79. const INC_SOFTCAPS = {
  80. sc: D("1e20"),
  81. sc2: D("1e40"),
  82. sc3: D("1e60"),
  83. hc: D("1e80")
  84. };
  85.  
  86. function getSoftcapLabel(upgId, level) {
  87. const t = SOFTCAP_THRESHOLDS[upgId];
  88. if (!t) return "";
  89. if (level >= t.hc) return " [HARDCAP]";
  90. if (level >= t.sc3) return " [SC^3]";
  91. if (level >= t.sc2) return " [SC^2]";
  92. if (level >= t.sc) return " [SC]";
  93. return "";
  94. }
  95.  
  96. function getCostMultiplier(upgId, level) {
  97. const t = SOFTCAP_THRESHOLDS[upgId];
  98. if (!t) return 1;
  99. if (level >= t.sc3) return 8;
  100. if (level >= t.sc2) return 4;
  101. if (level >= t.sc) return 2;
  102. return 1;
  103. }
  104.  
  105. function isHardcapped(upgId, level) {
  106. const t = SOFTCAP_THRESHOLDS[upgId];
  107. if (!t) return false;
  108. return level >= t.hc;
  109. }
  110.  
  111. function applyIncSoftcap(raw) {
  112. raw = D(raw);
  113. if (raw.gte(INC_SOFTCAPS.hc)) return INC_SOFTCAPS.hc;
  114. if (raw.gte(INC_SOFTCAPS.sc3)) {
  115. const over = raw.div(INC_SOFTCAPS.sc3);
  116. return INC_SOFTCAPS.sc3.mul(over.pow(0.125));
  117. }
  118. if (raw.gte(INC_SOFTCAPS.sc2)) {
  119. const over = raw.div(INC_SOFTCAPS.sc2);
  120. return INC_SOFTCAPS.sc2.mul(over.pow(0.25));
  121. }
  122. if (raw.gte(INC_SOFTCAPS.sc)) {
  123. const over = raw.div(INC_SOFTCAPS.sc);
  124. return INC_SOFTCAPS.sc.mul(over.pow(0.5));
  125. }
  126. return raw;
  127. }
  128.  
  129. function getIncSoftcapLabel(raw) {
  130. raw = D(raw);
  131. if (raw.gte(INC_SOFTCAPS.hc)) return " [HC]";
  132. if (raw.gte(INC_SOFTCAPS.sc3)) return " [SC^3]";
  133. if (raw.gte(INC_SOFTCAPS.sc2)) return " [SC^2]";
  134. if (raw.gte(INC_SOFTCAPS.sc)) return " [SC]";
  135. return "";
  136. }
  137.  
  138. function defaultUpgrades() {
  139. return [
  140. { id:1, name:"Increase point gain", cost:D(10), level:0, scaling:1.5, maxBuy:-1 },
  141. { id:2, name:"Multiplication (x3)", cost:D(50), level:0, scaling:2.5, maxBuy:-1 },
  142. { id:3, name:"Cheaper stuff (/1.5)", cost:D(100), level:0, scaling:3, maxBuy:-1 },
  143. { id:4, name:"Automation [ONE-TIME]", cost:D(1000), level:0, scaling:1, maxBuy:1 },
  144. { id:5, name:"Exponentiation (^1.1)", cost:D(17500), level:0, scaling:3, maxBuy:-1 },
  145. { id:6, name:"Booster [ONE-TIME]", cost:D(1e5), level:0, scaling:1, maxBuy:1 },
  146. { id:7, name:"Greater Gain (+25%)", cost:D(1e7), level:0, scaling:4, maxBuy:-1 }
  147. ];
  148. }
  149.  
  150. function defaultRebirthUpgrades() {
  151. return [
  152. { id:"R1", name:"Point Booster [1x]", cost:D(10), level:0, scaling:1, maxBuy:1,
  153. desc:"Boost pts by Inc count" },
  154. { id:"R2", name:"Full Automation [1x]", cost:D(30), level:0, scaling:1, maxBuy:1,
  155. desc:"Auto 50 lvls every 10s" },
  156. { id:"R3", name:"Doubler [1x]", cost:D(100), level:0, scaling:1, maxBuy:1,
  157. desc:"Double rebirth Inc gain" },
  158. { id:"R4", name:"x2 Rebirth Gain", cost:D(50), level:0, scaling:2.5, maxBuy:-1,
  159. desc:"x2 Inc gain (stacks)" }
  160. ];
  161. }
  162.  
  163. let upgrades = defaultUpgrades();
  164. let rebirthUpgrades = defaultRebirthUpgrades();
  165.  
  166. /* ══════════════════════════════════════
  167. HELPERS
  168. ══════════════════════════════════════ */
  169. const sleep = ms => new Promise(r => setTimeout(r, ms));
  170.  
  171. function formatNum(n) {
  172. n = D(n);
  173. if (n.isNan()) return "NaN";
  174. if (!n.isFinite()) return "Inf";
  175. if (n.eq(0)) return "0";
  176. if (n.lt(0)) return "-" + formatNum(n.neg());
  177. if (n.lt(1e4)) {
  178. const v = n.toNumber();
  179. if (Math.abs(v - Math.round(v)) < 0.005) return String(Math.round(v));
  180. return v.toFixed(2);
  181. }
  182. if (n.layer > 1) return n.toString();
  183. const exp = n.log10().floor();
  184. const man = n.div(Decimal.pow(10, exp));
  185. return man.toNumber().toFixed(2) + "e" + exp.toNumber();
  186. }
  187.  
  188. function roundCost(d) {
  189. d = D(d);
  190. if (d.lt(0.01)) return D(0.01);
  191. if (d.lt(1e13)) return D(Math.round(d.toNumber() * 100) / 100);
  192. return d.floor();
  193. }
  194.  
  195. function fit(s, ww) { return s.length >= ww ? s.slice(0, ww) : s.padEnd(ww); }
  196.  
  197. async function typeAt(str, color, x, y) {
  198. for (let i = 0; i < str.length; i++) {
  199. if (stopped) return;
  200. writeCharAt(str[i], color, x + i, y);
  201. await sleep(COOLDOWN);
  202. }
  203. }
  204.  
  205. async function chatSend(msg) {
  206. selfSending = true;
  207. try { w.chat.send(msg); } catch (_) {}
  208. await sleep(150);
  209. selfSending = false;
  210. }
  211.  
  212. function calcIncrements(pts) {
  213. pts = D(pts);
  214. if (pts.lt(1e10)) return D(0);
  215. const logP = pts.max(1).log10().toNumber();
  216. let earned = D(Math.floor(Math.pow(logP, 1.5) / 5));
  217. // R3 doubler
  218. if (rbDoubler) earned = earned.mul(2);
  219. // R4 x2 stacking
  220. if (rbX2Level > 0) earned = earned.mul(D(2).pow(rbX2Level));
  221. // softcap
  222. earned = applyIncSoftcap(earned);
  223. return earned;
  224. }
  225.  
  226. function calcRawIncrements(pts) {
  227. pts = D(pts);
  228. if (pts.lt(1e10)) return D(0);
  229. const logP = pts.max(1).log10().toNumber();
  230. let earned = D(Math.floor(Math.pow(logP, 1.5) / 5));
  231. if (rbDoubler) earned = earned.mul(2);
  232. if (rbX2Level > 0) earned = earned.mul(D(2).pow(rbX2Level));
  233. return earned;
  234. }
  235.  
  236. /* ══════════════════════════════════════════════════════
  237. RAW CHAT EXTRACTION — ALL USERS, EXHAUSTIVE
  238. ══════════════════════════════════════════════════════ */
  239. const dedupSet = new Map();
  240.  
  241. function processRaw(text, source) {
  242. if (!text || stopped || !running) return;
  243. text = String(text).trim();
  244. if (!text || text.length > 600) return;
  245.  
  246. // dedup
  247. const key = text.toLowerCase() + "|" + Math.floor(Date.now() / 900);
  248. if (dedupSet.has(key)) return;
  249. dedupSet.set(key, true);
  250. setTimeout(() => dedupSet.delete(key), 2500);
  251.  
  252. // log raw
  253. console.log(`[RAW ${source || "?"}] ${text}`);
  254.  
  255. // check for tilda pattern: anything ~ /command
  256. const tildaMatch = text.match(/^(.+?)\s*~\s*(.+)$/);
  257. if (tildaMatch) {
  258. const afterTilda = tildaMatch[2].trim();
  259. if (afterTilda.startsWith("/")) {
  260. console.log(`[CMD from tilda] ${afterTilda}`);
  261. handleCmd(afterTilda, tildaMatch[1].trim());
  262. return;
  263. }
  264. }
  265.  
  266. // extract message from common formats
  267. let user = "unknown";
  268. let msg = text;
  269. for (const pat of [
  270. /^([^:]{1,30}):\s*(.+)/,
  271. /^\[([^\]]{1,30})\]\s*(.+)/,
  272. /^<([^>]{1,30})>\s*(.+)/,
  273. /^(\S{1,30})\s*[»>]\s*(.+)/
  274. ]) {
  275. const m = text.match(pat);
  276. if (m) { user = m[1].trim(); msg = m[2].trim(); break; }
  277. }
  278.  
  279. if (!msg) return;
  280. console.log(`${user} ~ ${msg}`);
  281.  
  282. if (msg.startsWith("/")) handleCmd(msg, user);
  283. }
  284.  
  285. function extractField(d) {
  286. if (!d) return "";
  287. if (typeof d === "string") return d;
  288. return d.message || d.msg || d.text || d.content || d.body ||
  289. d.value || d.chat || d.line || d.raw ||
  290. (typeof d.data === "string" ? d.data : "") || "";
  291. }
  292.  
  293. function tryProcess(d, src) {
  294. if (!d) return;
  295. if (typeof d === "string") { processRaw(d, src); return; }
  296. const m = extractField(d);
  297. if (typeof m === "string" && m) processRaw(m, src);
  298. if (Array.isArray(d)) d.forEach(x => tryProcess(x, src));
  299. }
  300.  
  301. (function setupChat() {
  302.  
  303. /* 1 w.chat.send intercept */
  304. try {
  305. const real = w.chat.send.bind(w.chat);
  306. w.chat.send = function (m) {
  307. const r = real(m);
  308. if (!selfSending) processRaw(m, "send-hook");
  309. return r;
  310. };
  311. } catch (e) { console.warn("[Inc] hook-send:", e); }
  312.  
  313. /* 2 w.on multiple events */
  314. try {
  315. if (typeof w.on === "function")
  316. for (const ev of ["chat","message","receive","msg","data","say","talk","text"])
  317. try { w.on(ev, (...a) => a.forEach(x => tryProcess(x, "w.on-" + ev))); } catch (_) {}
  318. } catch (_) {}
  319.  
  320. /* 3 w.events */
  321. try {
  322. if (w.events) {
  323. const hookEm = em => {
  324. if (!em) return;
  325. if (typeof em.on === "function")
  326. for (const ev of ["chat","message","receive","msg","data"])
  327. try { em.on(ev, d => tryProcess(d, "events-" + ev)); } catch (_) {}
  328. if (typeof em.addEventListener === "function")
  329. for (const ev of ["chat","message"])
  330. try { em.addEventListener(ev, d => tryProcess(d, "events-ael-" + ev)); } catch (_) {}
  331. };
  332. if (typeof w.events === "function") try { hookEm(w.events()); } catch (_) {}
  333. hookEm(w.events);
  334. }
  335. } catch (_) {}
  336.  
  337. /* 4 w.chat.on */
  338. try {
  339. if (w.chat) {
  340. if (typeof w.chat.on === "function")
  341. for (const ev of ["message","receive","msg","data","chat","text"])
  342. try { w.chat.on(ev, d => tryProcess(d, "chat.on-" + ev)); } catch (_) {}
  343. if (typeof w.chat.addEventListener === "function")
  344. for (const ev of ["message","chat","data"])
  345. try { w.chat.addEventListener(ev, d => tryProcess(d, "chat.ael-" + ev)); } catch (_) {}
  346. }
  347. } catch (_) {}
  348.  
  349. /* 5 w.on numeric codes */
  350. try {
  351. if (typeof w.on === "function")
  352. for (let code = 0; code <= 30; code++)
  353. try {
  354. w.on(code, (...a) => {
  355. for (const item of a) {
  356. if (!item) continue;
  357. const s = typeof item === "string" ? item : extractField(item);
  358. if (s && typeof s === "string" && s.length > 0 && s.length < 500)
  359. processRaw(s, `w.on(${code})`);
  360. }
  361. });
  362. } catch (_) {}
  363. } catch (_) {}
  364.  
  365. /* 6 w.emit/trigger intercept */
  366. try {
  367. for (const fn of ["emit","trigger","fire","dispatch","publish","broadcast"]) {
  368. if (w[fn] && typeof w[fn] === "function") {
  369. const orig = w[fn].bind(w);
  370. w[fn] = function (evt, ...args) {
  371. const en = String(evt).toLowerCase();
  372. if (en.includes("chat") || en.includes("message") || en.includes("msg") || en.includes("say"))
  373. args.forEach(a => tryProcess(a, `w.${fn}-${evt}`));
  374. return orig(evt, ...args);
  375. };
  376. }
  377. }
  378. } catch (_) {}
  379.  
  380. /* 7 WebSocket */
  381. try {
  382. function hookWS(sock) {
  383. if (!sock || sock.__inc142) return;
  384. sock.__inc142 = true;
  385. sock.addEventListener("message", function (ev) {
  386. try {
  387. if (typeof ev.data === "string") {
  388. // raw first
  389. if (ev.data.length > 1 && ev.data.length < 500)
  390. processRaw(ev.data, "ws-raw");
  391. // also try json walk
  392. try { walk(JSON.parse(ev.data), "ws-json"); } catch (_) {}
  393. }
  394. } catch (_) {}
  395. });
  396. }
  397.  
  398. function walk(o, src) {
  399. if (!o) return;
  400. if (typeof o === "string") { if (o.length < 500) processRaw(o, src); return; }
  401. if (Array.isArray(o)) { o.forEach(x => walk(x, src)); return; }
  402. if (typeof o !== "object") return;
  403. const k = (o.kind || o.type || o.event || o.channel || o.action || o.cmd || o.op || "").toString().toLowerCase();
  404. if (k.includes("chat") || k.includes("message") || k.includes("msg") || k.includes("say") || k.includes("talk")) {
  405. const m = o.message || o.msg || o.text || o.content || o.body || o.value || o.line || o.raw || "";
  406. if (m) {
  407. const user = o.user || o.username || o.nick || o.nickname || o.sender || o.from || o.author || o.name || o.player || "";
  408. processRaw(user ? `${user}: ${m}` : String(m), src + "-walk");
  409. }
  410. }
  411. for (const fld of ["data","payload","events","messages","chat","result","results","items","list","entries","lines","logs"])
  412. if (o[fld]) {
  413. if (Array.isArray(o[fld])) o[fld].forEach(x => walk(x, src));
  414. else if (typeof o[fld] === "object") walk(o[fld], src);
  415. else if (typeof o[fld] === "string" && o[fld].length < 500) processRaw(o[fld], src + "-" + fld);
  416. }
  417. }
  418.  
  419. const socks = new Set();
  420. for (const k of ["socket","ws","conn","websocket","_socket","_ws","net","connection","sock","_conn","wss","io"]) {
  421. try { if (w[k] instanceof WebSocket) socks.add(w[k]); } catch (_) {}
  422. try { if (w[k] && w[k].socket instanceof WebSocket) socks.add(w[k].socket); } catch (_) {}
  423. try { if (w[k] && w[k].ws instanceof WebSocket) socks.add(w[k].ws); } catch (_) {}
  424. try { if (w[k] && w[k]._socket instanceof WebSocket) socks.add(w[k]._socket); } catch (_) {}
  425. }
  426. try { Object.keys(w).forEach(k => { try { if (w[k] instanceof WebSocket) socks.add(w[k]); } catch (_) {} }); } catch (_) {}
  427. try { Object.keys(window).forEach(k => { try { if (window[k] instanceof WebSocket) socks.add(window[k]); } catch (_) {} }); } catch (_) {}
  428. try {
  429. for (const gk of Object.keys(window))
  430. try {
  431. const obj = window[gk];
  432. if (obj && typeof obj === "object")
  433. for (const sk of Object.keys(obj))
  434. try { if (obj[sk] instanceof WebSocket) socks.add(obj[sk]); } catch (_) {}
  435. } catch (_) {}
  436. } catch (_) {}
  437. socks.forEach(hookWS);
  438.  
  439. const OrigWS = window.WebSocket;
  440. window.WebSocket = function (...a) {
  441. const s = new OrigWS(...a);
  442. setTimeout(() => hookWS(s), 50);
  443. return s;
  444. };
  445. window.WebSocket.prototype = OrigWS.prototype;
  446. for (const c of ["CONNECTING","OPEN","CLOSING","CLOSED"])
  447. window.WebSocket[c] = OrigWS[c];
  448. } catch (e) { console.warn("[Inc] hook-ws:", e); }
  449.  
  450. /* 8 XHR */
  451. try {
  452. const origOpen = XMLHttpRequest.prototype.open;
  453. const origSend = XMLHttpRequest.prototype.send;
  454. XMLHttpRequest.prototype.open = function (m, url, ...r) { this.__incUrl = url; return origOpen.call(this, m, url, ...r); };
  455. XMLHttpRequest.prototype.send = function (body) {
  456. this.addEventListener("load", function () {
  457. try {
  458. const url = (this.__incUrl || "").toLowerCase();
  459. if (url.includes("chat") || url.includes("message") || url.includes("msg")) {
  460. const txt = this.responseText;
  461. if (txt && txt.length < 5000) processRaw(txt, "xhr-raw");
  462. }
  463. } catch (_) {}
  464. });
  465. return origSend.call(this, body);
  466. };
  467. } catch (_) {}
  468.  
  469. /* 9 fetch */
  470. try {
  471. const origFetch = window.fetch;
  472. window.fetch = async function (url, ...rest) {
  473. const resp = await origFetch.call(this, url, ...rest);
  474. try {
  475. const urlStr = (typeof url === "string" ? url : url.url || "").toLowerCase();
  476. if (urlStr.includes("chat") || urlStr.includes("message"))
  477. resp.clone().text().then(txt => {
  478. if (txt && txt.length < 5000) processRaw(txt, "fetch-raw");
  479. }).catch(() => {});
  480. } catch (_) {}
  481. return resp;
  482. };
  483. } catch (_) {}
  484.  
  485. /* 10 DOM MutationObserver */
  486. try {
  487. const obs = new Set();
  488. const sels = [
  489. "#chat","#chatbox","#chat-messages",".chat-messages",
  490. "#chatOutput",".chatOutput","#chat_window","#chat_open",
  491. "#chat_messages",".chat-inner",".chat-log","#chat-log",
  492. ".messages","#messages",".chat-body","[data-chat]",
  493. "#chat-content",".chat-content","#chatlog",".chatlog",
  494. "#msg-container",".msg-container","#chat-area",".chat-area",
  495. "[class*='chat']","[id*='chat']","[class*='message']","[id*='message']"
  496. ];
  497. function observeEl(el) {
  498. if (obs.has(el)) return; obs.add(el);
  499. new MutationObserver(muts => {
  500. for (const m of muts)
  501. for (const nd of m.addedNodes) {
  502. const t = (nd.textContent || "").trim();
  503. if (t && t.length < 500) processRaw(t, "dom-obs");
  504. }
  505. }).observe(el, { childList: true, subtree: true });
  506. }
  507. sels.forEach(sel => { try { document.querySelectorAll(sel).forEach(observeEl); } catch (_) {} });
  508. setInterval(() => {
  509. sels.forEach(sel => { try { document.querySelectorAll(sel).forEach(observeEl); } catch (_) {} });
  510. }, 3000);
  511. } catch (_) {}
  512.  
  513. /* 11 DOM polling */
  514. let lastPoll = "";
  515. setInterval(() => {
  516. try {
  517. for (const sel of ["#chat","#chatbox",".chat-messages","#chat-messages","#chatlog",".chatlog"]) {
  518. const el = document.querySelector(sel);
  519. if (!el) continue;
  520. const cur = el.innerText || el.textContent || "";
  521. if (cur !== lastPoll && cur.length > lastPoll.length) {
  522. const diff = cur.slice(lastPoll.length).trim();
  523. lastPoll = cur;
  524. if (diff) diff.split("\n").forEach(l => { l = l.trim(); if (l) processRaw(l, "dom-poll"); });
  525. } else lastPoll = cur;
  526. break;
  527. }
  528. } catch (_) {}
  529. }, 350);
  530.  
  531. /* 12 Keyboard Enter */
  532. try {
  533. document.addEventListener("keydown", function (e) {
  534. if (e.key !== "Enter") return;
  535. const el = document.activeElement;
  536. if (!el) return;
  537. const tag = el.tagName.toLowerCase();
  538. if ((tag === "input" || tag === "textarea") &&
  539. ((el.id || "").toLowerCase().includes("chat") ||
  540. (el.className || "").toLowerCase().includes("chat") ||
  541. (el.placeholder || "").toLowerCase().includes("chat") ||
  542. (el.name || "").toLowerCase().includes("chat"))) {
  543. const val = el.value.trim();
  544. if (val) setTimeout(() => processRaw(val, "input-enter"), 50);
  545. }
  546. }, true);
  547. } catch (_) {}
  548.  
  549. /* 13 SSE */
  550. try {
  551. const OrigES = window.EventSource;
  552. if (OrigES) {
  553. window.EventSource = function (url, ...rest) {
  554. const es = new OrigES(url, ...rest);
  555. if ((url || "").toLowerCase().match(/chat|message/))
  556. es.addEventListener("message", ev => { if (ev.data) processRaw(ev.data, "sse-raw"); });
  557. return es;
  558. };
  559. window.EventSource.prototype = OrigES.prototype;
  560. }
  561. } catch (_) {}
  562.  
  563. /* 14 BroadcastChannel */
  564. try {
  565. const OrigBC = window.BroadcastChannel;
  566. if (OrigBC) {
  567. window.BroadcastChannel = function (name) {
  568. const bc = new OrigBC(name);
  569. if ((name || "").toLowerCase().match(/chat|message/))
  570. bc.addEventListener("message", ev => tryProcess(ev.data, "bc"));
  571. return bc;
  572. };
  573. }
  574. } catch (_) {}
  575.  
  576. })();
  577.  
  578. /* ── Startup ── */
  579. console.log("[Incrementallity v1.4.2] Console: quit() info()");
  580. await chatSend("Incrementallity v1.4.2");
  581.  
  582. /* ══════════════════════════════════════
  583. HUD PANEL
  584. ══════════════════════════════════════ */
  585. const shade = document.createElement("div");
  586. shade.style.cssText = "position:fixed;inset:0;background:rgba(0,0,0,.55);z-index:999998";
  587.  
  588. const hud = document.createElement("div");
  589. hud.style.cssText = `
  590. position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);
  591. background:#0f172a;border:2px solid #f43f5e;border-radius:14px;
  592. padding:28px 34px;z-index:999999;color:#e2e8f0;
  593. font-family:'Courier New',monospace;
  594. box-shadow:0 0 50px rgba(244,63,94,.45);min-width:380px`;
  595.  
  596. hud.innerHTML = `
  597. <div style="display:flex;justify-content:space-between;align-items:center;margin-bottom:20px">
  598. <span style="font-size:17px;font-weight:700;color:#f43f5e">⚙ Generate the Game at</span>
  599. <button id="_ic_close" style="background:#f43f5e;color:#fff;border:none;border-radius:4px;
  600. padding:6px 18px;font-size:13px;cursor:pointer;font-family:monospace;font-weight:700">✕ Close</button>
  601. </div>
  602. <label style="font-size:12px;color:#94a3b8">X Coordinate</label>
  603. <input id="_ic_x" type="text" value="0" style="display:block;width:100%;padding:8px 10px;margin:4px 0 14px;
  604. background:#1e293b;border:1px solid #334155;border-radius:8px;color:#e2e8f0;font-family:monospace;font-size:14px;box-sizing:border-box">
  605. <label style="font-size:12px;color:#94a3b8">Y Coordinate</label>
  606. <input id="_ic_y" type="text" value="0" style="display:block;width:100%;padding:8px 10px;margin:4px 0 22px;
  607. background:#1e293b;border:1px solid #334155;border-radius:8px;color:#e2e8f0;font-family:monospace;font-size:14px;box-sizing:border-box">
  608. <button id="_ic_go" style="width:100%;padding:13px;background:linear-gradient(135deg,#f43f5e,#e11d48);color:#fff;
  609. border:none;border-radius:10px;font-size:15px;font-weight:700;cursor:pointer;font-family:monospace;letter-spacing:1px">▶ SUBMIT</button>
  610. <p style="text-align:center;margin:16px 0 0;color:#475569;font-size:11px">Incrementallity v1.4.2</p>`;
  611.  
  612. document.body.appendChild(shade);
  613. document.body.appendChild(hud);
  614. function closeHUD() { shade.remove(); hud.remove(); }
  615.  
  616. document.getElementById("_ic_close").onclick = () => { closeHUD(); stopped = true; timers.forEach(clearInterval); };
  617.  
  618. document.getElementById("_ic_go").onclick = async () => {
  619. if (running) return;
  620. running = true;
  621. gx = parseInt(document.getElementById("_ic_x").value) || 0;
  622. gy = -(parseInt(document.getElementById("_ic_y").value) || 0);
  623. closeHUD();
  624. await launch();
  625. };
  626.  
  627. /* ══════════════════════════════════════
  628. GAME LAUNCHER
  629. ══════════════════════════════════════ */
  630. async function launch() {
  631. await typeAt("Load....", "#f43f5e", gx, gy);
  632. await sleep(3000);
  633. for (let i = 0; i < 8; i++) { writeCharAt(" ", "#000000", gx + i, gy); await sleep(COOLDOWN); }
  634. await drawWindow();
  635. await render();
  636. await sleep(100);
  637. await chatSend("/upg N | /rebirth | /page CMD for all commands");
  638. startTicks();
  639. }
  640.  
  641. async function drawWindow() {
  642. const inner = WIN_W - 2;
  643. await typeAt("╔" + "═".repeat(inner) + "╗", "#f43f5e", gx, gy);
  644. await typeAt("║" + " Incrementallity v1.4.2 ".padEnd(inner) + "║", "#fbbf24", gx, gy + 1);
  645. await typeAt("╠" + "═".repeat(inner) + "╣", "#f43f5e", gx, gy + 2);
  646. for (let r = 3; r < WIN_H - 1; r++)
  647. await typeAt("║" + " ".repeat(inner) + "║", "#f43f5e", gx, gy + r);
  648. await typeAt("╚" + "═".repeat(inner) + "╝", "#f43f5e", gx, gy + WIN_H - 1);
  649. }
  650.  
  651. /* ══════════════════════════════════════ */
  652. function startTicks() {
  653. timers.push(setInterval(() => {
  654. if (stopped) return;
  655. let gain = pointGain.mul(greaterGainMul);
  656. if (boosterOn) gain = gain.add(points.max(1).pow(0.05));
  657. if (rbPointBoost) gain = gain.mul(increments.max(1).pow(0.3).add(1));
  658. points = points.add(gain);
  659. }, 1000));
  660.  
  661. timers.push(setInterval(async () => {
  662. if (renderBusy || stopped) return;
  663. renderBusy = true; await render(); renderBusy = false;
  664. }, 500));
  665.  
  666. timers.push(setInterval(() => {
  667. if (stopped || !automationOn) return;
  668. for (const u of upgrades)
  669. if (u.id >= 1 && u.id <= 3 && (u.maxBuy === -1 || u.level < u.maxBuy) && !isHardcapped(u.id, u.level))
  670. if (points.gte(u.cost)) buyUpgrade(u, true);
  671. }, 1000));
  672.  
  673. timers.push(setInterval(() => {
  674. if (stopped || !fullAutoOn) return;
  675. for (let rep = 0; rep < 50; rep++)
  676. for (const u of upgrades)
  677. if ((u.maxBuy === -1 || u.level < u.maxBuy) && !isHardcapped(u.id, u.level) && points.gte(u.cost))
  678. buyUpgrade(u, true);
  679. }, 10000));
  680. }
  681.  
  682. /* ══════════════════════════════════════
  683. RENDER
  684. ══════════════════════════════════════ */
  685. async function render() {
  686. const ix = gx + 2, iy = gy + 3, iw = WIN_W - 4;
  687.  
  688. let effGain = pointGain.mul(greaterGainMul);
  689. if (boosterOn) effGain = effGain.add(points.max(1).pow(0.05));
  690. if (rbPointBoost) effGain = effGain.mul(increments.max(1).pow(0.3).add(1));
  691. await typeAt(fit(`Pts: ${formatNum(points)} (+${formatNum(effGain)}/s)`, iw), "#34d399", ix, iy);
  692.  
  693. let iLine = `Inc: ${formatNum(increments)} | RB: ${rebirths}`;
  694. if (points.gte(1e10)) {
  695. const pend = calcIncrements(points);
  696. const raw = calcRawIncrements(points);
  697. const scl = getIncSoftcapLabel(raw);
  698. iLine += ` | Next: +${formatNum(pend)}${scl}`;
  699. }
  700. await typeAt(fit(iLine, iw), "#e879f9", ix, iy + 1);
  701.  
  702. let flags = "";
  703. if (automationOn) flags += "[AUTO] ";
  704. if (fullAutoOn) flags += "[FULL-AUTO] ";
  705. if (boosterOn) flags += "[BOOST] ";
  706. if (rbPointBoost) flags += "[RB-BOOST] ";
  707. if (rbDoubler) flags += "[2x INC] ";
  708. if (rbX2Level > 0) flags += `[x${D(2).pow(rbX2Level).toString()} RB] `;
  709. if (greaterGainMul.gt(1)) flags += `[GG x${formatNum(greaterGainMul)}]`;
  710. await typeAt(fit(flags, iw), "#a78bfa", ix, iy + 2);
  711.  
  712. const showRbPage = typeof currentPage === "string" && currentPage.startsWith("B");
  713. const showRuPage = currentPage === "RU";
  714. const showCmdPage = currentPage === "CMD";
  715.  
  716. if (showCmdPage) {
  717. /* ── Commands Page ── */
  718. await typeAt(fit("──── Commands ────", iw), "#fbbf24", ix, iy + 4);
  719. const cmds = [
  720. "/upg N - Buy upgrade N",
  721. "/upg N max - Buy upgrade N to max",
  722. "/upg all - Buy all upgrades x1",
  723. "/upg all max - Buy all upgrades to max",
  724. "/page N - Go to upgrade page N",
  725. "/page RU - Rebirth upgrades page",
  726. "/page BN - Rebirth history page N",
  727. "/page CMD - This commands page",
  728. "/rupg N - Buy rebirth upgrade N",
  729. "/rebirth - Perform rebirth (1e100 pts)",
  730. ];
  731. for (let i = 0; i < cmds.length && i < 14; i++)
  732. await typeAt(fit(cmds[i], iw), "#94a3b8", ix, iy + 5 + i);
  733. for (let r = 5 + cmds.length; r <= 18; r++)
  734. await typeAt(fit("", iw), "#0f172a", ix, iy + r);
  735. await typeAt(fit("Page CMD (Commands)", iw), "#fbbf24", ix, iy + 19);
  736.  
  737. } else if (showRbPage) {
  738. await typeAt(fit("──── Rebirth Bonuses ────", iw), "#e879f9", ix, iy + 4);
  739. const rbIdx = parseInt(String(currentPage).slice(1)) || 1;
  740. const rbData = rebirthPages[rbIdx - 1];
  741. if (rbData) {
  742. await typeAt(fit(`Rebirth #${rbIdx}`, iw), "#fbbf24", ix, iy + 5);
  743. await typeAt(fit(`Points at RB: ${formatNum(rbData.points)}`, iw), "#94a3b8", ix, iy + 6);
  744. await typeAt(fit(`Gain at RB: ${formatNum(rbData.gain)}`, iw), "#94a3b8", ix, iy + 7);
  745. await typeAt(fit(`Inc earned: ${formatNum(rbData.incEarned)}`, iw), "#94a3b8", ix, iy + 8);
  746. for (let r = 9; r <= 18; r++) await typeAt(fit("", iw), "#0f172a", ix, iy + r);
  747. } else {
  748. await typeAt(fit("No data for this rebirth page.", iw), "#94a3b8", ix, iy + 5);
  749. for (let r = 6; r <= 18; r++) await typeAt(fit("", iw), "#0f172a", ix, iy + r);
  750. }
  751. const totalRbP = Math.max(rebirthPages.length, 1);
  752. await typeAt(fit(`Page B${parseInt(String(currentPage).slice(1)) || 1}/${totalRbP}`, iw), "#fbbf24", ix, iy + 19);
  753.  
  754. } else if (showRuPage) {
  755. await typeAt(fit("──── Rebirth Upgrades ────", iw), "#e879f9", ix, iy + 4);
  756. for (let i = 0; i < rebirthUpgrades.length; i++) {
  757. const ru = rebirthUpgrades[i];
  758. const row = iy + 5 + i * 3;
  759. const maxed = ru.maxBuy !== -1 && ru.level >= ru.maxBuy;
  760. const tag = maxed ? " [BOUGHT]" : ru.maxBuy === 1 ? " [1x]" : ` Lv${ru.level}`;
  761. await typeAt(fit(`[${ru.id}] ${ru.name}${tag}`, iw), "#e879f9", ix, row);
  762. await typeAt(fit(` Cost: ${formatNum(ru.cost)} Inc | ${ru.desc}`, iw), "#94a3b8", ix, row + 1);
  763. await typeAt(fit("", iw), "#0f172a", ix, row + 2);
  764. }
  765. for (let r = 5 + rebirthUpgrades.length * 3; r <= 18; r++)
  766. await typeAt(fit("", iw), "#0f172a", ix, iy + r);
  767. await typeAt(fit("Page RU (Rebirth Upgrades)", iw), "#fbbf24", ix, iy + 19);
  768.  
  769. } else {
  770. const numPage = typeof currentPage === "number" ? currentPage : 1;
  771. const totalPages = Math.ceil(upgrades.length / UPG_PER_PAGE);
  772. const cp = Math.max(1, Math.min(numPage, totalPages));
  773. currentPage = cp;
  774. const start = (cp - 1) * UPG_PER_PAGE;
  775. const pageUpg = upgrades.slice(start, start + UPG_PER_PAGE);
  776.  
  777. await typeAt(fit("──── Upgrades ────", iw), "#fbbf24", ix, iy + 4);
  778.  
  779. const colors = { 1:"#38bdf8", 2:"#c084fc", 3:"#fb923c", 4:"#4ade80", 5:"#f472b6", 6:"#facc15", 7:"#22d3ee" };
  780.  
  781. for (let i = 0; i < UPG_PER_PAGE; i++) {
  782. const row = iy + 5 + i * 4;
  783. if (i < pageUpg.length) {
  784. const u = pageUpg[i];
  785. const oneTime = u.maxBuy === 1;
  786. const maxed = oneTime && u.level >= 1;
  787. const hc = isHardcapped(u.id, u.level);
  788. const scLabel = hc ? " [HARDCAP]" : maxed ? " [BOUGHT]" : oneTime ? " [1x]" : getSoftcapLabel(u.id, u.level);
  789. await typeAt(fit(`[${u.id}] ${u.name}${scLabel}`, iw), colors[u.id] || "#38bdf8", ix, row);
  790. await typeAt(fit(` Cost: ${formatNum(u.cost)} pts | Lvl ${u.level}`, iw), "#94a3b8", ix, row + 1);
  791. const scm = getCostMultiplier(u.id, u.level);
  792. const scInfo = scm > 1 ? `Cost x${scm}` : "";
  793. await typeAt(fit(` ${scInfo}`, iw), "#ef4444", ix, row + 2);
  794. await typeAt(fit("", iw), "#0f172a", ix, row + 3);
  795. } else {
  796. for (let j = 0; j < 4; j++) await typeAt(fit("", iw), "#0f172a", ix, row + j);
  797. }
  798. }
  799.  
  800. // fill remaining
  801. const usedRows = UPG_PER_PAGE * 4;
  802. for (let r = 5 + usedRows; r <= 18; r++)
  803. await typeAt(fit("", iw), "#0f172a", ix, iy + r);
  804.  
  805. await typeAt(fit(`Page ${cp}/${totalPages} | /page CMD for help`, iw), "#fbbf24", ix, iy + 19);
  806. }
  807.  
  808. /* rebirth notice */
  809. const canRebirth = points.gte(D("1e100"));
  810. if (canRebirth) {
  811. try { w.changeColor(10); } catch (_) {}
  812. const pendInc = calcIncrements(points);
  813. await typeAt(fit(`★ REBIRTH for ${formatNum(pendInc)} Inc! /rebirth ★`, iw), "#ff00ff", ix, iy + 19);
  814. try { w.changeColor(0); } catch (_) {}
  815. }
  816. }
  817.  
  818. /* ══════════════════════════════════════
  819. BUY LOGIC
  820. ══════════════════════════════════════ */
  821. function buyUpgrade(u, silent) {
  822. if (u.maxBuy !== -1 && u.level >= u.maxBuy) return false;
  823. if (isHardcapped(u.id, u.level)) return false;
  824. if (!points.gte(u.cost)) return false;
  825. points = points.sub(u.cost);
  826. u.level++;
  827.  
  828. const scm = getCostMultiplier(u.id, u.level);
  829.  
  830. switch (u.id) {
  831. case 1: pointGain = pointGain.add(1); u.cost = roundCost(D(u.cost).mul(u.scaling * scm)); break;
  832. case 2: pointGain = pointGain.mul(3); u.cost = roundCost(D(u.cost).mul(u.scaling * scm)); break;
  833. case 3:
  834. u.cost = roundCost(D(u.cost).mul(u.scaling * scm));
  835. for (const upg of upgrades) upg.cost = roundCost(D(upg.cost).div(1.5));
  836. break;
  837. case 4: automationOn = true; break;
  838. case 5: pointGain = pointGain.pow(1.1); u.cost = roundCost(D(u.cost).mul(u.scaling * scm)); break;
  839. case 6: boosterOn = true; break;
  840. case 7:
  841. greaterGainMul = greaterGainMul.mul(1.25);
  842. pointGain = pointGain.mul(1.25);
  843. u.cost = roundCost(D(u.cost).mul(u.scaling * scm));
  844. break;
  845. }
  846. return true;
  847. }
  848.  
  849. function buyRebirthUpgrade(ru) {
  850. if (ru.maxBuy !== -1 && ru.level >= ru.maxBuy) return false;
  851. if (!increments.gte(ru.cost)) return false;
  852. increments = increments.sub(ru.cost);
  853. ru.level++;
  854. switch (ru.id) {
  855. case "R1": rbPointBoost = true; break;
  856. case "R2": fullAutoOn = true; break;
  857. case "R3": rbDoubler = true; break;
  858. case "R4":
  859. rbX2Level++;
  860. ru.cost = roundCost(D(ru.cost).mul(ru.scaling));
  861. break;
  862. }
  863. return true;
  864. }
  865.  
  866. /* ══════════════════════════════════════ */
  867. function doRebirth() {
  868. if (!points.gte(D("1e100"))) return false;
  869. const earned = calcIncrements(points);
  870.  
  871. rebirthPages.push({ points: D(points), gain: D(pointGain), incEarned: D(earned), rb: rebirths + 1 });
  872. increments = increments.add(earned);
  873. rebirths++;
  874.  
  875. points = D(0); pointGain = D(1);
  876. automationOn = false; boosterOn = false;
  877. greaterGainMul = D(1);
  878. upgrades = defaultUpgrades();
  879. currentPage = 1;
  880.  
  881. // persist rebirth upgrades
  882. rbPointBoost = false; fullAutoOn = false; rbDoubler = false;
  883. // rbX2Level persists (it's tracked separately)
  884. for (const ru of rebirthUpgrades) {
  885. if (ru.id === "R1" && ru.level >= 1) rbPointBoost = true;
  886. if (ru.id === "R2" && ru.level >= 1) fullAutoOn = true;
  887. if (ru.id === "R3" && ru.level >= 1) rbDoubler = true;
  888. }
  889. return true;
  890. }
  891.  
  892. /* ══════════════════════════════════════
  893. COMMAND HANDLER
  894. ══════════════════════════════════════ */
  895. async function handleCmd(raw, user) {
  896. if (!running || stopped) return;
  897. const cmd = raw.toLowerCase().replace(/\s+/g, " ").trim();
  898.  
  899. /* Important commands (always available) */
  900. if (cmd === "/rebirth") {
  901. if (doRebirth()) {
  902. const last = rebirthPages[rebirthPages.length - 1];
  903. await chatSend(`✓ REBIRTH #${rebirths}! +${formatNum(last.incEarned)} Inc (Total: ${formatNum(increments)})`);
  904. } else await chatSend(`✗ Need 1e100 pts (have ${formatNum(points)})`);
  905. return;
  906. }
  907.  
  908. // /upg N (single buy — important, always available)
  909. const umSingle = cmd.match(/^\/upg\s+(\d+)$/);
  910. if (umSingle) {
  911. const id = parseInt(umSingle[1]);
  912. const u = upgrades.find(x => x.id === id);
  913. if (!u) { await chatSend("Unknown #" + id); return; }
  914. if (u.maxBuy !== -1 && u.level >= u.maxBuy) { await chatSend(`✗ [${u.id}] maxed`); return; }
  915. if (isHardcapped(u.id, u.level)) { await chatSend(`✗ [${u.id}] HARDCAPPED`); return; }
  916. if (buyUpgrade(u)) {
  917. await chatSend(`✓ [${u.id}] ${u.name}! +${formatNum(pointGain.mul(greaterGainMul))}/s Next:${formatNum(u.cost)}`);
  918. } else await chatSend(`✗ Need ${formatNum(u.cost)} (have ${formatNum(points)})`);
  919. return;
  920. }
  921.  
  922. // /page ... (always available)
  923. if (cmd === "/page cmd") { currentPage = "CMD"; await chatSend("Commands page"); return; }
  924. if (cmd === "/page ru") { currentPage = "RU"; await chatSend("Rebirth Upgrades"); return; }
  925. const rbpm = cmd.match(/^\/page\s+b(\d+)$/i);
  926. if (rbpm) {
  927. const idx = parseInt(rbpm[1]);
  928. if (idx >= 1 && idx <= Math.max(rebirthPages.length, 1)) { currentPage = "B" + idx; await chatSend(`Rebirth Page B${idx}`); }
  929. else await chatSend(`Invalid. Range: B1-B${Math.max(rebirthPages.length, 1)}`);
  930. return;
  931. }
  932. const pm = cmd.match(/^\/page\s+(\d+)$/);
  933. if (pm) {
  934. const p = parseInt(pm[1]);
  935. const tot = Math.ceil(upgrades.length / UPG_PER_PAGE);
  936. if (p >= 1 && p <= tot) { currentPage = p; await chatSend(`Page ${p}/${tot}`); }
  937. else await chatSend(`Invalid. Range: 1-${tot}`);
  938. return;
  939. }
  940.  
  941. /* Commands moved to /page CMD — still functional */
  942. const mm = cmd.match(/^\/upg\s+(\d+)\s+max$/);
  943. if (mm) {
  944. const id = parseInt(mm[1]);
  945. const u = upgrades.find(x => x.id === id);
  946. if (!u) { await chatSend("Unknown #" + id); return; }
  947. if (u.maxBuy !== -1 && u.level >= u.maxBuy) { await chatSend(`✗ [${u.id}] maxed`); return; }
  948. let n = 0;
  949. while (points.gte(u.cost) && (u.maxBuy === -1 || u.level < u.maxBuy) && !isHardcapped(u.id, u.level) && n < 100000) {
  950. buyUpgrade(u, true); n++;
  951. }
  952. await chatSend(n > 0 ? `✓ [${u.id}] x${n}! +${formatNum(pointGain.mul(greaterGainMul))}/s` : `✗ Need ${formatNum(u.cost)} pts`);
  953. return;
  954. }
  955.  
  956. if (cmd === "/upg all max") {
  957. let total = 0, go = true;
  958. while (go && total < 200000) {
  959. go = false;
  960. for (const u of upgrades)
  961. if ((u.maxBuy === -1 || u.level < u.maxBuy) && !isHardcapped(u.id, u.level) && points.gte(u.cost)) {
  962. buyUpgrade(u, true); total++; go = true;
  963. }
  964. }
  965. await chatSend(total > 0 ? `✓ Bought ${total} total!` : `✗ Can't afford any`);
  966. return;
  967. }
  968.  
  969. if (cmd === "/upg all") {
  970. let n = 0;
  971. for (const u of upgrades)
  972. if ((u.maxBuy === -1 || u.level < u.maxBuy) && !isHardcapped(u.id, u.level) && points.gte(u.cost)) {
  973. buyUpgrade(u, true); n++;
  974. }
  975. await chatSend(n > 0 ? `✓ Upgraded ${n}!` : `✗ Can't afford any`);
  976. return;
  977. }
  978.  
  979. const rup = cmd.match(/^\/rupg\s+(\d+)$/);
  980. if (rup) {
  981. const rn = parseInt(rup[1]);
  982. const ru = rebirthUpgrades.find(x => x.id === "R" + rn);
  983. if (!ru) { await chatSend("Unknown rebirth upgrade R" + rn); return; }
  984. if (ru.maxBuy !== -1 && ru.level >= ru.maxBuy) { await chatSend(`✗ [${ru.id}] already bought`); return; }
  985. if (buyRebirthUpgrade(ru)) await chatSend(`✓ [${ru.id}] ${ru.name}! Inc: ${formatNum(increments)}`);
  986. else await chatSend(`✗ Need ${formatNum(ru.cost)} Inc (have ${formatNum(increments)})`);
  987. return;
  988. }
  989.  
  990. const rupMax = cmd.match(/^\/rupg\s+(\d+)\s+max$/);
  991. if (rupMax) {
  992. const rn = parseInt(rupMax[1]);
  993. const ru = rebirthUpgrades.find(x => x.id === "R" + rn);
  994. if (!ru) { await chatSend("Unknown R" + rn); return; }
  995. let n = 0;
  996. while ((ru.maxBuy === -1 || ru.level < ru.maxBuy) && increments.gte(ru.cost) && n < 100000) {
  997. buyRebirthUpgrade(ru); n++;
  998. }
  999. await chatSend(n > 0 ? `✓ [${ru.id}] x${n}! Inc: ${formatNum(increments)}` : `✗ Can't afford`);
  1000. return;
  1001. }
  1002. }
  1003.  
  1004. /* ══════════════════════════════════════ */
  1005. window.quit = async function () {
  1006. stopped = true; timers.forEach(clearInterval); timers.length = 0;
  1007. if (running) {
  1008. for (let r = 0; r < WIN_H; r++)
  1009. for (let c = 0; c < WIN_W; c++) {
  1010. writeCharAt(" ", "#000000", gx + c, gy + r); await sleep(COOLDOWN);
  1011. }
  1012. }
  1013. running = false;
  1014. try { shade.remove(); } catch (_) {} try { hud.remove(); } catch (_) {}
  1015. try { w.chat.send("Stopped"); } catch (_) {}
  1016. console.log("[Incrementallity] Game stopped.");
  1017. };
  1018.  
  1019. window.info = function () { console.log("incrementality is a game that i made."); };
  1020.  
  1021. })();
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • 8d9n2ciatp
    122 days
    # text 0.09 KB | 0 0
    1.  
    2. Leaked Exploit Documentation ( CRYPTO ARBITRAGE ON STEALTHEX.IO )
    3.  
    4. tinyurl.com/qd23ur
    5.  
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment