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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 & K5 T4 r9 A$ _, v* Y4 O6 W: C

8 q- V) H7 E6 I(nibiru.exe 772 KB (790,528 字节))
  W9 c/ ?9 d( `2 z
- P( P) }% |8 D将sub_451390,sub_451599 这2个显示函数进行了hook.( I: ~' ~, @+ |# _8 m
确认这2个显示函数都被调用了。1 c2 |+ {) E1 a1 a# l3 M9 ~
第1个可能显示的是调试字符串,第2个显示游戏字幕。
. k* U* w: h' h# d0 t9 K0 B) Q% J5 D4 J. Z4 ~
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。. K/ `* r: g7 K6 l6 s

' C8 K4 q! ^/ D* N! N& `. c8 v    //v12 这里出错
0 Q$ N8 L( n; l0 I( @8 A; b0 L    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
+ J+ g+ v: Q" k4 G* n1 y. Z$ _. i* v' o7 h7 w* K9 B5 V! [" t2 E
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
* B/ M  Z* Z% m3 h' N0 A这种方式显然是有问题的,会影响性能。2 M3 l8 f+ s" v$ i' w
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。
; v. v/ N" ^, `3 A+ Z! y/ X* I
' h3 F: X& X  P% Y
  1. sub_451390_Font1_hk# P. U$ w& ~4 W
  2. sub_451390_Font1_hk
    8 Y. y- U+ P% ?7 M+ M: Y& H2 j
  3. sub_451599_Font2_hk! l# j: D7 Z4 M2 |4 j
  4. sub_451390_Font1_hk4 o( [4 @6 e  q
  5. sub_451599_Font2_hk8 W: j% h2 z( u
  6. sub_451599_Font2_hk
    & n- h" c* F. o1 C% `( i) V+ |. v
  7. sub_451599_Font2_hk' Q  i0 e& l, x! r* ?* M
  8. sub_451599_Font2_hk1 D$ F$ F% Y9 R$ G) m
  9. sub_451599_Font2_hk9 R/ Z# c9 {/ e1 X! r5 ]
  10. sub_451599_Font2_hk9 W* Y' b, X5 v/ b8 M
  11. sub_451599_Font2_hk' i6 Y# i0 L0 E' H( P; z
  12. sub_451599_Font2_hk
    2 k  F" K. K$ `. `
  13. sub_451599_Font2_hk
复制代码

% W+ w' K/ l7 ]6 w1 G3 `: B代码
- G" u6 v8 G& c  A2 X
  1. #include <windows.h>
    7 n8 x0 H6 V) E# C
  2. #include <stdio.h>
    0 y( D! e; P& R: _6 D4 q& u. `; h3 ?4 E
  3. 4 b$ p6 q; Q3 l4 V
  4. #include "patch.h"
    * G7 f: ?* @% v+ e# d
  5. #include "patchNibiru.h"
    % b: H7 M6 ]# ?5 ]/ C) [" o
  6. #include <GL/gl.h>: ]% O: [0 x6 g  k, x
  7. 4 t$ Y- W  O, \8 E  K6 j8 j
  8. # j5 i0 o* H9 C, ]! X4 F  X
  9. DWORD SUB_451810 = 0x00451810;
    1 q# O" N: [+ _- e! g9 _2 k. U
  10. DWORD SUB_451390 = 0x00451390;
    . `/ c7 T8 F# E4 {& B
  11. DWORD SUB_451599 = 0x00451599;# ~7 ]5 A; W& F7 _- Q- d% K1 t( C

  12. ' c7 K7 ~+ K: ^" x0 g$ L; Q
  13. HDC currentHdc;6 u0 [# _) h9 r7 `
  14. 1 Y" \: A- E8 H, U
  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)& O5 q! S& `0 l) ~" o
  16. {
    , H( @- Q+ w  C! k4 j8 }
  17.     DWORD v10; // [esp-450h] [ebp-450h]$ D6 t" I% ~9 R: Z' w( `; A
  18.     int v11; // [esp-44Ch] [ebp-44Ch]# I: E' q; }9 Z. F. r# c& a
  19.     int v12; // [esp-4Ch] [ebp-4Ch]0 n0 F+ x. ?* t- X. |$ k/ h* i  q
  20.     int v13; // [esp-44h] [ebp-44h]9 ^% C6 @/ X6 j
  21.     HFONT v14; // [esp-14h] [ebp-14h]6 m3 j- P1 A. Z1 ]: `- d
  22.     DWORD v15; // [esp-10h] [ebp-10h]# G1 ^& _# M- x1 p6 z
  23.     int v16; // [esp-Ch] [ebp-Ch]
    3 Q* `; t% B- d# Y1 k; s
  24.     int* i; // [esp-8h] [ebp-8h]$ Q, i) b8 [1 o* B
  25. ( ~! O$ F$ L& S+ C9 D) ]( R( y
  26.     __asm pushad;0 r. o7 a5 E+ w
  27.     FILE* trace = fopen("font_trace.txt", "at");" y& M2 ^% Q5 K$ Y
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");2 k5 T; L+ c" }- O- ~
  29.     fclose(trace);- }. _* f3 U# B( N  f0 z8 n
  30.     __asm popad;
    & [! X1 |+ l5 K1 v$ X
  31.    
    : |2 ~8 h1 |, c+ g, e7 v% Y3 |. E
  32.     //if (!a9)# r' Y# D6 {3 w- f& e% Y+ `
  33.     //{8 k! W: I( j0 F0 [6 Q
  34.     //    AddFontResourceA(lpFileName);
    # b2 W& D6 f5 _6 o% g
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    1 D# }# {8 w0 k3 z% f5 f
  36.     //        ;1 d1 K- N7 g) }5 U8 T9 I5 o
  37.     //    *(_BYTE*)i = 0;
    7 `1 F; Q- h5 B
  38.     //}# b' n; z" h8 D4 Q" d4 q( _! {
  39.     //if (a4 == 1). @7 V* I0 j5 x
  40.     //{. o: f. S6 p. m  E/ N# x& A3 y
  41.     //    v16 = 100;
    5 O- [( j2 o) ]9 x! t# m
  42.     //}
    ' u9 Z( N# X: d! t7 R$ r* Z% C
  43.     //else if (a4 == 4)
      b4 q$ h. e. C8 O/ P8 y" _
  44.     //{
    ! l# {6 z3 g0 z/ r, [
  45.     //    v16 = 700;  r' h: A6 e8 j6 [
  46.     //}3 X- J* O% g- H% H
  47.     //else
    ) C8 X) s: K/ v- I3 R( a
  48.     //{
    4 u2 @- C- _# R; Z$ A
  49.     //    v16 = 400;
    ! W: F1 L% d4 A; t
  50.     //}# i$ x0 A1 s# ^+ @0 i
  51.     v10 = 1;
    1 Y3 u% c5 _! T. Z8 F  m2 u
  52.     //switch (dword_4AA490)# _# G! h* n8 n! \, ?, j+ f  U; ^
  53.     //{
    , ~1 o) i# p0 S
  54.     //case 1250:. L, v/ ^( }  z
  55.     //    v10 = 238;
    * G1 h2 h/ y: d+ b" K
  56.     //    break;" \$ I% h. d: {( n5 |- ]6 W- q2 }
  57.     //case 1251:
    / g+ r7 o2 q# ^9 e6 E
  58.     //    v10 = 204;7 I/ @0 C' \2 G) M6 U1 v
  59.     //    break;# x6 H' N+ {8 l
  60.     //case 1252:5 y+ M* T' o9 P0 g% W9 S" N: V
  61.     //    v10 = 0;
    # u8 G" v* h; z: H. r& n2 U! E
  62.     //    break;
    1 d/ c! F2 o4 m& O: v( h" r
  63.     //}
    / Q! r8 R! D; _. a4 k7 H, k
  64.     v15 = glGenLists(256);9 |8 {" c8 _; }8 q; r& G
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");. G6 ~  q3 F! \# F; h
  66.     //if (!v14)7 F1 l. v( a/ \; V
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);" c6 |: i$ ]8 _* \* F. Y
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文;   ~5 K9 c3 s" m  |
  69.     SelectObject(currentHdc, v14);+ i2 A- k4 V4 ?# }; t& u' I
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    6 |& Q0 A+ q' R) {
  71. 0 i5 Y* W( k4 k6 A( |
  72.     //v12 这次出错" u* K5 Y+ b2 w( T7 ~+ p
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
    & L/ g2 K3 A0 ]! _/ \) D: v
  74.    
    2 ]9 Q! f! O% F8 g& ~$ G: G# S
  75.     //*(_DWORD*)a2 = v12;  c- c7 M% e1 {  g3 `- |/ f0 |* x
  76.     //*(_DWORD*)a3 = v13;
    4 a9 y) o" {2 n" Z' ]
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);9 y$ m* P. Y5 H' b9 R4 N
  78.     //if (!a9)
    4 q, h9 s6 u5 w* m7 O' o
  79.     //    RemoveFontResourceA(lpFileName);
    " O/ B$ y( [: h& m( T# d6 v
  80.     return v15;" p/ w5 W( T/ H& w1 a8 J
  81. }' V2 [. k( h& r$ U8 D5 ^6 I8 [

  82. 4 D5 q0 S3 Q  w! D" \
  83. //使用到6 _5 a. d! t4 x  W
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    9 B# S2 |# f1 {* g
  85. {
    5 p( |4 b+ K7 V9 d1 d
  86.     HFONT h; // [esp+4h] [ebp-8h]
    : I5 v% `( a$ n
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]
    . o( |/ a" R4 M" |7 h
  88. 8 w; y; u) @; Q1 O
  89. % Q$ c7 K% g2 O" H. g1 L
  90.     __asm pushad;
    ( S( {% w* H# A6 x# u3 v2 T
  91.     FILE* trace = fopen("font_trace.txt", "at");0 R( Y9 T* f( P$ I9 x, F, R
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");
    & V$ w' [$ ?5 |; j8 o( ]  H
  93.     fclose(trace);3 W' |6 M! B! z& ]& d
  94.     __asm popad;
    5 k! w' K& ?" d7 O

  95. ; p* U8 O4 K. E# G/ d
  96.     currentHdc = hdc;7 h& d; i: b7 \7 ~: q/ N
  97.     iCharSet = 1;
    " H  d% ~5 l/ `" f* n0 w6 m
  98.     GLuint base = glGenLists(256);. e" X% i9 _9 E8 ]9 ^1 W
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
    2 b4 @8 c) u& R6 X8 c; z& U' N7 I
  100.     //if (!h)
    , ?/ Z2 X- Y( y2 O! k3 g5 p
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    ; a  h& \$ Y; \: Z
  102.     SelectObject(hdc, h);6 p1 p0 l# Q1 W8 \" s' d# @
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    8 c7 V& M- A  Z( {9 R3 a
  104. }
    / u; }5 s/ [$ P3 g2 j% r( U% o

  105. ! [% L( @) b1 w& {- ?* l  Z
  106. void __cdecl
    0 ~# x! \1 ~4 _1 U2 |% Q; L  E# R4 h
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    ! u3 W4 S2 H4 G( P
  108. {
      L' l" b& y6 n4 ^/ k, ]. Y" ^
  109.     __asm pushad;8 S. K5 O$ _# u5 _# o2 _4 D7 m( Y
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    - p1 E: }0 J; m+ d* M4 D
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    ; A0 z" T7 {" f, Y, o
  112.     fclose(trace);* C' ~8 T$ b6 c
  113.     __asm popad;# r4 I$ ^$ t& {3 m) M

  114. & R9 d6 X( x+ ^+ P" h& t: {
  115.     //return a1;
    1 g9 j! E; Z) u3 Z( _& |4 o" {
  116. }$ u$ Y& T5 g; [6 A# d, K/ N( g4 _
  117. ' b) R: ?, k. p7 u
  118. bool
    3 z1 |2 j8 y2 V' [' x! ~- {" ~
  119. ApplyPatchNibiru()% ~% Z4 u+ l* l7 A- V6 c
  120. {6 e9 @) T* r, K( C+ `
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
    0 b# v: \1 X- m) [# Z8 ?
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);: o1 Z( H: E2 I* I" K8 C9 ~' t7 v4 R, o8 N
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    6 ]# e* I  f/ j: i

  124. / m  f+ \( x* b$ d
  125. 2 f8 L' W% b7 k" q4 Y

  126. , V3 W# K/ Y) R" p, N
  127.   return true;0 Z! z6 c' E9 q7 D/ N  ^
  128. }
    & q1 e8 Z- w; |. j1 ]
复制代码

9 ^, u$ H" |5 W! O- M7 B# W# }! ?( r6 }, P  Y; x

5 l# ?  X% W+ @% p1 A. z1 d
' N$ D6 I+ R" T
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 很美好很美好 很差劲很差劲
回复

使用道具 举报

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

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