Skip to content

Releases

Xnavi v3.2.2-savagewind.7 · Savage Wind 适配版

Choose a tag to compare

BOTWmap 地图工具 + xnavi 实时定位,适配 Savage Wind Recomp(原生重编译版,非模拟器)。

包含文件

文件 作用
Xnavi.exe GUI 壳(Wails + WebView2),平台下拉已含 Savage Wind
xnavi-core.exe 定位核心,GUI 点「开始定位」时自动拉起
app/ 地图页面与前端显示逻辑(约 12 MB;底图瓦片走线上,不占包体积),必须与两个 exe 同目录,不要删
ADAPT-SAVAGEWIND.md 适配说明:数据源 / 路径 / 加载方式 / 实测数据 / 限制
README.txt 快速上手

底图瓦片从 botw.yalin.site 在线加载,首次打开需联网。断网时底图空白,但标记点、存档进度、红点定位仍可用。

用法

  1. 解压到任意目录,Xnavi.exe、xnavi-core.exe、app/ 必须在同一目录(本包已自带地图,无需另下)
  2. 打开 Xnavi.exe,平台下拉选择 Savage Wind
  3. 点「开始定位」,红点即出现在游戏内当前位置
  4. 手机/平板与电脑同一 WiFi,打开 http://<电脑IP>:8766/botw/?follow=1 可当第二屏跟随

存档路径留空会自动取 <游戏目录>\Savage Wind\save,也可在设置页手动指定。

本次适配要点

  • 平台驱动 platform_savagewind.go:进程 savagewind(排除 Configuration 壳);guest RAM 为 0x7000000000+ 的 RW 私有区(实测 0x723FF00000 起 3121MB,小端、guest 偏移即进程偏移)
  • 存档:版本白名单补 0x4730(游戏 1.9.0),其余结构与 Switch 版一致;主档按 mtime 最新
  • 修复①:活跃度门禁 —— 游戏会把「上次存档的玩家位置」也映射进内存,结构与真身 Transform 完全同构且紧贴锚点,旧排序会锁到这份静态快照(红点冻结在读档点、永远 verified=false)。改为锁前对候选采样 1KB 窗口两次(间隔 150ms),按字节变化把活对象排到最前
  • 修复②:窗口内全静止不锁定 —— 存档 79 分钟未更新时锚点与真身相距 157m,120m 窗口内 186 组候选全部零变化。现在扫不到活对象就不硬锁,外层自动放大到 400m / 3000m,全静止则退避 6s 重试
  • 修复③:锁定看门狗 —— 世界仍在刷新(anyWorldTicking)但锁定记录完全静止超过 45s 时掉锁重扫;打开菜单/暂停时世界不刷新,保持锁定不误踢
  • 修复④:大师模式/新档锁不上 —— 两个缺陷叠加:①选档规则让「有神庙进度」的旧档优先于 mtime 最新的档,新开档 shrines=0 永远输给几十分钟前的旧档(锚点偏 274m);②候选按 Run 降序,静态快照 Run=33 占满全部 64 个采样名额,真身 Run=2~6 排不进去,于是每轮都判「全部静止」。现在主锚取 mtime 最新且 Playtime>0,活跃度采样改为按 Run 分层(每层 64、总 384),全静止时再用 0x100 窄窗口对剩余候选复采一轮
  • 修复⑤:换档后宝箱显示已开启 —— 三处存档同步都写成「非空才覆盖」,新档 0 个宝箱时直接跳过注入,上一档存在 localStorage 的宝箱集合就原样显示。改为空集也注入(整集替换);另加 PlayTime 指纹,时长回退超过 30 秒判定换档,自动清掉上一档的宝箱/装备/任务快照
  • 修复⑥:清空入口不存在 + 静态资源缓存 —— 「清空本地探索度」的 JS 一直在找 btnClearDone,但 index.html 里从来没有这个元素,导致换档残留无法手动清理(已补 🧹 图标)。静态资源统一加 Cache-Control: no-cache,改完前端刷新即生效,不再出现「代码已修、浏览器还在跑旧 JS」的假象
  • 修复⑦:首次锁定偏 536m —— 活跃度判据原来看「地址周围 1KB 窗口的字节变化量」,而静态副本紧贴的锚点对象自身一直在刷新,副本跟着蹭到高分排第一。改为只看候选坐标自身 12 字节(+0x80 起)是否变化,pc>=1 才算活,活物按距锚点由近到远排序(按变化量排会锁到 138m 外的 NPC)。初始锁定偏差 536m → 1.4m
  • 修复⑧(架构升级):静态指针链取代内存海选 —— 海选启发式在「旧存档锚点 + 玩家站定 + 周围 NPC 活跃」等场景下仍会误锁或漏锁(站定被当死物、死亡复活后地址失效红点钉死)。本次从 Savage Wind 的 recomp 布局入手:guest main 模块固定映射在 host 0x7000000000(savagewind.log 实证),其 .data/.bss 跨重启不变。通过「存档锚点扫描 → 走动差分定位真身镜像群 → 静态区反向指针扫描」标定出 18 条静态链,启动即直读玩家坐标:免扫描、免仲裁、免走动确认(verified 启动即真);死亡复活/传送/过图由游戏自身更新指针、天然跟随;每 tick 36 次微量读取代 3GB 全内存扫描。链整体失效(加载画面)时保持坐标等自愈,从未生效则自动落回原海选管道兜底
  • 修复⑨:平台句柄并发竞态 —— 同一平台驱动实例会被定位主循环与平台探测/看门狗两个 goroutine 并发调用 Attach(),h/pid 无锁读写可能出现双重 CloseHandle、半开句柄(表现为偶发「句柄无效」定位掉线)。四个平台驱动全部加互斥锁:Attach/Handle/PID 持锁,内存枚举与存档探测改原子快照
  • 修复⑩:内存扫描数据竞争 —— 多 worker 并发扫描时在无锁状态下读共享命中列表、与持锁写入方构成数据竞争(Go race detector 必报)。改为原子计数判定命中上限熔断
  • 修复⑪:神庙入口钉死地图原点 —— 启动/重扫时角色已在神庙内(无合法大世界坐标作入口),旧逻辑把零值坐标 (0,0,0) 当门口锚点,红点钉死在地图原点的海里。现在无合法入口锚点时暂停发布并提示一次,出庙后自动恢复跟踪
  • CI:新增 go vet / go test / go test -race 三道门禁,编译错误与数据竞争不再等到发布后才暴露
  • 修复⑫:指针链版本指纹护栏 —— 18 条静态链按 BOTW 1.9.0 + Savage Wind 0.4.1-alpha.4 标定,游戏/recomp 更新后最危险的不是链失效(0 票自动落回海选)而是静默指错。新增三层护栏(宽松容错版):G1 guest main 必须仍映射在 0x7000000000(实测为 RW 数据映射, Protect=0x04);G2 链解出的对象指针必须落在 main 模块之外;G3 坐标合法 + 后随数据非全零(四元数/旋转矩阵命中即强通过,不命中交多链投票兜底)。任一不满足该链弃权,票不足自动落回海选管道,绝不静默给错坐标
  • GUI:新增 Savage Wind 平台项、存档路径设置,中英文案同步

