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

Project1

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

[有事请教] 在RMVA的rvdata2中存在@release_by_damage,这是为了兼容RMVX吗?

[复制链接]

Lv1.梦旅人

梦石
0
星屑
25
在线时间
2 小时
注册时间
2025-3-30
帖子
2
跳转到指定楼层
1
发表于 5 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 Drak_iaji 于 2025-3-30 12:11 编辑

RUBY 代码复制
  1. #!/usr/bin/env ruby
  2. # encoding: utf-8
  3. # minimal_marshal_demo.rb (v2)
  4. #
  5. # 验证 Marshal.load 是否从 .rvdata2 文件本身加载非标准属性,
  6. # 不依赖项目中的 shared.rb 或 rgss3.rb 的 RPG::State 定义。
  7. # 添加 RPG::BaseItem::Feature 占位符以允许加载。
  8.  
  9. # --- 最小化类定义 ---
  10. # 只需要定义模块和类名即可。
  11. module RPG
  12.   # --- 添加 BaseItem 占位符 ---
  13.   class BaseItem
  14.     # 嵌套 Feature 占位符
  15.     class Feature
  16.       # 这个类也是空的
  17.     end
  18.   end
  19.   # --- 结束 BaseItem 占位符 ---
  20.  
  21.   class State
  22.     # 这个类仍然是空的!
  23.   end
  24. end
  25. # --- 结束最小化定义 ---
  26.  
  27. # 指定要加载的文件路径
  28. rvdata_file_path = '/home/test/工程/游戏/RMVXACE/Caliross_0.9.22/Data_O/States.rvdata2' # 请确保此路径正确
  29.  
  30. puts "\n--- 开始加载 Marshal 文件 (使用最小化占位符类 v2): #{File.basename(rvdata_file_path)} ---"
  31.  
  32. # 检查文件是否存在
  33. unless File.exist?(rvdata_file_path)
  34.   puts "错误:文件未找到 - #{rvdata_file_path}"
  35.   exit 1
  36. end
  37.  
  38. loaded_data = nil
  39. begin
  40.   # 以二进制模式读取并加载 Marshal 数据
  41.   File.open(rvdata_file_path, 'rb') do |file|
  42.     loaded_data = Marshal.load(file)
  43.   end
  44.   puts "Marshal.load 完成。"
  45.  
  46. rescue ArgumentError => e
  47.   if e.message.include?("undefined class/module")
  48.     puts "错误:Marshal.load 失败 - #{e.message}"
  49.     puts "检查是否还有其他依赖的类未定义占位符?"
  50.   else
  51.     puts "错误:Marshal.load 失败 (可能是版本不匹配或文件损坏): #{e.message}"
  52.   end
  53.   exit 1
  54. rescue TypeError => e
  55.   puts "错误:Marshal.load 失败 (类型错误): #{e.message}"
  56.   exit 1
  57. rescue => e
  58.   puts "错误:读取或解析 Marshal 文件时发生未知错误: #{e.class}: #{e.message}"
  59.   exit 1
  60. end
  61.  
  62. puts "\n--- 检查加载后的对象 (使用最小化 RPG::State 和 RPG::BaseItem::Feature) ---"
  63.  
  64. # 检查加载的数据结构和第一个 RPG::State 对象
  65. if loaded_data.is_a?(Array)
  66.   puts "加载的数据是一个数组,大小: #{loaded_data.size}"
  67.  
  68.   # 查找第一个 RPG::State 对象
  69.   first_state_index = loaded_data.find_index { |item| item.is_a?(RPG::State) }
  70.  
  71.   if first_state_index
  72.     state_obj = loaded_data[first_state_index]
  73.     puts "在索引 #{first_state_index} 找到第一个 RPG::State 对象:"
  74.     puts "  对象的实际类 (应为我们定义的占位符): #{state_obj.class}"
  75.     puts "  对象的实例变量列表 (由 Marshal.load 从文件附加):"
  76.     state_obj.instance_variables.sort.each do |ivar|
  77.        begin
  78.          value = state_obj.instance_variable_get(ivar)
  79.          # 对可能包含非UTF8数据的字符串进行安全检查
  80.          if value.is_a?(String) && !value.valid_encoding?
  81.             display_value = "[非UTF8字符串, bytes: #{value.bytes.first(10).inspect}...]"
  82.          elsif ivar == :@features && value.is_a?(Array) # 特别处理 features 数组
  83.             display_value = "[#{value.map { |f| f.class }.join(', ')}]" # 显示数组内对象的类名
  84.          else
  85.             display_value = value.inspect
  86.          end
  87.          puts "    #{ivar}: #{display_value}"
  88.        rescue => e
  89.          puts "    #{ivar}: [无法获取值: #{e.message}]"
  90.        end
  91.     end
  92.  
  93.     # --- 关键检查 ---
  94.     puts "\n  --- 特定变量检查 ---"
  95.     release_defined = state_obj.instance_variable_defined?(:@release_by_damage)
  96.     remove_defined = state_obj.instance_variable_defined?(:@remove_by_damage)
  97.  
  98.     puts "  @release_by_damage 是否存在? #{release_defined}"
  99.     if release_defined
  100.       puts "    (值已在上面列表中显示)"
  101.     end
  102.     puts "  @remove_by_damage 是否存在? #{remove_defined}"
  103.     if remove_defined
  104.        puts "    (值已在上面列表中显示)"
  105.     end
  106.     puts "  ---------------------"
  107.  
  108.   else
  109.     puts "在加载的数据中未找到 RPG::State 对象。"
  110.   end
  111. else
  112.   puts "加载的数据不是预期的数组结构,类型为: #{loaded_data.class}"
  113. end
  114.  
  115. puts "\n--- 最小化 DEMO v2 结束 ---"


