冒险解谜游戏中文网 ChinaAVG

标题: 文本提取导入框架 发布帖 1.6版 [打印本页]

作者: weiyun    时间: 2014-4-19 12:55
标题: 文本提取导入框架 发布帖 1.6版
本帖最后由 weiyun 于 2021-1-29 09:02 编辑
* T- T3 F+ S* ?9 Z
5 {% l# n! d/ l; ~- x  X本工具是可扩展的导入导出工具,可以写插件并放入Plugins目录中,注意必须导出,即可支持其他格式的文本导入导出。目前支持的格式:
/ v6 e- ?2 n4 A* X4 p读取和写入:
# @) v6 b6 _  d1 }% a. K6 k  ]Boomzap bin格式5 |. n* k; z; w% {6 f6 |
CraneBerry bin格式
$ |/ t1 j7 G. GLUA字节码
  x( l3 x% F2 V# Y  q0 b, W制表符分隔格式
& Q# X) h8 _$ H; d6 w  c导入导出的目标格式:. a' ?8 \% n* o9 J* J2 N# f8 K
Boomzap bin格式# I- Z0 e5 o4 V0 ^) r, i
制表符分隔格式
4 ?2 O! a6 E8 ]  O# N9 ~) \Broken Sword txa格式+ s; }4 ~. |6 y  f! W9 l
猴岛2的文本格式
( R& C7 W5 `5 e$ f& BTelltale landb格式
! H8 k. E" w( L% Z" p* H! l1 @Torque DSO脚本格式
: u' l+ g* t% p* M! CCall of Cthulhu的xbd格式$ y7 W) l: w" F9 M# K

" D0 F1 L8 P$ c; R更新记录:0 q/ h+ ?5 a& \" z4 A
1.0版:原始版/ z9 u% p. z9 z

$ q5 X/ W0 C4 l% I1.1版更新内容:修复若干bug9 O0 ]; R6 G; ]5 j) }6 R4 {
支持Tabagames的文本格式
' g& L/ ]' i) w
% ?% `+ M) ~. b, F1.2版更新内容:2 d4 p5 a: o& B% f! S" d1 C1 S1 Z1 @
支持的Puzzle Lab Lua文本格式
) J; {2 l& t& x. d2 a
0 b( n& C6 s% ^; W3 @* d% b9 I2013-09-08
$ T: F/ g5 y7 o* ~% z# _* b6 G1.4版更新内容:' ]' |, Y3 N# S, I; n+ V$ B1 Y8 B
支持Deck 13的旧版格式Pina StringTable和新版格式6 m6 [3 o& O! o
支持猴岛复刻版文本格式9 G# g5 f9 y) e& U" H& t
支持Farm Frenzy 4的lbin格式
- o3 k) q% g2 k" Q支持Evy Magic Sphere的LocDB* `) |! n' K: Q* N! Q
重写代码支持批量导入导出打开和保存功能,提升加载速度
$ y5 e) k5 b* f
3 o. [: y: w+ [$ t* G7 }9 |- R+ O1 h) m9 `2014-04-19
- J9 a, w5 Y& d: E1.6版更新内容:支持Broken Sword txa格式+ K# N7 A1 [/ Y; h
支持猴岛2的文本格式5 Z! a+ h2 U: i( A& r+ m
支持Telltale landb格式( d/ a4 f7 @  w
支持Torque DSO脚本格式$ m$ E+ @& `; P- M5 m6 J1 L
支持Call of Cthulhu的xbd格式
+ c/ S' N* M3 b, |; B: S) @: N修复id冲突bug* m- v1 \2 P; g3 f! T# Q' I
2021-01-29, O7 n9 y) E2 |
1.7版  i5 ~# F* r- @3 A8 f
支持Monkey Island格式和Broken Sword 2 CLU格式
* d3 \, L: {. h, J* S+ z7 c% v) s6 T8 i
源代码和exe(1.0版):4 N" s! g7 ~( B1 h7 u
[attach]32765[/attach]- n7 k8 t. S) J/ l+ L
1.1版exe:
: p0 H6 ?  Q$ b9 ]& p, M$ [3 i& v[attach]32766[/attach]. ?7 @8 _5 u( ?  }( P- Z
( S% G. k5 r. b% }: g- y
1.4版exe$ h6 I- _+ }& o4 S3 ?  [2 C6 f4 y9 z
[attach]32767[/attach]% E8 s1 j- o' ?; b; r/ i8 r% G+ I' O
2 i; j1 ]# \! _/ h4 _* X( m
1.6版下载:' Z8 i; K, E. Y& k) u& Y1 w. P
[attach]32768[/attach]
1 v1 ?" l3 n, D  p5 s
3 ]% H2 X! x0 Y/ ~" O插件开发要求:( t! J# O# Y" k" u1 Q

