mashup-mods
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseMashups: putting one game inside another
Mashup:把一款游戏放进另一款游戏
In September 2026 a wave of AI-built mashups went viral: skateboarding in MW2, Minecraft inside Skyrim,
Elden Ring and Mario 64, Black Ops 2 inside Minecraft. They use four patterns. Pick the lightest one that
delivers the idea, and plan the oracles before writing code: these projects fail by drifting, not by lacking
code.
2026 年 9 月,一波由 AI 构建的 Mashup 走红:MW2 滑板、把 Minecraft 放进 Skyrim、Elden Ring 和 Mario 64,以及把 Black Ops 2 放进 Minecraft。它们采用四种模式。选择能够实现创意的最轻量模式,并在开始写代码前规划好所需的 oracle:这类项目失败往往是因为逐渐偏离目标,而不是因为代码不足。
Pattern 1: port the content (lightest)
模式 1:移植内容(最轻量)
Bring an enemy, weapon or block type into the host as new host content that imitates the guest.
Examples: "Claude added creepers to Dark Souls", Minecraft blocks as Elden Ring items.
- Read the guest's behaviour from its source of truth: decompile or read the wiki's exact numbers (speeds, timers, damage). Reimplement it in the host's mod API (host AI state machine, host projectile).
- Assets: never copy the guest's files into your mod. Convert them from the user's install at runtime or install time (a converter script), or recreate lookalikes with fal.
- It's cheap and robust, with no IPC. It works with any host that has a loader.
将敌人、武器或方块类型带入 host 游戏,作为模拟 guest 的全新 host 内容。
示例:“Claude added creepers to Dark Souls”,以及将 Minecraft 方块制作成 Elden Ring 道具。
- 从 guest 行为的 source of truth 获取信息:进行反编译,或读取 wiki 中的精确数值(速度、计时参数、伤害)。然后在 host 的 mod API 中重新实现(host AI 状态机、host 投射物)。
- **资产:**绝不把 guest 的文件复制到 mod 中。应在 runtime 或安装时通过转换脚本从用户安装目录进行转换,或者使用 fal 重新创建外观相似的资产。
- 这种方案成本低且稳健,不需要 IPC。任何带有 loader 的 host 都可以使用。
Pattern 2: passthrough (two games at once)
模式 2:passthrough(两款游戏同时运行)
chasm's description of Minecraft-in-Skyrim: "minecraft and skyrim run at the same time and you make a mod
for both that lets them communicate. Then you passthrough the things you want into the renderer in the
right place and feed stuff like collision data back to minecraft." No code was published. The design below
is the standard way to build it.
- Guest process (e.g. Minecraft with a Fabric mod, or a headless reimplementation): runs the simulation and publishes state every tick. That's entities/blocks near the player, or a rendered layer.
- Transport, all on :
127.0.0.1- state: a shared-memory ring buffer () or UDP/named pipes;
CreateFileMapping - control: JSON lines or HTTP;
- GPU frames: DXGI shared handles (/
CreateSharedHandle+ keyed mutex), Vulkan external memory, or Spout2.OpenSharedResource1
- state: a shared-memory ring buffer (
- Host injection: a host-side plugin (SKSE/xNVSE/UE4SS/REFramework/ReShade addon) draws the guest's geometry inside the host's pass. It uses the host's view-projection matrices (find them with RenderDoc) and depth buffer, or spawns host-native objects so host lighting and shadows apply. The Skyrim clip gave Steve Skyrim's lighting, which points to scene integration, not a flat overlay.
- Back-channel: the host's collision near the player (raycasts, or exported nearby mesh) goes to the guest as solid blocks or colliders. Input routes to one process at a time.
- Sync: timestamps on every message, tolerance for the two frame rates, and a watchdog when one side dies.
- Start small: a cube from process A drawn in B at the right spot. Then positions every frame, then collision, and only then real content.
Bridge-plugin template in public: chasm-bridge-fnv (thin xNVSE plugin, file-drop/HTTP transport,
data-driven actions). The Terraria agent bridge in is the same
idea.
examples/terraria-tmodloader/reference/chasm 对 Minecraft-in-Skyrim 的描述:“Minecraft 和 Skyrim 同时运行,你为两者编写一个 mod,让它们能够通信。然后将需要 passthrough 的内容传入渲染器中的正确位置,并把碰撞数据之类的信息反馈给 Minecraft。” 没有发布代码。下面的设计是构建此类项目的标准方式。
- Guest 进程(例如带 Fabric mod 的 Minecraft,或无头重实现):运行模拟,并在每个 tick 发布状态。状态可以是玩家附近的实体/方块,也可以是一个渲染层。
- 传输层,全部运行在 上:
127.0.0.1- 状态:共享内存 ring buffer(),或 UDP/named pipes;
CreateFileMapping - 控制:JSON lines 或 HTTP;
- GPU 帧:DXGI shared handles(/
CreateSharedHandle+ keyed mutex)、Vulkan external memory,或 Spout2。OpenSharedResource1
- 状态:共享内存 ring buffer(
- **Host 注入:**host 侧插件(SKSE/xNVSE/UE4SS/REFramework/ReShade add-on)在 host 的 pass 内绘制 guest 的几何体。它使用 host 的 view-projection matrices(可通过 RenderDoc 找到)和 depth buffer,或者生成 host 原生对象,让 host 的光照和阴影生效。Skyrim 的视频让 Steve 拥有 Skyrim 的光照,这说明关键在于场景集成,而不是平面叠加。
- **反向通道:**host 中玩家附近的碰撞信息(raycasts,或导出的附近 mesh)会作为实心方块或 colliders 发送给 guest。输入每次只路由到一个进程。
- **同步:**每条消息都带时间戳,容忍两种帧率之间的差异,并在一端崩溃时使用 watchdog。
- **从小处开始:**先把进程 A 的立方体绘制到进程 B 的正确位置,然后实现逐帧位置同步,再加入碰撞,最后才接入真实内容。
公开的 bridge-plugin 模板:chasm-bridge-fnv(轻量 xNVSE 插件,使用文件拖放/HTTP 传输和数据驱动的操作)。 中的 Terraria Agent bridge 采用的也是同一思路。
examples/terraria-tmodloader/reference/Worked example: real Minecraft inside GTA V
实例:把真正的 Minecraft 放进 GTA V
Code: . Every lesson: .
examples/minecraft-gta5-passthroughknowledge/games/gta-v/minecraft-passthrough.md- Minecraft (Fabric mod): it takes camera, ground and input from the host over a WebSocket on
. Each frame it writes world colour + depth and a separate hand/HUD overlay into named shared memory.
127.0.0.1 - GTA (ScriptHookV ASI + ReShade add-on):
- it sends GTA's camera and the ground under the player (as barrier blocks);
- it composites Minecraft's colour against GTA's reversed-Z depth in a shader;
- it turns Minecraft explosions, arrows and firework hits into GTA explosions and bullets.
- Mapping: 1 metre = 1 block. GTA (x, y, z) → MC (x, z + offset, −y); yaw = 180 − heading; pitch = −pitch.
- Latency: Minecraft's frame is re-projected onto GTA's camera, rotation then full 6-DoF with depth. Measure the pose lag with a scene where one side draws something the other doesn't (a gold wall vs the skyline).
- Built without the game: most of it was built before the host game was even installed, against a fake host (known geometry) and a fake D3D11 "GTA" that runs the real compositor.
- What didn't work: putting host-game guns in Steve's hands (the aim cam and animations don't fit). Guest weapons with host effects did.
代码:。全部经验总结于:。
examples/minecraft-gta5-passthroughknowledge/games/gta-v/minecraft-passthrough.md- **Minecraft(Fabric mod):**通过 上的 WebSocket 从 host 获取相机、地面和输入。每帧将世界颜色和深度,以及单独的手部/HUD 叠加层,写入命名共享内存。
127.0.0.1 - GTA(ScriptHookV ASI + ReShade add-on):
- 将 GTA 的相机以及玩家脚下的地面(表示为 barrier 方块)发送给 Minecraft;
- 在 shader 中将 Minecraft 的颜色与 GTA 的 reversed-Z depth 合成;
- 将 Minecraft 的爆炸、箭和烟花命中转换为 GTA 的爆炸与子弹。
- **坐标映射:**1 米 = 1 个方块。GTA (x, y, z) → MC (x, z + offset, −y);yaw = 180 − heading;pitch = −pitch。
- **延迟:**先将 Minecraft 帧重投影到 GTA 相机上,处理旋转,再结合深度实现完整的 6-DoF。使用一个只有一端绘制、另一端不绘制的场景来测量姿态延迟(金色墙面与天际线)。
- **脱离游戏完成开发:**大部分工作是在 host 游戏尚未安装时完成的,使用一个假 host(几何体已知)和一个运行真实 compositor 的假 D3D11“GTA”。
- **行不通的方案:**把 host 游戏的枪放进 Steve 的手中(瞄准相机和动画无法适配)。改用带 host 特效的 guest 武器则可行。
Pattern 3: embed a decomp as a library
模式 3:将 decomp 作为库嵌入
libsm64 turns the Super Mario 64 decomp into a library: feed it collision and input, and it returns Mario's
state and mesh. G64 embeds it in Garry's Mod; the host feeds its collision into the guest sim. Any
decomp/recomp (see ) can be wrapped this way. The
user supplies their own ROM for assets.
skills/mod-any-game/references/engines/retro-decomp.mdlibsm64skills/mod-any-game/references/engines/retro-decomp.mdPattern 4: reimplement, then fuse (heaviest, most control)
模式 4:先重实现,再融合(最重,控制力最强)
- IW4L: an LLM-written Rust MW2 runtime (Bevy + wgpu). It reads MW2's FastFiles from the user's install and translates the D3D9 shaders to WGSL.
- The Skate 3 Rust engine: built against a static recomp and an IDA database as oracles.
- The mashup: fuses both, plus a Minecraft Rust reimplementation, in one process. The skate sim is a worker that takes over the MW2 soldier. MW2 map collision feeds the skate world. Grind rails come from walkable collision edges. Skate bones are retargeted onto the MW2 skeleton.
- What made it work:
- A scriptable runtime as the oracle: , with blocking verbs and evidence files per run.
spawn; wait 2s; screenshot; dump - An evidence journal (). "Knowledge that is not in an artifact does not exist."
context/artifacts/<date>/<step>-FINAL|PART - Owner-approved end-to-end tests only.
- A publish check that greps for retail offsets and decompiler names before any push
(does a version of this).
um publish check - Converters that run on the user's files; game assets never committed.
- A scriptable runtime as the oracle:
- **IW4L:**一个由 LLM 编写的 Rust MW2 runtime(Bevy + wgpu)。它从用户安装目录读取 MW2 的 FastFiles,并将 D3D9 shaders 转换为 WGSL。
- **Skate 3 Rust 引擎:**以 static recomp 和 IDA 数据库作为 oracle 构建。
- **Mashup:**在一个进程内融合上述两者,并加入一个 Rust 版 Minecraft 重实现。滑板模拟作为 worker 接管 MW2 士兵。MW2 地图的碰撞输入滑板世界。grind rail 由可行走碰撞边缘生成。滑板骨骼被重定向到 MW2 骨架上。
- 成功原因:
- 可脚本化的 runtime 作为 oracle:,支持阻塞式命令,并为每次运行生成证据文件。
spawn; wait 2s; screenshot; dump - 证据日志()。“不存在于 artifact 中的知识,就等同于不存在。”
context/artifacts/<date>/<step>-FINAL|PART - 仅运行经 owner 批准的 end-to-end 测试。
- 发布检查会在任何 push 前 grep 正式版偏移量(retail offsets)和反编译器名称(可完成类似检查)。
um publish check - 转换器在用户自己的文件上运行;绝不提交游戏资产。
- 可脚本化的 runtime 作为 oracle:
Guardrails
防护准则
- Offline and single-player. Never network into the real games' online services.
- Everything guest-side comes from the user's own install or dump. Publish code and converters, not assets
().
um publish check --game - Be honest about what's AI-built. Creators who weren't got called out publicly.
- 仅限离线和单人游戏。绝不要连接真实游戏的在线服务。
- guest 侧的所有内容都来自用户自己的安装目录或 dump。发布代码和转换器,而不是资产()。
um publish check --game - 如实说明哪些部分由 AI 构建。未如实说明的创作者曾被公开指出。