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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 8 x9 E  Q0 Z! X+ b$ c

& m; K  ^1 v7 t4 `8 {9 B(nibiru.exe 772 KB (790,528 字节))* q2 u. D/ U: Q

1 H$ P- J/ C1 v4 F- I' Z将sub_451390,sub_451599 这2个显示函数进行了hook.. U: ~( S# J" H7 g  [
确认这2个显示函数都被调用了。7 {; I+ ]% q# U. L, c4 T
第1个可能显示的是调试字符串,第2个显示游戏字幕。
8 N  ^7 G# h% M9 S9 W$ W) x4 Z6 \
$ X+ ?, U5 C/ `以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。  ^) ?2 {: k. v/ S
. L4 ~" a0 L1 p7 W7 c, O
    //v12 这里出错+ @. P& d8 Y: B3 R
    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);9 O' [  C+ }$ E. W
" u' Y# D* K$ B5 @5 M
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。- J* _( g" ~& k, B5 K- `
这种方式显然是有问题的,会影响性能。
1 C- t  X1 x' U- \7 Y, ^  Z" d在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
) s3 M6 G/ y: `$ ~% _0 _( q% }+ K
  1. sub_451390_Font1_hk5 M  J" Q: s" l0 W; p) [
  2. sub_451390_Font1_hk. l7 l- j$ h0 v+ i& F: e3 u
  3. sub_451599_Font2_hk3 \1 [+ o" D, {2 P; y% p8 N
  4. sub_451390_Font1_hk3 F3 t5 ^$ k8 O9 E
  5. sub_451599_Font2_hk
    " u, c6 L8 U5 j7 x5 S, }$ ?; E* p
  6. sub_451599_Font2_hk1 d+ A0 m; e' V
  7. sub_451599_Font2_hk
    ! K5 Z' |3 k7 G( G- y' ^
  8. sub_451599_Font2_hk
    & m& |5 p- h. k2 S! n' y. G
  9. sub_451599_Font2_hk
    0 `3 E) u; U& [' @( I: G/ g. I3 [
  10. sub_451599_Font2_hk; ~5 ?" z1 E# G
  11. sub_451599_Font2_hk
    3 d8 W) `* E% x: C  ~5 R6 Y' d  [4 N
  12. sub_451599_Font2_hk) A9 S! d, o  e4 j8 L: E! l$ t
  13. sub_451599_Font2_hk
复制代码

7 V2 {! z' b% q' v$ z5 G代码* P$ j6 O8 J# c' ]' p5 v* j8 I1 N
  1. #include <windows.h>
    5 H2 D2 F6 o1 V3 t* k. k
  2. #include <stdio.h>1 l$ B4 K2 F" f  j2 u

  3. 7 {6 g$ U6 @- k+ g; o. I
  4. #include "patch.h"3 D5 d: r& L3 c/ M6 X! I
  5. #include "patchNibiru.h"' n- I$ O8 ]$ _! t
  6. #include <GL/gl.h>
    - ?& l- z" x/ i8 A4 D

  7. & |2 a" h# a# Z- c  q' i/ T
  8. 4 @2 n$ ?: C$ L# W) Y! Z2 S
  9. DWORD SUB_451810 = 0x00451810;
    . L$ y" [( @/ q
  10. DWORD SUB_451390 = 0x00451390;
    " w! Q* t. u3 \4 ]) Z
  11. DWORD SUB_451599 = 0x00451599;
    2 U) |9 ^' _, G, V/ H2 _
  12. : q* O+ J# y3 O. v; m9 F
  13. HDC currentHdc;' E1 o: X" }4 o" P. B" w

  14. - a% p3 ^% a+ I9 T4 F5 `6 U4 G
  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)
    7 S) i2 m" J3 ]! h5 w7 c7 A, Q
  16. {
    8 T& W  x; @% i' r2 h
  17.     DWORD v10; // [esp-450h] [ebp-450h]# q* t. ~$ H2 M0 M
  18.     int v11; // [esp-44Ch] [ebp-44Ch]1 n, I8 o' \( a+ g7 k! m1 [3 n4 H- g
  19.     int v12; // [esp-4Ch] [ebp-4Ch]8 Y& f1 Z5 I. Y/ n/ t# n
  20.     int v13; // [esp-44h] [ebp-44h]* Q6 i, @  n, G7 ]6 d1 M
  21.     HFONT v14; // [esp-14h] [ebp-14h]7 Z: x% B& b& ^% h9 t
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    8 \. F, U- R6 b! Z- [* {
  23.     int v16; // [esp-Ch] [ebp-Ch]
    . {: L: W- U3 B3 ]
  24.     int* i; // [esp-8h] [ebp-8h]- l1 A5 }$ o0 M5 U/ f

  25. . e+ F! N/ s3 g# L2 M+ G/ _* B
  26.     __asm pushad;4 {$ Z& E" q- N9 C; M+ |& W- P
  27.     FILE* trace = fopen("font_trace.txt", "at");( C1 Y) X8 I2 l, ~+ t
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");3 q0 z2 v! t! r, \
  29.     fclose(trace);
    ! `8 I& V. P, D/ \
  30.     __asm popad;
    ) _- o( ?5 @& P
  31.    
    " c9 b, W8 C) u# I4 L' i& M- F
  32.     //if (!a9)
    " @7 n  e' E6 F
  33.     //{
    ; K* O( P9 C3 E. z
  34.     //    AddFontResourceA(lpFileName);2 H$ I6 @" i! }, s" o$ A0 x( O
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    9 A# h9 r6 A4 N0 L( O+ M9 n  T+ t
  36.     //        ;9 [2 H; Y# T& |. J
  37.     //    *(_BYTE*)i = 0;) w% p5 D4 g% ^$ [( [3 Z( M2 Q
  38.     //}# \8 D4 ^% Y% U4 Q) c" r
  39.     //if (a4 == 1)1 b$ l# J& P  }  M6 P$ V, b
  40.     //{
    9 L. \4 E0 Y) P& e
  41.     //    v16 = 100;9 |* D0 q$ i0 N# m& `. Q1 R1 [
  42.     //}! [6 [. [' Q/ F9 b/ @  c
  43.     //else if (a4 == 4)
    # u) o3 g. j# B5 k$ S6 ?& r) N
  44.     //{/ B- i6 A; M; E0 Y
  45.     //    v16 = 700;
    5 j! }, @# _( N, T/ O
  46.     //}- l/ b# |. S8 E7 n2 [
  47.     //else
    . S7 ?( n3 i& y  [% j( [
  48.     //{
    * Z2 P9 l# }! `# c, z3 N+ x4 p6 B
  49.     //    v16 = 400;
    ! z2 d+ f$ b; ?9 Y+ \8 T
  50.     //}
    0 ?4 i9 |" ~1 x  E4 b8 U& z6 [
  51.     v10 = 1;
    * ~$ P8 K3 h( e
  52.     //switch (dword_4AA490)# i/ g' v% R$ g, ]" Y7 I
  53.     //{4 Q% _% A. ]. ]  t4 R% r( P
  54.     //case 1250:( A& ^6 r/ T" T" V  W3 ]! m; |/ z: ~
  55.     //    v10 = 238;
    . [  b" W- C) A/ e. U
  56.     //    break;
    3 ~" m; s. I% `8 F" {
  57.     //case 1251:
    : P8 I6 D: a+ c( N/ w
  58.     //    v10 = 204;6 @( o3 O+ ^! I) Q' f+ }
  59.     //    break;; P2 ]9 j5 V% z; l: `1 z' b  Z
  60.     //case 1252:
    5 z' \! Y# L* _7 k1 p" O
  61.     //    v10 = 0;
    0 r% G1 Z; I# h7 O- e
  62.     //    break;9 n# T1 ~/ q$ y1 E/ G4 t5 Q. T
  63.     //}
    % W) L8 u! {$ f- b) Q
  64.     v15 = glGenLists(256);
    5 \0 _* S7 {0 a/ `
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    : c% G- e7 ]) b, L9 c. \9 W
  66.     //if (!v14)
    + r4 H) p) Y  A* ?2 T! T
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);+ r- b' \( d/ v& \1 X4 ^5 S$ m
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; ) B6 c7 q  A5 w$ V2 m" Z) f6 S
  69.     SelectObject(currentHdc, v14);
    ) m" v1 r8 [# f" S
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);$ K: u1 I& {: L8 K
  71. $ z" w* l6 C! E8 Z
  72.     //v12 这次出错, O1 F, ~2 ]' W8 P' V( V2 x. @1 n
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
    ' `; `& f% y$ y; k
  74.     0 y8 a5 n* Q. S9 Z. J: j
  75.     //*(_DWORD*)a2 = v12;3 `4 N- V3 y. J' ]
  76.     //*(_DWORD*)a3 = v13;+ M- U( f: s$ j: y  d! l$ i! l
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
      o0 O# L8 ?" m) R
  78.     //if (!a9)( b# h' w. G8 x1 x2 c! m
  79.     //    RemoveFontResourceA(lpFileName);8 k+ S  Q/ u6 K& Z
  80.     return v15;
    0 p4 H% y  f: r. o2 t( h1 v5 ?% w
  81. }( V& m& E, t$ X# F# u# o0 x3 I

  82. / O! |9 t" z5 a- R( E, h4 _
  83. //使用到8 Y  B! c8 {' I* O: Q% S; x
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)% s9 V- B. ^9 {% s1 t2 I
  85. {
    $ D; v  n/ d1 b
  86.     HFONT h; // [esp+4h] [ebp-8h]
    $ A) _$ l# H  @% A/ L# l3 C
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]
    + ?/ D1 }6 _' o# @
  88. 5 Y9 x, `+ M; ^$ e5 P% L$ h

  89.   [' h7 ~+ o" F6 q7 ~9 z
  90.     __asm pushad;! t# h  T; |8 m' z0 L
  91.     FILE* trace = fopen("font_trace.txt", "at");
    0 X* L( A' o2 T, x7 a' a5 \% p
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    + t0 e# S5 v3 ^4 O' z: N1 I* q
  93.     fclose(trace);
    & |5 f3 @4 E) U: W& S
  94.     __asm popad;$ r6 q  y' z% A/ X' P; O5 [0 n% I. g. E

  95.   U: c3 h# N- G/ M8 ^
  96.     currentHdc = hdc;
    ; ?+ f' ^! P" r* q. ~
  97.     iCharSet = 1;
    ( O' u. t; z6 i; G4 i2 Q
  98.     GLuint base = glGenLists(256);
    ! A, F* f% x. V. A+ r
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");  t- n. R1 I2 L& @
  100.     //if (!h)
    0 R7 Y5 M5 u0 e
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    1 l# y1 S6 h& B% y8 L9 U4 }; ]
  102.     SelectObject(hdc, h);( s; E7 ]% a" ~1 q. }9 X
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);3 r& c- |! F8 o0 V9 I) {1 A1 r* u
  104. }
    6 u4 G# ^8 X6 Z! y: h3 P

  105. , f0 b! x* S( m+ ]% G1 p0 l
  106. void __cdecl: `$ p7 e. h: c; K9 @5 `
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)3 E% O3 d" b2 l* n- U4 N: O2 \& p
  108. {
    3 t# z( z- O# Q  Q! Y7 l
  109.     __asm pushad;# O! t# T# H" \- A5 Z* r
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    / ~: n: q$ u/ A0 R1 r2 z
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    8 I! `2 [) N! H
  112.     fclose(trace);
    / H0 _! ~. f+ C0 z
  113.     __asm popad;' j( V8 Q: u2 b2 p
  114. ( w! n7 \4 o3 e$ w0 S
  115.     //return a1;/ n; Y+ H# x' Y) m1 r
  116. }: R/ Z/ i9 j8 R/ W8 e( W

  117. . T. @! D6 X+ _, P% @
  118. bool
    / I6 r6 S& T8 W9 _9 ~9 \
  119. ApplyPatchNibiru()3 H7 C* s' \. m0 }3 H. @: J
  120. {$ h/ d2 f3 M' a. U# i5 h  p
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);' M; a& l, ?  S+ W4 [5 ^0 P: d
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);6 c* b/ R; i1 A* e" n5 X
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    8 y1 C% F  }5 Q8 G

  124. 1 x+ n3 c% s5 Y2 D3 b$ R6 Z# E
  125. - l) }: T; G" R* @4 P# y5 O) l' T
  126. ; y% Z& D* p0 r3 S
  127.   return true;
    0 d; N3 }" Q6 I  h; D$ {
  128. }* G- ~2 T7 V7 E1 I7 X
复制代码

6 f9 _) f8 Y/ Z, d6 a1 J; Q' B& S' q% x5 P
- y# T2 ~+ [) h( ]) d9 r! N3 `3 c. A! w- @- s

' E7 K# p/ B" f0 L( l! P) F* |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好1 很差劲很差劲
回复

使用道具 举报

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

使用道具 举报

板凳
发表于 2026-4-13 19:25 | 只看该作者
向技术大佬学习
回复 支持 反对

使用道具 举报

高级模式
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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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