设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 5799|回复: 7
打印 上一主题 下一主题

当RGE碰上RTP (让RGE读取RTP) 中文支持

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
跳转到指定楼层
1
发表于 2009-8-9 12:03:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 david50407 于 2010-11-14 16:40 编辑

某次在66上看到了一个 登录档的读取方法
便应用来写出了 让RGE读取RTP的方法
首先在最上面插入两个脚本

  1. #================================================= =============================
  2. # ■ String
  3. #------------------------------------------------- -----------------------------
  4. #  字符串类。可处理任意长度的字节串。 (追加编码转换的定义)
  5. #================================================= =============================

  6. class String
  7.   #------------------------------------------------- -------------------------
  8.   # ● 用来编码Ruby 字符串、解码unicode 的两个Windows API 函数
  9.   #------------------------------------------------- -------------------------
  10.   @@MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", ['I', 'L', 'P', 'I', 'P', 'I'], 'I')
  11.   @@WideCharToMultiByte = Win32API.new("kernel32", "WideCharToMultiByte", ['I', 'L', 'P', 'I', 'P', 'I', 'P', 'P'], 'I')
  12.   #------------------------------------------------- -------------------------
  13.   # ● 返回将Ruby UTF-8 字符串对象(本身)编码为unicode 后的字符串
  14.   #------------------------------------------------- -------------------------
  15.   def to_unicode
  16.     len = @@MultiByteToWideChar.call(65001, 0, self, -1, 0, 0) << 1
  17.     buf =" " * len
  18.     # 65001: UTF-8 字符集编码(代码页)
  19.     @@MultiByteToWideChar.call(65001, 0, self, -1, buf, len)
  20.     return buf
  21.   end
  22.   #------------------------------------------------- -------------------------
  23.   # ● 返回将编码为unicode 的字符串对象(本身)解码为UTF-8 后的字符串
  24.   #------------------------------------------------- -------------------------
  25.   def to_UTF8
  26.     len = @@WideCharToMultiByte.call(65001, 0, self, -1, 0, 0, 0, 0)
  27.     buf =" " * len
  28.     @@WideCharToMultiByte.call(65001, 0, self, -1, buf, len, 0, 0)
  29.     # 去掉'\0' 字符串结束符(因为转换之后仅仅用于Ruby 字符串)
  30.     buf.slice!(-1, 1)
  31.     return buf
  32.   end
  33. end
复制代码
用来支持中文

  1. #==============================================================================
  2. #module Ini
  3. #==============================================================================
  4. module Ini
  5.   def self.readIni(item = "Title")
  6.     buf = 0.chr * 256
  7.     gpps = Win32API.new("kernel32","GetPrivateProfileString","pppplp","l")
  8.     gpps.call("Game",item,"",buf,256,"./Game.ini")
  9.     buf.delete!("\0")
  10.     return buf
  11.   end
  12. end
复制代码
让RGE能读取 ini 设定

而 ini 档内格式如下

  1. [Setting]
  2. Library=RGE.dll
  3. Scripts=Scripts.rges
  4. Package=
  5. [Plugin]
  6. Sriol=default.r32
  7. Priol=default.r32
  8. [Game]
  9. RTP1=Standard
  10. RTP2=
  11. RTP3=
复制代码
最多三个(当然可以自己改)

