satan53x / SExtractor

从GalGame脚本提取和导入文本
GNU General Public License v3.0
230 stars 15 forks source link

提取www/data时报错:TypeError: 'type' object is not subscriptable #40

Closed allrobot closed 8 months ago

allrobot commented 8 months ago
{'file': 'json', 'workpath': 'F:/BaiduNetdiskDownload/MV20 りおんのご奉仕♡温泉/www/data', 'engineName': 'RPGMV', 'outputFormat': 0, 'outputPartMode': 0, 'nameList': '', 'regDic': '00_skip=^<.+?>$\n01_skip=^<code\n02_skip=^<(?=bgm|bgs|se|battleb)\n20_search=^<.+?>([\\S\\s]+)$\nextractKey=all\npostSkip=^[ -~]|_\n', 'outputFormatExtra': -1, 'encode': 'UTF-8', 'print': [False, True, True, True, True], 'splitParaSep': '\\r\\n', 'maxCountPerLine': 512, 'cutoff': False, 'cutoffCopy': True, 'noInput': False, 'splitAuto': False, 'ignoreSameLineCount': False, 'ignoreNotMaxCount': False, 'fixedMaxPerLine': False, 'binEncodeValid': False, 'pureText': False, 'tunnelJis': False, 'subsJis': False, 'transReplace': False, 'preReplace': False, 'skipIgnoreCtrl': False, 'skipIgnoreUnfinish': False, 'ignoreEmptyFile': True}
---------------------------提取或导入时发生错误---------------------------
Traceback (most recent call last):
  File "C:\Tools\H_RPG_TOOLS\其它解包工具\SExtractor的GalGame脚本提取和导入文本工具\main\thread.py", line 18, in run
    self.window.extractFileThread()
  File "C:\Tools\H_RPG_TOOLS\其它解包工具\SExtractor的GalGame脚本提取和导入文本工具\main\mainWindow.py", line 201, in extractFileThread
    mainExtractJson(args)
  File "./src\main_extract_json.py", line 54, in mainExtractJson
    mainExtract(args, parse)
  File "./src\main_extract.py", line 627, in mainExtract
    if initArgs(args) != 0: return
  File "./src\main_extract.py", line 555, in initArgs
    ret = chooseEngine(args)
  File "./src\main_extract.py", line 462, in chooseEngine
    module = import_module('extract_' + engineName)
  File "C:\Users\li\.conda\envs\python38\lib\importlib\__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "./src\extract_RPGMV.py", line 3, in <module>
    from extract_TXT import ParseVar, dealLastCtrl, searchLine, initParseVar
  File "./src\extract_TXT.py", line 31, in <module>
    def GetPos(var:ParseVar, searchData:str, r:re.Match[str], i):
TypeError: 'type' object is not subscriptable
--------------------------------------------------------------------------
异常中断文件名:
运行时间:0.01 秒

image

挑的MV游戏目录下的www/data文件夹,使用预配的MV规则,结果报错TypeError: 'type' object is not subscriptable

satan53x commented 8 months ago

Python版本问题,需要使用3.9及以上版本,不然语法上不支持。 推荐是3.11。 如果一定要使用低版本python则需要把报错位置的变量注释都删掉,比如var:ParseVar改成var

allrobot commented 8 months ago

Python版本问题,需要使用3.9及以上版本,不然语法上不支持。 推荐是3.11

感谢,解决了 https://github.com/satan53x/SExtractor/blob/046a0734d0af778d33be7b2e3c3f8b24841da962/README.md?plain=1#L4-L8

建议新增python3.11说明

不太懂咋写入

PHAM!社团的dpm文件,拆解出一堆格式Shift-JIS的txt文件,提取文本到xlsx后,xlsx也汉化完了,不知道咋注入 按说明把transDic.output.xlsx改名transDic.json,不知道对不对,说明写的不够详细 点击提取/写入就报错:UnicodeEncodeError: 'cp932' codec can't encode character '\u65f6' in position 0: illegal multibyte sequence

设置勾选了替换译文,但看起来似乎没有注入,只是单纯的再一次提取新建了transDic.output.xlsx文件(吐槽一下,为啥就不能把提取和注入分为两个按钮呢)

image

除了剧情汉化文本要GBK格式的,其它的字都是代码,由于存在日文变量不能动,如果snr0.txt等文件以GBK保存游戏读取会出错

示例文件:snr0.txt

目录格式 F:\BaiduNetdiskDownload\[PHAM!] 俺の妹がこんなにエッチなわけがない[RJ094820]\scenario - 原版>tree /F /A 卷 3.5寸机械磁盘 的文件夹 PATH 列表 卷序列号为 41DC-1EE6 F:. | snr0.txt | snr1.txt | snr10.txt | snr11.txt | snr12.txt | snr13.txt | snr14.txt | snr15.txt | snr16.txt | snr17.txt | snr18.txt | snr19.txt | snr2.txt | snr20.txt | snr21.txt | snr22.txt | snr23.txt | snr24.txt | snr25.txt | snr26.txt | snr27.txt | snr28.txt | snr29.txt | snr3.txt | snr30.txt | snr31.txt | snr39.txt | snr4.txt | snr40.txt | snr41.txt | snr42.txt | snr43.txt | snr5.txt | snr6.txt | snr7.txt | snr8.txt | snr9.txt | +---ctrl | transDic.output.xlsx | transDic.xlsx | \---new snr0.txt snr1.txt snr10.txt snr11.txt snr12.txt snr13.txt snr14.txt snr15.txt snr16.txt snr17.txt snr18.txt snr19.txt snr2.txt snr20.txt snr21.txt snr22.txt snr23.txt snr24.txt snr25.txt snr26.txt snr27.txt snr28.txt snr29.txt snr3.txt snr30.txt snr31.txt snr39.txt snr4.txt snr40.txt snr41.txt snr42.txt snr43.txt snr5.txt snr6.txt snr7.txt snr8.txt snr9.txt

