import { Ticker } from "@/components/shared/pixi/Pixi"; import { sleep } from "@/utils/sleep"; import { CELL_SIZE, MAIN_COLOR } from "./cell"; import AnimatedRect, { IAnimatedRect } from "./components/AnimatedRect"; import { IBlinkingContainer } from "./components/BlinkingContainer"; import Dot from "./components/Dot"; type Props = Parameters[0] & { x: number; y: number; blinkingContainer: IBlinkingContainer; anchorGraphic: IAnimatedRect; }; export default async function scrape(props: Props) { const rects = Array.from({ length: 15 }, () => { return AnimatedRect({ app: props.app, x: CELL_SIZE / 2, y: CELL_SIZE / 2, width: 10, height: 10, radius: 0, color: MAIN_COLOR, }); }); const dots = Array.from({ length: 25 }, () => { return Dot({ x: CELL_SIZE / 2, y: CELL_SIZE / 2, app: props.app, }); }); dots.forEach((dot) => props.blinkingContainer.container.addChild(dot.graphic), ); await sleep(500); await Promise.all( [ [0, 12, 13, 14].map((index) => dots[index].animate({ x: 30, y: 30 }, { delay: 0.2 }), ), [1, 15, 16, 17].map((index) => dots[index].animate({ x: CELL_SIZE - 30, y: 30 }, { delay: 0.2 }), ), [2, 18, 19, 20].map((index) => dots[index].animate({ x: 30, y: CELL_SIZE - 30 }, { delay: 0.2 }), ), [3, 21, 22, 23].map((index) => dots[index].animate( { x: CELL_SIZE - 30, y: CELL_SIZE - 30 }, { delay: 0.2 }, ), ), props.anchorGraphic.animate({ radius: 0, width: 12, height: 12, }), ].flat(), ); rects.forEach((rect) => props.blinkingContainer.container.addChild(rect.graphic), ); rects.unshift(props.anchorGraphic); await sleep(500); props.blinkingContainer.blink({ delay: 0.1 }); await props.blinkingContainer.shrink(); await Promise.all( [ [0, 12, 13, 14].map((index) => dots[index].animate({ x: 22, y: 22 })), [1, 15, 16, 17].map((index) => dots[index].animate({ x: CELL_SIZE - 22, y: 22 }), ), [2, 18, 19, 20].map((index) => dots[index].animate({ x: 22, y: CELL_SIZE - 22 }), ), [3, 21, 22, 23].map((index) => dots[index].animate({ x: CELL_SIZE - 22, y: CELL_SIZE - 22 }), ), dots[4].animate({ x: 40, y: 22 }), dots[5].animate({ x: 22, y: 40 }), dots[6].animate({ x: CELL_SIZE - 22, y: 40 }), dots[7].animate({ x: 40, y: 58 }), dots[8].animate({ x: 40, y: 22 }), dots[9].animate({ x: 22, y: 40 }), dots[10].animate({ x: CELL_SIZE - 22, y: 40 }), dots[11].animate({ x: 40, y: 58 }), rects[0].animate({ width: 10, height: 10 }), rects.slice(0, 4).map((rect) => rect.animate({ x: 31, y: 31 })), rects .slice(4, 8) .map((rect) => rect.animate({ x: CELL_SIZE - 31, y: 31 })), rects .slice(8, 12) .map((rect) => rect.animate({ x: 31, y: CELL_SIZE - 31 })), rects .slice(12, 16) .map((rect) => rect.animate({ x: CELL_SIZE - 31, y: CELL_SIZE - 31 })), ].flat(), ); await sleep(1000); props.blinkingContainer.blink({ delay: 0.1 }); await props.blinkingContainer.shrink(); await Promise.all( [ dots[0].animate({ x: 4, y: 4 }), dots[1].animate({ x: CELL_SIZE - 4, y: 4 }), dots[2].animate({ x: 4, y: CELL_SIZE - 4 }), dots[3].animate({ x: CELL_SIZE - 4, y: CELL_SIZE - 4 }), dots[4].animate({ x: 40, y: 4 }), dots[5].animate({ x: 4, y: 40 }), dots[6].animate({ x: 76, y: 40 }), dots[7].animate({ x: 40, y: 76 }), dots[13].animate({ x: 22, y: 4 }), dots[14].animate({ x: 4, y: 22 }), dots[16].animate({ x: 58, y: 4 }), dots[17].animate({ x: 76, y: 22 }), dots[19].animate({ x: 4, y: 58 }), dots[20].animate({ x: 22, y: 76 }), dots[22].animate({ x: 58, y: 76 }), dots[23].animate({ x: 76, y: 58 }), rects.map((rect, index) => { const quadrant = Math.floor(index / 4); const position = index % 4; const col = (position % 2 === 0 ? 1 : 2) + (quadrant % 2 === 0 ? 0 : 2); const row = Math.floor(position / 2) + (quadrant < 2 ? 1 : 3); return rect.animate({ x: 13 + (col - 1) * 18, y: 13 + (row - 1) * 18, }); }), ].flat(), ); await sleep(1200); Promise.all( dots.map((dot) => dot.animate({ alpha: 0 }, { delay: Math.random() * 0.3 }), ), ); await sleep(100); props.blinkingContainer.blink({ delay: 0.2 }); const newWidths: number[] = []; for (let i = 0; i < rects.length; i++) { if (i % 2 === 0) { newWidths.push(20 + Math.random() * 28); } else { const remainingSpace = 62 - newWidths[i - 1]; newWidths.push(10 + Math.random() * remainingSpace); } } await Promise.all([ rects.map((rect, index) => { const y = 8 + Math.floor(index / 2) * 6 + Math.floor(index / 4) * 8; return rect.animate( { y, x: (index % 2 === 0 ? 8 : newWidths[index - 1] + 10) + newWidths[index] / 2, height: 4, width: newWidths[index], }, { delay: Math.random() * 0.1, }, ); }), ]); props.blinkingContainer.blink({ delay: 0.1 }); await sleep(2000); await Promise.all( [ rects.map((rect) => rect.animate(props.anchorGraphic.defaultProps, { delay: Math.random() * 0.3, duration: 0.3, }), ), ].flat(), ); rects.shift(); rects.forEach((rect) => rect.graphic.destroy()); dots.forEach((dot) => dot.graphic.destroy()); }