Skip to content

Fix/64bit support#240

Open
MisakaCirno wants to merge 4 commits intoxivapi:masterfrom
MisakaCirno:fix/64bit-support
Open

Fix/64bit support#240
MisakaCirno wants to merge 4 commits intoxivapi:masterfrom
MisakaCirno:fix/64bit-support

Conversation

@MisakaCirno
Copy link
Copy Markdown

[中文] PR 说明

背景与目标

本 PR 主要修复新版地图(如 x6rb / x6rc_2)在加载与导出过程中的一组连锁问题,包括:

  • Territory 打开失败(ArgumentOutOfRangeException / InvalidDataException
  • 读取 SqPack 文件头异常(header length 为负数或 0)
  • 导出阶段出现 OutOfMemoryException / ZlibException
  • 部分 LGB/SGB 模型路径异常导致资源漏导出
  • 纹理导出在 BC7/BC5 场景下不稳定

根因概述

  1. Index / Index2 偏移量与 dat 选择解析不完整
    旧逻辑在偏移计算和 source 选择上对新版数据不够稳健,导致读取到错误 dat 偏移。
  2. Territory BasePath 推断不够健壮
    Bg 字段在不同地图结构下存在差异,导致拼接路径失配。
  3. SqPack 文件头与 block 解压缺少边界保护
    对异常长度、异常尺寸、压缩流类型切换(zlib/deflate)保护不足,易触发 OOM 或异常风暴。
  4. LGB 模型路径字符串未规范化
    某些记录包含前缀噪声/不规范分隔符,触发路径解析异常或查找失败。
  5. 导出纹理时缺少格式与内存边界控制
    高分辨率/压缩纹理在解码导出时容易造成峰值内存过高或不支持格式报错。

主要改动

1) Index 与 Pack 读取链路修正

  • IIndexFile.Offset 改为 long,统一支持更大偏移。
  • 修正 IndexFile / Index2File 对 dat 标记与实际偏移的解析。
  • Pack.TryGetFile 优先尝试 Index2Source(若可用),回退到 IndexSource
  • 相关文件:
    SaintCoinach/IO/IIndexFile.cs
    SaintCoinach/IO/IndexFile.cs
    SaintCoinach/IO/Index2File.cs
    SaintCoinach/IO/Pack.cs

2) Territory 路径解析增强

  • 新增候选路径推断与有效性验证(terrain.tera / bg.lgb / planmap.lgb / planevent.lgb)。
  • 在无法直接验证时保留可追踪日志并使用可回退策略。
  • 相关文件:
    SaintCoinach/Graphics/Territory.cs

3) SqPack 读取与解压健壮性增强

  • FileCommonHeader 增加 header 长度合法性检查,阻止负值/越界长度。
  • File.ReadBlock 增加 block 大小、解压后尺寸、一致性校验。
  • Inflate 增加 zlib header 判定,按数据特征选择 zlib/deflate,减少错误解压路径。
  • Directory / Index2SourceTryGetFile 中对损坏文件做可诊断日志并安全跳过。
  • ByteArrayExtensions 增加结构读取越界保护与字符串读取边界修正。
  • 相关文件:
    SaintCoinach/IO/FileCommonHeader.cs
    SaintCoinach/IO/File.cs
    SaintCoinach/IO/Directory.cs
    SaintCoinach/IO/Index2Source.cs
    SaintCoinach/ByteArrayExtensions.cs

4) LGB 模型路径规范化

  • 统一路径分隔符,提取有效根路径(bg/, common/, chara/ 等),裁剪到合法扩展名。
  • 避免异常字符串导致的 startIndex 问题与模型漏加载。
  • 相关文件:
    SaintCoinach/Graphics/Lgb/LgbModelEntry.cs

5) 导出流程与纹理处理稳定性

  • 导出时增加分批 flush,降低 OBJ 大量字符串累计导致的内存压力。
  • 纹理导出支持 BC5/BC7 的 DDS 输出(BC7 增加 DX10 header)。
  • 增加图像尺寸与解码字节上限保护,避免异常数据触发 OOM。
  • 纹理导出失败时按单资源记录并跳过,不中断整图导出。
  • 相关文件:
    Godbert/ViewModels/TerritoryViewModel.cs
    SaintCoinach/Imaging/ImageConverter.cs

结果与影响

  • 新地图 territory 的加载成功率显著提升(尤其是 x6rb 类路径)。
  • 导出流程从“遇错中断”改为“可诊断 + 尽量继续导出”,减少整批失败。
  • 对损坏/异常资源引入更明确的错误信息,便于后续定位。
  • 兼容性上主要是增强与边界保护,不改变正常资源的既有解析结果。