具体怎么写入呢?

satan53x commented 8 months ago

TXT是纯文本,原本如果是cp932是无法写入GBK的,纯文本文件自身不支持编码之外的字符,无法进行保存。 引擎要选BIN,默认是读cp932写GBK,不会改动到提取之外的文本。最好是勾选BIN启用纯文本正则模式。 其他设置都不用变,正则和TXT引擎下是一致的。

satan53x commented 8 months ago

设置勾选了替换译文,但看起来似乎没有注入,只是单纯的再一次提取新建了transDic.output.xlsx文件(吐槽一下,为啥就不能把提取和注入分为两个按钮呢)

因为导入的时候本来就会重新提取一次,不然感知不到文件结构,重新生成的输出文档不用管它,不影响导入。 译文替换是指text_conf.json配置的trans_replace功能,和能不能注入无关。

satan53x commented 8 months ago

按说明把transDic.output.xlsx改名transDic.json,不知道对不对,说明写的不够详细

提取和导入的格式一致,transDic.output.xlsx改成transDic.xlsx就行。

allrobot commented 8 months ago

TXT是纯文本,原本如果是cp932是无法写入GBK的,纯文本文件自身不支持编码之外的字符,无法进行保存。 引擎要选BIN,默认是读cp932写GBK,不会改动到提取之外的文本。勾选BIN启用纯文本正则模式

感谢指点,主程序总算能正常读取了

游戏程序:https://pixeldrain.com/u/Y5owHxqi

其中的scenario - 原版是解压出来的

通过olldbg修改主程序的CreateFontIndireA的x80为86,能显示一部分中文,但有些字符显示为乱码,请问怎么解决?

因为有些剧情文本是这样的标点符号就没有提取,结果识别为乱码了😂

4

5

allrobot commented 8 months ago
亂嫗夘亃

乽唔~~~啊乿

图中的那些乱码,实际是:

【京介】

「唔~~~啊」

只有唔~~~啊是GBK编码,这些带shift-JIS都要提取,感觉会累,如何修改能使主程序同时显示日文和中文?

实在不行,就老老实实提取名字和日文编码的符号了

allrobot commented 8 months ago

image

尝试把「」『』【】这些都写进去,为什么匹配成这样?不仅匹配「」『』【】,也匹配里面的字符串了,这是要怎么写避免匹配重复项?

正则表达式:

000_skip=^[@\d・;a-zA-z](.*?)$
90_search=^(?P<name>【.+?】)
91_search=^(?P<msg>『([^』]*)』)
97_search=^(?P<msg>「([^」]*)」)
100_search=^(?!「『【)(?P<msg>(.*?))$
allrobot commented 8 months ago

我用notepad++手动替换new目录下的txt文件 乧=… 乽乿亀亁亂亃=「」『』【】 等等就解决了 游戏能正常显示了

satan53x commented 8 months ago

只有唔~~~啊是GBK编码,这些带shift-JIS都要提取,感觉会累,如何修改能使主程序同时显示日文和中文?

你是不想翻译这个符号的话也要提取出来,因为要转符号编码到GBK。如果一定要过滤的话可以通过二次提取JSON再过滤掉。 字符是字符,编码是编码。 不存在同一句话同时显示不同编码的文本,krkr都做不到,除非是你有游戏的源代码。

satan53x commented 8 months ago
000_skip=^[@\d・;a-zA-z](.*?)$
90_search=^(?P<name>【.+?】)
91_search=^(?P<msg>『([^』]*)』)
97_search=^(?P<msg>「([^」]*)」)
100_search=^(?!「『【)(?P<msg>(.*?))$

91和97里边嵌套了捕获分组所以重复了,你把里边的捕获分组的()删掉就行。

allrobot commented 8 months ago

91和97里边嵌套了捕获分组所以重复了,你把里边的捕获分组的()删掉就行。

编辑,抱歉,是我正则表达式学艺不精

satan53x commented 8 months ago

你是说要重复利用分组吗?那直接使用正则的非捕获分组就行啊?和分组名没有关系。

satan53x commented 8 months ago

其实也不是非要精准匹配每个字符的。 假设在你这个文本里,除了选项其他没有以数字开头的,且选项中文本在行尾。那么可以直接:

20_search=^\d.+,([^,]+?)$

不需要管里边有多少个逗号,反正只需要最后一个

allrobot commented 8 months ago

你是说要重复利用分组吗?那直接使用正则的非捕获分组就行啊?和分组名没有关系。

我不太会正则表达式,不知道怎么匹配

例如“200,180,0,きり11,0,0,桐乃の部屋へ直接注意しに行く”,用正则表达式表示:^\d+,\d+,\d+,[^,]+,\d+,\d+,([^,]+)$,用[^,]+期望仅匹配“桐乃の部屋へ直接注意しに行く”

如果有python的re.match(pattern, text).group指定捕获组就好了,在这个软件只能使用正则表达式

我试试20_search=^\d.+,([^,]+?)$

编辑,上面的不太行

网上查了下,反向正向肯定否定预查能行,(?<=\d,\d,)[日文字符编码范围]+$

平常不怎么用肯定和否定预查😂,这时候也只能学习学习了