赞 | 86 |
VIP | 0 |
好人卡 | 1 |
积分 | 136 |
经验 | 14048 |
最后登录 | 2021-1-24 |
在线时间 | 2753 小时 |
Lv4.逐梦者
- 梦石
- 0
- 星屑
- 13562
- 在线时间
- 2753 小时
- 注册时间
- 2014-10-4
- 帖子
- 756
|
本帖最后由 SixRC 于 2018-2-24 15:51 编辑
完成了
老样子 Main 前插入 最好插在最前面 改一下脚本里的字体等信息 Main里改字体就可以了
update 2018.2.24
更新了窗口句柄获取的方式 从内存RGSS储存的地方拿
避免取错句柄的bug 不过还是要重载 没想到好办法 修炼不够
# 请自行修改第 2、3、4 行 以及 Main 中的字体名字 font_file="/Font/美玉体.ttf" font_name="美玉体" dll_name="RGSS103J" unless Font.exist?(font_name) DLL=Win32API.new('kernel32','GetModuleHandle','p','l').call(dll_name) code = [139,68,36,4,139,128,196,182,18,0,139,64,8,194,16,0].pack('C*') hwnd = Win32API.new('user32.dll','CallWindowProc','pllll','l').call(code,DLL,0,0,0) Win32API.new('kernel32','WriteProcessMemory','llpll','l').call(-1,DLL+0xAC25,"\x90"*5,5,0) RGSSGameMain=Win32API.new(dll_name,'RGSSGameMain','lpp','l') path=Dir.pwd+font_file MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l') len=MultiByteToWideChar.call(0xFDE9,0,path,-1,0,0) path2="\0"*len*4 MultiByteToWideChar.call(0xFDE9,0,path,-1,path2,len) Win32API.new('gdi32','AddFontResourceW','p','l').call(path2) RGSSGameMain.call(hwnd,"Data/Scripts.rxdata","") end
# 请自行修改第 2、3、4 行 以及 Main 中的字体名字
font_file="/Font/美玉体.ttf"
font_name="美玉体"
dll_name="RGSS103J"
unless Font.exist?(font_name)
DLL=Win32API.new('kernel32','GetModuleHandle','p','l').call(dll_name)
code = [139,68,36,4,139,128,196,182,18,0,139,64,8,194,16,0].pack('C*')
hwnd = Win32API.new('user32.dll','CallWindowProc','pllll','l').call(code,DLL,0,0,0)
Win32API.new('kernel32','WriteProcessMemory','llpll','l').call(-1,DLL+0xAC25,"\x90"*5,5,0)
RGSSGameMain=Win32API.new(dll_name,'RGSSGameMain','lpp','l')
path=Dir.pwd+font_file
MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
len=MultiByteToWideChar.call(0xFDE9,0,path,-1,0,0)
path2="\0"*len*4
MultiByteToWideChar.call(0xFDE9,0,path,-1,path2,len)
Win32API.new('gdi32','AddFontResourceW','p','l').call(path2)
RGSSGameMain.call(hwnd,"Data/Scripts.rxdata","")
end
然后一些闲话
确实 AddFontResource 后不能直接读取字体 得下一次运行 exe 才行
是因为 RGSS 在开始的时候载入了字体列表 (EnumFontFamiliesEx)
这个东西不会在之后刷新 他觉得有就是有没有就是没有除非重载 RGSS
那就重载 RGSS 嘛!
不过直接重载的话 会多一个控制线程
一个副作用就是 10s hangup 变成了 5s 因为两个控制线程一起计数
所以重载前把创建线程的函数 nop 掉
大概 就没什么问题了?
而重载的时候 RGSSGameMain 的一个参数是加密档案地址
不过因为第一次载入的时候进行了处理 所以重载的时候直接传入空字符就可以
RMVA @Lemax
虽然载入字体资源后 Font.exist?(xxx) 总是显示 false
但实际上显示的时候是正确载入的 所以单纯载入即可
倒是 1.9 版本的 ruby 的 Dir.pwd 的编码很.. 不能直接转成 utf-8 转了也不正确..
代码
因为我下的是日文版..我不清楚有什么细节不同
可能要在 Main 里面修改默认字体
# 请自行修改 2、3 行 font_file="/Font/美玉体.ttf" font_name="美玉体" unless Font.exist?(font_name) GetCurrentDirectory=Win32API.new('kernel32','GetCurrentDirectoryW','lp','l') MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l') len=GetCurrentDirectory.call(0,"") buf="\0"*(len-1)*2 GetCurrentDirectory.call(len,buf) len=MultiByteToWideChar.call(0xFDE9,0,font_file,-1,0,0) fa="\0"*len*2 MultiByteToWideChar.call(0xFDE9,0,font_file,-1,fa,len) path=buf+fa Win32API.new('gdi32','AddFontResourceW','p','l').call(path) end Font.default_name=font_name
# 请自行修改 2、3 行
font_file="/Font/美玉体.ttf"
font_name="美玉体"
unless Font.exist?(font_name)
GetCurrentDirectory=Win32API.new('kernel32','GetCurrentDirectoryW','lp','l')
MultiByteToWideChar=Win32API.new('kernel32','MultiByteToWideChar','llplpl','l')
len=GetCurrentDirectory.call(0,"")
buf="\0"*(len-1)*2
GetCurrentDirectory.call(len,buf)
len=MultiByteToWideChar.call(0xFDE9,0,font_file,-1,0,0)
fa="\0"*len*2
MultiByteToWideChar.call(0xFDE9,0,font_file,-1,fa,len)
path=buf+fa
Win32API.new('gdi32','AddFontResourceW','p','l').call(path)
end
Font.default_name=font_name
|
评分
-
查看全部评分
|