本帖最后由 shane007 于 2023-9-4 18:48 编辑
' p1 [- c7 r9 ?+ \1 a/ l
4 ]( R5 ^/ [9 r2 N# m& {% R这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。3 p6 ]* L, Y# p1 E4 m
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
% @" ? t1 N! M& M( `* U. V) J9 C+ \. ?! m2 L2 ]2 l1 c
+ ^( w; b, J/ I& b# ]
glGenLists的调用有4处,前3处参数为1,应该不是。
( `1 t, u2 ^. A8 Z# U一下是第四处代码,这里应该就是生成字体的地方。
4 r$ ~9 M0 }, L |5 y) `1 g从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。
* A# n* X) |" G- int sub_40BEB0()$ x7 X( {- i9 }2 C" b" S
- {9 V" b6 _* F5 ]$ [) N
- signed int v0; // ebx
& A& @0 ~' h5 ` - int v1; // ecx; o& T/ @# a, G- U! d
- float v2; // ST18_4
; u" z8 ]* S0 O* v$ W: O" n - float v3; // ST1C_4
' B6 w3 j: k- \ U" J, U - float v4; // ST20_43 b8 `( u: X0 n8 w* e! X
- float v5; // ST24_42 R: b3 O( g0 r" n6 U
- int result; // eax
% F7 b+ d5 S: S9 m
- s2 n4 D0 C& s" u- v0 = 0;
6 R/ I M+ s+ ^$ V! M5 \& l* A - dword_4DF5130 = glGenLists(272);8 [' D) b+ j2 V! Y( R h
- do
. o& c3 r1 z7 ]- V+ i% I) W - {
- y, r+ O2 T8 p/ `! j: } - v2 = (double)(v0 % -16) * flt_483450;- K$ c% ?7 c% U0 }% y& b8 |/ f; l
- v3 = (double)(v0 / 16) * flt_483450;
6 x9 z7 a3 r9 N) w+ A - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);
, O0 X+ }+ ~; _' T* M' ` - glBegin(7);
" N: |! P+ |4 j$ z4 B. S - glTexCoord2f(LODWORD(v2), LODWORD(v3));* B1 Y V7 m5 z* i. l) }
- glVertex2i(0, 0);& O' _. E3 ~0 h. P1 K
- v4 = v2 + flt_483450;) r$ Z4 k& S8 {( S
- glTexCoord2f(LODWORD(v4), LODWORD(v3));
) A8 {" c5 k% G6 b" @. a0 R - glVertex2i(16, 0);. r, z' h" r! O7 k w) w) u# t9 n, j K4 R
- v5 = v3 + flt_483454;
0 f0 u2 O) }6 s Q. R - glTexCoord2f(LODWORD(v4), LODWORD(v5));4 ?, z/ b8 e& D& c3 t' U# J; g
- glVertex2i(16, 16);
2 z" z7 X) T/ B+ Q8 `6 u' M - glTexCoord2f(LODWORD(v2), LODWORD(v5));
; G! q6 K z- D2 d# t - glVertex2i(0, 16);0 _- C) N3 P+ Y! {7 o
- glEnd();
0 h9 X" R5 U, d$ m - ++v0;
$ J1 b( r: e, A6 H/ c - glTranslated(0, 1076101120, 0, 0, 0, 0);: x+ O$ n* Q4 l" S) s
- result = glEndList();
Y+ X/ z' a1 W% {0 m9 U4 \1 t- g& m - }. S' Y0 a+ `9 k. U
- while ( v0 < 272 ); Y( @7 ? R# k6 Y; n6 \* `
- return result;' I' t1 \1 [( C4 n6 \
- }
复制代码
7 f" m: I8 K0 ?9 r6 N0 S, v/ l9 c
对glCallList的调用只有以下一处,
- }3 E! B* K; a9 O, @( k3 @这是显示单个字符还是字符串的方法,待以后再确认。8 K8 r* Y. Z3 O! M' z6 i
glCallLists(strlen(&v7), 5121, &v7);
! X* L! X5 b9 l+ m& x* l5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。
1 L" n2 u7 q9 C8 Z9 T/ \
! @1 v! i8 x: g: r6 k1 B- #define GL_BYTE 0x1400% S' V& ]! [) S
- #define GL_UNSIGNED_BYTE 0x1401
; h; s& U2 n4 N$ ?) ?, p5 @+ ~% s - #define GL_SHORT 0x1402
+ n9 E2 F7 p1 ]* e - #define GL_UNSIGNED_SHORT 0x1403& Q8 ^9 K3 L# Y! W0 t( f
- #define GL_INT 0x1404
& ~& f E& r2 g2 E1 C - #define GL_UNSIGNED_INT 0x1405
# I. T6 z7 e4 \$ d; D - #define GL_FLOAT 0x1406! C( g1 l/ j1 \( w$ \& \) P
- #define GL_2_BYTES 0x1407& t. F% Q& |6 A5 A( Q0 X, g
- #define GL_3_BYTES 0x1408
1 P: }8 k9 G) f, H z - #define GL_4_BYTES 0x1409
4 k% P4 L* c& P ^/ [+ y - #define GL_DOUBLE 0x140A
复制代码 7 ]* ?, Z! u1 s3 ^5 x/ h
, G( _- ]% e& r* {8 p; V0 r
/ Y; {7 u! ^4 U* ]- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)
1 g/ Z; f2 ^: m+ j a" U: ?) T- h - {
U# j4 v, ? n+ H" F G6 A - int v5; // ecx2 T2 V) B/ R! m* I
- int result; // eax
7 f( V# U Z1 W& R: j2 }( j3 ` - char v7; // [esp+18h] [ebp-118h], E" U1 u+ d) q6 {- J& |
- char *v8; // [esp+118h] [ebp-18h]
: D9 |7 w. ~6 c - int v9; // [esp+11Ch] [ebp-14h]
3 C5 E- |2 ?6 x, O - int v10; // [esp+128h] [ebp-8h]
3 b* a& a, L: ]; W) s! r" J
( ]# z- V7 @. c5 }2 o- J* z# w- v10 = v5;
$ b6 \2 K6 Y3 U% r - if ( a4 )& l& g' q* F! R3 J- i$ s0 ]: x
- {
+ P% O" S8 o$ Q% Q, W, | - v8 = &a5;
! D( D* z2 i5 z1 n" B - sub_41BA00(v5, a4);* ^0 O% g' j0 [
- v8 = 0;
2 @' w* c7 I& w" b, }0 l5 N* ` - glBlendFunc(770, 771);( S' F2 w5 D* Z1 w$ E! |/ @
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);
- m) k: H% I3 s0 W [ - glPushMatrix();
L0 R' j9 m$ m1 X6 F8 q - glLoadIdentity();
8 F3 E$ p8 H V - v9 = a1;; [) ]3 k* A6 r! ^8 W1 @
- glTranslated(
% {6 M4 H; e" w) } - COERCE_UNSIGNED_INT64((double)a1),
. S2 \1 J! g/ i7 b" W3 h) Q - COERCE_UNSIGNED_INT64((double)a1) >> 32,& k1 l' C6 X* C" W
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),! k. N1 z M& r/ N
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,
* R+ U f# n- y+ h6 Y. {9 Q* m - 0,- D8 b, S; D9 c# O$ \1 P. b2 ]" t" J" i
- 0);
' ~' _. G4 f" f - glPushAttrib(0x20000);
6 L. R$ C6 x8 f6 \8 M* w( V, t0 @+ F - glListBase(dword_4DF5130 + 16);: e4 r& x& ^6 |+ C7 _& ^9 F
- glCallLists(strlen(&v7), 5121, &v7);9 l, e% @% ?; i1 U
- glPopAttrib();
( s+ F/ ~ a1 t% W% S4 d6 u9 @ - result = glPopMatrix();
1 G) b5 M1 E/ B - }: m+ `0 R" h# g
- return result;. j' D1 t2 K" V
- }
7 R O9 j9 L L& I
复制代码
& h+ x+ f+ ~) p) f& ~2 S# v
$ ]2 q+ i- a' x7 v
* x+ C$ U* i& Q1 C |