本帖最后由 shane007 于 2023-9-4 18:48 编辑
( c2 K. d' v- t6 m
8 S3 a/ H; n' Z9 C. u这是个opengl引擎的游戏,对opengl的初始化是在scream.exe里边完成的。
: t) O+ a2 M- l4 U, r& n3 w对于opengl的游戏我们主要关注glGenLists和glCallList这2个函数
6 w- m; V8 e4 D( L0 {! g" N: b/ {, ]' N N
- E0 R! {) h% K( U0 JglGenLists的调用有4处,前3处参数为1,应该不是。
# V- B2 N+ I; V3 l' D一下是第四处代码,这里应该就是生成字体的地方。9 y; i H P4 f" W# {
从代码里可以看出,字体材质长宽各是16各字符,共256个字符,此处要修改。5 p- B( n* Q! X
- int sub_40BEB0()% ?6 m* B$ r1 v; ]4 o$ G
- {$ l4 p$ L! j0 g2 {
- signed int v0; // ebx# Q4 }5 R+ A) ~4 d0 f' Y
- int v1; // ecx" w( C& S, }. K
- float v2; // ST18_4
: {' R# Q, A5 h7 T! p - float v3; // ST1C_4
6 Z1 a$ F* L; ^/ I; j - float v4; // ST20_4
$ v# Y9 M: V/ C, m - float v5; // ST24_4
0 D. M. R8 o* d! ?. X( R+ R$ i2 F - int result; // eax* x) X* M3 j! p6 P) h' {% j
- 3 P9 \" u3 R4 j6 A3 }# T& x1 o
- v0 = 0;
; b5 j; V/ y# L; u. p" D# `" l - dword_4DF5130 = glGenLists(272);
! E" y8 \: y& l4 K1 P' k M$ [ - do; s4 n# I" M$ y
- {" w4 o- E: g3 J9 E7 N- ^& T
- v2 = (double)(v0 % -16) * flt_483450;9 G. d8 j. ~% Z2 Z7 o+ ?, W" @
- v3 = (double)(v0 / 16) * flt_483450;
$ y% d1 O4 y, [, |- y$ D - glNewList(v1, v0 % 16, v0 + dword_4DF5130, 4864);( K! P7 e# }# U6 ^ ]: i
- glBegin(7);
( r. h; q1 j: ^, D - glTexCoord2f(LODWORD(v2), LODWORD(v3));
- d# R; n( q& }% `* D - glVertex2i(0, 0);3 a7 c) E& X- K1 E% f7 P3 W2 G7 Y4 B
- v4 = v2 + flt_483450;( r, W3 T! c2 H( P4 j
- glTexCoord2f(LODWORD(v4), LODWORD(v3));
8 @6 g3 H/ N8 D3 R - glVertex2i(16, 0);
2 ~8 P- E/ ]6 O* W% a% `0 ]9 E" h - v5 = v3 + flt_483454;
1 F+ H6 @( X2 J n d6 I5 w - glTexCoord2f(LODWORD(v4), LODWORD(v5));
* ~' y; `! h: O: ], T% U/ |; J - glVertex2i(16, 16);
' k0 |6 a- _, z: R1 j - glTexCoord2f(LODWORD(v2), LODWORD(v5));. t: g4 H7 U# s4 f) ]6 l
- glVertex2i(0, 16);) d. C$ n$ C I) o+ j5 m
- glEnd();0 `& ^, A# c7 {4 V5 `! s
- ++v0;4 Z( M* p" ?. i
- glTranslated(0, 1076101120, 0, 0, 0, 0);
/ Y4 \+ ?0 g: {: V - result = glEndList();
; q2 u" u# a* n" G. i - }8 k/ N0 v \: O# g
- while ( v0 < 272 );+ w# v4 O8 c+ j- \: k I. w
- return result;3 f$ \& j6 H" J% t) O
- }
复制代码 * `* S; w1 R, j- M0 p( U( Z
6 V* C. a# H$ G" P) E' n7 B
对glCallList的调用只有以下一处,
; ^! g* E, C! q% r3 l这是显示单个字符还是字符串的方法,待以后再确认。( X) S' c! M8 \7 {3 v3 z2 L9 h; {$ w. K
glCallLists(strlen(&v7), 5121, &v7);5 M' B; a! u. E$ K/ i# l ^- d
5121为0x1401 ,即 GL_UNSIGNED_BYTE ,是单字节。3 U" D1 k- V- S1 D7 i9 R/ H! K
9 P# P1 C$ @, d9 q T& k
- #define GL_BYTE 0x14002 x+ H2 @5 Z. ]3 P) @8 t2 M0 O' @
- #define GL_UNSIGNED_BYTE 0x14017 E8 E# l8 @7 c, i& o
- #define GL_SHORT 0x1402
( [1 M6 u+ n2 h+ X/ d5 ^2 L) Q6 W5 D - #define GL_UNSIGNED_SHORT 0x1403+ q+ K5 i3 H2 i
- #define GL_INT 0x1404& p5 M" V6 H \! F
- #define GL_UNSIGNED_INT 0x14051 ?* O7 T* N0 ~7 T. N
- #define GL_FLOAT 0x14064 m: U: {- o" E `3 X
- #define GL_2_BYTES 0x14071 ?0 `7 K4 m4 n9 J
- #define GL_3_BYTES 0x1408
4 f5 R, C' D0 ~" B' P - #define GL_4_BYTES 0x1409( `2 K8 V9 T7 X& [/ \% u6 W5 X( E
- #define GL_DOUBLE 0x140A
复制代码 ! f1 C4 v8 ?$ n* H6 E0 s9 e, y
W9 ?# P# F* X! v% g. O( o/ n+ t
- + x+ t! _" y/ T; D+ Z, L% J
- int __cdecl sub_40BFD0(signed int a1, int a2, int a3, int a4, char a5); {( O* \1 @' I- Q# L6 `, X7 U
- {0 r$ y: }9 Y1 t5 ^" i. o
- int v5; // ecx
, c m2 q" L" i& \# J - int result; // eax
4 D/ C+ s% e9 Z7 M( I% b/ N - char v7; // [esp+18h] [ebp-118h]
+ P3 R7 P3 ~" ]8 | - char *v8; // [esp+118h] [ebp-18h]* o# y. x2 b: x+ E
- int v9; // [esp+11Ch] [ebp-14h]1 h$ p0 X9 {% Q3 Q( H/ r
- int v10; // [esp+128h] [ebp-8h]
( T: p! n* d5 T" R1 a
/ E! b/ W* p1 u0 A* r/ W- v10 = v5;+ J2 M* R' F# h: f/ U0 {
- if ( a4 )1 \0 f ?* H' j5 x) ^( _
- {/ ?1 J5 i$ ]8 `$ o, D- F
- v8 = &a5;
& j! K& m! }& T' F - sub_41BA00(v5, a4);
" R+ O" ^# c& Z - v8 = 0;5 L c4 y: A( }* o
- glBlendFunc(770, 771);
* L- k+ \# G, ]9 f4 F8 [1 Q - glBindTexture(3553, dword_4DF3BC4[8 * a3]);
" o+ c8 P, x* t% u' B/ c/ {! B - glPushMatrix();
/ @( G! ?. r6 ?2 o% {, z( H - glLoadIdentity();- i: A2 ~, t3 l# {! B
- v9 = a1;
6 M# ` r$ @; u/ i# w - glTranslated(. f4 |% q S2 l2 u# D
- COERCE_UNSIGNED_INT64((double)a1),
; k1 Y7 d, n5 M. y7 ? - COERCE_UNSIGNED_INT64((double)a1) >> 32,
. O6 Y7 i1 o5 a# f) c - COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)),* M8 f- g" U, u$ |
- COERCE_UNSIGNED_INT64((double)(dword_4DF8B68 - a2)) >> 32,0 Z/ _" p" U. [+ o5 H! i0 h* u
- 0,/ o/ E0 R4 I5 q' ~& A$ l0 a; W H
- 0);
# q9 d# A- y% I5 F) M - glPushAttrib(0x20000);
4 W5 p4 C; F/ m5 T1 H9 q - glListBase(dword_4DF5130 + 16);
: `+ m V2 l: s7 M& [; T d- V - glCallLists(strlen(&v7), 5121, &v7);
+ B3 Z3 u: |9 ?* x - glPopAttrib(); o, i* A; ]3 K
- result = glPopMatrix();
6 W1 l+ ^; K5 j% m% K4 r" y - }1 \; ?* a3 Q8 N2 L
- return result;; X8 n8 l0 I3 \" ^3 T$ \
- }! D1 R0 j8 j5 V+ s* ~, e
复制代码
- M% H3 ~% c" F4 k8 l1 o1 ~0 C, p# v3 z1 t& A/ d
5 i9 Q* w- U: l6 q |