本帖最后由 shane007 于 2023-9-4 18:48 编辑 8 U# v4 {. U4 i
! G9 G% S- O. F. P7 s7 |3 X这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。
. b6 I: T3 v4 z6 H7 A% r0 Z% i对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
t. J. X* g- _
! q+ Q/ Y9 X* h
4 P& A) V+ {8 P$ O( CglGenLists的调用有4处,前3处参数为1,应该不是。
6 M& t- e; {0 g# M7 N! b: T一下是第四处代码,这里应该就是生成字体的地方。0 _9 e* [3 Z9 C7 ?$ Y6 w3 [
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。0 l7 k2 \0 c& g6 b% c# ]" }
- int sub_40BEB0()
" K& J# `; q3 Q - {
* j+ C/ w/ a) d+ n, L) V5 ^6 \ - signed int v0; // ebx+ s2 j3 ^& P4 C( A ~
- int v1; // ecx5 n) o) W! x @5 W
- float v2; // ST18_4" @5 r: f8 A. X7 A% @$ E+ ^
- float v3; // ST1C_4
& ?. \5 w. t" C4 h2 p( x - float v4; // ST20_4
# m# j" G) h+ ^) H - float v5; // ST24_4 _0 B. W1 k& R
- int result; // eax1 i( B4 O; D% a8 w
) X; u: y- ]. L% _8 l3 ]9 R- v0 = 0;. K( s5 W* U9 |2 z H. N
- dword_4DF5130 = glGenLists(272);
! p+ k& i; O. m# U: Q - do5 H; ]3 B! L/ c, S# r( G
- { I: c0 g: j& a7 l8 C0 H( c
- v2 = (double)(v0 % -16) * flt_483450;- v0 e, c3 U' G7 C. `& K
- v3 = (double)(v0 / 16) * flt_483450;
. q0 O0 b' |( [& | - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);
; v. u/ X, @) {/ \6 ~' z - glBegin(7);. Z5 z. V" ?0 }5 b6 j* K. X
- glTexCoord2f(LODWORD(v2), LODWORD(v3));. ^( q. J- z2 f9 P& q, H
- glVertex2i(0, 0);1 I6 h0 ?% p6 c/ w' @# E' a- M
- v4 = v2 + flt_483450;* B* K+ ^+ L/ A" t& E* X, a
- glTexCoord2f(LODWORD(v4), LODWORD(v3));1 g8 ~0 m2 q+ f, v- P) i3 t* E
- glVertex2i(16, 0);" e ]1 A- r8 b- K6 l( U, u
- v5 = v3 + flt_483454;
" q9 |, h& p# A' T0 N - glTexCoord2f(LODWORD(v4), LODWORD(v5));8 M6 G& v2 i4 ?
- glVertex2i(16, 16);' m6 r4 _) [; S+ h( T' N
- glTexCoord2f(LODWORD(v2), LODWORD(v5));2 C9 w3 g; g$ k6 b; P
- glVertex2i(0, 16);
! ], J# p1 t* j0 a4 I' P5 J' c0 } - glEnd();
! }' o; H0 |! H& v9 c L* A - ++v0;
$ G0 z3 b' `$ j# O - glTranslated(0, 1076101120, 0, 0, 0, 0);
& X; x A4 B, Z$ r - result = glEndList();* u6 h1 X* D4 W% l/ Z
- }. |. a1 a7 t- c! W! V
- while ( v0 < 272 );
- }- I y! f( J, m; C7 M$ ] S - return result;
/ I& O6 t6 H% G3 ? - }
复制代码 i _( W; `7 v. n' ^7 w* s# J; y F/ T
- j$ s- s( i8 p& _* T对glCallList的调用只有以下一处,8 A h% [5 M! c$ e+ l* o
这是显示单个字符还是字符串的方法,待以后再确认。6 C4 S( {/ X* `$ G2 ?4 @: e
glCallLists(strlen(&v7), 5121, &v7);, b, G1 S6 o1 B- Y# m
5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。: S1 C4 {' H* n9 t0 x
: {' Z! e+ h8 {* z& n
- #define GL_BYTE 0x1400
% C U1 k2 E1 P D4 q - #define GL_UNSIGNED_BYTE 0x1401. U$ S1 W+ @6 a! L# R+ f, Y. x
- #define GL_SHORT 0x1402
9 c* q. p2 j: M8 | - #define GL_UNSIGNED_SHORT 0x1403
, {$ \7 F c# l2 c - #define GL_INT 0x1404* `# J' _2 N9 F
- #define GL_UNSIGNED_INT 0x1405
: R( c8 Q) O! ? - #define GL_FLOAT 0x1406, A. v" z" }$ f$ U& r0 A4 K
- #define GL_2_BYTES 0x1407
" m* {& a( D6 @1 _8 n( E - #define GL_3_BYTES 0x1408
# i3 A# R$ R2 N% U5 X - #define GL_4_BYTES 0x1409 S* E9 @2 O+ v9 M! O
- #define GL_DOUBLE 0x140A
复制代码 1 S1 G& k. R9 C
" i- M$ n4 ?5 s1 i8 P
) P d# g5 @9 E. H- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)
( q$ Y% w$ ^5 ^5 q% X* q& ^6 _) ~1 f - {
. r, s- Z' V+ M* V1 Y" R. H; y! a - int v5; // ecx
& Q0 G: S, ?5 l# H [ - int result; // eax
$ t1 G% ^6 H8 v# ?0 l% X3 ? - char v7; // [esp+18h] [ebp-118h]
% A$ ?( |; F y5 y - char *v8; // [esp+118h] [ebp-18h]
# ]/ f8 S1 L) ^9 N* M1 O) a/ n1 \ - int v9; // [esp+11Ch] [ebp-14h]: x1 ?8 S! \1 f+ I( _, X9 L9 P
- int v10; // [esp+128h] [ebp-8h]2 G1 v0 U% x0 ^; A- F0 F
6 @7 l8 z h; y7 b, M- v10 = v5;
* \, D$ }5 w4 e" n* d" v9 D: R - if ( a4 ), T! P& M( q; G& k( a0 Z. j4 ] A
- {
% w6 q( K& R# P* c0 M& s - v8 = &a5;" ~% z6 ?/ r5 u
- sub_41BA00(v5, a4);
7 f- ^, H& L; g8 V - v8 = 0;
]5 s- V6 A! |8 J( G/ F - glBlendFunc(770, 771);! x# f6 p) ]) [, x# W
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);
+ M% d K& }) H+ ~ - glPushMatrix();( S& j* U% C6 \! K5 \1 L$ _2 A
- glLoadIdentity();
# Y- J! A/ ^- X$ [& e, s r7 t - v9 = a1;- G7 i, w* n! P" W; N8 l% U( j0 Y, b6 n
- glTranslated(% H$ v( V& _; G& c! v: n" m F
- COERCE_UNSIGNED_INT64((double)a1),. w: g: g- @, }
- COERCE_UNSIGNED_INT64((double)a1) >> 32,
3 B& \ J @: H* A o - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),9 Y- w( l3 `% p: i, `$ v
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,
- Z- c5 `' A: U9 U5 h1 F. B - 0,) P( j- U, e# t
- 0);7 t6 G2 u4 r5 _* q9 N8 Y
- glPushAttrib(0x20000);1 Y% F& a0 P4 Z* R+ ~
- glListBase(dword_4DF5130 + 16);
" l( U% g! I/ N. z7 `8 ]1 e% y, { - glCallLists(strlen(&v7), 5121, &v7);, I0 d [5 w, _
- glPopAttrib();+ ~: e% M/ P4 F" Q0 \
- result = glPopMatrix();
. P8 i$ p" R) i m# }6 G h - }
8 ]- Q* j0 n& X8 B% R- p; y - return result;
: d P( Z8 O. b# w) I _7 G" ~# y; b - }0 n7 t( n- H/ J+ o$ ?3 J: q
复制代码
; N* u0 [: N: z& P3 ~) R! o( t- A8 |
! S: Q3 s' v& a4 r
|