# 开源来源与版权声明

本项目不是经典商业游戏的 ROM 合集。原有四款游戏使用以下开源 JavaScript 项目的代码；星际突围、方块堆叠、海岛寻果为本项目原创；炸弹对战、推箱子、导弹拦截参考 Straker 的 CC0 示例，针对浏览器与微信小游戏重新实现了运行入口、绘制、输入、UI 和房间服务。独立红白机板块在网页使用 MIT 授权的 `@nesjs/core`，在微信小游戏使用 Apache-2.0 授权的 `jsnes`；只内置本项目原创测试卡带，用户导入和目录内的远程 ROM 不随项目分发。

前三款上游代码版权：Copyright (c) 2011, 2012, 2013, 2014, 2015, 2016 Jake Gordon and contributors。代码许可证均为 MIT，允许使用、修改和商业分发，分发时须保留版权与许可文本。MIT 授权不代表微信平台的发行审核或游戏资质已经完成。

| 本项目     | 上游与固定版本                                                                                   | 复用与修改                                                                                                                   | 完整许可                           |
| ---------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- |
| 像素贪吃蛇 | https://github.com/jakesgordon/javascript-snakes/tree/4ed98daa36d1c219576dabd3e67bc19236ab2b0b   | `js/snakes.js` 的方向队列、禁止反向转弯、网格移动思路和代码结构；重写数组蛇身、空格食物采样、计分与触控                      | `licenses/javascript-snakes.txt`   |
| 霓虹打砖块 | https://github.com/jakesgordon/javascript-breakout/tree/eed59e2affa9423b93d2ac8ff93061bb88b33284 | `game.js` 的 `Game.Math.intercept` / `ballIntercept` 线段碰撞代码；改为最早碰撞并新增多次反弹、30 关原创布局、耐久砖块和道具 | `licenses/javascript-breakout.txt` |
| 好友乒乓   | https://github.com/jakesgordon/javascript-pong/tree/ca3240536e4f79ab7144388e56ed19de715b6662     | `pong.js` 的 `Pong.Helper.intercept` / `ballIntercept`，及球拍、球的碰撞处理；新增固定步长、7 分制、电脑对手与服务端房间     | `licenses/javascript-pong.txt`     |

## 坦克 1990 / 基地保卫战

