本帖最后由 shane007 于 2023-9-4 18:48 编辑
' L2 @$ ^) B# o% f" }' E: H
/ R8 h8 c7 G- N$ I0 q这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。4 h4 M5 m; u2 h1 y
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
4 }& h3 h+ ?/ u0 W: g
8 t% l( X5 z4 F& G- L$ f
- C3 Y- e2 a8 r6 G% k, |4 rglGenLists的调用有4处,前3处参数为1,应该不是。
3 B* M3 g( E9 k! D一下是第四处代码,这里应该就是生成字体的地方。) T# P( y8 L3 E1 T. [
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。
8 D- P9 K( f" n# {2 l- int sub_40BEB0()7 [0 X! z Q$ j9 [6 _
- {
5 A W8 ?: c4 g' m - signed int v0; // ebx8 k) J. W8 P* |
- int v1; // ecx
0 w6 H% a& e, z+ _" s3 d! i( g - float v2; // ST18_44 H$ M' N+ h7 ^. z- r _' z% E
- float v3; // ST1C_4& ^! A+ Y' c( Y2 F1 g/ j) f8 J0 J
- float v4; // ST20_4
" j) x, i3 T% }2 O# ^) R0 A* ?& g - float v5; // ST24_4
# h# S" I. X8 ~2 M - int result; // eax8 X, w& k+ F5 T! ]9 j- u* l
- 9 f9 d. G) Z) [: G7 @/ g8 V/ R
- v0 = 0;$ O1 n7 l: Y4 ], s+ P; F3 W" d
- dword_4DF5130 = glGenLists(272);
5 A" }( i2 i, `# [3 O - do" n$ q6 ], b8 k; r- D* x
- {
# a! f i: A1 Q) F/ q, e# Q - v2 = (double)(v0 % -16) * flt_483450;
# [+ w; L: P: {4 f6 n - v3 = (double)(v0 / 16) * flt_483450;
3 j: W0 @& r, _& O4 t% ? - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);) w. q2 P" y* h( G& L( v: ^, C
- glBegin(7);" P( c% g5 X, @$ ~) }3 @% a$ i; K/ v
- glTexCoord2f(LODWORD(v2), LODWORD(v3));+ O+ y/ U' y/ P' L
- glVertex2i(0, 0);1 M r# R W. N8 v
- v4 = v2 + flt_483450;
# E3 y) ?9 _# r3 O - glTexCoord2f(LODWORD(v4), LODWORD(v3));
3 l5 Q7 z$ r+ B. S9 m - glVertex2i(16, 0);
8 Y* y8 U. p& r j - v5 = v3 + flt_483454;6 e- ~4 V' E7 K- w$ v% U( L
- glTexCoord2f(LODWORD(v4), LODWORD(v5));
' m; }/ J7 A3 I! e n - glVertex2i(16, 16);
+ g$ i5 ]% G. z - glTexCoord2f(LODWORD(v2), LODWORD(v5));
, M7 Z1 H0 n* y/ y: T! C& f5 e - glVertex2i(0, 16);
2 }1 i) n2 F6 C6 z! }0 D9 m( e/ r - glEnd();0 f3 [& l' M. [; o* m& `. D
- ++v0;% B6 E4 x% E$ a" o
- glTranslated(0, 1076101120, 0, 0, 0, 0);
1 E5 U- k# v8 r1 o4 K6 ^3 \ - result = glEndList();
G0 V8 T2 U' D* F; @% J9 X4 m4 ]* x - }
) G6 d6 Z7 t2 @0 A8 Q+ S& f - while ( v0 < 272 );3 s, G: G+ q0 H6 c
- return result;
9 A, F3 L7 q" q0 s; z6 k - }
复制代码 & ]8 u3 F7 a" x& \, W* C6 j, o
8 [, W2 D; o0 a4 [# V
对glCallList的调用只有以下一处,& v3 E% P3 a7 a8 }
这是显示单个字符还是字符串的方法,待以后再确认。
V0 W6 |: x' D3 i# ~' D glCallLists(strlen(&v7), 5121, &v7);5 B& I# ]; ]; a! N
5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。
9 [6 h3 G$ \+ q4 p
9 z0 `& W: z9 q4 e9 h: a' o- #define GL_BYTE 0x14002 U( ~! A3 Z+ N( z
- #define GL_UNSIGNED_BYTE 0x1401
8 j3 M* H8 B _) x+ Z l) C9 S - #define GL_SHORT 0x1402
9 Z: B) n+ I1 H) f5 ]# X# N$ c R - #define GL_UNSIGNED_SHORT 0x1403
: N9 I; q6 A% I. } - #define GL_INT 0x14040 o# x. ~1 K. k T5 O
- #define GL_UNSIGNED_INT 0x1405# e0 P% B" r$ F1 P
- #define GL_FLOAT 0x1406
, k$ T) E8 H% w1 `4 `) l - #define GL_2_BYTES 0x1407
' W: \2 |2 @: j& Y: v - #define GL_3_BYTES 0x14085 w0 n9 {; L8 ?2 Z' ?, W ^# m0 R
- #define GL_4_BYTES 0x1409
# {# m2 s7 X0 N& H6 @' n4 G: z( L - #define GL_DOUBLE 0x140A
复制代码
5 C4 m7 h" A) }6 w+ l; s4 |( K& ^9 G2 E/ Q% L% N7 W3 [
- # g% E3 i( g( f3 I1 ~- I
- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)( E$ ^- v1 E7 x: G0 `; o
- {+ ^: [1 g+ U4 ^+ w' i, m
- int v5; // ecx% X; U& k9 `2 \
- int result; // eax! @' V$ ]1 p% |8 s. g% \
- char v7; // [esp+18h] [ebp-118h]
/ z7 q; h: ~* R; B( {7 d - char *v8; // [esp+118h] [ebp-18h]
! t* C7 r- d( a7 F: p - int v9; // [esp+11Ch] [ebp-14h]
! h& @/ A; G7 s: }# Q - int v10; // [esp+128h] [ebp-8h]; F7 W7 Z0 `: l4 Z* i/ \
: G3 G6 r+ v/ M7 c2 _. _- v10 = v5;
- T0 ?8 Q! S1 Z5 |2 ` - if ( a4 )" _! o8 f$ n, S, X1 r" {- u6 c
- {% A+ b2 y8 G0 L. U+ v
- v8 = &a5;
+ ~/ o) }- ^+ i) {! d2 e - sub_41BA00(v5, a4);: g( c0 l4 k% _$ t6 f
- v8 = 0;8 ^: [+ a' u0 \# `
- glBlendFunc(770, 771);4 u9 @( S4 _# N, g
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);. ^ d" C" S+ U0 c
- glPushMatrix();- c6 b: d4 j# C$ |" } X
- glLoadIdentity();. v& H3 t9 y2 n! J* }' H
- v9 = a1;( E; p. O: ]) ?8 j0 t! |7 J
- glTranslated() A# G2 q5 ?- z) W
- COERCE_UNSIGNED_INT64((double)a1),7 s$ B! H7 \# ]& B0 q4 i! ]- h# }
- COERCE_UNSIGNED_INT64((double)a1) >> 32,
* g; I6 K6 R, ]0 X7 u# D$ w# k - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),
! R# U( @5 R2 m& g4 h - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,; Z7 v5 l2 o2 V- q$ n8 `
- 0,
* R M! i% \2 v% c: B* E - 0);4 H) v0 E+ V$ i4 g, y3 P$ N
- glPushAttrib(0x20000);1 q: k( y; Z1 p
- glListBase(dword_4DF5130 + 16);2 c7 o4 r( C/ U9 U$ Q( H2 A7 f% _
- glCallLists(strlen(&v7), 5121, &v7);
! i. n( {: q" G; b- `' n - glPopAttrib();6 C4 v/ M0 K! j8 Q$ q( `
- result = glPopMatrix();& U) @0 M2 n3 D" q, q
- }
) s, T g$ ?6 f" u* J- m1 U - return result;
6 a7 N, |- I; y& t/ u5 | - }2 H2 ~0 X+ K: @% ^4 X7 e) T+ j$ q
复制代码 " _0 H7 q7 O+ ~# \; U9 B
d2 b) @( |. Y# h
. I: ?/ h1 i9 }
|