设为首页收藏本站官方微博

建议 【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1

  [复制链接]
查看: 552|回复: 1
打印 上一主题 下一主题

[建议] 【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1

跳转到指定楼层
楼主
发表于 2023-9-6 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

【Opengl游戏汉化 #5】 尼比鲁:秘密年代 (NiBiRu)字幕显示函数修改1

本帖最后由 shane007 于 2023-9-6 11:03 编辑 # D" k. p1 b/ i; [- s

- }2 d7 r* t4 @/ n& Q(nibiru.exe 772 KB (790,528 字节))+ D. N+ s9 E; D8 x
% q: D" j0 @! x4 @
将sub_451390,sub_451599 这2个显示函数进行了hook.
/ G8 x* E# ]5 ?( N& u+ Y* N" |$ @! h确认这2个显示函数都被调用了。
2 x) e4 }1 X. L2 P9 V7 Z9 g& B第1个可能显示的是调试字符串,第2个显示游戏字幕。7 S6 A& U  s+ A

6 o1 Z& C& B" F( e0 s以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
% r' a: P: _! u# B& a! q7 F
% e) |4 b% `! W3 w9 s    //v12 这里出错
+ |5 z6 c2 y! P; s: l7 F# E    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);( p8 ]0 X7 n! e4 f: V
" g8 D) H( P6 J2 C+ Y; @' V- {
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
; b) Q$ p& B) W& B  M$ w. ^这种方式显然是有问题的,会影响性能。
  x' {- ~4 Y* ]/ C/ y在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
4 c( Q6 K& }9 f  k+ A" v5 F/ e
" V; B) S4 Z# ]+ A3 ]' s5 o( {( p) s5 w
  1. sub_451390_Font1_hk
    6 p" V, u1 y8 v# v! G
  2. sub_451390_Font1_hk
    2 ^) w* L8 M, q; C- ~
  3. sub_451599_Font2_hk5 D' Z4 k0 V5 V! ~
  4. sub_451390_Font1_hk
    5 p; H, D4 w4 |* Y3 Z! {) U
  5. sub_451599_Font2_hk
    % t! z9 Y" F" _+ w4 x. `6 H3 X; ^
  6. sub_451599_Font2_hk% t# H8 _: B( a
  7. sub_451599_Font2_hk
    7 a& s7 i# r' A+ |, A& Y
  8. sub_451599_Font2_hk
    2 j/ @* Y. f( F2 w
  9. sub_451599_Font2_hk
    ; H! j8 q7 j/ \& s' G
  10. sub_451599_Font2_hk7 V/ G4 R3 ]; H& h! \. u1 ^
  11. sub_451599_Font2_hk) t+ ^/ @4 X$ S' |. }* N
  12. sub_451599_Font2_hk+ B7 R1 C4 g. }9 M$ f: t- h* Y
  13. sub_451599_Font2_hk
