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

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

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

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

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

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

本帖最后由 shane007 于 2023-9-6 11:03 编辑
/ Y& N' l8 k5 M& D6 D* _* p: |" A# q$ K6 k+ U. S7 q3 b; V
(nibiru.exe 772 KB (790,528 字节))
8 F* c6 _* P0 u0 C2 w) b0 W! s  j" k  G
将sub_451390,sub_451599 这2个显示函数进行了hook.3 J$ ~2 Q' F0 p) h( o0 _
确认这2个显示函数都被调用了。: _# }: e  M, Z/ `* u
第1个可能显示的是调试字符串,第2个显示游戏字幕。, ^; S  Z3 L6 V# D! F1 A
& S6 P# j( Q3 w+ A
以下这句是出错的,注释之后,程序可以正常运行,但字符不再输出。
, G3 g% H. y' x3 g* Q& ?$ d6 ~0 ?' j7 O7 l9 `2 B
    //v12 这里出错+ `8 R4 i) V; H; z; x# K
    //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);
  D$ b4 N" m5 }4 D7 h* \# X( D# v) P/ u" x' p8 C4 J
输出的log为如下这样,可以推测,游戏在每帧都将font渲染一次。
8 A9 `, x2 R# ]& z3 ?这种方式显然是有问题的,会影响性能。6 Q6 I: K8 u" n# @  C
在汉化的时候,我会考虑字体在初始化的时候只渲染1次,后边多次使用。% G0 o, V9 I5 t, Y1 G7 Z
) x1 ~( c9 e2 u1 f4 r& s. r. E3 {
  1. sub_451390_Font1_hk
    , `( f8 r* ?7 ~6 D
  2. sub_451390_Font1_hk: Q0 c5 {' q: p; J. h: W
  3. sub_451599_Font2_hk
    # x2 T& @. U! _/ K
  4. sub_451390_Font1_hk
    1 ~2 b0 ]; l1 O# a' f
  5. sub_451599_Font2_hk# s3 [) p( S- n" s* p- `" ^, K, A5 {
  6. sub_451599_Font2_hk% P3 H6 T0 D' r; r- F* {: W) R* K
  7. sub_451599_Font2_hk
    # v! b" g# ?8 b0 E
  8. sub_451599_Font2_hk
    ) B3 z1 z0 m/ x+ a4 L
  9. sub_451599_Font2_hk( k& L* E1 Y/ A( Z" }/ L# O
  10. sub_451599_Font2_hk6 i# H: I( b& H: i( s, S. A
  11. sub_451599_Font2_hk$ `/ A9 V) q+ P: {4 h
  12. sub_451599_Font2_hk
    7 s$ E: M) B6 v, m' p' x
  13. sub_451599_Font2_hk
复制代码
5 k; w7 z# ?+ ]
代码
% a: l6 f/ a. Z" E% R5 O
  1. #include <windows.h>! U5 [$ d( y5 c# R4 g) {
  2. #include <stdio.h>
    - ^  C; ?0 q2 O6 R

  3. 1 N: c% l- U8 V* e! _; A$ J
  4. #include "patch.h"
    5 J( u7 \' v1 P" d% y4 _
  5. #include "patchNibiru.h"
    , I$ {7 ?7 |2 l- P
  6. #include <GL/gl.h>1 d2 o* b, z5 T+ K$ L. V) K4 c

  7. " u; D, Q. e; i3 Z& S; f9 I

  8. 0 o2 `  X  a, d6 s6 K% p( |: k2 a
  9. DWORD SUB_451810 = 0x00451810;( N! C; n' `) ?4 h, @0 h
  10. DWORD SUB_451390 = 0x00451390;
    ; l4 m5 P+ i! Y9 P
  11. DWORD SUB_451599 = 0x00451599;3 ^$ c/ V9 H' S' q

  12.   [8 n8 P4 u- @
  13. HDC currentHdc;
    ; {5 f! h9 q7 N8 |
  14. 8 M% S) E4 l  Y0 d# D& T/ j
  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)/ }# M1 z3 L" T" m. B$ q
  16. {; S: v8 E; X: Q  ^: [% E4 n' `% t) @
  17.     DWORD v10; // [esp-450h] [ebp-450h]
    ! }8 e; Z/ c( ?2 g+ A6 l5 h
  18.     int v11; // [esp-44Ch] [ebp-44Ch]
    , \8 J  i: v8 E, d. Q/ H
  19.     int v12; // [esp-4Ch] [ebp-4Ch]+ F4 v$ M9 t. h
  20.     int v13; // [esp-44h] [ebp-44h]
    " j* H+ d/ \) n8 p. A
  21.     HFONT v14; // [esp-14h] [ebp-14h]3 \4 r8 h7 M3 B- \
  22.     DWORD v15; // [esp-10h] [ebp-10h]
    4 i7 Z1 i9 b9 F  v1 u, [
  23.     int v16; // [esp-Ch] [ebp-Ch]' |( S6 U' H9 J
  24.     int* i; // [esp-8h] [ebp-8h]
    5 k$ P3 }. Y' ~  P

  25. " |8 s' C2 y  x# W* l! t' T4 |
  26.     __asm pushad;
    ' G& x3 u8 W( x) S& |! @8 k" \
  27.     FILE* trace = fopen("font_trace.txt", "at");
    : l! I7 o& q- Y7 @) J. I
  28.     fprintf(trace, "%s\n", "sub_451599_Font2_hk");' K) _' d) d0 t9 i) O& g  C
  29.     fclose(trace);
    + O1 X2 u: l7 J4 Z
  30.     __asm popad;
    7 @; B7 |8 f5 T' u4 A
  31.     $ ?. i+ h* M8 X2 h
  32.     //if (!a9)2 @& Z7 u4 z  s7 J6 W* d
  33.     //{. t+ l& R& S3 p- x9 x7 `
  34.     //    AddFontResourceA(lpFileName);
    & n6 {' u% g7 M& F
  35.     //    for (i = &v11; *(_BYTE*)i && *(_BYTE*)i != 46; i = (int*)((char*)i + 1))
    ' [2 z2 x  @( z# r6 W
  36.     //        ;
    ' _; [0 A( V! q
  37.     //    *(_BYTE*)i = 0;/ k2 D3 A* g/ S7 y! I
  38.     //}/ e, t+ ^" W& H! d% t& r4 k/ `# g
  39.     //if (a4 == 1)
    ; d8 @  c4 \+ M8 q1 b5 M$ C% \0 v( b
  40.     //{5 c; o- o6 z% ~$ |( g5 v+ k; a! G, X
  41.     //    v16 = 100;8 `2 u! J8 W) j# e5 c' @! h
  42.     //}: t! ]9 }8 q1 D5 z0 J: U" J! h) g
  43.     //else if (a4 == 4)
    5 u& c$ B2 l* s. r9 K
  44.     //{
    / p7 m6 s8 b) v- E, Y
  45.     //    v16 = 700;6 N& u2 u. v: a8 r- u
  46.     //}
    6 R) n9 V8 |* K0 d: Y4 W
  47.     //else
    0 \) n0 p3 l- {  s6 E9 X  O& G. K
  48.     //{
    7 v' k7 D" e, j- I) A
  49.     //    v16 = 400;
    4 T2 {- {& @4 `4 u7 [
  50.     //}
    9 @, ~& a' N# ~  H' q
  51.     v10 = 1;
    2 ~, s% T( {1 Y/ \- Z9 ^! D" B2 t0 H
  52.     //switch (dword_4AA490)2 w+ x& Z# b( R  c/ g
  53.     //{
    . o' G% o+ Q" ]/ [7 O
  54.     //case 1250:
    3 \+ V. A: O6 @) R; N, p3 i# p* E' F
  55.     //    v10 = 238;" b7 a0 R* l3 d7 ]
  56.     //    break;3 _. D0 q; O  d9 v
  57.     //case 1251:$ l/ V$ @5 \( l: A8 X4 _; u
  58.     //    v10 = 204;
    * R, d' M& u9 d- J" c
  59.     //    break;
    $ l8 \! a' k( c' N; N
  60.     //case 1252:
    / f) R5 t0 O5 ?# _, U6 [1 Z
  61.     //    v10 = 0;! ~. C7 p7 W1 g
  62.     //    break;
    1 c  I. |. p! l. K
  63.     //}! J3 v6 O$ F) `
  64.     v15 = glGenLists(256);
    & S0 v. X4 g8 j( r( g' `* Q
  65.     v14 = CreateFontA(-*(DWORD*)a2, 0, 0, 0, v16, a5 != 0, a6 != 0, a7 != 0, v10, 4u, 0, 4u, 0, "Arial");$ }5 F6 c% S4 X" a
  66.     //if (!v14): ]% D% N( E8 h$ D7 |& o
  67.     //    MessageBoxA(0, MEMORY[0x4B3540], MEMORY[0x4B3534], 0);5 L9 I# Z- z  y  k3 P) `
  68.     //HDC hdc = GetDC(NULL); // 获取当前设备上下文; & o) M- S  |0 }& Q& F9 X% b
  69.     SelectObject(currentHdc, v14);/ S: K- A2 [8 N/ Y, p4 t9 {
  70.     GetCharWidthA(currentHdc, 0, 0xFFu, lpBuffer);
    / ~& W- M# Y9 y9 i6 B1 j0 {

  71. : r! \) r# B8 z# W. K0 F
  72.     //v12 这次出错# o1 g  s+ v9 q
  73.     //GetTextMetricsA(currentHdc, (LPTEXTMETRICA)&v12);* L! I" j; \( z6 C* x  A3 Q
  74.    
    ' G* U" ~4 ^5 _' `. {1 m' a) L
  75.     //*(_DWORD*)a2 = v12;
      z" M2 |% ^0 W3 @- ?. N, X
  76.     //*(_DWORD*)a3 = v13;
    , t% }( o, W( B
  77.     wglUseFontBitmapsA(currentHdc, 0, 0x100u, v15);
    2 Y0 n) t' H- z
  78.     //if (!a9)
    % W2 z2 h2 y) R  w* x" n
  79.     //    RemoveFontResourceA(lpFileName);( t7 j1 X* u( e& [
  80.     return v15;
    3 G7 S% i* }& S. X" R
  81. }
    ( O: X; H/ I8 B* s

  82. ; H, C" v1 I# w
  83. //使用到
    0 ^/ D" {9 x; T5 n2 R$ V6 X
  84. BOOL __cdecl sub_451390_Font1_hk(HDC hdc)
    9 p  _0 d7 `8 S
  85. {6 }; v; q1 i. q
  86.     HFONT h; // [esp+4h] [ebp-8h]
    4 Z7 u$ _4 R7 T( @3 N0 b% N9 z
  87.     DWORD iCharSet; // [esp+8h] [ebp-4h]
    0 q- Y1 ^  H( A1 C# x; p8 P

  88. " Q: {# q+ A7 \' ^# v# _

  89. 8 ?' B3 @4 ]& `+ e- t
  90.     __asm pushad;
    / }0 A3 u- x& Q/ i# s& r; }
  91.     FILE* trace = fopen("font_trace.txt", "at");
    0 [5 t" P5 X9 E+ [. Z
  92.     fprintf(trace, "%s\n","sub_451390_Font1_hk");5 x" B, q$ w) f$ F  D
  93.     fclose(trace);7 s1 [6 m8 I" `  F2 f! [9 j' G
  94.     __asm popad;* x. i5 i& j3 n) V

  95. , c5 v# T0 D, W5 ~0 B
  96.     currentHdc = hdc;
    3 ~+ o9 j% i0 O
  97.     iCharSet = 1;3 }0 W4 j* {. Z; l8 O; |2 j* ]
  98.     GLuint base = glGenLists(256);
    4 L  M. q% R) d. E& U/ ~& Y; u
  99.     h = CreateFontA(-14, 8, 0, 0, 700, 0, 0, 0, iCharSet, 4u, 0, 4u, 0, "Arial");. V0 m1 ~# [" c4 C: x# Y3 {  R
  100.     //if (!h); i. |. q  |% Z5 z' Q. J
  101.     //    MessageBoxA(0, aCannotCreateFo, aBuildfont, 0);; x( a, A4 `; F% m  d4 C
  102.     SelectObject(hdc, h);
    + O  W0 R/ f: L/ c
  103.     return wglUseFontBitmapsA(hdc, 0, 0x100u, base);
    ( v+ P# K* @- O* O# R8 e
  104. }8 J" ^( D7 }# K

  105. 7 r: L" U# c5 Y
  106. void __cdecl( E/ u0 L& D5 f( t9 |3 K
  107. sub_451810_drawstr_hk(int x, int y, int a3, int a4, int a5, int a6, char* str, ...)
    8 m3 |9 H5 R8 M7 C( |
  108. {
    0 q. C  I% d0 {5 e! F: V  S/ j9 m$ O
  109.     __asm pushad;
    ) H7 Z, |4 ^! j6 \
  110.     FILE* trace = fopen("sub_trace.txt", "at");
    - Y5 K5 j) _3 L! i
  111.     fprintf(trace, "%d,%d,%d,%d,%d,%d,%s\n", x ,y , a3, a4, a5, a6, str);
    2 X% D; m" \# L6 \
  112.     fclose(trace);* d, X4 Y' [8 z6 U/ E
  113.     __asm popad;3 d- t9 D, e, f' R/ H

  114. 7 ~( H2 o7 [3 I1 U; ~# g9 o6 h. R
  115.     //return a1;) `& @# P& d$ O9 V  c
  116. }1 v7 [" {: e  e2 I* J( k2 F

  117. & d7 C$ W% x! E
  118. bool
    / y( C9 s; ~/ Q) a% s' E& T0 v
  119. ApplyPatchNibiru()
    . q) e% o) b; W5 Y) h
  120. {
    $ f' g, R/ N1 |+ }3 u. u0 N. S
  121.     //JmpPatch ((void *)sub_451810_drawstr_hk, SUB_451810);
    " P9 I3 ~! n: ?$ a: E+ q2 y. M
  122.     JmpPatch((void*)sub_451390_Font1_hk, SUB_451390);
    6 k9 A, J, G8 A5 u- D# t
  123.     JmpPatch((void*)sub_451599_Font2_hk, SUB_451599);
      l# C! P: o0 x" s9 l

  124. 1 w' G7 m" M; B+ |# N" @
  125. 1 G6 ^5 l0 j0 i6 q5 y( R7 v

  126. 8 B* l& W$ b! t# w' }
  127.   return true;
    * a! [( C# t6 \0 B  J3 y) O9 J
  128. }9 ]: r/ V, A! C+ Q" B
复制代码

. H% d, Z3 L, c/ J
4 j! n* |0 N* L1 M0 j; ^) N+ D: V1 x

' l; f7 t& b$ q0 `- A
分享到:  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日,是全球华人共同的冒险解谜类游戏家园。我们致力于提供各类冒险游戏资讯供大家学习交流。本站所有资源均不用于商业用途。

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