RipFiles Console/Prototype Version
. Y& C4 B' x$ n1 G& Q' u( OV0.02.071103
% q( L( |/ Z* y6 _
7 V3 f! `9 y0 P( W3 F* a
) @4 I |" V! J F5 l3 H最后更新于:2008年2月25日(星期一)
! B% h0 D0 `$ W首先,这个是一个用来解开各种游戏的资源包的程序,但是每种都要一个对应的插件才能正常运行,嗯,就像SUSIE还有汉工做的那个CRASS之类的类似的工具吧。最初做这个程序的原因嘛……,因为之前在为汉工的那个CRASS做插件的时候,无论如何我都做不好的样子,总是运行失败。后来,在一次和汉工对话时说一句话提醒了我,(原本谈的是什么内容我已经完全全忘了,只是记得大概是关于所有的文件读写操作都是通过主程序,再调用DLL来完成这类的话题的吧),于是我突然想起了很久以前的一个想法:
6 {4 o- _/ R5 g9 |4 R& [+ L) D: ^
+ c" u$ v0 o+ g/ D0 U8 Z& N( l如何使用最少的代码来描述和定义一个资源文件包的结构和信息,这样子就可以使用极少的代码来操作各种文件资源包了~~,甚至只需要使用一个INI文件来定义一组信息就可以进行解包操作了。
/ p3 }+ G- Y7 |$ I' T4 R5 B, t/ C' W# G2 t6 Q% d8 n
突然就这样子想到了方法:原理就是只要让主程序来进行所有的读写操作操作就可以了,而插件程序只要进行数据解释就可以了~,于是按这个思路,这个工具就这样子出现了……
2 s4 L, r* D& y3 ?% z; R3 J- @" t# b7 C% j6 J
虽然现在这个东西还只是Prototype(原型版),也只出了一个DOS版,不过DOS版的好处就是可以让你专注于系统和数据结构之上,而不必管WINDOWS界面那繁杂的设定。预计以后会同时推出DOS和WIN版的,现有的核心的代码都是完全可以脱离出来的。两个版本可以使用同一个内核,所以一般用户可以使用WIN版的,而插件开发人员可以使用DOS版来进行调试信息的输出(本来我的PROTOTYPE版就是用来调试用的……)) ^1 f% R2 {) B9 b! \' [6 x7 }' Z5 r
9 ]* F# S/ r6 y* R
- Z, h$ O* t7 ~& Q1 W6 V3 p
8 U4 A, }0 \/ H. U0 M$ e$ _6 m
命令行参数说明:1 V' J0 G- w5 r& H
. Y. A- j6 ?$ b
& u$ H& D. t! x- E2 n1 l; C) \: B0 _
注:部分命令在WIN版中也是通用的。另外,命令行参数也是可以被传递给插件的,所以你可在插件中定义自己的命令行参数。* Z. L% t; w; a8 |- b. w9 w
RipfileD Packetfile [-o Dirname] [-f pluginname] [-p pluginpath][-i] [-e] [-d] [-c] [-a] [-h]
4 e( }0 |* p0 |1 J3 O Packetfile 文件名,现在还不支持 '*' 和 '?'! G( c$ Q" I+ p _2 R/ k: H7 I" F w
-o 解开文件保存在 Dirname 中
/ h( Z. H8 Q5 O) G, I" Y -f 指定只使用某一个插件) t$ x1 U. Y- t/ Q2 D/ x, C- v
-p 指定插件所在目录,不指定时所有的插件是存在于当前目录下的plugins 目录下9 a9 ~- _7 n/ R
-i 当有插件配对通过时显示插件的相关信息9 D' a6 S4 ?, l' R9 {0 {
-e 显示目录项的数据
9 m+ `5 D5 c& O2 ~* r+ [ -d 显示调试信息+ Z2 |) ~: i& p# z/ R* l7 N
-c 显示一个设置对话框' ]- x, Q1 C, d
-a 强行保存一次原始的数据(使用原有的文件名),不管是否插件能对数据进行解释。(用于DEBUG及需要原始数据的场合)
- ^3 `: t, P1 d4 H { -h 显示这个帮助
0 Y' J7 | a! F8 p) h
2 ^, s6 J* b: k& X: P2 A7 P- v
3 F' }" r& i4 a( l
+ t3 P, w {3 i; ~开发计划:% X ?: F n! ^( V% `, i5 | J
' [ P5 `# l( U# j9 u; S
+ s2 J& |* \: s! L
由于种种的原因 现在这东西,现在只完成了一个 Prototype(原型版)现在这个版本只完成了预计功能的60%……,而在已以知的未来的一个月内是否还有时间写我现在都还不知道,所以……
8 G7 O7 E: b8 t* z! P- [% _以下是没有完成的内容:
3 i8 [0 U( w2 d( T插件的命名规则还没定
" @* D6 E% @8 ?6 K* e8 J( mRIP插件支持:未完善
1 e( u3 \# r1 _INI插件支持:未完成
1 g$ h7 R( s' @% D" H# z9 J汉工的CRASS插件支持:未完成
. j- D' k0 [9 K EWINDOWS版制作:……
: E3 d, Q0 {& |! s2 D' V
. m5 z( F; n& m* n
. x: ~+ L! Q+ z* Z0 P: h6 o三插件版打包下载
. G8 P. L, g6 m
% o+ e5 ^, |* W 把左边图像目标另存为 RipFileC.rar. i3 B5 ~# }7 C2 ^( a4 i
包含0.02版的程序和三个插件1 U4 h, \& x8 J9 t3 U
ActG插件关于此插件和游戏的介绍见此:http://blog.sina.com.cn/s/blog_571b19a001000ahh.html
$ Z8 M6 c8 }' l8 q0 X) LRbo 插件 用于解开 Ragnarok battle offline 的封包的程序(支持到EX3版本,本来是为了汉化而写的,但是……现在看来这个项目已经没有爱了)
1 f8 B% l# |! mRbo_cg 插件 用于 rbo 的CG文件的解释,这些文件在存档目录中存在。注意:这个插件是处于不稳定状态的……' E3 b' L' |$ O, K: C7 [% O
0 @6 X; @) A/ c6 Y$ j/ |MO下载 http://pickup.mofile.com/7016561194314813 - b) K3 ?- R; ?7 B" I% ]
插件示范源码下载 ActG插件的源代码(在VS 2003平台下开发)
3 G/ Q9 Z u( }, X2 d( H# Y4 d c& v6 @) B' R) \/ L
存为 Actg.rar) D! T& P# S5 Z! C- c! S. g1 I
* ]/ Q: X7 c, x, {MO下载 http://pickup.mofile.com/0607492233855083
- ?9 S. L+ A6 SSDK 开发包下载 v0.92 配合以上源码及开发你自己的插件用。, Z4 |% e6 [: [+ N
. y! v2 G" X6 n7 `0 ~% V
存为sdk.rar% F; Q3 f8 |) ^, F8 }! h6 A/ e$ ?
+ o v3 L. G2 h. c# B6 V
MO下载 http://pickup.mofile.com/6472507050765381& x* x0 r* R$ R* g
8 n4 [0 |, Z. E2 l6 B7 V+ {7 y/ K6 P, Y8 i1 v
插件制作说明:/ Z# D, e! L& R+ d
现在暂时只支持DLL形式的插件。
, k2 N0 ?5 ^: ~/ i0 X* q& m4 z在你的项目中stdafx.h 包含"common.h" 这个文件即可。
6 M' @/ V6 I5 z4 R | M0 ?! |相关接口和说明请看common.h文件中的定义即可,其中有比较详细的说明。
. _) q1 n. Y6 p* Q( r) p, n8 y你也可以参考ActG 这个示范用的源代码。这个是开源的,里面我写有详细的注释。; f: h; B7 _2 s
插件接口定义:" @$ A% n! f- A4 Q- e
. f% ^/ B, v; | n! X7 v, ~8 ?# ~: J* Y. _- a) `; X0 B, p& }
RIP_API struct Information* GetInformation(void);% @! n" s: b- G! Z4 f
; Q# y& \% @# Z! d" m6 q# Q+ t' r9 D/ F' s2 O/ I" \2 O) w
RIP_API struct RipOperation* RegisterRip(void);
1 `6 l/ b* Q4 F) E! C8 t* ~2 Q X; }0 Q% U. N- g8 B- c
以上两个为插件公开的调用接口,请按要求进行添写相关项目即可。
/ P( a1 X& ]+ [# I) i* K$ H5 l. c3 {主程序根据 RipOperation* 返回的结构确认插件所能提供的功能,并按一定的方式进行调用。
, ~& I' @ V/ R6 V- g
8 A" e7 | X# Q+ f2 \) n3 g4 R8 a插件的基本调用流程如下:
f7 e. K: O' y! Z进行准备工作。5 G; S+ o5 w; K5 g; {1 b
void (*PreRunning)(const char* , struct CallBackFunction* );
5 z7 J; |; T6 `6 t# Q* f3 i传递命令行进行处理。9 K- s; L, Q! m1 X
void (*ParseCmdLine)(int argc,TCHAR* argv[]);
* A! \8 G9 L7 M- @; p& ?8 {* v测试插件是否支持该封包( e" e s- f% S: B7 y
struct PreData* (*PreMatch)(struct packageInfo*); r/ z) K* t, V' r: }* w% v
int (*DoMatch)(struct packageInfo*);
2 S& L2 ?" i; d6 x2 F3 x2 i如果支持,进行目录项的解释
" l+ j' R6 q% F7 H# C' V struct PreData* (*PreEntries)(struct packageInfo*);
8 w8 ?3 r# \- V; | int (*GetEntries)(struct packageInfo*, struct EntryData*&);. N2 l% h, o/ U' r
得到目录项后开始根据目录取得数据,如果数据进行了加密等处理,再进行一次解释9 q- _6 H: d3 H0 Y8 ]
struct DecodedData* (*GetData)(struct packageInfo*, struct EntryData*); + z7 |; S* P& l' d# g
int (*GetData)(struct packageInfo*, struct EntryData*, struct DecodedData*&);
& m) m, }$ p" H5 `+ w3 I释放插件,进行数据清除工作。(如果 DoMatch失败,就可直接进行到这一步)& _0 Z1 v5 p" r6 T, L9 g/ C
void (*ReleasePlugin)(void);, T6 \: X+ ?5 ]5 H5 Y3 B
如果存在多个插件时,对一个文件轮流进行以上操作。真到插件全部试完。# [ y: |5 q# _9 F7 S6 q5 j/ l. |# D
* s/ R' U. e; v/ g根据封包的不同,功能有些可以进行省略。有些不是必要有的,例如各个Pre函数,有些项目是必须存在的例如 DoMatch和GetEntries,不提供这些函数时会被认为插件不造合当前
" u! C! g# h @9 O$ a
$ ]8 o0 e( Z5 A& y封包。不使用的功能请添写为NULL即可。
. E3 F2 f ]! x) s+ G具体的调用方法和函数的原型请看示例代码,里面包含了所有的可能的功能了的。. a2 K/ O; U: J3 D( k* [. c% _
. V9 G8 S* v' W2 B) I关于rip插件5 R3 n, H0 J7 n7 z O
rip插件的定义
$ b) ~: y- K/ k: h插件名由rip开头(注意小写字母). @: v- H5 q2 t g2 I: x
match操作一般总是返回MATCH_SURE。2 n8 b7 C' t2 _' w. r" w
能打开的文件操作是*.*(即可以打开任意文件)
3 }( n; K ~5 k1 L u! m; F4 t用于在对文件的格式不知情或者非常少资料的情况下抽出某一种或者几种类型的文件用
# N1 {' ~, s9 C2 d6 T' t) C例如:直接抽取BMP,WAV格式的文件用。( c, y/ [' S2 @/ N: C
此种插件的调用方式和一般插件不完全相同。
& D8 ]2 @: O- g! G: j7 m5 ?. |. i/ @, x1 `; }4 E3 u" o* ~
5 v: s' T) b+ v1 H) P2 t, T* P q# }2 l
更新列表:
8 b6 L r1 ?7 t+ W2007年11月3日(星期六) c" Q; m6 |; U% T' M' V
1:版本名称修改, Dos/Prototype version 修改为Console/Prototype Version
5 A$ A2 ^" H6 K, X% k2 A9 V4 y用DOS这个名称已经偏移其定义了……. u, Z" ~6 N$ \% E6 `
插件参数传俤值见 ruledefine.h
: M6 c; r9 p/ h( c h6 d4 q2:-a 参数功能修改。
2 H& e, |- c2 K' _$ S! L8 q默认为在能解压并且不失败的情况下(parsedata 功能定义并且返回正常)只保存解码后的数据。: K8 ^5 y# L0 j0 h" C& m7 A
只有当指定了此参数的时候才会保存原始数据(RAW data)。
e) X4 x: x* T; g' q4 i9 ?0 o! I0 E3:pasedata 返回funciton no exist 时不作为错误处理
7 `- P/ n8 [- @: d% H+ u' _$ g4:当插件版本高于当前版本时会提示功能未定义。
& t: `) o# w6 y# o4 T0 Q; B
0 o2 p1 y) M5 z# T% y, W2007年10月18日(星期四)! o; _$ e2 t1 O: M9 \
新的命令参数 -p 用于指定插件所在目录(不指定时默认为当前目录中的 plugins 目录
: u! G; f+ v5 C e1 |如果指定了参数 -a,但是解压函数返回出错时,会自动保存原始的RAW数据 P/ k# }! W9 V5 n3 K6 p8 G1 U
3 l2 @. Q- @! c: y/ K
2007年10月7日(星期日)8 ^* p6 d: E- f$ X0 C
命令行传递完成4 u8 h/ J7 s0 f# T1 G( p
路径处理完成。
% m4 t% I, f* z* y5 ~指定某一个插件运行完成, t0 ?( T. ~7 ]3 n# y9 e ~
CLoadPlugin 改名为 CPluginsLib3 h3 i% o: p0 i
CallBackFunction 在需要的时候才会被提供。( s! ?' G# D# f" M( S7 R/ Y
所有的返回的定义被定义到 RuleDefine.h 中
/ B" ~* F- H- \# Z" v规范了函数的返回值。定义错误返回代码。5 ?: L& c( l+ }( f& Q
out dir 没有 \ 结束时出错。0 l5 H6 j. n6 Z9 g; q
对RIP类插件的支持完成。RIP类的插件只在指定使用时才会被调用。其他时会自动跳过。
5 F3 R: ?. k2 c! J7 m9 A P: U1 {' E! x( A
2007年7月4日) p M/ W6 \8 [+ L# s: h. \. ~
第一个原型完成。世界开始有光……
: c2 B5 G) h9 e$ Z# O- `8 S3 o7 J! _
( o& ~) Q* @- t, ?2 B
5 `- c. C/ M- g好了,十分感谢你能看到这里,一个好的插件软件需要有大家的支持才能放出光彩……所以,感谢大家的支持。1 f( d$ o7 C/ k# e% |; M
1 U# Q4 U# }; a/ N: h* \by blues city# N, T( R5 d* U
* l1 F6 f' [" s# ~2 _/ Y
/ W/ ~' x' ^+ h V4 d5 x
原贴
# c- @3 M. w5 L( Yhttp://blog.sina.com.cn/s/blog_571b19a001008fpg.html |