复制代码
4 E) K9 T% S% b# H) O) e
代码
2 e, ]" B4 ^& X$ Y
  1. #include <windows.h>
    8 _- ~. h  h% z3 F) a9 i2 z
  2. #include <stdio.h>3 `2 q: n, p! F$ Y/ m  Y& a# i

  3. * R! C* A$ s0 J2 q
  4. #include "patch.h"
    $ K5 J6 w8 N  @) h- H# S& L
  5. #include "patchNibiru.h"
    : J9 Q7 v; F" S0 o7 f+ ?
  6. #include <GL/gl.h>
    ) z3 B7 J/ ]+ U

  7. 9 m- a& T# k% ~% o: E
  8. ! J1 E4 v/ I5 e" |% A
  9. DWORD SUB_451810 = 0x00451810;+ J3 v% x3 L" g) ?( X- u/ f" r
  10. DWORD SUB_451390 = 0x00451390;& ~. C. h% c) O4 m8 d$ x
  11. DWORD SUB_451599 = 0x00451599;! V8 U# p* L; p$ L  w
  12. ; U" V4 L6 _4 C/ n3 \6 t8 N
  13. HDC currentHdc;
    2 i  p4 y$ \1 H. ?2 j
  14. , G" k5 l3 K1 X/ E: x
  15. DWORD __cdecl sub_451599_Font2_hk(LPCSTR lpFileName, int a2, int a3, int a4, int a5, int a6, int a7, LPINT lpBuffer, int a9)4 s- o' ~# V- e' \0 a
  16. {% n& }: N, b- y" N! w
  17.     DWORD v10; // [esp-450h] [ebp-450h]2 s' [# m, F3 y6 {% D
  18.     int v11; // [esp-44Ch] [ebp-44Ch]  ~6 U  J, ], I
  19.     int v12; // [esp-4Ch] [ebp-4Ch]
    ! D% C* Y7 ]6 e2 {; u, t
  20.     int v13; // [esp-44h] [ebp-44h]
    # q! W: k, i9 H+ U
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    / n2 j. B3 O. I
  22.     DWORD v15; // [esp-10h] [ebp-10h]  d, r) [' S$ E* r& ?  }, v/ K
  23.     int v16; // [esp-Ch] [ebp-Ch]
    ! ]+ s- I8 N# ]0 U: N2 `
  24.     int* i; // [esp-8h] [ebp-8h]- f# V5 k3 C3 [& P6 n: ]' [

  25. % l2 E4 O, d# ^* z, M$ }- N& L
  26.     __asm pushad;' o/ A7 Y2 i5 K( V1 b
  27.     FILE* trace = fopen("font_trace.txt", "at");
    . J) A2 s) d6 C3 {+ ]3 b4 i4 K
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    4 v. |* U' _' o4 Q" G5 |* e- P& A
  29.     fclose(trace);
    8 W; R9 l% R: [2 v! O& l) n+ ]' ]5 A; O
  30.     __asm popad;
    % g0 o- K) C' k, D2 Q- u
  31.    
    : ], K; x' ~* H4 b5 R( q
  32.     //if (!a9)
    $ w/ e5 W# j/ [; r8 M
  33.     //{! ]3 ?" Q- Y6 P) Q! _0 G
  34.     //    AddFontResourceA(lpFileName);
    : h, b) I. ~' k, a
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    - L+ Q0 y+ j. ^7 I6 l& a
  36.     //        ;" a( C: [1 ^0 a* C
  37.     //    *(_BYTE*)i = 0;1 t$ B6 |# u3 J* R7 y. C& }
  38.     //}3 X& ]1 L1 K! p3 Z" k# y7 q4 E
  39.     //if (a4 == 1)4 u$ S# I' ^) b+ j8 C6 a) [3 `
  40.     //{
      p6 U: K6 t2 C; l+ o
  41.     //    v16 = 100;
    6 H" y8 B, i3 b, |  R
  42.     //}
    ' c; A  l3 h9 b' E9 c' m% {# z; w" W
  43.     //else if (a4 == 4); d1 F3 ?* k3 [
  44.     //{
    % ]% t3 `; i0 p4 \! z
  45.     //    v16 = 700;
    ' J0 L0 [& a% g# Y1 N) P
  46.     //}
    5 n; w  w& Y6 d0 V/ q
  47.     //else. V5 J; E$ [, l
  48.     //{
    / i* r2 h; S  m+ x- Z! E' Z. `
  49.     //    v16 = 400;
    & A% s. r, H/ M- s# x8 r1 S% K
  50.     //}
    - c' W8 _( Z% G8 R: r
  51.     v10 = 1;1 H/ t6 |% v+ b5 T6 c
  52.     //switch (dword_4AA490)& q1 ^- [8 l' W8 f
  53.     //{* G, `+ B+ Y/ x. d$ |
  54.     //case 1250:% ^) U' E4 b( q/ R* T$ K6 w$ I
  55.     //    v10 = 238;
    ; ?* o- K% G' J
  56.     //    break;
    ) K1 f5 o- R! v
  57.     //case 1251:- X) }  s" T! P1 L, y( f
  58.     //    v10 = 204;& p' t; |8 G# x
  59.     //    break;
    0 j3 f! w) h/ {6 j3 M
  60.     //case 1252:
    & W- p! N5 [( \' d+ k1 |
  61.     //    v10 = 0;
    3 j4 Y/ s* O. j( k& v/ y3 f$ V
  62.     //    break;% o. N# g" o1 p
  63.     //}5 E5 i. w! n* d0 ]5 ~
  64.     v15 = glGenLists(256);
    ; [. f$ a0 q3 T7 `" \/ O
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    : Z- y. T) y8 Q% |
  66.     //if (!v14)5 {* E/ \! c; A5 i, K$ }: L1 F. t$ F! v
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);
    ( }7 `4 y) j9 A* @
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;
    / X& _4 s5 \2 j' F. \/ G. s7 a% y
  69.     SelectObject(currentHdc, v14);- k, z1 l5 ^# ~/ q" S6 p
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);  e+ S' n0 h' u2 P/ S
  71. 8 F' @$ d8 d. u: L
  72.     //v12 这次出错
    ' @3 I4 e( D0 l3 ]9 `  U
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);# Z0 w% Z( I! V& c9 j) M! W: A0 y( i
  74.     ( @: T. q% r: z8 a
  75.     //*(_DWORD*)a2 = v12;
    % A$ b6 p6 _! a' C3 v4 J
  76.     //*(_DWORD*)a3 = v13;
    9 E' [8 X* l/ S$ x% O
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    8 Y1 L. d7 L6 u/ @2 `; i- j% a! A
  78.     //if (!a9)
      k  ^1 J& S$ F0 s% o2 x+ g2 p% y
  79.     //    RemoveFontResourceA(lpFileName);. `0 Q) t& _2 ?0 M
  80.     return v15;
    9 ^* P, U; g! F
  81. }
    0 o! ~: P' M7 \$ `9 `
  82. ' @7 v0 f! G& O! L
  83. //使用到
    : k7 r# O5 \3 m6 @
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    8 w  B9 Q7 Z2 k, m1 `3 o
  85. {- _; y. z$ U& e+ W" V3 A# ]
  86.     HFONT h; // [esp+4h] [ebp-8h]
    / X4 h0 [& Z( y# S$ z, ~+ q
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]
    1 ?  c" R1 ]1 Y- S
  88. # _7 r, t. V4 a5 q+ |5 t# h

  89. ! j! T- p: @* ~* T, v% z0 _
  90.     __asm pushad;
      I2 ~- _5 |8 U
  91.     FILE* trace = fopen("font_trace.txt", "at");
    / `7 E: ^$ M0 t7 t7 R4 v8 h' y  b
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    7 _, T( Y0 T3 S5 {# [
  93.     fclose(trace);+ B& h8 s) Z1 {
  94.     __asm popad;
    3 W" A7 U7 \+ g$ j+ v8 `

  95. : {! [! t9 Y( u4 R- \" c
  96.     currentHdc = hdc;
    ; c/ R5 }3 I6 v
  97.     iCharSet = 1;( }, y! D. b+ X9 O
  98.     GLuint base = glGenLists(256);" J9 \5 b, G) C- a  P& S( a- f  M
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");0 A# y# ?& t4 e4 C- L: u
  100.     //if (!h)
    $ H5 u1 u. n( ^% z
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);0 T7 u7 T# l' T4 J- Z
  102.     SelectObject(hdc, h);1 E( D9 V7 r& u& }( I! F. R0 W
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);" _. f0 k/ M% D: p4 v6 y
  104. }
    8 G+ }/ i$ g( V2 D

  105. 8 n! p& |1 a1 w0 A
  106. void __cdecl- \% i; x4 ]! o- ^1 ^
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)! k6 {8 E- ?6 f2 G: _  D3 ^
  108. {
    ( s6 V6 R, i/ b+ ~2 l4 A
  109.     __asm pushad;- H: ]$ I+ a0 o
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    6 G- ?1 d2 B8 S/ x4 {( y
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    ! `" [# z. x; s% k9 d0 ]7 B
  112.     fclose(trace);
    ; s3 A; y9 M' n, }5 {* |
  113.     __asm popad;
    2 N0 `. ], V2 g5 N

  114. ' j4 \) Z* ^# e
  115.     //return a1;
    : b% {' A! B5 r9 b
  116. }
    % E( `. S! `% \9 S$ w9 l" I1 r

  117. - r0 U4 h, h# ~
  118. bool9 y* A; R; i3 q+ K3 R
  119. ApplyPatchNibiru()
    , M% H1 k$ j# T2 F; V
  120. {
    ! |6 a/ @9 I/ u) h2 ^
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
    ; B$ `$ g- ]! e5 g
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    1 V" r9 j; m' Y7 O
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    0 j/ T/ c1 J. [, _) L; x3 B' H# H

  124. 7 `6 n& ~" x' _% Y) K, t' z( o+ J

  125. 1 r. M( K6 }# Y/ e; {5 X

  126. / {8 O1 `2 D0 F6 o1 N/ D
  127.   return true;* V' w5 d+ |. M. l& z( e
  128. }8 i/ k/ ~" x. o" ^
复制代码
9 G4 Z/ `& n2 c8 k% F

% _( Q9 @+ z; F4 Q
) p0 e- `2 ~8 F9 k% I
9 ~: K/ l  D9 g$ N/ }% E# V
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好1 很差劲很差劲
回复

使用道具 举报

沙发
发表于 2025-4-12 16:40 | 只看该作者
学习学习一下
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

冒险解谜游戏中文网 ChinaAVG

官方微博官方微信号小黑屋 微信玩家群  

(C) ChinaAVG 2004 - 2019 All Right Reserved. Powered by Discuz! X3.2
辽ICP备11008827号 | 桂公网安备 45010702000051号

冒险,与你同在。 冒险解谜游戏中文网ChinaAVG诞生于2004年9月9日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

快速回复 返回顶部 返回列表