# 游戏来源与改造记录

核对与接入日期：2026-10-12。规则代码仅取以下固定提交；没有运行上游安装脚本。

## 2048

- 原作：[gabrielecirulli/2048](https://github.com/gabrielecirulli/2048)。版本：`478b6ec346e3787f589e4af751378d06ded4cbbc`。
- 保存上游 `grid.js`、`tile.js`、`game_manager.js` 于 `vendor/2048/`，保留 [MIT LICENSE.txt](vendor/2048/LICENSE.txt)。内容规则由该代码执行。
- 本站新写输入、显示和存储适配器；使用原生 Pointer Events、局部键盘事件和可点击方向按钮。不复用上游站点 HTML、广告、统计、字体、分享或示例资源。
- 仅保存本站专属本机最高分键，不保存棋盘进度；存储被拒绝时采用内存并告知。支持暂停、重开、胜利后继续与离页暂停。

## 太空守卫

- 原作：[dwmkerr/spaceinvaders](https://github.com/dwmkerr/spaceinvaders)。版本：`5f79c6ae4f3cb1fbda0be5cc5212a3a407fa27ee`。
- 保存上游 `js/spaceinvaders.js` 于 `vendor/invaders/`，保留 [MIT LICENSE](vendor/invaders/LICENSE)。没有引入仓库其他子项目。
- `invaders/engine.js` 基于原核心改造：状态切换传本实例、修正绘制上下文引用、导出模块、配色与文案本地化；移动、敌人、关卡、射击与碰撞逻辑保留。
- 删除音频加载实现，不下载或使用上游 WAV。不创建 AudioContext，不请求声音。此版本明确无音效。
- 本站输入与生命周期适配器：焦点限定的键盘、触屏按住按钮、暂停/重开、本机最高分、隐藏/失焦/离页停止计时器。未采用原示例页及统计脚本。

## 站内外壳

游戏在访客主动点击开始后才插入本站 iframe。所有程序、样式和许可从本站加载，没有外部 SDK 或在线排名。键盘事件不注册到父站页面。浏览器限制存储或不支持画面时提供说明。

本站增加的适配代码与样式随项目源码提供；上游许可声明保留在各 vendor 目录。文件 SHA-256 见 `source-manifest.json`。来源版本记录不代表已完成真机、浏览器或公网部署验收。

## 星域扫雷

- 来源：[mayankrajendrat/minesweeper](https://github.com/mayankrajendrat/minesweeper)，固定提交`df80d8198cf0b5d5066ea2ea4c778f308f87bbd6`。原始`assets/js/game.js`保存为`vendor/minesweeper/game.js`，原始[MIT LICENSE](vendor/minesweeper/LICENSE)逐字保留。
- `minesweeper/engine.js`实际复用`bomb_array`、`shuffle`，以及`init`中的邻雷坐标/计数计算、`game`胜败判定、`revealNeighbors`连通空格揭开。将DOM cell改为本地模型，运行时仍调用这些逻辑，非只作来源署名。
- 修正`getIndex`的纵向边界为rows。首点若踩雷，使用一次有界的安全格移雷与邻雷重算，不递归重排/重开；保留既有旗标且第一点保证安全。旗数上限为雷数，已揭开格、已结束局不能插旗；移除旧`showMessage`DOM调用。
- 删除Twemoji、Bootstrap等外部界面依赖，删除上游每次重开注册window.keydown及依赖全局game的timer。本站一次注册局部键盘/代理事件，实例计时在暂停/失焦/隐藏/离页时停机。只提供9×9/10雷、16×16/40雷；手机显式切换揭开/插旗，密集棋盘可以在区域内滚动。

## 霓虹打砖块

- 来源：[jakesgordon/javascript-breakout](https://github.com/jakesgordon/javascript-breakout)，固定提交`eed59e2affa9423b93d2ac8ff93061bb88b33284`。`vendor/breakout/`保存原始`breakout.js`、`game.js`、`levels.js`与完整[LICENSE](vendor/breakout/LICENSE)。LICENSE末尾的声音声明原样保存，但没有带入任何声音文件。
- `breakout/engine.js`由原`breakout.js`派生，实际使用`Court.reset/resize/remove/empty`与原关卡、`Paddle.place/update`、`Ball.update/setdir`和主对象`loseBall`、`Score`生命与计分。`helpers.js`从原`game.js`提取`StateMachine`、`Game.Math`（bound、normalize、move、intercept、ballIntercept等）及本地离屏Canvas绘制；不加载原Runner/旧DOM库、存储或诊断层。
- 删除声音路径、loadScript/loadSounds、soundManager和页面原事件绑定；发球由明确按钮触发，不保留倒计时后台setTimeout。球的剩余碰撞时间计算保留，并加入每帧最多12次递归边界避免极端接触死循环；修正Court.resize的隐式全局n/brick。输局显示生命0，下一局重置，而非立刻把生命显示为3。
- 原生Pointer Events拖动按画布坐标比例映射球拍；局部键盘/按住按钮移动。本站requestAnimationFrame只在运行时推进，暂停/失焦/隐藏/离页cancel；恢复从当前时间计时，不追补后台时间。最高记录只使用普通内存对象，不持久保存。减少动态直接显示真实分数，保留游戏运动。

## 下落方块

- 来源：[jakesgordon/javascript-tetris](https://github.com/jakesgordon/javascript-tetris)，固定提交`e5c0c42f7dac0f3514a55eff656c6e22e95d68ed`。原单页完整字节保存为`vendor/blocks/index.html.txt`（文本，不作为可执行入口），原[MIT LICENSE](vendor/blocks/LICENSE)保留。本站名称为“下落方块”，不使用Tetris标志或暗示官方关联。
- `blocks/engine.js`从原单页内联逻辑提取7种4×4位图/旋转编码与`eachblock`、`occupied/unoccupied`、`randomPiece`、`move/rotate/drop/dropPiece`、`removeLines/removeLine`及分数/速度规则，实际由输入和循环调用。绘制与生命周期由本站外壳处理，没有stats.js或texture.jpg。
- 修正原随机袋最后一项不能选中的索引范围；随机出生列改为完整合法整数范围。消行检查改为ny-1到0，包含顶行，保留连续满行的同一行复检、分数和移行机制。输入队列最多32项，暂停/画面失焦清空，避免恢复后执行积压动作。
- 原生Canvas色块和下一块预览；局部键盘与手机按钮。没有持久存储、图片、字体、音源或统计请求。动画循环在暂停/隐藏/失焦/离页停止，需要主动继续。

## 新游戏公共适配与验证边界

新增`extra-shell.css`、`extra-boot.js`、`extra-runtime.js`，只由新三款加载；旧`shell.css`及旧两款核心不变。父页主动开始才加载，校验同源、当前iframe及slug后的就绪/失败消息，失败可重试；高度由子页外壳尺寸上报，不以页面总scrollHeight形成增长反馈。减动态偏好由父页传递并结合系统偏好。

运行入口仅加载本站代码与CSS，不带入上游HTML、图片、字体、纹理、音频或诊断脚本。原始源码中的外部链接作为许可证/历史代码文本保留，不在游戏运行路径执行。实际原件/衍生代码SHA见`source-manifest.json`；重复生成方法存于项目design的`adapt-extra-games.mjs`。

本轮前端仅做静态检查与必要隔离smoke，工程负责独立核心规则测试及官方检查/构建，主线负责实际浏览器与手机布局验收。代码接入不等于已完成运行验收。


## 星际卡丁车

- 原作：[bridge-mind/turbo-kart-rush](https://github.com/bridge-mind/turbo-kart-rush)，固定提交 6c0456c7642447eae29e0832e7e542fec07ec07d，保留完整 [MIT LICENSE](vendor/kart/LICENSE)（Copyright 2026 BridgeMind）。完整原始压缩包与展开源码保存在项目 game-projects/kart/upstream.zip、upstream/，本站衍生源码为 adapted/；原仓库文档图片不在运行路径使用。
- 使用项目已有 Three.js 0.186.0 与 Vite 8.3.4 构建，无新依赖安装。Three.js 随构建本地加载，保留 [Three.js MIT LICENSE](vendor/kart/THREE-LICENSE)。完整上游竞速项目采用 Three.js；Three.js 本身是三维渲染库。
- 保留四赛道、八原创赛车手、玩家加七 AI、三圈、物理碰撞、漂移充能、道具、完赛、重开与换赛道。未改成简化二维玩法。将蘑菇/龟壳/拟人黑球炸弹的模型、图标与名称替换为推进电池、无人机、脉冲地雷等中性几何道具；旧枚举名仅用于复用原机制，不代表运行画面。
- 本款覆盖前文旧五款“点击加载”的描述：进入 /games 或 /games/kart 自动加载选车菜单，首页不加载；不自动比赛、不抢父页焦点。赛道点击只选中，明确点击“开始比赛”才开赛。
- 默认静音，只有主动点击“开启声音”才创建/恢复 AudioContext。声音为本地程序化合成，无音源请求。暂停、失焦、隐藏、离页取消 RAF、清输入并暂停 AudioContext 和音乐调度；主动继续不补算时间，声音需再次主动开启。
- 手机使用独立 pointerId 的多指按钮，pointercancel/lostcapture 清理各指输入。渲染按设备限制 DPR/像素预算，手机禁用阴影/后处理并降低粒子量，比赛上限30帧（桌面45帧）；菜单最多15帧且闲置3秒后停 RAF。减少动态关闭镜头抖动/倾斜、速度线、闪光后处理与装饰粒子。
- 修复排名只增不减的历史进度错误。检查点要求前向穿越与赛道空间边界，倒车、越野投影、低于赛道不计点；超时 AI 收尾标为“未完赛”，不展示虚构完赛时间。
- 不用持久存储、cookie、账号、遥测、排行榜上传、外部字体或联网对局。没有公开调试对象、录屏或测试后门。严格校验父消息 origin/source/slug，目标 origin 不用通配符。WebGL2不可用、上下文丢失/初始化失败提供中文重试。
- 自动验证使用真实 Track/Kart/AIDriver/ItemManager/RaceManager 四赛道各三圈；只以 Canvas2D stand-in 代替纹理绘制，不替代物理。另测检查点边界、多指输入、真实 pause/resume 方法、音频默认无上下文。浏览器、GPU实际画面和真机性能由主线另验，不能用隔离测试代替。
- 本地重建：node scripts/build-kart.mjs，检查：node node_modules/typescript/bin/tsc -p game-projects/kart/adapted/tsconfig.json。来源与构建哈希记录在 source-manifest.json。
