本帖最后由 shane007 于 2023-9-4 18:48 编辑
/ L% I, v/ U" @/ \! L* {- f! Z/ X1 C7 q- O* [
这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。
' q! c; s2 n+ w; W对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数, b1 H3 P1 F4 j1 i# M
4 D/ S6 s; d( U) ^7 J
( L2 B" s, a6 n" QglGenLists的调用有4处,前3处参数为1,应该不是。
- E' @" Z+ Y8 _" ^7 h一下是第四处代码,这里应该就是生成字体的地方。; G& j& H( `) _( N5 E- B
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。( R+ p( ?3 B# l3 @8 k8 J
- int sub_40BEB0()$ u# h7 }) |" |/ e8 S+ h' ]) n
- {
# e# I2 E# L' @4 B - signed int v0; // ebx
2 c; F# M3 g; a - int v1; // ecx
. B2 ]* R8 C8 o; e( k9 D - float v2; // ST18_4+ R0 H* W0 G9 B. Q
- float v3; // ST1C_44 {5 ^2 B. u# U3 g7 G
- float v4; // ST20_4
/ ~6 ]) o" k G - float v5; // ST24_4
M# ^+ r/ o: [7 D3 i9 F - int result; // eax, C7 U) I" i1 }1 i: ]$ x
- 3 i- |( B* d E, O
- v0 = 0;9 y/ h7 R" ?6 i! n
- dword_4DF5130 = glGenLists(272);
9 S$ f5 i% Y4 U2 r- G - do. v( C3 R+ C" }) M4 t# j
- {
1 a* A. K7 c' H' Z; H$ ^0 ~1 C6 K - v2 = (double)(v0 % -16) * flt_483450; I, |' e8 z4 J8 P$ y; B
- v3 = (double)(v0 / 16) * flt_483450;
% Z1 }7 ?9 e9 [ - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);
$ ?2 H2 [; w" m/ i - glBegin(7);. w4 W# ?, s5 Z' L, C
- glTexCoord2f(LODWORD(v2), LODWORD(v3));
) }& i- ]$ |- ^, b; n4 [6 d - glVertex2i(0, 0); v5 @+ x, E5 L8 E' o$ A
- v4 = v2 + flt_483450;
) o2 u; H/ c3 _! @! r - glTexCoord2f(LODWORD(v4), LODWORD(v3));
: g2 q! ?) O" G$ H6 ` - glVertex2i(16, 0);
1 t3 n/ l' t, T5 J - v5 = v3 + flt_483454;
# C0 L7 R" ~4 a- r3 r* ^- E% N - glTexCoord2f(LODWORD(v4), LODWORD(v5));
C! k3 h8 _6 F: g. d3 C1 P; | - glVertex2i(16, 16);, w9 N$ R1 h7 u" s' V
- glTexCoord2f(LODWORD(v2), LODWORD(v5));- o, {% R2 ^/ i3 X1 q1 d
- glVertex2i(0, 16);& x8 {- U/ X5 Z0 _, t5 F+ n
- glEnd();
3 o8 o5 W' R( g. ]) c* x - ++v0;7 C# s3 s6 u. Z& a0 {3 T" |9 Y
- glTranslated(0, 1076101120, 0, 0, 0, 0);9 L( Z# ^- T8 x }6 o8 s/ s. [
- result = glEndList();; g# k. I. R/ I: z
- }
) {* D3 C3 H1 P% u - while ( v0 < 272 );5 \3 e8 v! D: ~; [
- return result;8 ~/ |: O9 M+ r* r# Z3 r: N
- }
复制代码 * Q Y6 {. n) p) D* l
- A! E( I2 a. y" U/ D对glCallList的调用只有以下一处,
* O3 b2 p& d3 H. E这是显示单个字符还是字符串的方法,待以后再确认。
) y- [9 F) m7 K3 X glCallLists(strlen(&v7), 5121, &v7);% ]- A0 i6 b! z, ~8 N
5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。9 o/ ?* G& w7 k2 o+ Y* h
1 o5 i" B% t3 u/ Q# V1 W/ G- #define GL_BYTE 0x1400" K6 X2 o. j2 S5 f7 Q2 W
- #define GL_UNSIGNED_BYTE 0x1401# c ~7 i+ T; B/ T- Q) J$ d
- #define GL_SHORT 0x14028 U' ?; v( H1 M
- #define GL_UNSIGNED_SHORT 0x14032 N' C- ?$ y- N3 O* z% j0 c. Y' G
- #define GL_INT 0x1404
1 |% I( ^$ G( K, ]. g/ l% d - #define GL_UNSIGNED_INT 0x1405
+ F9 I1 t! M5 }1 ?- s! }. S( _ - #define GL_FLOAT 0x1406
/ J! _# Q3 n. Q) h2 [: ` - #define GL_2_BYTES 0x1407
9 i. o+ v2 T5 s - #define GL_3_BYTES 0x1408# o _% q7 ?1 D* O
- #define GL_4_BYTES 0x1409
4 N& D8 [+ n8 n$ F5 x3 |: c- n - #define GL_DOUBLE 0x140A
复制代码
; F0 y9 b R: p$ R+ d( ? q( E8 E3 \* T: p0 h
5 i+ n% V1 a; U1 }- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5)& B a- v+ R- ]* N7 m9 f9 g" u
- {9 ^8 V" ~9 q) h0 E# \4 ~% f
- int v5; // ecx2 l i! [) f, q" n M0 o
- int result; // eax/ Z- z* e% n1 ~- X/ B
- char v7; // [esp+18h] [ebp-118h]
, ], j+ Y/ e9 l- N - char *v8; // [esp+118h] [ebp-18h]( k1 M" I0 F T5 n/ n
- int v9; // [esp+11Ch] [ebp-14h]
. ^5 i7 r# {" h. K - int v10; // [esp+128h] [ebp-8h]
+ I9 p+ k6 L$ {) ?8 N+ s" N - 6 N, j3 V4 y0 h% u3 Q; K
- v10 = v5;
2 P! @1 {* j. i+ |5 Q0 G - if ( a4 )* S9 @0 ]. W: {7 b# I* J$ [
- {5 R' R( N, s, a _' w8 m& I
- v8 = &a5;
" ? `4 I; g: `/ d$ | - sub_41BA00(v5, a4);6 x: r& }+ G0 a
- v8 = 0;: D0 T' V8 O7 x: n9 b! d
- glBlendFunc(770, 771);+ l5 `5 j' _4 t6 O( H
- glBindTexture(3553, dword_4DF3BC4[8 * a3]);
9 @! Y, e% ?5 c8 A - glPushMatrix();
Q8 [/ j/ n, A1 r - glLoadIdentity();: `% z8 x0 g9 {# W( z! c3 b1 {
- v9 = a1;
. s0 b( ]4 }9 j9 y, A - glTranslated(
( `" F9 B# \, J' C1 U0 {9 j% M - COERCE_UNSIGNED_INT64((double)a1),
6 ]' e3 M. ^" |9 k# x7 f3 c - COERCE_UNSIGNED_INT64((double)a1) >> 32,
+ B/ E7 d* x( ]. j, Y! a - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),! Q; Y! g( H- ^* Q$ d
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,4 }; k6 g7 @) I S
- 0,
, t6 W( _4 n9 E1 E4 D. X, n7 ?5 L - 0);* d7 g4 l/ U; z2 p8 M
- glPushAttrib(0x20000);
0 F2 _% n" L3 R {3 V5 H - glListBase(dword_4DF5130 + 16);7 S" w% B& {0 B# q( s
- glCallLists(strlen(&v7), 5121, &v7);
0 C) l9 n! T3 U5 C1 h+ P% T - glPopAttrib();
9 H3 _6 o# |% z; F( Z - result = glPopMatrix();3 g# C; b8 N5 Z# E' p! `8 D& U8 |: h
- }
% n A+ g4 F: _; V$ J. H - return result;
7 i2 q# o6 f, D1 P: W j7 b/ g j - }
8 k# G9 p1 @/ L7 g3 U9 j/ i
复制代码
" n0 a, I/ R2 D
. A8 R9 `: @7 U' K3 k# h; G6 [3 g, N% q
|