{"version":3,"sources":["BlockRow.js","BlockView.js","App.js","index.js"],"names":["colors","BlockRow","props","size","model","columns","i","length","push","className","style","width","height","background","BlockView","counter","blockIndex","blockAnchor","nextBlockIndex","rows","BLOCK_COLUMN","BLOCK_ROW","BLOCK_POS","paused","level","score","lines","state","keys","countdown","blockAngle","blockModel","rowSum","nextBlockModel","App","useState","blockSize","setBlockSize","setBlockModel","setLevel","setScore","setLines","setNextBlockModel","setPaused","measureSize","w","Math","floor","window","innerWidth","h","innerHeight","min","overlap","diff","pos","ret","x","y","max","updateModel","anchor","index","angle","value","putBlock","useCallback","moveBlock","rotateBlock","poses","ov","resizeHandler","keyHandler","e","code","timeHandler","key","shift","undefined","random","ceil","deleting","row","j","splice","unshift","m","Array","useEffect","addEventListener","setInterval","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.a1dae791.chunk.js","sourcesContent":["const colors = ['#000000', '#b00000', '#00b000', '#0000b0', '#b0b000', '#00b0b0', '#b000b0', '#c08000'];\n\nfunction BlockRow(props) {\n const size = props.size;\n const model = props.model;\n\n let columns = [];\n for (let i = 0; i < model.length; ++i)\n columns.push(
);\n\n return (\n
\n {columns}\n
\n );\n}\n\nexport default BlockRow;\n","import BlockRow from './BlockRow';\n\nfunction BlockView(props) {\n const model = props.model;\n\n let rows = [];\n for (let i = 0; i < model.length; ++i)\n rows.push();\n\n return (\n
\n {rows}\n
\n );\n}\n\nexport default BlockView;\n","import { useCallback, useEffect, useState } from 'react';\nimport './App.css';\nimport BlockView from './BlockView';\n\nconst BLOCK_COLUMN = 10;\nconst BLOCK_ROW = 20;\nconst NEW_BLOCK = 0;\nconst PLAYING = 1;\nconst DELETING_ROWS = 2;\nconst GAME_OVER = 3;\nconst BLOCK_POS = [\n [[[0, 0], [-1, 0], [1, 0], [2, 0]], [[0, 0], [0, -1], [0, 1], [0, 2]]],\n [[[0, 0], [-1, 0], [1, 0], [1, 1]], [[0, 0], [0, -1], [1, -1], [0, 1]], [[0, 0], [-1, -1], [-1, 0], [1, 0]], [[0, 0], [0, -1], [0, 1], [-1, 1]]],\n [[[0, 0], [-1, 0], [1, 0], [-1, 1]], [[0, 0], [0, -1], [0, 1], [1, 1]], [[0, 0], [1, -1], [-1, 0], [1, 0]], [[0, 0], [-1, -1], [0, -1], [0, 1]]],\n [[[0, 0], [-1, 0], [1, 0], [0, 1]], [[0, 0], [0, -1], [1, 0], [0, 1]], [[0, 0], [0, -1], [-1, 0], [1, 0]], [[0, 0], [0, -1], [-1, 0], [0, 1]]],\n [[[0, 0], [-1, 0], [0, 1], [1, 1]], [[0, 0], [0, -1], [-1, 0], [-1, 1]]],\n [[[0, 0], [1, 0], [-1, 1], [0, 1]], [[0, 0], [0, -1], [1, 0], [1, 1]]],\n [[[0, 0], [1, 0], [0, 1], [1, 1]]]\n];\nlet paused = false;\nlet level = 1;\nlet score = 0;\nlet lines = 0;\nlet state = NEW_BLOCK;\nlet keys = [];\nlet counter;\nlet countdown = 60;\nlet blockIndex;\nlet blockAnchor;\nlet blockAngle = 0;\nlet blockModel = [];\nlet rowSum = [];\nlet nextBlockIndex;\nlet nextBlockModel = [];\n\nfunction App() {\n const [blockSize, setBlockSize] = useState(20);\n // eslint-disable-next-line\n const [_blockModel, setBlockModel] = useState([]);\n // eslint-disable-next-line\n const [_level, setLevel] = useState(level);\n // eslint-disable-next-line\n const [_score, setScore] = useState(score);\n // eslint-disable-next-line\n const [_lines, setLines] = useState(0);\n // eslint-disable-next-line\n const [_nextblockModel, setNextBlockModel] = useState([]);\n // eslint-disable-next-line\n const [_paused, setPaused] = useState(paused);\n\n const measureSize = () => {\n const w = Math.floor(window.innerWidth / BLOCK_COLUMN);\n const h = Math.floor(window.innerHeight / BLOCK_ROW);\n setBlockSize(Math.min(w, h));\n };\n\n const overlap = (diff) => {\n const pos = BLOCK_POS[blockIndex][blockAngle];\n const ret = [0, 0];\n for (let i = 0; i < pos.length; ++i) {\n const x = blockAnchor[0] + pos[i][0] + diff[0];\n const y = blockAnchor[1] + pos[i][1] + diff[1];\n if (x >= 0 && x < BLOCK_COLUMN && y >= 0 && y < BLOCK_ROW && blockModel[y][x] !== -1)\n return [0, 0]; // overlapped with dropped blocks.\n if (x < 0)\n ret[0] = Math.min(ret[0], x);\n else if (x >= BLOCK_COLUMN)\n ret[0] = Math.max(ret[0], x - BLOCK_COLUMN + 1);\n if (y < 0)\n ret[1] = Math.min(ret[1], y);\n else if (y >= BLOCK_ROW)\n ret[1] = Math.max(ret[1], y - BLOCK_ROW + 1);\n }\n if (ret[0] === 0 && ret[1] === 0)\n return undefined; // not overlapped\n if (ret[1] > 0) // overlapped with bottom bound.\n ret[1] = 0;\n return ret;\n };\n\n const updateModel = (model, anchor, index, angle, value) => {\n const pos = BLOCK_POS[index][angle];\n for (let i = 0; i < pos.length; ++i)\n model[anchor[1] + pos[i][1]][anchor[0] + pos[i][0]] = value;\n };\n\n const putBlock = useCallback((value) => {\n updateModel(blockModel, blockAnchor, blockIndex, blockAngle, value);\n }, []);\n\n const moveBlock = useCallback((diff) => {\n putBlock(-1);\n if (overlap(diff)) {\n putBlock(blockIndex);\n return false;\n }\n blockAnchor[0] += diff[0];\n blockAnchor[1] += diff[1];\n putBlock(blockIndex);\n setBlockModel([blockModel]);\n return true;\n }, [putBlock]);\n\n const rotateBlock = useCallback((diff) => {\n const poses = BLOCK_POS[blockIndex];\n if (poses.length === 1)\n return false;\n putBlock(-1);\n blockAngle = (blockAngle + poses.length + diff) % poses.length;\n const ov = overlap([0, 0]);\n if (ov) {\n if ((ov[0] === 0 && ov[1] === 0) || overlap([-ov[0], -ov[1]])) {\n blockAngle = (blockAngle + poses.length - diff) % poses.length;\n putBlock(blockIndex);\n return false;\n } else {\n blockAnchor[0] -= ov[0];\n blockAnchor[1] -= ov[1];\n }\n }\n putBlock(blockIndex);\n setBlockModel([blockModel]);\n return true;\n }, [putBlock]);\n\n const resizeHandler = useCallback(() => {\n measureSize();\n }, []);\n\n const keyHandler = (e) => {\n keys.push(e.code);\n };\n\n const timeHandler = useCallback(() => {\n let key;\n if (keys.length > 0) {\n key = keys.shift();\n if (key === 'KeyP') {\n paused = !paused;\n setPaused(paused);\n }\n }\n if (paused)\n return;\n\n switch (state) {\n case NEW_BLOCK:\n blockIndex = nextBlockIndex !== undefined ? nextBlockIndex : Math.floor(Math.random() * BLOCK_POS.length);\n blockAngle = 0;\n blockAnchor = [Math.ceil(BLOCK_COLUMN / 2) - 1, 0];\n counter = countdown;\n state = overlap([0, 0]) ? GAME_OVER : PLAYING;\n putBlock(blockIndex);\n setBlockModel([blockModel]);\n\n if (nextBlockIndex !== undefined)\n updateModel(nextBlockModel, [1, 1], nextBlockIndex, 0, -1);\n nextBlockIndex = Math.floor(Math.random() * BLOCK_POS.length);\n updateModel(nextBlockModel, [1, 1], nextBlockIndex, 0, nextBlockIndex);\n setNextBlockModel([nextBlockModel]);\n break;\n case PLAYING:\n if (key === 'ArrowLeft')\n moveBlock([-1, 0]);\n else if (key === 'ArrowRight')\n moveBlock([1, 0]);\n else if (key === 'ArrowDown')\n moveBlock([0, 1]);\n else if (key === 'Enter')\n rotateBlock(1);\n if (--counter === 0) {\n counter = countdown;\n if (!moveBlock([0, 1])) {\n score += 20;\n setScore(score);\n state = NEW_BLOCK;\n const pos = BLOCK_POS[blockIndex][blockAngle];\n let deleting = false;\n for (let i = 0; i < pos.length; ++i) {\n const row = blockAnchor[1] + pos[i][1];\n if (++rowSum[row] === BLOCK_COLUMN) {\n deleting = true;\n for (let j = 0; j < BLOCK_COLUMN; ++j)\n blockModel[row][j] = -1;\n }\n }\n if (deleting) {\n setBlockModel([blockModel]);\n counter = 10;\n state = DELETING_ROWS;\n }\n }\n }\n break;\n case DELETING_ROWS:\n if (--counter === 0) {\n let i = 0;\n while (i < rowSum.length) {\n if (rowSum[i] === BLOCK_COLUMN) {\n rowSum.splice(i, 1);\n blockModel.splice(i, 1);\n }\n else\n ++i;\n }\n score += ((BLOCK_ROW - rowSum.length) * 2 - 1) * 100;\n setScore(score);\n lines += BLOCK_ROW - rowSum.length;\n setLines(lines);\n for (let i = rowSum.length; i < BLOCK_ROW; ++i) {\n rowSum.unshift(0);\n const m = new Array(BLOCK_COLUMN);\n for (let j = 0; j < BLOCK_COLUMN; ++j)\n m[j] = -1;\n blockModel.unshift(m);\n }\n setBlockModel([blockModel]);\n if (score >= level * 2000) {\n countdown = Math.ceil(countdown * 0.8);\n setLevel(++level);\n }\n state = NEW_BLOCK;\n }\n break;\n case GAME_OVER:\n break;\n // no default\n }\n }, [putBlock, moveBlock, rotateBlock]);\n\n useEffect(() => {\n blockModel = new Array(BLOCK_ROW);\n rowSum = new Array(BLOCK_ROW);\n for (let i = 0; i < blockModel.length; ++i) {\n blockModel[i] = new Array(BLOCK_COLUMN);\n for (let j = 0; j < blockModel[i].length; ++j)\n blockModel[i][j] = -1;\n rowSum[i] = 0;\n }\n nextBlockModel = new Array(4);\n for (let i = 0; i < nextBlockModel.length; ++i) {\n nextBlockModel[i] = new Array(4);\n for (let j = 0; j < nextBlockModel[i].length; ++j)\n nextBlockModel[i][j] = -1;\n }\n measureSize();\n setBlockModel(blockModel);\n window.addEventListener('resize', resizeHandler);\n window.addEventListener('keydown', keyHandler);\n setInterval(timeHandler, 25);\n }, [resizeHandler, timeHandler]);\n\n return (\n <>\n
\n \n
\n
\n
Level {level}
\n
Score {score}
\n
Lines {lines}
\n \n
\n \n );\n}\n\nexport default App;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n"],"sourceRoot":""}