本帖最后由 shane007 于 2023-9-4 18:48 编辑 ! I1 L& f& }/ V- ~
( @. N3 V. ? ~( X* s0 A这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。. u0 E/ h2 Y: n. C3 }4 Q
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
. Z, T0 ~& Y6 K2 C1 s
3 ?, Z( i# z2 i: X
3 j5 X) A9 {, x# _glGenLists的调用有4处,前3处参数为1,应该不是。/ A! I7 z5 D2 D$ M2 E8 S
一下是第四处代码,这里应该就是生成字体的地方。
$ _2 X% b( L6 x3 w) @( Z从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。6 q$ {: e" o4 y5 S
- int sub_40BEB0()1 Y0 H& T9 L% N6 a- }
- {
8 H3 y+ K" V n3 R1 O, I - signed int v0; // ebx
$ r$ A9 s. b" ]2 V1 g - int v1; // ecx
4 z$ z3 W! a: V* T: J - float v2; // ST18_4
8 Q+ U1 g, q8 L; U2 c - float v3; // ST1C_47 k X8 C r* P% b! N
- float v4; // ST20_4( ~, E# _, H' g+ J# x
- float v5; // ST24_45 Q, u( G; ]2 T) n' W v
- int result; // eax
q z! V; S/ B0 I K4 {' m
0 v0 E0 r: K S; h; `* y) Q/ P; y- v0 = 0;9 i3 @) Z. T, t' R v
- dword_4DF5130 = glGenLists(272);
/ m0 I- B, t0 V - do
8 x+ |6 ]+ b0 e5 Z% y: ~6 c - {3 z8 o& Y3 C( e& r
- v2 = (double)(v0 % -16) * flt_483450;
9 y; V3 u( D# ~& v8 e0 Q8 m3 _& Y$ E0 N - v3 = (double)(v0 / 16) * flt_483450;- R- ?; D N" C7 ^
- glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);; i, z4 D7 s, c/ K3 S; g# c. ^; I) M& y0 S
- glBegin(7);6 A# _/ {- V+ r G: N
- glTexCoord2f(LODWORD(v2), LODWORD(v3));0 {/ E/ |2 |& _
- glVertex2i(0, 0);) }9 ~8 b! @: {# ?/ ]: R
- v4 = v2 + flt_483450;" h. @& t" L7 h3 j0 w+ I
- glTexCoord2f(LODWORD(v4), LODWORD(v3));
& a8 _/ y: Y0 O! u - glVertex2i(16, 0);
( l% b" _1 K: ^1 y7 ] - v5 = v3 + flt_483454;! c/ n9 Y4 ?! q$ Y1 |
- glTexCoord2f(LODWORD(v4), LODWORD(v5));4 S+ T, g8 ?4 N" O: ^) P
- glVertex2i(16, 16);; B4 U8 J0 A* P& K: N
- glTexCoord2f(LODWORD(v2), LODWORD(v5));
4 { w1 q8 l+ h! d6 g - glVertex2i(0, 16);
( i, C0 m N, e7 q9 s& A - glEnd();
" ?8 D$ o5 h5 r1 Y* X - ++v0;
' _+ z3 J B, L' Q" t4 I - glTranslated(0, 1076101120, 0, 0, 0, 0);
& m9 U/ \/ P' V9 r; X! N$ Z - result = glEndList();
! w4 u2 V# I/ @ - }& O. e9 @7 G5 K& p4 q% c; w
- while ( v0 < 272 );
4 c/ a! t; M& [# y - return result;
. H D' J4 d6 A5 R% _5 L - }
复制代码
. Q4 F! |( o- I% }
4 M8 _- w$ I+ i& l: a对glCallList的调用只有以下一处,
" M2 _; k9 x5 z. p, H这是显示单个字符还是字符串的方法,待以后再确认。
) D& _+ V! E* t b3 i" m+ o: k glCallLists(strlen(&v7), 5121, &v7);" K j5 ]* T! m
5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。; Z3 {. P$ }5 _: \2 L
: J8 [7 }- g3 _% d! o( x H: N* N- #define GL_BYTE 0x1400
, S) R0 \: Q3 B$ B& G, l% R7 ^( a - #define GL_UNSIGNED_BYTE 0x1401
$ `8 W2 Y" N. U/ D$ p - #define GL_SHORT 0x1402
' h* r2 r( G: c) N7 @$ A) s& o2 G5 S- c - #define GL_UNSIGNED_SHORT 0x1403
, z. y( D, A7 _0 K - #define GL_INT 0x1404
- S6 F3 {9 r2 p/ D0 Y. i6 o - #define GL_UNSIGNED_INT 0x1405
: V% S3 Y9 @- p- X; Y - #define GL_FLOAT 0x14068 A- ^( P1 }3 j2 d2 k0 F
- #define GL_2_BYTES 0x1407 y" H7 t, A! @9 ?
- #define GL_3_BYTES 0x1408
. I7 A4 J1 X$ U) x% A# P - #define GL_4_BYTES 0x1409
$ V4 b, l- q9 D- K - #define GL_DOUBLE 0x140A
复制代码
/ x+ C: B2 |6 _* D0 o D" G) F: q6 K& c9 F+ @% X5 Y
- , }& u, N) x4 K4 l: ]3 |
- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)
( [7 S' j# n- I% ]. L - {
9 Z6 L9 F" f# }. d% o+ t - int v5; // ecx+ H/ v. r' N7 a7 z
- int result; // eax
1 ^3 ?# q) |3 ^ - char v7; // [esp+18h] [ebp-118h]
: o3 k: K/ h, z/ e. R7 | - char *v8; // [esp+118h] [ebp-18h]
* k: O/ R, Y7 L7 z - int v9; // [esp+11Ch] [ebp-14h]
4 M. [' S4 u* m, A/ K - int v10; // [esp+128h] [ebp-8h]/ J4 Q9 E9 n7 u# y4 b% J1 Y
( q) q2 f' a: V0 z, [" `- v10 = v5;* f0 V. V3 `5 V6 z- w
- if ( a4 )
2 a0 c! x* }: L$ N; L - {
6 i. b; j. Z8 X" i) J* W - v8 = &a5;, s* G5 r) `/ `" ?8 }; G
- sub_41BA00(v5, a4);
0 N7 B; }0 n0 S: b. }' L - v8 = 0;
1 q& K0 D( a7 ~ - glBlendFunc(770, 771);/ Y, e/ t0 e( ^1 @+ L
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);( B2 S! R0 p& R" G
- glPushMatrix();
2 c* Q* U: E: V! V& g - glLoadIdentity();1 [; j. p: u; y- S( Z% z. z! v& ]' X# |6 e
- v9 = a1;8 \# Q m% ?, H0 `6 h. G5 h& c
- glTranslated(
3 U1 s E8 e# Y: G. o - COERCE_UNSIGNED_INT64((double)a1),
* d: d! |1 p' T+ z8 X - COERCE_UNSIGNED_INT64((double)a1) >> 32,7 U0 Z A$ x- J: c
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),2 w/ ~+ Q- \% X# d) G
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,; v! m/ Y0 m6 w& k
- 0,
6 g8 h" n0 o5 _3 t# B- n: | - 0);9 v) E" @6 B( M6 ^' s
- glPushAttrib(0x20000);
" W$ W Q1 @$ V5 N% \+ Z4 C. z - glListBase(dword_4DF5130 + 16);
/ l+ G& R6 i6 F; | - glCallLists(strlen(&v7), 5121, &v7);
2 ~. O0 K2 T5 o - glPopAttrib();
+ K, w& {: W7 J. y - result = glPopMatrix();. ]# J- E7 F+ j# D4 A9 R
- }
* G( Z* A! M K( K& C - return result;; I3 Y O: ]/ O, R8 N- a$ e
- }
% u+ o1 Y v2 A' k
复制代码 " v5 T* N2 \* V0 Z! q6 a) ?" Z
- i$ R/ H1 R: K% v' Y8 c# l
4 o1 N4 E* b ^; c |