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

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

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

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

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

【转】DirectX 9 游戏汉化详解

本帖最后由 shane007 于 2011-1-30 14:13 编辑 ' c' l/ d$ `! m$ n  i

8 D/ `: l7 {7 T作 者: noword_forever
/ {  s1 i  v9 n9 B2 d时 间: 2010-05-25,14:52:51
- |/ o" T6 `7 U) C( F链 接: http://bbs.pediy.com/showthread.php?t=113739
4 ]( Z# U% G  u4 H' v
( P! f! Z9 f" {! R( h7 V【文章标题】: DirectX 9 游戏汉化详解) k. R1 u- Z0 D- L
【文章作者】: noword& {4 n2 \* G' H5 y
【软件名称】: 无厘头太空战役2 q: M8 \3 q# P3 N/ R
【下载地址】: http://www.verycd.com/topics/2819995/
6 M: r  E2 M6 D( B2 I. z2 I--------------------------------------------------------------------------------! G  `. h, f* N% P* A
  【前言】" B4 A* J8 Y5 @* I" @  @% g/ Y! v7 }7 e
  先copy一段此游戏介绍:
9 L  [4 V( n" ^! E0 w1 w  " k& e& r" }& }4 i, G% X$ _/ r
  这是一个独特的战略游戏,具有即时战略与塔防的混合风格,玩家将扮演庞大太空舰队的最高指挥官,你可以自定飞船的构造,摆放飞船的位置,下达命令,然后观看绚丽的射击与爆炸。移动和爆炸时会有动态模糊效果。支持自定义地图。: Z0 J8 E: D; |- N  _8 M( [
  
- u# {* ~- V' w- |' \# V  想玩中文版,两个游戏论坛,3DM和YX上,都有人说要汉化,等了几个月,没有下文,说是技术原因。于是决定自己来试试看。" J  J. F! T9 D& k
  ( t# D: o. F2 _
  
0 X1 W2 P9 H( C! [3 P/ E: f4 n( `  【困难何在】( h. K, v* t- I. F
  此游戏的文本都在data目录下,都是明文的文本文件。修改data\strings.ini,将7 Q, k! A, ?% c: J6 a3 m
  
: S+ C5 Y8 _0 h/ @/ C) s0 v代码:
7 B/ m* H6 c$ p  MAINMENU_QUIT        = "Exit"$ y. j- n) o4 W' H$ h
  
5 x7 n% t" j$ z8 c  改成
* Q, I6 F! D( M  J8 W+ ]  ' t) v, O( i! {. J5 B  [, L1 g
代码:
7 K0 n8 ?, U! V+ _) u  x% B2 S, }  MAINMENU_QUIT        = "退出"0 X2 P' t8 a0 [' E0 g7 A/ g% |/ Z
  2 l& a, B  D& b& I( ~3 n) g" `% s
  & p1 Q1 Q2 n1 P
  进入游戏后,不出所料,无法显示此中文。/ L0 s/ F& n" m& m% P
  
: Z) a7 X6 _0 f8 [  茫茫多的游戏爱好者,在尝试汉化某款自己心仪的游戏时,都是死在了这一步——找了半天文本资源,然后翻成中文,满心欢喜和期待的进入游戏,面对的却是一堆乱码或一片空白。满腔热情,化为乌有,无可奈何,黯然神伤。- H- J# |4 F/ f3 x8 X4 _
  4 ~! M! M! X! T! A
  本文的目的,就是希望能够帮助这些有志于游戏汉化的同学,主要介绍了如何让一个英文的游戏,能够正确的显示出中文。' _- v# \3 D* }$ y2 S; ]7 v2 y
  
. d+ s1 s' E7 K, n! k  2 ]; v  d+ M: z8 _8 S
  【调试分析】
+ l8 L% o/ x4 _4 P& w: o5 i  DirectX 9游戏的启动流程是这样的,先执行Direct3DCreate9,返回值是一个IDirect3D9句柄,然后执行IDirect3D9->CreateDevice,得到IDirect3DDevice9句柄。5 G: X9 j6 |7 c- P( S, d7 x
  有了IDirect3DDevice9就能使用DirectX 9的一切绘图手段,而我们最关心的就是能够使用D3DXCreateFont来创建ID3DXFont,继而能够非常方便快捷的在游戏中显示文字。
4 E/ |5 D. d: V/ a: c/ \2 v& r0 @  
+ c5 X3 m7 {6 M- G2 n' \# E  用ODBG载入游戏的exe文件,“查找所有模块间的调用”,找“d3d9.Direct3DCreate9”:
. g7 G! x& |! q3 Q2 ~0 b) I  
! O& X: A% Z+ L( _- }/ g9 _$ A代码:% S& \! w+ y5 p$ A% d
  00501974   .  BB 500A5400        mov     ebx, 00540A50                   ;  ASCII "Initialising 3D Engine"8 k* p7 F. A& c+ S  P
  00501979   .  E8 22130000        call    00502CA0. ?% p5 s* I3 N" ~# d
  0050197E   .  6A 20              push    202 G' H, K# t1 L0 c" h
  00501980   .  8977 18            mov     dword ptr [edi+18], esi# M5 h5 O- W2 D0 t
  00501983   .  E8 2E8B0100        call    <jmp.&d3d9.Direct3DCreate9>- b# a1 j# t2 Y) n5 |4 B
  00501988   .  85C0               test    eax, eax
1 E7 e" a& @' ^2 d# ]4 n. Z% F  0050198A   .  8947 10            mov     dword ptr [edi+10], eax         ;  edi+10 = 58d550
0 X3 Y0 Z$ F6 m9 y' i  1 }8 m  m0 j4 R2 [- k  z
  往下找,就能找到IDirect3D9->CreateDevice:
6 u$ v  D) H# i0 y5 Y  % G6 Z$ q! N$ x  i4 y5 R% I# ^0 K* N
代码:* @4 _' w1 `; S4 \, Y) x) N
  00501B4C   .  8D77 14            lea     esi, dword ptr [edi+14]
7 Z5 z1 `) R; ~0 x  00501B4F   .  56                 push    esi                              ;  58d554  => IDirect3DDevice9
# [9 X- a3 r% X% n# W: e% F- U- q  00501B50   .  8D4F 40            lea     ecx, dword ptr [edi+40]
2 ^! j' D# h0 w8 v. `  00501B53   .  51                 push    ecx
* ]0 j* E0 H; F  00501B54   .  6A 40              push    40- C8 ?  V  a( D) X  Z/ a# f% ?. q
  00501B56   .  EB 14              jmp     short 00501B6C
; H6 R* o# a8 N  ...
" c; N" F$ e+ f& }' @0 c  00501B6C   >  8B4F 18            mov     ecx, dword ptr [edi+18]# I) m8 W1 N" N  {
  00501B6F   .  8B47 10            mov     eax, dword ptr [edi+10]. e1 \+ h# }& T/ T: E
  00501B72   .  8B10               mov     edx, dword ptr [eax]) a4 t7 R+ Z! Q7 p2 c) x+ ^
  00501B74   .  8B52 40            mov     edx, dword ptr [edx+40]
