本帖最后由 shane007 于 2023-9-4 18:48 编辑
+ @8 w1 I& Z, X: Y7 [0 g8 l
5 E- D( h) S. q: v2 Y( L% \这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。, o7 Z7 s' {7 ~8 X; H
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
3 G/ I, I3 _- h y3 w! ?
% i) ?, ~" e& h$ o+ N( t2 }
8 z3 c( M8 L- W# V2 PglGenLists的调用有4处,前3处参数为1,应该不是。 z u9 d- b; J ^
一下是第四处代码,这里应该就是生成字体的地方。3 G$ L3 r _3 {. u5 K
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。" w- j6 e% z6 v6 |' F' C
- int sub_40BEB0()+ J+ g2 x) y2 g( `/ @
- {1 D# o, i6 F, {7 a1 b% }8 n& H+ f
- signed int v0; // ebx
: D6 z( S5 G: V! H; e - int v1; // ecx
8 m- n0 i _" t; b- ~ - float v2; // ST18_4
( K, @- ?# x" | - float v3; // ST1C_4: q' t: e" ~( e- S
- float v4; // ST20_4
$ t# `! B w: H+ I - float v5; // ST24_4
7 \2 A, _% W5 [& C1 p; Z7 r( v. q - int result; // eax
3 c0 N$ N+ m# k( Y - * L/ `" B- C7 G" P0 j8 n* _
- v0 = 0;
" J9 q5 w0 f5 |* u6 i/ m - dword_4DF5130 = glGenLists(272);
. S% m: }2 d% F% D - do" n* [7 V5 W* n4 T5 H
- {
/ J$ A1 o8 p0 e# u: X - v2 = (double)(v0 % -16) * flt_483450;- A$ w/ x& G" O7 u1 D
- v3 = (double)(v0 / 16) * flt_483450;5 K( C. S7 n! S4 g8 D! x8 s* [0 f. _. e
- glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);
; W2 m7 E8 Y* g0 d1 u; ?/ D4 f - glBegin(7);& Y3 L& J& J8 c- {0 s. I
- glTexCoord2f(LODWORD(v2), LODWORD(v3));
% E0 \$ Y4 G6 W" ], c; I) }% Z# ~. I - glVertex2i(0, 0);( f' ?1 ^5 U' M" w
- v4 = v2 + flt_483450;
! w5 J' y) Z* I8 m- Q- { - glTexCoord2f(LODWORD(v4), LODWORD(v3));
: Z1 O' f5 x( H/ G2 r, K6 F - glVertex2i(16, 0);
% O x* b/ C/ m6 Z1 P0 H& Y# H - v5 = v3 + flt_483454;1 `7 g6 R/ N6 g X5 }* I
- glTexCoord2f(LODWORD(v4), LODWORD(v5));6 G! U" N% P' ]% b, m' P
- glVertex2i(16, 16);# d4 f; e, ~. o) G- c& M: v
- glTexCoord2f(LODWORD(v2), LODWORD(v5));4 A2 \( m# _$ Y: c3 t
- glVertex2i(0, 16);3 `- q' l7 c* r
- glEnd();
r) ~" s8 C2 t7 _+ J. p& N& R - ++v0; _& @8 f9 ?3 _2 ]/ [
- glTranslated(0, 1076101120, 0, 0, 0, 0);; U+ {. O) w' m' M; R
- result = glEndList();) B* |8 t {% S
- }7 V$ G- _ w/ i% t/ a# ^/ h1 Q
- while ( v0 < 272 );
6 S: \$ Z" d4 u2 G - return result;/ u3 E* G1 h5 W9 Q* ]: L
- }
复制代码
% D: `2 S5 P" s" t2 ^- {8 s' W( X* `. d( o
对glCallList的调用只有以下一处,
8 X5 ^; e! l, ~& {( C5 I这是显示单个字符还是字符串的方法,待以后再确认。! g& ]& o- x) X
glCallLists(strlen(&v7), 5121, &v7);
) a* C- g4 T' w3 c1 e, g, B! o) D2 Q! i5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。
2 S0 ]8 z+ e2 e2 _! I. e6 t6 t. F. Q& }0 X7 D, A+ I
- #define GL_BYTE 0x1400
" I9 b* o, c9 ]/ w! L - #define GL_UNSIGNED_BYTE 0x14013 e/ w; u3 v* Q9 l
- #define GL_SHORT 0x1402
. \1 o/ [# j' r - #define GL_UNSIGNED_SHORT 0x1403
) S5 {2 o4 C8 b1 ?% t0 t d - #define GL_INT 0x14044 I" a8 r0 [$ `3 o, W; a
- #define GL_UNSIGNED_INT 0x1405" s; u4 \+ S0 Z! o
- #define GL_FLOAT 0x1406, D+ X7 _% X! ^6 [) i8 ^
- #define GL_2_BYTES 0x1407
7 N& f0 K: m, I& B - #define GL_3_BYTES 0x1408
; D0 S5 i3 O, E: _# }/ F+ N - #define GL_4_BYTES 0x1409
" B9 ]; }* T/ T1 X - #define GL_DOUBLE 0x140A
复制代码 . I* B, P1 C' o* E6 I' L
) t: e( m1 @0 S E3 J
6 g* N" i& u7 y' P E; b- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)
& l; c% D1 N5 P$ } o - {4 }9 |( K" i/ N) n9 c9 x' H. M+ L
- int v5; // ecx
; P# | i, x1 ]. J* Z/ ~2 M - int result; // eax
" G$ K& |& w8 T& w! r$ R, K/ Y - char v7; // [esp+18h] [ebp-118h]# L/ V3 ]/ l6 G+ G' T
- char *v8; // [esp+118h] [ebp-18h]0 J% m2 a/ u+ X1 y$ u. `
- int v9; // [esp+11Ch] [ebp-14h]/ v3 w3 F& w2 \, q6 `+ M& m
- int v10; // [esp+128h] [ebp-8h]
& b/ s! |$ \( d% y% n& W
. j3 F1 u" M, S- v10 = v5;4 J7 o8 k# d) \/ ]- m1 F
- if ( a4 ), |* ~( ]9 ^9 g) C: I i8 \
- {9 c( `+ O5 {7 b: c4 K: W
- v8 = &a5;
9 @, T/ Z" u% [" i7 o3 J! v - sub_41BA00(v5, a4);% t4 @+ c i! R
- v8 = 0;
$ O1 m! H+ t9 A+ e( K8 b; p* w$ ` - glBlendFunc(770, 771);8 h" p- W3 K* O4 ^0 u
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);3 Z& w5 A2 Z- k' r4 ]. p
- glPushMatrix();
/ ]# V& i" P, Y& Y1 ] - glLoadIdentity();. b% M+ j0 l+ w3 E5 v
- v9 = a1;, @% ~& P5 E! ]4 e
- glTranslated(. i. I# j q, c1 |" X: f$ K6 o
- COERCE_UNSIGNED_INT64((double)a1),
5 x6 E: I l: w - COERCE_UNSIGNED_INT64((double)a1) >> 32,
5 `. u" |. \* z% H3 M) |# a L - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),
/ h7 y7 Q5 ~9 {" ?) l - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,. ]' @4 |- h# q" t
- 0,
9 X8 a4 o2 N2 a+ U! m - 0);
8 y% I8 o% l3 H# ` - glPushAttrib(0x20000); d! `( `" y+ I
- glListBase(dword_4DF5130 + 16);; ?) r5 D* v% F( t; ]
- glCallLists(strlen(&v7), 5121, &v7);
* W! S6 L, I# g/ f7 A% H$ ]; X - glPopAttrib();
Z7 b) H" ?5 v) |/ |- m( }( z - result = glPopMatrix();1 V: w/ ?' x8 i) q1 P
- }
2 Y3 k, d9 e7 \: o2 ~" U! ? y - return result;" ^1 y( w) A- R2 v$ v, c" ]
- }
! x0 `) O' x7 f; p3 k6 E; k q; x$ L
复制代码
! B1 s2 J' z# b
W7 @4 m$ y' g
, @6 z3 q% \ d$ `# C7 F8 k |