设为首页收藏本站官方微博

汉化教程 【转】DirectX 9 游戏汉化详解

[复制链接]
查看: 3076|回复: 3
打印 上一主题 下一主题

[汉化教程] 【转】DirectX 9 游戏汉化详解

跳转到指定楼层
楼主
发表于 2011-1-30 14:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【转】DirectX 9 游戏汉化详解

本帖最后由 shane007 于 2011-1-30 14:13 编辑
( \6 Y7 O; C" {* i: ~
& R5 j( ]7 C9 t8 a: d8 C% v; l! z: I; c作 者: noword_forever
2 A7 K" c  ~! t3 M& T, S& h3 P时 间: 2010-05-25,14:52:51- s! @+ _' O7 O2 v. u* n
链 接: http://bbs.pediy.com/showthread.php?t=113739
% @& u: s' r" _) t4 l) U/ a  E2 Y, n
/ [9 x+ r$ J% I& ~& Q7 [【文章标题】: DirectX 9 游戏汉化详解
( r' Q- \, h! `. K- M2 P" r% I【文章作者】: noword
. O7 V4 a2 E3 Y1 R& W【软件名称】: 无厘头太空战役
5 [( _# J* N" W9 Q4 Q) T【下载地址】: http://www.verycd.com/topics/2819995/- P& T  o; S. _; t. _" Q
--------------------------------------------------------------------------------
( B# u) o4 _9 V& L# `& f( T. t  【前言】
. R  R1 V1 W9 G  f4 R. B  先copy一段此游戏介绍:" T' X, B& |# a
  
. N: f6 O% j3 g* S  这是一个独特的战略游戏,具有即时战略与塔防的混合风格,玩家将扮演庞大太空舰队的最高指挥官,你可以自定飞船的构造,摆放飞船的位置,下达命令,然后观看绚丽的射击与爆炸。移动和爆炸时会有动态模糊效果。支持自定义地图。! v, S6 f; M- ~5 {' m8 f
  # a7 a' t, L' v6 A
  想玩中文版,两个游戏论坛,3DM和YX上,都有人说要汉化,等了几个月,没有下文,说是技术原因。于是决定自己来试试看。
& h8 I3 O2 e7 X$ L+ M4 \% E  # Z1 d; B% \8 T7 |9 M0 A* N
  
4 E. n* E- P. ]4 u  【困难何在】- h) Q# L% M0 e
  此游戏的文本都在data目录下,都是明文的文本文件。修改data\strings.ini,将& h% U- C/ _$ V1 v
  
3 D' j! K5 l% H0 I/ W: q5 z3 G' x4 F代码:
/ a6 ~2 Z4 V* W, u, A8 N. C; T  MAINMENU_QUIT        = "Exit"
' g, P- b  V" G* H9 }/ a  % P9 C; |. J- I4 @* H' s
  改成) }+ l! W$ o; D/ n
  3 i( E! T  n$ U! y
代码:
% A' v3 P! I; N  MAINMENU_QUIT        = "退出"# x& l5 l& H1 `9 w
  ! t9 ~4 X' b' i5 c. e- g; y
  " u9 a% l- X2 I% p. a/ r
  进入游戏后,不出所料,无法显示此中文。  C! I& q" z$ ~% G5 W9 c
    E& H$ N! \: l  {
  茫茫多的游戏爱好者,在尝试汉化某款自己心仪的游戏时,都是死在了这一步——找了半天文本资源,然后翻成中文,满心欢喜和期待的进入游戏,面对的却是一堆乱码或一片空白。满腔热情,化为乌有,无可奈何,黯然神伤。4 |. U' g. L1 ]8 z$ v
  
# d4 d9 @2 P$ s  本文的目的,就是希望能够帮助这些有志于游戏汉化的同学,主要介绍了如何让一个英文的游戏,能够正确的显示出中文。
0 q% L5 l4 C- @9 S# f- [6 A  + F' \' K7 F1 h1 M4 Y3 ^
  " K7 f8 w2 K0 @6 a( `- _9 v: R
  【调试分析】
0 ~" ?9 ~9 p1 A- M  DirectX 9游戏的启动流程是这样的,先执行Direct3DCreate9,返回值是一个IDirect3D9句柄,然后执行IDirect3D9->CreateDevice,得到IDirect3DDevice9句柄。
$ C9 k, e& C& m, n) Q% Z  有了IDirect3DDevice9就能使用DirectX 9的一切绘图手段,而我们最关心的就是能够使用D3DXCreateFont来创建ID3DXFont,继而能够非常方便快捷的在游戏中显示文字。' R" V6 ^2 N% X
  
9 u; O* @& Y+ Z; `% i  用ODBG载入游戏的exe文件,“查找所有模块间的调用”,找“d3d9.Direct3DCreate9”:+ v# M9 e( A( G9 j
  0 n0 }9 C; u( J( E2 k- r4 e
代码:
, ^# b, a, U7 R) i* ^! x' e  00501974   .  BB 500A5400        mov     ebx, 00540A50                   ;  ASCII "Initialising 3D Engine"
! }7 e8 U- e: o. c- G  00501979   .  E8 22130000        call    00502CA0
9 q+ E% c1 b8 @/ k/ i! U! w  0050197E   .  6A 20              push    20) q5 |5 c. K$ e9 b: U" ~5 _, g5 ~
  00501980   .  8977 18            mov     dword ptr [edi+18], esi
$ g4 g' W4 Y- }/ `  00501983   .  E8 2E8B0100        call    <jmp.&d3d9.Direct3DCreate9>
3 y! r$ q2 `2 H( V' Z# u+ x2 G; h* B  00501988   .  85C0               test    eax, eax5 {, I- b& G- o. |
  0050198A   .  8947 10            mov     dword ptr [edi+10], eax         ;  edi+10 = 58d550% |  O- f# a4 l" E- v: N
  
' U5 x0 n* K; B1 C  往下找,就能找到IDirect3D9->CreateDevice:
; d: _2 ^1 p! V8 o$ d: |3 }  ) p/ }# _7 @" g) ?
代码:
9 j( @, Q" |% f  00501B4C   .  8D77 14            lea     esi, dword ptr [edi+14]
- n! ~! a. n* R  G  00501B4F   .  56                 push    esi                              ;  58d554  => IDirect3DDevice9: T3 O0 Y0 ?# L. y2 W
  00501B50   .  8D4F 40            lea     ecx, dword ptr [edi+40]
" m5 S" D, u. M! P& r; `* i0 S  00501B53   .  51                 push    ecx
$ O' S2 D: F$ s+ k* }1 F: H  00501B54   .  6A 40              push    40
# u( j+ i5 |3 B; w  00501B56   .  EB 14              jmp     short 00501B6C2 N0 v& |. _- V( Z$ L4 c6 \' B
  ...4 V2 E( a/ f5 W
  00501B6C   >  8B4F 18            mov     ecx, dword ptr [edi+18]
/ L. u+ z' J- O/ O* r  G  00501B6F   .  8B47 10            mov     eax, dword ptr [edi+10]  a# Y( G$ d! z* W+ f
  00501B72   .  8B10               mov     edx, dword ptr [eax]: v0 @& G+ F  s4 _& q
  00501B74   .  8B52 40            mov     edx, dword ptr [edx+40]1 B" A  X. S1 W1 d1 Y! V
  00501B77   .  51                 push    ecx
8 J, O) y9 |( A% h9 u) o  00501B78   .  8B4C24 24          mov     ecx, dword ptr [esp+24]
: L0 Y+ N- K# u  00501B7C   .  51                 push    ecx
; ^, t- {5 Q, ?- `  00501B7D   .  55                 push    ebp
, C/ V" R9 _: \" s' {% ^& g  00501B7E   .  50                 push    eax7 a0 O3 K( @+ X7 ]+ D- ~8 \
  00501B7F   .  FFD2               call    edx                             ;  IDirect3D9::CreateDevice0 t$ l# s% x" V+ M: _' I9 R
  - A% U2 D% V' |: k  g7 O
  
% T: d/ B8 I: k0 u( u  由于是所谓的COM接口,没有十分明显的标志,不是很好找。$ T' c$ @  I9 f4 b
  5 ~$ w" y7 C. X6 v) Q7 Y+ }" ]
  在微软的DirectX SDK d3d9.h文件中,IDirect3D9的接口是这样的:9 w% S) c8 V7 |8 K+ T% \
  
( c; S% n* x/ ?9 a  
# P+ v" v% |: p9 A) C代码:
8 G% V1 b- ^$ d! Z) x4 b6 f  DECLARE_INTERFACE_(IDirect3D9, IUnknown)
/ ]1 x3 p2 j$ t) w- A* k- A  {! S5 F" ]* p- {) Q9 a9 u) n4 ~2 ^3 s
      /*** IUnknown methods ***/
4 X: P" e% k1 D- R      STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE;( M) p" V* f' K- M
      STDMETHOD_(ULONG,AddRef)(THIS) PURE;
7 N; Z, N8 N' s% r! i      STDMETHOD_(ULONG,Release)(THIS) PURE;
* Q6 ?! Y; D' S3 H! ]5 C  
+ O! R6 ]4 O2 ^" L) A" c      /*** IDirect3D9 methods ***/) v1 z$ Y4 c/ w6 |
      STDMETHOD(RegisterSoftwareDevice)(THIS_ void* pInitializeFunction) PURE;9 g: s6 z  O' l% \  l3 `
      STDMETHOD_(UINT, GetAdapterCount)(THIS) PURE;9 E. C% u7 Q6 `5 |$ ^4 r
      STDMETHOD(GetAdapterIdentifier)(THIS_ UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) PURE;5 M9 s5 n4 ]. @
      STDMETHOD_(UINT, GetAdapterModeCount)(THIS_ UINT Adapter,D3DFORMAT Format) PURE;
8 X* V" \' i$ o  a3 z# R  z2 s      STDMETHOD(EnumAdapterModes)(THIS_ UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) PURE;
8 q$ F+ D0 V0 A. L      STDMETHOD(GetAdapterDisplayMode)(THIS_ UINT Adapter,D3DDISPLAYMODE* pMode) PURE;
1 K% E* [0 U' ^      STDMETHOD(CheckDeviceType)(THIS_ UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) PURE;" f6 f. ]4 n& ^
      STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) PURE;. z) _9 S7 P8 I$ u8 q6 q
      STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) PURE;$ s6 c# V0 g1 n9 a  m5 f5 {
      STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) PURE;7 o* a& i. q. k4 e3 G
      STDMETHOD(CheckDeviceFormatConversion)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat) PURE;0 k& ^7 b1 X- n2 t6 g5 z
      STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) PURE;: x2 N- ]4 b3 Z% `% M( X2 [
      STDMETHOD_(HMONITOR, GetAdapterMonitor)(THIS_ UINT Adapter) PURE;1 F7 W5 ^/ [3 Y9 r3 p* {4 m
      STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) PURE;9 k! E0 F- ~2 I% O
      ! O3 y& D5 q* S3 ]# i- E
      #ifdef D3D_DEBUG_INFO
( y! o0 E! C6 t8 k8 j, g! J( `      LPCWSTR Version;# p  U' I9 m- ]
      #endif
5 x: s9 C6 u1 q( w+ _8 x9 A: U  };( g; g4 b9 k" z8 g% b8 ^
  
( }( K" f9 \( _9 j0 R  l  
1 b9 m) ]* \( y. ^  b  CreateDevice是第17个函数,所以它的地址是(17-1)*4 = 0x40,
& U% b2 O5 r/ N8 A$ N9 {/ t  00501B74   .  8B52 40            mov     edx, dword ptr [edx+40]
6 u& h( ]- S& `/ [3 \  这里的edx+40就是这么来的。
2 Y( ~" p& m# i1 a0 _+ i, W  
% y, c, ^. `! a/ o/ n# f6 `6 i5 ?  如果觉得算起来很麻烦的话,还有一个简单的方法,可以自己编译一个d3d9的程序,然后反汇编看看。+ a& z2 p# ?3 J# k& o" i
  
* a# G- B6 Y; r$ L, ]. p% p) X- O  如果还觉得麻烦,还有个更简单的方法,直接往下找,通常会有一些调试文本能够帮助定位,例如:
2 d, b& Y; }6 Z4 p3 u  00501B86   .  BB 600B5400        mov     ebx, 00540B60                   ;  ASCII "CreateDevice"
+ k7 G( l3 s+ S; W  ...3 G6 z% `4 H6 ]' f
  00501BBB   .  BB 700B5400        mov     ebx, 00540B70                   ;  ASCII "CreateDevice failed again"
5 M( R- E* U5 A2 L  当然,这个办法并不通用,有效与否完全要看游戏作者的脸色。! O' G) a6 U4 g$ U
  5 x% y; A6 v8 H0 j" W& L" F2 ?; o" C
  知道了IDirect3DDevice9的地址,就能植入我们自己的初始化ID3DXFont的代码。( r; e* `- T" P5 E7 O8 F
  
$ ^$ |# r) L7 u) X& [  有了ID3DXFont,下面就是要找到用于显示文字的函数,并用我们自己的代码来替换实现。, a+ H1 n* k8 J9 `1 R' ]/ c' i
  ' M! F1 t* y6 K/ l6 U" O: D
  随便找一段游戏中出现的文字,比如开始菜单上出现的“Full 1.37”,ALT-M,进入内存窗口,在所有搜到的该字符串上下“内存访问”断点,最终会找到地址在4FFF50的一个函数。
4 d; z. l6 j$ Z8 `! E# e  . o  V: g, R9 w8 S; ^
  该函数返回时,用的是“retn 14”,在4FFF50处用“retn 14”改写,切回到游戏后没有任何字符出现,说明这个函数正是用来显示字符的。5 m6 O3 T# g% e3 y
  . Q, ?  K8 x, B
  原谅我在这里对于怎么找到4FFF50的过程含糊其辞,一笔带过了。确实没有什么取巧的方法,完全取决于破解的功力,良好的耐力,以及一点点好运气。而这也正是游戏汉化的难点所在。2 v! B* T( R% j8 D- K# l+ A3 v. Y
  
. ~2 _1 s2 h) x% w8 O0 q  找到字符串显示的函数后,还要弄清楚该函数的接口。
* L1 v+ L$ s" b2 r# O" _0 \8 \  / W' b. k) S) K* S
  在屏幕上显示一个字符串,通常需要知道这些要素:字符串、显示的位置(X,Y坐标)、颜色、字符的大小,以及一些flag用于表示左对齐,右对齐,居中,加粗,倾斜等。
7 n) }! l; ^% ^  
7 m1 v" n- M" l; p2 G  前面说过,返回用的是“retn 14”,说明栈里有20(10进制的14h)/4=5个参数,当进入该函数时,栈上的数据是这样的:
: v" r  }2 [: w! J  
+ I$ }& l* S% E3 H) E  @% K代码:: }9 [* k6 R; o2 N5 r9 y
  0012FE84   00453C48  返回到 GSB_1_37.00453C48 来自 GSB_1_37.004FFF50
7 e5 J, n& _- o- P/ y$ L  0012FE88   0012FEB8  ASCII "Full 1.37"
# O  a6 c  t: ?2 {6 z" b  X: ^. n4 d  0012FE8C   00000000
! G2 ?0 Q9 ^6 d" M" E  0012FE90   40400000
/ u7 L# r% u1 z  0012FE94   FFFFFFFF
/ `0 y, i5 n4 v" L  0012FE98   447D80006 `8 w- I+ o7 X* m
  
, @& B+ A6 g" z) K6 }* j- N; @1 D  第一个,很明显就是要显示的字符串,后面几个是什么玩意儿呢?
$ y+ b* I6 o0 t5 U  6 c6 y' s' W$ z# g8 _! [8 p
  回到调用004FFF50的地方,在00453C1D下断点:
5 o6 w6 f6 N/ ]" x6 Z3 P7 ]* u  8 F) _8 I8 C! v. [/ W$ c
代码:$ }# }) n$ P0 s' U% y9 N& V: W" P/ w
  00453C1D  |> \D94424 14          fld     dword ptr [esp+14]! b' G+ V6 m% k+ L1 ?
  00453C21  |.  51                 push    ecx
5 {' f6 \& C+ U* s  00453C22  |.  D91C24             fstp    dword ptr [esp]                  ;  参数5  1024.0
  T: @- Y( S" ^9 S  00453C25  |.  6A FF              push    -1                               ;  参数4
3 r7 K+ N5 C" \0 v3 u  00453C27  |.  D905 F4125400      fld     dword ptr [5412F4]
: q' K0 @7 {; Q' c% a. i1 |  00453C2D  |.  83EC 08            sub     esp, 8
, Y, @/ T- w& e; d6 {: \  00453C30  |.  D95C24 04          fstp    dword ptr [esp+4]                ;  参数3  3.0
& n3 v  r$ Q5 p$ L8 v4 K7 y  00453C34  |.  8BD0               mov     edx, eax
/ v9 H- s5 _2 H, K1 U/ N3 e9 Q( e  00453C36  |.  D9EE               fldz9 ]9 s. M7 S- N
  00453C38  |.  D91C24             fstp    dword ptr [esp]                  ;  参数2  0.01 Z  q5 U' F) V! l+ b
  00453C3B  |.  56                 push    esi                              ;  参数1; d! E! D/ u) `- |1 G, a
  00453C3C  |.  BE 01000000        mov     esi, 1
8 P: M% G% |9 n2 A( U1 N  00453C41  |.  8BCE               mov     ecx, esi7 f- V1 j- N" g1 t
  00453C43  |.  E8 08C30A00        call    004FFF50
. D6 U9 T/ U6 }9 @; u' Q  
& P9 D* J% l' @4 N2 V' a" E  
2 u: E2 b7 g/ Z  }+ \2 ?  可以看到,参数4是一个固定值,第二、三、五参数都是浮点数。; m& V- U% K3 p8 n7 }( m
  # k8 d7 Z# n1 H. }0 B7 }* x
  这里有一个技巧,在函数开始的地方修改参数的值,看看会发生什么变化,很快就能知道参数的作用。
: M: I/ A7 X6 y& @6 W4 h' G; @/ |( U  
- H, {. v: Q) R5 _! d9 @3 o( Z  参数4是颜色值,Alpha和RGB值都是FF,就是白色,与在游戏中看到的字符颜色相同。
. B5 K/ I9 r& I" S( a  参数2是X坐标,参数3是Y坐标,参数5用于调整。
  R/ t  n2 s  Z6 p4 J( |! X  需要注意的是,还有两个参数是通过寄存器ECX和EDX传递的,ECX用于表示左对齐(0),右对齐(1)和居中(2),EDX是固定值58D6D0,一个全局的结构或类。' ]  r7 P3 v# I) V+ R; f6 w  O
  
5 {5 m0 O/ `' ^  此游戏有两种字体,因此用于显示字符的几大要素,现在还缺一个,就是不知道如何判断字符的大小。
: e- i% n) i: j( ~  2 j- L0 i( D2 Y1 z
  在用于显示文字的004FFF50的上下断点,多跟几次,就会发现,每次调用以前,都会调用一个call:9 `- U8 R( J2 Q% F; z4 T4 z* a
  5 d; l* k0 ]+ v4 |. ^; K
代码:
) P4 F' S! k; z. Z. p2 m) a  00453BD5  |.  BE 44035300        mov     esi, 00530344                    ;  ASCII "zekton16.dds"  P+ n1 C! h% I7 i" K
  00453BDA  |.  E8 91B50A00        call    004FF170
: w' Z, z/ J5 ~  1 {6 O: o0 n. J$ X3 f2 u
  004479E7  |.  BE 54035300        mov     esi, 00530354                    ;  ASCII "cwfont20.dds"7 U5 g, @6 i% s
  004479EC  |.  E8 7F770B00        call    004FF170: h' h3 @; b% H- \  z
  
" Q+ n: D- \7 p$ }0 M  在游戏目录data\font下面有两个文件zekton16.dds.dat和cwfont20.dds.dat,由此判断004FF170应该是用于选择字体的函数。
% u% t8 E4 [  V( p) e$ B/ ^  
: u* a/ r" _( d# k9 u  总结一下:8 }* M; K6 R2 ]
  第一步,找到IDirect3DDevice9句柄,用于初始化ID3DXFont。8 }$ f6 J. M; I
  第二步,找到显示文字的函数,用自己的代码实现之。
# k  y3 }4 F' Y. Q1 b1 L  第三步,逐步找到其他需要修改的地方,比如用于得到字符串宽度、高度,指定宽度的字符串换行显示等函数。
) I- z: g) I& W& \1 T  
$ w. \2 E) O' ?) C- f  
/ c8 c# b! r5 h! Z+ ~5 v' Y  【具体实现】
+ l+ _' S! V* ?+ c% d+ b; M  我用的是注入dll,然后打内存补丁的方式。这样的好处是便于更新,可以任意修改实现过程,以后游戏出了新版本,也只要修改几个地址变量,重新编译一下就可以了。
2 j) t8 h( r$ j5 f* m& m" x  另外一个好处是,不以文件补丁的形式发布,没有版权问题。(有人关心这个吗?)0 J, e3 c% W) {3 J' e) B9 ~2 ^& N# {! X
  
' P& q: r0 A  F% U# q) b/ @! E4 R  源码在这里:6 i5 A) U" b& a9 T4 K
  http://gsbzhcn.googlecode.com/svn/trunk/src
& I, ^7 s% }- {# P  3 H, e/ o" V/ u$ H: }
  简单的介绍一下流程:
+ L$ _! q4 ]9 M  \; Q3 l. |  1.CreateProcess启动游戏的exe,并使之处于挂起状态。- C6 }9 B  z9 ?/ R, ?
  2.VirtualAllocEx在游戏进程上申请一块内存,WriteProcessMemory往里写入要注入的dll名称。
5 e9 n; H3 K, z6 A$ P: i  3.GetProcAddress得到LoadLibraryA的地址。
" x& f. J* _4 d8 R/ f! N  4.CreateRemoteThread运行LoadLibraryA,注入dll,dll载入时会为游戏进程打上补丁。* \" X2 h/ Z2 t' g+ Q* w
  6.WaitForSingleObject等候dll载入完成。3 |1 {: w# w- K4 M
  7.VirtualFreeEx清理掉之前申请的内存。
5 ]- y1 O. l1 r( ^9 P8 i  8.ResumeThread让打过补丁的游戏进程运行起来。1 h" ?* m/ Q- y7 i) F
  ' z7 h' a$ z7 `+ t# p1 V, c
  内存补丁主要是让游戏在关键的地方跳转到我们的dll,执行一段代码后再跳回去,或者直接用dll里的函数代替之。
4 w! U1 E' J1 [5 T  
% A* X- y2 x3 m6 S* O. b: ?% |/ N  * O8 d0 t; [8 @/ y
  【结尾】
6 M, n# q! O- y2 O* _% W+ G8 K  此游戏的汉化正在http://code.google.com/p/gsbzhcn/ 进行,文本不多,奈何翻译人手也不多,希望有兴趣的同学能够参与。
, c- D3 F& U, |3 s% |% H  2 E9 M: _2 V/ e/ C
--------------------------------------------------------------------------------
$ t: d+ N* w2 j# D! |% o  A1 K3 w' \【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!1 K& ?" h. V2 F1 @  _. w

5 s+ X: [' W5 V( ^                                                       2010年05月25日 14:52:11
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

沙发
发表于 2011-2-6 20:47 | 只看该作者
楼主忒牛了
回复 支持 反对

使用道具 举报

板凳
发表于 2011-3-10 15:19 | 只看该作者
高手啊,仰望。
回复 支持 反对

使用道具 举报

笨蛋狐狸 该用户已被删除
地板
发表于 2011-3-11 10:19 | 只看该作者
仰慕,学习了,也感谢007的转载。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表