# ============================================================
#  CialloHook 配置文件 (UTF-8 编码)
#  支持: winmm.dll / version.dll 代理加载 / CialloLauncher.exe 辅助加载
# ============================================================

# ======================== 字体设置 ========================
[CialloHook]
# 字符集编码: 0x86(简中), 0x88(繁中), 0x80(日文), 0x00(默认)
Charset = 0x80

# 字体名称或路径（留空则不 Hook 字体）
#   系统字体: SimHei, Microsoft YaHei, SimSun, NSimSun, KaiTi, FangSong
#   外部字体: C:\Fonts\xxx.ttf 或 .\fonts\xxx.otf
#   仅填文件名时优先在目录找，找不到再去自定义封包找
#   识别后缀: .ttf .otf .ttc .otc .fon .fnt
#   文件型字体会自动枚举内部真实 face name；若枚举出多个 face，默认取序列 0 的 face name 并写入日志
Font = NSimSun

# 外部字体的实际名称（可选，作为手动覆盖项，优先级高于自动识别结果）
#FontName = simsun_cnjp.ttf

# 命中这些原始字体名时，不进行字体 Hook（支持多条，大小写不敏感）
# 优先级高于下面的重定向规则；编号从 0 开始连续递增
SkipFontCount = 0
# SkipFontName_0 = MS Gothic
# SkipFontName_1 = Arial

# 命中这些原始字体名时，改 Hook 到指定目标字体（支持多条）
# 目标字体写法与上面的 Font 一致，可写系统字体名或字体文件路径
# 若目标是字体文件且内部名称与文件名不同，可额外写 RedirectToFontName_i
# 若目标字体文件枚举出多个 face，默认取第 0 个并写入日志
RedirectFontCount = 0
# RedirectFromFont_0 = MS UI Gothic
# RedirectToFont_0 = Microsoft YaHei
# RedirectFromFont_1 = Arial
# RedirectToFont_1 = .\fonts\SourceHanSansCN-Regular.otf
# RedirectToFontName_1 = Source Han Sans CN Regular

# EnableCharsetSpoof: 条件伪装字符集；仅在原始字符集等于 SpoofFromCharset 时替换为 SpoofToCharset
EnableCharsetSpoof = true
SpoofFromCharset = 0x80
SpoofToCharset = 0x01

# 可选：日繁映射，启用后会读取映射 json，在字形查询、字宽计算和实际绘制阶段把右值字符映射到左值字形
# 例如 json 中 "头": "頭" 时，字体请求 "頭" 的字形时会改取 "头" 的字形
# 兼容 uif 的 uif_config.json 映射格式
EnableCnJpMap = true
CnJpMapVerboseLog = false
CnJpMapJson = subs_cn_jp.json
# 常见值: 932(日文), 936(简中), 950(繁中), 65001(UTF-8)
CnJpMapReadEncoding = 932

# 字体选择解锁开关：true=枚举时不过滤字体/字符集（可看到更多字体），false=按上面的字体与字符集约束
# 作用于全部字体枚举 API（EnumFonts / EnumFontFamilies / EnumFontFamiliesEx，含 A/W）
# 仅在对应枚举 Hook 开启时生效（受 HookGroupEnumerate 与单 API 开关共同控制）
UnlockFontSelection = false

