本帖最后由 shane007 于 2023-9-4 18:48 编辑
. {. [4 n& U; c8 y; r
5 h# a* q3 H* s1 d7 i& O* T这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。$ |( t- D* U9 A& D/ U9 Q$ @6 i
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
! g- D- K1 E" h% d9 X0 a! y3 f. \, e, X9 z: a4 H( O. ~. g- t
" U9 Q) @ G) S" H. P$ J4 O
glGenLists的调用有4处,前3处参数为1,应该不是。
! r$ Q" _0 U# D一下是第四处代码,这里应该就是生成字体的地方。$ l3 Z0 C5 K1 |8 s
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。
0 B+ a! Y/ }% B6 _8 l# _9 T& N- int sub_40BEB0() _: ?) d. Y( e7 m
- {
1 N& C/ Y$ b$ J; Z6 Q2 P - signed int v0; // ebx, Q1 c! ~+ J+ B. c. q4 ?, J* ^
- int v1; // ecx
% m6 a, `9 p5 z - float v2; // ST18_4
9 z1 ]* k m: H1 X- v; x - float v3; // ST1C_4
, V8 W" A \ v( J" @) A- T7 E: t - float v4; // ST20_49 @# z& W& K# S) r
- float v5; // ST24_48 Q# n0 X, r+ P. `
- int result; // eax. L) O e3 t6 i p
$ R1 i; G9 V5 B! Q9 D( F- v0 = 0;
8 y, n) f9 }) r3 v9 V5 L - dword_4DF5130 = glGenLists(272);( I) f& T9 f' U! p
- do
g* t( c, |* g" y5 I% d - {1 J3 C% O7 z4 F9 A
- v2 = (double)(v0 % -16) * flt_483450;
# D5 O/ e: s% S0 w3 Y, S: Y- P7 H! J - v3 = (double)(v0 / 16) * flt_483450;/ G7 l: H5 J+ T! b* i! f/ H: J6 Q- ~
- glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);
$ \1 K7 y% d' }# S. S - glBegin(7);# x- r( S! _: S, l5 b! p3 M' ^' j
- glTexCoord2f(LODWORD(v2), LODWORD(v3));" q; ^% r6 y% `, w0 g! Z' f
- glVertex2i(0, 0);
6 |- W7 {) X( m - v4 = v2 + flt_483450;6 u( Y# ]# o1 u/ |1 ~- Q
- glTexCoord2f(LODWORD(v4), LODWORD(v3));& q/ a( z% V+ o0 K' e3 O
- glVertex2i(16, 0);, j- c. p+ ^' b. \% @
- v5 = v3 + flt_483454;1 e+ _* ?1 @) @7 x( q( C3 O
- glTexCoord2f(LODWORD(v4), LODWORD(v5));
9 J1 S8 y: t: X) b. `% A x - glVertex2i(16, 16);$ Q5 k6 }+ C1 w7 s
- glTexCoord2f(LODWORD(v2), LODWORD(v5));9 ~ w5 `$ B+ n7 q
- glVertex2i(0, 16);
( G# p& z: S8 o- ~) W - glEnd();
" m7 ]( O0 J: H' p' x. z+ a f6 b - ++v0;5 A: l/ m! f# F9 k7 U: ^- d) R
- glTranslated(0, 1076101120, 0, 0, 0, 0);% m' H6 C, I4 @' B8 J
- result = glEndList();
1 C# j' o; E1 \ J1 z: ~) Q - } N% V4 e7 D0 e% `: _
- while ( v0 < 272 );. O$ s. ]6 \: H1 x* r
- return result;
- r. l% e9 @6 I3 M0 Z - }
复制代码 , E8 s3 k1 ^, e- G8 A6 O! S
4 r$ Z% o. r6 _9 \$ N
对glCallList的调用只有以下一处,% e- E% b, D, E/ S( `
这是显示单个字符还是字符串的方法,待以后再确认。
0 ^. A5 R( z# t/ W- M glCallLists(strlen(&v7), 5121, &v7);
5 {/ p* ^* v& m% f5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。
3 O1 ]& t( ~% @: G7 Q9 f+ G
# O6 p7 }4 X: ?9 X9 W7 u" t- #define GL_BYTE 0x1400: s+ n8 {8 v) ]; T$ u- `) C
- #define GL_UNSIGNED_BYTE 0x1401
5 f/ }: d7 n. W1 x. i - #define GL_SHORT 0x14025 @3 T. q8 e2 u9 s4 y: ]5 P
- #define GL_UNSIGNED_SHORT 0x1403, q# a( m: T/ P- _. w7 }
- #define GL_INT 0x1404
- `3 {% s, ?3 [4 c. B - #define GL_UNSIGNED_INT 0x14051 J. [. m! z+ ^ x
- #define GL_FLOAT 0x1406, f, T& r, J4 k* f e$ }; l* g" O
- #define GL_2_BYTES 0x1407
( I# F$ H, O6 c6 E" t - #define GL_3_BYTES 0x1408$ k3 K/ z1 a! E. _5 P% Y7 f
- #define GL_4_BYTES 0x1409/ z8 \ h0 W7 J, w$ k$ W7 Y
- #define GL_DOUBLE 0x140A
复制代码 & ~2 N4 j, S0 U, z
& v. r" |5 g. j0 S- _! z
3 p. x1 C& V6 a2 u- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)
! e J# R; K K( P, g; k - {
3 ? v' `- X1 R. d - int v5; // ecx
- X' Y' w( f. v) ]! N" f3 y - int result; // eax
5 H! L( `1 u' k+ v8 Q8 }$ R - char v7; // [esp+18h] [ebp-118h]+ Z3 B$ u! t: c4 N6 l5 y% o
- char *v8; // [esp+118h] [ebp-18h]
+ O; c" L0 @+ y7 n - int v9; // [esp+11Ch] [ebp-14h]
8 T6 j: a/ v. D- K8 Y - int v10; // [esp+128h] [ebp-8h]- F# d/ e% k3 P6 E$ T* Z {- G
- ( s; i- \. M6 }6 R% R
- v10 = v5;
9 l& @- S# l: Y% p3 f - if ( a4 ), q' Z u$ c5 W% V' P" a. h
- {
, c ^/ d+ y) Z: e6 g; K! @5 w3 ~ - v8 = &a5;
" B* F/ ^2 Q3 Z' W! E5 b - sub_41BA00(v5, a4);: G& s" G( d \( K
- v8 = 0;& s& [9 j* E3 K- d
- glBlendFunc(770, 771);
- R3 v- l/ U# ` - glBindTexture(3553, dword_4DF3BC4[8 * a3]);
/ h* |. G1 e+ `4 `* n - glPushMatrix();
/ Z( a. A ]4 V. w7 t9 ^5 @ - glLoadIdentity();0 T n* j8 J! ]; J6 b
- v9 = a1;
/ N7 q* C7 R' W2 ` - glTranslated(0 N+ t2 m5 z. S5 r
- COERCE_UNSIGNED_INT64((double)a1),
! o, A' T3 y- F1 }2 G - COERCE_UNSIGNED_INT64((double)a1) >> 32,6 F$ U4 C' | f& ~7 B+ R
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),
1 t/ _' x* H' H; g+ r1 X - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,
0 q7 m. I, P/ ]* t - 0,
' `7 s N' `7 t8 s' ~% f - 0);2 s2 ~/ P/ Q4 B
- glPushAttrib(0x20000);3 x5 N" \2 b/ l; F9 S- u1 v
- glListBase(dword_4DF5130 + 16);
- s* g' ?7 c! m8 x) m! s - glCallLists(strlen(&v7), 5121, &v7);1 c# O: ~. ]- D8 b- L7 m# C% ^
- glPopAttrib();
* a2 k# {0 q4 E9 q* _. _7 P - result = glPopMatrix();
- a, ^+ v% p; |& H9 i: m- a' Q( I - }
) D' \% O9 @- ?; w& i - return result;1 p! S. h, k7 T! T) Q5 X
- }
$ D. O/ s+ I/ i+ R) M+ k1 m% t
复制代码
% ~7 {2 {1 ~( Z) [$ J9 ^/ X* s! _/ k: u4 ~0 L. K0 W- @- j* X
4 h# N% z: R- C: U( m E
|