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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑 & ~6 [, |# q) o# `2 ^
. c; z8 g) m% Y; Z9 d* N4 d/ o
(nibiru.exe 772 KB (790,528 字节))& Z/ ]& y9 ~2 f1 q$ k
7 z+ `, l" R3 y' }6 x) X$ B7 q* d
将sub_451390,sub_451599 这2个显示函数进行了hook." i& I0 ]0 C% \% l; {& y& _
确认这2个显示函数都被调用了。5 c1 Y! c5 _  A0 Z
第1个可能显示的是调试字符串,第2个显示游戏字幕。2 r; @/ \0 X8 N' v7 U" o  R1 _) n
; f/ ~6 q: Z1 g+ q" K
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
# s( j1 D  H* k8 `$ u- p1 H* B- Z/ ]7 F  t8 t7 G
    //v12 这里出错: b0 R. x4 i# F; L$ r
    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
8 d) u) |; L5 H1 o% U; ^  I5 l5 ~+ s9 Q4 M
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。! \0 m0 m5 T7 G
这种方式显然是有问题的,会影响性能。# R* G3 h; V9 ^
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。- m+ Y, b0 A. y& |

" J$ C7 o2 ^# J! e! P- ^1 I. ]
  1. sub_451390_Font1_hk: _9 \9 n. x+ E. q* F3 [
  2. sub_451390_Font1_hk' I) S3 [7 i- Q  K* W# b
  3. sub_451599_Font2_hk7 Z9 k6 X, G9 P1 R7 V* V
  4. sub_451390_Font1_hk1 ~3 ?5 m  h) o7 ?6 M
  5. sub_451599_Font2_hk
    & A9 L1 X: g; y0 e; [; a
  6. sub_451599_Font2_hk
    " n- U! Y' m: z8 k+ y, n  [- Y- e' j! I
  7. sub_451599_Font2_hk6 O- t  G; C2 u8 O' ?
  8. sub_451599_Font2_hk
    . ~7 @# ?) A3 q7 Z+ k
  9. sub_451599_Font2_hk% ^4 ]+ ~1 @4 y' o+ ]0 U
  10. sub_451599_Font2_hk
    & H2 P' R* _8 O( w" @* Y
  11. sub_451599_Font2_hk4 M2 W+ D- F/ {6 V9 m
  12. sub_451599_Font2_hk, {  h3 f$ _/ ]; n' c
  13. sub_451599_Font2_hk
复制代码
1 p$ W( D+ \' s8 _  N% [3 B
代码
8 L0 u" Y& {  Z8 e
  1. #include <windows.h>  o( T- P3 A' S
  2. #include <stdio.h>3 v9 l1 v+ O9 S! Z8 }

  3.   `% ]7 |$ S/ O+ w6 O: Y& [
  4. #include "patch.h"0 _  r/ ]! |; \# L2 j9 c
  5. #include "patchNibiru.h"
    4 b8 H6 h) B- z+ r4 e) C9 X
  6. #include <GL/gl.h>( m: g. g: `# Z1 T0 ?+ ]

  7. & R/ c6 X$ _: D3 A

  8. $ `0 R$ b0 ]2 F+ x( x# `; T
  9. DWORD SUB_451810 = 0x00451810;+ _. `3 E- {' c" o
  10. DWORD SUB_451390 = 0x00451390;! b7 g" N" k. O9 J- r/ t+ O
  11. DWORD SUB_451599 = 0x00451599;* d* X9 u* @/ i0 a
  12. % a% [! v7 R4 }. _, Q
  13. HDC currentHdc;9 Z/ R0 x6 V2 }2 D

  14. % ?2 S' Z) s( w
  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)# s% H" H" `7 d* f. g
  16. {
    * x8 D5 ], t! m7 o- T8 K
  17.     DWORD v10; // [esp-450h] [ebp-450h]8 v+ Y+ z0 X# o; J- R
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    % \7 w# O) q; }6 g
  19.     int v12; // [esp-4Ch] [ebp-4Ch]0 \9 z) H2 T6 q# G) d0 G5 B
  20.     int v13; // [esp-44h] [ebp-44h]
    $ k% h4 W# A/ v3 _% x
  21.     HFONT v14; // [esp-14h] [ebp-14h]
    % o1 n3 Z- b0 z. v- \# [
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    ! s  m1 E- e% q8 ~
  23.     int v16; // [esp-Ch] [ebp-Ch]/ U( J- ^$ Q/ B6 ~
  24.     int* i; // [esp-8h] [ebp-8h]" `" N, Z' k1 i; t
  25. 4 ~; [1 J' X' d& Y) D
  26.     __asm pushad;* f. V  ?: A, R- y. `6 q
  27.     FILE* trace = fopen("font_trace.txt", "at");% {! x' Q! n' q* S+ b
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");
    5 Y4 C* L! B' E/ d/ k
  29.     fclose(trace);
    . s; t+ P, Z* ?+ B+ f- ^2 Z/ L
  30.     __asm popad;! M1 L3 a8 B3 W- K
  31.    
    ( t) }( z+ s& a
  32.     //if (!a9)
    2 Y" B4 ]' A8 N) L* [' p) N
  33.     //{7 L, w, v) Z, p5 a" S( Z
  34.     //    AddFontResourceA(lpFileName);$ N+ ?5 B* P$ [6 \
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    " q: @& i7 N/ c+ q6 G' t8 E
  36.     //        ;
    " e% e3 v( p  i$ m, S+ j- Y5 o% m
  37.     //    *(_BYTE*)i = 0;/ R; y5 U6 M7 h
  38.     //}
    / ~; ]" S5 z8 w
  39.     //if (a4 == 1)" Y9 {( q1 Y' {& a7 U2 e$ w2 @
  40.     //{3 N1 L6 E* h( \9 o& x
  41.     //    v16 = 100;
    & f  x7 n) F$ j/ z0 L+ _* ~
  42.     //}
    0 G5 u5 N1 }% b% ^" Y% e+ a/ W
  43.     //else if (a4 == 4)! ~  \1 T7 \6 O3 v* m5 o
  44.     //{& D* k4 \5 `. X3 q5 `7 m
  45.     //    v16 = 700;! W) P( F# P( {" {* F
  46.     //}- _  ~" w/ |: u$ a7 l. i% W1 R
  47.     //else. `7 q5 _& [1 w! ~' A- F' y* ]9 A
  48.     //{
    / p  H: q6 W- Y* G: a! d/ Y' v8 T* K$ b
  49.     //    v16 = 400;9 I. B9 C# v3 b1 w$ q$ w  ~
  50.     //}
    - m& `. E& T" _  b
  51.     v10 = 1;7 r! F' `4 N& L- O! Y! L7 B
  52.     //switch (dword_4AA490)
    9 p3 }# q  W' F, T
  53.     //{
    6 O3 x7 Q7 C* g2 Z6 W& O" V
  54.     //case 1250:$ B- {) l+ A" Y( F3 w% Z
  55.     //    v10 = 238;
    $ c# `8 ~, Z1 u+ T
  56.     //    break;$ x* C! v* U. s/ B6 `# l3 _6 e
  57.     //case 1251:
    0 {6 J2 t0 ?8 n* T; X9 o/ p( @: J
  58.     //    v10 = 204;
    + b( r6 Z+ \. y! v$ @, d
  59.     //    break;
    5 E: N* |2 B! y( n/ D' D5 m
  60.     //case 1252:
    " z) H: R% s6 x! r' x& i( {- L
  61.     //    v10 = 0;8 M& a: U5 _" x! O) {! k& `
  62.     //    break;
    2 _+ {  {, ]5 o4 t- P8 `
  63.     //}
    ) s+ C! E- s2 Y- E
  64.     v15 = glGenLists(256);, r, M' U) T" R9 A4 q5 \9 g
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");
    6 K) R2 B. X7 Z8 ]! _$ P# K
  66.     //if (!v14)0 p7 S9 d% @  d
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);5 S9 i) |6 e3 m: m3 B" `
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; ; m& p8 C& `; F
  69.     SelectObject(currentHdc, v14);7 C5 G7 d1 A+ `) B2 F' M
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);  C9 K6 n1 u* ]' U# r+ y

  71. 5 ]* ?, F% G. O- ?* Q
  72.     //v12 这次出错
    1 t! ^( z6 e8 Q6 k+ H) D$ h4 K
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);$ T# W, l4 |1 x! p
  74.     1 e6 A$ e0 {1 b/ h
  75.     //*(_DWORD*)a2 = v12;
    8 [- ^0 x; j6 W' |0 g& T' u
  76.     //*(_DWORD*)a3 = v13;; d3 Y% o0 _2 ~' U
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    * B& k9 [) t9 G" E
  78.     //if (!a9)
    " M$ V5 O/ n# g( C8 h- C1 m
  79.     //    RemoveFontResourceA(lpFileName);
    / _; J3 S6 Q% H/ P9 [( O; R
  80.     return v15;
    % W3 i/ @3 k, ]/ a9 B! [5 G
  81. }
    7 x# y; u& T& m1 d0 o/ e

  82.   ?$ K' R' v- ~3 k. E
  83. //使用到
    # q% z: D  ]4 V1 T! o
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)' w! r! D! A  N3 u2 {# K
  85. {; O- F+ m9 J& _
  86.     HFONT h; // [esp+4h] [ebp-8h]: X5 J! F1 `  H* M, [4 _8 c# a& l" O* M# i
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]
      R/ F- ?/ Y) t2 S, N
  88. # u3 V% i, Y/ @- ^. p2 P
  89. 9 F/ \' {3 \- D) t$ c8 e7 W0 D) C
  90.     __asm pushad;1 ?# `; i% u  x1 G
  91.     FILE* trace = fopen("font_trace.txt", "at");
    6 p; u. m. c4 ^3 `" X* `) a" n
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");- E  I/ M% r% q: G& f$ V
  93.     fclose(trace);# p/ q9 O- b3 F% V; n6 K
  94.     __asm popad;
    8 E" K& j/ O7 }& Y2 j* T5 _5 L% o" u

  95. / h' {3 `2 {) s' }1 g4 J
  96.     currentHdc = hdc;
    4 z# k6 }0 [! Z/ ~0 ?- J; T
  97.     iCharSet = 1;
    # e' ~# y% `7 I
  98.     GLuint base = glGenLists(256);
    . M3 l. ]& F# B5 Q$ {  H! w  B
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");
    2 E1 ^4 C8 R; k( ]2 q6 Z# h
  100.     //if (!h)+ E- h- f- S) N- F' C. Q  \
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);
    6 `9 h2 J/ {( ~6 w* K
  102.     SelectObject(hdc, h);
    6 R3 ?8 L8 _! F) X
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);% N1 E$ s/ g, a" s3 A; ~- p; J
  104. }0 t% _7 L% x8 s/ {$ u) r

  105. 4 I: R* s% L0 `% A( B1 D
  106. void __cdecl. C; n/ c% y. T- D
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    ) |- b2 L. G) L% L9 i3 Q; [. f
  108. {+ G; h; x0 N- Q# O" k+ b' K/ }) X
  109.     __asm pushad;
    / d( C6 U! M7 P0 [7 \% A' ^
  110.     FILE* trace = fopen("sub_trace.txt", "at");) ^% }6 x/ b- T+ o! u
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);- V/ `/ Y% \5 m  w2 n" b2 e
  112.     fclose(trace);# q( v% i  q2 a) R2 `- _0 b) k
  113.     __asm popad;
    . M, H$ K( `/ i

  114. 4 C& J3 u' p* e; \4 Q2 y
  115.     //return a1;8 I! V8 @+ I4 {/ D/ z  z( z. P( l2 U
  116. }6 D+ L& A3 K- s* ?* ^

  117. ! s+ k1 f" r$ x$ K# b- [, Y& T& F
  118. bool
    3 x' x' \0 b& P6 r
  119. ApplyPatchNibiru()
    ( ^* D8 C4 u0 {, [
  120. {) Q2 D* z$ g9 h! l# D) ~1 A
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);: c1 W$ l& X% q$ _! g, d/ f1 s
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);8 F. v- z: V9 b6 c, Z
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
    ) `7 p) E# a5 O9 C( A2 U# u  T

  124. : F& S+ }/ j% E# e- f: d
  125. - G% ^8 T0 H! \7 u/ ~, Y, a  Z  U! w

  126. . ?' k. S$ E  ^; K2 J8 I6 y# N
  127.   return true;
    1 |7 s) D# t9 H/ E& |" A/ H
  128. }( v& j( n2 G; U* W
复制代码
3 j$ D9 n& D/ f/ g+ i3 ?

8 E/ `% E# `7 I* @8 @3 v! z
' f0 l4 z5 i7 h# `) X8 A
# e# c8 j% P# s* V, n
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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