冒险解谜游戏中文网 ChinaAVG
标题:
【Opengl游戏汉化 #1】 纪念品(Keepsake)图形引擎分析
[打印本页]
作者:
shane007
时间:
2023-8-25 17:27
标题:
【Opengl游戏汉化 #1】 纪念品(Keepsake)图形引擎分析
本帖最后由 shane007 于 2023-8-25 17:31 编辑
+ m4 @* l) Q& ]4 n8 p0 V
. d" z0 L, h2 ]) `" o9 c) L* I
本游戏的引擎似乎有支持2套图形API,DirectDraw和Opengl,
4 p: m$ O8 A/ L2 ^& u5 ^
游戏应该实际只用了其中1个,暂时作下记录。
5 i0 a# h u, q
9 V* o l h! b4 t% D
DirectDraw是由bin目录下的ddraw2d.dll来完成的。
; h1 I; y0 f$ x% {+ X$ ]5 H. t
以下是一处的初始化代码
* W+ Q1 b. D' C; K0 ^3 Q
CSpace:10015015
+ f' O ]7 [6 Q" w
CSpace:10015015 loc_10015015: ; CODE XREF: sub_10014D50+2AD↑j
7 z+ e1 \9 F8 |# D1 Z' o
CSpace:10015015 mov [ebp+lpGUID], 0
8 i' R2 N/ Z. o2 o9 w8 J* z
CSpace:1001501C mov eax, [ebp+dwNewLong]
( C4 J+ V+ n# Q8 x) c, f: N, b
CSpace:1001501F mov ecx, [eax+230h]
% Z8 \* S- x* Q3 n2 i" K
CSpace:10015025 movzx edx, byte ptr [ecx+1Ah]
- R+ P- J- ~) T7 H
CSpace:10015029 test edx, edx
0 s4 u* ~& F% `& H# z v i7 e
CSpace:1001502B jnz short loc_1001503C
/ _& i) t7 D5 V% y* Z4 }
CSpace:1001502D mov eax, [ebp+dwNewLong]
) W/ o: R- _7 R* j6 h7 m
CSpace:10015030 mov ecx, [eax+230h]
$ f! P" T: s! m+ D0 }! Z8 ^6 P
CSpace:10015036 add ecx, 8
* A: D- l; w5 S7 x. w- O+ u
CSpace:10015039 mov [ebp+lpGUID], ecx
' y+ T X" [# B0 Q0 C
CSpace:1001503C
$ V) X* @, b1 c V0 ?& R5 g
CSpace:1001503C loc_1001503C: ; CODE XREF: sub_10014D50+2DB↑j
7 Q$ y5 D! `. ?( _9 N- D( y0 X
CSpace:1001503C mov eax, [ebp+dwNewLong]
( A5 f7 Z. R! u4 j7 \
CSpace:1001503F mov ecx, [eax+230h]
0 ]* h1 t2 M& k8 C/ a% X
CSpace:10015045 mov edx, [ecx+1Ch]
7 l4 r% x) r, T2 a. @
CSpace:10015048 push edx
% i. M9 D. t" ]& C: ?2 E
CSpace:10015049 mov eax, [ebp+dwNewLong]
2 V$ b+ `" r, _; g+ a- V) v/ ?3 L
CSpace:1001504C mov ecx, [eax+230h]
0 }. b3 g1 Q3 {" T
CSpace:10015052 mov edx, [ecx+20h]
# [# H, Q. Q2 d: m$ d2 a$ o& c
CSpace:10015055 push edx
0 b! S; {( M2 y5 P
CSpace:10015056 push offset aUsingDirectdra ; "Using DirectDraw %s (%s)"
$ ?/ a( U1 J2 R
CSpace:1001505B push 3
# {5 p" _! w8 Y3 l5 O
CSpace:1001505D mov eax, [ebp+dwNewLong]
& }4 v$ o7 i/ v0 U) _1 P- S- Q
CSpace:10015060 push eax
% F' s# }. k+ G @8 `% S+ |/ {
CSpace:10015061 call sub_1003882A
( Q9 `9 W2 l3 h) t# B2 a- i3 p: o
CSpace:10015066 add esp, 14h
4 C3 a8 U) ?' O$ j. U
CSpace:10015069 push 0 ; pUnkOuter
/ W1 I5 H( Y3 Q6 k9 F8 O' J
CSpace:1001506B mov eax, [ebp+dwNewLong]
8 h$ W* C3 ]: I. ^* K9 g1 L, M
CSpace:1001506E add eax, 1DCh
/ ^( o% `2 a7 |. }3 N( X; i! E
CSpace:10015073 push eax ; lplpDD
C Q3 ]2 h% K2 Q- ? Q6 {( F
CSpace:10015074 mov ecx, [ebp+lpGUID]
6 _' x1 J& w- K( W1 M
CSpace:10015077 push ecx ; lpGUID
- t! L( e9 l# x* a3 `9 e- G7 D
CSpace:10015078 call j_DirectDrawCreate
! \+ o4 _( P. i$ l$ b" }4 |
CSpace:1001507D mov [ebp+var_14], eax
, Y+ g0 c2 }0 q v. u/ j
CSpace:10015080 cmp [ebp+var_14], 0
5 B( M2 r8 e0 _2 w- v ^2 u
CSpace:10015084 jz short loc_1001509E
: d/ |% T- O& j; e1 g' U G* ~
CSpace:10015086 push offset aDirectdrawcrea ; "DirectDrawCreate FAILED (Code: %08lx)\n"
& k" w& e! r; A4 X! [
CSpace:1001508B mov eax, [ebp+var_14]
. l6 [' v' \; X& s C; z
CSpace:1001508E push eax
, l( C5 g+ @2 Z$ p7 V" f9 y1 f
CSpace:1001508F mov ecx, [ebp+dwNewLong]
( R: I5 i$ ?: i8 K9 m% o& p
CSpace:10015092 call sub_10038F3C
; d' x$ T V7 b$ Z7 ?
CSpace:10015097 xor al, al
- Z. I* H& e3 o! I
CSpace:10015099 jmp loc_10015173
复制代码
3 d; c Q) c$ X
Y1 Y8 n s+ q
4 G" X# A8 n! G& t# e9 S
我用3D Analyzer对opengl API的调用进行跟踪之后,输出了不少log.
3 M0 |% ^" V6 S, D. o9 ~: `; Z9 s
记录到log_GL.out文件中。以下是摘录的一段。
' s: @) A1 q5 y, x# [5 u
我认为这个游戏大概率使用的是opengl API,程序修改的切入点,还需要进一步分析。
4 ^' v) S; F, ^! y7 _' W: d9 N' b
以前Skywalker 说 这个游戏不能用Hypersnap抓图,这也算是个使用opengl API的侧面证明吧?
# i! i' v: m% n$ B' L
glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
* M: B# t0 n5 O/ m
glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
* W9 t ?, v+ W0 F v
glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
3 f ?" m1 {6 j# X+ l5 l
glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
) T" n' W) R, P; @7 \* P
glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
/ T8 e* d% L& V1 [9 W, \1 O
glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
7 V) x! B l# J8 l% w
glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
9 ~6 X: _2 r. c( |
glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
! s: P6 a0 c+ Z* L" m- p
glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
r) p: X2 b. I# ?9 b; M0 _
glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
$ g- r" r8 k1 H2 O0 r6 b) ?
glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
- I* E, O$ W4 ~4 h) Q
glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
) j9 L5 A9 d0 w7 i7 I" C7 D7 r
glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
8 l/ i; [5 _! C( |7 R8 i0 x2 n: B4 w
glClear, GLbitfield<256>
- n: ^5 A$ c- t) x
glShadeModel, GLenum<7424>
9 M* ~( f( B2 b6 u9 U, Q7 Q
glDisable, GLenum<2929>
- D- r- A+ ?, o1 `( R4 e
glDisable, GLenum<3008>
2 L3 r+ W4 c) v. P
glDisable, GLenum<2896>
; G0 Z* `" E: O3 F5 x3 U4 \
glEnable, GLenum<3042>
' `0 O0 k/ g5 p+ I
glDisable, GLenum<3553>
" V& T* w3 @$ r' v; o: `
glBindTexture, GLenum<3553>, GLuint<631>
' _ S b* z0 e4 w& O
glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
- p& D3 j6 ?2 F3 r7 |# v
glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
! R! e% `. u: I4 N7 k2 D0 Z
glClear, GLbitfield<16384>
5 E# L; _, }( @& l# N
glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
7 N4 X' [* R5 m6 Q* H) c
glEnable, GLenum<3553>
. u1 ]4 L' {* h! l7 E0 P) t
glBegin, GLenum<7>
% a: F6 I! }- w& }
glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
! _+ y: y1 }# v9 o+ K
glTexCoord2f, GLfloat<0>, GLfloat<0>
8 |/ H5 A0 P: B7 r
glVertex2i, GLint<0>, GLint<768>
" P! o& G- R& a
glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
7 Y8 g6 Q% Z$ U, x8 U( L
glVertex2i, GLint<1024>, GLint<768>
4 ]: Y3 J6 }- t, g) ~
glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
6 m% R7 f" B7 ~- E! V
glVertex2i, GLint<1024>, GLint<-256>
" E) g, W! {7 }; O5 N
glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
8 S2 t2 @, B; \7 r
glVertex2i, GLint<0>, GLint<-256>
1 G4 ~2 x3 `. z1 j) }+ k' u
glEnd
' \1 W* p+ Y6 J% v" E! Q- E
glShadeModel, GLenum<7424>
! b6 v! o3 O- S. d' M! [
glGetError
7 K$ u }9 m% M4 c3 a4 B* @* D
glDisable, GLenum<2929>
L R5 `; \: H8 [/ X
glGetError
* T3 j. C" Z- i( p- a
glBlendFunc, GLenum<770>, GLenum<771>
& i! }3 z! e! }4 [9 ~
glGetError
, \8 O; S8 k+ j% s- ^* [6 Q8 F
glEnable, GLenum<3042>
3 s9 s, v! X# O2 C% Y2 `5 v3 Z" V
glGetError
9 R% |5 N4 ]5 D8 E9 m5 P
glDisable, GLenum<3553>
5 J4 @4 m& \2 y5 x2 [
glGetError
8 W' C( A# p: x( C8 e
glBegin, GLenum<7>
8 _4 a- v7 `- p/ h
glColor4f, GLfloat<0>, GLfloat<0>, GLfloat<0>, GLfloat<1059883844>
) P! B/ s% h& `# V
glTexCoord2f, GLfloat<0>, GLfloat<0>
3 {6 n- d* N$ \7 D9 _3 k
glVertex2i, GLint<0>, GLint<768>
! [- R6 I2 v! U& y- B- S
glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
. z# G" l* O8 z
glVertex2i, GLint<1024>, GLint<768>
& O- b7 I+ x3 q% a3 ]
glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
) C5 k+ a6 [; U, q4 A
glVertex2i, GLint<1024>, GLint<0>
. N1 O+ Y1 `/ ~0 l6 B( d% Z- {
glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
: K. X/ ?3 C( m6 G$ t& A
glVertex2i, GLint<0>, GLint<0>
, @4 `( m& m5 i: B
glEnd
' {2 B- T2 r5 |% Q+ r, r5 k
glGetError
/ i5 A# }! ^" m! \: t
glEnable, GLenum<3553>
+ T4 s7 \/ Y, Z% N ^) O/ A" d
glGetError
! y y. U3 {5 W: g5 c8 F- @, W( w/ I
glFlush
% t" ?* O, Y7 i
wglSwapBuffers
. v' F6 R7 y% Z: U0 R1 j5 @
---------------------------
) s1 X% v+ U8 f0 x& n9 ?/ U" P5 R
, HDC<-33484711>
3 ~3 ^6 l! C1 Z" g" V! N; g
wglGetPixelFormat, HDC<-33484711>
' o. }! q, |! j
glMatrixMode, GLenum<5889>
1 Z$ O+ M* D+ M; T# [. `
glLoadIdentity
I4 w9 Y2 K9 X) u3 n' {3 W
glOrtho, GLdouble<00>, GLdouble<01083179008>, GLdouble<00>, GLdouble<01082654720>, GLdouble<0-1074790400>, GLdouble<01076101120>
- r$ t% e) y# q/ e& Q8 ?
glViewport, GLint<0>, GLint<0>, GLsizei<1024>, GLsizei<768>
0 B5 k% D8 ]8 `: a. G" l
glMatrixMode, GLenum<5888>
8 Z/ O% I8 S9 j/ |% E0 p
glLoadIdentity
- E( U; w1 ]% y% q! O' }
glColor3f, GLfloat<1065353216>, GLfloat<0>, GLfloat<0>
5 i8 O& L. E7 @8 p! A1 m, {
glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
" C- a/ x& u5 e' f8 k
glTexEnvi, GLenum<8960>, GLenum<34176>, GLint<5890>
D4 I! G" s' k+ ?- c
glTexEnvi, GLenum<8960>, GLenum<34192>, GLint<768>
V( L! Z5 q, x% ], q$ {, g( j
glTexEnvi, GLenum<8960>, GLenum<34177>, GLint<34167>
# g" G* { `7 Z. M6 h/ c' j- f0 n
glTexEnvi, GLenum<8960>, GLenum<34193>, GLint<768>
# |. A' ~5 V* i
glTexEnvi, GLenum<8960>, GLenum<34161>, GLint<8448>
9 G* h: m5 f' ~* J2 y
glTexEnvf, GLenum<8960>, GLenum<34163>, GLfloat<1065353216>
I9 N- @& B( O" J8 b
glTexEnvi, GLenum<8960>, GLenum<34184>, GLint<5890>
' k: |: Q0 F! `! O( M4 d' d, D
glTexEnvi, GLenum<8960>, GLenum<34200>, GLint<770>
# Q, s* k& |4 a# k
glTexEnvi, GLenum<8960>, GLenum<34185>, GLint<34167>
8 c7 P) d; P) I3 A9 x
glTexEnvi, GLenum<8960>, GLenum<34201>, GLint<770>
0 [# T) b0 K& s# J- m6 K) I$ A) B
glTexEnvi, GLenum<8960>, GLenum<34162>, GLint<8448>
7 k. n$ v0 u0 R; M8 @ ~4 u: t
glTexEnvf, GLenum<8960>, GLenum<3356>, GLfloat<1065353216>
+ U# |) |; R" N7 T5 b9 k: O9 E2 \
glClear, GLbitfield<256>
/ i, i; _9 h3 r0 w
glShadeModel, GLenum<7424>
* l* \' p% R6 G' C) w
glDisable, GLenum<2929>
; M+ A- [8 H* a3 h& S
glDisable, GLenum<3008>
7 |) d/ w, t/ G8 p1 O
glDisable, GLenum<2896>
3 X3 i; Q: b' Z. L
glEnable, GLenum<3042>
$ Q. Z( _3 L: ^0 ]
glDisable, GLenum<3553>
3 {: G' J8 U# |8 j; @. { G
glBindTexture, GLenum<3553>, GLuint<631>
. U/ i! D+ S5 D- I. @1 O* b a$ [, c
glTexParameteri, GLenum<3553>, GLenum<10240>, GLint<9729>
. g1 X7 k8 Z# c
glClearColor, GLclampf<0>, GLclampf<0>, GLclampf<0>, GLclampf<0>
8 G; \: C' K7 |+ r# U
glClear, GLbitfield<16384>
! ?, @6 X8 Q! {* F* n* ]: f
glTexSubImage2D, GLenum<3553>, GLint<0>, GLint<0>, GLint<0>, GLsizei<512>, GLsizei<384>, GLenum<6408>, GLenum<5121>, CGLvoidP<266776608>
4 P) m& w% m5 b2 T) e/ a' h8 f. }0 v
glEnable, GLenum<3553>
5 O6 n: J1 Q2 ?) D6 L/ X1 c
glBegin, GLenum<7>
1 D2 L# S- v' b( j2 ]
glColor4f, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>, GLfloat<1065353216>
: Y2 U" }1 h( m+ O
glTexCoord2f, GLfloat<0>, GLfloat<0>
4 Z9 L% p6 ~: [; r9 K& ~0 |0 Y4 r
glVertex2i, GLint<0>, GLint<768>
1 z% `' A3 N- ~& D# I
glTexCoord2f, GLfloat<1065353216>, GLfloat<0>
" Y' u' D4 r7 |- k F/ i) m
glVertex2i, GLint<1024>, GLint<768>
( _( i. ~6 H( V( Y' P3 L
glTexCoord2f, GLfloat<1065353216>, GLfloat<1065353216>
4 a( `4 ?9 G9 t+ o
glVertex2i, GLint<1024>, GLint<-256>
0 Y) q1 K2 R1 u/ _
glTexCoord2f, GLfloat<0>, GLfloat<1065353216>
) K9 `+ V7 U* i! z( ]( v& i
glVertex2i, GLint<0>, GLint<-256>
; J+ K) M4 w, y0 |1 r, }
复制代码
/ y+ q9 i$ J! n: @) k
. O: N) B8 [* L7 Q- e; d
欢迎光临 冒险解谜游戏中文网 ChinaAVG (https://chinaavg.com/)
Powered by Discuz! X3.2