本帖最后由 shane007 于 2023-9-4 18:48 编辑 2 G" A& s7 z6 ?6 C; s
' x, }- x5 V' n. H" p8 x这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。
1 H! u- P% P) @7 E9 Q0 g对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
+ h1 ?5 \1 [& D1 Q) v/ Z' j/ m
9 q* B8 t$ ?8 n+ i* x! ` ^6 I6 h* X. {+ l% Z1 [! c+ [. L% d& X
glGenLists的调用有4处,前3处参数为1,应该不是。
& l4 w. f7 e# n: {7 H一下是第四处代码,这里应该就是生成字体的地方。* P% z) q& J4 y! u" |
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。# R2 t! A2 [# ?# W; p5 u3 a
- int sub_40BEB0()
) p* q& R2 D( g* b2 z; H+ x - {
, V; z0 ~) n$ p3 Y5 V" ~ - signed int v0; // ebx
5 ], V; E, v9 ~2 ?7 o$ z: o - int v1; // ecx/ u6 d% }6 R" T6 L" }
- float v2; // ST18_4$ e: ~8 ?) g/ Y: x6 O" g
- float v3; // ST1C_4( J4 a0 B% I! O) L2 U6 l
- float v4; // ST20_43 _, N" G/ n# R' F" c5 ]! o
- float v5; // ST24_4! J8 v8 x% ^! D
- int result; // eax
2 b- ^3 B" Z0 O2 z/ P- e; O - 7 O, ?# x& V. I7 ~6 R$ k: R
- v0 = 0;
* A1 \5 G! @; \& r; J3 _% C. c - dword_4DF5130 = glGenLists(272);
2 w6 \0 n8 R7 v& r - do
: }1 K3 C, i) Y [+ [6 D - {' b6 i# u% y3 \' z
- v2 = (double)(v0 % -16) * flt_483450;
/ z( A" m5 i5 ?/ U8 F2 p' r - v3 = (double)(v0 / 16) * flt_483450;
5 G! U. W" P6 g - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);3 F3 [ @$ ~4 V
- glBegin(7);
& n( y4 ?% b$ T* X( @& | - glTexCoord2f(LODWORD(v2), LODWORD(v3));
. T- L5 @8 E; K - glVertex2i(0, 0);5 W& D8 g; I. |3 A0 V* b. s
- v4 = v2 + flt_483450;4 b7 T* `8 M' H5 z
- glTexCoord2f(LODWORD(v4), LODWORD(v3));+ O8 ~; F! d( J
- glVertex2i(16, 0);
& f& i7 P M K - v5 = v3 + flt_483454;
( B* U: D1 r! R* n, v/ z - glTexCoord2f(LODWORD(v4), LODWORD(v5));
^( e. h) P- Z4 ^8 D( O - glVertex2i(16, 16);5 k) k2 F: t+ Z) b
- glTexCoord2f(LODWORD(v2), LODWORD(v5)); Q8 y; @" F# |* V
- glVertex2i(0, 16);2 z3 Q7 x" J9 n1 | {
- glEnd();
; D, Y) Y! i! Y/ J3 R - ++v0;
3 t' W5 a4 V6 U q - glTranslated(0, 1076101120, 0, 0, 0, 0);
6 b( R3 e& N! @6 N2 e) e7 F; g' ] - result = glEndList();
- m1 \# a/ s V - }2 J/ U" y7 S* f4 f
- while ( v0 < 272 );- i2 T- D7 A' [1 O' B! ~3 \0 G
- return result;
) T6 K- \- v# b8 G+ X" k& ^4 O - }
复制代码
* k$ p3 c$ k8 }+ w& l# `: |6 i- Q0 l4 X: r5 ?) |$ W" h5 y
对glCallList的调用只有以下一处,' Z/ R; m9 Q* f
这是显示单个字符还是字符串的方法,待以后再确认。
# g# u. l9 p9 N1 J' j glCallLists(strlen(&v7), 5121, &v7);
( t/ I/ j4 R8 V; Q4 ]5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。. Q, K' }8 R: V8 [! ^
8 F9 A; a9 T: v/ t5 j' e5 C
- #define GL_BYTE 0x1400
# P# s4 z1 k9 \ - #define GL_UNSIGNED_BYTE 0x1401
8 |) @' s8 K6 C. F - #define GL_SHORT 0x1402. y4 a. Y U( I$ M& o
- #define GL_UNSIGNED_SHORT 0x1403
/ ]$ Q! i6 |/ m( D% f( V - #define GL_INT 0x1404
" i% ~/ }( @+ h7 s - #define GL_UNSIGNED_INT 0x1405
9 y* P$ K% c1 }6 [0 K) v - #define GL_FLOAT 0x1406& \; ?) |/ s8 f. ]$ q/ J* Z* A
- #define GL_2_BYTES 0x1407" `4 m; X8 X8 I: S- h" Z! }. ]" J+ v
- #define GL_3_BYTES 0x1408; h4 s: ~# W8 p; d# @, m
- #define GL_4_BYTES 0x1409& @& Z' M. I, C+ {; e
- #define GL_DOUBLE 0x140A
复制代码 3 a% Q0 W0 F- w
! I+ `& P2 C( a- ! H* s' M1 v. N. O+ f# c
- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)+ b0 Z) g6 P' d* J# K9 C
- {
7 ?% f% a2 X: z; l5 l - int v5; // ecx: c& {4 b( D Y+ u
- int result; // eax
, o: r1 ~* q& s: B. V* i - char v7; // [esp+18h] [ebp-118h]3 P. Q$ K% [7 S4 [ T9 e
- char *v8; // [esp+118h] [ebp-18h]
9 V& C4 u7 w# c6 s - int v9; // [esp+11Ch] [ebp-14h]
6 w, d! z& ~1 Q# Z4 _; Y9 M2 w - int v10; // [esp+128h] [ebp-8h]
! j) A7 n) O8 `# h2 K$ n, I' f! a
: f3 X5 C& s, B) d- v10 = v5;
2 |. E; w7 V9 b - if ( a4 )
9 b2 T# [0 N3 r2 H/ Q" A) P - {
, Z* F% |* j4 P. Z+ }' ^ - v8 = &a5;
2 [ r! O3 e, b! r. L' N3 H - sub_41BA00(v5, a4);6 i( D, q4 C/ M: Z8 L0 s
- v8 = 0;. b: Q' S' a( B; |. a4 e1 E
- glBlendFunc(770, 771);* s7 Y1 f7 i4 k' d% u o4 g
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);' H! H. g y8 l/ O& J
- glPushMatrix();
) a0 `5 s& h, k P9 z( z9 X& K$ A - glLoadIdentity();) h# d( w' P) p
- v9 = a1;& S. W4 n6 |: R7 V4 A. p: _
- glTranslated(
" q1 B/ P! k# t G, B0 k- V - COERCE_UNSIGNED_INT64((double)a1),
/ Q- n. u/ i! s- v' J - COERCE_UNSIGNED_INT64((double)a1) >> 32,9 |' u' c: c. U# d( x) Q
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)), s6 Q' O$ b% u [2 P. }
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,
" x& b' j3 |$ \6 ?/ r- n# A - 0,: J; {, j3 \! r: H4 q
- 0);( i" H# K5 `* \% x1 l; Q# Z
- glPushAttrib(0x20000);5 [# t" k$ {" e
- glListBase(dword_4DF5130 + 16);' k+ Q! G/ l+ I, z
- glCallLists(strlen(&v7), 5121, &v7);- _' o' \7 J5 G$ }+ m% r
- glPopAttrib();$ @: A( [' N# T0 R( }+ C
- result = glPopMatrix();+ }4 f/ a5 Y; d% q8 v0 |
- }
1 ~3 ]0 c: e# `* G+ o4 X/ H3 @& p - return result;
6 T8 A) Y3 P- ~3 h8 Z - }
9 f4 W V3 a3 U& A
复制代码 1 G/ |7 E5 K8 K5 n/ P
$ B' W; ~9 O" l! i- P! \# a# C& [( n3 w2 E* e1 Z9 ^; y
|