Project1

标题: ACE分辨率内存补丁(免DLL修改)感谢小黄鸡(: [打印本页]

作者: 灼眼的夏娜    时间: 2012-2-14 22:07
标题: ACE分辨率内存补丁(免DLL修改)感谢小黄鸡(:
本帖最后由 灼眼的夏娜 于 2012-2-15 20:43 编辑

更新,调整reset方式。(修正过渡问题

RUBY 代码复制
  1. #encoding:utf-8
  2. #==============================================================================
  3. # ■ String
  4. #------------------------------------------------------------------------------
  5. #  String 类追加定义。
  6. #==============================================================================
  7.  
  8. class String
  9.   #----------------------------------------------------------------------------
  10.   # ● API
  11.   #----------------------------------------------------------------------------
  12.   @@MultiByteToWideChar  = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  13.   @@WideCharToMultiByte  = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  14.   #----------------------------------------------------------------------------
  15.   # ● UTF-8 转 Unicode
  16.   #----------------------------------------------------------------------------
  17.   def u2w
  18.     i = @@MultiByteToWideChar.call(65001, 0 , self, -1, nil,0)
  19.     buffer = "\0" * (i*2)
  20.     @@MultiByteToWideChar.call(65001, 0 , self, -1, buffer, i)
  21.     buffer.chop!
  22.     return buffer
  23.   end  
  24.   #----------------------------------------------------------------------------
  25.   # ● UTF-8 转系统编码
  26.   #----------------------------------------------------------------------------
  27.   def u2s
  28.     i = @@MultiByteToWideChar.call(65001, 0 , self, -1, nil,0)
  29.     buffer = "\0" * (i*2)
  30.     @@MultiByteToWideChar.call(65001, 0 , self, -1, buffer, i)
  31.     i = @@WideCharToMultiByte.call(0, 0, buffer, -1, nil, 0, nil, nil)
  32.     result = "\0" * i
  33.     @@WideCharToMultiByte.call(0, 0, buffer, -1, result, i, nil, nil)
  34.     result.chop!
  35.     return result
  36.   end
  37.   #----------------------------------------------------------------------------
  38.   # ● 系统编码转 UTF-8
  39.   #----------------------------------------------------------------------------
  40.   def s2u
  41.     i = @@MultiByteToWideChar.call(0, 0, self, -1, nil, 0)
  42.     buffer = "\0" * (i*2)
  43.     @@MultiByteToWideChar.call(0, 0, self, -1, buffer, buffer.size / 2)
  44.     i = @@WideCharToMultiByte.call(65001, 0, buffer, -1, nil, 0, nil, nil)
  45.     result = "\0" * i
  46.     @@WideCharToMultiByte.call(65001, 0, buffer, -1, result, result.size, nil, nil)
  47.     result.chop!
  48.     return result
  49.   end
  50. end
  51.  
  52. #==============================================================================
  53. # ■ AceResolutionMemoryPatch
  54. #------------------------------------------------------------------------------
  55. #  用于调整RMACE分辨率的内存补丁脚本,免修改DLL。
  56. #
  57. #   by 灼眼的夏娜(感谢fux2君提供内存地址)
  58. #==============================================================================
  59. # 更多脚本请转到 [url]www.66rpg.com[/url]。
  60. #==============================================================================
  61. module AceResolutionMemoryPatch
  62.  
  63.   GetModuleFileName       = Win32API.new("kernel32", "GetModuleFileName", "lpl", "l")
  64.   GetPrivateProfileString = Win32API.new("kernel32", "GetPrivateProfileString", "pppplp", "l")
  65.   GetModuleHandle         = Win32API.new("kernel32", "GetModuleHandle", "p", "l")
  66.   RtlMoveMemory           = Win32API.new("kernel32", "RtlMoveMemory", "pli", "v")
  67.   RtlMoveMemoryLP         = Win32API.new("kernel32", "RtlMoveMemory", "lpi", "v")
  68.   VirtualProtect          = Win32API.new("kernel32", "VirtualProtect", "lllp", "i")
  69.   FindWindow              = Win32API.new("user32", "FindWindow", "pp", "l")
  70.  
  71.   module_function
  72.  
  73.   def patch(width = 800, height = 600)
  74.     # 获取句柄
  75.     path = 0.chr * 256
  76.     return false if 0 == GetModuleFileName.call(0, path, path.size)
  77.     path = path.s2u.gsub!(/.exe/ ,".ini").u2s
  78.     buff = 0.chr * 256
  79.     return false if 0 == GetPrivateProfileString.call("Game", "Library", nil, buff, buff.size, path)
  80.     buff.delete!("\0")
  81.     rgsshandle = GetModuleHandle.call(buff)
  82.     # 获取标题名和脚本名字
  83.     title = 0.chr * 256
  84.     return false if 0 == GetPrivateProfileString.call("Game", "Title", nil, title, title.size, path)
  85.     title = title.s2u.delete("\0").u2s
  86.     scripts = 0.chr * 256
  87.     return false if 0 == GetPrivateProfileString.call("Game", "Scripts", nil, scripts, scripts.size, path)
  88.     scripts = scripts.s2u.delete("\0").u2w
  89.     # 地址表
  90.     addr =
  91.     {
  92.       # 直接宽度替换
  93.       :w0 => [0x000016EE, 0x000020F6, 0x000020FF, 0x0010DFED, 0x0010E025, 0x0010E059, 0x0010E08D, 0x000019AA, 0x00001A5B, 0x0001C528, 0x0001F49C, 0x0010E7E7, 0x0010EFE9],
  94.       # 直接高度替换
  95.       :h0 => [0x000016E9, 0x00002106, 0x0000210F, 0x0010DFE8, 0x0010E020, 0x0010E054, 0x0010E088, 0x000019A5, 0x00001A56, 0x0001C523, 0x0001F497, 0x0010E803, 0x0010EFF9],
  96.  
  97.       # 宽度+32
  98.       :w1 => [0x000213E4],
  99.       # 高度+32
  100.       :h1 => [0x000213DF],
  101.  
  102.       # 最大宽度/32+1
  103.       :w2 => [0x00021FE1],
  104.       # 最大高度/32+1
  105.       :h2 => [0x00021F5D]
  106.     }
  107.     # 更新
  108.     w0 = [width].pack("L")
  109.     addr[:w0].each{|ofs| return false if !write_memory(rgsshandle + ofs, w0)}
  110.     h0 = [height].pack("L")
  111.     addr[:h0].each{|ofs| return false if !write_memory(rgsshandle + ofs, h0)}
  112.     w1 = [width + 32].pack("L")
  113.     addr[:w1].each{|ofs| return false if !write_memory(rgsshandle + ofs, w1)}
  114.     h1 = [height + 32].pack("L")
  115.     addr[:h1].each{|ofs| return false if !write_memory(rgsshandle + ofs, h1)}
  116.     w2 = [width / 32 + 1].pack("C")
  117.     addr[:w2].each{|ofs| return false if !write_memory(rgsshandle + ofs, w2)}
  118.     h2 = [height / 32 + 1].pack("C")
  119.     addr[:h2].each{|ofs| return false if !write_memory(rgsshandle + ofs, h2)}
  120.     # 重启
  121.     rgssgamemain = Win32API.new(buff, "RGSSGameMain", "ipp", "v")
  122.     rgssgamemain.call(FindWindow.call("RGSS Player", title), scripts, "")
  123.     # 补丁成功
  124.     return true
  125.   end
  126.  
  127.   def write_memory(addr, str)
  128.     old = 0.chr * 4
  129.     return false if 0 == VirtualProtect.call(addr, str.size, 0x40, old)
  130.     RtlMoveMemoryLP.call(addr, str, str.size)
  131.     return false if 0 == VirtualProtect.call(addr, str.size, old.unpack("L").first, old)
  132.     return true
  133.   end
  134.   private_class_method :write_memory
  135.  
  136.   def read_byte(addr)
  137.     dst = 0.chr * 1
  138.     RtlMoveMemory.call(dst, addr, dst.size)
  139.     return dst.unpack("C").first
  140.   end
  141.   private_class_method :read_byte
  142.  
  143.   def read_dword(addr)
  144.     dst = 0.chr * 4
  145.     RtlMoveMemory.call(dst, addr, dst.size)
  146.     return dst.unpack("L").first
  147.   end
  148.   private_class_method :read_dword
  149.  
  150. end
  151.  
  152. unless $ace_patched
  153.   $ace_patched = true
  154.   raise "应用分辨率补丁失败!" unless AceResolutionMemoryPatch.patch
  155.   #raise RGSSReset.new
  156. end
  157.  
  158. Graphics.resize_screen(800, 600)

作者: hide秀    时间: 2012-2-14 22:09

作者: 凌童鞋    时间: 2012-2-14 22:54
纯粹来膜拜夏娜大人的凌飘过~
(郁闷,当纯水扣吧,郁闷的是水区活动发经验到手软,我却一分拿不到……)
作者: 各种压力的猫君    时间: 2012-2-14 23:08
万能的夏娜大出现了 _ _
能改完之后直接Dump出来么?
手动改dll计算那几个数值略麻烦 = = b
发布游戏的时候还是希望不要直接对内存操作……
作者: fux2    时间: 2012-2-15 00:32
Shy07 发表于 2012-2-14 23:28
渐变似乎还是锁定了 640×480 = =

囧,哪里漏掉了吗,明早补上。
作者: wbsy8241    时间: 2012-2-15 00:51
本帖最后由 wbsy8241 于 2012-2-15 00:59 编辑



测试系统:XP SP3
1.下面有黑条(非左上角对齐以后:上下位移,左右正常 上下移动后最下格是黑的然后画面滚动)
2.FPS下降明显{640x480=>60FPS, 800x600=>46FPS, 1024x768=>20FPS)}  改DLL的1024x768仍为60FPS
3.无法指定640x480 800x600 1024x768 以外的全屏
作者: fux2    时间: 2012-2-15 01:10
本帖最后由 fux2 于 2012-2-15 01:19 编辑
wbsy8241 发表于 2012-2-15 00:51
测试系统:XP SP3
1.下面有黑条(非左上角对齐以后:上下位移,左右正常 上下移动后最下格是黑的然后画面滚动 ...


32的倍数即可,至于黑边,咱这里没有,目测是因为设置分辨率不能整除32的原因。
作者: wbsy8241    时间: 2012-2-15 01:22
本帖最后由 wbsy8241 于 2012-2-15 01:25 编辑
fux2 发表于 2012-2-15 01:10
32的倍数即可,至于黑边,咱这里没有,目测是因为设置分辨率不能整除32的原因。 ...


地图画够大再移动, 只有我说的那3个分辨率 就算800*480 也是无法全屏
600/32 = 18.75
(是可以进游戏但无法全屏 按ALT+ENTER 画面只是闪几并不会全屏)

作者: fux2    时间: 2012-2-15 07:14
本帖最后由 fux2 于 2012-2-15 07:19 编辑

@Shy07@灼眼的夏娜@wbsy8241
貌似有点问题……
内存地址一个没漏,直接改dll之后一切正常。
目测是第一次载入dll的时候某些东西就已经固定了……
作者: 灼眼的夏娜    时间: 2012-2-15 20:44
过渡问题修正(:
作者: eve592370698    时间: 2012-2-15 20:56
wbsy8241 发表于 2012-2-15 00:51
测试系统:XP SP3
1.下面有黑条(非左上角对齐以后:上下位移,左右正常 上下移动后最下格是黑的然后画面滚动 ...

@癫狂侠客
这个分辨率纯粹用脚本看来FPS下降到很大悲剧了。看样子还是得通过DLL来实现提高GDI的使用以防止超负荷运转。


‘‘

我再来吐口酸水:
对于Ruby语言版本,从网上很多资料查阅,去年曾经有些资料说Ruby语言最稳定版本是1.9.2但不久之后全都修正为1.8.6了。1.9的这个纤程说真的,很绕人,在RGSS3里面可以说隐藏了太多的东西。现在刚好出1.9.3了,目前电脑主流配置都是显卡特别高,有不少显卡启动安全模式直接分辨率1024×768,640×480分辨率甚至都不支持了,eb这个公司面对越来越高的电脑配置,在分辨率上反其道而行之,实在是让我很无语。
夏娜千岁的RGE我看还是等待出3呢。
一直觉得RGE过于盲目追求脚本高手的用户有点走偏了,真正的编程高手直接上C语言,所以我觉得将RGE的高效、限制教少于RGSS的方便快捷结核起来开发能够兼容所有RM 从XP 到VX ACE脚本文件及内部类又没有RGSS太多功能的RGE3我觉得这样一来咱们都可以自己做XP ACE了。我觉得RGE未来应该采用双脚本编辑:使用RM的脚本编程器来面向中低端用户编辑前台“表显”脚本,而后台高级“隐性内部”脚本使用RGE编辑器,面向中高端用户,这样才能让RGE有更好地发展。


──eve592370698于2012-2-15 21:14补充以上内容’’


‘‘

其实柳万岁爷的Xp地图一键转换到Va平台靠原始默认的分辨率已经吃不消了.


──eve592370698于2012-2-16 07:26补充以上内容’’
作者: 杂兵天下    时间: 2012-2-16 12:18
表示黑边问题太严重了

作者: shironeko    时间: 2012-2-17 12:16
本帖最后由 shironeko 于 2012-2-17 12:17 编辑

膜拜夏娜前辈  恐怕这个实际意义要小,因为实际帧数有点低,实际上也可能会出现兼容问题,还是直接改dll(仅改分辨率)来的实在些

作者: eve592370698    时间: 2012-2-17 21:10
标题: 即使扣分我也要伸手回帖
本帖最后由 eve592370698 于 2012-2-17 21:11 编辑
fux2 发表于 2012-2-15 07:14
@Shy07@灼眼的夏娜@wbsy8241
貌似有点问题……
内存地址一个没漏,直接改dll之后一切正常。


将来在webrm上运行RM VX ACE游戏,这种代码能保证游戏顺畅运行吗?表示非常怀疑。

继续吐槽RGE,我看RM XP之后出了RGE,VX之后出了RGE2,我想VA之后也应该出RGE3了吧?
我觉得RGE在电脑上通过RGSS运行RM游戏以及Web上运行RM游戏起到一个中间搭桥的作用。
RGE3最应该加入的新功能,由原先单纯的绿色编辑器发展为一个有着安装、卸载程序以及系统运行库的完整软件体系才行。
从大众需求以及6R互动上,除了丰富的内部类,能够兼容XP、VX以及VA的内部类、游戏数据以及内部函数(例如$DEBUG、VA的控制台)以兼容所有的RM游戏之后,最重要的是增大库存:RPG Maker多平台运行库将RGE运行RM游戏在PC上由原先单纯运行应用程序game.exe变为通过使用IE浏览器、Flash播放器等打开的Web-RGE,这样一来只要用户能用IE顺利打开本地的RM游戏,那么在6R的Web RM平台运行就相对比较容易了。

最后说一下这个代码吧,恐怕现在网页浏览器对安全性都比较重视,这种直接访问内存的代码恐怕没有证书连IE都不能运行,更不用说Firefox浏览器了,不如从开发新的运行平台上入手入手消除这限制呢。
作者: 狂歌天涯    时间: 2012-2-18 01:19
请问楼主 标题画面进入地图过程中过度的黑画面大小没有变化呀,难看,怎么解决呀?
作者: 阿y    时间: 2012-3-14 19:20
有问题,希望楼主改正啊,
1,渐变好像无法更改,
2,地图最下角出现小黑条(移动时)

作者: fux2    时间: 2012-3-14 21:59
阿y 发表于 2012-3-14 19:20
有问题,希望楼主改正啊,
1,渐变好像无法更改,
2,地图最下角出现小黑条(移动时)

渐变我这边用dll测试的没问题,小黑条没看见,倒看见地图下面空出一条,估计是默认脚本问题不是修改问题。
作者: 小阿波    时间: 2012-3-28 11:50
BUbu偶不会啦
作者: 叶子    时间: 2012-4-26 13:01
本帖最后由 叶子 于 2012-4-26 13:19 编辑

由于重启RGSSGameMain是在AceResolutionMemoryPatch.patch()里面,重启后载入的脚本都是在patch()的scope下的,会造成一点小问题,例如对Kernel的方法定义失效
  1. # 这段代码位置在AceResolutionMemoryPatch.patch之后
  2. def a
  3. end
  4. p __method__ # => :patch
  5. a # NameError: undefined local variable or method 'a' for main:Object
复制代码
不知道有什么办法解决呢?目前我是粗暴地把重启RGSSGameMain挪到外面运行
作者: cocoon    时间: 2012-4-27 12:57
我也是 下面出现了黑条,一直挥之不去,求破~
作者: 5439sims2    时间: 2012-5-1 14:40
测试环境:windows8 消费者预览版 x64
测试结果:打开后= =先544x416 之后变成1024x768 最后变成800x600死掉
作者: ypkkjt    时间: 2012-7-25 03:00
不会复制
作者: Innelysion    时间: 2012-9-27 00:08
本帖最后由 Innelysion 于 2012-9-27 00:11 编辑

前两天贴这个脚本进工程后发现个比较严重的问题
最开始发现出bug的弹窗信息如下
undefined method `draw_text' for class `AceResolutionMemoryPatch::Bitmap'
检查出错的地方是个新增脚本中(就是站上有那个中英双默认字体的脚本)
class Bitmap
  alias old_draw_text draw_text <这行
  ……

检查了好多地方后发现只要是贴了此分辨率补丁后alias系统自带class里的东西就会出bug

像是随便加几行脚本
class Sprite
  alias mirror233 mirror
end

就会弹出这样的错误
Script '' line 2: NameError occurred.
undefined method `mirror' for class `AceResolutionMemoryPatch::Sprite'

后来追溯到脚本自身 发现在
rgssgamemain.call(FindWindow.call("RGSS Player", title), scripts, "")
这一段运行时scripts的值是
"D\u0000a\u0000t\u0000a\u0000\\\u0000S\u0000c\u0000r\u0000i\u0000p\u0000t\u0000s\u0000.\u0000r\u0000v\u0000d\u0000a\u0000t\u0000a\u00002\u0000\u0000"
而其他两个值library和title看上去都符合ini里的 不知是不是我用的原版日文RM所以才出现这种错误……

夏娜大大能否帮忙看一看……

ps 挖坟抱歉OTL
作者: david50407    时间: 2013-6-12 18:56
我也crash咯。。。
windows 8 x64
作者: conanxjc    时间: 2013-7-6 16:53
楼主头像 超魔法大战
作者: 永恒论坛站长    时间: 2013-7-8 09:41
经测试,效果不错,和修改DLL一样占用CPU50%
作者: sydyzyc7    时间: 2013-11-4 18:48
感谢分享。
作者: 夜兔AVG    时间: 2013-11-20 23:18
夏娜殿下您好TUT我一直用您的分辨率脚本,但是升级了va,也就是用了sp脚本升级之后发现和您的脚本冲突了怎么办QAQ因为va老版本消除图片不干净逐渐累积会越来越卡,但升级后不能改分辨率也很蛋疼QAQ不知道您有什么解决办法吗QAQQQ
作者: brackwind    时间: 2015-3-11 20:08
樓主,我用這個腳本測試遊戲時,跳出程式停止運作的訊息
連腳本哪裡有問題都無法得知
可否請樓主幫忙,謝謝
作者: 生命无畏    时间: 2015-12-19 18:03
怎么使用时显示脚本scene-title第41行发生typeerror
作者: skidrowone    时间: 2017-6-11 15:59
好卡啊大佬,走路都一卡一卡。。。。。。。。。。。
作者: mononobe123    时间: 2019-2-25 21:34
感謝~!

作者: yanni00    时间: 2023-5-26 21:33
wbsy8241 发表于 2012-2-15 00:51
测试系统:XP SP3
1.下面有黑条(非左上角对齐以后:上下位移,左右正常 上下移动后最下格是黑的然后画面滚动 ...

我把这里的32全部改成31了亲测有效!!!
作者: tangshuo001002    时间: 2023-6-11 17:02
呜呜呜,大佬,我用您这个脚本,结果报错了,而且不是一点半点的错误,您有什么解决办法吗
作者: 小怪兽奇奇侠    时间: 2023-6-11 17:25
十年过去,小黄鸡变成老黄鸡了(




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1