实测数据

  • 锚点 120m 窗口 3.4~4.4 秒锁定;静止时坐标抖动 ±0.01m
  • 玩家走动后锁定地址同步位移 71.6m,确认锁到林克本体而非静态数据
  • 坐标精度:核心 (-967.2, 229.7, 1877.7) vs GUI (-967.3, 231.1, 1877.6),相差 1.4m(y 轴为副本基准差异)
  • 存档进度:shrine 4/136、tower 1/15、korok 1/900,与存档一致
  • 活跃度对照:存档快照 0/1024 字节变化,真身 400~600/1024
  • 指针链:走动 50.5m 全程跟随 18/18;死亡画面 6 链清零、复活 4 秒内 18/18 恢复并指向新对象;传送往返 1000m 两次,2~4 秒切换零掉锁

已知限制

  • 指针链为主路径时 verified 启动即真;仅在链条失效落回海选兜底时才需要玩家走动 3~5 步确认
  • 克洛格/神庙等收集进度仍以存档文件为准(捡到后需游戏内存档一次,约 20s 内地图自动更新);实时内存 flag 读取待后续版本
  • 18 条静态链按 BOTW 1.9.0 + Savage Wind 0.4.1-alpha.4 标定;Savage Wind 仍在 alpha,若 guest 布局变化链会自动失效并落回海选(功能不中断,退回旧行为)

基于 yalincc/BOTWmap 修改,地图数据与前端沿用上游。

Xnavi v3.2.2-savagewind.6 · Savage Wind 适配版

Choose a tag to compare

BOTWmap 地图工具 + xnavi 实时定位,适配 Savage Wind Recomp(原生重编译版,非模拟器)。

包含文件

文件 作用
Xnavi.exe GUI 壳(Wails + WebView2),平台下拉已含 Savage Wind
xnavi-core.exe 定位核心,GUI 点「开始定位」时自动拉起
app/ 地图页面与前端显示逻辑(约 12 MB;底图瓦片走线上,不占包体积),必须与两个 exe 同目录,不要删
ADAPT-SAVAGEWIND.md 适配说明:数据源 / 路径 / 加载方式 / 实测数据 / 限制
README.txt 快速上手