再插入一个脚本
这是精简版的Regedit模组

  1. module Regedit
  2.   HKEY_LOCAL_MACHINE        = 0x80000002

  3.   STANDARD_RIGHTS_READ      = 0x00020000
  4.   KEY_QUERY_VALUE           = 0x0001
  5.   KEY_ENUMERATE_SUB_KEYS    = 0x0008
  6.   KEY_NOTIFY                = 0x0010
  7.   KEY_READ = STANDARD_RIGHTS_READ |
  8.   KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS | KEY_NOTIFY
  9.   KEY_EXECUTE = KEY_READ | 0x0200 # 0x0200 : Wow64_32Node

  10.   @@reg = []

  11.   # 0:开启 1:寻找
  12.   [
  13.   %w/RegOpenKeyEx     LPLLP        L/, #0
  14.   %w/RegQueryValueExW  LPLPPP       L/, #1
  15.   ].each do |fn|
  16.     @@reg << Win32API.new("advapi32.dll", *fn)
  17.   end

  18.   module_function

  19.   def REG
  20.     return @@reg
  21.   end

  22.   # 返回顶端
  23.   def OpenKey(hkey, name, opt, desired)
  24.     result = packdw(0)
  25.     check self.REG[0].call(hkey, name, opt, desired, result)
  26.     @reg_jb = unpackdw(result)
  27.   end
  28.   
  29.   def QueryValue(hkey, name)
  30.     size = [128].pack('l')
  31.     data = '    ' * 32
  32.     #check (self.REG[1].call(hkey, name, 0, type, 0, size), name)
  33.     self.REG[1].call(hkey, name.to_unicode, 0, 0, data, size)
  34.     check (data, name)
  35.     data = data.to_UTF8
  36.     return data
  37.   end
  38.   
  39.   def check(data, name="")
  40.     if data == '    ' * 32
  41.       p "找不到 RTP:#{name}!"
  42.       exit
  43.     end
  44.   end
  45.   
  46.   def packdw(dw)
  47.     [dw].pack("V")
  48.   end
  49.   
  50.   def unpackdw(dw)
  51.     dw += [0].pack("V")
  52.     dw.unpack("V")[0]
  53.   end
  54.   
  55.   def get_jb
  56.     return @reg_jb if @reg_jb != nil
  57.   end
  58. end
复制代码
让RGE能读取登录值

最后,压轴来了
再插入一个脚本

  1. # RTP 数量 (对应到ini档)
  2. $rtp_num = 3
  3. # 读取RTP路径
  4. def getRTPPath(rtpname)
  5.   return "" if rtpname == "" or rtpname.nil?
  6.   Regedit.OpenKey(Regedit::HKEY_LOCAL_MACHINE,"SOFTWARE\\Enterbrain\\RGSS\\RTP",0,Regedit::KEY_EXECUTE)
  7.   rp = Regedit.QueryValue(Regedit.get_jb,rtpname)
  8.   return "" if rp == "" or rp.nil?
  9.   rp = File.expand_path(rp) + "/"
  10.   return rp
  11. end

  12. $RTP = []
  13. for i in 0...$rtp_num
  14.   $RTP[i] = getRTPPath(Ini.readIni("RTP#{i.to_s}"))
  15. end

  16. # 修正路径
  17. module RPG
  18.   module Path
  19.     FindFirstFile = Win32API.new("kernel32", "FindFirstFileW", "PP", "L")
  20.     FindNextFile = Win32API.new("kernel32", "FindNextFileW", "LP", "I")
  21.     def self.findP(*paths)
  22.       findFileData = " " * 592
  23.       for p in paths
  24.         unless FindFirstFile.call(p.to_unicode, findFileData) == -1 # INVALID_HANDLE_VALUE
  25.           return File.dirname(p) + "/" + findFileData[44, 45 + 260 * 2].to_UTF8
  26.         end
  27.       end
  28.       return ""
  29.     end
  30.    
  31.     @list = {}
  32.     def self.Graphics(path)
  33.       return @list[path] if @list.include?(path)
  34.       check = File.extname(path).empty?
  35.       rtp = []
  36.       for i in 0...$rtp_num
  37.         unless $RTP[i].empty?
  38.           rtp.push($RTP[i] + path)
  39.           if check
  40.             rtp.push($RTP[i] + path + ".*")
  41.           end
  42.         end
  43.       end
  44.       pa = self.findP(*rtp)
  45.       if pa == ""
  46.         @list[path] = path
  47.       else
  48.         @list[path] = pa
  49.       end
  50.       return @list[path]
  51.     end
  52.     def self.Audio(path)
  53.       return @list[path] if @list.include?(path)
  54.       check = File.extname(path).empty?
  55.       rtp = []
  56.       for i in 0...$rtp_num
  57.         unless $RTP[i].empty?
  58.           rtp.push($RTP[i] + path)
  59.           if check
  60.             rtp.push($RTP[i] + path + ".*")
  61.           end
  62.         end
  63.       end
  64.       pa = self.findP(*rtp)
  65.       if pa == ""
  66.         @list[path] = path
  67.       else
  68.         @list[path] = pa
  69.       end
  70.       return @list[path]
  71.     end
  72.   end
  73. end

  74. # 修正路径
  75. module RPG
  76.   module Cache
  77.     @cache = {}
  78.     def self.load_bitmap(folder_name, filename, hue = 0)
  79.       path = folder_name + filename
  80.       path = RPG::Path::Graphics(path) #
  81.       if not @cache.include?(path) or @cache[path].disposed?
  82.         if filename != ""
  83.           @cache[path] = Bitmap.new(path)
  84.         else
  85.           @cache[path] = Bitmap.new(32, 32)
  86.         end
  87.       end
  88.       if hue == 0
  89.         @cache[path]
  90.       else
  91.         key = [path, hue]
  92.         if not @cache.include?(key) or @cache[key].disposed?
  93.           @cache[key] = @cache[path].clone
  94.           @cache[key].hue_change(hue)
  95.         end
  96.         @cache[key]
  97.       end
  98.     end
  99.   end
  100.   class Sprite < ::Sprite
  101.     def animation_process_timing(timing, hit)
  102.       if (timing.condition == 0) or
  103.         (timing.condition == 1 and hit == true) or
  104.         (timing.condition == 2 and hit == false)
  105.         if timing.se.name != ""
  106.           se = timing.se
  107.           path = RPG::Path::Audio("Audio/SE/" + se.name) #
  108.           Audio.se_play(path, se.volume, se.pitch) #
  109.         end
  110.         case timing.flash_scope
  111.         when 1
  112.           self.flash(timing.flash_color, timing.flash_duration * 2)
  113.         when 2
  114.           if self.viewport != nil
  115.             self.viewport.flash(timing.flash_color, timing.flash_duration * 2)
  116.           end
  117.         when 3
  118.           self.flash(nil, timing.flash_duration * 2)
  119.         end
  120.       end
  121.     end
  122.   end
  123. end
