#!/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 结束 ---"