底图瓦片从 botw.yalin.site 在线加载,首次打开需联网。断网时底图空白,但标记点、存档进度、红点定位仍可用。

用法

  1. 解压到任意目录,Xnavi.exe、xnavi-core.exe、app/ 必须在同一目录(本包已自带地图,无需另下)
  2. 打开 Xnavi.exe,平台下拉选择 Savage Wind
  3. 点「开始定位」,红点即出现在游戏内当前位置
  4. 手机/平板与电脑同一 WiFi,打开 http://<电脑IP>:8766/botw/?follow=1 可当第二屏跟随

存档路径留空会自动取 <游戏目录>\Savage Wind\save,也可在设置页手动指定。

本次适配要点

  • 平台驱动 platform_savagewind.go:进程 savagewind(排除 Configuration 壳);guest RAM 为 0x7000000000+ 的 RW 私有区(实测 0x723FF00000 起 3121MB,小端、guest 偏移即进程偏移)
  • 存档:版本白名单补 0x4730(游戏 1.9.0),其余结构与 Switch 版一致;主档按 mtime 最新
  • 修复①:活跃度门禁 —— 游戏会把「上次存档的玩家位置」也映射进内存,结构与真身 Transform 完全同构且紧贴锚点,旧排序会锁到这份静态快照(红点冻结在读档点、永远 verified=false)。改为锁前对候选采样 1KB 窗口两次(间隔 150ms),按字节变化把活对象排到最前
  • 修复②:窗口内全静止不锁定 —— 存档 79 分钟未更新时锚点与真身相距 157m,120m 窗口内 186 组候选全部零变化。现在扫不到活对象就不硬锁,外层自动放大到 400m / 3000m,全静止则退避 6s 重试
  • 修复③:锁定看门狗 —— 世界仍在刷新(anyWorldTicking)但锁定记录完全静止超过 45s 时掉锁重扫;打开菜单/暂停时世界不刷新,保持锁定不误踢
  • 修复④:大师模式/新档锁不上 —— 两个缺陷叠加:①选档规则让「有神庙进度」的旧档优先于 mtime 最新的档,新开档 shrines=0 永远输给几十分钟前的旧档(锚点偏 274m);②候选按 Run 降序,静态快照 Run=33 占满全部 64 个采样名额,真身 Run=2~6 排不进去,于是每轮都判「全部静止」。现在主锚取 mtime 最新且 Playtime>0,活跃度采样改为按 Run 分层(每层 64、总 384),全静止时再用 0x100 窄窗口对剩余候选复采一轮
  • 修复⑤:换档后宝箱显示已开启 —— 三处存档同步都写成「非空才覆盖」,新档 0 个宝箱时直接跳过注入,上一档存在 localStorage 的宝箱集合就原样显示。改为空集也注入(整集替换);另加 PlayTime 指纹,时长回退超过 30 秒判定换档,自动清掉上一档的宝箱/装备/任务快照
  • 修复⑥:清空入口不存在 + 静态资源缓存 —— 「清空本地探索度」的 JS 一直在找 btnClearDone,但 index.html 里从来没有这个元素,导致换档残留无法手动清理(已补 🧹 图标)。静态资源统一加 Cache-Control: no-cache,改完前端刷新即生效,不再出现「代码已修、浏览器还在跑旧 JS」的假象
  • 修复⑦:首次锁定偏 536m —— 活跃度判据原来看「地址周围 1KB 窗口的字节变化量」,而静态副本紧贴的锚点对象自身一直在刷新,副本跟着蹭到高分排第一。改为只看候选坐标自身 12 字节(+0x80 起)是否变化,pc>=1 才算活,活物按距锚点由近到远排序(按变化量排会锁到 138m 外的 NPC)。初始锁定偏差 536m → 1.4m
  • 修复⑧(架构升级):静态指针链取代内存海选 —— 海选启发式在「旧存档锚点 + 玩家站定 + 周围 NPC 活跃」等场景下仍会误锁或漏锁(站定被当死物、死亡复活后地址失效红点钉死)。本次从 Savage Wind 的 recomp 布局入手:guest main 模块固定映射在 host 0x7000000000(savagewind.log 实证),其 .data/.bss 跨重启不变。通过「存档锚点扫描 → 走动差分定位真身镜像群 → 静态区反向指针扫描」标定出 18 条静态链,启动即直读玩家坐标:免扫描、免仲裁、免走动确认(verified 启动即真);死亡复活/传送/过图由游戏自身更新指针、天然跟随;每 tick 36 次微量读取代 3GB 全内存扫描。链整体失效(加载画面)时保持坐标等自愈,从未生效则自动落回原海选管道兜底
  • 修复⑨:平台句柄并发竞态 —— 同一平台驱动实例会被定位主循环与平台探测/看门狗两个 goroutine 并发调用 Attach(),h/pid 无锁读写可能出现双重 CloseHandle、半开句柄(表现为偶发「句柄无效」定位掉线)。四个平台驱动全部加互斥锁:Attach/Handle/PID 持锁,内存枚举与存档探测改原子快照
  • 修复⑩:内存扫描数据竞争 —— 多 worker 并发扫描时在无锁状态下读共享命中列表、与持锁写入方构成数据竞争(Go race detector 必报)。改为原子计数判定命中上限熔断
  • 修复⑪:神庙入口钉死地图原点 —— 启动/重扫时角色已在神庙内(无合法大世界坐标作入口),旧逻辑把零值坐标 (0,0,0) 当门口锚点,红点钉死在地图原点的海里。现在无合法入口锚点时暂停发布并提示一次,出庙后自动恢复跟踪
  • CI:新增 go vet / go test / go test -race 三道门禁,编译错误与数据竞争不再等到发布后才暴露
  • 修复⑫:指针链版本指纹护栏 —— 18 条静态链按 BOTW 1.9.0 + Savage Wind 0.4.1-alpha.4 标定,游戏/recomp 更新后最危险的不是链失效(0 票自动落回海选)而是静默指错。新增三层护栏(宽松容错版):G1 guest main 必须仍映射在 0x7000000000(实测为 RW 数据映射, Protect=0x04);G2 链解出的对象指针必须落在 main 模块之外;G3 坐标合法 + 后随数据非全零(四元数/旋转矩阵命中即强通过,不命中交多链投票兜底)。任一不满足该链弃权,票不足自动落回海选管道,绝不静默给错坐标
  • GUI:新增 Savage Wind 平台项、存档路径设置,中英文案同步