# ---------- 字体尺寸调整 ----------
# FontHeight: 字体高度（负数: 字符高度，如 -16 表示 16 点字体；正数: 单元高度；0=不固定）
# FontWidth:  字体宽度（0=不固定，沿用原始宽度/由引擎决定；>0=强制固定宽度）
#             常用建议：先只改 FontHeight，再按需微调 FontWidth；过大可能导致字间拥挤
# FontScale:  字体大小缩放倍数（1.0=不缩放；FontHeight不为0时无效）
# FontSpacingScale: 字符间距缩放倍数（1.0=不调整；仅影响字符间距，不拉伸字形宽度）
# FontWeight: 粗细（0=不改, 400=正常, 700=粗体）
# GlyphAspectRatio: 字形宽高比缩放（在以上全部调整后应用；1.0=不调整，>1更宽，<1更窄）
FontHeight = 0
FontWidth = 0
FontScale = 1.0
FontSpacingScale = 1.0
FontWeight = 0
GlyphAspectRatio = 1.0
# ---------- 字形调整（可能不生效） ----------
# GlyphOffsetX: 字形左右平移（左负右正，单位：像素）
# GlyphOffsetY: 字形上下平移（上正下负，单位：像素）
# MetricsOffsetLeft: 度量左侧补偿（正数=增大左留白，负数=减小左留白）
# MetricsOffsetRight: 度量右侧补偿（正数=增大右留白，负数=减小右留白）
# MetricsOffsetTop: 度量顶部补偿（正数=给上方更多空间，负数=减少上方空间）
# MetricsOffsetBottom: 度量底部补偿（正数=给下方更多空间，负数=减少下方空间）
GlyphOffsetX = 0
GlyphOffsetY = 0
MetricsOffsetLeft = 0
MetricsOffsetRight = 0
MetricsOffsetTop = 0
MetricsOffsetBottom = 0

# ---------- API Hook 分组开关 ----------
# HookGroupCreate: 字体创建链路（CreateFont / CreateFontIndirect / CreateFontIndirectEx）
# HookGroupEnumerate: 字体枚举链路（EnumFonts / EnumFontFamilies / EnumFontFamiliesEx）
# HookGroupMetrics: 字体度量链路（GetTextMetrics / GetCharWidth* / GetFontUnicodeRanges 等）
# HookGroupResource: 字体资源链路（Add/RemoveFontResource* / Add/RemoveFontMemResourceEx）
# HookGroupModern: 现代字体链路（DWrite + GDI+ 相关创建/测量 API）
# HookGroupLateLoad: 延迟加载补钩链路（LoadLibraryW / LoadLibraryExW 后自动尝试补挂 dwrite/gdiplus）
HookGroupCreate = true
HookGroupEnumerate = true
HookGroupMetrics = true
HookGroupResource = true
HookGroupModern = true
HookGroupLateLoad = true
# ---------- 单 API 覆盖（按需添加，不写则跟随分组） ----------
HookCreateFontA = true
HookCreateFontIndirectA = true
HookCreateFontW = true
HookCreateFontIndirectW = true
HookEnumFontFamiliesExA = true
HookEnumFontFamiliesExW = true
HookDWriteCreateFactory = true
HookGdipCreateFontFamilyFromName = true
HookGdipCreateFontFromLogfontW = true
HookGdipMeasureDriverString = true

# ======================== 代码页转换 ========================
[CodePage]
# 将源代码页转换为目标代码页（Hook MultiByteToWideChar / WideCharToMultiByte）
# 适用于需要修改 CodePage 而非 Charset 的游戏引擎
Enable = false
FromCodePage = 932
ToCodePage = 936
HookMultiByteToWideChar = true
HookWideCharToMultiByte = true

# ======================== 文字替换 ========================
[TextReplace]
# 检测并替换显示的文字，支持通配符 * 和 ?
# ReadEncoding: 读取游戏 ANSI 文本时使用的编码
# WriteEncoding: 写回替换结果时使用的编码
# EnableVerboseLog: 输出可被文字 Hook 捕获到的字符串（折叠显示，同一条不重复刷屏）
# 若需保留开头/结尾空格，请用双引号包裹整个值，例如 "  原始文字"
# 若值本身需要包含双引号，请在包裹引号内写成两个连续双引号，例如 "他说""你好""" 会被读成：他说"你好"
# 常见值: 932(日文), 936(简中), 950(繁中), 65001(UTF-8)
ReplaceCount = 0
ReadEncoding = 936
WriteEncoding = 936
EnableVerboseLog = false
# Original_0 = 原始文字
# Replacement_0 = 替换文字

