本帖最后由 shane007 于 2023-9-4 18:48 编辑
3 p+ p( v; T" S' \- D4 U( q9 R' p2 y7 \3 S6 R& R t
这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。- r8 Y4 q! F7 }, m6 [
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
5 ?" Y- k; G1 |) C, d/ f9 s. B8 G
9 P: c7 X2 V) T1 C9 k( u( v
" H( J; i4 v. @$ O6 l- o4 y, n7 fglGenLists的调用有4处,前3处参数为1,应该不是。
, i% H% `* J$ d% a. D一下是第四处代码,这里应该就是生成字体的地方。
X Y6 M8 X% a5 l& J4 n, H从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。% g! f5 H* a: G
- int sub_40BEB0(); W7 h: ~6 b6 J0 `- \2 P
- {* s6 u4 F1 R4 G7 p
- signed int v0; // ebx2 b* }6 u. }! z: }, r
- int v1; // ecx8 Z( E5 _* Y3 y
- float v2; // ST18_4
' S$ U5 P& }) {) r7 g - float v3; // ST1C_47 ^; K. {0 `* |. l
- float v4; // ST20_4+ v! j) V, ?) |. N4 e% C
- float v5; // ST24_4- @; x5 O+ W' C/ c
- int result; // eax
, h2 p" S3 O0 `( j0 a: I% K7 q! ]" [ - ' l# A3 x+ E% y# i7 P: I
- v0 = 0;* f- x9 `: E; l. \
- dword_4DF5130 = glGenLists(272);
; _$ S* ]3 K9 I# r - do
4 j) u& [& P. r# J. a - {- a9 W9 X- U7 o
- v2 = (double)(v0 % -16) * flt_483450;5 |: Z- Q0 g7 w1 @
- v3 = (double)(v0 / 16) * flt_483450;
0 c& C' G: h& } ] - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);: z) \( E/ y) X
- glBegin(7);* ?0 y: }7 s+ H$ b( {6 N
- glTexCoord2f(LODWORD(v2), LODWORD(v3));
( E1 }0 c& Q( r- Q3 b! ~ - glVertex2i(0, 0);
8 g) j; r' \8 G7 i+ E) H7 n6 h6 ^ - v4 = v2 + flt_483450;4 W2 t P2 K; L, [2 g
- glTexCoord2f(LODWORD(v4), LODWORD(v3));
( l4 n; J* X0 O) y% @ - glVertex2i(16, 0);& ~' t& G5 Y! H( Q; g
- v5 = v3 + flt_483454; ~: U/ i1 X! n' P8 e% W
- glTexCoord2f(LODWORD(v4), LODWORD(v5));
- e/ T3 y9 [2 Z1 { - glVertex2i(16, 16);
* J5 M+ y- \) U7 M- U/ [8 j - glTexCoord2f(LODWORD(v2), LODWORD(v5));1 j5 \+ ?, Q' N% K( t o+ v: E
- glVertex2i(0, 16);" F, j. k9 q# Z) s& S
- glEnd();1 N. ]0 O# }' h0 \! m0 q, S5 R
- ++v0;0 V. I2 f8 S* ^6 j
- glTranslated(0, 1076101120, 0, 0, 0, 0);; S. ?! H. v. T1 l3 N0 C5 Z
- result = glEndList();
- I7 b. H/ t. b6 e% A* M4 D - }
$ i) A; x$ N! G# s" b - while ( v0 < 272 ); s. {; A+ U$ s9 } V
- return result;
; e/ s* l, c# u( k- u9 q - }
复制代码 ) T- q' J- P1 r' f- G8 S
. z. Y7 r9 {& i6 X+ M, C Z对glCallList的调用只有以下一处,9 R+ V* U. M8 l h
这是显示单个字符还是字符串的方法,待以后再确认。
# w0 s/ U" J0 ]; }* x glCallLists(strlen(&v7), 5121, &v7);$ Y, f& Q) o6 y* F% o1 Y
5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。
: C5 Z3 m( C8 Z z8 S: \3 J d. q' x: g i5 t/ [/ `1 M+ F& N- W
- #define GL_BYTE 0x1400- @8 \1 d9 y: {+ L T# j8 F
- #define GL_UNSIGNED_BYTE 0x1401
3 |* R& l# I& |+ p. U: L - #define GL_SHORT 0x1402. M2 ?9 _$ j$ E* _5 }, b: k8 b
- #define GL_UNSIGNED_SHORT 0x1403; s0 f# J5 ^, ~/ e
- #define GL_INT 0x14045 F! e/ b( @8 z8 m7 C
- #define GL_UNSIGNED_INT 0x1405, ~7 H* O# ?, M1 O: f. I
- #define GL_FLOAT 0x14066 y6 K& N* k! q" p- S" d* ^3 d
- #define GL_2_BYTES 0x1407" {1 r! Y9 S' R* M6 t
- #define GL_3_BYTES 0x14080 e$ b' T- q# ^" V8 d8 @2 d
- #define GL_4_BYTES 0x1409
3 W& ~- _0 s1 v$ Y9 T, W; W - #define GL_DOUBLE 0x140A
复制代码
. ?+ \! h" i7 N' ^3 i
4 I l5 h: [: {9 V0 h- 2 [9 L) p! R9 N: g5 G3 E, T1 t
- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)# e" S( k; n# a' A/ q
- {! l4 s) `% R5 P% _/ Y% l
- int v5; // ecx4 g/ H* P1 p* t, } H6 h
- int result; // eax+ ?. k5 t s A5 C- ]& K
- char v7; // [esp+18h] [ebp-118h]9 o0 ?4 g" C5 ]' k7 O
- char *v8; // [esp+118h] [ebp-18h]
' C+ K7 {1 D9 {% Q+ u3 L - int v9; // [esp+11Ch] [ebp-14h]
3 r6 B, Z) a; S+ Q - int v10; // [esp+128h] [ebp-8h]7 ~ k# y$ G7 U" q" o! h% C
- 8 P% g- c; n" z7 [
- v10 = v5;
0 |$ w1 i1 a# L# m+ A - if ( a4 )* R& z ] J! o% T( f
- {
" s- P N7 e9 ?1 u& B9 h( Y - v8 = &a5;
+ b8 z% O4 t! e - sub_41BA00(v5, a4);
, G! a, B& u: s) x( d B4 c - v8 = 0;! u* A& X) J9 g0 f! x
- glBlendFunc(770, 771);
* M0 B& H0 M. @0 @7 |. r8 Z - glBindTexture(3553, dword_4DF3BC4[8 * a3]);
6 w; K/ |+ X6 K' n: T - glPushMatrix();/ a5 D. R! R' z5 R6 O2 W/ Z
- glLoadIdentity();
( k% }2 M6 o6 | - v9 = a1;
% K! ]* Y1 B& k) k - glTranslated($ Q S7 n* K! F7 n; ^( W3 h
- COERCE_UNSIGNED_INT64((double)a1),
7 e: t' \# l3 a! M - COERCE_UNSIGNED_INT64((double)a1) >> 32,, g! p2 B! ]+ D! A% }* F L2 h
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),
/ s% D) X( {$ \5 \5 x, {3 t - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,
+ m* }8 ?- `% | - 0,! u* p! Z! i' Y8 A1 h8 m ^! R' c% I
- 0);
8 R# j0 O0 m! l - glPushAttrib(0x20000);
4 o4 i+ Z' N: I& r0 V5 [! B8 M$ M - glListBase(dword_4DF5130 + 16);
! y; @5 Q1 ~: h* e4 s - glCallLists(strlen(&v7), 5121, &v7);% [5 @8 r$ E( D9 E& J. `% ~
- glPopAttrib();- A; c. A% I3 }: C9 A
- result = glPopMatrix();
* E6 y( v4 F1 a - }
5 [- E" E5 k- Z& }& B - return result;$ W5 r- c+ F7 e! S- F$ q0 Y4 j
- }2 u& W+ h/ ?7 f2 u2 L e
复制代码 . \3 z1 j- k" a- r/ i* U
8 C, U3 ]9 N: V0 w9 |+ B5 B+ L" ~
7 r% a7 k4 K" @+ {- I- Q9 | |