Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
Мини-игра-арт-объект: чёрно-белая пиксельная чашка Петри, в которой растёт плесень. Ставишь кликами до 8 спор внутри чашки, жмёшь GROW — колонии прорастают вразнобой, конкурируют за питание и постепенно делят между собой всю площадь агара. На границах территорий остаются тёмные швы, в старой биомассе прогорают каверны, поверх зрелого газона всходят вторичные очаги. Каждый прогон неповторим, но воспроизводим: seed лежит в адресной строке.檢視完整 README ↗
Мини-игра-арт-объект: чёрно-белая пиксельная чашка Петри, в которой растёт плесень.
→ Играть
Ставишь кликами до 8 спор внутри чашки, жмёшь GROW — колонии прорастают вразнобой, конкурируют за питание и постепенно делят между собой всю площадь агара. На границах территорий остаются тёмные швы, в старой биомассе прогорают каверны, поверх зрелого газона всходят вторичные очаги. Каждый прогон неповторим, но воспроизводим: seed лежит в адресной строке.
Справа — палитра из двенадцати штаммов с настоящими латинскими названиями. Каждый квадратик не нарисован, а получен прогоном той же симуляции на маленьком поле, так что превью показывает ровно то, что вырастет. Выбираешь штамм и ставишь им споры, как кистью; рядом с посевом держится его номер, пока культура не запущена.
Интерфейс на английском.
| клик внутри чашки | поставить спору (повторный клик по ней — убрать) |
| GROW / пробел | запустить рост |
PAUSE / P / пробел | пауза и продолжение |
BURN / R | выжечь чашку: огонь проходит по ней слева направо, остаётся чистый агар |
PNG / S | сохранить кадр 1520×1556 |
| SOUND | звук вкл/выкл (левый верхний угол) |
Клавиши читаются по физическому положению, раскладка не важна.
Пока расставляешь споры, курсор над чашкой заменяет крупный пинцет: сомкнутый — спора взята, разжимается в момент, когда её отпускаешь.
Интерфейс набран растровым MS Sans Serif из Windows 95 (FontStruction «lou», CC BY-SA 3.0, конвертация из 98.css).
Ванильный HTML + Canvas 2D. Ни сборки, ни зависимостей — index.html открывается
двойным кликом с диска. Единственная картинка, которую читает код (атлас кадров
пламени), вшита в assets/fire-frames.js как data-URI: с диска обычный <img>
пятнает холст и getImageData бросает SecurityError.
Симуляция идёт в буфере 380×389 (пропорция исходной фотографии), который выводится на экран целочисленным масштабом с отключённым сглаживанием. Яркость квантуется в 8 уровней серого с упорядоченным дизерингом Bayer 4×4 — отсюда пиксельная фактура.
Гибрид клеточного фронта и агентов-кончиков. Морфология колонии — не отдельный алгоритм на каждый вид, а одна score-функция с разными весами:
S = wN·N + wD·D + wP·P + wR·R + wDrift·A − wC·C − wI·I − wB·B + η
где N — питательность клетки, D — лопастная анизотропия, P — поддержка своими
соседями, R — кольцевой ритм, A — снос роста в одну сторону, C — теснота от
чужих, I — ингибитор, B — штраф у стенки, η — связный шум. Дальше сигмоида
превращает S в вероятность занять клетку.
Ключевое поле — ингибитор: колонии выделяют его при заселении, он слабо диффундирует и подавляет рост. На контакте двух колоний он удваивается, фронты встают, и между ними сам собой появляется тёмный зазор или тонкий белый шов.
Двенадцать штаммов, каждый со своей морфологией: базовая бархатная колония с белой каймой и тёмным споровым центром — то, что вырастает на хлебе; концентрические зоны, радиальные лучи, сетка трещин, крап спороносцев, цепочки почкующихся колец, гроздь мелких капель, ветвление на голодной среде, тонкое кружево гиф, роящееся кольцо с пустым центром и полупрозрачная биоплёнка поверх соседей.
Набор намеренно короткий: похожие виды убраны, чтобы каждый читался с первого взгляда, а не выглядел вариацией того же пятна.
Виды различает не столько форма фронта — она у многих похожая, — сколько текстура заполнения: зоны, борозды, крап, сетка трещин, зернистость. Плюс своя яркость у каждого штамма, иначе на заросшей чашке территории сливаются в один серый.
Зрелая колония спорулирует: сеет дочерние очаги по краю своей территории, обычно другого вида. Так чашка зарастает тремя десятками разнокалиберных пятен, а не семью гигантами — и текстуры остаются в масштабе, для которого нарисованы.
Жёсткого лимита на размер колонии нет: она растёт, пока есть куда. Ограничивают её только съеденное питание, стенка чашки и соседи. Разброс территорий берётся из «жадности» генотипа, разного времени прорастания спор и неоднородного поля питания.
Включён сразу; браузер пускает его после первого касания страницы. Тумблер — в левом верхнем углу.
Ориентир — саунд-дизайн медиаинсталляций: глубокий низ, медленно плывущий пэд, воздух большого зала, редкие стеклянные события и долгий реверберационный хвост. Ничего не «играет» — всё дышит. Слои:
Подклад следует за чашкой: пустая почти беззвучна, заросшая гудит и светлеет (открывается фильтр пэда, поднимаются низ и воздух). Выжигание — толчок снизу, гул, поднимающееся шипение и россыпь тресков; чистая чашка встречается тихим расцветом.
Каждый штамм получил свой голос, и все тональные виды берут ступени одной пентатоники — поэтому любое сочетание выросшего звучит согласно. Регистр и вес события задаёт размер колонии: мелочь отзывается высоко и коротко, крупные массы — низко и длинно. Панорама — из положения колонии в чашке.
Синтез процедурный, без сэмплов и библиотек: страница должна открываться
с диска, а file:// не даёт подгружать аудио. Шины: сухая, свёрточный
реверб 6 с (импульс синтезируется при старте) и ленточная задержка с
фильтром в обратной связи и плаванием времени.
Голос принадлежит виду, а не колонии: колоний бывает больше сотни, и если каждая подаёт сигнал отдельно, пул голосов упирается в потолок и всё превращается в кашу.
index.html
css/style.css
assets/fonts/ растровый MS Sans Serif (woff2)
assets/fire-frames.js атлас кадров пламени как data-URI (генерирует tools/extract-fire.py)
js/rng.js детерминированный ГСЧ (mulberry32) и fBm-шум
js/palette.js палитры и LUT квантования
js/dish.js геометрия и графика чашки
js/fields.js поля симуляции
js/growth.js архетипы, score-функция, агенты-кончики
js/scene.js композитинг биомассы и полупрозрачного слоя
js/render.js дизеринг, квантование, апскейл
js/preview.js превью штаммов для палитры — прогон той же симуляции
js/cursor.js пинцет вместо курсора
js/burn.js выжигание чашки: фронт, зола, наложение пламени
js/ui.js палитра, кнопки, горячие клавиши
js/sound.js процедурная озвучка: подклады, гранулы, реверб, задержка
js/main.js игровой цикл и состояния
tools/ bake-fire.js (GIF-предпросмотр), extract-fire.py (атлас)
Геометрия чашки, палитра и композиция сняты замерами с фотографии чашки Петри: центр, четыре полосы обода, сетка миллиметровки под стеклом, подсветка снизу.