本帖最后由 shane007 于 2023-9-4 18:48 编辑 ; J( n" n; o% F4 b4 [& b
8 U: `! t5 q1 j1 y! j* C
这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。6 E% G$ H: g5 d9 w% k
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数7 `. z* {, m: e
3 S' f D$ W9 h+ Q J j
$ a* l( |! n" T, N- YglGenLists的调用有4处,前3处参数为1,应该不是。; z) v" u3 J$ y# M. w3 p7 M$ F
一下是第四处代码,这里应该就是生成字体的地方。5 }( A; }5 U1 o+ n6 z) Y
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。
& S3 Z4 E4 |8 _- int sub_40BEB0()$ w X& j8 r2 a% w6 `& j" k3 i
- {' z# P" _( J, T# ]1 v& _1 L$ F: X
- signed int v0; // ebx
; v$ }- K$ u7 i L& _, c - int v1; // ecx
; x" r4 |9 W1 e" F7 F - float v2; // ST18_4
4 G; Q( R6 P1 o1 b1 \* d/ ] - float v3; // ST1C_4- L" O9 h6 \. H- l
- float v4; // ST20_4
) Z4 Q& N, ] ~, m - float v5; // ST24_4
# j9 u* o' J0 o7 y0 R# [9 ] - int result; // eax% X$ ~6 J0 U. F% D: s# g0 E* N
- & C$ \' d8 H+ }" w
- v0 = 0;
& a# q; m! z8 g; S - dword_4DF5130 = glGenLists(272);
9 d( S, S/ v1 k9 p+ A6 `* E - do
' |$ Q: w% I E - {3 r! ?* w J6 H3 Y7 m; w& l. c
- v2 = (double)(v0 % -16) * flt_483450;' g B# p+ R, }7 L! ~
- v3 = (double)(v0 / 16) * flt_483450;
4 `4 Y, U/ i% t( ]: I3 V9 S; E - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);
4 I( u# j) }3 k9 s6 g& d* [ - glBegin(7);; ^5 u$ w/ t% L3 \ f
- glTexCoord2f(LODWORD(v2), LODWORD(v3));+ P; e: ]" _1 C3 n" ]
- glVertex2i(0, 0);. q1 T' z4 ?/ t. E' T
- v4 = v2 + flt_483450;
1 a7 U% p$ g3 P4 y E+ z# b - glTexCoord2f(LODWORD(v4), LODWORD(v3));
# X$ Q$ o, u+ k - glVertex2i(16, 0);
% L8 J* s6 q! V& @5 ?, U - v5 = v3 + flt_483454;
, b% o0 s9 v. O - glTexCoord2f(LODWORD(v4), LODWORD(v5));4 P) u% Z& ~3 a+ h
- glVertex2i(16, 16);
" y5 H1 J! C( | - glTexCoord2f(LODWORD(v2), LODWORD(v5));
) @0 C4 d& S: y; o0 z7 @$ m3 m - glVertex2i(0, 16);# Z; \6 M/ a9 K8 _3 E$ X9 k
- glEnd();
; t( }* H$ }2 E - ++v0;
" I: `6 K. B5 H- t - glTranslated(0, 1076101120, 0, 0, 0, 0);1 t2 Q; r8 V/ R W" @! e
- result = glEndList();- ~& `% }% ?0 @
- }
- J Q0 f( U7 [- `$ j - while ( v0 < 272 );
- ]$ J& q' X; y - return result;7 A0 o/ Y" Q: l1 ~; z R
- }
复制代码 , o3 ?' m' r! l5 _6 [; ~
" Q& k" b3 ^- L! f% x( v U. B: T
对glCallList的调用只有以下一处,$ [8 x4 { c" K& Y- H, U
这是显示单个字符还是字符串的方法,待以后再确认。) Q% [5 r9 y$ o$ O' e" f, z
glCallLists(strlen(&v7), 5121, &v7);
7 V, ]5 p! ^( Q- u4 b5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。4 G0 x/ W3 Y8 M
0 D) G, @ ]3 N
- #define GL_BYTE 0x1400
) o: y& M6 {% v9 a$ I: _, \4 P+ _# b - #define GL_UNSIGNED_BYTE 0x1401# R% q# u$ E3 h% a" u, }. D
- #define GL_SHORT 0x1402 H5 |, a! Y, }4 g
- #define GL_UNSIGNED_SHORT 0x1403
) A* J* c+ v' g( E - #define GL_INT 0x1404
+ }* U) N$ S8 J% {3 V& U% \ - #define GL_UNSIGNED_INT 0x1405
4 d2 w4 k: T) \* l/ U' W - #define GL_FLOAT 0x14066 o0 d" z2 M( a4 k* F M2 U6 T9 x
- #define GL_2_BYTES 0x14070 M% \6 }* z+ _' Q. }
- #define GL_3_BYTES 0x14083 D( K7 c* k( i; C- J2 ^
- #define GL_4_BYTES 0x1409# x- q3 e, g1 m+ X' E
- #define GL_DOUBLE 0x140A
复制代码 0 R+ }4 z% D/ T+ k" \
* u8 n) w3 `+ V8 z
- 4 g+ c; N5 n* u) ~* ]. y/ u& [: m- \
- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)
# ?6 d% ?# i( {; V+ j9 [ U$ | - {5 M& t+ x# A/ Y" g. s0 X# |) j6 `
- int v5; // ecx
3 j; D! p9 S6 t |0 B) t) n - int result; // eax4 l/ @0 Q0 T! f" e9 s7 r2 O
- char v7; // [esp+18h] [ebp-118h]7 ?+ Z6 `! c5 S# x' a
- char *v8; // [esp+118h] [ebp-18h]
* i2 t. q* c- ^& ~! y - int v9; // [esp+11Ch] [ebp-14h]
# ~, U) C+ ?! g4 z+ j) R* m/ T - int v10; // [esp+128h] [ebp-8h]( l' ?6 V' [$ i( M; V/ a; M
- ! L1 d) n* @! x: d0 y3 U
- v10 = v5;
0 @6 A h6 S T/ _8 P+ v: P' q - if ( a4 )6 l- a, U; v- n; y/ y: g$ x @
- {
) t5 ~7 F' w9 u1 J' H - v8 = &a5;
# O7 K2 R8 k6 h# q4 v" f6 {1 z/ I - sub_41BA00(v5, a4);
% u. x2 ^& N' @0 J - v8 = 0;4 d' K- _' u1 X, @0 j O) e
- glBlendFunc(770, 771);; u$ r0 Q3 n. X5 W, O8 }, e4 H: n2 X8 B+ t
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);
$ O' ~0 f8 c) M4 s - glPushMatrix();( j* J/ h# ], o. W; c
- glLoadIdentity();' D0 ]7 E* [9 {* Q5 x
- v9 = a1;
: J5 ]! D9 Y) ^! I0 b0 N) S7 Q- G - glTranslated(. D0 d/ O6 u( V" Y4 b
- COERCE_UNSIGNED_INT64((double)a1),
+ V; O2 U" F4 s' l; E7 ` ] - COERCE_UNSIGNED_INT64((double)a1) >> 32,
3 V c6 L: A: i5 m1 f: }) A - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),! T' k3 m' g# A- g# }! v7 O
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,
, C' P5 ]1 r6 J# f6 I/ {3 D& | - 0,. N% v5 c8 `/ ^3 e/ P
- 0);
2 S( L0 a4 _# a, f: l/ ^ - glPushAttrib(0x20000);
! y }- L- O6 d4 n3 @+ Y - glListBase(dword_4DF5130 + 16);
# y" ^0 ?. n: @. r% c - glCallLists(strlen(&v7), 5121, &v7);
7 m# k: Z# z; r - glPopAttrib(); n. u8 g; T0 {7 X# X$ ]
- result = glPopMatrix();
" l4 h9 X" w) w5 T1 C2 M2 k1 ` - }+ r0 k# T/ ~' u; G
- return result;
% }/ o' v e6 ?& H - }
* R6 c I8 [/ ~
复制代码
3 Q# _2 s3 \4 q# j) l/ e) I; E8 c5 F ~. w% e+ k# v
* [4 T# _8 z+ o5 {1 q( E |