mon231/sonic

GitHub: mon231/sonic

经典 Flash 游戏 Ultimate Sonic 的社区 Mod,新增全员飞行、戒指磁铁、无敌等作弊功能及地面重击动作。

Stars: 0 | Forks: 0

# Ultimate Sonic Flash — Mod 版 [点击游玩](https://mon231.github.io/sonic/) 这是经典 Flash 游戏 *Ultimate Sonic* 的一个社区 Mod,增加了提升体验的作弊功能和游戏玩法特性,包括全员飞行、戒指磁铁和地面重击。 原版游戏发布于 Newgrounds,现已免除版权。如今,Flash 游戏可以通过 [Ruffle](https://ruffle.rs/) 浏览器扩展或桌面播放器来运行,它能够模拟 Adobe Flash 运行时,而无需安装 Flash 本身。 ## 本 Mod 的修改内容 ### 作弊系统 — 所有作弊功能始终可用 原版游戏将作弊功能锁定在存档进度之后。本 Mod 无条件调用 `setcheats()`,因此**所有作弊功能在首次启动时即可使用**。Amy 和 Shadow 在角色选择界面也始终处于解锁状态。作弊菜单支持滚动(每页 5 个,带有 PREV/NEXT 按钮),以保持界面整洁。 ### 作弊功能 6 — `ALL FLY` 在原版游戏中,只有 Tails 和 Cream 可以飞行(在空中双击跳跃键可滑翔,再次点击可向上扇动)。此作弊功能将该能力扩展到所有角色。 - Tails 和 Cream 保留其原生的 `fly` 动画。 - 所有其他角色在滑翔时使用 `jumphigh` 动画作为视觉替代。 - 飞行仍会在约 100 帧后失效;落地可重置飞行时间。 ### 作弊功能 7 — `INFINITE-FLY` 当此功能与 `ALL FLY` 同时开启(或在扮演 Tails / Cream 时)时,飞行计时器会在每一帧刷新,而不是递减。角色将无限期停留在空中。除非当前角色具备飞行能力,否则此功能无效。 ### 作弊功能 8 — `INVINCIBLE` `sethit()` 会在应用任何伤害之前立即返回。角色不会丢失戒指,不会受到攻击,也不会因与敌人接触而死亡。 ### 作弊功能 9 — `RING MAGNET` 距离玩家 200 屏幕像素范围内的散落戒指,每一帧都会被拉向玩家。吸引力随距离远近而缩放;戒指的速度上限为 10 像素/帧,以确保平滑滑动。一旦戒指到达玩家的碰撞箱,仍会正常收集。 ### `Q` / `q` / `/` — 退出到菜单 在游戏过程中按下这些按键中的任意一个,会立即返回主菜单(不扣除生命)。 ## 地面重击(始终开启,无需作弊功能) 在空中时,按下 **下方向键** 进行地面重击: - 瞬间切入快速下落状态;水平速度削减至 20%。 - 取消任何激活的飞行模式。 - 落地时,碰撞箱在 4 帧内扩大至 600%,通过敌人自身的碰撞代码击败附近的敌人。 ## 如何在游戏中使用作弊功能 1. 打开游戏(参见下方的**运行 Mod**)。 2. 在主菜单中选择 **CHEATS**。 3. 开启任意作弊功能(使用 NEXT/PREV 滚动浏览全部 9 个功能)。 4. 选择一个角色并开始关卡。 ## 运行 Mod 输出文件为 `sonic_fly.swf`。使用 Ruffle 加载它: **浏览器扩展** — 为 Chrome/Firefox 安装 [Ruffle](https://ruffle.rs/#releases),然后将 `sonic_fly.swf` 作为本地文件打开(`文件 → 打开文件`,或将其拖放到浏览器标签页中)。 **Ruffle 桌面版** — 从 [Ruffle 发布页面](https://github.com/ruffle-rs/ruffle/releases) 下载独立播放器,并直接打开 `sonic_fly.swf`。 ## 从源码构建 本 Mod 的 ActionScript 源码位于 `decompiled/scripts/`。构建过程使用 [JPEXS Free Flash Decompiler (FFDec)](https://github.com/jindrapetrik/jpexs-decompiler) 将修改后的脚本重新注入到原始的 SWF 二进制文件中。 ### 前置条件 - Java 11 或更高版本 - FFDec 21.0.1 (`ffdec.jar`) — 由 CI 工作流自动下载 ### 本地构建 ``` java -jar /path/to/ffdec.jar \ -importScript ultimate_sonic.swf sonic_fly.swf \ decompiled/scripts ``` 原始的 SWF (`ultimate_sonic.swf`) 保持原样;所有输出均会生成到 `sonic_fly.swf` 中。 ## 仓库结构 ``` . ├── ultimate_sonic.swf # original, unmodified game binary (source) ├── sonic_fly.swf # compiled mod output (produced by CI) ├── decompiled/ │ └── scripts/ # modified ActionScript 2 sources │ ├── frame_290/ │ │ └── DoAction.as # cheat registry & setcheats() │ ├── frame_291/ │ │ └── PlaceObject2_2497_4/ │ │ ├── onClipEvent(load)_2.as # cheat menu display / scrolling (maxCheat=9) │ │ └── onClipEvent(load)_3.as # cheat toggle handler │ └── frame_327/ │ └── PlaceObject2_2556_25/ │ ├── onClipEvent(load).as # control functions, animations, ground pound init │ └── onClipEvent(enterFrame).as # fly countdown, shockwave, ring magnet └── .github/ └── workflows/ └── build.yml # CI/CD: recompile SWF and publish as artifact ``` ## 技术说明 ### 反编译 SWF 通过 `ffdec -export script` 命令反编译为 ActionScript 2 (`.as`) 文件。FFDec 保留了原始的字节码结构;`importScript` 仅重新编译修改过的脚本,并将其重新打包到 SWF 中。 ### 飞行机制内部原理 `fly` 变量是一个整数(未激活时为 `"off"`,首次激活时为 `100`)。游戏每一帧使其递减 1。只要 `fly != "off"`,`setgravity()` 就会将重力除以 5。`INFINITE-FLY` 每一帧都会将 `fly` 写入为 `100`,因此计时器永远不会达到 0。 ### 地面重击冲击波 所有敌人都通过调用 `hitTest(_root.Sonic1.hitb)` 来检测是否与玩家接触——这里使用的是一个共享的碰撞箱剪辑。在落地后的 4 帧内将 `hitb._xscale/_yscale` 缩放至 600%,会触发附近每个敌人自身逐帧的碰撞检查,从而在无需修改任何敌人脚本的情况下击败它们。 ### 戒指磁铁坐标 散落的戒指剪辑 (`_root["rl" + n]`) 和玩家的 `_x/_y` 坐标均由摄像机系统维持在屏幕空间中。磁铁代码中的距离检查直接以屏幕像素为单位工作——无需进行坐标转换。 ### 为什么非 Tails/Cream 角色使用 `jumphigh` Sonic、Knuckles、Amy 和 Shadow 的精灵时间轴中没有 `fly` 帧标签(动画最高只到第 120 帧;而 Tails 和 Cream 在第 180 帧有专用的循环 `fly` 动画)。`jumphigh` 是所有角色精灵中可用的、最接近的现有空中姿态。
标签:CMS安全, Flash游戏, JavaScript, 前端, 游戏, 游戏Mod