实测数据

  • 锚点 120m 窗口 3.4~4.4 秒锁定;静止时坐标抖动 ±0.01m
  • 玩家走动后锁定地址同步位移 71.6m,确认锁到林克本体而非静态数据
  • 坐标精度:核心 (-967.2, 229.7, 1877.7) vs GUI (-967.3, 231.1, 1877.6),相差 1.4m(y 轴为副本基准差异)
  • 存档进度:shrine 4/136、tower 1/15、korok 1/900,与存档一致
  • 活跃度对照:存档快照 0/1024 字节变化,真身 400~600/1024
  • 指针链:走动 50.5m 全程跟随 18/18;死亡画面 6 链清零、复活 4 秒内 18/18 恢复并指向新对象;传送往返 1000m 两次,2~4 秒切换零掉锁

已知限制

  • 指针链为主路径时 verified 启动即真;仅在链条失效落回海选兜底时才需要玩家走动 3~5 步确认
  • 克洛格/神庙等收集进度仍以存档文件为准(捡到后需游戏内存档一次,约 20s 内地图自动更新);实时内存 flag 读取待后续版本
  • 18 条静态链按 BOTW 1.9.0 + Savage Wind 0.4.1-alpha.4 标定;Savage Wind 仍在 alpha,若 guest 布局变化链会自动失效并落回海选(功能不中断,退回旧行为)

基于 yalincc/BOTWmap 修改,地图数据与前端沿用上游。

Xnavi v3.2.2-savagewind.5 · Savage Wind 适配版

Choose a tag to compare

BOTWmap 地图工具 + xnavi 实时定位,适配 Savage Wind Recomp(原生重编译版,非模拟器)。

包含文件

文件 作用
Xnavi.exe GUI 壳(Wails + WebView2),平台下拉已含 Savage Wind
xnavi-core.exe 定位核心,GUI 点「开始定位」时自动拉起
app/ 地图页面与前端显示逻辑(约 12 MB;底图瓦片走线上,不占包体积),必须与两个 exe 同目录,不要删
ADAPT-SAVAGEWIND.md 适配说明:数据源 / 路径 / 加载方式 / 实测数据 / 限制
README.txt 快速上手

底图瓦片从 botw.yalin.site 在线加载,首次打开需联网。断网时底图空白,但标记点、存档进度、红点定位仍可用。

用法

  1. 解压到任意目录,Xnavi.exe、xnavi-core.exe、app/ 必须在同一目录(本包已自带地图,无需另下)
  2. 打开 Xnavi.exe,平台下拉选择 Savage Wind
  3. 点「开始定位」,红点即出现在游戏内当前位置
  4. 手机/平板与电脑同一 WiFi,打开 http://<电脑IP>:8766/botw/?follow=1 可当第二屏跟随

存档路径留空会自动取 <游戏目录>\Savage Wind\save,也可在设置页手动指定。

