本帖最后由 shane007 于 2023-9-4 18:48 编辑 2 a* X9 b! B+ r# P& k8 R* l4 m% T" L
) [; `2 \( P; ^9 q
这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。( k0 j1 h4 d4 H
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数7 V, J' h W' v1 M
! l5 ^ c3 Q5 j/ d, E/ X5 _- a" d" q& A7 k4 o; a4 |
glGenLists的调用有4处,前3处参数为1,应该不是。
/ C1 ?+ p% A3 [) K0 D一下是第四处代码,这里应该就是生成字体的地方。
( W, k) I( s$ u0 \, q. x. F2 X从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。
D0 L" G9 B1 e) r: a. |- int sub_40BEB0()
1 M' E2 _7 A5 U$ L# u - {( e9 y* j* a: v7 x/ Y% X9 j; c* p
- signed int v0; // ebx
+ I7 @) t. m0 v - int v1; // ecx# i; V. X( U" n8 s+ W1 `
- float v2; // ST18_44 H" n6 j7 n) V. _1 F
- float v3; // ST1C_4( B6 L1 I. ^. A% C# t
- float v4; // ST20_40 T8 X d; a. ], u1 B
- float v5; // ST24_4
' v- W* O& q7 @ - int result; // eax- ?# ]( W# H* O0 C3 G" \
- $ x; E6 w3 s9 L) @" E# M; Y
- v0 = 0;* p# i9 r5 G! c. R
- dword_4DF5130 = glGenLists(272);4 w& M4 S1 Q5 x* k" m8 p, w; M e
- do# h2 j# j A. Z! v) M: {1 _
- {
& B; f2 T, Y5 T- P) E - v2 = (double)(v0 % -16) * flt_483450;
8 h* X, _; p2 G v# l* {& }/ H, C4 V7 Z - v3 = (double)(v0 / 16) * flt_483450;
6 p. x5 M a0 }% n* w$ Y - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);& w% i0 q* I2 |" D; Y6 z
- glBegin(7);) x# g3 M$ w, p, }2 P4 @* a
- glTexCoord2f(LODWORD(v2), LODWORD(v3));5 N1 Q3 t# n( [* g' ~
- glVertex2i(0, 0);
# H) p# [$ B( j$ H - v4 = v2 + flt_483450;
( j/ e, G6 [! i - glTexCoord2f(LODWORD(v4), LODWORD(v3));9 n# q7 }- v' w
- glVertex2i(16, 0);
3 \; b$ w0 N5 r; e- M# }1 _ - v5 = v3 + flt_483454;
( j/ q! G- z4 u( n3 k2 P - glTexCoord2f(LODWORD(v4), LODWORD(v5));
. {: h9 F1 s3 o1 b7 m - glVertex2i(16, 16);
+ U7 q6 R' K2 Q1 y4 u$ ], w - glTexCoord2f(LODWORD(v2), LODWORD(v5));# h: v$ C, T% v, L0 b, I
- glVertex2i(0, 16);; v. y) ?9 ]. Y
- glEnd();+ o- l$ i. J- ~# _2 S
- ++v0;
* f, ?) S% P+ P - glTranslated(0, 1076101120, 0, 0, 0, 0);
* Z# l8 t" D6 M: G$ ] f - result = glEndList();
: L' @. Q) H" D - }0 o( }0 v5 ^* H1 N8 K% l0 M. n
- while ( v0 < 272 );
2 z4 M& J* H; F! p& m7 `( T/ M - return result;
, f$ K/ Z) i1 H: Z3 ^ - }
复制代码
. }0 g: X3 Z x( W. m; d. S( U" ], z! I+ c
对glCallList的调用只有以下一处,
5 T- \! U: C R3 ^) C C这是显示单个字符还是字符串的方法,待以后再确认。
/ q9 k# U l" H4 `, z& J% k glCallLists(strlen(&v7), 5121, &v7);
5 O* D7 z! T* ?' q5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。9 D# l" d* S3 F- h3 Z6 ? H
* b0 I0 Q) } s/ u( [! t: n
- #define GL_BYTE 0x14004 g3 E5 q* w$ P; l% b; [
- #define GL_UNSIGNED_BYTE 0x14013 i t. x5 [ J" Q
- #define GL_SHORT 0x1402- u% r& g& Q$ O# g% g/ G
- #define GL_UNSIGNED_SHORT 0x1403: Z' |( x, ^$ V" m# \" n/ } g
- #define GL_INT 0x1404" e- w+ f1 s1 Y* Q) \
- #define GL_UNSIGNED_INT 0x1405
+ w; F6 f, I e6 r" Y' e - #define GL_FLOAT 0x1406
& T$ z( e `; s$ q/ O# h0 Q/ @ - #define GL_2_BYTES 0x1407# D; w5 O9 P+ `
- #define GL_3_BYTES 0x1408- a+ _8 K6 o7 _% B4 `) r
- #define GL_4_BYTES 0x1409
4 x, M6 [" |( R. ]7 O: l7 a - #define GL_DOUBLE 0x140A
复制代码
8 ~# j9 o$ |: O5 m) w3 T: _* m2 s4 c7 Y" u1 I# x# v* {) F
% d& I5 H9 s" w3 F( n# ]) [: n- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)
2 }; s I5 B9 t' G - {
2 R. L1 X1 Z' B7 r0 q - int v5; // ecx% G- f: _9 T& }9 f1 j
- int result; // eax
& H7 ~) c' u2 T8 F3 m( W - char v7; // [esp+18h] [ebp-118h]7 |6 V7 h! e, {! V7 N# a; n
- char *v8; // [esp+118h] [ebp-18h]$ D/ b* I: p; a: I7 q1 L7 f9 y
- int v9; // [esp+11Ch] [ebp-14h]! M& ~/ O! k4 t- v1 {9 z
- int v10; // [esp+128h] [ebp-8h]1 I* b& b2 I9 ~
: s) O2 w9 p8 D. W0 K/ i4 L: e- v10 = v5;- S, |- K0 ~9 H
- if ( a4 ); M9 r7 G# Z6 ]: |8 E
- {/ d+ u* C+ }" S& Q1 k
- v8 = &a5;
# J+ J* i* H& ?2 s - sub_41BA00(v5, a4);* X) l6 z0 b6 e. I. p. X, x
- v8 = 0;
2 \3 x2 m. Q3 Y6 O) t% e - glBlendFunc(770, 771);2 {. x, ?0 P0 v6 C7 X `7 m# J6 ?
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);
7 |( f3 ?7 C3 k G( }( x - glPushMatrix();% p( M. `3 q& ~0 O
- glLoadIdentity();
9 A% }- W4 f7 o+ x. s) B; I" u - v9 = a1;
* q- H" N6 G; X+ @' _3 R$ G3 R - glTranslated(
: r& c, |$ i8 k' b, e - COERCE_UNSIGNED_INT64((double)a1),
0 p5 [' y- a% Q/ Y - COERCE_UNSIGNED_INT64((double)a1) >> 32,
. j$ F6 d! H9 A! z" U/ K& o - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),) h( I' y: l1 z2 v* P3 |1 p1 I' X
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,
- }5 i( u; M% C; T4 R* j - 0,
8 M5 t `$ W2 o! L - 0);. k/ L5 J" r2 x; X5 V
- glPushAttrib(0x20000); F4 @+ w5 [1 g# q" T& [- V
- glListBase(dword_4DF5130 + 16);
7 ~ c* I: J5 ]" E0 L. E - glCallLists(strlen(&v7), 5121, &v7);
% z, v4 q" {2 O/ B. X0 f - glPopAttrib();" { I: q8 e5 r" `, [
- result = glPopMatrix();
0 p q, R0 N" a2 @9 x - }6 |! L3 Z' `! q& N$ m& m* V
- return result;
; I" B; J% d: I4 \; M, R - }. v, q0 ~/ Y2 G% S2 H7 K9 G% ^$ n
复制代码
3 f3 K3 u( A) R8 l5 f) l5 c3 [$ i. t* D
+ r2 R$ B. {: E! s M
|