RUBY 代码复制
  1. --- 开始加载 Marshal 文件 (使用最小化占位符类 v2): States.rvdata2 ---
  2. Marshal.load 完成。
  3.  
  4. --- 检查加载后的对象 (使用最小化 RPG::StateRPG::BaseItem::Feature) ---
  5. 加载的数据是一个数组,大小: 71
  6. 在索引 1 找到第一个 RPG::State 对象:
  7.   对象的实际类 (应为我们定义的占位符): RPG::State
  8.   对象的实例变量列表 (Marshal.load 从文件附加):
  9.     @auto_removal_timing: 0
  10.     @chance_by_damage: 100
  11.     @features: [RPG::BaseItem::Feature]
  12.     @icon_index: 17
  13.     @id: 1
  14.     @max_turns: 1
  15.     @message1: " has fallen!"
  16.     @message2: " is slain!"
  17.     @message3: ""
  18.     @message4: " revives!"
  19.     @min_turns: 1
  20.     @name: "Death"
  21.     @note: "State #1 will be automatically added when\r\nHP reaches 0."
  22.     @priority: 100
  23.     @release_by_damage: false
  24.     @remove_at_battle_end: false
  25.     @remove_by_damage: false
  26.     @remove_by_restriction: false
  27.     @remove_by_walking: false
  28.     @restriction: 4
  29.     @steps_to_remove: 100
  30.  
  31.   --- 特定变量检查 ---
  32.   @release_by_damage 是否存在? true
  33.     (值已在上面列表中显示)
  34.   @remove_by_damage 是否存在? true
  35.     (值已在上面列表中显示)
  36.   ---------------------
  37.  
  38. --- 最小化 DEMO v2 结束 ---


我用上面的脚本打印States.rvdata2,回报了这些信息。
新建一个工程然后打印其中的States.rvdata2,好像也一样。
这是说为了兼容RMVX,RMVA生成States.rvdata2时添加了@release_by_damage属性,但是运行时本身不使用这个属性是吗?
在RMVA中这玩意没啥用?
RMMV的json好像也有releaseByDamage属性,但把RMMV的运行时塞给AI,AI说没有releaseByDamage的相关内容,只在rpg_objects.js中找到了removeByDamage。
连RMMV都继承了这个兼容性吗?

感觉上除非是打算做RMVX到RMVA的迁移,甚至是迁移到RMMV,不然这个兼容行为不太能得到啊。

Lv6.析梦学徒

老鹰

梦石
40
星屑
34248
在线时间
6697 小时
注册时间
2012-5-26
帖子
3228

极短24评委极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

2
发表于 5 天前 | 只看该作者
祖传史山代码是这样的
虽然重写移植,但是不敢改动任何地方
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
25
在线时间
2 小时
注册时间
2025-3-30
帖子
2
3
 楼主| 发表于 5 天前 | 只看该作者
本帖最后由 Drak_iaji 于 2025-3-31 09:12 编辑
百里_飞柳 发表于 2025-3-30 14:23
祖传史山代码是这样的
虽然重写移植,但是不敢改动任何地方


我就说,我一顿搜索怎么搜出了RMMV的东西。
原来这玩意一脉相承啊。
难不成2K、XP的属性还有遗留?

话说回来,真要是这些遗留能帮助人一个脚本直接把旧版本工程轻松迁移到新版本,那我倒是能说Enterbrain的程序设计有通天手段,可惜恰恰相反。

遗留到MV也是离谱,语言、体系都换了,就保留了rvdata序列化为JSON的数据结构,真的有多少东西能留存到新版本的RM里啊,不还是重写一堆,重写又不彻底。
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21607
在线时间
9410 小时
注册时间
2012-6-19
帖子
7116

开拓者短篇九导演组冠军

4
发表于 4 天前 | 只看该作者
Drak_iaji 发表于 2025-3-30 15:02
我就说,我一顿搜索怎么搜出了RMMV的东西。
原来这玩意一脉相承啊。
难不成2K、XP的属性还有遗留?{:4_86 ...

实际上,如果功能没换,配置方式也没大概,那旧版本工程就能迁移到新版本

没法轻松迁移的只有各种奇奇怪怪的配置方法和各种奇奇怪怪的脚本
回复 支持 反对

使用道具 举报

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

本版积分规则

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

站长信箱:fux2@moe9th.com|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-4-4 05:37

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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