复制代码
附上范例
http://www.zumodrive.com/share/8oSEZDEzNW

于 2010/11/14 12:11 更新:
    使Regedit 模块默认使用32Bit / Wow6432 的Node
    支持中文或其他 Unicode 编码的 路径
    重新上传范例

Lv3.寻梦者

孤独守望

梦石
0
星屑
3121
在线时间
1534 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

2
发表于 2009-8-9 12:14:58 | 只看该作者
请在最后的地址上加上URL标记。
嗯还能说什么呢,膜拜。然后迅速拖走范例
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6545
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

3
发表于 2009-8-10 20:58:27 | 只看该作者
本帖最后由 后知后觉 于 2009-8-10 21:02 编辑

好像没有正确获取到我的RTP路径........
路径中的汉字部分被省略了........

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x

点评

虽然时间有点久 不过已解决  发表于 2010-11-14 00:25











你知道得太多了

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
帖子
634
4
发表于 2009-8-12 16:27:34 | 只看该作者
精华在于注册表的使用
感谢楼主
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
105
在线时间
67 小时
注册时间
2007-12-16
帖子
75
5
发表于 2009-8-12 20:35:48 | 只看该作者
getRTPPath(rtpname)
裡的
rp = Regedit.get_value("data")
這部分用那個轉碼的轉一下看看會不會好???
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
6545
在线时间
1666 小时
注册时间
2008-10-29
帖子
6710

贵宾

6
发表于 2009-8-12 21:48:51 | 只看该作者
转码貌似我还不会- -
不过我手动把路径输入上去了 弹出来的是说 "没有找到Graphics/Windowskins/001-Blue01"
然后我把汉字路径改成字母,把手动输入的路径删除了,这个时候也是说的找不到这个文件
看来最后在获取文件的时候还是有问题呀~











你知道得太多了

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
7
 楼主| 发表于 2009-8-13 21:24:18 | 只看该作者
請問您是不是
把$rtp_num 設成 1
如果是的話那應該是我的錯
應該把
$RTP[i] = getRTPPath(Ini.readIni("RTP#{i.to_s}"))
改成
$RTP[i] = getRTPPath(Ini.readIni("RTP#{(i+1).to_s}"))
上面已同步修正
因為RGE預設的編碼問題會把漢字給54掉
這個問題正在研究中
謝謝
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
8
 楼主| 发表于 2010-11-14 00:24:37 | 只看该作者
更新顶帖
于 2010/11/14 12:11 更新:
    使Regedit 模块默认使用32Bit / Wow6432 的Node
    支持中文或其他 Unicode 编码的 路径
    重新上传范例
RGE这万年大坑 啥时填起来@@

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-19 18:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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