Добавить две одиночные мини-игры: ./blocks и ./invaders

Тетрис- и Space Invaders-подобные аркады на чистом canvas/JS, без
мультиплеера и без сервера — в отличие от ./tanks это классические
одиночные игры. Названия сайта — generic (не «Тетрис»/«Space Invaders»),
та же логика, что и с переименованием ./battlecity в ./tanks: обе
франшизы — активно защищаемые товарные знаки (The Tetris Company,
Taito).

./blocks — 10x20 поле, 7 фигур, вращение с простым wall-kick, ускорение
по уровням, next-piece превью, hard drop.
./invaders — волны врагов, стрельба игрока и врагов, жизни, ускорение
с каждой волной.

Обе — клавиатура + сенсорные кнопки, RU/EN (не сбрасывает партию при
переключении языка — в отличие от бага, который чинили в ./tanks).
Кросс-ссылки между всеми тремя играми на каждой игровой странице,
подвал whoami обновлён списком всех трёх.
This commit is contained in:
2026-08-12 11:41:18 +05:00
parent 3e14c8f381
commit bb194ad33f
10 changed files with 1073 additions and 3 deletions
+41
View File
@@ -0,0 +1,41 @@
<!doctype html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>./blocks — cacto</title>
<link rel="icon" type="image/svg+xml" href="/assets/cactus-logo.svg" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="/css/theme.css" />
<link rel="stylesheet" href="/css/arcade.css" />
</head>
<body>
<canvas id="matrix-rain"></canvas>
<header class="site-header">
<div class="site-header__inner">
<a href="/" class="logo" aria-label="cacto — на главную">
<img src="/assets/cactus-logo.svg" width="20" height="20" alt="" />
cacto<span class="cursor">_</span>
</a>
<ul class="nav-links">
<li><a href="/">whoami</a></li>
<li><a href="/projects">ls projects/</a></li>
<li><button id="lang-toggle" class="lang-btn" type="button">EN</button></li>
</ul>
</div>
</header>
<div class="container">
<main>
<h2 class="prompt">./blocks</h2>
<div id="arcade-root"></div>
</main>
</div>
<script type="module" src="/js/matrix-rain.js"></script>
<script type="module" src="/js/blocks.js"></script>
</body>
</html>