# ReplaceCount: 替换规则数量，需与下面条目数量一致（从 0 开始连续编号）
# 条目格式:
#   Original_0 = 原始文字
#   Replacement_0 = 替换文字
#   Original_1 = 原始文字2
#   Replacement_1 = 替换文字2
# 说明:
#   1) 支持通配符 * 和 ?
#   2) 编号必须连续（0开始直到ReplaceCount-1）

# API Hook 开关（可选，默认全部启用）
HookTextOutA = true
HookTextOutW = true
HookExtTextOutA = true
HookExtTextOutW = true
HookDrawTextA = true
HookDrawTextW = true
HookDrawTextExA = true
HookDrawTextExW = true

# ======================== 窗口标题替换 ========================
[WindowTitle]
# 替换窗口标题，支持通配符 * 和 ?
# EnableVerboseLog: 输出可被标题 Hook 捕获到的标题（折叠显示，同一条不重复刷屏）
# 若需保留开头/结尾空格，请用双引号包裹整个值，例如 "  原始标题"
ReplaceCount = 0
# ReadEncoding: 读取原始 ANSI 标题时使用的编码
# WriteEncoding: 写回新标题时使用的编码
ReadEncoding = 936
WriteEncoding = 936
EnableVerboseLog = false
# Original_0 = 原始标题
# New_0 = 新标题

TitleMode = 2
# 0 = API Hook模式（CreateWindowEx/SetWindowText）
# 1 = 事件监听模式（Windows事件驱动）
# 2 = 混合模式（推荐）

# ======================== 文件热补丁 ========================
[FilePatch]
# 游戏读取文件时优先从补丁文件夹查找
# 用途: 汉化补丁、资源替换、MOD安装
Enable = true
PatchFolderCount = 1
PatchFolderName_0 = patch
# 可配置多个补丁目录，越后面优先级越高
# PatchFolderName_1 = patch_override

CustomPakEnable = true
CustomPakCount = 1
CustomPakName_0 = patch.cpk
# CustomPakEnable: 是否启用自定义封包
# 可配置多个封包，越后面优先级越高，支持 cpk/xp3/lpk 封包格式
# CialloHook 自身资源读取优先级：PatchFolder > CustomPak > 游戏根目录
# 适用：字体文件、CnJpMapJson、SplashImage.ImageFile、Registry FileName_i、BinaryPatch .1337
# CustomPakName_1 = patch2.cpk

# VFS读取模式
# 0 ：物理读取模式
# 1 ：内存读取模式
VFSMode = 1
EnableLog = false
DebugMode = false

# ======================== x64dbg .1337 内存补丁 ========================
[BinaryPatch]
# 启动后自动应用 x64dbg 导出的 .1337 字节补丁
# 格式示例：
#   >game.exe
#   001CDB04:CC->B8
#   001CDB05:CC->00
#   >scn.dll
#   002CDB04:CC->90
# 说明：地址按模块基址 + RVA 计算；默认忽略 OLD 字节；不支持恢复
# .1337 文件读取优先级：PatchFolder > CustomPak > 游戏根目录
Enable = false
PatchFileCount = 0
# PatchFileName_0 = patches\main.1337
# PatchFile = patches\main.1337
EnableLog = false
# VerifyOldBytes: 写入前是否校验 OLD 字节
VerifyOldBytes = true
PreferCustomPak = false
# FailOnMissingModule / FailOnWriteError: 是否在模块缺失或写入失败时停止后续补丁
FailOnMissingModule = false
FailOnWriteError = false
# 是否启用硬件断点触发：先在当前线程设置 DR0 执行断点，attach/entrypoint/runtime 任一阶段命中后再应用 .1337
EnableHWBP = false
# 自定义断点模块/RVA；留空或 RVA=0 时，默认使用第一个 .1337 补丁地址
# HWBPModule = siglusengine.exe
# HWBPRVA = 002BEB0A

