查看: 1024|回复: 3

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

[复制链接]
梦石
0
星屑
60
在线时间
6 小时
注册时间
2025-3-30
回帖
1
发表于 2025-3-30 12:04:52 | 显示全部楼层 |阅读模式

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

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

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

[pre lang="ruby"]#!/usr/bin/env ruby
# encoding: utf-8
# minimal_marshal_demo.rb (v2)
#
# 验证 Marshal.load 是否从 .rvdata2 文件本身加载非标准属性,
# 不依赖项目中的 shared.rb 或 rgss3.rb 的 RPG::State 定义。
# 添加 RPG::BaseItem::Feature 占位符以允许加载。

# --- 最小化类定义 ---
# 只需要定义模块和类名即可。
module RPG
  # --- 添加 BaseItem 占位符 ---
  class BaseItem
    # 嵌套 Feature 占位符
    class Feature
      # 这个类也是空的
    end
  end
  # --- 结束 BaseItem 占位符 ---

  class State
    # 这个类仍然是空的!
  end
end
# --- 结束最小化定义 ---

# 指定要加载的文件路径
rvdata_file_path = '/home/test/工程/游戏/RMVXACE/Caliross_0.9.22/Data_O/States.rvdata2' # 请确保此路径正确

puts "\n--- 开始加载 Marshal 文件 (使用最小化占位符类 v2): #{File.basename(rvdata_file_path)} ---"

# 检查文件是否存在
unless File.exist?(rvdata_file_path)
  puts "错误:文件未找到 - #{rvdata_file_path}"
  exit 1
end

loaded_data = nil
begin
  # 以二进制模式读取并加载 Marshal 数据
  File.open(rvdata_file_path, 'rb') do |file|
    loaded_data = Marshal.load(file)
  end
  puts "Marshal.load 完成。"

rescue ArgumentError => e
  if e.message.include?("undefined class/module")
    puts "错误:Marshal.load 失败 - #{e.message}"
    puts "检查是否还有其他依赖的类未定义占位符?"
  else
    puts "错误:Marshal.load 失败 (可能是版本不匹配或文件损坏): #{e.message}"
  end
  exit 1
rescue TypeError => e
  puts "错误:Marshal.load 失败 (类型错误): #{e.message}"
  exit 1
rescue => e
  puts "错误:读取或解析 Marshal 文件时发生未知错误: #{e.class}: #{e.message}"
  exit 1
end

puts "\n--- 检查加载后的对象 (使用最小化 RPG::State 和 RPG::BaseItem::Feature) ---"

# 检查加载的数据结构和第一个 RPG::State 对象
if loaded_data.is_a?(Array)
  puts "加载的数据是一个数组,大小: #{loaded_data.size}"

  # 查找第一个 RPG::State 对象
  first_state_index = loaded_data.find_index { |item| item.is_a?(RPG::State) }

  if first_state_index
    state_obj = loaded_data[first_state_index]
    puts "在索引 #{first_state_index} 找到第一个 RPG::State 对象:"
    puts "  对象的实际类 (应为我们定义的占位符): #{state_obj.class}"
    puts "  对象的实例变量列表 (由 Marshal.load 从文件附加):"
    state_obj.instance_variables.sort.each do |ivar|
       begin
         value = state_obj.instance_variable_get(ivar)
         # 对可能包含非UTF8数据的字符串进行安全检查
         if value.is_a?(String) && !value.valid_encoding?
            display_value = "[非UTF8字符串, bytes: #{value.bytes.first(10).inspect}...]"
         elsif ivar == :@features && value.is_a?(Array) # 特别处理 features 数组
            display_value = "[#{value.map { |f| f.class }.join(', ')}]" # 显示数组内对象的类名
         else
            display_value = value.inspect
         end
         puts "    #{ivar}: #{display_value}"
       rescue => e
         puts "    #{ivar}: [无法获取值: #{e.message}]"
       end
    end

    # --- 关键检查 ---
    puts "\n  --- 特定变量检查 ---"
    release_defined = state_obj.instance_variable_defined?(:@release_by_damage)
    remove_defined = state_obj.instance_variable_defined?(:@remove_by_damage)

    puts "  @release_by_damage 是否存在? #{release_defined}"
    if release_defined
      puts "    (值已在上面列表中显示)"
    end
    puts "  @remove_by_damage 是否存在? #{remove_defined}"
    if remove_defined
       puts "    (值已在上面列表中显示)"
    end
    puts "  ---------------------"

  else
    puts "在加载的数据中未找到 RPG::State 对象。"
  end
else
  puts "加载的数据不是预期的数组结构,类型为: #{loaded_data.class}"
end

puts "\n--- 最小化 DEMO v2 结束 ---"[/pre]

[pre lang="ruby"]--- 开始加载 Marshal 文件 (使用最小化占位符类 v2): States.rvdata2 ---
Marshal.load 完成。

--- 检查加载后的对象 (使用最小化 RPG::State 和 RPG::BaseItem::Feature) ---
加载的数据是一个数组,大小: 71
在索引 1 找到第一个 RPG::State 对象:
  对象的实际类 (应为我们定义的占位符): RPG::State
  对象的实例变量列表 (由 Marshal.load 从文件附加):
    @auto_removal_timing: 0
    @chance_by_damage: 100
    @features: [RPG::BaseItem::Feature]
    @icon_index: 17
    @id: 1
    @max_turns: 1
    @message1: " has fallen!"
    @message2: " is slain!"
    @message3: ""
    @message4: " revives!"
    @min_turns: 1
    @name: "Death"
    @note: "State #1 will be automatically added when\r\nHP reaches 0."
    @priority: 100
    @release_by_damage: false
    @remove_at_battle_end: false
    @remove_by_damage: false
    @remove_by_restriction: false
    @remove_by_walking: false
    @restriction: 4
    @steps_to_remove: 100

  --- 特定变量检查 ---
  @release_by_damage 是否存在? true
    (值已在上面列表中显示)
  @remove_by_damage 是否存在? true
    (值已在上面列表中显示)
  ---------------------

--- 最小化 DEMO v2 结束 ---
[/pre]

我用上面的脚本打印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,不然这个兼容行为不太能得到啊。

老鹰

梦石
40
星屑
37812
在线时间
7091 小时
注册时间
2012-5-26
回帖
3297

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

发表于 2025-3-30 14:23:49 | 显示全部楼层
祖传史山代码是这样的
虽然重写移植,但是不敢改动任何地方
回复

使用道具 举报

梦石
0
星屑
60
在线时间
6 小时
注册时间
2025-3-30
回帖
1
 楼主| 发表于 2025-3-30 15:02:41 | 显示全部楼层
本帖最后由 Drak_iaji 于 2025-3-31 09:12 编辑
百里_飞柳 发表于 2025-3-30 14:23
祖传史山代码是这样的
虽然重写移植,但是不敢改动任何地方


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

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

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

使用道具 举报

梦石
1
星屑
23236
在线时间
9564 小时
注册时间
2012-6-19
回帖
7018

开拓者短篇九导演组冠军

发表于 2025-3-31 15:07:14 | 显示全部楼层
Drak_iaji 发表于 2025-3-30 15:02
我就说,我一顿搜索怎么搜出了RMMV的东西。
原来这玩意一脉相承啊。
难不成2K、XP的属性还有遗留?{:4_86 ...

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

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

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部