4 d! B' F8 m# |2 o9 }  Z  00501B77   .  51                 push    ecx
; G6 q3 M6 Q1 Y4 j0 j1 [* |  00501B78   .  8B4C24 24          mov     ecx, dword ptr [esp+24]
8 T- Y. }, @9 j  00501B7C   .  51                 push    ecx
  b4 W) d  Q) J  00501B7D   .  55                 push    ebp! t* ?6 ^) o, O( v( v5 {6 j
  00501B7E   .  50                 push    eax
4 m# H4 m1 h) }& c+ H& X. I  00501B7F   .  FFD2               call    edx                             ;  IDirect3D9::CreateDevice4 `8 t. J! x* {4 E) S9 C8 b+ l" C
  
" ?. Y# H: B: M# |* Y; V  
. _' X: E; i# B6 |8 ]# ^8 {  由于是所谓的COM接口,没有十分明显的标志,不是很好找。5 z9 W+ ]1 M2 C" w) m5 Q! ?" W
  9 N+ D# C6 V! T# q
  在微软的DirectX SDK d3d9.h文件中,IDirect3D9的接口是这样的:
6 n: ?9 [) k3 n  
( H# B2 s7 `* [. i/ f  ) X( x. |8 K. G. Y
代码:
, r" k. R, t8 B9 f1 a% A9 _  DECLARE_INTERFACE_(IDirect3D9, IUnknown)
. ~% A/ F, _, e2 d0 p5 Z  {3 j* {! ?9 X0 I8 [8 \  ^+ f1 k# B
      /*** IUnknown methods ***/1 T( h- d0 |; q
      STDMETHOD(QueryInterface)(THIS_ REFIID riid, void** ppvObj) PURE;
7 `0 |1 Z# h# y5 M, c% D4 |6 B1 f      STDMETHOD_(ULONG,AddRef)(THIS) PURE;9 k! S" b+ `8 H" J, ]4 ^; L5 V0 g
      STDMETHOD_(ULONG,Release)(THIS) PURE;
! i3 ]+ l  e4 d4 r* G; i6 y4 m  
- C0 N7 C2 w* k5 P$ o      /*** IDirect3D9 methods ***/  d/ A8 z) |/ b! ~* [" j/ Y
      STDMETHOD(RegisterSoftwareDevice)(THIS_ void* pInitializeFunction) PURE;8 B* C8 S$ |; g* ?
      STDMETHOD_(UINT, GetAdapterCount)(THIS) PURE;
. Q. M5 m7 k8 X1 u  R' l      STDMETHOD(GetAdapterIdentifier)(THIS_ UINT Adapter,DWORD Flags,D3DADAPTER_IDENTIFIER9* pIdentifier) PURE;
" S/ L7 n( k) J# O      STDMETHOD_(UINT, GetAdapterModeCount)(THIS_ UINT Adapter,D3DFORMAT Format) PURE;0 N: W1 f& V8 n" J' j2 i0 M3 }
      STDMETHOD(EnumAdapterModes)(THIS_ UINT Adapter,D3DFORMAT Format,UINT Mode,D3DDISPLAYMODE* pMode) PURE;5 z% d( o2 a5 V7 d
      STDMETHOD(GetAdapterDisplayMode)(THIS_ UINT Adapter,D3DDISPLAYMODE* pMode) PURE;
7 }% l" }- ]6 ~" ~# J' z0 }1 G      STDMETHOD(CheckDeviceType)(THIS_ UINT Adapter,D3DDEVTYPE DevType,D3DFORMAT AdapterFormat,D3DFORMAT BackBufferFormat,BOOL bWindowed) PURE;$ H, j* t. N7 h
      STDMETHOD(CheckDeviceFormat)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,DWORD Usage,D3DRESOURCETYPE RType,D3DFORMAT CheckFormat) PURE;
$ i0 B% w& G! C. `      STDMETHOD(CheckDeviceMultiSampleType)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SurfaceFormat,BOOL Windowed,D3DMULTISAMPLE_TYPE MultiSampleType,DWORD* pQualityLevels) PURE;0 X/ k. y) U; ?2 \1 a
      STDMETHOD(CheckDepthStencilMatch)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT AdapterFormat,D3DFORMAT RenderTargetFormat,D3DFORMAT DepthStencilFormat) PURE;9 L4 ^! d1 c- l6 P
      STDMETHOD(CheckDeviceFormatConversion)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DFORMAT SourceFormat,D3DFORMAT TargetFormat) PURE;, ]" v' A( m5 K  ^/ K
      STDMETHOD(GetDeviceCaps)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,D3DCAPS9* pCaps) PURE;
2 Z+ m4 L% ?+ P2 g9 U9 c' I& x; a      STDMETHOD_(HMONITOR, GetAdapterMonitor)(THIS_ UINT Adapter) PURE;
- g# T$ B" [/ |6 v5 l( ]      STDMETHOD(CreateDevice)(THIS_ UINT Adapter,D3DDEVTYPE DeviceType,HWND hFocusWindow,DWORD BehaviorFlags,D3DPRESENT_PARAMETERS* pPresentationParameters,IDirect3DDevice9** ppReturnedDeviceInterface) PURE;
- X5 w" T# D% N      8 |9 _  O/ A3 g' A5 t' f- |8 t
      #ifdef D3D_DEBUG_INFO
3 j% i% U3 \2 d9 G      LPCWSTR Version;
5 N- C# }4 H' H: I" R      #endif5 k. R, L  I. u7 a
  };
8 m3 h8 n# [7 q* Q+ N0 Y  
/ X/ U5 Y% L1 q3 F9 E, w# n  8 i) s5 \4 [- u
  CreateDevice是第17个函数,所以它的地址是(17-1)*4 = 0x40,& g  R: E# c& m, d5 d& l
  00501B74   .  8B52 40            mov     edx, dword ptr [edx+40]' t9 }8 e! b! e
  这里的edx+40就是这么来的。
' w' b& z8 e; X7 F9 V  9 Y1 n3 u, Z' P- x
  如果觉得算起来很麻烦的话,还有一个简单的方法,可以自己编译一个d3d9的程序,然后反汇编看看。
5 y4 l5 w3 g6 Y2 E$ L  . n* @& h1 O1 {* o( J! P
  如果还觉得麻烦,还有个更简单的方法,直接往下找,通常会有一些调试文本能够帮助定位,例如:* y, M: m: z# p; V
  00501B86   .  BB 600B5400        mov     ebx, 00540B60                   ;  ASCII "CreateDevice"
. H( h# o; x2 L, Q2 b; [  ...
1 j; ~' q$ y( E, Y  00501BBB   .  BB 700B5400        mov     ebx, 00540B70                   ;  ASCII "CreateDevice failed again"' z- a" s% S- c3 M# {0 ~  w/ k
  当然,这个办法并不通用,有效与否完全要看游戏作者的脸色。
) r' w% j% J8 a. @2 q& j- [0 d  
8 n+ i2 |& t2 M$ H  知道了IDirect3DDevice9的地址,就能植入我们自己的初始化ID3DXFont的代码。" F& p( I; B/ F0 V  h: {
  
, B$ K* w! C1 ^5 x" n8 D8 U  有了ID3DXFont,下面就是要找到用于显示文字的函数,并用我们自己的代码来替换实现。
, G* X. G" d0 T; y( I  j# K) G  
  D- g8 Z; ]+ ^$ N4 |/ T  随便找一段游戏中出现的文字,比如开始菜单上出现的“Full 1.37”,ALT-M,进入内存窗口,在所有搜到的该字符串上下“内存访问”断点,最终会找到地址在4FFF50的一个函数。
4 Q+ D: R! W$ P& B" R  V/ [1 l  
* y& V' Y- `! q4 F  Z" u1 M% O  该函数返回时,用的是“retn 14”,在4FFF50处用“retn 14”改写,切回到游戏后没有任何字符出现,说明这个函数正是用来显示字符的。. |; B; b+ B  O3 t7 z: G" n8 h, Z
  9 C: o' p8 D, D
  原谅我在这里对于怎么找到4FFF50的过程含糊其辞,一笔带过了。确实没有什么取巧的方法,完全取决于破解的功力,良好的耐力,以及一点点好运气。而这也正是游戏汉化的难点所在。
* y6 O; n4 P  d  C/ K+ `  [+ U  
- B/ a1 G) o8 E: o" g. o  找到字符串显示的函数后,还要弄清楚该函数的接口。
! ^2 |- X; n5 _9 E% G/ ]5 e  
# Y" \- n- t! u4 X) @: E  在屏幕上显示一个字符串,通常需要知道这些要素:字符串、显示的位置(X,Y坐标)、颜色、字符的大小,以及一些flag用于表示左对齐,右对齐,居中,加粗,倾斜等。5 o% F7 }; f* E- k- m$ G
  9 n1 ~- N5 [* ~2 l) I
  前面说过,返回用的是“retn 14”,说明栈里有20(10进制的14h)/4=5个参数,当进入该函数时,栈上的数据是这样的:( ^* D* ]5 n9 }8 B7 d
  ; M6 k  Z2 c3 |
代码:
2 U1 V/ |7 P7 z; O5 m4 n  0012FE84   00453C48  返回到 GSB_1_37.00453C48 来自 GSB_1_37.004FFF50  e: \# d- f: I3 J$ |
  0012FE88   0012FEB8  ASCII "Full 1.37"
" E  S* O6 U7 J( m; {  0012FE8C   00000000% O( q/ c% E$ q
  0012FE90   40400000
" T; X: K5 ]; a/ U( n4 F' e  0012FE94   FFFFFFFF# G- B' V, s( X8 o
  0012FE98   447D8000- w. P) n4 f2 c8 h* D; y9 y" ~
  % M- g9 x9 A! j9 `& L' x
  第一个,很明显就是要显示的字符串,后面几个是什么玩意儿呢?* J8 L  o4 v+ ?$ q. R$ s! f
  
& p2 l1 P( F# q6 r  回到调用004FFF50的地方,在00453C1D下断点:/ I( m& r$ q0 }
  # ?. ^5 g# `7 _4 n
代码:
- [% D8 Z. ^$ Q/ L- G; @' P1 J  00453C1D  |> \D94424 14          fld     dword ptr [esp+14]
" {- o( \9 \9 L6 t) H5 \: @  00453C21  |.  51                 push    ecx9 C( ~2 s6 p7 i
  00453C22  |.  D91C24             fstp    dword ptr [esp]                  ;  参数5  1024.0
" \5 H. ]3 |" f: W2 F  w  00453C25  |.  6A FF              push    -1                               ;  参数48 ?# T' S2 c7 m( e& A
  00453C27  |.  D905 F4125400      fld     dword ptr [5412F4]
& [3 V* X- D7 s4 _6 Q# S  00453C2D  |.  83EC 08            sub     esp, 8! ^. ~, o& j, i; e3 E
  00453C30  |.  D95C24 04          fstp    dword ptr [esp+4]                ;  参数3  3.0) g$ L  k/ b$ T. n* ~; z7 w, E
  00453C34  |.  8BD0               mov     edx, eax. h! ^4 J" D7 j0 d% P7 X1 p2 l
  00453C36  |.  D9EE               fldz
9 B+ F: U3 \0 {8 p  00453C38  |.  D91C24             fstp    dword ptr [esp]                  ;  参数2  0.0% }# X/ Y& c' ^$ x/ s
  00453C3B  |.  56                 push    esi                              ;  参数1
. n" U# k: M8 u  00453C3C  |.  BE 01000000        mov     esi, 1
. @: R, y, h: ]# W, V  e3 K  00453C41  |.  8BCE               mov     ecx, esi8 A$ ^- Q. m$ X* [: T; G" ]
  00453C43  |.  E8 08C30A00        call    004FFF50
# U- d" t: x- @8 Z* q' b    N$ I) k/ D$ c# S9 @( Y8 c) c
  
$ G! I+ k1 R- b2 p6 C- t3 x  可以看到,参数4是一个固定值,第二、三、五参数都是浮点数。
* v' Y- g& C% R" P* M( W9 n  + i9 {1 ]& e+ U7 h6 h) C8 H. x8 H8 P
  这里有一个技巧,在函数开始的地方修改参数的值,看看会发生什么变化,很快就能知道参数的作用。* P: R2 T/ \3 }( L# K& y$ i
  
$ V3 Z/ a5 B8 x9 ]# T: K' ^  参数4是颜色值,Alpha和RGB值都是FF,就是白色,与在游戏中看到的字符颜色相同。# x5 @' p0 X$ n) c
  参数2是X坐标,参数3是Y坐标,参数5用于调整。
  P; K  m) t. r1 `( `+ ]  需要注意的是,还有两个参数是通过寄存器ECX和EDX传递的,ECX用于表示左对齐(0),右对齐(1)和居中(2),EDX是固定值58D6D0,一个全局的结构或类。
# ]  K$ ]* ~# \  4 a1 [' H+ m/ K2 F/ g$ J: J. {' P
  此游戏有两种字体,因此用于显示字符的几大要素,现在还缺一个,就是不知道如何判断字符的大小。! {* @- @& ^1 i- G& r4 O
  
! r8 G- D' w6 @6 ?0 z( o  在用于显示文字的004FFF50的上下断点,多跟几次,就会发现,每次调用以前,都会调用一个call:& K% K7 `0 N6 ^7 K! s
  / H# Y# |8 U9 c: ^& p! K
代码:
% [( S5 f9 j9 _/ i% e( @  00453BD5  |.  BE 44035300        mov     esi, 00530344                    ;  ASCII "zekton16.dds"* y* {7 l4 ?4 Y7 M3 n
  00453BDA  |.  E8 91B50A00        call    004FF170, c9 j3 W* j% \% G8 M; B# c
  
+ h- y/ f, y' i0 P( P# V  004479E7  |.  BE 54035300        mov     esi, 00530354                    ;  ASCII "cwfont20.dds"0 R3 \8 J# R; O" m/ j% X
  004479EC  |.  E8 7F770B00        call    004FF170# v. z* V. i* q# C7 B3 x" F* n
  9 a3 u! W  h3 W& z3 p+ z! S# ^
  在游戏目录data\font下面有两个文件zekton16.dds.dat和cwfont20.dds.dat,由此判断004FF170应该是用于选择字体的函数。$ B0 ]( k6 T7 C
  
6 V. r- V, I" O+ u! w" E1 Y7 K  总结一下:
; W. [/ Z- x$ _! [  第一步,找到IDirect3DDevice9句柄,用于初始化ID3DXFont。
. e3 [5 f  U2 ]. r: L  第二步,找到显示文字的函数,用自己的代码实现之。
, E( @% [5 ~; l7 b" s  第三步,逐步找到其他需要修改的地方,比如用于得到字符串宽度、高度,指定宽度的字符串换行显示等函数。& }0 z. w" P' t; @# |
  + t+ K8 K7 q2 S: w( k
  , s  C: F' N3 B& b  U- Q* h" y
  【具体实现】5 `! C+ H# ^- h1 E1 ^( J1 G
  我用的是注入dll,然后打内存补丁的方式。这样的好处是便于更新,可以任意修改实现过程,以后游戏出了新版本,也只要修改几个地址变量,重新编译一下就可以了。
, C$ N. N/ Z' A, G6 ?  另外一个好处是,不以文件补丁的形式发布,没有版权问题。(有人关心这个吗?)
) [2 e' n7 ]. H3 i9 d6 c) y  " x' H3 n9 w  e( M; _
  源码在这里:7 |8 m: ~* |% ]4 }
  http://gsbzhcn.googlecode.com/svn/trunk/src  ^& \$ E2 |; ^( M* J( N; T6 R8 l
  
  y- Z9 M1 a. C  简单的介绍一下流程:2 t9 p; Y5 ~6 ]4 X8 V6 N2 {
  1.CreateProcess启动游戏的exe,并使之处于挂起状态。
9 P* F+ x: @8 D8 ~( n  2.VirtualAllocEx在游戏进程上申请一块内存,WriteProcessMemory往里写入要注入的dll名称。
6 _/ y3 `( I/ [# G- D% a  Z* `  3.GetProcAddress得到LoadLibraryA的地址。" R/ T3 g$ D) M3 Q$ {+ ]5 B
  4.CreateRemoteThread运行LoadLibraryA,注入dll,dll载入时会为游戏进程打上补丁。2 K, `" N; T6 h- y* u6 D
  6.WaitForSingleObject等候dll载入完成。+ G; u! \. J# z, C, @* K
  7.VirtualFreeEx清理掉之前申请的内存。8 H, i: A! @. p% j
  8.ResumeThread让打过补丁的游戏进程运行起来。
) e" N% G- ]5 g2 v* j2 R8 _2 R3 P3 j- o  
- Q5 i# ^8 {2 M4 k7 d" h  内存补丁主要是让游戏在关键的地方跳转到我们的dll,执行一段代码后再跳回去,或者直接用dll里的函数代替之。
" o$ O) D7 c' n+ W4 @  
& P4 }9 l1 P2 z6 _4 M  
8 a8 O( |& h) ?0 w" d' g& Z  【结尾】7 S2 I6 ~1 u/ ~/ |, E% J
  此游戏的汉化正在http://code.google.com/p/gsbzhcn/ 进行,文本不多,奈何翻译人手也不多,希望有兴趣的同学能够参与。7 g5 R: m; x3 R7 m8 b
  0 a- z! i, |4 s2 }0 \3 U
--------------------------------------------------------------------------------
, O) f. {& K! n, s【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!/ v- a0 s' w. B

/ ?4 @- A6 Q8 N! G, e8 W                                                       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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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