@hadoku/watchparty-ui 0.44.3 → 0.44.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{AdminPanel-DAoc4unj.js → AdminPanel-CF0kmYIA.js} +4 -4
- package/dist/chunks/{AdminPanel-DAoc4unj.js.map → AdminPanel-CF0kmYIA.js.map} +1 -1
- package/dist/chunks/{CharacterModal-Doc-Va6V.js → CharacterModal-Bn-_n4Dv.js} +2 -2
- package/dist/chunks/{CharacterModal-Doc-Va6V.js.map → CharacterModal-Bn-_n4Dv.js.map} +1 -1
- package/dist/chunks/{GameModule-C9L3B_xh.js → GameModule-Cz8pq8vy.js} +4 -4
- package/dist/chunks/{GameModule-C9L3B_xh.js.map → GameModule-Cz8pq8vy.js.map} +1 -1
- package/dist/chunks/{MapEditor-BTSHw1Xb.js → MapEditor-CAaN7Avt.js} +2 -2
- package/dist/chunks/{MapEditor-BTSHw1Xb.js.map → MapEditor-CAaN7Avt.js.map} +1 -1
- package/dist/chunks/{MediaDrawer-DY7Rc7Bm.js → MediaDrawer-CX4LJKzr.js} +4 -4
- package/dist/chunks/{MediaDrawer-DY7Rc7Bm.js.map → MediaDrawer-CX4LJKzr.js.map} +1 -1
- package/dist/chunks/{PlaylistPanel-KoHnRQN9.js → PlaylistPanel-C5wVAlAn.js} +3 -3
- package/dist/chunks/{PlaylistPanel-KoHnRQN9.js.map → PlaylistPanel-C5wVAlAn.js.map} +1 -1
- package/dist/chunks/{Room-C4jnGrvL.js → Room-ByB1YcBj.js} +4 -4
- package/dist/chunks/{Room-C4jnGrvL.js.map → Room-ByB1YcBj.js.map} +1 -1
- package/dist/chunks/{index-0c7HI7Ol.js → index-0qpZypc6.js} +3 -3
- package/dist/chunks/{index-0c7HI7Ol.js.map → index-0qpZypc6.js.map} +1 -1
- package/dist/chunks/{submissionsApi-DL6BTffE.js → submissionsApi-BUCH3LM8.js} +2 -2
- package/dist/chunks/{submissionsApi-DL6BTffE.js.map → submissionsApi-BUCH3LM8.js.map} +1 -1
- package/dist/index.js +1 -1
- package/package.json +3 -3
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs as f, jsx as o, Fragment as _e } from "react/jsx-runtime";
|
|
2
2
|
import { useState as R, useMemo as P, useRef as z, useEffect as q, useCallback as E } from "react";
|
|
3
|
-
import { C as ye, u as ke, g as Ue, s as Fe } from "./index-
|
|
3
|
+
import { C as ye, u as ke, g as Ue, s as Fe } from "./index-0qpZypc6.js";
|
|
4
4
|
const Oe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAA4ElEQVR4nO3bvQrCMAAAYRUnwcFn7PvjILjq4JalCDYf0ru5P8eRhNCf47Isr8NEno/7V8dfrreNTD6cNr36H1AALaA5z77hOKfHNWHrOT+y+xFQAC2gKYAW0BRAC2gKoAU0BdACmgJoAU0BtICmAFpAUwAtoCmAFtAUQAtoCqAFNAXQAprp7wZHZr8LHNn9CCiAFtAUQAtoCqAFNAXQApoCaAFNAbSApgBaQMOfB/StMKYAWkBTAC2gKYAW0EzfB6z9Nzh7X7D7EVAALaDZfA349l/hX5+/xu5HQAG0gOYNTj4XivrBP34AAAAASUVORK5CYII=", Se = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAVUExURWY5MXlWQkUoPJVoVKx3USYjOv///88sd78AAAABYktHRAZhZrh9AAAAB3RJTUUH6gUWFB4FeZ3ViwAAAHVJREFUSMflk8kNwCAMBLcFWnALtEAL6b+VgMyKCHG8skHKfMBoHsYHgJABrIPvkAhxwZ+EE3qRHnhqLf5CoEJJJZzRi83ASIS5ohHMwoJcMIkAeKvGp0bwZAockRYphavS35UCl8XXZfqL1wWWiLFawACZcANvCQaAiP6VCQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNi0wNS0yMlQyMDoyMTo0MSswMDowMGeGF3AAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjYtMDUtMjJUMjA6MjE6NDErMDA6MDAW26/MAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDI2LTA1LTIyVDIwOjMwOjA1KzAwOjAwH4cQBAAAAABJRU5ErkJggg==", He = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABXUlEQVR4nO2awUrDUBBFrcxKUOjChboSBIXuBBcFv7q/IeJKMSC4aiMILWgo7ux6RrA8THvsm3t2MwRyc7mZvCRvcH07/t6riK4dFB2/vyEdO4MMoAXQ2OXpiWscHA5dfX52sU09vfP4fOfqZta6On0CZAAtgMZqu+cjo6sbVzeziavTJ0AG0AJoZAAtgEYG0AJorLbnfinpEyADaAE0MoAWQCMDaAE09jp9cY1s64L0CZABtAAaW34uXKO2mRCvJ5I+ATKAFkBjsRFnQvy39t+J/znWkT4BMoAWQPNjBuw6cYbFmRD3EKVPgAygBdBUNwMiD81T6GgGOGQALYDG3j8Wvx5wfFS2ti6l7/PHfYDrSJ8AGUALoLFN3+Ol/FVP3PscuW/fXJ0+ATKAFkCz9XeB+Nyn1xnpEyADaAE01X8PmHdfoaPvAQ4ZQAugsdL3576Zd+z50ydABtACaFan50Bii49pkgAAAABJRU5ErkJggg==", De = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABV0lEQVR4nO2aPWsCQRRFY9gqJIKFhbGQfBDBLm3+f5ciVYKCKCk2FhaBKLZavzvFMmziyTL3dE+W5bzLm3HY3d7Tw8vxIoPrUdblZ2e/6WVdf/lHHp3BAdACNJWu6efpLNR348dz+vw663oZ6rfFR6iLnwAHQAvQVPpD19e8ov14DxAcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUBT6bs0fY7e9WeE2o/2W/wEOABagCZ5L3DYfYf6ff6adcOrm0E7owbUry3FT4ADoAVoku8DlO1PXHOT8X2o6XOC/s9/1qtQD/txT9J+i58AB0AL0CTngMXXJtTT21Go6TWvqI+eE7QfpfgJcAC0AE2yB+ia7zraj+4JxU+AA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagSZ4HNPHfvh9Qn1yKnwAHQAvQnAB0ZD6cfejf/wAAAABJRU5ErkJggg==", Me = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABgUlEQVR4nO2aMUsDQRCFL5JCRIUIFmolCBHsBAvBX+3fELFSPBCszAlCAhqCnbbOLGQZvLvvwr6vm2RZ3j5m5vb2dnR5c/1T/WF6fFRF2NmbhMa3zeprERpfzxoTb7UpZhORAbQAmnFuwMX5VR86OuPx+W7t/8VngAygBdAkPWDTa97j11PPbk1cfAbIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoATXIm+Pr2YuLTk7PexHSBX4+n+AyQAbQAmuy3QV9D0e/xfRO9r1B8BsgAWgDNeNmM7C9TGw695j1er+8Jfr3FZ4AMoAXQJPuAh/rJxNF7g0PDr6eq1AMMMoAWQJN9F/B3a9vuCX5+z8HutokP99fv9XPzeYrPABlAC6BJekDfz/1ojefI6b9v3k1cfAbIAFoATXYf0DYfn8M6Xyg+A2QALYAm6QG+Rv/7XM7R9fy5nlN8BsgAWgBN0gPmy28Xx96vo3Q9f4rOBA0ygBZA8wuEsEaUV+FlQgAAAABJRU5ErkJggg==", We = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUklEQVR4nO2bv4vCQBBGL0cKCxEULNRKlFOwvub+/95OEAQrtRAUPJHrznpmi7D442nme90ESR4fs5vNxhRfo5//jwyavayfvzyftACNAqAFaEo/pif9nqln0+9n+jyc9WZl6vAdoABoAZrSH6jbmPcMB2NTh+8ABUAL0CgAWoBGAdACNAqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQJHuCft/c76G9O3ov4FAAtABNMgd4/Ji5/B4fJkMQvgMUAC1AU553hT0ysWXdxrwnfAcoAFqAJlkHzJcLU/v/DNWN8B2gAGgBmspngeV2Z+pOs2Hqbqt9k8D+lLfOyL1e1fnDd4ACoAVokjmAvu/fOqfkni98BygAWoAmmQP8ffPeY/LVCN8BCoAWoEnmgMP5z9Td1n0v6J8t6HVH+A5QALQATeG/Ha7bt8FVhO8ABUAL0FwBfpsww2cW0LwAAAAASUVORK5CYII=", Le = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABh0lEQVR4nO2asUvDQBTGL9JBpBYUOrROojSCm+Cg+P8vDk6KhUIn7SBU0CJudfXeYY/wkvxM3vtt1+Saj4/vLu8uV1zd3WzDL8rpJGg4ODxS9c/x9fmu6j9/XUXtPdW/9QA3gBZAM8jdcHlx3YaOxli+LKJ2OY2vm0+AG0ALoEnmgK6PecnpyXnUlnOC+QS4AbQAGjeAFkDjBtACaLJrgb4h6wLzCXADaAE0bgAtgMYNoAXQJHWAXC/L92bX8f0AgRtAC6DJrgW6PidI/fLbovkEuAG0AJrK+wGPz/dN6MAwnwA3gBZAM9isiviXMm5qz+TkkGd2tGeUqmI+AW4ALYAmqQMe5k9Ru+0x2facYD4BbgAtgKaYnd1GZ4WHk+1f94YQQjge7qseuN58q/pXJafXfALcAFoATVIHyDEzHtV7/n882n397WP32qNuPeYT4AbQAmj+/Rmhuse8xHwC3ABaAE0yB6S1evxebnpMyufn6gYt5hPgBtACaCrvB/QN8wlwA2gBND+5n0Dr51yy0gAAAABJRU5ErkJggg==", Te = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABdUlEQVR4nO2bPUvEQBCGc7KV4IHFFWolCB7YCRbC/er7GxZWigHByrtCOEGDaHW2NxNwCfl4vMz7dLNhN29eZiebTTK5Xtxuix0uT0+KNhweHbfqn+Pr871V/3K1NvFBq9FGgAygBdAkP+f9HD4/uxhST+c8PN39eTx8BsgAWgBNGtuc91zNb0xcrpYmDp8BMoAWQCMDaAE0MoAWQJPGdt9vSvgMkAG0ABoZQAugkQG0AJr08vpsGsa2LvDX5wmfATKAFkCT/Lu2fa8JuTnvCZ8BMoAWQJN8g68JuXdr/42m3yeEzwAZQAugqdWAfcfXMF8TqvXExOEzQAbQAmjS24edM7Npv9/5Dc19+ehaVAMMMoAWQFNbB/ia4GlaI3LjdT3+pvpu1D98BsgAWgBN6vu+78fvet3h+8+m9rg/X1X8mDh8BsgAWgCNDKAF0MgAWgBN73uC9H5D/dlA+wEGGUALoEn+X9q+2VTDni9H+AyQAbQAml8slkzMIBNZowAAAABJRU5ErkJggg==", Ve = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQ0lEQVR4nO2asQ4BQRRFka2EQolKiE10Wv/fKVTEJhIVSgXR0po7iY2sONbc071NVs7cvJnZjGlOx4t744lOPyj/nhYtQOMAaAGaTOf8PJ8F9Wg4+abPx9kfdkF9u5yDOvkOcAC0AE2mD+o+5xUdj64JyXeAA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagic4D/h2fCQoOgBagya6nZvBAz8zqfkao41GS7wAHQAvQRN8Buk+ut8u3frDd7VUzKkH9qpJ8BzgAWoAmuh+gFMdTUP/a/QHd51fFJqjzQf/l+8l3gAOgBWii7wCd8zqH6DmvqI9+J+h4lOQ7wAHQAjTRGlC2b9YNHY+uCcl3gAOgBWgcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHn7jtCv3R8o+/+/jOQ7wAHQAjQPMsI9FqsxS7oAAAAASUVORK5CYII=", Pe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQUlEQVR4nO2aoQoCQRRFVSaJBuNqEgTBpk3w/4thk+KCYFKjQbFqfneDCItHnXva27CcubwZhplpL1bLRysjbud2qDuQx9fgAGgBmjQdFuFDtz8I9Xg0+aRP4xyO+1CXrW2os+8AB0AL0KR/m/OKjqesvAYEHAAtQOMAaAEaB0AL0DgAWoDGAdACNA6AFqBxALQATbpfL7QDSvYd4ABoAZqkH/Qc/dfPCHU8vhsUHAAtQFNbA3RfsNmt3/qh3jM0TdP7luw7wAHQAjS1NUCpTudQz6ezUNP7hNr9v9z96fuHXhGfRGXfAQ6AFqBJOscVnUP0nFfUR/cJr8aXfQc4AFqAprYP0Dn/6+h4dE3IvgMcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtADNy3sB5dveD6jPu2TfAQ6AFqB5AmmUO6FIXs0fAAAAAElFTkSuQmCC", qe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABRklEQVR4nO2asWoCQRRFTZhKsEipqYSAEisDFoH8f5PCKkFBsDKWFoKttpm7xTDE7Fl993SzLMuZy3vD7O48vH28n3u/mIyGvRr6g6eq+6/N6Xioun/9s8/Gj9eUuUUcAC1Ak7TntafHzy9t+vw7/cEmG4evAAdAC9Cke+95RecXvgIcAC1Ak+6950uErwAHQAvQOABagMYB0AI0DoAWoHEAtABN2u7yb2TR3g3CV4ADoAVokv5bi7YmhK8AB0AL0CS9oGvC1+qz6oGz6eJvRgVqfUqErwAHQAvQNNYARc/UzCev2bjtfYKuMbpvWa6/s3HpzFP4CnAAtABN0h5XtIe69m6gPrqPKc0vfAU4AFqAprEPqD0r3HV0Pj4rLDgAWoDGAdACNA6AFqBxALQAjQOgBWgcAC1A4wBoARoHQAvQOABagOYCVgAynQlZGFoAAAAASUVORK5CYII=", Ge = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOElEQVR4nO2bwQsBQRSH0RwkFLUHnJSi3JSD8v9fnBWlnHBQFJIb53lbatrsl97vu83s1n79evt2ZtutzpaLd8UxNVqARgHQAjRh3O9FE9PJHFIph/1hF43dV4ACoAVoQqPVoR1KZTgYRWP3FaAAaAGaYO8Jb7ivAAVAC9AoAFqARgHQAjQKgBagUQC0AE2w78i87Q3cV4ACoAVowvN+jSa89QT3FaAAaAGaYCdsT1hvVqXJELivAAVAC9AoAFqARgHQAjThfIuf+1nb1/cC7itAAdACNLm9gO0JlsvjlXSBbrP+9Xhqz9keT0nnW6yP+wpQALQATUi9B7N2PC57HWG/bS56ffcVoABoAZrcOuDfKNpz3FeAAqAFaJJ7gH3u2r2BXSf8Gq0DCqIAaAGaqv4ddo4CoAVoPpR0Me34gHFfAAAAAElFTkSuQmCC", Xe = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABeklEQVR4nO2asUoDQRRFN7KVaMAiRbQSxQjWNn62vyFipbggpDIrCAoaxE7ruVMMg7N7XOae7oUlOXN583ay7Ozs5OqnyWBvmXX56Gz7Wdb1OwN5TAYHQAvQtLqnV4fLoL44vxzTpzj3jzdB3W36oK6+AxwALUDT6gdT3/OKrqfbXAd19R3gAGgBGgdAC9A4AFqAxgHQAjQOgBagcQC0AI0DoAVooucB6+enoD4+Oh1NZgh0PUr1HeAAaAEaB0AL0DgAWoAmOgcoeh/9+nwfTKYEu/sHWddX3wEOgBagaaN3alZh+d/3vKK+OhN0vdV3gAOgBWiic8Bd9xDU+s7Q1ND1NI1nQIADoAVokv8F9L26v86E14+8c8Vinne2V98U1XeAA6AFaKIZMPR9X/e0zoTcPa+k/G/7l6CuvgMcAC1AE82A0nuSJnXuqL4DHAAtQBPNgLftd1Av5mV/sPR/ixS6Hj8PEBwALUCT/TygNEN/f4rqO8AB0AI0v8NqTSVA9X9QAAAAAElFTkSuQmCC", Ie = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUElEQVR4nO2asWoCQRRF3TCVYJEyWogSSMAuYCH41f5GakFBDCnUIoWQiK22zhWyyIQc2XdP91ZWz17ejAvzqrfp5NS64KX71Cqh3Xksur+O48++6P7ldpfVD0Xf1gAcAC1Ak3TN6xoe9J7/0+fPmS/ef/08fAc4AFqAJjVtzSuj13FWL7ezrA7fAQ6AFqBxALQAjQOgBWhS0/73byV8BzgAWoDGAdACNA6AFqBJH5tVdiHae0H4DnAAtABN0rO2pu0J+jxK+A5wALQATdILuifUna0p9HxA3e8fdlVWh+8AB0AL0FztAcrXd77m+r1hVtPvCbpHfW7WWa2+SvgOcAC0AE2lc4KKzhDpefu9oXuCzgUq4TvAAdACNFfvAaWzwveGPo9nhQUHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUDjAGgBGgdAC9CcAYDuOTwDN8emAAAAAElFTkSuQmCC", je = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABNElEQVR4nO2aQQsBURRG0VspysKCWYgUZacslP+/sVaUyGLGwkJRtqzfnZppFubQ/c7uvaQzX9/c3hjN5Wb9bjimRQvQKABagCbMhoNoYzFfQSr1cE6P0dp9AxQALUAT2p0e7VAr42Qard03QAHQAjTB3hPecN8ABUAL0CgAWoBGAdACNAqAFqBRALQATbC/kXl7NnDfAAVAC9CE1/MebXibCe4boABoAZpgN+xM2O23lb7w2+8Wq/qU4b4BCoAWoMnNAMvtEc+EUTKJ1nWfE+yMseeWS3qK1v1u8btP9w1QALQATThk18IP2P8Q/dqzgfWx55iy63PfAAVAC9DkzgH2nv937PXYmeC+AQqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQKABagEYB0AI0CoAWoPkA1dkt6kUtkpYAAAAASUVORK5CYII=", ze = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUUlEQVR4nO2bMWvCQBiGVW4owQgtZFCnQqF7N6H/f3EWFAQndRAstKV0a1fvyyAf0Twk3/tsJwc+vrx3JvEcvr0v/gYXvM6mAw9F+eiaf2t+vj5c8zeHYzYe3VKmiygAWoAm2TVv1/Tz/KVNn7tTlNtsHL4BCoAWoEl9X/MW+/nCN0AB0AI0qe9r/hrhG6AAaAEaBUAL0CgAWoBGAdACNAqAFqBJu33+jCzavUH4BigAWoAm2d/Wou0J4RugAGgBmmRfsHvCar1sTYYgfAMUAC1AowBoARoFQAvQJHtuzntOsOuEb4ACoAVoavcCdk/w8jR+cM2vJr6zxl6/az7hG6AAaAGa2llhL6fP/PmBd017sb5Nr2PCN0AB0AI0teuAruG97rCEb4ACoAVo3HuA/d4/f/9m42rSTMhL0/cP3wAFQAvQDO1/h6MRvgEKgBag+Qfu+jOSBU5GcAAAAABJRU5ErkJggg==", Je = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOklEQVR4nO2aMQvCMBQGrTgVKjg4qJMgKLgJDoL/f3EWFERxqI4OiquuvtchQ6BXm++2iJXrkRRJk622m0/nh/l41IkhLwZR14d4Px9R1x9vdzPuRv1aC1AAWoCmF/rCcrGuw6M28uJkxsnPAAWgBWgqz4C2rXnPdDIz4+RngALQAjQKQAvQKAAtQKMAtACNAtACNApAC9AoAC1AowC0AI0C0AI0lT3BS2n3zf0e2r/j7y/5GaAAtABN73XP7CdzO/RrJvR+vunnAzzJzwAFoAVogucDruXZjId9u8bpd4n+GRXy9SQ/AxSAFqDJ/DlBjz83SK/5EPvDzoz9uUBP8jNAAWgBmsr/gNizwk3D34/OCjsUgBagUQBagEYBaAEaBaAFaBSAFqBRAFqARgFoARoFoAVoFIAWoPkCQOwuh7kvX8IAAAAASUVORK5CYII=", Ye = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABLElEQVR4nO2asQrCMAAFq/gT6iQIFZ0UHAT/f3FwUiwITuroILjqal6HUFJ61b7bAlauRxJom95qu3lnX+SjYZbCYrZOuj7G4bRLur643YNxP+nf/gAHoAVoBrEf6JpZ5vNgPBlP6zWKoHvM5XoOxvviGIxje1rnZ4AD0AI0pT1A17yuoabXfAz1eT0fwVjvR+n8DHAAWoCmtAekPgu0Db0fPwsIDkAL0DgALUDjALQAjQPQAjQOQAvQOAAtQOMAtABN9LuAou/h6XeE6lOVzs8AB6AFaCrvAfreXb/Xt/18gNL5GeAAtACNzwfUo/W7OAAtQOPzAbUb/RgOQAvQ+HxAkzJtxAFoARoHoAVoHIAWoHEAWoDGAWgBGgegBWgcgBagcQBagMYBaAGaD9C3Qmb46VC5AAAAAElFTkSuQmCC", ie = {
|
|
5
5
|
2: [11, 9],
|
|
6
6
|
3: [11, 9],
|
|
@@ -736,4 +736,4 @@ ${a}
|
|
|
736
736
|
export {
|
|
737
737
|
gt as default
|
|
738
738
|
};
|
|
739
|
-
//# sourceMappingURL=MapEditor-
|
|
739
|
+
//# sourceMappingURL=MapEditor-CAaN7Avt.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapEditor-BTSHw1Xb.js","sources":["../../src/assets/games/bomberman/tiles/floor.png","../../src/assets/games/bomberman/tiles/soft_block.png","../../src/assets/games/bomberman/tiles/wall_cap_e.png","../../src/assets/games/bomberman/tiles/wall_cap_n.png","../../src/assets/games/bomberman/tiles/wall_cap_s.png","../../src/assets/games/bomberman/tiles/wall_cap_w.png","../../src/assets/games/bomberman/tiles/wall_corner_ne.png","../../src/assets/games/bomberman/tiles/wall_corner_nw.png","../../src/assets/games/bomberman/tiles/wall_corner_se.png","../../src/assets/games/bomberman/tiles/wall_corner_sw.png","../../src/assets/games/bomberman/tiles/wall_cross.png","../../src/assets/games/bomberman/tiles/wall_h.png","../../src/assets/games/bomberman/tiles/wall_iso.png","../../src/assets/games/bomberman/tiles/wall_t_e.png","../../src/assets/games/bomberman/tiles/wall_t_n.png","../../src/assets/games/bomberman/tiles/wall_t_s.png","../../src/assets/games/bomberman/tiles/wall_t_w.png","../../src/assets/games/bomberman/tiles/wall_v.png","../../src/lib/mapEditorGrid.ts","../../src/routes/MapEditor.tsx"],"sourcesContent":["export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAA4ElEQVR4nO3bvQrCMAAAYRUnwcFn7PvjILjq4JalCDYf0ru5P8eRhNCf47Isr8NEno/7V8dfrreNTD6cNr36H1AALaA5z77hOKfHNWHrOT+y+xFQAC2gKYAW0BRAC2gKoAU0BdACmgJoAU0BtICmAFpAUwAtoCmAFtAUQAtoCqAFNAXQAprp7wZHZr8LHNn9CCiAFtAUQAtoCqAFNAXQApoCaAFNAbSApgBaQMOfB/StMKYAWkBTAC2gKYAW0EzfB6z9Nzh7X7D7EVAALaDZfA349l/hX5+/xu5HQAG0gOYNTj4XivrBP34AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAVUExURWY5MXlWQkUoPJVoVKx3USYjOv///88sd78AAAABYktHRAZhZrh9AAAAB3RJTUUH6gUWFB4FeZ3ViwAAAHVJREFUSMflk8kNwCAMBLcFWnALtEAL6b+VgMyKCHG8skHKfMBoHsYHgJABrIPvkAhxwZ+EE3qRHnhqLf5CoEJJJZzRi83ASIS5ohHMwoJcMIkAeKvGp0bwZAockRYphavS35UCl8XXZfqL1wWWiLFawACZcANvCQaAiP6VCQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNi0wNS0yMlQyMDoyMTo0MSswMDowMGeGF3AAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjYtMDUtMjJUMjA6MjE6NDErMDA6MDAW26/MAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDI2LTA1LTIyVDIwOjMwOjA1KzAwOjAwH4cQBAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABXUlEQVR4nO2awUrDUBBFrcxKUOjChboSBIXuBBcFv7q/IeJKMSC4aiMILWgo7ux6RrA8THvsm3t2MwRyc7mZvCRvcH07/t6riK4dFB2/vyEdO4MMoAXQ2OXpiWscHA5dfX52sU09vfP4fOfqZta6On0CZAAtgMZqu+cjo6sbVzeziavTJ0AG0AJoZAAtgEYG0AJorLbnfinpEyADaAE0MoAWQCMDaAE09jp9cY1s64L0CZABtAAaW34uXKO2mRCvJ5I+ATKAFkBjsRFnQvy39t+J/znWkT4BMoAWQPNjBuw6cYbFmRD3EKVPgAygBdBUNwMiD81T6GgGOGQALYDG3j8Wvx5wfFS2ti6l7/PHfYDrSJ8AGUALoLFN3+Ol/FVP3PscuW/fXJ0+ATKAFkCz9XeB+Nyn1xnpEyADaAE01X8PmHdfoaPvAQ4ZQAugsdL3576Zd+z50ydABtACaFan50Bii49pkgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABV0lEQVR4nO2aPWsCQRRFY9gqJIKFhbGQfBDBLm3+f5ciVYKCKCk2FhaBKLZavzvFMmziyTL3dE+W5bzLm3HY3d7Tw8vxIoPrUdblZ2e/6WVdf/lHHp3BAdACNJWu6efpLNR348dz+vw663oZ6rfFR6iLnwAHQAvQVPpD19e8ov14DxAcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUBT6bs0fY7e9WeE2o/2W/wEOABagCZ5L3DYfYf6ff6adcOrm0E7owbUry3FT4ADoAVoku8DlO1PXHOT8X2o6XOC/s9/1qtQD/txT9J+i58AB0AL0CTngMXXJtTT21Go6TWvqI+eE7QfpfgJcAC0AE2yB+ia7zraj+4JxU+AA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagSZ4HNPHfvh9Qn1yKnwAHQAvQnAB0ZD6cfejf/wAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABgUlEQVR4nO2aMUsDQRCFL5JCRIUIFmolCBHsBAvBX+3fELFSPBCszAlCAhqCnbbOLGQZvLvvwr6vm2RZ3j5m5vb2dnR5c/1T/WF6fFRF2NmbhMa3zeprERpfzxoTb7UpZhORAbQAmnFuwMX5VR86OuPx+W7t/8VngAygBdAkPWDTa97j11PPbk1cfAbIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoATXIm+Pr2YuLTk7PexHSBX4+n+AyQAbQAmuy3QV9D0e/xfRO9r1B8BsgAWgDNeNmM7C9TGw695j1er+8Jfr3FZ4AMoAXQJPuAh/rJxNF7g0PDr6eq1AMMMoAWQJN9F/B3a9vuCX5+z8HutokP99fv9XPzeYrPABlAC6BJekDfz/1ojefI6b9v3k1cfAbIAFoATXYf0DYfn8M6Xyg+A2QALYAm6QG+Rv/7XM7R9fy5nlN8BsgAWgBN0gPmy28Xx96vo3Q9f4rOBA0ygBZA8wuEsEaUV+FlQgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUklEQVR4nO2bv4vCQBBGL0cKCxEULNRKlFOwvub+/95OEAQrtRAUPJHrznpmi7D442nme90ESR4fs5vNxhRfo5//jwyavayfvzyftACNAqAFaEo/pif9nqln0+9n+jyc9WZl6vAdoABoAZrSH6jbmPcMB2NTh+8ABUAL0CgAWoBGAdACNAqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQJHuCft/c76G9O3ov4FAAtABNMgd4/Ji5/B4fJkMQvgMUAC1AU553hT0ysWXdxrwnfAcoAFqAJlkHzJcLU/v/DNWN8B2gAGgBmspngeV2Z+pOs2Hqbqt9k8D+lLfOyL1e1fnDd4ACoAVokjmAvu/fOqfkni98BygAWoAmmQP8ffPeY/LVCN8BCoAWoEnmgMP5z9Td1n0v6J8t6HVH+A5QALQATeG/Ha7bt8FVhO8ABUAL0FwBfpsww2cW0LwAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABh0lEQVR4nO2asUvDQBTGL9JBpBYUOrROojSCm+Cg+P8vDk6KhUIn7SBU0CJudfXeYY/wkvxM3vtt1+Saj4/vLu8uV1zd3WzDL8rpJGg4ODxS9c/x9fmu6j9/XUXtPdW/9QA3gBZAM8jdcHlx3YaOxli+LKJ2OY2vm0+AG0ALoEnmgK6PecnpyXnUlnOC+QS4AbQAGjeAFkDjBtACaLJrgb4h6wLzCXADaAE0bgAtgMYNoAXQJHWAXC/L92bX8f0AgRtAC6DJrgW6PidI/fLbovkEuAG0AJrK+wGPz/dN6MAwnwA3gBZAM9isiviXMm5qz+TkkGd2tGeUqmI+AW4ALYAmqQMe5k9Ru+0x2facYD4BbgAtgKaYnd1GZ4WHk+1f94YQQjge7qseuN58q/pXJafXfALcAFoATVIHyDEzHtV7/n882n397WP32qNuPeYT4AbQAmj+/Rmhuse8xHwC3ABaAE0yB6S1evxebnpMyufn6gYt5hPgBtACaCrvB/QN8wlwA2gBND+5n0Dr51yy0gAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABdUlEQVR4nO2bPUvEQBCGc7KV4IHFFWolCB7YCRbC/er7GxZWigHByrtCOEGDaHW2NxNwCfl4vMz7dLNhN29eZiebTTK5Xtxuix0uT0+KNhweHbfqn+Pr871V/3K1NvFBq9FGgAygBdAkP+f9HD4/uxhST+c8PN39eTx8BsgAWgBNGtuc91zNb0xcrpYmDp8BMoAWQCMDaAE0MoAWQJPGdt9vSvgMkAG0ABoZQAugkQG0AJr08vpsGsa2LvDX5wmfATKAFkCT/Lu2fa8JuTnvCZ8BMoAWQJN8g68JuXdr/42m3yeEzwAZQAugqdWAfcfXMF8TqvXExOEzQAbQAmjS24edM7Npv9/5Dc19+ehaVAMMMoAWQFNbB/ia4GlaI3LjdT3+pvpu1D98BsgAWgBN6vu+78fvet3h+8+m9rg/X1X8mDh8BsgAWgCNDKAF0MgAWgBN73uC9H5D/dlA+wEGGUALoEn+X9q+2VTDni9H+AyQAbQAml8slkzMIBNZowAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQ0lEQVR4nO2asQ4BQRRFka2EQolKiE10Wv/fKVTEJhIVSgXR0po7iY2sONbc071NVs7cvJnZjGlOx4t744lOPyj/nhYtQOMAaAGaTOf8PJ8F9Wg4+abPx9kfdkF9u5yDOvkOcAC0AE2mD+o+5xUdj64JyXeAA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagic4D/h2fCQoOgBagya6nZvBAz8zqfkao41GS7wAHQAvQRN8Buk+ut8u3frDd7VUzKkH9qpJ8BzgAWoAmuh+gFMdTUP/a/QHd51fFJqjzQf/l+8l3gAOgBWii7wCd8zqH6DmvqI9+J+h4lOQ7wAHQAjTRGlC2b9YNHY+uCcl3gAOgBWgcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHn7jtCv3R8o+/+/jOQ7wAHQAjQPMsI9FqsxS7oAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQUlEQVR4nO2aoQoCQRRFVSaJBuNqEgTBpk3w/4thk+KCYFKjQbFqfneDCItHnXva27CcubwZhplpL1bLRysjbud2qDuQx9fgAGgBmjQdFuFDtz8I9Xg0+aRP4xyO+1CXrW2os+8AB0AL0KR/m/OKjqesvAYEHAAtQOMAaAEaB0AL0DgAWoDGAdACNA6AFqBxALQATbpfL7QDSvYd4ABoAZqkH/Qc/dfPCHU8vhsUHAAtQFNbA3RfsNmt3/qh3jM0TdP7luw7wAHQAjS1NUCpTudQz6ezUNP7hNr9v9z96fuHXhGfRGXfAQ6AFqBJOscVnUP0nFfUR/cJr8aXfQc4AFqAprYP0Dn/6+h4dE3IvgMcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtADNy3sB5dveD6jPu2TfAQ6AFqB5AmmUO6FIXs0fAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABRklEQVR4nO2asWoCQRRFTZhKsEipqYSAEisDFoH8f5PCKkFBsDKWFoKttpm7xTDE7Fl993SzLMuZy3vD7O48vH28n3u/mIyGvRr6g6eq+6/N6Xioun/9s8/Gj9eUuUUcAC1Ak7TntafHzy9t+vw7/cEmG4evAAdAC9Cke+95RecXvgIcAC1Ak+6950uErwAHQAvQOABagMYB0AI0DoAWoHEAtABN2u7yb2TR3g3CV4ADoAVokv5bi7YmhK8AB0AL0CS9oGvC1+qz6oGz6eJvRgVqfUqErwAHQAvQNNYARc/UzCev2bjtfYKuMbpvWa6/s3HpzFP4CnAAtABN0h5XtIe69m6gPrqPKc0vfAU4AFqAprEPqD0r3HV0Pj4rLDgAWoDGAdACNA6AFqBxALQAjQOgBWgcAC1A4wBoARoHQAvQOABagOYCVgAynQlZGFoAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOElEQVR4nO2bwQsBQRSH0RwkFLUHnJSi3JSD8v9fnBWlnHBQFJIb53lbatrsl97vu83s1n79evt2ZtutzpaLd8UxNVqARgHQAjRh3O9FE9PJHFIph/1hF43dV4ACoAVoQqPVoR1KZTgYRWP3FaAAaAGaYO8Jb7ivAAVAC9AoAFqARgHQAjQKgBagUQC0AE2w78i87Q3cV4ACoAVowvN+jSa89QT3FaAAaAGaYCdsT1hvVqXJELivAAVAC9AoAFqARgHQAjThfIuf+1nb1/cC7itAAdACNLm9gO0JlsvjlXSBbrP+9Xhqz9keT0nnW6yP+wpQALQATUi9B7N2PC57HWG/bS56ffcVoABoAZrcOuDfKNpz3FeAAqAFaJJ7gH3u2r2BXSf8Gq0DCqIAaAGaqv4ddo4CoAVoPpR0Me34gHFfAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABeklEQVR4nO2asUoDQRRFN7KVaMAiRbQSxQjWNn62vyFipbggpDIrCAoaxE7ruVMMg7N7XOae7oUlOXN583ay7Ozs5OqnyWBvmXX56Gz7Wdb1OwN5TAYHQAvQtLqnV4fLoL44vxzTpzj3jzdB3W36oK6+AxwALUDT6gdT3/OKrqfbXAd19R3gAGgBGgdAC9A4AFqAxgHQAjQOgBagcQC0AI0DoAVooucB6+enoD4+Oh1NZgh0PUr1HeAAaAEaB0AL0DgAWoAmOgcoeh/9+nwfTKYEu/sHWddX3wEOgBagaaN3alZh+d/3vKK+OhN0vdV3gAOgBWiic8Bd9xDU+s7Q1ND1NI1nQIADoAVokv8F9L26v86E14+8c8Vinne2V98U1XeAA6AFaKIZMPR9X/e0zoTcPa+k/G/7l6CuvgMcAC1AE82A0nuSJnXuqL4DHAAtQBPNgLftd1Av5mV/sPR/ixS6Hj8PEBwALUCT/TygNEN/f4rqO8AB0AI0v8NqTSVA9X9QAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUElEQVR4nO2asWoCQRRF3TCVYJEyWogSSMAuYCH41f5GakFBDCnUIoWQiK22zhWyyIQc2XdP91ZWz17ejAvzqrfp5NS64KX71Cqh3Xksur+O48++6P7ldpfVD0Xf1gAcAC1Ak3TN6xoe9J7/0+fPmS/ef/08fAc4AFqAJjVtzSuj13FWL7ezrA7fAQ6AFqBxALQAjQOgBWhS0/73byV8BzgAWoDGAdACNA6AFqBJH5tVdiHae0H4DnAAtABN0rO2pu0J+jxK+A5wALQATdILuifUna0p9HxA3e8fdlVWh+8AB0AL0FztAcrXd77m+r1hVtPvCbpHfW7WWa2+SvgOcAC0AE2lc4KKzhDpefu9oXuCzgUq4TvAAdACNFfvAaWzwveGPo9nhQUHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUDjAGgBGgdAC9CcAYDuOTwDN8emAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABNElEQVR4nO2aQQsBURRG0VspysKCWYgUZacslP+/sVaUyGLGwkJRtqzfnZppFubQ/c7uvaQzX9/c3hjN5Wb9bjimRQvQKABagCbMhoNoYzFfQSr1cE6P0dp9AxQALUAT2p0e7VAr42Qard03QAHQAjTB3hPecN8ABUAL0CgAWoBGAdACNAqAFqBRALQATbC/kXl7NnDfAAVAC9CE1/MebXibCe4boABoAZpgN+xM2O23lb7w2+8Wq/qU4b4BCoAWoMnNAMvtEc+EUTKJ1nWfE+yMseeWS3qK1v1u8btP9w1QALQATThk18IP2P8Q/dqzgfWx55iy63PfAAVAC9DkzgH2nv937PXYmeC+AQqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQKABagEYB0AI0CoAWoPkA1dkt6kUtkpYAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUUlEQVR4nO2bMWvCQBiGVW4owQgtZFCnQqF7N6H/f3EWFAQndRAstKV0a1fvyyAf0Twk3/tsJwc+vrx3JvEcvr0v/gYXvM6mAw9F+eiaf2t+vj5c8zeHYzYe3VKmiygAWoAm2TVv1/Tz/KVNn7tTlNtsHL4BCoAWoEl9X/MW+/nCN0AB0AI0qe9r/hrhG6AAaAEaBUAL0CgAWoBGAdACNAqAFqBJu33+jCzavUH4BigAWoAm2d/Wou0J4RugAGgBmmRfsHvCar1sTYYgfAMUAC1AowBoARoFQAvQJHtuzntOsOuEb4ACoAVoavcCdk/w8jR+cM2vJr6zxl6/az7hG6AAaAGa2llhL6fP/PmBd017sb5Nr2PCN0AB0AI0teuAruG97rCEb4ACoAVo3HuA/d4/f/9m42rSTMhL0/cP3wAFQAvQDO1/h6MRvgEKgBag+Qfu+jOSBU5GcAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOklEQVR4nO2aMQvCMBQGrTgVKjg4qJMgKLgJDoL/f3EWFERxqI4OiquuvtchQ6BXm++2iJXrkRRJk622m0/nh/l41IkhLwZR14d4Px9R1x9vdzPuRv1aC1AAWoCmF/rCcrGuw6M28uJkxsnPAAWgBWgqz4C2rXnPdDIz4+RngALQAjQKQAvQKAAtQKMAtACNAtACNApAC9AoAC1AowC0AI0C0AI0lT3BS2n3zf0e2r/j7y/5GaAAtABN73XP7CdzO/RrJvR+vunnAzzJzwAFoAVogucDruXZjId9u8bpd4n+GRXy9SQ/AxSAFqDJ/DlBjz83SK/5EPvDzoz9uUBP8jNAAWgBmsr/gNizwk3D34/OCjsUgBagUQBagEYBaAEaBaAFaBSAFqBRAFqARgFoARoFoAVoFIAWoPkCQOwuh7kvX8IAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABLElEQVR4nO2asQrCMAAFq/gT6iQIFZ0UHAT/f3FwUiwITuroILjqal6HUFJ61b7bAlauRxJom95qu3lnX+SjYZbCYrZOuj7G4bRLur643YNxP+nf/gAHoAVoBrEf6JpZ5vNgPBlP6zWKoHvM5XoOxvviGIxje1rnZ4AD0AI0pT1A17yuoabXfAz1eT0fwVjvR+n8DHAAWoCmtAekPgu0Db0fPwsIDkAL0DgALUDjALQAjQPQAjQOQAvQOAAtQOMAtABN9LuAou/h6XeE6lOVzs8AB6AFaCrvAfreXb/Xt/18gNL5GeAAtACNzwfUo/W7OAAtQOPzAbUb/RgOQAvQ+HxAkzJtxAFoARoHoAVoHIAWoHEAWoDGAWgBGgegBWgcgBagcQBagMYBaAGaD9C3Qmb46VC5AAAAAElFTkSuQmCC\"","/**\n * Map-editor grid model: parsing, generation and autotiling.\n *\n * Extracted from MapEditor.tsx (2026-08-17). Every function here is pure and\n * touches no React — it was ~25% of that component's file with none of its\n * state, and living inside a route component meant none of it could be tested.\n *\n * Two of these are hand-ports of Rust in `game/src/board.rs` and MUST stay in\n * step with it, or the editor previews a layout the game will not produce:\n * - `pickWallTile` <- board.rs::pick_hard_handle (16-mask autotile)\n * - `rollSoftBlocks` <- board.rs::roll_map_cells + the pick_map spawn shuffle\n * Both are deterministic, which is what makes that drift testable at all.\n */\n\nimport { CHARACTER_ORDER, type CharacterId } from '@watchparty/shared';\n\nexport type CellChar = string; // 'H' | '.' | '1'..'9' | 'A'\nexport type Grid = CellChar[][];\n\nexport interface MapState {\n width: number;\n height: number;\n grid: Grid;\n}\n\n// Default dimensions per player count, copied from the in-tree\n// game/assets/maps/p{NN}/m01.map headers. The editor lets the operator\n// resize manually after the initial seed.\nexport const DEFAULT_DIMS: Record<number, [number, number]> = {\n 2: [11, 9],\n 3: [11, 9],\n 4: [13, 11],\n 5: [13, 11],\n 6: [17, 15],\n 7: [17, 15],\n 8: [19, 17],\n 9: [19, 17],\n 10: [21, 19],\n};\n\nexport const SPAWN_DIGITS = '123456789A';\n\n// The character previewed on each spawn digit: the character order, one per spawn.\nexport const SPAWN_CHARS: readonly CharacterId[] = CHARACTER_ORDER.slice(0, SPAWN_DIGITS.length);\n\n// Cardinal steps (N/S/E/W) used for both the autotile mask and the\n// spawn-safety-corridor clearing in rollSoftBlocks.\nexport const CARDINALS: ReadonlyArray<[number, number]> = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n// Diagonal steps used by the spawn safety pattern (1-deep) so the second\n// bomb after the bot moves into the corridor has a perpendicular flee\n// path. Matches the diagonal block in game/src/board.rs::roll_map_cells.\nexport const DIAGONALS: ReadonlyArray<[number, number]> = [[1, 1], [1, -1], [-1, 1], [-1, -1]];\n\n// Per-spawn safety: 2-deep cardinal + 1-deep diagonal \"hashtag\" pattern\n// (13 cells per spawn) — kept in sync with board.rs::roll_map_cells so\n// the editor preview matches in-game reality.\nexport const SPAWN_CLEAR_DEPTH = 2;\n\nexport const TILE_NAMES = [\n 'floor',\n 'soft_block',\n 'wall_iso',\n 'wall_h',\n 'wall_v',\n 'wall_cross',\n 'wall_cap_n',\n 'wall_cap_s',\n 'wall_cap_e',\n 'wall_cap_w',\n 'wall_corner_ne',\n 'wall_corner_nw',\n 'wall_corner_se',\n 'wall_corner_sw',\n 'wall_t_n',\n 'wall_t_s',\n 'wall_t_e',\n 'wall_t_w',\n];\n\nexport function spawnIndex(digit: string): number {\n return digit === 'A' ? 9 : parseInt(digit, 10) - 1;\n}\n\nexport function spawnSpriteFor(digit: string): CharacterId {\n return SPAWN_CHARS[spawnIndex(digit) % SPAWN_CHARS.length];\n}\n\n/** Same 16-mask autotile picker as board.rs::pick_hard_handle. The\n * off-board-is-floor convention makes border cells render as clean\n * straights and the four corners pick their corner art. */\nexport function pickWallTile(grid: Grid, c: number, r: number): string {\n const w = grid[0]?.length ?? 0;\n const h = grid.length;\n const wall = (cc: number, rr: number) =>\n cc >= 0 && rr >= 0 && cc < w && rr < h && grid[rr][cc] === 'H';\n const n = wall(c, r - 1) ? 1 : 0;\n const e = wall(c + 1, r) ? 1 : 0;\n const s = wall(c, r + 1) ? 1 : 0;\n const we = wall(c - 1, r) ? 1 : 0;\n const mask = (n << 3) | (e << 2) | (s << 1) | we;\n switch (mask) {\n case 0: return 'wall_iso';\n case 1: return 'wall_cap_e';\n case 2: return 'wall_cap_n';\n case 3: return 'wall_corner_sw';\n case 4: return 'wall_cap_w';\n case 5: return 'wall_h';\n case 6: return 'wall_corner_se';\n case 7: return 'wall_t_n';\n case 8: return 'wall_cap_s';\n case 9: return 'wall_corner_nw';\n case 10: return 'wall_v';\n case 11: return 'wall_t_e';\n case 12: return 'wall_corner_ne';\n case 13: return 'wall_t_s';\n case 14: return 'wall_t_w';\n case 15:\n // All 4 cardinal neighbors are walls — this is genuinely a +\n // intersection and renders as wall_cross. (The previous\n // diagonal-based disambiguation here picked T / corner pieces\n // that HID one or two arms — e.g. floorSE → wall_t_w deleted the\n // visible west arm even though W is wall — which the operator\n // reported as \"W weirdly disconnected\" when N got added to a\n // pre-existing W/S/E cross.)\n return 'wall_cross';\n default: return 'wall_iso';\n }\n}\n\n/** JS port of board.rs::roll_map_cells + the spawn-shuffle in pick_map.\n *\n * Mirrors the runtime exactly: gather spawns in digit order, Fisher-\n * Yates shuffle, take `playerCount`, clear a \"hashtag\" safety pattern\n * (2-deep cardinal + 1-deep diagonal, 13 cells per spawn) at each USED\n * spawn, then roll 80% softs on every other floor cell.\n *\n * When the map has more spawns than `playerCount`, this means each roll\n * shows a different subset of spawns as \"the lucky ones whose corridors\n * are clear\" — same as what the game actually does at match start. */\nexport function rollSoftBlocks(grid: Grid, seed: number, playerCount: number): Set<string> {\n const w = grid[0]?.length ?? 0;\n const h = grid.length;\n\n let state = (seed | 1) >>> 0;\n const next = () => {\n state ^= state << 13;\n state >>>= 0;\n state ^= state >>> 17;\n state ^= state << 5;\n state >>>= 0;\n return state;\n };\n\n const spawns: { c: number; r: number; digit: string }[] = [];\n for (let r = 0; r < h; r++) {\n for (let c = 0; c < w; c++) {\n if (/^[1-9A]$/.test(grid[r][c])) {\n spawns.push({ c, r, digit: grid[r][c] });\n }\n }\n }\n // Sort by digit so the shuffle starts from the same canonical order\n // the game's parse_map produces (sorted by spawn id 1..A).\n spawns.sort((a, b) => SPAWN_DIGITS.indexOf(a.digit) - SPAWN_DIGITS.indexOf(b.digit));\n // Fisher-Yates over the full spawn list — matches board.rs::pick_map.\n for (let i = spawns.length - 1; i >= 1; i--) {\n const j = next() % (i + 1);\n [spawns[i], spawns[j]] = [spawns[j], spawns[i]];\n }\n\n const usedSpawns = spawns.slice(0, Math.max(0, Math.min(playerCount, spawns.length)));\n\n const clear = new Set<string>();\n for (const { c, r } of usedSpawns) {\n clear.add(`${c},${r}`);\n for (const [dc, dr] of CARDINALS) {\n for (let step = 1; step <= SPAWN_CLEAR_DEPTH; step++) {\n clear.add(`${c + dc * step},${r + dr * step}`);\n }\n }\n for (const [dc, dr] of DIAGONALS) {\n clear.add(`${c + dc},${r + dr}`);\n }\n }\n\n const softs = new Set<string>();\n for (let r = 0; r < h; r++) {\n for (let c = 0; c < w; c++) {\n if (grid[r][c] !== '.') continue;\n const key = `${c},${r}`;\n if (clear.has(key)) continue;\n if (next() % 100 < 80) softs.add(key);\n }\n }\n return softs;\n}\n\n/** Parse raw .map text into a MapState. Comment lines (leading `#`) and\n * blank lines are stripped before validation. Used by the Library Load\n * button (response body straight from the server) — kept pure so it has\n * no React/DOM dependencies. */\nexport function parseMapText(text: string): { ok: true; map: MapState } | { ok: false; error: string } {\n const lines = text\n .split(/\\r?\\n/)\n .filter((l) => !l.startsWith('#') && l.trim().length > 0);\n if (lines.length < 5) {\n return { ok: false, error: 'Need at least 5 non-comment lines.' };\n }\n const w = lines[0].length;\n if (!lines.every((l) => l.length === w)) {\n return { ok: false, error: 'All rows must have the same width.' };\n }\n const grid: Grid = lines.map((l) =>\n l.split('').map((ch) => {\n if (ch === 'H' || ch === '.') return ch;\n if (/^[1-9Aa]$/.test(ch)) return ch.toUpperCase();\n return '.';\n }),\n );\n return { ok: true, map: { width: w, height: lines.length, grid } };\n}\n\nexport function makeBlankMap(w: number, h: number): MapState {\n const grid: Grid = [];\n for (let r = 0; r < h; r++) {\n const row: CellChar[] = [];\n for (let c = 0; c < w; c++) {\n const onBorder = r === 0 || r === h - 1 || c === 0 || c === w - 1;\n row.push(onBorder ? 'H' : '.');\n }\n grid.push(row);\n }\n return { width: w, height: h, grid };\n}\n\nexport function nextSpawnDigit(grid: Grid): string | null {\n const used = new Set<string>();\n for (const row of grid) {\n for (const ch of row) {\n if (/^[1-9A]$/.test(ch)) used.add(ch);\n }\n }\n for (const d of SPAWN_DIGITS) {\n if (!used.has(d)) return d;\n }\n return null;\n}\n","/**\n * Standalone Bomberman map editor.\n *\n * Outputs the same `.map` text format the game's `parse_map` consumes\n * (`H` = hard wall, `.` = floor, digit/`A` = numbered spawn). Soft blocks\n * are never authored — the game's `roll_map_cells` rolls 80% softs onto\n * floor cells at world-build time (with the per-spawn safety corridor),\n * so the editor only models walls + spawns + floor and provides a\n * \"Roll softs\" preview button so you can sanity-check density.\n *\n * Rendering uses a single `<canvas>` (not 399 React divs): autotile\n * sprite picking + drawImage is O(w*h) per state change with no React\n * reconciliation in the hot path — drag-paint stays smooth at p10.\n *\n * Wall autotiling mirrors `board.rs::pick_hard_handle` so what the\n * editor renders is what the in-game world renders. Tile + character\n * art is fetched from `/game-assets/` (mounted by the server next to\n * `/game/`) so we don't duplicate PNGs into the React bundle.\n *\n * Friend-tier auth required (gated at the route level in router.tsx and\n * at every /api/maps endpoint server-side). The editor writes directly\n * to `game/assets/maps/p{NN}/{name}.map` via the server — the operator\n * git-adds + commits + pushes the diff themselves. Only a dev server\n * accepts writes (`MAP_EDITOR_WRITES`); elsewhere a save fails with the\n * server's reason, since the game there has its maps built in.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { getRuntimeServerOrigin } from '../lib/config';\nimport { spriteUrlFor } from '../lib/characters';\n\n/** The server's own message for a refused edit (a read-only host says why),\n * else the status. */\nasync function failureReason(res: Response): Promise<string> {\n try {\n const body = await res.json() as { message?: unknown };\n if (typeof body.message === 'string' && body.message) return body.message;\n } catch {\n // Not JSON (an edge error page): the status is all there is.\n }\n return `HTTP ${res.status}`;\n}\n\n// Bundle tile PNGs INTO the UI bundle via Vite's glob import.\n// Why same-origin: the editor used to fetch from `${serverOrigin}/game-assets/`\n// but the parent site's CSP can block cross-origin img loads (img-src not\n// covering watchparty.hadoku.me). Inlining as Vite assets ships them at\n// `${UI_BUNDLE_ORIGIN}/.../mf/watchparty/assets/...` so they always\n// resolve same-origin.\nconst TILE_URLS = import.meta.glob('../assets/games/bomberman/tiles/*.png', {\n eager: true,\n import: 'default',\n}) as Record<string, string>;\nfunction bundledTileUrl(name: string): string | null {\n return TILE_URLS[`../assets/games/bomberman/tiles/${name}.png`] ?? null;\n}\n\nimport {\n type CellChar, type Grid, type MapState,\n DEFAULT_DIMS, SPAWN_CHARS, SPAWN_DIGITS, TILE_NAMES,\n spawnSpriteFor, pickWallTile, rollSoftBlocks,\n parseMapText, makeBlankMap, nextSpawnDigit,\n} from '../lib/mapEditorGrid';\n\ntype Tool = 'wall' | 'spawn' | 'floor';\n\nexport default function MapEditor() {\n const navigate = useNavigate();\n const [players, setPlayers] = useState(4);\n const [map, setMap] = useState<MapState>(() => {\n const [w, h] = DEFAULT_DIMS[4];\n return makeBlankMap(w, h);\n });\n\n // Soft-block preview: rolled on demand via the toolbar button. Cleared\n // whenever the underlying grid changes structurally (player count,\n // resize, library load) so a stale layout from a prior grid never\n // shows up on the new one — the user has to roll fresh.\n const [softs, setSofts] = useState<Set<string>>(new Set());\n\n // Library state — list of saved map files grouped by player count, the\n // currently-selected file (so Save knows where to PUT), and the new-name\n // input value for \"Save as new\". Status is a one-line banner under the\n // buttons reporting the last action's result.\n type LibraryEntry = { players: number; files: string[] };\n const [library, setLibrary] = useState<LibraryEntry[]>([]);\n const [libraryLoading, setLibraryLoading] = useState(false);\n const [selected, setSelected] = useState<string>(''); // \"p04/m01.map\" or ''\n const [newName, setNewName] = useState('');\n const [status, setStatus] = useState<{ kind: 'ok' | 'err'; text: string } | null>(null);\n\n const origin = useMemo(() => getRuntimeServerOrigin(), []);\n\n // Sprite cache. Bundled PNGs (TILE_URLS / CHARACTER_URLS) resolve to\n // same-origin URLs hashed into the UI bundle, so cross-origin CSP /\n // CORS issues with watchparty.hadoku.me's /game-assets/ never bite.\n // The canvas redraw effect waits on `spritesReady` so we don't flash\n // empty cells.\n const spriteCacheRef = useRef<Record<string, HTMLImageElement>>({});\n const [spritesReady, setSpritesReady] = useState(false);\n\n useEffect(() => {\n let mounted = true;\n function loadOne(key: string, url: string | null | undefined): Promise<void> {\n if (!url) return Promise.resolve();\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n if (mounted) spriteCacheRef.current[key] = img;\n resolve();\n };\n img.onerror = () => {\n \n console.warn('[MapEditor] sprite failed to load', { key, url });\n resolve();\n };\n img.src = url;\n });\n }\n Promise.all([\n ...TILE_NAMES.map((t) => loadOne(t, bundledTileUrl(t))),\n // Characters come from the server like every other avatar in the app.\n ...SPAWN_CHARS.map((c) => loadOne(`char:${c}`, spriteUrlFor(c))),\n ]).then(() => {\n if (mounted) setSpritesReady(true);\n });\n return () => {\n mounted = false;\n };\n }, []);\n\n // Paint one or more cells in a SINGLE state update. Drag-paint funnels\n // all cells from one mouse-move's interpolation through here in one\n // setMap; React 18's batching was dropping cells when this was N calls.\n // The tool is passed in (not a useState) so the active mouse button +\n // shift modifier picked at mousedown determines the action — no\n // toolbar tool selector needed.\n const applyCells = useCallback((cells: { c: number; r: number }[], t: Tool) => {\n if (cells.length === 0) return;\n setMap((prev) => {\n const grid = prev.grid.map((row) => [...row]);\n for (const { c, r } of cells) {\n if (r < 0 || r >= prev.height || c < 0 || c >= prev.width) continue;\n if (t === 'wall') {\n grid[r][c] = 'H';\n } else if (t === 'floor') {\n grid[r][c] = '.';\n } else if (t === 'spawn') {\n // Shift+left on an existing spawn cell removes it. Shift+left\n // on a wall is a no-op — the operator has to clear walls first\n // if they want a spawn there (prevents accidentally punching\n // a hole in the border on a stray click).\n if (/^[1-9A]$/.test(grid[r][c])) {\n grid[r][c] = '.';\n } else if (grid[r][c] === '.') {\n const used = new Set<string>();\n for (const row of grid) {\n for (const ch of row) {\n if (/^[1-9A]$/.test(ch)) used.add(ch);\n }\n }\n let nextDigit: string | null = null;\n for (const d of SPAWN_DIGITS) {\n if (!used.has(d)) { nextDigit = d; break; }\n }\n if (nextDigit) grid[r][c] = nextDigit;\n }\n }\n }\n return { ...prev, grid };\n });\n // Any grid mutation invalidates the soft-block preview — the layout\n // would no longer correspond to the displayed grid.\n setSofts((s) => (s.size === 0 ? s : new Set()));\n }, []);\n\n // Drag-paint via canvas pointer events. Tool is implied by mouse button\n // + Shift modifier at the moment the drag starts:\n // Left-click → wall\n // Shift + Left-click → spawn (single placement, no drag-paint)\n // Right-click → floor (erase)\n // Captured into `dragToolRef` on mousedown so a mid-drag shift-release\n // doesn't change the tool mid-stroke. Cleared on mouseup or when\n // `buttons` drops to 0 inside the move handler (covers the \"still\n // thinks I'm dragging\" bug when mouseup happened off-canvas).\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const lastCellRef = useRef<{ c: number; r: number } | null>(null);\n const dragToolRef = useRef<Tool | null>(null);\n\n const cellFromEvent = useCallback((e: React.MouseEvent): { c: number; r: number } | null => {\n const canvas = canvasRef.current;\n if (!canvas) return null;\n const box = canvas.getBoundingClientRect();\n const x = e.clientX - box.left;\n const y = e.clientY - box.top;\n if (x < 0 || y < 0 || x >= box.width || y >= box.height) return null;\n const cellW = box.width / map.width;\n const cellH = box.height / map.height;\n return { c: Math.floor(x / cellW), r: Math.floor(y / cellH) };\n }, [map.width, map.height]);\n\n const paintCellsBetween = useCallback((from: { c: number; r: number }, to: { c: number; r: number }, t: Tool) => {\n const dx = Math.abs(to.c - from.c);\n const dy = Math.abs(to.r - from.r);\n const steps = Math.max(dx, dy);\n const cells: { c: number; r: number }[] = [];\n if (steps === 0) {\n cells.push({ c: to.c, r: to.r });\n } else {\n for (let i = 0; i <= steps; i++) {\n const tt = i / steps;\n cells.push({\n c: Math.round(from.c + (to.c - from.c) * tt),\n r: Math.round(from.r + (to.r - from.r) * tt),\n });\n }\n }\n applyCells(cells, t);\n }, [applyCells]);\n\n const handleCanvasDown = (e: React.MouseEvent) => {\n let t: Tool | null = null;\n if (e.button === 0) t = e.shiftKey ? 'spawn' : 'wall';\n else if (e.button === 2) t = 'floor';\n if (!t) return;\n e.preventDefault();\n dragToolRef.current = t;\n const hit = cellFromEvent(e);\n if (!hit) return;\n // Capture pointer so move/up keep firing even if the cursor leaves\n // the canvas mid-drag (fixes \"drag stops working when I cross into\n // the sidebar\").\n (e.currentTarget as HTMLElement).setPointerCapture?.((e as unknown as PointerEvent).pointerId);\n applyCells([hit], t);\n lastCellRef.current = hit;\n };\n const handleCanvasMove = (e: React.MouseEvent) => {\n const t = dragToolRef.current;\n if (!t) return;\n // Either button still held? bit 0 = left, bit 1 = right. If neither\n // is held the user released — end the drag.\n if ((e.buttons & 0b11) === 0) {\n dragToolRef.current = null;\n lastCellRef.current = null;\n return;\n }\n if (t === 'spawn') return; // single placement, no drag-paint\n const hit = cellFromEvent(e);\n if (!hit) return;\n const prev = lastCellRef.current;\n if (prev) {\n if (prev.c === hit.c && prev.r === hit.r) return;\n paintCellsBetween(prev, hit, t);\n } else {\n applyCells([hit], t);\n }\n lastCellRef.current = hit;\n };\n const handleCanvasUp = (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).releasePointerCapture?.((e as unknown as PointerEvent).pointerId);\n dragToolRef.current = null;\n lastCellRef.current = null;\n };\n // Window-level mouseup / blur safety net: any release outside the\n // canvas, an alt-tab, or a modal opening all clear the drag so the\n // next move doesn't keep painting.\n useEffect(() => {\n const onUp = () => {\n dragToolRef.current = null;\n lastCellRef.current = null;\n };\n window.addEventListener('mouseup', onUp);\n window.addEventListener('blur', onUp);\n return () => {\n window.removeEventListener('mouseup', onUp);\n window.removeEventListener('blur', onUp);\n };\n }, []);\n\n const changePlayers = (n: number) => {\n setPlayers(n);\n const [w, h] = DEFAULT_DIMS[n];\n setMap(makeBlankMap(w, h));\n setSofts(new Set());\n };\n\n const resize = (newW: number, newH: number) => {\n if (newW < 5 || newW > 31 || newH < 5 || newH > 31) return;\n setMap((prev) => {\n const grid: Grid = [];\n for (let r = 0; r < newH; r++) {\n const row: CellChar[] = [];\n for (let c = 0; c < newW; c++) {\n const onBorder = r === 0 || r === newH - 1 || c === 0 || c === newW - 1;\n if (onBorder) {\n row.push('H');\n } else if (r < prev.height && c < prev.width) {\n row.push(prev.grid[r][c]);\n } else {\n row.push('.');\n }\n }\n grid.push(row);\n }\n return { width: newW, height: newH, grid };\n });\n setSofts(new Set());\n };\n\n const clearInterior = () => {\n setMap((prev) => {\n const grid = prev.grid.map((row, r) =>\n row.map((_cell, c) => {\n const onBorder = r === 0 || r === prev.height - 1 || c === 0 || c === prev.width - 1;\n return onBorder ? 'H' : '.';\n }),\n );\n return { ...prev, grid };\n });\n setSofts(new Set());\n };\n\n // Spawn count drives the save-target group ceiling — you can save a\n // map under p{NN}/ only when it has at least NN spawns. The game\n // shuffles + takes N at match start (see board.rs::pick_map), so a\n // 4-spawn map saved under p02 works fine: 2 of 4 spawns chosen\n // randomly each round.\n // Declared BEFORE rollSofts/hideSofts so the useCallback dep array\n // doesn't TDZ against saveTarget — same class of bug the 'h' before\n // init crash was. Reorder, don't hoist with vars.\n const spawnCount = useMemo(() => {\n let n = 0;\n for (const row of map.grid) {\n for (const ch of row) {\n if (/^[1-9A]$/.test(ch)) n += 1;\n }\n }\n return n;\n }, [map]);\n\n // Save-target = which p{NN} folder the next \"Save as new\" lands in.\n // Defaults to the current spawn count (saves a 4-spawn map as a\n // 4-player map). Operator can override down to 2 so the same map\n // serves smaller player counts with extra-spawn variety.\n const [saveTarget, setSaveTarget] = useState(4);\n useEffect(() => {\n setSaveTarget((cur) => {\n // Clamp down if the spawn count dropped below the chosen target.\n // Leave manual choices intact when they're still valid.\n if (spawnCount < 2) return 2;\n if (cur > spawnCount) return spawnCount;\n return cur;\n });\n }, [spawnCount]);\n\n // Roll a fresh soft-block layout against the current grid. Each click\n // uses a different seed (perf.now-based) so the operator can re-roll\n // to spot-check density variance.\n const rollSofts = useCallback(() => {\n const seed = (Math.floor(performance.now() * 1000) ^ 0x9E3779B9) >>> 0;\n setSofts(rollSoftBlocks(map.grid, seed || 1, saveTarget));\n }, [map.grid, saveTarget]);\n const hideSofts = () => setSofts(new Set());\n\n const exportText = useMemo(() => {\n const designedFor = Math.min(saveTarget, spawnCount);\n const extra = spawnCount > designedFor ? ` (${spawnCount} spawn variants)` : '';\n const header =\n `# ${designedFor}-player map${extra} · custom · edited via map editor\\n` +\n `# dims: ${map.width}x${map.height} · spawns: ${spawnCount}`;\n const body = map.grid.map((row) => row.join('')).join('\\n');\n return `${header}\\n${body}\\n`;\n }, [map, spawnCount, saveTarget]);\n\n // ---- Library actions ----\n const refreshLibrary = useCallback(async () => {\n setLibraryLoading(true);\n try {\n const res = await fetch(`${origin}/api/maps`);\n if (!res.ok) {\n setStatus({ kind: 'err', text: `List failed: HTTP ${res.status}` });\n return;\n }\n const data = await res.json() as { groups: LibraryEntry[] };\n setLibrary(data.groups ?? []);\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'network error';\n setStatus({ kind: 'err', text: `List failed: ${message}` });\n } finally {\n setLibraryLoading(false);\n }\n }, [origin]);\n\n useEffect(() => { void refreshLibrary(); }, [refreshLibrary]);\n\n const splitKey = (key: string): { nn: string; name: string } | null => {\n const m = key.match(/^p(0[2-9]|10)\\/([A-Za-z0-9_-]+)\\.map$/);\n if (!m) return null;\n return { nn: m[1], name: m[2] };\n };\n\n const loadSelected = useCallback(async () => {\n setStatus(null);\n const parts = splitKey(selected);\n if (!parts) {\n setStatus({ kind: 'err', text: 'Pick a map first.' });\n return;\n }\n try {\n const res = await fetch(`${origin}/api/maps/p${parts.nn}/${parts.name}`);\n if (!res.ok) {\n setStatus({ kind: 'err', text: `Load failed: HTTP ${res.status}` });\n return;\n }\n const body = await res.text();\n const parsed = parseMapText(body);\n if (!parsed.ok) {\n setStatus({ kind: 'err', text: `Parse failed: ${parsed.error}` });\n return;\n }\n setMap(parsed.map);\n setSofts(new Set()); // stale soft layout from prior grid is no longer valid\n setStatus({ kind: 'ok', text: `Loaded ${selected}` });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'network error';\n setStatus({ kind: 'err', text: `Load failed: ${message}` });\n }\n }, [origin, selected]);\n\n const writeMap = useCallback(async (nn: string, name: string, opts: { confirmText?: string } = {}) => {\n if (opts.confirmText && !window.confirm(opts.confirmText)) return false;\n setStatus(null);\n try {\n const res = await fetch(`${origin}/api/maps/p${nn}/${name}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/plain' },\n body: exportText,\n });\n if (!res.ok) {\n setStatus({ kind: 'err', text: `Save failed: ${await failureReason(res)}` });\n return false;\n }\n setStatus({ kind: 'ok', text: `Saved p${nn}/${name}.map` });\n setSelected(`p${nn}/${name}.map`);\n await refreshLibrary();\n return true;\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'network error';\n setStatus({ kind: 'err', text: `Save failed: ${message}` });\n return false;\n }\n }, [origin, exportText, refreshLibrary]);\n\n const saveOverwrite = useCallback(async () => {\n const parts = splitKey(selected);\n if (!parts) {\n setStatus({ kind: 'err', text: 'Pick a map first or use \"Save as new\".' });\n return;\n }\n const folderN = parseInt(parts.nn, 10);\n if (spawnCount < folderN) {\n setStatus({\n kind: 'err',\n text: `p${parts.nn} maps need ≥${folderN} spawns — current map has ${spawnCount}.`,\n });\n return;\n }\n await writeMap(parts.nn, parts.name, { confirmText: `Overwrite ${selected}?` });\n }, [selected, spawnCount, writeMap]);\n\n const saveAsNew = useCallback(async () => {\n if (spawnCount < 2) {\n setStatus({ kind: 'err', text: `Place at least 2 spawns before saving (have ${spawnCount}).` });\n return;\n }\n if (saveTarget < 2 || saveTarget > spawnCount || saveTarget > 10) {\n setStatus({\n kind: 'err',\n text: `Target ${saveTarget} invalid — must be 2..${Math.min(10, spawnCount)} for this map.`,\n });\n return;\n }\n const nn = String(saveTarget).padStart(2, '0');\n const name = newName.trim();\n if (!/^[A-Za-z0-9_-]+$/.test(name)) {\n setStatus({ kind: 'err', text: 'New name: alphanumeric / underscore / hyphen, no .map suffix.' });\n return;\n }\n const key = `p${nn}/${name}.map`;\n const existing = library.find((g) => g.players === saveTarget)?.files ?? [];\n const confirmText = existing.includes(`${name}.map`) ? `Overwrite ${key}?` : undefined;\n const ok = await writeMap(nn, name, { confirmText });\n if (ok) setNewName('');\n }, [spawnCount, saveTarget, newName, library, writeMap]);\n\n const deleteSelected = useCallback(async () => {\n const parts = splitKey(selected);\n if (!parts) {\n setStatus({ kind: 'err', text: 'Pick a map first.' });\n return;\n }\n if (!window.confirm(`Delete ${selected}?`)) return;\n setStatus(null);\n try {\n const res = await fetch(`${origin}/api/maps/p${parts.nn}/${parts.name}`, { method: 'DELETE' });\n if (!res.ok) {\n setStatus({ kind: 'err', text: `Delete failed: ${await failureReason(res)}` });\n return;\n }\n setStatus({ kind: 'ok', text: `Deleted ${selected}` });\n setSelected('');\n await refreshLibrary();\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'network error';\n setStatus({ kind: 'err', text: `Delete failed: ${message}` });\n }\n }, [origin, selected, refreshLibrary]);\n\n const suggestedName = useMemo(() => {\n const files = library.find((g) => g.players === saveTarget)?.files ?? [];\n const used = new Set<string>(files);\n for (let n = 1; n <= 99; n++) {\n const candidate = `m${String(n).padStart(2, '0')}.map`;\n if (!used.has(candidate)) return candidate.replace(/\\.map$/, '');\n }\n return 'custom';\n }, [library, saveTarget]);\n\n // Cell size — fit roughly 60% width, 75% viewport-min height.\n const cellSize = useMemo(() => {\n if (typeof window === 'undefined') return 32;\n const maxByW = (window.innerWidth - 360) / map.width;\n const maxByH = (window.innerHeight - 160) / map.height;\n return Math.max(16, Math.floor(Math.min(maxByW, maxByH)));\n }, [map.width, map.height]);\n\n // Imperative canvas redraw — runs once per state change. O(w*h) sprite\n // draws + no React reconciliation. The 21x19 p10 layout drops from\n // 399 div re-renders per paint to one canvas pass.\n useEffect(() => {\n if (!spritesReady) return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const cssW = map.width * cellSize;\n const cssH = map.height * cellSize;\n if (canvas.width !== cssW * dpr || canvas.height !== cssH * dpr) {\n canvas.width = cssW * dpr;\n canvas.height = cssH * dpr;\n }\n canvas.style.width = `${cssW}px`;\n canvas.style.height = `${cssH}px`;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.imageSmoothingEnabled = false;\n ctx.clearRect(0, 0, cssW, cssH);\n\n const cache = spriteCacheRef.current;\n const floorImg = cache.floor;\n const softImg = cache.soft_block;\n\n for (let r = 0; r < map.height; r++) {\n for (let c = 0; c < map.width; c++) {\n const x = c * cellSize;\n const y = r * cellSize;\n const cell = map.grid[r][c];\n const isWall = cell === 'H';\n const isSpawn = /^[1-9A]$/.test(cell);\n const isSoft = !isWall && !isSpawn && softs.has(`${c},${r}`);\n\n if (floorImg) ctx.drawImage(floorImg, x, y, cellSize, cellSize);\n\n if (isWall) {\n const img = cache[pickWallTile(map.grid, c, r)];\n if (img) ctx.drawImage(img, x, y, cellSize, cellSize);\n } else if (isSoft) {\n if (softImg) ctx.drawImage(softImg, x, y, cellSize, cellSize);\n } else if (isSpawn) {\n const img = cache[`char:${spawnSpriteFor(cell)}`];\n if (img) ctx.drawImage(img, x, y, cellSize, cellSize);\n // Spawn-number badge, top-right corner of the cell.\n const fontSize = Math.max(10, Math.floor(cellSize / 4));\n ctx.font = `800 ${fontSize}px ui-sans-serif, system-ui, sans-serif`;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'top';\n ctx.lineWidth = 3;\n ctx.strokeStyle = '#000';\n ctx.fillStyle = '#fff';\n const tx = x + cellSize - 2;\n const ty = y + 2;\n ctx.strokeText(cell, tx, ty);\n ctx.fillText(cell, tx, ty);\n }\n }\n }\n }, [map, softs, cellSize, spritesReady]);\n\n const utilBtnClass =\n 'px-3 py-1.5 text-sm bg-bg-card border border-border rounded hover:bg-bg-hover whitespace-nowrap';\n // Keycap styling for the input legend below the toolbar.\n const keycap = 'inline-block min-w-[20px] px-1.5 py-0.5 mx-0.5 bg-bg border border-border rounded text-[11px] font-mono font-semibold text-text';\n\n return (\n <div className=\"flex w-full h-full overflow-hidden bg-bg text-text\">\n {/* Toolbar + grid */}\n <div className=\"flex-1 flex flex-col items-center min-w-0 overflow-auto p-4\">\n {/* Toolbar — three shrink-0 groups so the inner buttons never reflow.\n The Tools group has a hard min-width on each tool button so\n \"Spawn (10)\" doesn't push neighbors to a new row. Whole bar\n scrolls horizontally on a small viewport rather than wrapping. */}\n <div className=\"w-full max-w-6xl flex items-center gap-3 mb-3 flex-nowrap overflow-x-auto\">\n <div className=\"flex items-center gap-2 shrink-0\">\n <button onClick={() => navigate('/')} className={utilBtnClass}>\n ← Home\n </button>\n <h1 className=\"text-xl font-bold ml-1\">Map Editor</h1>\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n <label className=\"text-sm text-text-secondary\">Default for:</label>\n <select\n value={players}\n onChange={(e) => changePlayers(parseInt(e.target.value, 10))}\n className=\"px-2 py-1 bg-bg-card border border-border rounded text-sm\"\n >\n {[2, 3, 4, 5, 6, 7, 8, 9, 10].map((n) => (\n <option key={n} value={n}>\n {n} players\n </option>\n ))}\n </select>\n <label className=\"text-sm text-text-secondary ml-2\">W</label>\n <input\n type=\"number\"\n min={5}\n max={31}\n value={map.width}\n onChange={(e) => resize(parseInt(e.target.value, 10) || map.width, map.height)}\n className=\"w-16 px-2 py-1 bg-bg-card border border-border rounded text-sm\"\n />\n <label className=\"text-sm text-text-secondary\">H</label>\n <input\n type=\"number\"\n min={5}\n max={31}\n value={map.height}\n onChange={(e) => resize(map.width, parseInt(e.target.value, 10) || map.height)}\n className=\"w-16 px-2 py-1 bg-bg-card border border-border rounded text-sm\"\n />\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0 ml-auto\">\n <span className=\"text-sm text-text-secondary whitespace-nowrap\">\n Spawns: <span className=\"font-bold text-text\">{spawnCount}</span>/10\n </span>\n <button onClick={clearInterior} className={utilBtnClass}>\n Clear interior\n </button>\n <button\n onClick={softs.size > 0 ? hideSofts : rollSofts}\n className={utilBtnClass}\n title=\"Preview a random soft-block layout. Re-click to re-roll.\"\n >\n {softs.size > 0 ? `Hide softs (${softs.size})` : 'Roll softs'}\n </button>\n </div>\n </div>\n\n {/* Input legend — tool is implied by mouse button + shift, not a\n modal selector. Keeps the toolbar from needing 3 wide tool\n buttons that resize as the spawn count grows. */}\n <div className=\"text-xs text-text-secondary mb-2 max-w-6xl w-full flex flex-wrap items-center gap-x-4 gap-y-1\">\n <span><span className={keycap}>LMB</span> wall · drag to paint</span>\n <span><span className={keycap}>RMB</span> floor (erase) · drag to wipe</span>\n <span>\n <span className={keycap}>Shift</span>+<span className={keycap}>LMB</span> place spawn {nextSpawnDigit(map.grid) ?? '—'} · click an existing spawn to remove\n </span>\n </div>\n\n <canvas\n ref={canvasRef}\n className=\"border border-border rounded select-none\"\n style={{\n background: '#1a1a1a',\n cursor: 'crosshair',\n imageRendering: 'pixelated',\n }}\n onContextMenu={(e) => e.preventDefault()}\n onMouseDown={handleCanvasDown}\n onMouseMove={handleCanvasMove}\n onMouseUp={handleCanvasUp}\n />\n {!spritesReady && (\n <div className=\"text-xs text-text-secondary mt-2\">Loading tiles…</div>\n )}\n </div>\n\n {/* Right-side library panel — server-backed load/save */}\n <div className=\"w-80 flex flex-col gap-4 p-4 border-l border-border bg-bg-card overflow-auto shrink-0\">\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h2 className=\"text-base font-bold\">Saved maps</h2>\n <button\n onClick={() => void refreshLibrary()}\n disabled={libraryLoading}\n className=\"text-xs px-2 py-0.5 bg-bg border border-border rounded hover:bg-bg-hover disabled:opacity-50\"\n title=\"Refresh list\"\n >\n {libraryLoading ? '…' : 'Refresh'}\n </button>\n </div>\n <select\n value={selected}\n onChange={(e) => setSelected(e.target.value)}\n size={10}\n className=\"w-full p-2 bg-bg border border-border rounded font-mono text-xs\"\n >\n <option value=\"\">— pick a map —</option>\n {library.map((group) => (\n <optgroup key={group.players} label={`p${String(group.players).padStart(2, '0')} (${group.players} players)`}>\n {group.files.map((f) => {\n const key = `p${String(group.players).padStart(2, '0')}/${f}`;\n return <option key={key} value={key}>{f}</option>;\n })}\n </optgroup>\n ))}\n </select>\n <div className=\"mt-2 grid grid-cols-3 gap-2\">\n <button\n onClick={() => void loadSelected()}\n disabled={!selected}\n className=\"px-2 py-1.5 bg-accent text-bg rounded text-sm font-semibold hover:opacity-90 disabled:opacity-40\"\n >\n Load\n </button>\n <button\n onClick={() => void saveOverwrite()}\n disabled={!selected}\n className=\"px-2 py-1.5 bg-bg border border-border rounded text-sm font-semibold hover:bg-bg-hover disabled:opacity-40\"\n >\n Save\n </button>\n <button\n onClick={() => void deleteSelected()}\n disabled={!selected}\n className=\"px-2 py-1.5 bg-bg border border-error text-error rounded text-sm font-semibold hover:bg-bg-hover disabled:opacity-40\"\n >\n Delete\n </button>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-bold mb-2\">Save as new</h3>\n <label className=\"flex items-center gap-2 mb-2 text-xs text-text-secondary\">\n <span className=\"shrink-0\">Save under group:</span>\n <select\n value={saveTarget}\n onChange={(e) => setSaveTarget(parseInt(e.target.value, 10))}\n className=\"flex-1 min-w-0 px-2 py-1 bg-bg border border-border rounded font-mono text-xs\"\n disabled={spawnCount < 2}\n >\n {[2, 3, 4, 5, 6, 7, 8, 9, 10].map((n) => {\n const disabled = n > spawnCount;\n return (\n <option key={n} value={n} disabled={disabled}>\n p{String(n).padStart(2, '0')} ({n}-player{disabled ? ` — need ${n} spawns` : n < spawnCount ? `, ${spawnCount - n} extra` : ''})\n </option>\n );\n })}\n </select>\n </label>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-xs bg-bg border border-border rounded px-2 py-1 font-mono\">\n p{String(saveTarget).padStart(2, '0')}/\n </code>\n <input\n type=\"text\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder={suggestedName}\n className=\"flex-1 min-w-0 px-2 py-1 bg-bg border border-border rounded font-mono text-xs\"\n />\n <code className=\"text-xs text-text-secondary\">.map</code>\n </div>\n <button\n onClick={() => void saveAsNew()}\n disabled={newName.trim().length === 0 || spawnCount < saveTarget || saveTarget < 2}\n className=\"mt-2 w-full px-3 py-1.5 bg-bg border border-border rounded text-sm font-semibold hover:bg-bg-hover disabled:opacity-50\"\n >\n Save as new\n </button>\n <p className=\"mt-1 text-xs text-text-secondary leading-tight\">\n Writes to <code className=\"bg-bg px-1 rounded\">game/assets/maps/p{String(saveTarget).padStart(2, '0')}/<name>.map</code>.\n {spawnCount > saveTarget && (\n <> {spawnCount - saveTarget} extra spawn{spawnCount - saveTarget === 1 ? '' : 's'} — the game shuffles + picks {saveTarget} of {spawnCount} each round.</>\n )}\n </p>\n </div>\n\n {status && (\n <div className={`text-xs px-2 py-1 rounded border ${\n status.kind === 'ok'\n ? 'text-success border-success/30 bg-success/10'\n : 'text-error border-error/30 bg-error/10'\n }`}>\n {status.text}\n </div>\n )}\n\n <div className=\"text-xs text-text-secondary leading-snug\">\n <h3 className=\"font-bold text-text mb-1\">Notes</h3>\n <ul className=\"list-disc pl-4 space-y-1\">\n <li>Load / Save / Delete hit the server directly. The operator git-commits the resulting diff.</li>\n <li>Roll softs previews the world-build layout (80% softs on floor, with a 13-cell hashtag-shaped safety pattern at every spawn).</li>\n <li>Any grid edit invalidates the soft preview — re-roll to see the new layout.</li>\n </ul>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["__vite_glob_0_0","__vite_glob_0_1","__vite_glob_0_2","__vite_glob_0_3","__vite_glob_0_4","__vite_glob_0_5","__vite_glob_0_6","__vite_glob_0_7","__vite_glob_0_8","__vite_glob_0_9","__vite_glob_0_10","__vite_glob_0_11","__vite_glob_0_12","__vite_glob_0_13","__vite_glob_0_14","__vite_glob_0_15","__vite_glob_0_16","__vite_glob_0_17","DEFAULT_DIMS","SPAWN_DIGITS","SPAWN_CHARS","CHARACTER_ORDER","CARDINALS","DIAGONALS","SPAWN_CLEAR_DEPTH","TILE_NAMES","spawnIndex","digit","spawnSpriteFor","pickWallTile","grid","c","r","w","h","wall","cc","rr","n","e","s","we","rollSoftBlocks","seed","playerCount","state","next","spawns","a","b","i","j","usedSpawns","clear","dc","dr","step","softs","key","parseMapText","text","lines","l","ch","makeBlankMap","row","onBorder","nextSpawnDigit","used","d","failureReason","res","body","TILE_URLS","bundledTileUrl","name","MapEditor","navigate","useNavigate","players","setPlayers","useState","map","setMap","setSofts","library","setLibrary","libraryLoading","setLibraryLoading","selected","setSelected","newName","setNewName","status","setStatus","origin","useMemo","getRuntimeServerOrigin","spriteCacheRef","useRef","spritesReady","setSpritesReady","useEffect","mounted","loadOne","url","resolve","img","t","spriteUrlFor","applyCells","useCallback","cells","prev","nextDigit","canvasRef","lastCellRef","dragToolRef","cellFromEvent","canvas","box","x","y","cellW","cellH","paintCellsBetween","from","to","dx","dy","steps","tt","handleCanvasDown","hit","handleCanvasMove","handleCanvasUp","onUp","changePlayers","resize","newW","newH","clearInterior","_cell","spawnCount","saveTarget","setSaveTarget","cur","rollSofts","hideSofts","exportText","designedFor","extra","header","refreshLibrary","data","message","splitKey","m","loadSelected","parts","parsed","writeMap","nn","opts","saveOverwrite","folderN","saveAsNew","confirmText","g","deleteSelected","suggestedName","files","candidate","cellSize","maxByW","maxByH","ctx","dpr","cssW","cssH","cache","floorImg","softImg","cell","isWall","isSpawn","isSoft","fontSize","tx","ty","utilBtnClass","keycap","jsxs","jsx","group","f","disabled","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MapEditor-CAaN7Avt.js","sources":["../../src/assets/games/bomberman/tiles/floor.png","../../src/assets/games/bomberman/tiles/soft_block.png","../../src/assets/games/bomberman/tiles/wall_cap_e.png","../../src/assets/games/bomberman/tiles/wall_cap_n.png","../../src/assets/games/bomberman/tiles/wall_cap_s.png","../../src/assets/games/bomberman/tiles/wall_cap_w.png","../../src/assets/games/bomberman/tiles/wall_corner_ne.png","../../src/assets/games/bomberman/tiles/wall_corner_nw.png","../../src/assets/games/bomberman/tiles/wall_corner_se.png","../../src/assets/games/bomberman/tiles/wall_corner_sw.png","../../src/assets/games/bomberman/tiles/wall_cross.png","../../src/assets/games/bomberman/tiles/wall_h.png","../../src/assets/games/bomberman/tiles/wall_iso.png","../../src/assets/games/bomberman/tiles/wall_t_e.png","../../src/assets/games/bomberman/tiles/wall_t_n.png","../../src/assets/games/bomberman/tiles/wall_t_s.png","../../src/assets/games/bomberman/tiles/wall_t_w.png","../../src/assets/games/bomberman/tiles/wall_v.png","../../src/lib/mapEditorGrid.ts","../../src/routes/MapEditor.tsx"],"sourcesContent":["export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAA4ElEQVR4nO3bvQrCMAAAYRUnwcFn7PvjILjq4JalCDYf0ru5P8eRhNCf47Isr8NEno/7V8dfrreNTD6cNr36H1AALaA5z77hOKfHNWHrOT+y+xFQAC2gKYAW0BRAC2gKoAU0BdACmgJoAU0BtICmAFpAUwAtoCmAFtAUQAtoCqAFNAXQAprp7wZHZr8LHNn9CCiAFtAUQAtoCqAFNAXQApoCaAFNAbSApgBaQMOfB/StMKYAWkBTAC2gKYAW0EzfB6z9Nzh7X7D7EVAALaDZfA349l/hX5+/xu5HQAG0gOYNTj4XivrBP34AAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABABAMAAABYR2ztAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAVUExURWY5MXlWQkUoPJVoVKx3USYjOv///88sd78AAAABYktHRAZhZrh9AAAAB3RJTUUH6gUWFB4FeZ3ViwAAAHVJREFUSMflk8kNwCAMBLcFWnALtEAL6b+VgMyKCHG8skHKfMBoHsYHgJABrIPvkAhxwZ+EE3qRHnhqLf5CoEJJJZzRi83ASIS5ohHMwoJcMIkAeKvGp0bwZAockRYphavS35UCl8XXZfqL1wWWiLFawACZcANvCQaAiP6VCQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyNi0wNS0yMlQyMDoyMTo0MSswMDowMGeGF3AAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjYtMDUtMjJUMjA6MjE6NDErMDA6MDAW26/MAAAAKHRFWHRkYXRlOnRpbWVzdGFtcAAyMDI2LTA1LTIyVDIwOjMwOjA1KzAwOjAwH4cQBAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABXUlEQVR4nO2awUrDUBBFrcxKUOjChboSBIXuBBcFv7q/IeJKMSC4aiMILWgo7ux6RrA8THvsm3t2MwRyc7mZvCRvcH07/t6riK4dFB2/vyEdO4MMoAXQ2OXpiWscHA5dfX52sU09vfP4fOfqZta6On0CZAAtgMZqu+cjo6sbVzeziavTJ0AG0AJoZAAtgEYG0AJorLbnfinpEyADaAE0MoAWQCMDaAE09jp9cY1s64L0CZABtAAaW34uXKO2mRCvJ5I+ATKAFkBjsRFnQvy39t+J/znWkT4BMoAWQPNjBuw6cYbFmRD3EKVPgAygBdBUNwMiD81T6GgGOGQALYDG3j8Wvx5wfFS2ti6l7/PHfYDrSJ8AGUALoLFN3+Ol/FVP3PscuW/fXJ0+ATKAFkCz9XeB+Nyn1xnpEyADaAE01X8PmHdfoaPvAQ4ZQAugsdL3576Zd+z50ydABtACaFan50Bii49pkgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABV0lEQVR4nO2aPWsCQRRFY9gqJIKFhbGQfBDBLm3+f5ciVYKCKCk2FhaBKLZavzvFMmziyTL3dE+W5bzLm3HY3d7Tw8vxIoPrUdblZ2e/6WVdf/lHHp3BAdACNJWu6efpLNR348dz+vw663oZ6rfFR6iLnwAHQAvQVPpD19e8ov14DxAcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUBT6bs0fY7e9WeE2o/2W/wEOABagCZ5L3DYfYf6ff6adcOrm0E7owbUry3FT4ADoAVoku8DlO1PXHOT8X2o6XOC/s9/1qtQD/txT9J+i58AB0AL0CTngMXXJtTT21Go6TWvqI+eE7QfpfgJcAC0AE2yB+ia7zraj+4JxU+AA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagSZ4HNPHfvh9Qn1yKnwAHQAvQnAB0ZD6cfejf/wAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABgUlEQVR4nO2aMUsDQRCFL5JCRIUIFmolCBHsBAvBX+3fELFSPBCszAlCAhqCnbbOLGQZvLvvwr6vm2RZ3j5m5vb2dnR5c/1T/WF6fFRF2NmbhMa3zeprERpfzxoTb7UpZhORAbQAmnFuwMX5VR86OuPx+W7t/8VngAygBdAkPWDTa97j11PPbk1cfAbIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoAjQygBdDIAFoATXIm+Pr2YuLTk7PexHSBX4+n+AyQAbQAmuy3QV9D0e/xfRO9r1B8BsgAWgDNeNmM7C9TGw695j1er+8Jfr3FZ4AMoAXQJPuAh/rJxNF7g0PDr6eq1AMMMoAWQJN9F/B3a9vuCX5+z8HutokP99fv9XPzeYrPABlAC6BJekDfz/1ojefI6b9v3k1cfAbIAFoATXYf0DYfn8M6Xyg+A2QALYAm6QG+Rv/7XM7R9fy5nlN8BsgAWgBN0gPmy28Xx96vo3Q9f4rOBA0ygBZA8wuEsEaUV+FlQgAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUklEQVR4nO2bv4vCQBBGL0cKCxEULNRKlFOwvub+/95OEAQrtRAUPJHrznpmi7D442nme90ESR4fs5vNxhRfo5//jwyavayfvzyftACNAqAFaEo/pif9nqln0+9n+jyc9WZl6vAdoABoAZrSH6jbmPcMB2NTh+8ABUAL0CgAWoBGAdACNAqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQJHuCft/c76G9O3ov4FAAtABNMgd4/Ji5/B4fJkMQvgMUAC1AU553hT0ysWXdxrwnfAcoAFqAJlkHzJcLU/v/DNWN8B2gAGgBmspngeV2Z+pOs2Hqbqt9k8D+lLfOyL1e1fnDd4ACoAVokjmAvu/fOqfkni98BygAWoAmmQP8ffPeY/LVCN8BCoAWoEnmgMP5z9Td1n0v6J8t6HVH+A5QALQATeG/Ha7bt8FVhO8ABUAL0FwBfpsww2cW0LwAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABh0lEQVR4nO2asUvDQBTGL9JBpBYUOrROojSCm+Cg+P8vDk6KhUIn7SBU0CJudfXeYY/wkvxM3vtt1+Saj4/vLu8uV1zd3WzDL8rpJGg4ODxS9c/x9fmu6j9/XUXtPdW/9QA3gBZAM8jdcHlx3YaOxli+LKJ2OY2vm0+AG0ALoEnmgK6PecnpyXnUlnOC+QS4AbQAGjeAFkDjBtACaLJrgb4h6wLzCXADaAE0bgAtgMYNoAXQJHWAXC/L92bX8f0AgRtAC6DJrgW6PidI/fLbovkEuAG0AJrK+wGPz/dN6MAwnwA3gBZAM9isiviXMm5qz+TkkGd2tGeUqmI+AW4ALYAmqQMe5k9Ru+0x2facYD4BbgAtgKaYnd1GZ4WHk+1f94YQQjge7qseuN58q/pXJafXfALcAFoATVIHyDEzHtV7/n882n397WP32qNuPeYT4AbQAmj+/Rmhuse8xHwC3ABaAE0yB6S1evxebnpMyufn6gYt5hPgBtACaCrvB/QN8wlwA2gBND+5n0Dr51yy0gAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABdUlEQVR4nO2bPUvEQBCGc7KV4IHFFWolCB7YCRbC/er7GxZWigHByrtCOEGDaHW2NxNwCfl4vMz7dLNhN29eZiebTTK5Xtxuix0uT0+KNhweHbfqn+Pr871V/3K1NvFBq9FGgAygBdAkP+f9HD4/uxhST+c8PN39eTx8BsgAWgBNGtuc91zNb0xcrpYmDp8BMoAWQCMDaAE0MoAWQJPGdt9vSvgMkAG0ABoZQAugkQG0AJr08vpsGsa2LvDX5wmfATKAFkCT/Lu2fa8JuTnvCZ8BMoAWQJN8g68JuXdr/42m3yeEzwAZQAugqdWAfcfXMF8TqvXExOEzQAbQAmjS24edM7Npv9/5Dc19+ehaVAMMMoAWQFNbB/ia4GlaI3LjdT3+pvpu1D98BsgAWgBN6vu+78fvet3h+8+m9rg/X1X8mDh8BsgAWgCNDKAF0MgAWgBN73uC9H5D/dlA+wEGGUALoEn+X9q+2VTDni9H+AyQAbQAml8slkzMIBNZowAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQ0lEQVR4nO2asQ4BQRRFka2EQolKiE10Wv/fKVTEJhIVSgXR0po7iY2sONbc071NVs7cvJnZjGlOx4t744lOPyj/nhYtQOMAaAGaTOf8PJ8F9Wg4+abPx9kfdkF9u5yDOvkOcAC0AE2mD+o+5xUdj64JyXeAA6AFaBwALUDjAGgBGgdAC9A4AFqAxgHQAjQOgBagic4D/h2fCQoOgBagya6nZvBAz8zqfkao41GS7wAHQAvQRN8Buk+ut8u3frDd7VUzKkH9qpJ8BzgAWoAmuh+gFMdTUP/a/QHd51fFJqjzQf/l+8l3gAOgBWii7wCd8zqH6DmvqI9+J+h4lOQ7wAHQAjTRGlC2b9YNHY+uCcl3gAOgBWgcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHn7jtCv3R8o+/+/jOQ7wAHQAjQPMsI9FqsxS7oAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABQUlEQVR4nO2aoQoCQRRFVSaJBuNqEgTBpk3w/4thk+KCYFKjQbFqfneDCItHnXva27CcubwZhplpL1bLRysjbud2qDuQx9fgAGgBmjQdFuFDtz8I9Xg0+aRP4xyO+1CXrW2os+8AB0AL0KR/m/OKjqesvAYEHAAtQOMAaAEaB0AL0DgAWoDGAdACNA6AFqBxALQATbpfL7QDSvYd4ABoAZqkH/Qc/dfPCHU8vhsUHAAtQFNbA3RfsNmt3/qh3jM0TdP7luw7wAHQAjS1NUCpTudQz6ezUNP7hNr9v9z96fuHXhGfRGXfAQ6AFqBJOscVnUP0nFfUR/cJr8aXfQc4AFqAprYP0Dn/6+h4dE3IvgMcAC1A4wBoARoHQAvQOABagMYB0AI0DoAWoHEAtADNy3sB5dveD6jPu2TfAQ6AFqB5AmmUO6FIXs0fAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABRklEQVR4nO2asWoCQRRFTZhKsEipqYSAEisDFoH8f5PCKkFBsDKWFoKttpm7xTDE7Fl993SzLMuZy3vD7O48vH28n3u/mIyGvRr6g6eq+6/N6Xioun/9s8/Gj9eUuUUcAC1Ak7TntafHzy9t+vw7/cEmG4evAAdAC9Cke+95RecXvgIcAC1Ak+6950uErwAHQAvQOABagMYB0AI0DoAWoHEAtABN2u7yb2TR3g3CV4ADoAVokv5bi7YmhK8AB0AL0CS9oGvC1+qz6oGz6eJvRgVqfUqErwAHQAvQNNYARc/UzCev2bjtfYKuMbpvWa6/s3HpzFP4CnAAtABN0h5XtIe69m6gPrqPKc0vfAU4AFqAprEPqD0r3HV0Pj4rLDgAWoDGAdACNA6AFqBxALQAjQOgBWgcAC1A4wBoARoHQAvQOABagOYCVgAynQlZGFoAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOElEQVR4nO2bwQsBQRSH0RwkFLUHnJSi3JSD8v9fnBWlnHBQFJIb53lbatrsl97vu83s1n79evt2ZtutzpaLd8UxNVqARgHQAjRh3O9FE9PJHFIph/1hF43dV4ACoAVoQqPVoR1KZTgYRWP3FaAAaAGaYO8Jb7ivAAVAC9AoAFqARgHQAjQKgBagUQC0AE2w78i87Q3cV4ACoAVowvN+jSa89QT3FaAAaAGaYCdsT1hvVqXJELivAAVAC9AoAFqARgHQAjThfIuf+1nb1/cC7itAAdACNLm9gO0JlsvjlXSBbrP+9Xhqz9keT0nnW6yP+wpQALQATUi9B7N2PC57HWG/bS56ffcVoABoAZrcOuDfKNpz3FeAAqAFaJJ7gH3u2r2BXSf8Gq0DCqIAaAGaqv4ddo4CoAVoPpR0Me34gHFfAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABeklEQVR4nO2asUoDQRRFN7KVaMAiRbQSxQjWNn62vyFipbggpDIrCAoaxE7ruVMMg7N7XOae7oUlOXN583ay7Ozs5OqnyWBvmXX56Gz7Wdb1OwN5TAYHQAvQtLqnV4fLoL44vxzTpzj3jzdB3W36oK6+AxwALUDT6gdT3/OKrqfbXAd19R3gAGgBGgdAC9A4AFqAxgHQAjQOgBagcQC0AI0DoAVooucB6+enoD4+Oh1NZgh0PUr1HeAAaAEaB0AL0DgAWoAmOgcoeh/9+nwfTKYEu/sHWddX3wEOgBagaaN3alZh+d/3vKK+OhN0vdV3gAOgBWiic8Bd9xDU+s7Q1ND1NI1nQIADoAVokv8F9L26v86E14+8c8Vinne2V98U1XeAA6AFaKIZMPR9X/e0zoTcPa+k/G/7l6CuvgMcAC1AE82A0nuSJnXuqL4DHAAtQBPNgLftd1Av5mV/sPR/ixS6Hj8PEBwALUCT/TygNEN/f4rqO8AB0AI0v8NqTSVA9X9QAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUElEQVR4nO2asWoCQRRF3TCVYJEyWogSSMAuYCH41f5GakFBDCnUIoWQiK22zhWyyIQc2XdP91ZWz17ejAvzqrfp5NS64KX71Cqh3Xksur+O48++6P7ldpfVD0Xf1gAcAC1Ak3TN6xoe9J7/0+fPmS/ef/08fAc4AFqAJjVtzSuj13FWL7ezrA7fAQ6AFqBxALQAjQOgBWhS0/73byV8BzgAWoDGAdACNA6AFqBJH5tVdiHae0H4DnAAtABN0rO2pu0J+jxK+A5wALQATdILuifUna0p9HxA3e8fdlVWh+8AB0AL0FztAcrXd77m+r1hVtPvCbpHfW7WWa2+SvgOcAC0AE2lc4KKzhDpefu9oXuCzgUq4TvAAdACNFfvAaWzwveGPo9nhQUHQAvQOABagMYB0AI0DoAWoHEAtACNA6AFaBwALUDjAGgBGgdAC9CcAYDuOTwDN8emAAAAAElFTkSuQmCC\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABNElEQVR4nO2aQQsBURRG0VspysKCWYgUZacslP+/sVaUyGLGwkJRtqzfnZppFubQ/c7uvaQzX9/c3hjN5Wb9bjimRQvQKABagCbMhoNoYzFfQSr1cE6P0dp9AxQALUAT2p0e7VAr42Qard03QAHQAjTB3hPecN8ABUAL0CgAWoBGAdACNAqAFqBRALQATbC/kXl7NnDfAAVAC9CE1/MebXibCe4boABoAZpgN+xM2O23lb7w2+8Wq/qU4b4BCoAWoMnNAMvtEc+EUTKJ1nWfE+yMseeWS3qK1v1u8btP9w1QALQATThk18IP2P8Q/dqzgfWx55iy63PfAAVAC9DkzgH2nv937PXYmeC+AQqAFqBRALQAjQKgBWgUAC1AowBoARoFQAvQKABagEYB0AI0CoAWoPkA1dkt6kUtkpYAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABUUlEQVR4nO2bMWvCQBiGVW4owQgtZFCnQqF7N6H/f3EWFAQndRAstKV0a1fvyyAf0Twk3/tsJwc+vrx3JvEcvr0v/gYXvM6mAw9F+eiaf2t+vj5c8zeHYzYe3VKmiygAWoAm2TVv1/Tz/KVNn7tTlNtsHL4BCoAWoEl9X/MW+/nCN0AB0AI0qe9r/hrhG6AAaAEaBUAL0CgAWoBGAdACNAqAFqBJu33+jCzavUH4BigAWoAm2d/Wou0J4RugAGgBmmRfsHvCar1sTYYgfAMUAC1AowBoARoFQAvQJHtuzntOsOuEb4ACoAVoavcCdk/w8jR+cM2vJr6zxl6/az7hG6AAaAGa2llhL6fP/PmBd017sb5Nr2PCN0AB0AI0teuAruG97rCEb4ACoAVo3HuA/d4/f/9m42rSTMhL0/cP3wAFQAvQDO1/h6MRvgEKgBag+Qfu+jOSBU5GcAAAAABJRU5ErkJggg==\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABOklEQVR4nO2aMQvCMBQGrTgVKjg4qJMgKLgJDoL/f3EWFERxqI4OiquuvtchQ6BXm++2iJXrkRRJk622m0/nh/l41IkhLwZR14d4Px9R1x9vdzPuRv1aC1AAWoCmF/rCcrGuw6M28uJkxsnPAAWgBWgqz4C2rXnPdDIz4+RngALQAjQKQAvQKAAtQKMAtACNAtACNApAC9AoAC1AowC0AI0C0AI0lT3BS2n3zf0e2r/j7y/5GaAAtABN73XP7CdzO/RrJvR+vunnAzzJzwAFoAVogucDruXZjId9u8bpd4n+GRXy9SQ/AxSAFqDJ/DlBjz83SK/5EPvDzoz9uUBP8jNAAWgBmsr/gNizwk3D34/OCjsUgBagUQBagEYBaAEaBaAFaBSAFqBRAFqARgFoARoFoAVoFIAWoPkCQOwuh7kvX8IAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAABLElEQVR4nO2asQrCMAAFq/gT6iQIFZ0UHAT/f3FwUiwITuroILjqal6HUFJ61b7bAlauRxJom95qu3lnX+SjYZbCYrZOuj7G4bRLur643YNxP+nf/gAHoAVoBrEf6JpZ5vNgPBlP6zWKoHvM5XoOxvviGIxje1rnZ4AD0AI0pT1A17yuoabXfAz1eT0fwVjvR+n8DHAAWoCmtAekPgu0Db0fPwsIDkAL0DgALUDjALQAjQPQAjQOQAvQOAAtQOMAtABN9LuAou/h6XeE6lOVzs8AB6AFaCrvAfreXb/Xt/18gNL5GeAAtACNzwfUo/W7OAAtQOPzAbUb/RgOQAvQ+HxAkzJtxAFoARoHoAVoHIAWoHEAWoDGAWgBGgegBWgcgBagcQBagMYBaAGaD9C3Qmb46VC5AAAAAElFTkSuQmCC\"","/**\n * Map-editor grid model: parsing, generation and autotiling.\n *\n * Extracted from MapEditor.tsx (2026-08-17). Every function here is pure and\n * touches no React — it was ~25% of that component's file with none of its\n * state, and living inside a route component meant none of it could be tested.\n *\n * Two of these are hand-ports of Rust in `game/src/board.rs` and MUST stay in\n * step with it, or the editor previews a layout the game will not produce:\n * - `pickWallTile` <- board.rs::pick_hard_handle (16-mask autotile)\n * - `rollSoftBlocks` <- board.rs::roll_map_cells + the pick_map spawn shuffle\n * Both are deterministic, which is what makes that drift testable at all.\n */\n\nimport { CHARACTER_ORDER, type CharacterId } from '@watchparty/shared';\n\nexport type CellChar = string; // 'H' | '.' | '1'..'9' | 'A'\nexport type Grid = CellChar[][];\n\nexport interface MapState {\n width: number;\n height: number;\n grid: Grid;\n}\n\n// Default dimensions per player count, copied from the in-tree\n// game/assets/maps/p{NN}/m01.map headers. The editor lets the operator\n// resize manually after the initial seed.\nexport const DEFAULT_DIMS: Record<number, [number, number]> = {\n 2: [11, 9],\n 3: [11, 9],\n 4: [13, 11],\n 5: [13, 11],\n 6: [17, 15],\n 7: [17, 15],\n 8: [19, 17],\n 9: [19, 17],\n 10: [21, 19],\n};\n\nexport const SPAWN_DIGITS = '123456789A';\n\n// The character previewed on each spawn digit: the character order, one per spawn.\nexport const SPAWN_CHARS: readonly CharacterId[] = CHARACTER_ORDER.slice(0, SPAWN_DIGITS.length);\n\n// Cardinal steps (N/S/E/W) used for both the autotile mask and the\n// spawn-safety-corridor clearing in rollSoftBlocks.\nexport const CARDINALS: ReadonlyArray<[number, number]> = [[1, 0], [-1, 0], [0, 1], [0, -1]];\n// Diagonal steps used by the spawn safety pattern (1-deep) so the second\n// bomb after the bot moves into the corridor has a perpendicular flee\n// path. Matches the diagonal block in game/src/board.rs::roll_map_cells.\nexport const DIAGONALS: ReadonlyArray<[number, number]> = [[1, 1], [1, -1], [-1, 1], [-1, -1]];\n\n// Per-spawn safety: 2-deep cardinal + 1-deep diagonal \"hashtag\" pattern\n// (13 cells per spawn) — kept in sync with board.rs::roll_map_cells so\n// the editor preview matches in-game reality.\nexport const SPAWN_CLEAR_DEPTH = 2;\n\nexport const TILE_NAMES = [\n 'floor',\n 'soft_block',\n 'wall_iso',\n 'wall_h',\n 'wall_v',\n 'wall_cross',\n 'wall_cap_n',\n 'wall_cap_s',\n 'wall_cap_e',\n 'wall_cap_w',\n 'wall_corner_ne',\n 'wall_corner_nw',\n 'wall_corner_se',\n 'wall_corner_sw',\n 'wall_t_n',\n 'wall_t_s',\n 'wall_t_e',\n 'wall_t_w',\n];\n\nexport function spawnIndex(digit: string): number {\n return digit === 'A' ? 9 : parseInt(digit, 10) - 1;\n}\n\nexport function spawnSpriteFor(digit: string): CharacterId {\n return SPAWN_CHARS[spawnIndex(digit) % SPAWN_CHARS.length];\n}\n\n/** Same 16-mask autotile picker as board.rs::pick_hard_handle. The\n * off-board-is-floor convention makes border cells render as clean\n * straights and the four corners pick their corner art. */\nexport function pickWallTile(grid: Grid, c: number, r: number): string {\n const w = grid[0]?.length ?? 0;\n const h = grid.length;\n const wall = (cc: number, rr: number) =>\n cc >= 0 && rr >= 0 && cc < w && rr < h && grid[rr][cc] === 'H';\n const n = wall(c, r - 1) ? 1 : 0;\n const e = wall(c + 1, r) ? 1 : 0;\n const s = wall(c, r + 1) ? 1 : 0;\n const we = wall(c - 1, r) ? 1 : 0;\n const mask = (n << 3) | (e << 2) | (s << 1) | we;\n switch (mask) {\n case 0: return 'wall_iso';\n case 1: return 'wall_cap_e';\n case 2: return 'wall_cap_n';\n case 3: return 'wall_corner_sw';\n case 4: return 'wall_cap_w';\n case 5: return 'wall_h';\n case 6: return 'wall_corner_se';\n case 7: return 'wall_t_n';\n case 8: return 'wall_cap_s';\n case 9: return 'wall_corner_nw';\n case 10: return 'wall_v';\n case 11: return 'wall_t_e';\n case 12: return 'wall_corner_ne';\n case 13: return 'wall_t_s';\n case 14: return 'wall_t_w';\n case 15:\n // All 4 cardinal neighbors are walls — this is genuinely a +\n // intersection and renders as wall_cross. (The previous\n // diagonal-based disambiguation here picked T / corner pieces\n // that HID one or two arms — e.g. floorSE → wall_t_w deleted the\n // visible west arm even though W is wall — which the operator\n // reported as \"W weirdly disconnected\" when N got added to a\n // pre-existing W/S/E cross.)\n return 'wall_cross';\n default: return 'wall_iso';\n }\n}\n\n/** JS port of board.rs::roll_map_cells + the spawn-shuffle in pick_map.\n *\n * Mirrors the runtime exactly: gather spawns in digit order, Fisher-\n * Yates shuffle, take `playerCount`, clear a \"hashtag\" safety pattern\n * (2-deep cardinal + 1-deep diagonal, 13 cells per spawn) at each USED\n * spawn, then roll 80% softs on every other floor cell.\n *\n * When the map has more spawns than `playerCount`, this means each roll\n * shows a different subset of spawns as \"the lucky ones whose corridors\n * are clear\" — same as what the game actually does at match start. */\nexport function rollSoftBlocks(grid: Grid, seed: number, playerCount: number): Set<string> {\n const w = grid[0]?.length ?? 0;\n const h = grid.length;\n\n let state = (seed | 1) >>> 0;\n const next = () => {\n state ^= state << 13;\n state >>>= 0;\n state ^= state >>> 17;\n state ^= state << 5;\n state >>>= 0;\n return state;\n };\n\n const spawns: { c: number; r: number; digit: string }[] = [];\n for (let r = 0; r < h; r++) {\n for (let c = 0; c < w; c++) {\n if (/^[1-9A]$/.test(grid[r][c])) {\n spawns.push({ c, r, digit: grid[r][c] });\n }\n }\n }\n // Sort by digit so the shuffle starts from the same canonical order\n // the game's parse_map produces (sorted by spawn id 1..A).\n spawns.sort((a, b) => SPAWN_DIGITS.indexOf(a.digit) - SPAWN_DIGITS.indexOf(b.digit));\n // Fisher-Yates over the full spawn list — matches board.rs::pick_map.\n for (let i = spawns.length - 1; i >= 1; i--) {\n const j = next() % (i + 1);\n [spawns[i], spawns[j]] = [spawns[j], spawns[i]];\n }\n\n const usedSpawns = spawns.slice(0, Math.max(0, Math.min(playerCount, spawns.length)));\n\n const clear = new Set<string>();\n for (const { c, r } of usedSpawns) {\n clear.add(`${c},${r}`);\n for (const [dc, dr] of CARDINALS) {\n for (let step = 1; step <= SPAWN_CLEAR_DEPTH; step++) {\n clear.add(`${c + dc * step},${r + dr * step}`);\n }\n }\n for (const [dc, dr] of DIAGONALS) {\n clear.add(`${c + dc},${r + dr}`);\n }\n }\n\n const softs = new Set<string>();\n for (let r = 0; r < h; r++) {\n for (let c = 0; c < w; c++) {\n if (grid[r][c] !== '.') continue;\n const key = `${c},${r}`;\n if (clear.has(key)) continue;\n if (next() % 100 < 80) softs.add(key);\n }\n }\n return softs;\n}\n\n/** Parse raw .map text into a MapState. Comment lines (leading `#`) and\n * blank lines are stripped before validation. Used by the Library Load\n * button (response body straight from the server) — kept pure so it has\n * no React/DOM dependencies. */\nexport function parseMapText(text: string): { ok: true; map: MapState } | { ok: false; error: string } {\n const lines = text\n .split(/\\r?\\n/)\n .filter((l) => !l.startsWith('#') && l.trim().length > 0);\n if (lines.length < 5) {\n return { ok: false, error: 'Need at least 5 non-comment lines.' };\n }\n const w = lines[0].length;\n if (!lines.every((l) => l.length === w)) {\n return { ok: false, error: 'All rows must have the same width.' };\n }\n const grid: Grid = lines.map((l) =>\n l.split('').map((ch) => {\n if (ch === 'H' || ch === '.') return ch;\n if (/^[1-9Aa]$/.test(ch)) return ch.toUpperCase();\n return '.';\n }),\n );\n return { ok: true, map: { width: w, height: lines.length, grid } };\n}\n\nexport function makeBlankMap(w: number, h: number): MapState {\n const grid: Grid = [];\n for (let r = 0; r < h; r++) {\n const row: CellChar[] = [];\n for (let c = 0; c < w; c++) {\n const onBorder = r === 0 || r === h - 1 || c === 0 || c === w - 1;\n row.push(onBorder ? 'H' : '.');\n }\n grid.push(row);\n }\n return { width: w, height: h, grid };\n}\n\nexport function nextSpawnDigit(grid: Grid): string | null {\n const used = new Set<string>();\n for (const row of grid) {\n for (const ch of row) {\n if (/^[1-9A]$/.test(ch)) used.add(ch);\n }\n }\n for (const d of SPAWN_DIGITS) {\n if (!used.has(d)) return d;\n }\n return null;\n}\n","/**\n * Standalone Bomberman map editor.\n *\n * Outputs the same `.map` text format the game's `parse_map` consumes\n * (`H` = hard wall, `.` = floor, digit/`A` = numbered spawn). Soft blocks\n * are never authored — the game's `roll_map_cells` rolls 80% softs onto\n * floor cells at world-build time (with the per-spawn safety corridor),\n * so the editor only models walls + spawns + floor and provides a\n * \"Roll softs\" preview button so you can sanity-check density.\n *\n * Rendering uses a single `<canvas>` (not 399 React divs): autotile\n * sprite picking + drawImage is O(w*h) per state change with no React\n * reconciliation in the hot path — drag-paint stays smooth at p10.\n *\n * Wall autotiling mirrors `board.rs::pick_hard_handle` so what the\n * editor renders is what the in-game world renders. Tile + character\n * art is fetched from `/game-assets/` (mounted by the server next to\n * `/game/`) so we don't duplicate PNGs into the React bundle.\n *\n * Friend-tier auth required (gated at the route level in router.tsx and\n * at every /api/maps endpoint server-side). The editor writes directly\n * to `game/assets/maps/p{NN}/{name}.map` via the server — the operator\n * git-adds + commits + pushes the diff themselves. Only a dev server\n * accepts writes (`MAP_EDITOR_WRITES`); elsewhere a save fails with the\n * server's reason, since the game there has its maps built in.\n */\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { getRuntimeServerOrigin } from '../lib/config';\nimport { spriteUrlFor } from '../lib/characters';\n\n/** The server's own message for a refused edit (a read-only host says why),\n * else the status. */\nasync function failureReason(res: Response): Promise<string> {\n try {\n const body = await res.json() as { message?: unknown };\n if (typeof body.message === 'string' && body.message) return body.message;\n } catch {\n // Not JSON (an edge error page): the status is all there is.\n }\n return `HTTP ${res.status}`;\n}\n\n// Bundle tile PNGs INTO the UI bundle via Vite's glob import.\n// Why same-origin: the editor used to fetch from `${serverOrigin}/game-assets/`\n// but the parent site's CSP can block cross-origin img loads (img-src not\n// covering watchparty.hadoku.me). Inlining as Vite assets ships them at\n// `${UI_BUNDLE_ORIGIN}/.../mf/watchparty/assets/...` so they always\n// resolve same-origin.\nconst TILE_URLS = import.meta.glob('../assets/games/bomberman/tiles/*.png', {\n eager: true,\n import: 'default',\n}) as Record<string, string>;\nfunction bundledTileUrl(name: string): string | null {\n return TILE_URLS[`../assets/games/bomberman/tiles/${name}.png`] ?? null;\n}\n\nimport {\n type CellChar, type Grid, type MapState,\n DEFAULT_DIMS, SPAWN_CHARS, SPAWN_DIGITS, TILE_NAMES,\n spawnSpriteFor, pickWallTile, rollSoftBlocks,\n parseMapText, makeBlankMap, nextSpawnDigit,\n} from '../lib/mapEditorGrid';\n\ntype Tool = 'wall' | 'spawn' | 'floor';\n\nexport default function MapEditor() {\n const navigate = useNavigate();\n const [players, setPlayers] = useState(4);\n const [map, setMap] = useState<MapState>(() => {\n const [w, h] = DEFAULT_DIMS[4];\n return makeBlankMap(w, h);\n });\n\n // Soft-block preview: rolled on demand via the toolbar button. Cleared\n // whenever the underlying grid changes structurally (player count,\n // resize, library load) so a stale layout from a prior grid never\n // shows up on the new one — the user has to roll fresh.\n const [softs, setSofts] = useState<Set<string>>(new Set());\n\n // Library state — list of saved map files grouped by player count, the\n // currently-selected file (so Save knows where to PUT), and the new-name\n // input value for \"Save as new\". Status is a one-line banner under the\n // buttons reporting the last action's result.\n type LibraryEntry = { players: number; files: string[] };\n const [library, setLibrary] = useState<LibraryEntry[]>([]);\n const [libraryLoading, setLibraryLoading] = useState(false);\n const [selected, setSelected] = useState<string>(''); // \"p04/m01.map\" or ''\n const [newName, setNewName] = useState('');\n const [status, setStatus] = useState<{ kind: 'ok' | 'err'; text: string } | null>(null);\n\n const origin = useMemo(() => getRuntimeServerOrigin(), []);\n\n // Sprite cache. Bundled PNGs (TILE_URLS / CHARACTER_URLS) resolve to\n // same-origin URLs hashed into the UI bundle, so cross-origin CSP /\n // CORS issues with watchparty.hadoku.me's /game-assets/ never bite.\n // The canvas redraw effect waits on `spritesReady` so we don't flash\n // empty cells.\n const spriteCacheRef = useRef<Record<string, HTMLImageElement>>({});\n const [spritesReady, setSpritesReady] = useState(false);\n\n useEffect(() => {\n let mounted = true;\n function loadOne(key: string, url: string | null | undefined): Promise<void> {\n if (!url) return Promise.resolve();\n return new Promise((resolve) => {\n const img = new Image();\n img.onload = () => {\n if (mounted) spriteCacheRef.current[key] = img;\n resolve();\n };\n img.onerror = () => {\n \n console.warn('[MapEditor] sprite failed to load', { key, url });\n resolve();\n };\n img.src = url;\n });\n }\n Promise.all([\n ...TILE_NAMES.map((t) => loadOne(t, bundledTileUrl(t))),\n // Characters come from the server like every other avatar in the app.\n ...SPAWN_CHARS.map((c) => loadOne(`char:${c}`, spriteUrlFor(c))),\n ]).then(() => {\n if (mounted) setSpritesReady(true);\n });\n return () => {\n mounted = false;\n };\n }, []);\n\n // Paint one or more cells in a SINGLE state update. Drag-paint funnels\n // all cells from one mouse-move's interpolation through here in one\n // setMap; React 18's batching was dropping cells when this was N calls.\n // The tool is passed in (not a useState) so the active mouse button +\n // shift modifier picked at mousedown determines the action — no\n // toolbar tool selector needed.\n const applyCells = useCallback((cells: { c: number; r: number }[], t: Tool) => {\n if (cells.length === 0) return;\n setMap((prev) => {\n const grid = prev.grid.map((row) => [...row]);\n for (const { c, r } of cells) {\n if (r < 0 || r >= prev.height || c < 0 || c >= prev.width) continue;\n if (t === 'wall') {\n grid[r][c] = 'H';\n } else if (t === 'floor') {\n grid[r][c] = '.';\n } else if (t === 'spawn') {\n // Shift+left on an existing spawn cell removes it. Shift+left\n // on a wall is a no-op — the operator has to clear walls first\n // if they want a spawn there (prevents accidentally punching\n // a hole in the border on a stray click).\n if (/^[1-9A]$/.test(grid[r][c])) {\n grid[r][c] = '.';\n } else if (grid[r][c] === '.') {\n const used = new Set<string>();\n for (const row of grid) {\n for (const ch of row) {\n if (/^[1-9A]$/.test(ch)) used.add(ch);\n }\n }\n let nextDigit: string | null = null;\n for (const d of SPAWN_DIGITS) {\n if (!used.has(d)) { nextDigit = d; break; }\n }\n if (nextDigit) grid[r][c] = nextDigit;\n }\n }\n }\n return { ...prev, grid };\n });\n // Any grid mutation invalidates the soft-block preview — the layout\n // would no longer correspond to the displayed grid.\n setSofts((s) => (s.size === 0 ? s : new Set()));\n }, []);\n\n // Drag-paint via canvas pointer events. Tool is implied by mouse button\n // + Shift modifier at the moment the drag starts:\n // Left-click → wall\n // Shift + Left-click → spawn (single placement, no drag-paint)\n // Right-click → floor (erase)\n // Captured into `dragToolRef` on mousedown so a mid-drag shift-release\n // doesn't change the tool mid-stroke. Cleared on mouseup or when\n // `buttons` drops to 0 inside the move handler (covers the \"still\n // thinks I'm dragging\" bug when mouseup happened off-canvas).\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const lastCellRef = useRef<{ c: number; r: number } | null>(null);\n const dragToolRef = useRef<Tool | null>(null);\n\n const cellFromEvent = useCallback((e: React.MouseEvent): { c: number; r: number } | null => {\n const canvas = canvasRef.current;\n if (!canvas) return null;\n const box = canvas.getBoundingClientRect();\n const x = e.clientX - box.left;\n const y = e.clientY - box.top;\n if (x < 0 || y < 0 || x >= box.width || y >= box.height) return null;\n const cellW = box.width / map.width;\n const cellH = box.height / map.height;\n return { c: Math.floor(x / cellW), r: Math.floor(y / cellH) };\n }, [map.width, map.height]);\n\n const paintCellsBetween = useCallback((from: { c: number; r: number }, to: { c: number; r: number }, t: Tool) => {\n const dx = Math.abs(to.c - from.c);\n const dy = Math.abs(to.r - from.r);\n const steps = Math.max(dx, dy);\n const cells: { c: number; r: number }[] = [];\n if (steps === 0) {\n cells.push({ c: to.c, r: to.r });\n } else {\n for (let i = 0; i <= steps; i++) {\n const tt = i / steps;\n cells.push({\n c: Math.round(from.c + (to.c - from.c) * tt),\n r: Math.round(from.r + (to.r - from.r) * tt),\n });\n }\n }\n applyCells(cells, t);\n }, [applyCells]);\n\n const handleCanvasDown = (e: React.MouseEvent) => {\n let t: Tool | null = null;\n if (e.button === 0) t = e.shiftKey ? 'spawn' : 'wall';\n else if (e.button === 2) t = 'floor';\n if (!t) return;\n e.preventDefault();\n dragToolRef.current = t;\n const hit = cellFromEvent(e);\n if (!hit) return;\n // Capture pointer so move/up keep firing even if the cursor leaves\n // the canvas mid-drag (fixes \"drag stops working when I cross into\n // the sidebar\").\n (e.currentTarget as HTMLElement).setPointerCapture?.((e as unknown as PointerEvent).pointerId);\n applyCells([hit], t);\n lastCellRef.current = hit;\n };\n const handleCanvasMove = (e: React.MouseEvent) => {\n const t = dragToolRef.current;\n if (!t) return;\n // Either button still held? bit 0 = left, bit 1 = right. If neither\n // is held the user released — end the drag.\n if ((e.buttons & 0b11) === 0) {\n dragToolRef.current = null;\n lastCellRef.current = null;\n return;\n }\n if (t === 'spawn') return; // single placement, no drag-paint\n const hit = cellFromEvent(e);\n if (!hit) return;\n const prev = lastCellRef.current;\n if (prev) {\n if (prev.c === hit.c && prev.r === hit.r) return;\n paintCellsBetween(prev, hit, t);\n } else {\n applyCells([hit], t);\n }\n lastCellRef.current = hit;\n };\n const handleCanvasUp = (e: React.MouseEvent) => {\n (e.currentTarget as HTMLElement).releasePointerCapture?.((e as unknown as PointerEvent).pointerId);\n dragToolRef.current = null;\n lastCellRef.current = null;\n };\n // Window-level mouseup / blur safety net: any release outside the\n // canvas, an alt-tab, or a modal opening all clear the drag so the\n // next move doesn't keep painting.\n useEffect(() => {\n const onUp = () => {\n dragToolRef.current = null;\n lastCellRef.current = null;\n };\n window.addEventListener('mouseup', onUp);\n window.addEventListener('blur', onUp);\n return () => {\n window.removeEventListener('mouseup', onUp);\n window.removeEventListener('blur', onUp);\n };\n }, []);\n\n const changePlayers = (n: number) => {\n setPlayers(n);\n const [w, h] = DEFAULT_DIMS[n];\n setMap(makeBlankMap(w, h));\n setSofts(new Set());\n };\n\n const resize = (newW: number, newH: number) => {\n if (newW < 5 || newW > 31 || newH < 5 || newH > 31) return;\n setMap((prev) => {\n const grid: Grid = [];\n for (let r = 0; r < newH; r++) {\n const row: CellChar[] = [];\n for (let c = 0; c < newW; c++) {\n const onBorder = r === 0 || r === newH - 1 || c === 0 || c === newW - 1;\n if (onBorder) {\n row.push('H');\n } else if (r < prev.height && c < prev.width) {\n row.push(prev.grid[r][c]);\n } else {\n row.push('.');\n }\n }\n grid.push(row);\n }\n return { width: newW, height: newH, grid };\n });\n setSofts(new Set());\n };\n\n const clearInterior = () => {\n setMap((prev) => {\n const grid = prev.grid.map((row, r) =>\n row.map((_cell, c) => {\n const onBorder = r === 0 || r === prev.height - 1 || c === 0 || c === prev.width - 1;\n return onBorder ? 'H' : '.';\n }),\n );\n return { ...prev, grid };\n });\n setSofts(new Set());\n };\n\n // Spawn count drives the save-target group ceiling — you can save a\n // map under p{NN}/ only when it has at least NN spawns. The game\n // shuffles + takes N at match start (see board.rs::pick_map), so a\n // 4-spawn map saved under p02 works fine: 2 of 4 spawns chosen\n // randomly each round.\n // Declared BEFORE rollSofts/hideSofts so the useCallback dep array\n // doesn't TDZ against saveTarget — same class of bug the 'h' before\n // init crash was. Reorder, don't hoist with vars.\n const spawnCount = useMemo(() => {\n let n = 0;\n for (const row of map.grid) {\n for (const ch of row) {\n if (/^[1-9A]$/.test(ch)) n += 1;\n }\n }\n return n;\n }, [map]);\n\n // Save-target = which p{NN} folder the next \"Save as new\" lands in.\n // Defaults to the current spawn count (saves a 4-spawn map as a\n // 4-player map). Operator can override down to 2 so the same map\n // serves smaller player counts with extra-spawn variety.\n const [saveTarget, setSaveTarget] = useState(4);\n useEffect(() => {\n setSaveTarget((cur) => {\n // Clamp down if the spawn count dropped below the chosen target.\n // Leave manual choices intact when they're still valid.\n if (spawnCount < 2) return 2;\n if (cur > spawnCount) return spawnCount;\n return cur;\n });\n }, [spawnCount]);\n\n // Roll a fresh soft-block layout against the current grid. Each click\n // uses a different seed (perf.now-based) so the operator can re-roll\n // to spot-check density variance.\n const rollSofts = useCallback(() => {\n const seed = (Math.floor(performance.now() * 1000) ^ 0x9E3779B9) >>> 0;\n setSofts(rollSoftBlocks(map.grid, seed || 1, saveTarget));\n }, [map.grid, saveTarget]);\n const hideSofts = () => setSofts(new Set());\n\n const exportText = useMemo(() => {\n const designedFor = Math.min(saveTarget, spawnCount);\n const extra = spawnCount > designedFor ? ` (${spawnCount} spawn variants)` : '';\n const header =\n `# ${designedFor}-player map${extra} · custom · edited via map editor\\n` +\n `# dims: ${map.width}x${map.height} · spawns: ${spawnCount}`;\n const body = map.grid.map((row) => row.join('')).join('\\n');\n return `${header}\\n${body}\\n`;\n }, [map, spawnCount, saveTarget]);\n\n // ---- Library actions ----\n const refreshLibrary = useCallback(async () => {\n setLibraryLoading(true);\n try {\n const res = await fetch(`${origin}/api/maps`);\n if (!res.ok) {\n setStatus({ kind: 'err', text: `List failed: HTTP ${res.status}` });\n return;\n }\n const data = await res.json() as { groups: LibraryEntry[] };\n setLibrary(data.groups ?? []);\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'network error';\n setStatus({ kind: 'err', text: `List failed: ${message}` });\n } finally {\n setLibraryLoading(false);\n }\n }, [origin]);\n\n useEffect(() => { void refreshLibrary(); }, [refreshLibrary]);\n\n const splitKey = (key: string): { nn: string; name: string } | null => {\n const m = key.match(/^p(0[2-9]|10)\\/([A-Za-z0-9_-]+)\\.map$/);\n if (!m) return null;\n return { nn: m[1], name: m[2] };\n };\n\n const loadSelected = useCallback(async () => {\n setStatus(null);\n const parts = splitKey(selected);\n if (!parts) {\n setStatus({ kind: 'err', text: 'Pick a map first.' });\n return;\n }\n try {\n const res = await fetch(`${origin}/api/maps/p${parts.nn}/${parts.name}`);\n if (!res.ok) {\n setStatus({ kind: 'err', text: `Load failed: HTTP ${res.status}` });\n return;\n }\n const body = await res.text();\n const parsed = parseMapText(body);\n if (!parsed.ok) {\n setStatus({ kind: 'err', text: `Parse failed: ${parsed.error}` });\n return;\n }\n setMap(parsed.map);\n setSofts(new Set()); // stale soft layout from prior grid is no longer valid\n setStatus({ kind: 'ok', text: `Loaded ${selected}` });\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'network error';\n setStatus({ kind: 'err', text: `Load failed: ${message}` });\n }\n }, [origin, selected]);\n\n const writeMap = useCallback(async (nn: string, name: string, opts: { confirmText?: string } = {}) => {\n if (opts.confirmText && !window.confirm(opts.confirmText)) return false;\n setStatus(null);\n try {\n const res = await fetch(`${origin}/api/maps/p${nn}/${name}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/plain' },\n body: exportText,\n });\n if (!res.ok) {\n setStatus({ kind: 'err', text: `Save failed: ${await failureReason(res)}` });\n return false;\n }\n setStatus({ kind: 'ok', text: `Saved p${nn}/${name}.map` });\n setSelected(`p${nn}/${name}.map`);\n await refreshLibrary();\n return true;\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'network error';\n setStatus({ kind: 'err', text: `Save failed: ${message}` });\n return false;\n }\n }, [origin, exportText, refreshLibrary]);\n\n const saveOverwrite = useCallback(async () => {\n const parts = splitKey(selected);\n if (!parts) {\n setStatus({ kind: 'err', text: 'Pick a map first or use \"Save as new\".' });\n return;\n }\n const folderN = parseInt(parts.nn, 10);\n if (spawnCount < folderN) {\n setStatus({\n kind: 'err',\n text: `p${parts.nn} maps need ≥${folderN} spawns — current map has ${spawnCount}.`,\n });\n return;\n }\n await writeMap(parts.nn, parts.name, { confirmText: `Overwrite ${selected}?` });\n }, [selected, spawnCount, writeMap]);\n\n const saveAsNew = useCallback(async () => {\n if (spawnCount < 2) {\n setStatus({ kind: 'err', text: `Place at least 2 spawns before saving (have ${spawnCount}).` });\n return;\n }\n if (saveTarget < 2 || saveTarget > spawnCount || saveTarget > 10) {\n setStatus({\n kind: 'err',\n text: `Target ${saveTarget} invalid — must be 2..${Math.min(10, spawnCount)} for this map.`,\n });\n return;\n }\n const nn = String(saveTarget).padStart(2, '0');\n const name = newName.trim();\n if (!/^[A-Za-z0-9_-]+$/.test(name)) {\n setStatus({ kind: 'err', text: 'New name: alphanumeric / underscore / hyphen, no .map suffix.' });\n return;\n }\n const key = `p${nn}/${name}.map`;\n const existing = library.find((g) => g.players === saveTarget)?.files ?? [];\n const confirmText = existing.includes(`${name}.map`) ? `Overwrite ${key}?` : undefined;\n const ok = await writeMap(nn, name, { confirmText });\n if (ok) setNewName('');\n }, [spawnCount, saveTarget, newName, library, writeMap]);\n\n const deleteSelected = useCallback(async () => {\n const parts = splitKey(selected);\n if (!parts) {\n setStatus({ kind: 'err', text: 'Pick a map first.' });\n return;\n }\n if (!window.confirm(`Delete ${selected}?`)) return;\n setStatus(null);\n try {\n const res = await fetch(`${origin}/api/maps/p${parts.nn}/${parts.name}`, { method: 'DELETE' });\n if (!res.ok) {\n setStatus({ kind: 'err', text: `Delete failed: ${await failureReason(res)}` });\n return;\n }\n setStatus({ kind: 'ok', text: `Deleted ${selected}` });\n setSelected('');\n await refreshLibrary();\n } catch (e: unknown) {\n const message = e instanceof Error ? e.message : 'network error';\n setStatus({ kind: 'err', text: `Delete failed: ${message}` });\n }\n }, [origin, selected, refreshLibrary]);\n\n const suggestedName = useMemo(() => {\n const files = library.find((g) => g.players === saveTarget)?.files ?? [];\n const used = new Set<string>(files);\n for (let n = 1; n <= 99; n++) {\n const candidate = `m${String(n).padStart(2, '0')}.map`;\n if (!used.has(candidate)) return candidate.replace(/\\.map$/, '');\n }\n return 'custom';\n }, [library, saveTarget]);\n\n // Cell size — fit roughly 60% width, 75% viewport-min height.\n const cellSize = useMemo(() => {\n if (typeof window === 'undefined') return 32;\n const maxByW = (window.innerWidth - 360) / map.width;\n const maxByH = (window.innerHeight - 160) / map.height;\n return Math.max(16, Math.floor(Math.min(maxByW, maxByH)));\n }, [map.width, map.height]);\n\n // Imperative canvas redraw — runs once per state change. O(w*h) sprite\n // draws + no React reconciliation. The 21x19 p10 layout drops from\n // 399 div re-renders per paint to one canvas pass.\n useEffect(() => {\n if (!spritesReady) return;\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n const dpr = typeof window !== 'undefined' ? (window.devicePixelRatio || 1) : 1;\n const cssW = map.width * cellSize;\n const cssH = map.height * cellSize;\n if (canvas.width !== cssW * dpr || canvas.height !== cssH * dpr) {\n canvas.width = cssW * dpr;\n canvas.height = cssH * dpr;\n }\n canvas.style.width = `${cssW}px`;\n canvas.style.height = `${cssH}px`;\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.imageSmoothingEnabled = false;\n ctx.clearRect(0, 0, cssW, cssH);\n\n const cache = spriteCacheRef.current;\n const floorImg = cache.floor;\n const softImg = cache.soft_block;\n\n for (let r = 0; r < map.height; r++) {\n for (let c = 0; c < map.width; c++) {\n const x = c * cellSize;\n const y = r * cellSize;\n const cell = map.grid[r][c];\n const isWall = cell === 'H';\n const isSpawn = /^[1-9A]$/.test(cell);\n const isSoft = !isWall && !isSpawn && softs.has(`${c},${r}`);\n\n if (floorImg) ctx.drawImage(floorImg, x, y, cellSize, cellSize);\n\n if (isWall) {\n const img = cache[pickWallTile(map.grid, c, r)];\n if (img) ctx.drawImage(img, x, y, cellSize, cellSize);\n } else if (isSoft) {\n if (softImg) ctx.drawImage(softImg, x, y, cellSize, cellSize);\n } else if (isSpawn) {\n const img = cache[`char:${spawnSpriteFor(cell)}`];\n if (img) ctx.drawImage(img, x, y, cellSize, cellSize);\n // Spawn-number badge, top-right corner of the cell.\n const fontSize = Math.max(10, Math.floor(cellSize / 4));\n ctx.font = `800 ${fontSize}px ui-sans-serif, system-ui, sans-serif`;\n ctx.textAlign = 'right';\n ctx.textBaseline = 'top';\n ctx.lineWidth = 3;\n ctx.strokeStyle = '#000';\n ctx.fillStyle = '#fff';\n const tx = x + cellSize - 2;\n const ty = y + 2;\n ctx.strokeText(cell, tx, ty);\n ctx.fillText(cell, tx, ty);\n }\n }\n }\n }, [map, softs, cellSize, spritesReady]);\n\n const utilBtnClass =\n 'px-3 py-1.5 text-sm bg-bg-card border border-border rounded hover:bg-bg-hover whitespace-nowrap';\n // Keycap styling for the input legend below the toolbar.\n const keycap = 'inline-block min-w-[20px] px-1.5 py-0.5 mx-0.5 bg-bg border border-border rounded text-[11px] font-mono font-semibold text-text';\n\n return (\n <div className=\"flex w-full h-full overflow-hidden bg-bg text-text\">\n {/* Toolbar + grid */}\n <div className=\"flex-1 flex flex-col items-center min-w-0 overflow-auto p-4\">\n {/* Toolbar — three shrink-0 groups so the inner buttons never reflow.\n The Tools group has a hard min-width on each tool button so\n \"Spawn (10)\" doesn't push neighbors to a new row. Whole bar\n scrolls horizontally on a small viewport rather than wrapping. */}\n <div className=\"w-full max-w-6xl flex items-center gap-3 mb-3 flex-nowrap overflow-x-auto\">\n <div className=\"flex items-center gap-2 shrink-0\">\n <button onClick={() => navigate('/')} className={utilBtnClass}>\n ← Home\n </button>\n <h1 className=\"text-xl font-bold ml-1\">Map Editor</h1>\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0\">\n <label className=\"text-sm text-text-secondary\">Default for:</label>\n <select\n value={players}\n onChange={(e) => changePlayers(parseInt(e.target.value, 10))}\n className=\"px-2 py-1 bg-bg-card border border-border rounded text-sm\"\n >\n {[2, 3, 4, 5, 6, 7, 8, 9, 10].map((n) => (\n <option key={n} value={n}>\n {n} players\n </option>\n ))}\n </select>\n <label className=\"text-sm text-text-secondary ml-2\">W</label>\n <input\n type=\"number\"\n min={5}\n max={31}\n value={map.width}\n onChange={(e) => resize(parseInt(e.target.value, 10) || map.width, map.height)}\n className=\"w-16 px-2 py-1 bg-bg-card border border-border rounded text-sm\"\n />\n <label className=\"text-sm text-text-secondary\">H</label>\n <input\n type=\"number\"\n min={5}\n max={31}\n value={map.height}\n onChange={(e) => resize(map.width, parseInt(e.target.value, 10) || map.height)}\n className=\"w-16 px-2 py-1 bg-bg-card border border-border rounded text-sm\"\n />\n </div>\n\n <div className=\"flex items-center gap-2 shrink-0 ml-auto\">\n <span className=\"text-sm text-text-secondary whitespace-nowrap\">\n Spawns: <span className=\"font-bold text-text\">{spawnCount}</span>/10\n </span>\n <button onClick={clearInterior} className={utilBtnClass}>\n Clear interior\n </button>\n <button\n onClick={softs.size > 0 ? hideSofts : rollSofts}\n className={utilBtnClass}\n title=\"Preview a random soft-block layout. Re-click to re-roll.\"\n >\n {softs.size > 0 ? `Hide softs (${softs.size})` : 'Roll softs'}\n </button>\n </div>\n </div>\n\n {/* Input legend — tool is implied by mouse button + shift, not a\n modal selector. Keeps the toolbar from needing 3 wide tool\n buttons that resize as the spawn count grows. */}\n <div className=\"text-xs text-text-secondary mb-2 max-w-6xl w-full flex flex-wrap items-center gap-x-4 gap-y-1\">\n <span><span className={keycap}>LMB</span> wall · drag to paint</span>\n <span><span className={keycap}>RMB</span> floor (erase) · drag to wipe</span>\n <span>\n <span className={keycap}>Shift</span>+<span className={keycap}>LMB</span> place spawn {nextSpawnDigit(map.grid) ?? '—'} · click an existing spawn to remove\n </span>\n </div>\n\n <canvas\n ref={canvasRef}\n className=\"border border-border rounded select-none\"\n style={{\n background: '#1a1a1a',\n cursor: 'crosshair',\n imageRendering: 'pixelated',\n }}\n onContextMenu={(e) => e.preventDefault()}\n onMouseDown={handleCanvasDown}\n onMouseMove={handleCanvasMove}\n onMouseUp={handleCanvasUp}\n />\n {!spritesReady && (\n <div className=\"text-xs text-text-secondary mt-2\">Loading tiles…</div>\n )}\n </div>\n\n {/* Right-side library panel — server-backed load/save */}\n <div className=\"w-80 flex flex-col gap-4 p-4 border-l border-border bg-bg-card overflow-auto shrink-0\">\n <div>\n <div className=\"flex items-center justify-between mb-2\">\n <h2 className=\"text-base font-bold\">Saved maps</h2>\n <button\n onClick={() => void refreshLibrary()}\n disabled={libraryLoading}\n className=\"text-xs px-2 py-0.5 bg-bg border border-border rounded hover:bg-bg-hover disabled:opacity-50\"\n title=\"Refresh list\"\n >\n {libraryLoading ? '…' : 'Refresh'}\n </button>\n </div>\n <select\n value={selected}\n onChange={(e) => setSelected(e.target.value)}\n size={10}\n className=\"w-full p-2 bg-bg border border-border rounded font-mono text-xs\"\n >\n <option value=\"\">— pick a map —</option>\n {library.map((group) => (\n <optgroup key={group.players} label={`p${String(group.players).padStart(2, '0')} (${group.players} players)`}>\n {group.files.map((f) => {\n const key = `p${String(group.players).padStart(2, '0')}/${f}`;\n return <option key={key} value={key}>{f}</option>;\n })}\n </optgroup>\n ))}\n </select>\n <div className=\"mt-2 grid grid-cols-3 gap-2\">\n <button\n onClick={() => void loadSelected()}\n disabled={!selected}\n className=\"px-2 py-1.5 bg-accent text-bg rounded text-sm font-semibold hover:opacity-90 disabled:opacity-40\"\n >\n Load\n </button>\n <button\n onClick={() => void saveOverwrite()}\n disabled={!selected}\n className=\"px-2 py-1.5 bg-bg border border-border rounded text-sm font-semibold hover:bg-bg-hover disabled:opacity-40\"\n >\n Save\n </button>\n <button\n onClick={() => void deleteSelected()}\n disabled={!selected}\n className=\"px-2 py-1.5 bg-bg border border-error text-error rounded text-sm font-semibold hover:bg-bg-hover disabled:opacity-40\"\n >\n Delete\n </button>\n </div>\n </div>\n\n <div>\n <h3 className=\"text-sm font-bold mb-2\">Save as new</h3>\n <label className=\"flex items-center gap-2 mb-2 text-xs text-text-secondary\">\n <span className=\"shrink-0\">Save under group:</span>\n <select\n value={saveTarget}\n onChange={(e) => setSaveTarget(parseInt(e.target.value, 10))}\n className=\"flex-1 min-w-0 px-2 py-1 bg-bg border border-border rounded font-mono text-xs\"\n disabled={spawnCount < 2}\n >\n {[2, 3, 4, 5, 6, 7, 8, 9, 10].map((n) => {\n const disabled = n > spawnCount;\n return (\n <option key={n} value={n} disabled={disabled}>\n p{String(n).padStart(2, '0')} ({n}-player{disabled ? ` — need ${n} spawns` : n < spawnCount ? `, ${spawnCount - n} extra` : ''})\n </option>\n );\n })}\n </select>\n </label>\n <div className=\"flex items-center gap-2\">\n <code className=\"text-xs bg-bg border border-border rounded px-2 py-1 font-mono\">\n p{String(saveTarget).padStart(2, '0')}/\n </code>\n <input\n type=\"text\"\n value={newName}\n onChange={(e) => setNewName(e.target.value)}\n placeholder={suggestedName}\n className=\"flex-1 min-w-0 px-2 py-1 bg-bg border border-border rounded font-mono text-xs\"\n />\n <code className=\"text-xs text-text-secondary\">.map</code>\n </div>\n <button\n onClick={() => void saveAsNew()}\n disabled={newName.trim().length === 0 || spawnCount < saveTarget || saveTarget < 2}\n className=\"mt-2 w-full px-3 py-1.5 bg-bg border border-border rounded text-sm font-semibold hover:bg-bg-hover disabled:opacity-50\"\n >\n Save as new\n </button>\n <p className=\"mt-1 text-xs text-text-secondary leading-tight\">\n Writes to <code className=\"bg-bg px-1 rounded\">game/assets/maps/p{String(saveTarget).padStart(2, '0')}/<name>.map</code>.\n {spawnCount > saveTarget && (\n <> {spawnCount - saveTarget} extra spawn{spawnCount - saveTarget === 1 ? '' : 's'} — the game shuffles + picks {saveTarget} of {spawnCount} each round.</>\n )}\n </p>\n </div>\n\n {status && (\n <div className={`text-xs px-2 py-1 rounded border ${\n status.kind === 'ok'\n ? 'text-success border-success/30 bg-success/10'\n : 'text-error border-error/30 bg-error/10'\n }`}>\n {status.text}\n </div>\n )}\n\n <div className=\"text-xs text-text-secondary leading-snug\">\n <h3 className=\"font-bold text-text mb-1\">Notes</h3>\n <ul className=\"list-disc pl-4 space-y-1\">\n <li>Load / Save / Delete hit the server directly. The operator git-commits the resulting diff.</li>\n <li>Roll softs previews the world-build layout (80% softs on floor, with a 13-cell hashtag-shaped safety pattern at every spawn).</li>\n <li>Any grid edit invalidates the soft preview — re-roll to see the new layout.</li>\n </ul>\n </div>\n </div>\n </div>\n );\n}\n"],"names":["__vite_glob_0_0","__vite_glob_0_1","__vite_glob_0_2","__vite_glob_0_3","__vite_glob_0_4","__vite_glob_0_5","__vite_glob_0_6","__vite_glob_0_7","__vite_glob_0_8","__vite_glob_0_9","__vite_glob_0_10","__vite_glob_0_11","__vite_glob_0_12","__vite_glob_0_13","__vite_glob_0_14","__vite_glob_0_15","__vite_glob_0_16","__vite_glob_0_17","DEFAULT_DIMS","SPAWN_DIGITS","SPAWN_CHARS","CHARACTER_ORDER","CARDINALS","DIAGONALS","SPAWN_CLEAR_DEPTH","TILE_NAMES","spawnIndex","digit","spawnSpriteFor","pickWallTile","grid","c","r","w","h","wall","cc","rr","n","e","s","we","rollSoftBlocks","seed","playerCount","state","next","spawns","a","b","i","j","usedSpawns","clear","dc","dr","step","softs","key","parseMapText","text","lines","l","ch","makeBlankMap","row","onBorder","nextSpawnDigit","used","d","failureReason","res","body","TILE_URLS","bundledTileUrl","name","MapEditor","navigate","useNavigate","players","setPlayers","useState","map","setMap","setSofts","library","setLibrary","libraryLoading","setLibraryLoading","selected","setSelected","newName","setNewName","status","setStatus","origin","useMemo","getRuntimeServerOrigin","spriteCacheRef","useRef","spritesReady","setSpritesReady","useEffect","mounted","loadOne","url","resolve","img","t","spriteUrlFor","applyCells","useCallback","cells","prev","nextDigit","canvasRef","lastCellRef","dragToolRef","cellFromEvent","canvas","box","x","y","cellW","cellH","paintCellsBetween","from","to","dx","dy","steps","tt","handleCanvasDown","hit","handleCanvasMove","handleCanvasUp","onUp","changePlayers","resize","newW","newH","clearInterior","_cell","spawnCount","saveTarget","setSaveTarget","cur","rollSofts","hideSofts","exportText","designedFor","extra","header","refreshLibrary","data","message","splitKey","m","loadSelected","parts","parsed","writeMap","nn","opts","saveOverwrite","folderN","saveAsNew","confirmText","g","deleteSelected","suggestedName","files","candidate","cellSize","maxByW","maxByH","ctx","dpr","cssW","cssH","cache","floorImg","softImg","cell","isWall","isSpawn","isSoft","fontSize","tx","ty","utilBtnClass","keycap","jsxs","jsx","group","f","disabled","Fragment"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsxs as u, jsx as a, Fragment as j } from "react/jsx-runtime";
|
|
2
2
|
import { useState as x, useEffect as D, useRef as ce, useMemo as ke, useCallback as Se } from "react";
|
|
3
|
-
import { g as K, as as Y, d as A, ai as Fe, w as q, R as Q, at as Be, au as De, h as se, v as Oe, F as Ce, av as Pe } from "./index-
|
|
4
|
-
import { D as $e, a as ae, u as Ge, s as je, b as qe } from "./Room-
|
|
5
|
-
import { s as Ee, a as W, g as ue, f as He, b as pe, h as Ve, u as We, c as ze, e as Ye, d as Je, i as Ke, j as Qe, k as Xe } from "./submissionsApi-
|
|
3
|
+
import { g as K, as as Y, d as A, ai as Fe, w as q, R as Q, at as Be, au as De, h as se, v as Oe, F as Ce, av as Pe } from "./index-0qpZypc6.js";
|
|
4
|
+
import { D as $e, a as ae, u as Ge, s as je, b as qe } from "./Room-ByB1YcBj.js";
|
|
5
|
+
import { s as Ee, a as W, g as ue, f as He, b as pe, h as Ve, u as We, c as ze, e as Ye, d as Je, i as Ke, j as Qe, k as Xe } from "./submissionsApi-BUCH3LM8.js";
|
|
6
6
|
import { Icon as re } from "@wolffm/themes";
|
|
7
7
|
import { b as Ze } from "./cover-AUIrlUMF.js";
|
|
8
8
|
const ne = /* @__PURE__ */ new Map(), Z = /* @__PURE__ */ new Map(), et = 6e4;
|
|
@@ -712,4 +712,4 @@ function Rt({ open: e, onClose: r }) {
|
|
|
712
712
|
export {
|
|
713
713
|
Rt as default
|
|
714
714
|
};
|
|
715
|
-
//# sourceMappingURL=MediaDrawer-
|
|
715
|
+
//# sourceMappingURL=MediaDrawer-CX4LJKzr.js.map
|