XP3未加密型
演示游戏:
妹妹太爱我了~所以决定和她生个孩子
因为文件编码都是shift-jis日本地区的编码只要换成Unicode就可以让绝大多数计算机玩得上
大多数些古老拔作多会出现这种情况
这种只需要拿garbro解包提取所有的ks,tjs还有一些也有的文件这里只针对最基础的一些系统脚本更改
如需修改其他提供源码,供扩展
再拿个脚本全部批量转成utf-16le
弄好之后用kirikiritools的XP3PACK封包即可
解包XP3
使用garbro2解包
Github:
https://github.com/UserUnknownFactor/GARbro2/releases/tag/v2.0.0
度盘:
https://pan.baidu.com/s/13lt5u3G_0S938UpUMK96kA 提取码: 75pf
将xp3拖入到打开的窗口
确认,打开

ctrl+A全选,右键提取

其他文件同样的操作
目前这样子
乱码状态


每次如果不想每次玩还要在转区软件弄,点点点,这就是本文章的意义和技术价值所在
像日文玩家一样获得流畅舒适的体验
批量改编码
对此写了个python脚本以处理这种文件
如果还有别的文件,请自行修改代码
对比EmEditor.exe只能批量地保存,而这玩意需要读取为SHIFT-JIS
使用前,请备份提取的文件!
使用前,请备份提取的文件!
使用前,请备份提取的文件!
使用前,请备份提取的文件!
使用前,请备份提取的文件!
使用方法
python 程序.py 文件夹路径
import os
import codecs
import argparse
# 定义要转换的文件扩展名
extensions = ['.tjs', '.ks']
# 源编码和目标编码
source_encoding = 'shift-jis'
target_encoding = 'utf-16-le'
# 解析命令行参数
parser = argparse.ArgumentParser(description='批量转换文件编码从Shift-JIS到带BOM的UTF-16LE')
parser.add_argument('directory', nargs='?', default=os.getcwd(), help='要转换的文件夹路径(默认:当前工作目录)')
args = parser.parse_args()
def convert_file_encoding(file_path):
"""
将单个文件从源编码转换为目标编码(不创建备份)
"""
try:
# 以源编码读取文件内容
with codecs.open(file_path, 'r', encoding=source_encoding) as f:
content = f.read()
# 以目标编码写入文件(带BOM)
# 对于UTF-16-LE,BOM是\xFF\xFE
bom = codecs.BOM_UTF16_LE
with open(file_path, 'wb') as f:
f.write(bom)
f.write(content.encode(target_encoding))
print(f"成功转换: {file_path}")
return True
except Exception as e:
print(f"转换失败: {file_path}")
print(f" 错误信息: {str(e)}")
return False
def main():
# 获取要转换的根目录
root_dir = args.directory
print(f"开始转换文件编码,根目录: {root_dir}")
print(f"源编码: {source_encoding}")
print(f"目标编码: {target_encoding} (带BOM)")
print(f"文件扩展名: {extensions}")
print("=" * 50)
success_count = 0
fail_count = 0
for dirpath, dirnames, filenames in os.walk(root_dir):
for filename in filenames:
# 检查文件扩展名
if any(filename.lower().endswith(ext) for ext in extensions):
file_path = os.path.join(dirpath, filename)
if convert_file_encoding(file_path):
success_count += 1
else:
fail_count += 1
print("=" * 50)
print(f"转换完成!")
print(f"成功转换: {success_count} 个文件")
print(f"转换失败: {fail_count} 个文件")
if __name__ == "__main__":
main()
修改的小细节记录
改bug就找报错的地方的ks,整个代码扔ai,然后把报错截图发过去改就是
自己该得改到头爆炸
存档位置
例如在这个tjs它将储存游戏存档至游戏目录,其中一行它注释掉了
这个就需要你自己去利用chatgpt还有trae快速找找看了

读取不存在bmp文件
读取存档的时候读取不存在的空槽位
例如说我这里遇到了,那么就要去这个ks修bug
这里是未保存过存档就读取不存在的datax.bmp
修复很简单在加载缩略图前加个条件判断
[button_loadthumbnail num="&tf.load_i+5" place="&tf.load_i + tf.load_i_add + sf.saveload_now_page*20" ...]
只有在该 slot 有存档时才执行 button_loadthumbnail
空 slot 用默认图显示。
; セーブデータがあるならサムネイル画像ボタンの画像を書き換える [button_loadthumbnail num="&tf.load_i+5" place="&tf.load_i + tf.load_i_add + sf.saveload_now_page*20" enterse="se_muon" entersebuf="&sf.SE_enter_buf" clickse="&sf.SE_click_sys" clicksebuf="&sf.SE_click_buf"]
把 *load_loop3 从这里开始:
*load_loop3
; サムネイル画像ボタンの表示位置を指定
[locate x="&tf.load_x[tf.load_i]+sf.thum_m_x" y="&tf.load_y[tf.load_i]+sf.thum_m_y"]
; サムネイル画像ボタンを配置
;♂実際のスロットの値を定義
[eval exp="tf.load_i2 = tf.load_i + tf.load_i_add"]
一直到:
[jump target=*load_loop3 cond="++tf.load_i<20"]
打开save储存存档功能的时候
禁止空槽位读缩略图即可
简单粗暴
这样空槽位就不会读 data1.bmp,自然不再弹 Information来烦人了
脚本里这句会去读对应槽位的缩略图:
[button_loadthumbnail num="&tf.save_i+5" place="&tf.save_i + tf.save_i_add + sf.saveload_now_page*20" ...]
只有“有存档”才读缩略图
在 *save_loop3 里,先算出实际槽位 tf.place,然后加条件:
[eval exp="tf.place = tf.save_i + tf.save_i_add + sf.saveload_now_page*20"]
[if exp="kag.getBookMarkDate(tf.place) != void"]
[button_loadthumbnail
num="&tf.save_i+5"
place="&tf.place"
enterse="se_muon" entersebuf="&sf.SE_enter_buf"
clickse="&sf.SE_click_sys" clicksebuf="&sf.SE_click_buf"
]
[endif]
这样 初次没有任何存档时 就不会去读 data0.bmp,也就不会崩。
报错里显示“eval”很常见:有些宏/内部实现会通过 eval 触发文件读取,所以错误标签显示 eval。
如果该槽位还没有存档,savedata/data0.bmp 等文件根本不存在,就会直接报错。
至于其他要汉化的东西,自行批量在脚本中搜索修改。
修图用PS
附:成功简体中文环境启动

XP3打包
将文件夹拖入至XP3PACK.exe上即可打包直接替换