本次适配要点

  • 平台驱动 platform_savagewind.go:进程 savagewind(排除 Configuration 壳);guest RAM 为 0x7000000000+ 的 RW 私有区(实测 0x723FF00000 起 3121MB,小端、guest 偏移即进程偏移)
  • 存档:版本白名单补 0x4730(游戏 1.9.0),其余结构与 Switch 版一致;主档按 mtime 最新
  • 修复①:活跃度门禁 —— 游戏会把「上次存档的玩家位置」也映射进内存,结构与真身 Transform 完全同构且紧贴锚点,旧排序会锁到这份静态快照(红点冻结在读档点、永远 verified=false)。改为锁前对候选采样 1KB 窗口两次(间隔 150ms),按字节变化把活对象排到最前
  • 修复②:窗口内全静止不锁定 —— 存档 79 分钟未更新时锚点与真身相距 157m,120m 窗口内 186 组候选全部零变化。现在扫不到活对象就不硬锁,外层自动放大到 400m / 3000m,全静止则退避 6s 重试
  • 修复③:锁定看门狗 —— 世界仍在刷新(anyWorldTicking)但锁定记录完全静止超过 45s 时掉锁重扫;打开菜单/暂停时世界不刷新,保持锁定不误踢
  • 修复④:大师模式/新档锁不上 —— 两个缺陷叠加:①选档规则让「有神庙进度」的旧档优先于 mtime 最新的档,新开档 shrines=0 永远输给几十分钟前的旧档(锚点偏 274m);②候选按 Run 降序,静态快照 Run=33 占满全部 64 个采样名额,真身 Run=2~6 排不进去,于是每轮都判「全部静止」。现在主锚取 mtime 最新且 Playtime>0,活跃度采样改为按 Run 分层(每层 64、总 384),全静止时再用 0x100 窄窗口对剩余候选复采一轮
  • 修复⑤:换档后宝箱显示已开启 —— 三处存档同步都写成「非空才覆盖」,新档 0 个宝箱时直接跳过注入,上一档存在 localStorage 的宝箱集合就原样显示。改为空集也注入(整集替换);另加 PlayTime 指纹,时长回退超过 30 秒判定换档,自动清掉上一档的宝箱/装备/任务快照
  • 修复⑥:清空入口不存在 + 静态资源缓存 —— 「清空本地探索度」的 JS 一直在找 btnClearDone,但 index.html 里从来没有这个元素,导致换档残留无法手动清理(已补 🧹 图标)。静态资源统一加 Cache-Control: no-cache,改完前端刷新即生效,不再出现「代码已修、浏览器还在跑旧 JS」的假象
  • 修复⑦:首次锁定偏 536m —— 活跃度判据原来看「地址周围 1KB 窗口的字节变化量」,而静态副本紧贴的锚点对象自身一直在刷新,副本跟着蹭到高分排第一。改为只看候选坐标自身 12 字节(+0x80 起)是否变化,pc>=1 才算活,活物按距锚点由近到远排序(按变化量排会锁到 138m 外的 NPC)。初始锁定偏差 536m → 1.4m
  • 修复⑧(架构升级):静态指针链取代内存海选 —— 海选启发式在「旧存档锚点 + 玩家站定 + 周围 NPC 活跃」等场景下仍会误锁或漏锁(站定被当死物、死亡复活后地址失效红点钉死)。本次从 Savage Wind 的 recomp 布局入手:guest main 模块固定映射在 host 0x7000000000(savagewind.log 实证),其 .data/.bss 跨重启不变。通过「存档锚点扫描 → 走动差分定位真身镜像群 → 静态区反向指针扫描」标定出 18 条静态链,启动即直读玩家坐标:免扫描、免仲裁、免走动确认(verified 启动即真);死亡复活/传送/过图由游戏自身更新指针、天然跟随;每 tick 36 次微量读取代 3GB 全内存扫描。链整体失效(加载画面)时保持坐标等自愈,从未生效则自动落回原海选管道兜底
  • 修复⑨:平台句柄并发竞态 —— 同一平台驱动实例会被定位主循环与平台探测/看门狗两个 goroutine 并发调用 Attach(),h/pid 无锁读写可能出现双重 CloseHandle、半开句柄(表现为偶发「句柄无效」定位掉线)。四个平台驱动全部加互斥锁:Attach/Handle/PID 持锁,内存枚举与存档探测改原子快照
  • 修复⑩:内存扫描数据竞争 —— 多 worker 并发扫描时在无锁状态下读共享命中列表、与持锁写入方构成数据竞争(Go race detector 必报)。改为原子计数判定命中上限熔断
  • 修复⑪:神庙入口钉死地图原点 —— 启动/重扫时角色已在神庙内(无合法大世界坐标作入口),旧逻辑把零值坐标 (0,0,0) 当门口锚点,红点钉死在地图原点的海里。现在无合法入口锚点时暂停发布并提示一次,出庙后自动恢复跟踪
  • CI:新增 go vet / go test / go test -race 三道门禁,编译错误与数据竞争不再等到发布后才暴露
  • GUI:新增 Savage Wind 平台项、存档路径设置,中英文案同步