# ======================== 文件欺骗 ========================
[FileSpoof]
# 命中后返回文件不存在，欺骗调用者文件不存在
Enable = false
SpoofFileCount = 0
# 可配置多个需要隐藏的文件
# SpoofFileName_0 = system/license.dat

SpoofDirectoryCount = 0
# 可配置多个需要隐藏的文件夹
# SpoofDirectoryName_0 = system/secret
EnableLog = false

# ======================== 目录重定向 ========================
[DirectoryRedirect]
# 将命中的原目录重定向到目标目录，适合存档迁移等场景
Enable = false
EnableLog = false

# 规则数量，编号从 0 开始连续递增
RuleCount = 0

# 格式：原路径:目标文件夹
# 支持的环境变量：
# %SAVEDGAMES% %DOCUMENTS% %APPDATA% %LOCALAPPDATA% %USERPROFILE%
# 目标路径可写相对路径，相对游戏目录解析
# Rule_0 = %APPDATA%\GameCompany\GameName:savedata
# Rule_1 = %DOCUMENTS%\GameCompany\GameName:save_backup

# ======================== 虚拟注册表 ========================
[Registry]
# 将外部 .reg 文件加载到进程内虚拟注册表层，实现免安装运行
# 注意：
#   1) .reg 文件必须保存为 UTF-16LE
#   2) 文件内容必须是标准 Windows Registry Editor Version 5.00 导出格式
#   3) 文件读取优先级：PatchFolder > CustomPak > 游戏根目录
#   4) 多文件按顺序叠加，后加载的同名项可覆盖前者
Enable = false
FileCount = 0
# FileName_0 = game.reg
EnableLog = false

# ======================== RegistryBootstrap ========================
# 启动时临时创建真实注册表键值；适合需要安装路径等键值才能运行的游戏
Enable = false
CleanupOnExit = true
EnableLog = false
RuleCount = 0
# Root_0 = HKCU
# Key_0 = Software\\Vendor\\Game
# ValueName_0 = InstallPath
# Type_0 = SZ
# Data_0 = .\\

# ======================== 引擎专属配置 ========================
[SiglusKeyExtract]
# Siglus 密钥提取
# 自动提取 SiglusEngine 游戏的 16 字节 XOR 密钥
# 原理: 监控 Gameexe.dat 读取，用硬件断点捕获解密后的数据
# 用途: 解密 Scene.pck 等资源
Enable = false
GameexePath = Gameexe.dat
KeyOutputPath = siglus_key.txt
ShowMessageBox = true
DebugMode = false

[AliceSystem3x]
# Alice System3.x ALD 松散文件覆盖
# 用途：把 ALD 内部资源替换为补丁目录下的同名松散文件；适合 System3.x 系列资源热替换
# x86：Hook Alice System3.x ALD size/read/exists；x64：兼容 XSystem35 open/release 资源路径
# PatchFolderName_i 可配置多个补丁目录，后配置的目录优先级更高；相对路径按游戏目录解析
# 若 [FilePatch] 已启用补丁目录且已配置 CustomPakName=patch.cpk / patch.lpk 之类的封包，则查找顺序为
#   patch\name -> patch.cpk\name -> name
Enable = false
PatchFolderCount = 1
PatchFolderName_0 = patch
EnableLog = false
HookExistsCheck = false
MaxFileSize = 268435456