测试与验证

  • 手动验证 territory 打开、模型加载、纹理导出与整图导出流程。
  • 针对典型报错路径(header 长度异常、zlib/deflate、BC7 纹理)进行回归验证。
  • 本 PR 不包含日志文件,仅包含代码变更。

AI 生成与人工复核声明

本 PR 的代码由 OpenAI Codex 协助生成;提交者已进行逐项人工审查、手动调试与结果验证,并按功能相关性拆分为独立 commits。


[English] PR Description

Background and Goal

This PR fixes a chain of issues encountered when loading/exporting newer territories (e.g. x6rb / x6rc_2), including:

  • territory open failures (ArgumentOutOfRangeException / InvalidDataException)
  • invalid SqPack file header parsing (negative/zero header length)
  • OutOfMemoryException / ZlibException during export
  • missing exports due to malformed LGB/SGB model paths
  • unstable BC5/BC7 texture export behavior

Root Cause Summary

  1. Index/Index2 offset + dat selection handling was incomplete for newer data layout.
  2. Territory base path inference was fragile for variant Bg strings.
  3. SqPack header/block parsing lacked strict bounds checks, enabling bad lengths and decompression blowups.
  4. LGB model path strings were not normalized, causing invalid indexing/path lookup failures.
  5. Texture export lacked enough format/memory safeguards for large compressed textures.

Key Changes

1) Index and Pack read-path fixes

  • IIndexFile.Offset is now long.
  • Corrected dat flag and offset decoding in IndexFile / Index2File.
  • Pack.TryGetFile now prefers Index2Source when available, then falls back to IndexSource.
  • Files:
    SaintCoinach/IO/IIndexFile.cs
    SaintCoinach/IO/IndexFile.cs
    SaintCoinach/IO/Index2File.cs
    SaintCoinach/IO/Pack.cs

2) Stronger Territory base-path resolution

  • Added candidate generation + validation against known assets (terrain.tera, bg.lgb, planmap.lgb, planevent.lgb).
  • Added traceable fallback behavior when no candidate can be verified.
  • File:
    SaintCoinach/Graphics/Territory.cs

3) Hardened SqPack header/block parsing

  • Added strict header-length validation in FileCommonHeader.
  • Added block size / inflated size / consistency checks in File.ReadBlock.
  • Added zlib-header detection and zlib/deflate fallback strategy in Inflate.
  • Added recoverable diagnostics in Directory / Index2Source for malformed files.
  • Added out-of-range structure/string read guards in ByteArrayExtensions.
  • Files:
    SaintCoinach/IO/FileCommonHeader.cs
    SaintCoinach/IO/File.cs
    SaintCoinach/IO/Directory.cs
    SaintCoinach/IO/Index2Source.cs
    SaintCoinach/ByteArrayExtensions.cs

4) LGB model path normalization

  • Normalized separators and extracted valid content roots (bg/, common/, chara/, etc.).
  • Trimmed paths to expected extensions to prevent malformed string/index errors.
  • File:
    SaintCoinach/Graphics/Lgb/LgbModelEntry.cs

5) Export stability + texture handling improvements

  • Added periodic output flushing to reduce peak memory pressure during OBJ export.
  • Added DDS export support for BC5/BC7 (DX10 header for BC7).
  • Added image dimension and decoded-size guards to prevent OOM on malformed/extreme inputs.
  • Texture-level failures are logged and skipped without aborting the full territory export.
  • Files:
    Godbert/ViewModels/TerritoryViewModel.cs
    SaintCoinach/Imaging/ImageConverter.cs

Impact

  • Significantly improves territory load success for newer map content.
  • Export path is now more fault-tolerant: better diagnostics and fewer full-run aborts.
  • Better protection against malformed/corrupt resource data.
  • Changes are primarily defensive and compatibility-oriented for valid assets.

Validation

  • Manual verification of territory opening, model loading, texture export, and full export flow.
  • Regression checks around previously failing cases (invalid header lengths, zlib/deflate cases, BC7 textures).
  • No log files are included in this PR; code changes only.

AI + Human Review Disclosure

The implementation in this PR was assisted/generated by OpenAI Codex.
The contributor performed manual review, debugging, and validation before preparing the final commits.

AI-generated code by Codex.
AI-generated code by Codex.
AI-generated code by Codex.
AI-generated code by Codex.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant