本帖最后由 shane007 于 2023-9-4 18:48 编辑
! E7 d- w- q1 p0 U8 J5 ^' [& k
; K2 i) w0 z7 i Z$ x这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。' v# _- F/ X; a7 ]
对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数 O4 n( A o+ L% X' `1 J
/ L, b2 n2 w. h" t" A- a/ Q
S! R3 a- J5 g# n. x
glGenLists的调用有4处,前3处参数为1,应该不是。
' J% ^- h( W$ l8 I* [9 P一下是第四处代码,这里应该就是生成字体的地方。9 s+ L8 K" b" u7 r3 i6 r
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。+ t( b5 ~# S6 R+ w- {: s
- int sub_40BEB0()
( l j8 D; k- c+ b6 j* Y - {
/ g/ s, v4 \, ?1 R- q - signed int v0; // ebx
( Q* ~$ W S+ K, s+ C$ u - int v1; // ecx6 Z2 H9 V. y2 B9 F& v2 c' w. ~
- float v2; // ST18_44 v# n+ _0 W, n) o) e- s
- float v3; // ST1C_40 F# u/ j* ?3 h
- float v4; // ST20_4* W! f% p7 n' i2 S8 c
- float v5; // ST24_4
7 G* p8 y. I( F) n" E2 ]# v* `& ^ - int result; // eax \) P0 y6 |; A2 d1 k# [- g4 |
4 H/ U2 y" ~ J- v0 = 0;
! V& B z6 i7 }2 U; p: c - dword_4DF5130 = glGenLists(272);
) e' N3 D' L% ] - do
; m |$ B: U+ z) K } - {3 S) L( s; S O9 P5 K2 r& O! m
- v2 = (double)(v0 % -16) * flt_483450;+ l" v3 s+ T4 \" @
- v3 = (double)(v0 / 16) * flt_483450;* {" q) X% F# j" e
- glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);+ x' z: C# b3 e: x, M& v: w
- glBegin(7);' }2 Y a8 y+ y6 R- i3 Y' Q
- glTexCoord2f(LODWORD(v2), LODWORD(v3));
/ Z6 F0 Z" \' N4 g - glVertex2i(0, 0);& }5 w; A2 Z2 f; A
- v4 = v2 + flt_483450;
0 D2 c( |% H, S4 a' b! W - glTexCoord2f(LODWORD(v4), LODWORD(v3));
$ Y) {/ X- {9 `& ?1 j - glVertex2i(16, 0);
t; `4 O" R9 J! X! @- r4 U - v5 = v3 + flt_483454;
% t# s/ k+ I1 e" _ - glTexCoord2f(LODWORD(v4), LODWORD(v5));
+ V" F* z* R! r% X* e6 Y& j - glVertex2i(16, 16);8 T1 [& e# e& O: t2 Y% o
- glTexCoord2f(LODWORD(v2), LODWORD(v5));4 a; U, {1 k" R# y' V
- glVertex2i(0, 16);
6 i; F1 y% `, `- L( N - glEnd();
, T7 P8 F2 a/ H! y! K: ]+ r - ++v0;$ T! ?* I; V1 D! @, n$ ~6 a
- glTranslated(0, 1076101120, 0, 0, 0, 0);
3 T K5 O0 Z3 d - result = glEndList();$ e) p4 V e9 ?6 g5 W
- }
5 U" k" Y( R, d- {% I9 h+ |+ r - while ( v0 < 272 );8 a8 H) x, [$ I' I" h$ F
- return result;) |8 s" h% M) I# ~8 @
- }
复制代码 * a2 g& M, d; n3 D
& H6 Q& A+ t' Z% `对glCallList的调用只有以下一处,
W* m+ F/ p; L( r$ O这是显示单个字符还是字符串的方法,待以后再确认。! S! h ? w0 o
glCallLists(strlen(&v7), 5121, &v7);
- B: E9 J$ \9 h; g5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。0 q2 W* j7 J& H/ P! t5 d! e
7 m( p z5 R+ T5 @% |- #define GL_BYTE 0x1400
9 n* B: |- t- _: i* ~. f - #define GL_UNSIGNED_BYTE 0x1401
: C8 K& o6 h6 i# @/ ^/ ^, R8 [ - #define GL_SHORT 0x14026 e1 Q' i; K; _& Y- {
- #define GL_UNSIGNED_SHORT 0x1403
+ {( o9 z* O8 H) }9 { - #define GL_INT 0x1404
V. D ?" p( J1 V7 t! s - #define GL_UNSIGNED_INT 0x1405) c J+ R" ?0 b- u1 ]/ Z# x* [. K
- #define GL_FLOAT 0x1406
; S+ Z( W3 F- [4 ?' w# v& C( e - #define GL_2_BYTES 0x1407' k0 R) x/ t1 Z! e% u
- #define GL_3_BYTES 0x1408
0 X1 T7 R, h% [, |( w/ P0 ^+ I1 k - #define GL_4_BYTES 0x14098 b# H8 I4 }3 _! m
- #define GL_DOUBLE 0x140A
复制代码
6 R+ W+ ?/ ~+ z K. C, o' H; \2 t( L* l
- ! U! k6 g# b+ h
- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)
7 b- k. d$ ]3 ~ - {( {/ X9 O& v. w0 Z1 ~
- int v5; // ecx+ O3 C8 V D! H3 B
- int result; // eax; S# z5 j6 r# x4 J4 f
- char v7; // [esp+18h] [ebp-118h]
6 p2 f% ~7 P H3 r) D. O' S - char *v8; // [esp+118h] [ebp-18h]
- d+ L0 s/ d# {6 k - int v9; // [esp+11Ch] [ebp-14h]
5 m4 d4 T; b' p9 g" n) N - int v10; // [esp+128h] [ebp-8h]
/ S9 t: f" A/ j6 \ - $ @3 B1 V2 }8 g4 {0 H
- v10 = v5;: _9 D( y8 {. ?8 t( P1 V
- if ( a4 )& D0 k2 n2 q* Y; b) m
- {8 {' a( q- {# \; o7 j/ I
- v8 = &a5;" D! m+ X* I/ H3 ?7 j
- sub_41BA00(v5, a4);
8 z! I4 Z. E+ f, N$ W8 L8 N2 c* }, b$ J - v8 = 0;
0 a/ V4 {. F3 \$ y1 j% ^ - glBlendFunc(770, 771);
4 O- \& N$ {0 l - glBindTexture(3553, dword_4DF3BC4[8 * a3]);* m1 H/ l" q2 W, K
- glPushMatrix();- L5 t: `. }" P D- q
- glLoadIdentity();7 k7 I0 F8 q% q% S
- v9 = a1;
, y8 ~/ { {- C A - glTranslated(
; k, ]! p3 F2 F8 H8 Z" _ - COERCE_UNSIGNED_INT64((double)a1),
3 t6 {/ M, r4 k8 ?, K# L - COERCE_UNSIGNED_INT64((double)a1) >> 32,
! Z4 W5 `1 W" O; q8 k5 w% o) N - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),
+ E5 Q( Y* N: ~! }/ D/ q% u - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,
3 ?* P- V# a. [* W9 g, r3 a8 Z - 0,
; W5 _2 q# n. E9 |, a- D* A* l' H - 0); ~0 A. m* P. |) i. R- S9 r0 B
- glPushAttrib(0x20000);* V9 g5 a9 @7 o& k
- glListBase(dword_4DF5130 + 16);
% ~& s; u* ]. C0 B5 v - glCallLists(strlen(&v7), 5121, &v7);& g3 d. Y/ @) B4 a* E- O, \
- glPopAttrib();, V v7 R# G3 b# ]1 m
- result = glPopMatrix();( T4 O( w- A4 U) A7 O8 R
- }
2 P L9 L- H, o0 W1 L6 c - return result;
+ f$ p! L9 H% d; \+ { - }
& }, X1 p/ M& s; h/ ^. j
复制代码
+ j% ?2 P! Z) n8 U
5 D* y% O5 U! D9 R; ?5 j5 {0 U/ ]$ S- o
|