[RioShiina]
# RioShiina 引擎资源覆盖 / WARC 解包
# Mode = 0 关闭；1 资源覆盖；2 解包指定 WARC
# 仅支持 x86；非匹配目标会自动跳过
# 解包期间游戏会无响应，请耐心等待
# 解包会影响游戏稳定性，解包完成后游戏大概率会在后续发生闪退，不建议在 Mode 2 下进行游戏
Enable = false
Mode = 0
# Mode 1 会按 basename 在 PatchName_i 中查找同名文件，后配置的名字优先级更高
# 若 [FilePatch] 已启用补丁目录且已配置 CustomPakName=patch.cpk / patch.lpk 之类的封包，则查找顺序为
#   patch\name -> patch.cpk\name -> name
PatchCount = 1
PatchName_0 = unencrypted
# Mode 2 的解包路径，相对路径按游戏目录解析
ExtractOutputDir = rio_extract
# 需要解包的封包，多个封包使用 | 分隔例，如 SABAE_T.WAR|SABAE_G1.WAR|SABAE_G3.WAR
ArchivesToExtract = 
SkipInvalidFileName = true
# 自动处理 Rio 注册表检测
ProcessReg = true
# 尝试过DVD检测，较新版本的游戏需要自行查看SpecDvdFileSize并填入
# 一般来说，进入DVD镜像，找到那个与游戏EXE同名的.BIN后缀文件
# 其文件大小（以字节为单位）就是SpecDvdFileSize
# 一些老游戏镜像里没有.BIN文件那大概率没有用到这个值，此时请将SpecDvdFileSize填0
ProcessDvd = false
SpecDvdFileSize = 0
EnableLog = false

[GLOBAL]
# MED引擎专用。自动清除MED引擎字体缓存
MED = false
# majiro引擎专用。自动清除majiro引擎字体缓存
MAJIRO = false

# krkrpatch补丁。开启后会倒序检查 KrkrPatchName_* 列表，后配置的名字优先级更高；同名目录优先于同名xp3
# KrkrPatchCount = 0 时不自动回退 unencrypted；只按你显式配置的列表处理
# 若 [FilePatch] 已启用补丁目录且已配置 CustomPakName=patch.cpk / patch.lpk 之类的封包，则查找顺序为
#   patch\name -> patch.cpk\name -> name -> patch\name.xp3 -> patch.cpk\name.xp3 -> name.xp3
# KrkrPatchVerboseLog: 是否输出完整 krkr 文件流日志；关闭时默认只显示实际命中的文件和警告
EnableKrkrPatch = false
KrkrPatchVerboseLog = false
KrkrPatchCount = 1
KrkrPatchName_0 = unencrypted

# KrkrBootstrapBypass: krkrz 过 BootStrap 完整性检查的补丁；仅在检测到 bootStrap 标记时尝试应用
KrkrBootstrapBypass = false
# EnableKrkrCxdecBridge: 启用 KRKR/Cxdec StorageMedia 桥接，让 cxdec 场景也能命中补丁目录 / xp3 / custom pak
EnableKrkrCxdecBridge = false

# Waffle引擎兼容补丁。当前包含GetTextExtentPoint32A制表符崩溃修复
EnableWafflePatch = false

# ======================== Locale Emulator 转区 ========================
# proxy 模式下由 winmm.dll / version.dll 直接重启转区；loader 模式下继续由 CialloLauncher 处理
# 支持 LEP 优先、LE 兜底：优先使用 LoaderDll_x86/x64.dll + LocaleEmulatorPlus_x86/x64.dll，找不到再尝试 LoaderDll.dll + LocaleEmulator.dll
# 依赖可放在游戏目录 / CialloHook 目录，也可通过 [FilePatch] 的补丁目录或 CustomPak 提供；从补丁资源加载时会临时释放并在重启后清理
[LocaleEmulator]
# Enable: true=启用转区并在当前系统 ACP 不匹配时重启进程，false=关闭
Enable = true
# AnsiCodePage / OemCodePage: 目标区域代码页；一般两者保持一致
# 常用：932=日文，936=简中，950=繁中
AnsiCodePage = 932
OemCodePage = 932
# LocaleID: 区域 ID（十六进制），0x411=日语(日本)
LocaleID = 0x411
# 常见：128=SHIFTJIS_CHARSET，134=GB2312_CHARSET，136=CHINESEBIG5_CHARSET
DefaultCharset = 128
# HookUILanguageAPI: 1=同时 Hook UI 语言相关 API，0=不 Hook
HookUILanguageAPI = 0
# Timezone: 时区名称（需与系统可识别时区名一致）
Timezone = Tokyo Standard Time

