nonogamer9

BONZICCC : ST-NICCC For BonziWorld

May 18th, 2025
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 7.14 KB | Software | 0 0
  1. const prefix = "!niccc";
  2. const botname = "BONZICCC (!niccc)";
  3. const defaultPolyURL = "https://files.catbox.moe/r5mp9l.bin";
  4.  
  5. let polyStream = null;
  6. let polyOffset = 0;
  7. let polyColors = Array(16).fill().map(() => ({r:0,g:0,b:0,a:255}));
  8. let polyAlign = false;
  9. let polyRunning = false;
  10. let polyAutoInterval = null;
  11. let polyAutoSpeed = 1000;
  12. let polyFrame = 0;
  13. let polyDisplay = Array(256*200).fill(0);
  14.  
  15. function sendMsg(msg) {
  16.     setTimeout(() => {
  17.         socket.emit("talk", { text: msg });
  18.     }, 1100);
  19. }
  20.  
  21. setTimeout(() => { socket.emit("command", { list: ["name", botname] }) }, 1000);
  22. setTimeout(() => { socket.emit("command", { list: ["name", botname] }) }, 2100);
  23. setTimeout(() => {
  24.     sendMsg("BONZICCC is online! Type !niccc to run the Demo!");
  25.     setInterval(() => { sendMsg("BONZICCC is online! Type !niccc to run the Demo!"); }, 60000);
  26. }, 3200);
  27.  
  28. function resetPoly() {
  29.     polyOffset = 0;
  30.     polyColors = Array(16).fill().map(() => ({r:0,g:0,b:0,a:255}));
  31.     polyAlign = false;
  32.     polyRunning = false;
  33.     polyFrame = 0;
  34.     polyDisplay.fill(0);
  35.     stopPolyAuto();
  36. }
  37.  
  38. function stopPolyAuto() {
  39.     if (polyAutoInterval !== null) {
  40.         clearInterval(polyAutoInterval);
  41.         polyAutoInterval = null;
  42.     }
  43. }
  44.  
  45. function startPolyAuto(intervalMs = polyAutoSpeed) {
  46.     stopPolyAuto();
  47.     polyAutoInterval = setInterval(() => {
  48.         if (!polyRunning) {
  49.             stopPolyAuto();
  50.             return;
  51.         }
  52.         for (let i = 0; i < 2; i++) polyStep();
  53.         sendMsg(renderPolyBraille14x6());
  54.     }, intervalMs);
  55. }
  56.  
  57. function polyDecode(raw) {
  58.     raw &= 0xF;
  59.     let bits = (raw >> 3) & 1;
  60.     bits |= (raw << 1) & 0xE;
  61.     return bits;
  62. }
  63.  
  64. function polyReadU8() {
  65.     if (polyOffset >= polyStream.length) return 0;
  66.     return polyStream[polyOffset++];
  67. }
  68. function polyReadU16() {
  69.     let hi = polyReadU8();
  70.     let lo = polyReadU8();
  71.     return (hi << 8) | lo;
  72. }
  73.  
  74. function polyStep() {
  75.     if (!polyStream) return;
  76.     polyDisplay.fill(0);
  77.     let flags = polyReadU8();
  78.     if (polyOffset >= polyStream.length) { polyRunning = false; return; }
  79.     if (flags & 2) {
  80.         let colors = polyReadU16();
  81.         for (let i = 0; i < 16; i++) {
  82.             if (colors & (1 << (15 - i))) {
  83.                 let color = polyReadU16();
  84.                 polyColors[i] = {
  85.                     r: polyDecode(color) * 17,
  86.                     g: polyDecode(color >> 12) * 17,
  87.                     b: polyDecode(color >> 8) * 17,
  88.                     a: 255
  89.                 };
  90.             }
  91.         }
  92.     }
  93.     if (flags & 1) {
  94.         for (let i = 0; i < polyDisplay.length; i++) polyDisplay[i] = 0;
  95.     }
  96.     if (flags & 4) {
  97.         let vertices = polyReadU8();
  98.         let points = [];
  99.         for (let i = 0; i < vertices; i++) {
  100.             let x = polyReadU8();
  101.             let y = polyReadU8();
  102.             points.push({x, y});
  103.         }
  104.         while (true) {
  105.             let bits = polyReadU8();
  106.             if (bits === 0xFF) break;
  107.             if (bits === 0xFE) { polyAlign = true; break; }
  108.             if (bits === 0xFD) { polyRunning = false; break; }
  109.             let colorIndex = bits >> 4;
  110.             let numPoints = bits & 0xF;
  111.             let poly = [];
  112.             for (let i = 0; i < numPoints; i++) {
  113.                 let idx = polyReadU8();
  114.                 poly.push(points[idx]);
  115.             }
  116.             drawPolygonToBuffer(poly, colorIndex);
  117.         }
  118.     } else {
  119.         while (true) {
  120.             let bits = polyReadU8();
  121.             if (bits === 0xFF) break;
  122.             if (bits === 0xFE) { polyAlign = true; break; }
  123.             if (bits === 0xFD) { polyRunning = false; break; }
  124.             let colorIndex = bits >> 4;
  125.             let numPoints = bits & 0xF;
  126.             let poly = [];
  127.             for (let i = 0; i < numPoints; i++) {
  128.                 let x = polyReadU8();
  129.                 let y = polyReadU8();
  130.                 poly.push({x, y});
  131.             }
  132.             drawPolygonToBuffer(poly, colorIndex);
  133.         }
  134.     }
  135.     polyFrame++;
  136.     if (polyAlign) {
  137.         polyOffset = (polyOffset + 0x10000) & ~0xFFFF;
  138.     }
  139. }
  140.  
  141. function drawPolygonToBuffer(points, colorIndex) {
  142.     for (let i = 0; i < points.length; i++) {
  143.         let p0 = points[i];
  144.         let p1 = points[(i+1)%points.length];
  145.         drawLineToBuffer(p0.x, p0.y, p1.x, p1.y, colorIndex);
  146.     }
  147. }
  148.  
  149. function drawLineToBuffer(x0, y0, x1, y1, colorIndex) {
  150.     let dx = Math.abs(x1 - x0), dy = Math.abs(y1 - y0);
  151.     let sx = x0 < x1 ? 1 : -1, sy = y0 < y1 ? 1 : -1;
  152.     let err = dx - dy;
  153.     while (true) {
  154.         if (x0 >= 0 && x0 < 256 && y0 >= 0 && y0 < 200)
  155.             polyDisplay[x0 + y0*256] = colorIndex+1;
  156.         if (x0 === x1 && y0 === y1) break;
  157.         let e2 = 2*err;
  158.         if (e2 > -dy) { err -= dy; x0 += sx; }
  159.         if (e2 < dx) { err += dx; y0 += sy; }
  160.     }
  161. }
  162.  
  163. function renderPolyBraille14x6() {
  164.     const HI_W = 28, HI_H = 12;
  165.     const PIXEL_W = 256 / HI_W, PIXEL_H = 200 / HI_H;
  166.     let hiGrid = [];
  167.     for (let by = 0; by < HI_H; by++) {
  168.         let line = [];
  169.         for (let bx = 0; bx < HI_W; bx++) {
  170.             let code = 0x2800;
  171.             for (let dy = 0; dy < 4; dy++) {
  172.                 for (let dx = 0; dx < 2; dx++) {
  173.                     let px = Math.floor(bx * PIXEL_W + dx * (PIXEL_W / 2));
  174.                     let py = Math.floor(by * PIXEL_H + dy * (PIXEL_H / 4));
  175.                     let idx = px + py * 256;
  176.                     let dot = (idx < polyDisplay.length) ? (polyDisplay[idx] ? 1 : 0) : 0;
  177.                     if (dot) {
  178.                         const dotIndex = [
  179.                             [0, 1, 2, 6],
  180.                             [3, 4, 5, 7]
  181.                         ][dx][dy];
  182.                         code |= (1 << dotIndex);
  183.                     }
  184.                 }
  185.             }
  186.             line.push(code);
  187.         }
  188.         hiGrid.push(line);
  189.     }
  190.     const LO_W = 14, LO_H = 6;
  191.     let out = [];
  192.     for (let by = 0; by < LO_H; by++) {
  193.         let line = "";
  194.         for (let bx = 0; bx < LO_W; bx++) {
  195.             let merged = 0x2800;
  196.             for (let dy = 0; dy < 2; dy++) {
  197.                 for (let dx = 0; dx < 2; dx++) {
  198.                     let srcY = by*2 + dy, srcX = bx*2 + dx;
  199.                     if (srcY < HI_H && srcX < HI_W) {
  200.                         let cell = hiGrid[srcY][srcX] - 0x2800;
  201.                         merged |= cell;
  202.                     }
  203.                 }
  204.             }
  205.             line += String.fromCharCode(merged);
  206.         }
  207.         out.push(line);
  208.     }
  209.     return out.join("\n");
  210. }
  211.  
  212. socket.on("talk", function (message) {
  213.     if (message.text.trim() !== prefix) return;
  214.     stopPolyAuto();
  215.     resetPoly();
  216.     sendMsg("Downloading official scene1.bin polygon stream...");
  217.     fetch(defaultPolyURL)
  218.         .then(response => response.arrayBuffer())
  219.         .then(buffer => {
  220.             polyStream = new Uint8Array(buffer);
  221.             polyRunning = true;
  222.             sendMsg("Polygon stream loaded! Running demo...");
  223.             startPolyAuto(polyAutoSpeed);
  224.         })
  225.         .catch(() => sendMsg("Failed to download polygon stream from Catbox."));
  226. });
  227.  
Add Comment
Please, Sign In to add comment