1 c0 |9 J0 G6 R" x插件需要符合以下接口
  1. public class StringRecord //只有ID和Text是必填的8 r& `+ p2 T7 N9 z
  2.     {: d6 K0 r7 [7 v! i
  3.         internal StringCollection Parent;
    . ?6 h7 c" E3 P5 I
  4.         protected string id;
    3 ^$ Q9 i6 H5 K2 _
  5.         public string ID{ get; set; }
    0 k& {  p! c5 s; m. j% |/ Q
  6.         public string Text { get; set; }
    1 r) M" X9 k& ?
  7.         public int IDOffset { get; set; }
    8 l( u. w$ R; n+ W& \# Y9 v
  8.         public int IDLength { get; set; }
    + F( H) e- b9 ?7 H) d
  9.         public int TextOffset { get; set; }
    . t: W, g( j/ I$ l! S$ y
  10.         public int TextLength { get; set; }. A: @& L9 p0 S  H! Y
  11.         public int Index{get; set;}
    ' B9 F4 Y3 L. h' i% U  \

  12. 9 J/ m" h$ B! N" B
  13. " _9 n* m3 P. s, }
  14.     public class StringCollection : KeyedCollection<string, StringRecord>
    ' E9 z: u3 Y1 n1 W) ^
  15.     {
    5 S" ^8 [! W9 Y7 J4 m( {
  16. ...
    " x0 E- ]* m- R$ n
  17.     }3 D- t$ o* W' R2 E6 C% K: k
  18. 1 r9 a- W) n5 }' t2 Q% h
  19.     public interface IText
    ; s, u# \3 C+ ?; g. ?7 A
  20.     {# d) W% @# V* `, ~6 \. z5 J
  21.         Encoding Encoding { get; set; }; U6 ?+ X% _: f  K; h3 m- ?
  22.         string Name { get; }
    , S" z" G. |/ N9 _
  23.         string Filter { get; }. m* Q/ A+ W+ ?8 d' e* u) h. r
  24.         string FileName { get; set; }4 W- Q9 i0 B5 ]) U9 v) N7 V
  25.         void LoadFile(string name);  T  K( b2 y6 Q- I- C; E
  26.         void SaveFile(string name);; A' e2 |' E9 `3 o
  27.         StringCollection StringTable { get; set; }: N* ~1 M3 \2 V$ e3 q$ V1 ^; l
  28.     }
复制代码
以下是示例

  1. ( k" U5 f+ e/ M2 |% v4 R1 }
  2.     [Export(typeof(IText))]9 u2 m' n* s- \! n6 F8 z
  3.     [ExportMetadata("OriginalFileNeeded", false)]8 B% B6 G! Z* p" W5 P
  4.     public class BoomzapBin : IText/ s8 G! ~+ X/ p# U
  5.     {
    , F* h5 t/ u0 Y* S! Y6 @
  6.         string flag;
    " x/ j# v) S1 D/ N0 D* J
  7.         public Encoding Encoding8 B6 c! q# Q+ F) S9 o: ~
  8.         {
    # B1 A8 `' p/ V' B, e, k) Z2 I9 M
  9.             get% j+ x7 n& b, I& r5 [5 i% B6 g
  10.             {
    7 q2 j* c2 X7 R+ Y/ U
  11.                 return Encoding.Unicode;
    ! s2 }. G5 Z# \9 M0 q! o
  12.             }
    - G6 R# m. {1 Y: D9 J* b- |5 l8 Q2 x
  13.             set
    ( J0 E# ?. i: s$ ^; Z: x  S
  14.             {# {9 r8 x2 {8 {/ Q' f3 x+ a
  15.                 return;& O3 u' d. Y0 N( |' g2 N
  16.             }( b8 }' }& ?0 {: L  b% K1 k" P7 X6 d
  17.         }/ T& K( Q7 l/ b( x( K
  18. 3 G) Q3 _! w) w# v. T9 q
  19.         public BoomzapBin()
    : r5 P) {. v% r2 `2 j4 H5 `
  20.         {
    - w$ U0 {/ S- J
  21.             StringTable = new StringCollection();
    ; y" l3 v$ B5 d5 O' ?- W* X
  22.         }4 k9 Y; w, x8 q- n$ X' ?

  23. 4 h( m% U% {& }9 k% D3 _( r+ q
  24.         public string FileName { get; set; }+ x/ p1 {6 c) i4 A! u

  25. : _! X% K9 h5 n4 I- ^( l
  26.         public void LoadFile(string name); F1 c+ r, j& e8 \: H$ U+ d
  27.         {) e; @4 m- S+ C# z+ _0 B7 K) _" E. Y8 K3 W
  28.             BinaryReader br = new BinaryReader(File.OpenRead(name), Encoding.Unicode);
    ) i  J3 }0 t2 q) E% Z' U: M- W
  29.             flag = Encoding.ASCII.GetString(br.ReadBytes(4));/ E: x% k2 D" x3 K- m8 L
  30.             int key, value;
    9 i" M6 N* l3 E# v, d9 i
  31. ! Y6 {% y8 P+ r  V+ F; |5 Z. F) R" x7 Z
  32.             while (br.BaseStream.Position < br.BaseStream.Length)/ I* u0 g, v/ R6 R1 I% S
  33.             {
    5 C2 i  E3 q& ]: S+ ]  Q, t
  34.                 StringRecord sr = new StringRecord();3 k# m& ]2 W( H! [
  35.                 sr.IDOffset = (int)br.BaseStream.Position ;3 y4 s+ m, a2 K
  36.                 key = br.ReadInt32();% E0 q9 b+ q2 ^3 }/ m* l6 z
  37.                 sr.ID=new string(br.ReadChars(key));
    7 v  P  E/ G% |) C+ y
  38.                 sr.IDLength = (int)br.BaseStream.Position - sr.IDOffset;
    * q, ^5 N" Z' G$ x, s8 i4 ?2 x
  39. ) d# [* _2 A/ v$ i
  40.                 sr.TextOffset = (int)br.BaseStream.Position;$ z0 ?) B7 a+ q' ~' {, ?9 w# v
  41.                 value = br.ReadInt32();- ^% i* x! Q$ T/ g0 ?
  42.                 sr.Text = new string(br.ReadChars(value));+ A; K* q: e( p; Z6 p. B- G2 b
  43.                 sr.TextLength = (int)br.BaseStream.Position - sr.IDOffset;
    8 Q. l( s% |2 b  Y6 \
  44.                 StringTable.Add(sr);
    7 v0 Z- _& \9 y7 s- S# u
  45.             }7 f/ w3 Y% G  p$ |' x! E4 y
  46.             br.Close();& i" N: R( K% U6 v
  47.         }9 A- h; e9 E  e
  48. 5 Y( _+ Z7 y% S, L) A4 {" `
  49. 3 H0 V# v. e" j( n+ b
  50. . V8 Z6 q! I( A5 x. o
  51.         public void SaveFile(string name)( O5 ~3 v/ b$ b7 v5 {
  52.         {; Z4 b/ M. A" H# f. E5 h3 |- c
  53.             BinaryWriter bw = new BinaryWriter(File.OpenWrite(name), Encoding.Unicode);
    , A0 m3 t+ ~6 f9 i7 m$ f
  54.             bw.Write(Encoding.ASCII.GetBytes("bcol"));8 a+ b4 r# _  ?' w4 i: D+ n5 c
  55.             foreach (StringRecord sr in StringTable)) G( [% c7 [7 @: A% q# ^
  56.             {
    " S6 V" Y! h4 b4 @$ O) ^
  57.                 bw.Write(sr.ID.Length);
    ( I, @; U* f7 t3 O& E; _+ y' N
  58.                 bw.Write(sr.ID.ToCharArray());. u1 ^* r* \  ?  a
  59.                 bw.Write(sr.Text.Length);
    * v: d/ W5 O8 R, R
  60.                 bw.Write(sr.Text.ToCharArray());0 k0 f3 ]9 a  _* m  H: M( g1 I- z- O
  61.             }) o6 r' C# k9 S- J
  62.             bw.Close();; ^9 C  }. ?" Q- T& X
  63.         }
    2 w3 L) a, m# D

  64. 0 g2 l; U8 _. s
  65.         public StringCollection StringTable { get; set; }/ X6 B; x; _  e% S
  66.   c9 R8 U. X+ i: O
  67. 2 I3 x* w" K( \: u2 N0 U
  68.         public string Name
      s& W2 c3 t# E" H  `3 x
  69.         {) D5 U6 ~$ w" J8 {0 f8 M$ J1 }
  70.             get { return "Boomzap Bin格式"; }
    - w# E/ I/ e8 s+ ?* K8 w0 o2 F8 V
  71.         }, R: w8 @. N. K. @

  72. * x3 C+ N6 S: {. X1 G. Z5 y* |
  73.         public string Filter1 m* u/ Q: M1 W, |& j; ^4 d2 e
  74.         {. S" @) F) s/ b7 m: Q* {9 v
  75.             get { return "Boomzap Bin|*.bin"; }
    7 R/ n' t4 m8 Q# v/ K
  76.         }
    . {% X! F, A" Z0 F' p6 O& M3 y
  77.     }
复制代码
/ a' R7 t- z0 i" \: j% U

作者: myq495    时间: 2014-4-19 15:40
感谢分享技术
作者: davidgbl    时间: 2014-4-20 21:08
这些工具真是太有用了,感谢weiyun好同学。辛苦了。
作者: APT    时间: 2014-6-14 16:15
syuusaku 发表于 2014-6-14 11:38 / o8 W- v9 R1 r
How are you?0 b! n# P# ?0 Y) @, q# a
I'm sorry. I'm a Korean and don't write in China language.
* S; H; t! x. l, Z+ P; EI use this tool "文本提取导 ...
8 c* g7 S5 V: Z- H1 M4 x/ p
哥们竟然是韩国人,惊讶中。。。。。。  L) b1 n5 Z, W: j% f" v9 }, F8 u
  E. k6 }: J2 c: N0 P
这是流越界异常,程序本身应该是没有问题的,试一下按照utf7格式。
作者: 恶魔出没    时间: 2014-6-14 22:31
不明觉厉!!!
作者: weiyun    时间: 2014-6-16 13:52
syuusaku 发表于 2014-6-15 13:26
# x$ u+ Q+ F4 w: K2 CI try to UTF-7 and others setting....
" M' \- v7 `. N6 c: OBut all same result...
; H0 j0 |- Y! n: q, XOnly that game is happen it.
1 b( I& f# A6 g. }: Y" H  Z
Could you please upload your english.bin so that I can analyze it and make a fix.
作者: shane007    时间: 2020-12-18 18:23
顶上来
作者: shane007    时间: 2020-12-18 18:26
其中lua字节码就是nd用的
作者: shane007    时间: 2021-1-29 08:52
选lua字符表




欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/) Powered by Discuz! X3.2