# ======================== 启动弹窗 ========================
[StartupMessage]
# 启动时显示一个确认弹窗；点击“是”后才继续放行游戏窗口
# 弹窗使用系统默认 MessageBox 字体，不参与字体 Hook / 标题替换 / 文字替换
Enable = false
# Style: 弹窗样式
#   1 = 旧版样式，只显示 Text
#   2 = 分段样式，显示 Author + Text
Style = 1
Title = CialloHook
# 作者署名，可留空
Author =
# 正文，支持使用 \n 换行
Text = 

# ======================== 启动图片弹窗 ========================
[SplashImage]
# 启动时弹出图片动画窗口，动画结束后游戏窗口才会出现
# 图片查找顺序: PatchFolder → cpk/xp3/lpk CustomPak → 游戏根目录（多项时编号越高优先级越高）
# 例如把 splash.png 丢进 patch/ 文件夹，或用 CialloPAK 打包进 patch.cpk / patch.lpk
# 如果找不到图片文件，会静默跳过
Enable = false
# 图片文件名（不含路径，自动在 VFS 中查找）
ImageFile = splash.png
# 图片弹出尺寸
Width = 800
Height = 600
# 入场效果: 1=淡入  2=旋转入场  3=破碎入场  4=缩放入场  5=百叶窗入场  6=像素化入场
EntryEffect = 1
EntryMs = 1200
# 保持显示时长（毫秒）
HoldMs = 1800
# 退场效果: 1=淡出  2=旋转退场  3=破碎退场  4=缩放退场  5=百叶窗退场  6=像素化退场
ExitEffect = 1
ExitMs = 1500
# 提示: 入场和退场可以自由搭配，6×6 = 36 种组合

# 持续时间（毫秒）: 0=自动（入场+保持+退场之和）, >0=强制覆盖总时长
# 如果设定值比三段之和短，会自动裁剪（优先保留入场，再保持，最后退场）
DurationMs = 0
# 出现位置: 1=居中  2=左上  3=右上  4=左下  5=右下
Position = 1
# 交互模式: 0=无交互(纯定时)  1=可拖动图片  2=点击图片消失
InteractionMode = 0

# ======================== 加载模式 ========================
[LoadMode]
# proxy:  winmm.dll / version.dll 代理模式（推荐，直接运行游戏）
# loader: CialloLauncher.exe 辅助模式（支持多DLL注入）
Mode = proxy

# ======================== CialloLauncher 配置 ========================
# 仅在 Mode = loader 时生效
[CialloLauncher]
DebugMode = false
TargetEXE = game.exe
TargetDLLCount = 1
TargetDLLName_0 = CialloHook.dll

# ==================== 延迟附加 ====================
[StartupTiming]
# AttachMode:
#   immediate  = 维持当前行为，初始化线程里直接完整挂钩
#   delay      = 等待 DelayMs 后再完整挂钩
#   entrypoint = 在 EXE 入口点首次执行时再完整挂钩
AttachMode = immediate

# DelayMs: 仅 AttachMode = delay 时有意义，建议先从 500~2000 试起
DelayMs = 0

# WaitForGuiReady: 是否在完整挂钩前等待 user32/gdi32 就绪
WaitForGuiReady = false

# EnableStartupWindowGate: delayed attach 时是否先隐藏早期窗口，待完整挂钩后再放行
EnableStartupWindowGate = false

# ======================== 调试日志 ========================
[Debug]
# Enable: true=启用调试日志系统，false=关闭日志输出
Enable = false

# LogToFile: true=写入日志文件（通常在游戏目录下），false=不写文件
LogToFile = false

# LogToConsole: true=输出到控制台窗口，false=不输出到控制台
LogToConsole = false