实测数据

  • 锚点 120m 窗口 3.4~4.4 秒锁定;静止时坐标抖动 ±0.01m
  • 玩家走动后锁定地址同步位移 71.6m,确认锁到林克本体而非静态数据
  • 坐标精度:核心 (-967.2, 229.7, 1877.7) vs GUI (-967.3, 231.1, 1877.6),相差 1.4m(y 轴为副本基准差异)
  • 存档进度:shrine 4/136、tower 1/15、korok 1/900,与存档一致
  • 活跃度对照:存档快照 0/1024 字节变化,真身 400~600/1024
  • 指针链:走动 50.5m 全程跟随 18/18;死亡画面 6 链清零、复活 4 秒内 18/18 恢复并指向新对象;传送往返 1000m 两次,2~4 秒切换零掉锁

已知限制

  • 指针链为主路径时 verified 启动即真;仅在链条失效落回海选兜底时才需要玩家走动 3~5 步确认
  • 克洛格/神庙等收集进度仍以存档文件为准(捡到后需游戏内存档一次,约 20s 内地图自动更新);实时内存 flag 读取待后续版本
  • 18 条静态链按 BOTW 1.9.0 + Savage Wind 0.4.1-alpha.4 标定;Savage Wind 仍在 alpha,若 guest 布局变化链会自动失效并落回海选(功能不中断,退回旧行为)

基于 yalincc/BOTWmap 修改,地图数据与前端沿用上游。

Xnavi v3.2.2-savagewind.4 · Savage Wind 适配版

Choose a tag to compare

BOTWmap 地图工具 + xnavi 实时定位,适配 Savage Wind Recomp(原生重编译版,非模拟器)。

包含文件

文件 作用
Xnavi.exe GUI 壳(Wails + WebView2),平台下拉已含 Savage Wind
xnavi-core.exe 定位核心,GUI 点「开始定位」时自动拉起
app/ 地图页面与前端显示逻辑(约 12 MB;底图瓦片走线上,不占包体积),必须与两个 exe 同目录,不要删
ADAPT-SAVAGEWIND.md 适配说明:数据源 / 路径 / 加载方式 / 实测数据 / 限制
README.txt 快速上手

底图瓦片从 botw.yalin.site 在线加载,首次打开需联网。断网时底图空白,但标记点、存档进度、红点定位仍可用。

用法

  1. 解压到任意目录,Xnavi.exe、xnavi-core.exe、app/ 必须在同一目录(本包已自带地图,无需另下)
  2. 打开 Xnavi.exe,平台下拉选择 Savage Wind
  3. 点「开始定位」,红点即出现在游戏内当前位置
  4. 手机/平板与电脑同一 WiFi,打开 http://<电脑IP>:8766/botw/?follow=1 可当第二屏跟随

存档路径留空会自动取 <游戏目录>\Savage Wind\save,也可在设置页手动指定。

本次适配要点

  • 平台驱动 platform_savagewind.go:进程 savagewind(排除 Configuration 壳);guest RAM 为 0x7000000000+ 的 RW 私有区(实测 0x723FF00000 起 3121MB,小端、guest 偏移即进程偏移)
  • 存档:版本白名单补 0x4730(游戏 1.9.0),其余结构与 Switch 版一致;主档按 mtime 最新
  • 修复①:活跃度门禁 —— 游戏会把「上次存档的玩家位置」也映射进内存,结构与真身 Transform 完全同构且紧贴锚点,旧排序会锁到这份静态快照(红点冻结在读档点、永远 verified=false)。改为锁前对候选采样 1KB 窗口两次(间隔 150ms),按字节变化把活对象排到最前
  • 修复②:窗口内全静止不锁定 —— 存档 79 分钟未更新时锚点与真身相距 157m,120m 窗口内 186 组候选全部零变化。现在扫不到活对象就不硬锁,外层自动放大到 400m / 3000m,全静止则退避 6s 重试
  • 修复③:锁定看门狗 —— 世界仍在刷新(anyWorldTicking)但锁定记录完全静止超过 45s 时掉锁重扫;打开菜单/暂停时世界不刷新,保持锁定不误踢
  • 修复④:大师模式/新档锁不上 —— 两个缺陷叠加:①选档规则让「有神庙进度」的旧档优先于 mtime 最新的档,新开档 shrines=0 永远输给几十分钟前的旧档(锚点偏 274m);②候选按 Run 降序,静态快照 Run=33 占满全部 64 个采样名额,真身 Run=2~6 排不进去,于是每轮都判「全部静止」。现在主锚取 mtime 最新且 Playtime>0,活跃度采样改为按 Run 分层(每层 64、总 384),全静止时再用 0x100 窄窗口对剩余候选复采一轮
  • 修复⑤:换档后宝箱显示已开启 —— 三处存档同步都写成「非空才覆盖」,新档 0 个宝箱时直接跳过注入,上一档存在 localStorage 的宝箱集合就原样显示。改为空集也注入(整集替换);另加 PlayTime 指纹,时长回退超过 30 秒判定换档,自动清掉上一档的宝箱/装备/任务快照
  • 修复⑥:清空入口不存在 + 静态资源缓存 —— 「清空本地探索度」的 JS 一直在找 btnClearDone,但 index.html 里从来没有这个元素,导致换档残留无法手动清理(已补 🧹 图标)。静态资源统一加 Cache-Control: no-cache,改完前端刷新即生效,不再出现「代码已修、浏览器还在跑旧 JS」的假象
  • 修复⑦:首次锁定偏 536m —— 活跃度判据原来看「地址周围 1KB 窗口的字节变化量」,而静态副本紧贴的锚点对象自身一直在刷新,副本跟着蹭到高分排第一。改为只看候选坐标自身 12 字节(+0x80 起)是否变化,pc>=1 才算活,活物按距锚点由近到远排序(按变化量排会锁到 138m 外的 NPC)。初始锁定偏差 536m → 1.4m
  • 修复⑧(架构升级):静态指针链取代内存海选 —— 海选启发式在「旧存档锚点 + 玩家站定 + 周围 NPC 活跃」等场景下仍会误锁或漏锁(站定被当死物、死亡复活后地址失效红点钉死)。本次从 Savage Wind 的 recomp 布局入手:guest main 模块固定映射在 host 0x7000000000(savagewind.log 实证),其 .data/.bss 跨重启不变。通过「存档锚点扫描 → 走动差分定位真身镜像群 → 静态区反向指针扫描」标定出 18 条静态链,启动即直读玩家坐标:免扫描、免仲裁、免走动确认(verified 启动即真);死亡复活/传送/过图由游戏自身更新指针、天然跟随;每 tick 36 次微量读取代 3GB 全内存扫描。链整体失效(加载画面)时保持坐标等自愈,从未生效则自动落回原海选管道兜底
  • GUI:新增 Savage Wind 平台项、存档路径设置,中英文案同步

实测数据

  • 锚点 120m 窗口 3.4~4.4 秒锁定;静止时坐标抖动 ±0.01m
  • 玩家走动后锁定地址同步位移 71.6m,确认锁到林克本体而非静态数据
  • 坐标精度:核心 (-967.2, 229.7, 1877.7) vs GUI (-967.3, 231.1, 1877.6),相差 1.4m(y 轴为副本基准差异)
  • 存档进度:shrine 4/136、tower 1/15、korok 1/900,与存档一致
  • 活跃度对照:存档快照 0/1024 字节变化,真身 400~600/1024
  • 指针链:走动 50.5m 全程跟随 18/18;死亡画面 6 链清零、复活 4 秒内 18/18 恢复并指向新对象;传送往返 1000m 两次,2~4 秒切换零掉锁

已知限制

  • 指针链为主路径时 verified 启动即真;仅在链条失效落回海选兜底时才需要玩家走动 3~5 步确认
  • 克洛格/神庙等收集进度仍以存档文件为准(捡到后需游戏内存档一次,约 20s 内地图自动更新);实时内存 flag 读取待后续版本
  • 18 条静态链按 BOTW 1.9.0 + Savage Wind 0.4.1-alpha.4 标定;Savage Wind 仍在 alpha,若 guest 布局变化链会自动失效并落回海选(功能不中断,退回旧行为)

基于 yalincc/BOTWmap 修改,地图数据与前端沿用上游。

Xnavi v3.2.2-savagewind.3 · Savage Wind 适配版

Choose a tag to compare

BOTWmap 地图工具 + xnavi 实时定位,适配 Savage Wind Recomp(原生重编译版,非模拟器)。

包含文件

文件 作用
Xnavi.exe GUI 壳(Wails + WebView2),平台下拉已含 Savage Wind
xnavi-core.exe 定位核心,GUI 点「开始定位」时自动拉起
app/ 地图页面与前端显示逻辑(约 12 MB;底图瓦片走线上,不占包体积),必须与两个 exe 同目录,不要删
ADAPT-SAVAGEWIND.md 适配说明:数据源 / 路径 / 加载方式 / 实测数据 / 限制
README.txt 快速上手

底图瓦片从 botw.yalin.site 在线加载,首次打开需联网。断网时底图空白,但标记点、存档进度、红点定位仍可用。

