èŠèŠçãªçç·šå°èª¬ã®ã¢ããã¥ã¢ç¿»èš³ã¯ãä»ã®ã²ãŒã ã®ç¿»èš³ãšæ¯èŒãããšãå€ãã®æ©èœãåããŠãããå€ãã®ããã¹ããæäœããå¿ èŠããããŸãã ããããããã¹ãŠã®ããžã¥ã¢ã«ããã«ã®å€§éšåã¯æ¥æ¬èªã§ãªãªãŒã¹ãããè±èªã«ç¿»èš³ããããã®ã¯ãããïŒå ¬åŒãŸãã¯ã¢ããã¥ã¢ïŒã§ãããä»ã®èšèªã«ç¿»èš³ããããã®ã¯ããã«å°ãªãã£ãã§ãããã
ãã®ããã翻蚳ãæ±ãéã«ã¯ãæ¥æ¬èªãšã³ãžã³ã«å¯ŸåŠããå¿ èŠããããŸããããã®å€ãã¯ããŒã«ã©ã€ã¶ãŒã«ããŸã銎æã¿ããããŸããã ãã®ããã翻蚳ã¹ãã«ãèšèªã®ç¥èãå€ãã®ç±æãšèªç±ãªæéã®ååšã¯ãã²ãŒã ã®ç¿»èš³ããŒãžã§ã³ããŸããªãæ¥ã®ç®ãèŠãããšãæå³ãããã®ã§ã¯ãªãããšã«ããã«æ°ä»ããŸãã
éåžžã«å€§ãŸãã«èšã£ãŠãã²ãŒã ã翻蚳ããããã»ã¹ïŒèŠèŠçãªçç·šå°èª¬ã ãã§ãªãïŒã¯ã
- ã²ãŒã ãªãœãŒã¹ã®å±éïŒãããªãã¯ãã¡ã€ã³ã«ãªãå ŽåïŒ
- å¿ èŠãªéšåã®ç¿»èš³
- éåŒã梱å
ãã ããæ¥æ¬ã®èŠèŠçãªçç·šå°èª¬ã®å Žåãããã¯é垞次ã®ããã«ãªããŸãã
- ã²ãŒã ãªãœãŒã¹ã®å±é
- ã²ãŒã ã®ããã¹ãéšåã®ç¿»èš³ïŒã²ãŒã ã¹ã¯ãªããïŒ
- ã²ãŒã ã®ã°ã©ãã£ãã¯éšåã®ç¿»èš³
- éåŒã梱å
- 翻蚳ãããã³ã³ãã³ãã§åäœããããã«ãšã³ãžã³ãå€æŽ
ç§ãã¡ã®çµéšã誰ãã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
2013幎ïŒãããããã以åïŒã«ãããžã¥ã¢ã«å°èª¬ãçŸå°å¥³äžè¯é¡-ããã¯ã¬ã·äŒèª¬ã®å°å¥³-ïŒçŸå°å¥³äžè¯é¡-åªãããäŒäŒã®å°å¥³-ïŒããæ¥æ¬èªãã翻蚳ããããšã«ããŸããã ç§ã¯ãã§ã«ã²ãŒã ã®ç¿»èš³ã®çµéšããããŸãããã ããªããªã®ãããªæ¯èŒçåçŽã§æåãªãšã³ãžã³ã§çç·šã翻蚳ããã ãã§ããã
ããã§ãç§ãã¡ã®ç¿»èš³è ããŒã ã¯ãå®éã®ããã¹ãèªäœã«å°éããåã§ãã£ãŠãããã®çç·šå°èª¬ã®ãšã³ãžã³ãéããªããã°ãªããŸããã§ããã
.exeãã¡ã€ã«ã®èª¬æããå§ããŸããããããã«ã¯ãQLIEãšIMOSURUMEãšããèšèãèšèŒãããŠããŸãã ãã¡ã€ã«èªäœã«ã¯ãè¡FastMM Borland Edition 2004ã2005 Pierre le Richeãå«ãŸããŠããŸããããã¯ããšã³ãžã³ãDelphiã§èšè¿°ãããŠããå¯èœæ§ãé«ãããšãæå³ããŸãã
ç°¡åãªã°ãŒã°ã«æ€çŽ¢ã§ãQlieãWarmth EntertainmentããªãªãŒã¹ããããžã¥ã¢ã«ããã«ãšã³ãžã³ã®ååã§ããããšãæããã«ãªããŸããã ã©ãããIMOSURUMEã¯ã¹ã¯ãªãããšã³ãžã³ã®å éšåã§ãããQlieã¯åçšåã§ãã ãã®ãšã³ãžã³ã§ãªãªãŒã¹ãããã²ãŒã ãšWarmth Entertainmentã®å ¬åŒWebãµã€ãããªã¹ããããµã€ãqlie.netããããŸãã
ãããããããªãã¯ãã¡ã€ã³ã®ã©ãã«ãããšã³ãžã³ãæäœããããã®å ¬åŒããŒã«ããããã¥ã¡ã³ãããããŸããã
ãããã£ãŠãéå ¬åŒã®ãŠãŒãã£ãªãã£ã«äŸåããŠãèªåã§ã²ãŒã ãåŠçããå¿ èŠããããŸãã ãŸãã翻蚳ãå¿ èŠãªã²ãŒã ã®ãã¹ãŠã®éšåãèŠã€ããå¿ èŠããããŸãã
ã²ãŒã ã¢ãŒã«ã€ãã¯ã\ GameDataãµããã©ã«ããŒã®data0.packãdata1.packããã³data7.packãã¡ã€ã«ã«ãããŸãã ã¹ã¯ãªãŒã³ã»ãŒããŒã¯\ GameData \ Movieãã©ã«ããŒã«ãããŸããããã®ãŸãŸã«ããŠããããšãã§ããŸãã
16é²ãšãã£ã¿ãŒã¯ã.packã²ãŒã ã¢ãŒã«ã€ãã®èªèå¯èœãªããããŒããªãããšã瀺ããŸããããã¡ã€ã«ã®æåŸã«ç®æ¬¡ãšã©ãã«FilePackVer3.0ã«äŒŒãéšåããããŸã
幞ããªããšã«ããã®åœ¢åŒã«ã¯æ¢ã«ã¢ã³ããã«ãŒãããã1ã€ã§ããããŸããã asmodeanã®ã³ã³ãœãŒã«exfp3_v3ã䜿çšããŸããã
é梱ã¯èŠãç®ã»ã©ç°¡åã§ã¯ãããŸããã ãšã³ãžã³ã¯ããã€ãã®ã¢ãŒã«ã€ã圢åŒïŒFilePackVer1.0ãFilePackVer1.0ãFilePackVer3.0ïŒããµããŒãããŠããããããã®å Žåã¯FilePackVer3.0ã䜿çšãããŸããé©åãªè§£åã«ã¯ãã¢ãŒã«ã€ããæå·åããç¹å¥ãªããŒãã¡ã€ã«key.fkeyãå¿ èŠã§ãã \ Dllãµããã©ã«ããŒã«ãããŸã
ããã«ãexfp3_v3ã¯ãå±éããã²ãŒã ã®ã¢ãŒã«ã€ããæ確ã«ããå¿ èŠããããŸãã
ãã®ãããã¢ã³ããã«ãŒãææ¡ãããªã¹ãããã²ãŒã çªå·ãæå®ããå¿ èŠããããŸãïŒçŸå°å¥³äžè¯é¡ã·ãªãŒãºã®ã²ãŒã ã¯15çªäžã«ãããŸãïŒããŸãã¯ã¢ã³ããã«ãŒã®3çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠã²ãŒã å®è¡å¯èœãã¡ã€ã«ãæå®ããŸãã
ãã§ã«ã²ãŒã ãã¡ã€ã«ã解åããåŸãè«ççãªèããæµ®äžããŸããïŒå°æ¥ãã©ã®ããã«ã²ãŒã ãããã«ç¿»èš³ããŠããã¯ãããïŒ çµå±ãã¢ã³ããã«ãŒã¯éã®æäœããµããŒãããŠããŸããã
ãªã¯ãšã¹ãã«å¿ããŠãw8mïŒããããšãããããŸãïŒã¯ãã²ãŒã ã¢ãŒã«ã€ããããã°ã©ã arc_conv.exeã«ããã¯ããæ©èœãè¿œå ããŸããã å€æŽããããã¹ãŠã®ãã¡ã€ã«ãæ°ããã¢ãŒã«ã€ãïŒdata8.packãªã©ïŒã«ããã¯ããGameDataãã©ã«ããŒã«é 眮ããã ãã§ååã§ããèªåçã«ã²ãŒã ã«åŒã蟌ãŸããŸãã
å±éããããªãœãŒã¹ã«æ»ããŸãã data0.packã¢ãŒã«ã€ãã®ã²ãŒã ã¹ã¯ãªãããã¡ã€ã«ã¯ããµããã©ã«ããŒ\ã·ããªãª\ ks_01 \ã«ãããŸãã
æ¡åŒµåã.sã®ãã¹ãŠã®ã¹ã¯ãªãããã¡ã€ã«ã¯ãæã䟿å©ãªShift Jisãšã³ã³ãŒãã£ã³ã°ãšã¯ããé¢ããŠãšã³ã³ãŒãããããšã³ãžã³ã¯Unicodeãšã³ã³ãŒãã£ã³ã°ããµããŒãããŠããŸããã 翻蚳ã®è¡ã¯ãã»ãŒæ¬¡ã®ããã«ãªããŸãã
ãããªãšã ïŒ
1_kiri1478ïŒ
ããžãâŠâŠåãã£ãŠãããããªãã ç§ãç®äžãããã·ã¢ã³ãã£ãŒãèŠãŠãããªãšã¯å¬ãããã«ç®ã现ããã ^cface,,èµ€ç®åŸ®ç¬01 ãããªãšã ïŒ
1_kiri1479ïŒ
ãæ¥æ¬äººã¯ããžã£ã ãçŽ
è¶ã«å
¥ããŠé£²ãã®ãããã·ã¢ã³ãã£ãŒã ãšåéãããŠãã人ãå€ãã®ã ããã©âŠâŠã
æ¥æ¬èªã®åãã¬ãŒãºã®åã«ã¯ãæ¥æ¬èªã®æ¬åŒ§ã§å²ãŸããäž»äººå ¬ã®ååãä»ããŠããããšããããŸãã ïŒããïŒããã®ãã¬ãŒãºãçºé³ããŸãïŒã²ãŒã ã§ã¯ããŠã£ã³ããŠã®äžéšã«ããã¹ãã§è¡šç€ºãããŸãïŒã ãŸãã¯ãããããèè ã®èšèã§ããå Žåãååã¯è¿œå ãããŸããã
ãããããŸã ãµãŒãã¹ããŒã ããããŸãã
ã¹ã¯ãªããå ã®ãšã³ãžã³ã³ãã³ãã¯ãTeXããŒã¯ã¢ããèšèªãé£æ³ãããŸããã KirikiriãŸãã¯RenPyã³ãã³ãã«æ¯ã¹ãŠã¯ããã«çŽæçã§äžäŸ¿ã§ãã
ãããã®ããã€ãã次ã«ç€ºããŸãã
@@@
ã¯ããªãã«ããã°ã§ãã å€ãã®å Žåãã¹ã¯ãªãããã¡ã€ã«ã¯ãã®ã³ãã³ãã§å§ãŸããŸãã ãµãŒãããŒãã£ã®ãã¡ã€ã«ããæããã«å®çŸ©ãããŒãããŠããŸãã
äŸïŒ
@@@Library\Avg\header.s
@@
ã¯ããã«ããã°ã§ãã ã¹ã¯ãªãããã¡ã€ã«ã®ã©ãã«ã åŸã§åãæ¿ããããšãã§ããŸãã
ïŒ
1_kiri1478ïŒ
-é³å£°ãã¡ã€ã«ãåçããŸãã ãããã®ã³ãã³ãã¯ãããŒããŒã®ååãšç»é¢ã«è¡šç€ºãããããã¹ãã®éã«æ¿å ¥ãããŸãã ã1_kiri1478ã-ãã®å Žåãdata1.packãã¡ã€ã«ã®\ voice \ãã©ã«ããŒã®ãã¡ã€ã«åããŒã ãéåžžã®å²åïŒïŒ ïŒã§ã¯ãªããæ¥æ¬ã®å²åïŒïŒ ïŒã䜿çšããã®ã¯èå³æ·±ãããšã§ãã
^savedate, ^saveroute, ^savescene,
-ã²ãŒã ã®ã»ãŒãã·ã¹ãã ã§äœ¿çšãããå¯èœæ§ãæãé«ã3ã€ã®ããŒã ã§ãã»ãŒãã²ãŒã ã§ãã¬ã€ã€ãŒãã»ãŒããããå Žæãšæéã«é¢ããæ å ±ãå ¥åããå¿ èŠããããŸãã
äŸïŒ
^savedate,"çŸåš" ^saveroute,"çŸå°å¥³äžè¯é¡ïŒïŒïŒ" ^savescene,"åªãããäŒèª¬ã®å°å¥³ ãªãŒããã³ã°"
ã€ãŸããæ¥ä»ïŒçŸåšãæ¯åºïŒçŸå°å¥³äžè¯é¡-1-ãã·ãŒã³ïŒããã¯ã¬ã·äŒèª¬ã®å°å¥³ãªãŒããã³ã°ã ãã®ããŒã¿ã¯ä¿åã¹ãããã«è¡šç€ºãããã¯ãã§ããããæããã«éçºè ã¯ãããæŸæ£ããããšã«æ±ºããŸããã ãã®çµæã
^saveroute
ã¹ã¯ãªããã®ãã¹ãŠã®éšåã§
^saveroute
ã§ãã
^savedate
ãçŸåšã®ç¬éãããã倢ããžã®å€æŽã
^savescene
ã§ã²ãŒã å ã®æ¥æ°ïŒãŸãã¯å€ïŒãå€æŽããŸãã
^facewindow,
-ããã¹ããç»é¢ã«è¡šç€ºãããŠããããã¹ãããã¯ã¹ã®ç¶æ ã ïŒè¡šç€º-1ãã©ãã-0ïŒ
^sload,
-察å¿ãããã£ã³ãã«ã®\ sound \ãã©ã«ãããã²ãŒã å ã®ãµãŠã³ããåçããŸãã
sload,Env1,âã»ã01ã¢ãã©ãŒã
Env1ã§ã»ããåçãã
ããŒã ã«ã¯2ã€ã®ãªãã·ã§ã³ãã©ã¡ãŒã¿ãããã1ã€ç®ã¯ãµãŠã³ãã®ã«ãŒããæ åœãã2ã€ç®ã¯è¬ã®ãŸãŸã§ãããã²ãŒã ã§ã¯ã»ãšãã©äœ¿çšãããŸããã
^sload,SE1,â ã¯ãã¥é³01,1
ãã£ã³ãã«SE1ã§ã«ãŒãããã¯ãµãŠã³ããåçããŸãã
^eeffect
ç¹å®ã®ç§æ°ã®éãç»é¢ã«ç¹æ®å¹æã衚瀺ããŸãã ã©ããããããã¯ããã€ãã®å¹æã®é 次åºåããµããŒãããŠããŸãã
^eeffect,WhiteFlash
çœãéå ã®å¹æã
^ffade
ç»é¢ãå€æŽãããšãã®ãã©ã³ãžã·ã§ã³å¹æã
ããããã®è¿œå ãã©ã¡ãŒã¿ãŒããããŸãããå®éã«åœ¹ç«ã€ã®ã¯ã»ãã®ãããã§ãïŒãã©ã³ãžã·ã§ã³å¹æã®ååãå¿ èŠã«å¿ããŠè¿œå ã®ç»åããã©ã³ãžã·ã§ã³å®äºæéã
^ffade,Overlap,,1000
1ç§ã§1ã€ã®ç»åãå¥ã®ç»åã«å解ããŸãã
^iload
ç»é¢ã«èæ¯ç»åãããŒãããŸãã ã€ã¡ãŒãžã«ã¯ãå°æ¥åç §ããããã®IDãå²ãåœãŠãããšãã§ããŸãã
^iload,BG1,0_black.png
åºåãã¡ã€ã«0_black.pngãID BG1ã®èæ¯ãšããŠ
^we
ãš
^wd
ãŠã£ã³ããŠå ã®ç»åã®ãªã³ãšãªãã
^wd
ãŸãã
^facewindow,1
ããã³
^facewindow,0
ãã€ã¢ãã°ããã¯ã¹ã§ããŒããŒç»åã®ãªã³ãšãªãã
^facewindow,0
ãŸãã
^mload
ç¹å®ã®ãã£ã³ãã«ã§é³æ¥œãåçããŸãã
^mload,BGM1,nbgm13
ãã£ã³ãã«BGM1ã§ãã©ãã¯nbgm13ãåçãã
æãéèŠãªããŒã ã®äžéšïŒ
\jmp
æå®ãããååã®ã©ãã«ã«ãžã£ã³ãããŸãã
^select
ãã¬ã€ã€ãŒããªãã·ã§ã³ã®ãããããéžæããå¿ èŠãããéžæãŠã£ã³ããŠãç»é¢ã«è¡šç€ºããŸãã
äŸïŒ
^select, , \jmp,"@@route01a"+ResultBtnInt[0] @@route01a0
ããã§ã¯ã質åãžã®åçåŸã«é·ç§»ãå®è¡ãããåççªå·ïŒ0ãŸãã¯1ïŒãResultBtnInt [0]ããè¿ãããŸãã ãã®çµæã
\jmp
ã¹ããŒãªãŒãã©ãã«@@ route01a + response numberã«ç§»åããŸãã ã€ãŸãã@@ route01a0ãŸãã¯@@ route01a1
äžå¿«ãªæ©èœã¯ããããã®ã³ãã³ãã®éåžžã®ã³ã³ããåºåãæåãšããŠæ©èœããåçãªãã·ã§ã³èªäœã§äœ¿çšã§ããªãããšã§ãã æ¥æ¬äººã¯ãã®ãããªåé¡ã¯ãããŸããã圌ãã¯æ¥æ¬èªã®ã³ã³ãïŒãïŒã䜿çšããŸãã ãã®å Žåãã«ã³ãããïŒU + 201A SINGLE LOW-9 QUOTATION MARKïŒãã«çœ®ãæããããšãã§ããŸãã
äŸïŒ
^select, â , â
æ®ãã®ããŒã ã¯ãæåã®è¿äŒŒã§ã¯ããã»ã©éèŠã§ã¯ãããŸããã
ãã¡ãããã¹ã¯ãªããã翻蚳ããåã«ãããªã«æåãšæ¥æ¬èªã®æåãçµåããããã«ããã䟿å©ãªãã®ãããšãã°UTF-8ã«å€æããå¿ èŠããããŸãã
ãšã³ãžã³ãå€æŽãããšïŒãã®æ¬¡ã®éšåã«ã€ããŠïŒãã²ãŒã ã¯ãã·ã¢èªã®ããã¹ããšæ¥æ¬èªã®äž¡æ¹ãèªèããŸãã ãã ããçŸæç¹ã§ã¯ãäºææ§ã®ããã«ãShift Jisã§æ¥æ¬èªæåããšã³ã³ãŒãããcp1251ãšã³ã³ãŒãã§ããªã«æåããšã³ã³ãŒãããå¿ èŠããããŸãã
ããªã«æåãèæ ®ããŠãã©ã³ã¹ã³ãŒãããããã®Pythonã®ããã°ã©ã ããã°ããã¹ã±ããããŸããã
UTF8ããcp1251ããã³ShiftJIS
# -*- coding: utf-8 -*- # UTF8 to cp1251 and ShiftJIS recoder # by Chtobi and Nazon, 2016 import codecs import argparse from os import path JAPANESE_CODEPAGE = 'shift_jis' UTF_CODEPAGE = 'utf-8' RUS_CODEPAGE = 'cp1251' def nonrus_handler(e): if e.object[e.start:e.end] == 'ïœ': # UTF-8: 0xEFBD9E -> SHIFT-JIS: 0x8160 japstr_byte = b'\x81\x60' elif e.object[e.start:e.end] == 'ïŒ': # UTF-8: 0xEFBC8D -> SHIFT-JIS: 0x817C japstr_byte = b'\x81\x7c' else: japstr_byte = (e.object[e.start:e.end]).encode(JAPANESE_CODEPAGE) return japstr_byte, e.end if __name__ == '__main__': arg_parser = argparse.ArgumentParser(prog="Recode to cp1251 and ShiftJIS", description="Program to encode UTF8 text file to " "cp1251 for all cyrillic symbols and ShiftJIS for others. " "Output file will be inputfilename.s", usage="recode_to_cp1251_shiftjis.py file_name") arg_parser.add_argument('file_name', nargs=1, type=argparse.FileType(mode='r', bufsize=-1), help="Input text file name. Only files coded in UTF8 are allowed.\n") codecs.register_error('nonrus_handler', nonrus_handler) input_name = arg_parser.parse_args().file_name[0].name output_name = path.splitext(input_name)[0] + ".s" with open(input_name, 'rt', encoding=UTF_CODEPAGE) as input_file: with open(output_name, 'wb') as output_file: for line in input_file: for char1 in line: bytes_out = bytes(line, UTF_CODEPAGE) output_file.write(char1.encode(RUS_CODEPAGE, "nonrus_handler")) print("Done.")
ããããããã€ãã®åé¡ããããŸããã ããã°ã©ã ã¯ãããã«ããèšå·ãïŒU + FF5E FULLWIDTH TILDEïŒãåã³ãŒãã£ã³ã°ããããšãããšããšã©ãŒãUnicodeEncodeErrorïŒ 'Shift Jis' codec ca n't encoding character '\ uff5e' in position 0ïŒillegal multibyte sequenceããçæããŸãã
æåã¯Pythonã«å¯ŸããŠçœªãç¯ããŸããããæçµçã«ã¯ããªãçãããã¥ã¢ã³ã¹ãèŠã€ããŸããã ç¹å®ã®å®è£ ã«å¿ããŠããŠãã³ãŒããšéãŠãã³ãŒãã®æ¥æ¬èªãšã³ã³ãŒãã£ã³ã°ã®çžé¢æ¹æ³ã«ã¯äžç¢ºå®æ§ããããŸãã
ãã®çµæãWindowsã¯ã³ãŒã0x8160ã®Shift JisæåããŠãã³ãŒããïŒU + FF5E FULLWIDTH TILDEïŒã«é¢é£ä»ããä»ã®ãã©ã³ã¹ã³ãŒããŒïŒããšãã°iconvãŠãŒãã£ãªãã£ïŒã¯ãå ¬åŒã®Unicodeæ¯çè¡šã«åŸã£ãŠãåãæåããïŒU + 301C WAVE DASHïŒãšé¢é£ä»ããŸã-ftp://ftp.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/SHIFT JIS.TXT
æåéã®å¯Ÿå¿ã決å®ããããã«ããã€ã¯ããœããã¯æããã«ãShift Jisã®æ¡åŒµããŒãžã§ã³ã§ããcp932ãšã³ã³ãŒãã£ã³ã°ã®ã¹ããŒã ã䜿çšããããšã決å®ããŸããã
åãç¶æ³ã¯ãWindowsã§ã¯-ïŒU + FF0D FULLWIDTH HYPHEN-MINUSïŒããŸãã¯iconvã§ã¯-ïŒU + 2212 MINUS SIGNïŒãšããŠUTF8ã«å€æãããæåã³ãŒã0x817Cã§ãçºçããŸãã
ãã¹ãŠã®ã¹ã¯ãªãããã¡ã€ã«ã¯æåã«Notepad ++ã䜿çšããŠShift JisããUTF8ã«å€æãããããïŒWindowsã§æ¡çšããã察å¿è¡šã䜿çšïŒãPythonããã°ã©ã ãä»ããŠUTF8ããShift Jisã«å€æãããšãæªåé«ãå€æãšã©ãŒãçºçããŸããã
ãã®ãããããšïŒã®å¥ã ã®æ¡ä»¶ã®çºçãèæ ®ããå¿ èŠããããŸããã
ãã®ä»ã®å°ããªæ¬ é¥ããããŸãããããšãã°ãçç¥èšå·ïŒU + 2026æ°Žå¹³æ¥åïŒã¯ãShift Jisã®æ¥æ¬äººã§ã¯ãªããcp1251ã®ããªã«èªã®çç¥èšå·ã«çœ®ãæããããŸããã
ããã¹ãã翻蚳ããåŸãã²ãŒã ã°ã©ãã£ãã¯ã¹ã®äœæ¥ã«é²ãããšãã§ããŸãã
ã²ãŒã ã®ã°ã©ãã£ãã¯ãã¡ã€ã«ã¯åãããã¯ã¢ãŒã«ã€ãå ã«ãããŸãããå±éåŸãåŒãç¶ãäžçæžåœäœæ¥ããå¿ èŠããããŸãã ããšãã°ãã»ãŒãã¹ãŠã®pngç»åã¯ãsample + DPNG000 + x32y0.pngã¿ã€ãã®ãã¡ã€ã«ã®åœ¢åŒã§è§£åãããŸããã€ãŸããpngç»åã¯88 cmã®åãã®æ°Žå¹³ã¹ããªããã«åãåããããåã¹ããªããã¯åå¥ã®ãã¡ã€ã«ã«æžã蟌ãŸããŸãã ãã¡ã€ã«åã«ã¯ãã¹ããªããã®ã·ãªã¢ã«çªå·ïŒDPNG000 ... 009ïŒãšxãy座æšã衚瀺ãããŸãã
ãªããããå¿ èŠãªã®ãããŸã çåã«æã£ãŠããŸãã ã²ãŒã ãããªãœãŒã¹ããªããã³ã°ããã®ãé£ããå Žåãããã¯æããã«æåã®æ¹æ³ã§ã¯ãããŸããã
ã«ãããããpngãã¡ã€ã«ãæ¥çããããã«ãäžåºŠã«ImageMagickã䜿çšããasmodeusã®Pearlã«å°ããªã¹ã¯ãªããmerge_dpngãäœæãããŸããã æ®å¿µãªããã圌ã«ã¯åé¡ããããŸããã ãŸããç§ã¯äœ¿çšããªãã£ãPearlãå¿ èŠã§ãããã€ã³ã¹ããŒã«ããåŸã§ããã¹ã¯ãªãããæ£ããæ©èœããŠããªãããšãããããŸããã
ãã®ãããPythonã§åæ§ã®ããã°ã©ã ãäœæããŸããã
Qlieãšã³ãžã³ã®dpngãã¡ã€ã«ã®ããŒãž
# -*- coding: utf-8 -*- # Qlie engine dpng files merger # by Chtobi and Nazon, 2016 # Requires ImageMagick magick.exe on the path. import os import glob import re import argparse import subprocess IMGMAGIC = os.path.dirname(os.path.abspath(__file__)) + '\\' + 'magick.exe' IMGMAGIC_PARAMS1 = ['-background', 'rgba(0,0,0,0)'] IMGMAGIC_PARAMS2 = ['-mosaic'] INPUT_FILES_MASK = '*+DPNG[0-9][0-9][0-9]+*.png' SPLIT_MASK = '+DPNG' x_y_ajusts_re = re.compile('(.+)\+DPNG[0-9][0-9][0-9]\+x(\d+)y(\d+)\.') if __name__ == '__main__': arg_parser = argparse.ArgumentParser(prog="DPNG Merger\n" "Program to merge sliced png files from QLIE engine. " "All files with mask *+DPNG[0-9][0-9][0-9]+*.png" "into the input directory will be merged and copied to the" "output directory.\n", usage="connect_png.py input_dir [output_dir]\n") arg_parser.add_argument("input_dir_param", nargs=1, help="Full path to the input directory.\n") arg_parser.add_argument("output_dir_param", nargs='?', default=os.path.dirname(os.path.abspath(__file__)), help="Full path to the output directory. " "It would be a script parent directory if not specified.\n") input_dir = arg_parser.parse_args().input_dir_param[0] output_dir = arg_parser.parse_args().output_dir_param[0] os.chdir(input_dir) all_append_files = glob.glob(INPUT_FILES_MASK) # Select only files with DPNG prep_bunches = [] for file_in_dir in all_append_files: # Check all files and put all splices that should be connected in separate list for num, bunch in enumerate(prep_bunches): name_first_part = bunch[0].partition(SPLIT_MASK)[0] # Part of the filename before +DPNG should be unique if name_first_part == file_in_dir.partition(SPLIT_MASK)[0]: prep_bunches[num].append(file_in_dir) break else: prep_bunches.append([file_in_dir]) os.chdir(os.path.dirname(os.path.abspath(__file__))) # Go to the script parent dir for prepared_bunch in prep_bunches: sorted_bunch = sorted(prepared_bunch) # Prepare -page params for imgmagic png_pages_params = [["(", "-page", "+{0}+{1}".format(*[(x_y_ajusts_re.match(part_file).group(2)), x_y_ajusts_re.match(part_file).group(3)]), input_dir+part_file, ")"] for part_file in sorted_bunch] connect_png_list = \ [imgmagick_page for imgmagick_pages in png_pages_params for imgmagick_page in imgmagick_pages] output_file = output_dir + sorted_bunch[0].partition(SPLIT_MASK)[0] + ".png" subprocess.check_output([IMGMAGIC] + IMGMAGIC_PARAMS1 + connect_png_list + IMGMAGIC_PARAMS2 + [output_file])
ã²ãŒã ã«è¡šç€ºãããäžé£ã®åçããã¹ãŠæã£ãããã«èŠããŸããïŒ ãã¹ãŠã§ã¯ãããŸãã-ãã¹ãŠã®ã¢ãŒã«ã€ãããæ¥ç¶ããããã¹ãŠã®åçãèŠããšãã²ãŒã å ã«ããã«ãããããããäžéšãæ¬ èœããŠããããšãããããŸãã å®éããšã³ãžã³ã«ã¯å¥ã®çš®é¡ã®ãã¡ã€ã«ããããæ¡åŒµåã¯.bã§ãã ç»åãšé³å£°ãå éšã«èšé²ãããã¢ãã¡ãŒã·ã§ã³ã§ãã
ãªãœãŒã¹ãå éšã«ä¿åããã®ã¯éåžžã«ç°¡åã§ãããæ®å¿µãªããããã®å Žåã®æ¢è£œã®.bãã¡ã€ã«ã®ã¢ã³ããã«ãŒã¯ãããŸãæ©èœããŠããŸããã§ããã ããã€ãã®ãã¡ã€ã«ã解åããããŸãŸã§ããããæ¥æ¬èªåã«ãããšã©ãŒããããŸããããæ¥æ¬èªãã±ãŒã«ããèµ·åããããããŸããã§ããã
ãã1ã€ã®ã¹ã¯ãªããã圹ã«ç«ã¡ãŸããã ãã以æ¥ã Kaitai Structã®ãããªãã®ã«æ £ããŠããŸããã§ãããã»ãšãã©ãŒãããè¡åããªããã°ãªããŸããã§ããã
.bãã¡ã€ã«åœ¢åŒã¯ã·ã³ãã«ã§ããããšãå€æããããã«ããã®ã²ãŒã ããã®ã¿ãªãœãŒã¹ãã¢ã³ããã¯ã§ããããã«ããããã«ãã¢ã³ããã«ãŒãå¿ èŠã§ããã Qlieãšã³ãžã³äžã®ä»ã®ã²ãŒã ã§ã¯ãè¿œå ã®çš®é¡ã®ãªãœãŒã¹ã.bãã¡ã€ã«å ã«çŸããŸãããããããã«ã€ããŠã¯è©³ãã説æããŸããã
ãã®ããã16é²ãšãã£ã¿ãŒã§.bãã¡ã€ã«ãéããå é ã確èªããŸãã è©äŸ¡ããåã«ããã¹ãŠã®æ°å€ã®ãã€ãé ããªãã«ãšã³ãã£ã¢ã³ã«ãªãããšã«æ³šæããŠãã ããã
- Abmp12ãã¡ã€ã«ããããŒ
- 10ãã€ã0x00
- ãªãŒããŒãããæ å ±ãå«ãæåã®ã»ã¯ã·ã§ã³abdata12ã®ã¿ã€ãã«ã
- 8ãã€ã0x00
- ã»ã¯ã·ã§ã³ãµã€ãºabdata12ã4ãã€ãæŽæ°ã å®å šã«ã¹ãããã§ããŸãã
- Abimage10ã»ã¯ã·ã§ã³ããããŒ
- 7ãã€ã0x00
- ã»ã¯ã·ã§ã³å ã®ãã¡ã€ã«ã®æ°ã1ãã€ãã®æŽæ°ã ãã®å Žåãã»ã¯ã·ã§ã³ã«ã¯1ã€ã®ãã¡ã€ã«ããããŸãã
- ã»ã¯ã·ã§ã³ããããŒabgimgdat13
- 6ãã€ã0x00
- ã»ã¯ã·ã§ã³å ã®ãã¡ã€ã«åã®é·ãã2ãã€ãæŽæ°ã ãã®å Žåãé·ãã¯4ãã€ãã§ãã
- ã·ããJISãšã³ã³ãŒããã¡ã€ã«å
- ãã¡ã€ã«ã®ãã§ãã¯ãµã ã¬ã³ãŒãé·ã2ãã€ãæŽæ°ã
- ãã¡ã€ã«èªäœã®ãã§ãã¯ãµã ã
- äžæãªãã€ãã¯åžžã«0x03ãŸãã¯0x02ã®ããã§ã
- ããããã¢ãã¡ãŒã·ã§ã³ã«é¢é£ãã12åã®äžæãªãã€ã
- ã»ã¯ã·ã§ã³å ã®pngãã¡ã€ã«ã®ãµã€ãºã¯4ãã€ãã®æŽæ°ã§ãã
ãããŠæåŸã«ãpngãã¡ã€ã«èªäœã
ã¢ããµãŠã³ãã»ã¯ã·ã§ã³ã®æ§é ã¯ã¢ãã€ã¡ãŒãžã«äŒŒãŠããŸãã
AnimatedBMPãšã¯ã¹ãã©ã¯ã¿ãŒ
# -*- coding: utf-8 -*- # Extract b # AnimatedBMP extractor for Bishoujo Mangekyou game files # by Chtobi and Nazon, 2016 import glob import os import struct import argparse from collections import namedtuple b_hdr = b'abmp12'+bytes(10) signa_len = 16 b_abdata = (b'abdata10'+bytes(8), b'abdata11'+bytes(8), b'abdata12'+bytes(8), b'abdata13'+bytes(8)) b_imgdat = (b'abimgdat10'+bytes(6), b'abimgdat11'+bytes(6), b'abimgdat14'+bytes(6)) b_img = (b'abimage10'+bytes(7), b'abimage11'+bytes(7), b'abimage12'+bytes(7), b'abimage13'+bytes(7), b'abimage14'+bytes(7)) b_sound = (b'absound10'+bytes(7), b'absound11'+bytes(7), b'absound12'+bytes(7)) # not sure about structure of sound11 and sound12 b_snd = (b'absnddat11'+bytes(7), b'absnddat10'+bytes(7), b'absnddat12'+bytes(7)) Abimgdat13_pattern = namedtuple('Abimgdat13', ['signa', 'name_size_len', 'hash_size_len', 'unknown1_len', 'unknown2_len', 'data_size_len']) Abimgdat13 = Abimgdat13_pattern(signa=b'abimgdat13'+bytes(6), name_size_len=2, hash_size_len=2, unknown1_len=1, unknown2_len=12, data_size_len=4) Abimgdat14_pattern = namedtuple('Abimgdat14', ['signa', 'name_size_len', 'hash_size_len', 'unknown1_len', 'data_size_len']) Abimgdat14 = Abimgdat14_pattern(signa=b'abimgdat14'+bytes(6), name_size_len=2, hash_size_len=2, unknown1_len=77, data_size_len=4) Abimgdat_pattern = namedtuple('Abimgdat', ['name_size_len', 'hash_size_len', 'unknown1_len', 'data_size_len']) # probably, abimgdat10,abimgdat11 and others Other_imgdat = Abimgdat_pattern(name_size_len=2, hash_size_len=2, unknown1_len=1, data_size_len=4) Absnddat11_pattern = namedtuple('Absnddat11', ['signa', 'name_size_len', 'hash_size_len', 'unknown1_len', 'data_size_len']) Absnddat11 = Absnddat11_pattern(signa=b'absnddat11'+bytes(7), name_size_len=2, hash_size_len=2, unknown1_len=1, data_size_len=4) def create_parser(): arg_parser = argparse.ArgumentParser(prog='AnimatedBMP extractor\n', usage='extract_b input_file_name output_dir\n', description='AnimatedBMP extractor for QLIE engine *.b files.\n') arg_parser.add_argument('input_file_name', nargs='+', help="Input file with full path(wildcards are supported).\n") arg_parser.add_argument('output_dir', nargs=1, help="Output directory.\n") return arg_parser def check_type(file_buf): if file_buf.startswith(b'\x89' + b'PNG'): return '.png' elif file_buf.startswith(b'BM'): return '.bmp' elif file_buf.startswith(b'JFIF', 6): return '.jpg' elif file_buf.startswith(b'IMOAVI'): return '.imoavi' elif file_buf.startswith(b'OggS'): return '.ogg' elif file_buf.startswith(b'RIFF'): return '.wav' else: return '' def bytes_shiftjis_to_utf8(shiftjis_bytes): shiftjis_str = shiftjis_bytes.decode('shift_jis', 'strict') utf_str = shiftjis_str.encode('utf-8', 'strict').decode('utf-8', 'strict') return utf_str def check_signa(f_buffer): if f_buffer.endswith(b_abdata): return 'abdata' elif f_buffer.endswith(b_img): return 'abimgdat' elif f_buffer.endswith(b_sound): return 'absound' def prepare_filename(out_file_name, out_dir, postfix=''): ready_name = out_dir + os.path.basename(out_file_name) + postfix return ready_name def create_file(file_name_hndl, out_buffer): if len(out_buffer) != 0: with open(file_name_hndl, 'wb') as ext_file: ext_file.write(out_buffer) else: print("Zero file. Skipped.") def check_file_header(file_handle, bytes_num): file_handle.seek(0) readed_bytes = file_handle.read(bytes_num) if readed_bytes == b_hdr: print("File is valid abmp") return True else: print("Can't read header. Probably, wrong file...") return False if __name__ == '__main__': parser = create_parser() arguments = parser.parse_args() all_b_files = glob.glob(arguments.input_file_name[0]) output_dir = arguments.output_dir[0] for b_file in all_b_files: file_buffer = bytearray(b'') with open(b_file, 'rb') as bfile_h: check_file_header(bfile_h, len(b_hdr)) read_byte = bfile_h.read(1) file_buffer.extend(read_byte) while read_byte: read_byte = bfile_h.read(1) file_buffer.extend(read_byte) # Finding content sections signature check_result = check_signa(file_buffer) if check_result: if check_result == 'abdata': file_buffer = bytearray(b'') read_length = bfile_h.read(4) size = struct.unpack('<L', read_length)[0] file_buffer.extend(bfile_h.read(size)) # Adding _abdata to separate from other parts outfile_name = prepare_filename(b_file, output_dir, '_abdata') create_file(outfile_name, file_buffer) elif check_result == 'abimgdat': images_number = struct.unpack('B', bfile_h.read(1))[0] # Number of pictures in section for i1 in range(images_number): file_buffer = bytearray(b'') file_name = '' imgsec_hdr = bfile_h.read(signa_len) if imgsec_hdr == Abimgdat13.signa: file_name_size = struct.unpack('<H', bfile_h.read(Abimgdat13.name_size_len))[0] # Decode filename to utf8 file_name = bytes_shiftjis_to_utf8(bfile_h.read(file_name_size)) # CRC size hash_size = struct.unpack('<H', bfile_h.read(Abimgdat13.hash_size_len))[0] # Picture CRC (don't need it) pic_hash = bfile_h.read(hash_size) unknown1 = bfile_h.read(Abimgdat13.unknown1_len) unknown2 = bfile_h.read(Abimgdat13.unknown2_len) pic_size = struct.unpack('<L', bfile_h.read(Abimgdat13.data_size_len))[0] print("pic_size:", pic_size) file_buffer.extend(bfile_h.read(pic_size)) elif imgsec_hdr == Abimgdat14.signa: file_name_size = struct.unpack('<H', bfile_h.read(Abimgdat14.name_size_len))[0] file_name = bytes_shiftjis_to_utf8(bfile_h.read(file_name_size)) hash_size = struct.unpack('<H', bfile_h.read(Abimgdat14.hash_size_len))[0] pic_hash = bfile_h.read(hash_size) bfile_h.seek(Abimgdat14.unknown1_len, os.SEEK_CUR) pic_size = struct.unpack('<L', bfile_h.read(Abimgdat14.data_size_len))[0] file_buffer.extend(bfile_h.read(pic_size)) else: # probably abimgdat10, abimgdat11... file_name_size = struct.unpack('<H', bfile_h.read(Other_imgdat.name_size_len))[0] file_name = bytes_shiftjis_to_utf8(bfile_h.read(file_name_size)) hash_size = struct.unpack('<H', bfile_h.read(Other_imgdat.hash_size_len))[0] pic_hash = bfile_h.read(hash_size) bfile_h.seek(Other_imgdat.unknown1_len, os.SEEK_CUR) pic_size = struct.unpack('<L', bfile_h.read(Other_imgdat.data_size_len))[0] file_buffer.extend(bfile_h.read(pic_size)) for i, letter in enumerate(file_name): # Replace any unusable symbols from filename with _ if letter == '<' or letter == '>' or letter == '*' or letter == '/': file_name = file_name.replace(letter, "_") # Checking file signature and adding proper extension outfile_name = prepare_filename(b_file, output_dir, '_' + file_name + check_type(file_buffer)) create_file(outfile_name, file_buffer) file_buffer = bytearray(b'') elif check_result == 'absound': sound_files_number = struct.unpack('B', bfile_h.read(1))[0] for i2 in range(sound_files_number): file_buffer = bytearray(b'') file_name = '' sndsec_hdr = bfile_h.read(signa_len) if sndsec_hdr == Absnddat11.signa: file_name_size = struct.unpack('<H', bfile_h.read(Absnddat11.name_size_len))[0] file_name = bytes_shiftjis_to_utf8(bfile_h.read(file_name_size)) hash_size = struct.unpack('<H', bfile_h.read(Absnddat11.hash_size_len))[0] snd_hash = bfile_h.read(hash_size) unknown1 = bfile_h.read(Absnddat11.unknown1_len) snd_size = struct.unpack('<L', bfile_h.read(Absnddat11.data_size_len))[0] file_buffer.extend(bfile_h.read(snd_size)) else: file_name_size = struct.unpack('<H', bfile_h.read(Absnddat11.name_size_len))[0] file_name = bytes_shiftjis_to_utf8(bfile_h.read(file_name_size)) hash_size = struct.unpack('<H', bfile_h.read(Absnddat11.hash_size_len))[0] snd_hash = bfile_h.read(hash_size) unknown1 = bfile_h.read(Absnddat11.unknown1_len) snd_size = struct.unpack('<L', bfile_h.read(Absnddat11.data_size_len))[0] file_buffer.extend(bfile_h.read(snd_size)) for i, letter in enumerate(file_name): if letter == '<' or letter == '>' or letter == '*' or letter == '/': file_name[i] = '_' outfile_name = prepare_filename(b_file, output_dir, '_' + file_name + check_type(file_buffer)) print("create absound") create_file(outfile_name, file_buffer) file_buffer = bytearray(b'')
ã¹ã¯ãªããã¯ãèŠã€ãã£ãpngãjpgãbmpãoggãwavãã¡ã€ã«ãèªåçã«è§£åããŸãã ããããããã«å ããŠãæªç¥ã®imoaviãã¡ã€ã«ãå éšã«ãããŸãã
èŠããã«ãã²ãŒã ã§ã¯ããã¹ãŠã®ã¢ãã¡ãŒã·ã§ã³ã¯ogv圢åŒã®æ¬æ ŒçãªãããªãšããŠããŸãã¯.bãã¡ã€ã«ã«èšé²ããããšã³ãžã³ã¢ãã¡ãŒã·ã§ã³ç»åãšããŠããŸãã¯imoavi圢åŒã®jpgãã¡ã€ã«ã®ã¢ãã¡ãŒã·ã§ã³ã·ãŒã±ã³ã¹ãšããŠäœæãããŸãã
ãã®å Žåãç§ãã¡ã¯jpgç»åã«ãèå³ããã£ãã®ã§ããããã«ã察åŠããªããã°ãªããŸããã§ããã
imoaviã«ã¯ãSOUNDãšMOVIEã®2ã€ã®ã»ã¯ã·ã§ã³ããããŸãã ããããŒã®åŸã®47ãã€ãã®MOVIEã»ã¯ã·ã§ã³ã«ã¯ã4ãã€ãã®jpgãã¡ã€ã«ãµã€ãºããããŸãã ãã¡ã€ã«ã¯ã19ãã€ãã®ã·ãŒã±ã³ã¹ã§åºåãããå ã®åœ¢åŒã§æ¬¡ã ã«æžã蟌ãŸãã次ã®ãã¡ã€ã«ã®ãµã€ãºãèšé²ãããŸãã
ã²ãŒã å ã®æ声ã®imoaviã¯åºäŒããªãã£ããããSOUNDã»ã¯ã·ã§ã³ã¯åžžã«ç©ºã§ãã
ã²ãŒã ã®ãã¹ãŠã®ãªãœãŒã¹ãåŒãåºãå§ããã®ã§ãåæã«imoaviããjpgãåŒãåºãããã®å°ããªã¹ã¯ãªãããäœæãããŸããã
ã€ã¢ã¢ãæœåºåš
# -*- coding: utf-8 -*- # Extract imoavi # Imoavi extractor for Bishoujo Mangekyou game files # by Chtobi and Nazon, 2016 import glob import os import struct import argparse imoavi_hdr = b'IMOAVI' hdr_len = len(imoavi_hdr) def create_file(file_name, out_buffer, wr_mode='wb'): if len(out_buffer) != 0: with open(file_name, wr_mode) as ext_file: ext_file.write(out_buffer) else: print("Zero file. Skipped.") def prepare_filename(file_name, out_dir, postfix=''): ready_name = out_dir + os.path.basename(file_name) + postfix return ready_name def create_parser(): arg_parser = argparse.ArgumentParser(prog='Imoavi extractor\n', usage='extract_imoavi input_file_name output_dir\n', description='Imoavi extractor for QLIE engine *.imoavi files.\n') arg_parser.add_argument('input_file_name', nargs='+', help="Input file with full path(wildcards are supported).\n") arg_parser.add_argument('output_dir', nargs='+', help="Output directory.\n") return arg_parser if __name__ == '__main__': parser = create_parser() arguments = parser.parse_args() all_imoavi = glob.glob(arguments.input_file_name[0]) output_dir = arguments.output_dir[0] for imoavi_f in all_imoavi: file_buffer = bytearray(b'') with open(imoavi_f, 'rb') as imoavi_h: # Read imoavi file header imoavi_h.read(hdr_len) imoavi_h.seek(2, os.SEEK_CUR) # 0x00 imoavi_h.seek(1, os.SEEK_CUR) # 0x64 imoavi_h.seek(3, os.SEEK_CUR) # 0x00 imoavi_h.seek(5, os.SEEK_CUR) # SOUND imoavi_h.seek(3, os.SEEK_CUR) # 0x00 imoavi_h.seek(1, os.SEEK_CUR) # 0x64 imoavi_h.seek(11, os.SEEK_CUR) imoavi_h.seek(5, os.SEEK_CUR) # Movie imoavi_h.seek(3, os.SEEK_CUR) # 00 ?? imoavi_h.seek(1, os.SEEK_CUR) # 0x64 imoavi_h.seek(3, os.SEEK_CUR) # 0x00 ?? imoavi_h.seek(4, os.SEEK_CUR) # ?? imoavi_h.seek(1, os.SEEK_CUR) # Number of jpg files in section imoavi_h.seek(4, os.SEEK_CUR) # 0x00 imoavi_h.seek(1, os.SEEK_CUR) # 0x05 ??? imoavi_h.seek(2, os.SEEK_CUR) # 0x00 ?? imoavi_h.seek(4, os.SEEK_CUR) # 720 ?? imoavi_h.seek(4, os.SEEK_CUR) # Full size without header? to_next_size = struct.unpack('<L', imoavi_h.read(4))[0] # Bytes till next header imoavi_h.seek(16, os.SEEK_CUR) # 0x00 jpg_size = struct.unpack('<L', imoavi_h.read(4))[0] imoavi_h.seek(4, os.SEEK_CUR) # 0x00 file_num = 0 file_buffer.extend(imoavi_h.read(jpg_size)) outfile_name = prepare_filename(imoavi_f, output_dir, '_' + (str(file_num)).zfill(3) + '.jpg') create_file(outfile_name, file_buffer) while to_next_size != 0: file_buffer = bytearray(b'') to_next_size = struct.unpack('<L', imoavi_h.read(4))[0] if to_next_size == 24: # 0x1C header for index part file_buffer.extend(imoavi_h.read(to_next_size)) outfile_name = prepare_filename(imoavi_f, output_dir, '_' + '.index') create_file(outfile_name, file_buffer, 'ab') # concatenate with index file else: imoavi_h.seek(2, os.SEEK_CUR) # unknown imoavi_h.seek(2, os.SEEK_CUR) # Unknown, almost always FF FF or FF FE file_num = struct.unpack('B', imoavi_h.read(1))[0] # File number imoavi_h.seek(11, os.SEEK_CUR) # 0x00 jpg_size = struct.unpack('<L', imoavi_h.read(4))[0] imoavi_h.seek(4, os.SEEK_CUR) # 0x00 file_buffer.extend(imoavi_h.read(jpg_size)) outfile_name = prepare_filename(imoavi_f, output_dir, '_' + (str(file_num)).zfill(3) + '.jpg') create_file(outfile_name, file_buffer)
解ååŸãã¡ãã¥ãŒã®ã¹ãã©ãã·ã¥ç»é¢ããã®ã¢ãã¡ãŒã·ã§ã³ãimoavi圢åŒã®ãã¡ã€ã«1_ã¿ã€ãã«ç»é¢ã ãŒããŒ.bã«ä¿åãããŠããããšã確èªã§ããŸãã
ããã¯ãã¹ãŠã²ãŒã ãªãœãŒã¹ã«ãããŸãã
æ®å¿µãªããã翻蚳ããã»ã¹ã§ã¯å æã§ããªãããã€ãã®äžå¿«ãªãã¥ã¢ã³ã¹ãæããã«ãªããŸããããã§ã«æžããããã«ããã®ã²ãŒã ã¯Unicodeãšã³ã³ãŒãããµããŒãããŠããŸããããããã£ãŠã翻蚳ãããããã¹ãã¯ãã¹ãŠãééã£ãæåééã§è¡šç€ºãããŸããã·ã¹ãã ãšã³ã³ãŒãã£ã³ã°ãæ¥æ¬èªã«å€æŽããã«ãã¡ã€ã«ãããã¯ããã¯ããã²ãŒã ãéå§ãããšãããã«ããã€ãã®åé¡ãçºçããŸããã
ããæç¹ã§ãç§ãã¡ïŒãŸãã¯ãããŒã ã®ç¿»èš³ã®æè¡çãªéšåãæ åœãã人ïŒã¯èããŸããïŒãããããå€ããšã³ãžã³ããããã®ã§ã¯ãªããã¯ãã¹ãã©ãããã©ãŒã ãååŸããªãããRenpyãšã³ãžã³ã«ã¹ããŒãªãŒã移æ€ããã¹ãã§ããããïŒ
ããããç§ãã¡ã¯æ¥ãã§ããã®ã§ãããããããæç¹ã§ãç§ãã¡ãå§ãããã®ããããã®ã¯æ®å¿µã§ããã翻蚳ãçµãã以å€ã«äœãæ®ãããŠããŸããã§ããã
移æ€äžã«äœã«ééããŸãããïŒ
第äºéšã§ããã«ã€ããŠã
åç §ïŒ
Bitbucketã¹ã¯ãªãã
æ¥æ¬èªQlieãšã³ãžã³ã«ã€ããŠ
Shift Jis ãšã³ã³ãŒãããŒãã«Shift Jis
ããUTF-8ãžã®å€æåé¡ã«ã€ããŠè©³ããèªã
asmodean exfp3_v3ãŠãŒãã£ãªãã£