本帖最后由 shane007 于 2023-9-4 18:48 编辑
) z: w- K! |" v& Q4 v4 B; _) b& S
8 \+ e+ y2 j2 M( P% b' A3 D这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。+ `) |( y9 \$ c9 j. r7 E' o
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
4 e" `; P( J$ m) _! @4 n% V, v6 G$ c( b8 _3 R) r
9 Q, H. `+ t* `9 o
glGenLists的调用有4处,前3处参数为1,应该不是。
/ E7 }5 ?. ^& E! D! _/ F1 t一下是第四处代码,这里应该就是生成字体的地方。! m% }+ Z: P0 n; ~3 B8 y
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。
) \# [# y6 [2 ?: ~( P/ o- int sub_40BEB0()
8 Z$ Q# w+ w1 n5 l6 V0 |9 m" q - {( g: _$ C! x: g" X( p
- signed int v0; // ebx
' D: `8 [" y. a @! P( m - int v1; // ecx
/ O5 d+ S/ [2 r. B0 F j( G( K7 g - float v2; // ST18_4
0 |! J( ^2 r0 L5 G" m0 k W# S7 F - float v3; // ST1C_4
3 M% ~6 C1 D5 p* v: K( a5 P3 o& x - float v4; // ST20_4
$ K3 E/ ~# q9 W. Q w - float v5; // ST24_4) x5 ~& R: N# O2 g9 N% k
- int result; // eax. Z, X/ G3 S% ^4 O+ a1 ^/ @/ b* j1 i' K
- 0 m& ~; [" x$ M' v
- v0 = 0;
7 [+ Z5 L- S. \8 {% _ d! R - dword_4DF5130 = glGenLists(272);
, s& M; H ^8 c - do
( Y+ L9 b: p; Z c/ v& l. B - {' n' X' e8 E8 U
- v2 = (double)(v0 % -16) * flt_483450;; p% a" h* C( F4 k+ V
- v3 = (double)(v0 / 16) * flt_483450;0 `3 m: ]& R3 ^3 }4 ^' p/ U& L
- glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);
" i1 S: A3 Z# W' p7 a6 t - glBegin(7);
: y+ E; k4 J; k9 k8 Z7 } - glTexCoord2f(LODWORD(v2), LODWORD(v3));0 ]$ g, p, V9 r1 d- b* n2 n
- glVertex2i(0, 0);
! r2 s$ h0 m3 u" X; T2 S6 D3 x - v4 = v2 + flt_483450;
& H: E) f/ c9 X; F - glTexCoord2f(LODWORD(v4), LODWORD(v3));
- @1 V# T; _: s - glVertex2i(16, 0);
( U! B6 K% J3 D; K( ^( c3 D - v5 = v3 + flt_483454;
: J* h$ g# D( J' B' P6 h9 g& P - glTexCoord2f(LODWORD(v4), LODWORD(v5));
# v: G) c/ m$ d/ V; @ - glVertex2i(16, 16);5 F9 I7 S) I5 W4 [' d* V2 h" c
- glTexCoord2f(LODWORD(v2), LODWORD(v5));
! s# S. g" r5 `1 q* x) j6 T - glVertex2i(0, 16);
& c5 O. j/ e$ d4 f" o; k - glEnd();' C' ?6 Q# g$ Z( v* X& E
- ++v0;
2 L. n* O5 E8 R U7 O( \ - glTranslated(0, 1076101120, 0, 0, 0, 0);( K1 v: x. L* ^, X0 U
- result = glEndList();
' J2 K+ {6 r7 N& |. q - }
( J8 {& m) \% S6 s: G( g - while ( v0 < 272 );& N7 q. x4 z+ l
- return result;
& n3 S- I' T4 p8 R3 T - }
复制代码
# K2 v: Q" Z7 Q( E
2 ~/ R6 T( L g Z L对glCallList的调用只有以下一处,
% ]" N {$ j/ y' B这是显示单个字符还是字符串的方法,待以后再确认。* `/ h6 W1 O) f5 B! n
glCallLists(strlen(&v7), 5121, &v7);& @) Z4 R1 Q* D; m9 o% l
5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。
6 \, c8 u$ Z: R# n$ d- a) B) q5 n" W( L/ E K: l+ ]% {
- #define GL_BYTE 0x14002 O& c7 G9 S4 s0 `. R7 W
- #define GL_UNSIGNED_BYTE 0x1401! x9 \0 F& M! C9 f
- #define GL_SHORT 0x1402
& ` U5 D+ J1 [# u7 A& a9 A - #define GL_UNSIGNED_SHORT 0x1403' ~( ] r' V% c+ T$ W5 K% }3 O
- #define GL_INT 0x14045 O* @$ b4 D- M+ c
- #define GL_UNSIGNED_INT 0x1405/ I* t8 J. l# H/ w8 d5 h
- #define GL_FLOAT 0x14061 A, X: Q4 \& a9 v* i. s
- #define GL_2_BYTES 0x1407% F# v) a* i' h: R7 L0 |6 x0 q3 f; [
- #define GL_3_BYTES 0x1408
; R2 F' K1 K) O2 {; [% j7 ^6 h - #define GL_4_BYTES 0x1409
5 R1 i" g( E, j" @$ X1 q - #define GL_DOUBLE 0x140A
复制代码 5 C' Y9 s7 }9 N! A5 C1 W+ a
# `3 i8 H0 r& v+ Z+ C# f0 ]1 i
" f4 W$ @7 t% Q9 C& H# W- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)! c" o4 c e0 c9 w( r0 X$ L' A
- {
# ?# Y1 c4 q: r1 s( O N* f& I - int v5; // ecx3 ]) O- y3 s% F& C) ?2 ^" L' d1 U
- int result; // eax
+ P4 i9 |! Y. v* h; U# ?! ^, H. M: ^ - char v7; // [esp+18h] [ebp-118h]* `4 X* v5 b' C0 j+ B
- char *v8; // [esp+118h] [ebp-18h]
# _/ M" |8 u! _ B* u - int v9; // [esp+11Ch] [ebp-14h]
# S# s& a) r$ i! g - int v10; // [esp+128h] [ebp-8h]; U, ?& H% G1 z7 ^
" Q# |1 J! Y& G- v10 = v5;" m8 k, J1 s8 g
- if ( a4 )" X5 }9 y/ U( v+ o
- {
% O# l0 S4 s) Y/ r+ I; Y8 x - v8 = &a5;
4 a% ]$ v6 V3 ]2 o+ R - sub_41BA00(v5, a4);
4 u$ q' s+ k+ G3 X( P, s6 { - v8 = 0;3 ^1 o; I8 z2 {/ f. }% M( W1 ]3 c
- glBlendFunc(770, 771);
: H( T0 n, N1 v5 _" h- r- B - glBindTexture(3553, dword_4DF3BC4[8 * a3]);
0 K, z1 I/ s+ ^6 |/ @" Y7 l - glPushMatrix();
. u' `- X M! p; t# f - glLoadIdentity();
" {& r- @* ~0 v; g4 Q2 A - v9 = a1;
" G& u7 o# @! m: d+ y& M1 ? - glTranslated(, o5 Q+ E( k! O% v7 x- b7 k( f
- COERCE_UNSIGNED_INT64((double)a1),* W, C1 i1 _' k3 u
- COERCE_UNSIGNED_INT64((double)a1) >> 32,
( A' h3 n. ^* U- r: f/ \ - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),
9 \$ M- H7 L4 Q) Z& i$ y - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,, Q0 W: I! {; j8 n% O
- 0,8 D: X5 A: }) {% Z- i M
- 0);
7 [. M, l4 O @% K2 N - glPushAttrib(0x20000);! E% w4 o/ N& \; s; S* @* Z
- glListBase(dword_4DF5130 + 16);4 P/ d; i0 H+ G; U0 v" j7 v
- glCallLists(strlen(&v7), 5121, &v7);+ f1 `6 I4 c& \8 X. u1 y$ E9 h
- glPopAttrib();
/ b- n' E' U. o0 D. K [$ M) z - result = glPopMatrix();
) O( k8 F) l: p# \* o B! z4 w - }3 d+ [/ r! ~, Z
- return result;7 Y* ?: \ P8 I7 q+ Y9 a
- }
( @2 l$ _) |" R- T6 z1 e. e/ Q
复制代码
w) a, t) P, T
s6 K9 L. ~# i5 n" h% q. v3 s7 S5 w5 u8 N5 D
|