用法

  1. 解压到任意目录,Xnavi.exe、xnavi-core.exe、app/ 必须在同一目录(本包已自带地图,无需另下)
  2. 打开 Xnavi.exe,平台下拉选择 Savage Wind
  3. 点「开始定位」,红点即出现在游戏内当前位置
  4. 手机/平板与电脑同一 WiFi,打开 http://<电脑IP>:8766/botw/?follow=1 可当第二屏跟随

存档路径留空会自动取 <游戏目录>\Savage Wind\save,也可在设置页手动指定。

本次适配要点

  • 平台驱动 platform_savagewind.go:进程 savagewind(排除 Configuration 壳);guest RAM 为 0x7000000000+ 的 RW 私有区(实测 0x723FF00000 起 3121MB,小端、guest 偏移即进程偏移)
  • 存档:版本白名单补 0x4730(游戏 1.9.0),其余结构与 Switch 版一致;主档按 mtime 最新
  • 修复①:活跃度门禁 —— 游戏会把「上次存档的玩家位置」也映射进内存,结构与真身 Transform 完全同构且紧贴锚点,旧排序会锁到这份静态快照(红点冻结在读档点、永远 verified=false)。改为锁前对候选采样 1KB 窗口两次(间隔 150ms),按字节变化把活对象排到最前
  • 修复②:窗口内全静止不锁定 —— 存档 79 分钟未更新时锚点与真身相距 157m,120m 窗口内 186 组候选全部零变化。现在扫不到活对象就不硬锁,外层自动放大到 400m / 3000m,全静止则退避 6s 重试
  • 修复③:锁定看门狗 —— 世界仍在刷新(anyWorldTicking)但锁定记录完全静止超过 45s 时掉锁重扫;打开菜单/暂停时世界不刷新,保持锁定不误踢
  • 修复④:大师模式/新档锁不上 —— 两个缺陷叠加:①选档规则让「有神庙进度」的旧档优先于 mtime 最新的档,新开档 shrines=0 永远输给几十分钟前的旧档(锚点偏 274m);②候选按 Run 降序,静态快照 Run=33 占满全部 64 个采样名额,真身 Run=2~6 排不进去,于是每轮都判「全部静止」。现在主锚取 mtime 最新且 Playtime>0,活跃度采样改为按 Run 分层(每层 64、总 384),全静止时再用 0x100 窄窗口对剩余候选复采一轮
  • 修复⑤:换档后宝箱显示已开启 —— 三处存档同步都写成「非空才覆盖」,新档 0 个宝箱时直接跳过注入,上一档存在 localStorage 的宝箱集合就原样显示。改为空集也注入(整集替换);另加 PlayTime 指纹,时长回退超过 30 秒判定换档,自动清掉上一档的宝箱/装备/任务快照
  • 修复⑥:清空入口不存在 + 静态资源缓存 —— 「清空本地探索度」的 JS 一直在找 btnClearDone,但 index.html 里从来没有这个元素,导致换档残留无法手动清理(已补 🧹 图标)。静态资源统一加 Cache-Control: no-cache,改完前端刷新即生效,不再出现「代码已修、浏览器还在跑旧 JS」的假象
  • 修复⑦:首次锁定偏 536m —— 活跃度判据原来看「地址周围 1KB 窗口的字节变化量」,而静态副本紧贴的锚点对象自身一直在刷新,副本跟着蹭到高分排第一。改为只看候选坐标自身 12 字节(+0x80 起)是否变化,pc>=1 才算活,活物按距锚点由近到远排序(按变化量排会锁到 138m 外的 NPC)。初始锁定偏差 536m → 1.4m
  • GUI:新增 Savage Wind 平台项、存档路径设置,中英文案同步

实测数据

  • 锚点 120m 窗口 3.4~4.4 秒锁定;静止时坐标抖动 ±0.01m
  • 玩家走动后锁定地址同步位移 71.6m,确认锁到林克本体而非静态数据
  • 坐标精度:核心 (-967.2, 229.7, 1877.7) vs GUI (-967.3, 231.1, 1877.6),相差 1.4m(y 轴为副本基准差异)
  • 存档进度:shrine 4/136、tower 1/15、korok 1/900,与存档一致
  • 活跃度对照:存档快照 0/1024 字节变化,真身 400~600/1024

已知限制

  • verified 需玩家走动 3~5 步后才置真(上游 Ryujinx/Eden 同款设计);站着不动时位置正确但状态显示未确认
  • 仅在 Windows + Savage Wind 0.4.1-alpha.4 / 游戏 1.9.0 实测;Savage Wind 仍在 alpha,若 guest 映射方式变化需重新核对 Blocks() 筛选条件
  • 首次全量扫描约 3.4~4.4s,之后只读单个地址,开销可忽略

基于 yalincc/BOTWmap 修改,地图数据与前端沿用上游。