复用项目：[feichao93/battle-city](https://github.com/feichao93/battle-city/tree/86c41c8c3c49cd27255bcf63167091d1061801fa)，固定提交 `86c41c8c3c49cd27255bcf63167091d1061801fa`。MIT，Copyright (c) 2026 feichao93。完整原始许可见 `licenses/battle-city.txt`。原 `shinima/battle-city` 地址在 Git 拉取时指向这一仓库。

仅改编 `src/engine/physics/geometry.ts` 的区间、矩形碰撞、方向辅助函数，以及 `src/engine/random.ts` 的种子随机函数，见本项目 `src/games/tank-geometry.js`。坦克战斗、AI、关卡、道具、Canvas 绘制和操作代码为本项目新增。

“坦克 1990”在此表示怀旧坦克保卫战玩法的重新实现，不是原版 ROM 或获得原商业游戏授权的发行版本。没有导入上游或原版的精灵图、标志、音效、音乐、原版地图、ROM、字体及 NES 数值资源。35 张地图与基地旗帜标志均重新设计。新增的双人规则、选关和房间同步代码按项目 MIT 许可发布。

## 星际突围与方块堆叠

星际突围（src/games/shooter.js）和方块堆叠（src/games/blocks.js）的玩法代码、关卡编排与绘制均为本项目新增，按根目录 MIT LICENSE 发布。两款游戏复用项目内 tank-geometry.js 的种子随机函数，保留其 battle-city 来源声明。没有引入商业游戏名称标识、精灵图、音乐、关卡数据或 ROM。

## 海岛寻果

海岛寻果使用本项目新增的 `src/games/side-scroller.js`、`src/games/side-stages.js` 和 `src/side-render.js`，实现海岛生存冒险规则，共 24 关。代码、角色、场景、关卡编排和绘制按根目录 MIT LICENSE 发布。

它不是《冒险岛》的原版或授权移植，未导入商业游戏的 ROM、关卡数据、角色图像、商标图案、音效或音乐。声音使用本项目已有的原创合成音效。

## 未使用的上游资源

- javascript-snakes README 说明其图像和音效来自 iStockPhoto、Lucky Lion Studios、Premium Beat，只授权在原项目中使用。本项目未导入这些资源。
- javascript-breakout LICENSE 对声音单独标注 CC BY-ND 2.0。本项目保留上游 LICENSE 原文，但未导入其声音，也不依赖此声音许可。
- javascript-pong 中的图片和声音同样未导入。
- 没有复制上游字体、浏览器适配框架、第三方音频库、素材或关卡文件。

## 本项目新增内容

`web/arcade.svg`、图标、Canvas 像素绘制、关卡、UI、触控、音效生成器和网络服务均为本项目新增，按仓库根目录 MIT LICENSE 发布。音效由 src/audio/chiptune.js 的脉冲波、量化三角波与 15 位 LFSR 噪声生成，网页播放 PCM，微信构建输出 WAV；14 种声音与开场/结算旋律均为本项目原创，不包含第三方录音、原版音乐或 ROM 音频数据。界面使用系统字体，无远程字体或图片依赖。

## 依赖

- `ws` 8.18.3：MIT，用于 Node.js 房间服务；许可位于安装包 `node_modules/ws/LICENSE`。
- `esbuild` 0.25.10：MIT，仅用于打包工具；许可位于安装包 `node_modules/esbuild/LICENSE.md`。
- `qrcode` 1.5.4：MIT，用于在浏览器本地生成 WebRTC 配对二维码；Web 发行包许可位于 `licenses/qrcode.txt`。
- `jsQR` 1.4.0：Apache-2.0，用于在浏览器本地识别用户选择的二维码图片；Web 发行包许可位于 `licenses/jsqr.txt`。
- `@nesjs/core` 2.7.0：MIT，Copyright (c) 2024–2025 taiyuuki；用于 NES CPU、PPU、APU、卡带 Mapper 与存档状态。完整许可见 `licenses/nesjs-core.txt`。
- `jsnes` 2.1.0：Apache-2.0，Copyright 2020 Ben Firshman；作为微信小游戏端的轻量 NES 执行内核。完整许可见 `licenses/jsnes.txt`。网页端继续使用 `@nesjs/core`。
- `7z-wasm` 1.2.0：其 `7zz.*.js` / `7zz.wasm` 按 LGPL-2.1-or-later 与 unRAR 附加限制分发，用于在设备本地提取 `.7z` 卡带包。本项目只修改生成的 JavaScript 包装层，移除 Node.js 启动分支，WASM 未修改。完整许可、unRAR 限制、对应源码和重新构建方法见 `licenses/7zip-license.txt`、`licenses/LGPL-2.1.txt`、`licenses/7zip-unrar.txt` 与 `licenses/7z-wasm-source.md`。unRAR 代码不得用于重新创建专有 RAR 压缩算法。

微信构建会自动带上本文件、根 LICENSE、MIT / CC0 / LGPL / unRAR 声明和对应源码说明。上游提交和许可文件 SHA-256 同时记录于 `licenses/sources.json`。

## 红白机模拟器与 ROM 边界

实现参考 [taiyuuki/vscode-nes](https://github.com/taiyuuki/vscode-nes/tree/240f32e575ab3969cae4742e06c943551d843f51) 的远程卡带与 7z 加载流程；该扩展的 MIT 许可见 `licenses/vscode-nes.txt`。项目从该提交的 `res/nes.sqlite3` 提取游戏名称、类型、厂商、日期、文件名和 Mapper 元数据，规范化结果为 `data/nes/vscode-nes-roms.json`，微信包使用它的压缩副本。没有复制 VS Code 界面，也没有把远程 ROM 二进制放进项目包。

模拟器代码开源不等于 ROM 获得授权。目录中的 `sourceCopyrightLabel` 只是上游数据库标签，不构成许可证判断；配置内明确记录 `romRightsVerified: false`。网页和微信会在首次打开远程条目时要求确认使用权。项目不缓存、转发、上传或随包分发这些远程 ROM；“最近导入”只在本设备保存链接。内置的 `assets/nes/pad-lab.nes` 由本项目脚本 `scripts/make-pad-rom.mjs` 生成，不含商业游戏代码、画面、关卡、音乐或商标。

`data/nes/tomiaa12-nesroms.json` 是 `tomiaa12/nesRoms` 固定提交 `c02cf3d576f4b1f6c346b9aa80b8b3c9816d3d5f` 的资产清单，补充元数据来自同作者 `tomiaa12/blog` 固定提交 `2edd84065a40a9256a46d3715c44f0e639ba2d75` 的 `game.ts`。网页将该 JSON 作为默认中文目录，微信包只携带它的 7z 压缩配置。项目仅保存路径、标题、分类、文件尺寸、哈希和 iNES 头等元数据，没有复制该仓库的 392 个 ROM 或 2,324 张 PNG。仓库带有 MIT 文件，但其中包含大量第三方商业游戏和汉化版本；不能仅凭仓库级 MIT 声明推定所有 ROM、翻译、商标和截图均可再分发。配置明确标记 `romRightsVerified: false`，下载和自托管前仍需逐项核权。

## 炸弹对战、推箱子、导弹拦截

参考作者 Straker 的 Basic HTML Games。以下固定版本的 README 均声明 CC0 1.0 Universal，允许个人与商业使用。CC0 仅针对作者提供的示例代码，不表示取得同名商业游戏的品牌、ROM 或素材授权。

| 本项目   | 固定上游版本                                                                                              | 参考范围                         | 声明文件                         |
| -------- | --------------------------------------------------------------------------------------------------------- | -------------------------------- | -------------------------------- |
| 炸弹对战 | https://gist.github.com/straker/769fb461e066147ea16ac2cb9463beae/0434380aa2e13117930d803d4483d8caafe22af0 | 格子阻挡、十字爆炸和连锁处理     | licenses/straker-bomber-cc0.txt  |
| 推箱子   | https://gist.github.com/straker/2fddb507d4bb6bec54ea2fdb022d020c/1096a4ce0175f9eaf47d1141a467889e82f39b06 | 格子推动与目标点保留规则         | licenses/straker-sokoban-cc0.txt |
| 导弹拦截 | https://gist.github.com/straker/afc4e2a30b6df772a5f9f6ef01751d41/d45d8730121c8a60eea9d2951ea8d1af380e6aae | 目标向量、就近发射与圆形爆炸碰撞 | licenses/straker-missile-cc0.txt |

上游声明原文：“(CC0 1.0 Universal) You're free to use this game and code in any project, personal or commercial. There's no need to ask permission before using these. Giving attribution is not required, but appreciated.”

本项目对三个示例的规则作重新实现，新增 AI、对称竞技场、回合比赛、道具、服务器同步、原创推箱子生成器及解法、撤销/星级、分裂弹/波次、两端触控和原创 Canvas 绘制。新增代码按根目录 MIT LICENSE 发布，上游仍保留 CC0 状态。未引入上游示例地图、截图或商业游戏资源。CC0 完整文本见 licenses/CC0-1.0.txt。
