#encoding:utf-8
#==============================================================================
# ● ULDS便捷模版
# 脚本作者:老鹰 ([url=https://github.com/OneEyedEagle/EAGLE-RGSS3]https://github.com/OneEyedEagle/EAGLE-RGSS3[/url])
# 范例工程:葱兔 Onion rabbit ([url=https://rpg.blue/?317370]https://rpg.blue/?317370[/url])
# 兼容RGD部分(解决RGD打包脚本失效的问题):deepseek
#==============================================================================
module Taroxd::ULDS
DIY_SETTINGS = {
# -----------------------------------------------------------------------------
# ▍使用方法
# -----------------------------------------------------------------------------
# ● 地图备注写: <ulds_diy map filename>
# 释义:
# map → 下方模版对应的名称,名称中不能有空格。
# filename → 模板中的 [name],也就是远景图名称。
# 在 [name]前可以加入统一前缀,如“map”,就可以只写编号了。
# 在 [name]后加后缀,显示对应名称远景图,没有便自动跳过。
# 如 _U 为上层遮挡, _L 为光层,_S 为影层。
# ·若要兼容<ulds></ulds>,请将 <ulds_diy> 放置于备注最后(参考“window”地图)
# ·远景素材必须是工程中有的素材(红点),VA自带的RTP(蓝点)不行
# -----------------------------------------------------------------------------
# ▍模版格式说明
# -----------------------------------------------------------------------------
# "模版名称" =>
# "自定义内容,如<ulds=Map[name]></ulds>"
# ,(逗号不要漏掉)
# -----------------------------------------------------------------------------
# ▍模版1
# -----------------------------------------------------------------------------
"map" =>
"<ulds=map[name]></ulds>
<ulds=map[name]_U>
z: 101
</ulds>
<ulds=map[name]_L>
z: 370
blend_type: 1
</ulds>
<ulds=map[name]_S>
z: 375
blend_type: 2
</ulds>
",
# -----------------------------------------------------------------------------
# ▍模版2、3、4……
# -----------------------------------------------------------------------------
#~ "" => "
#~ # 内容
#~ ",
#==============================================================================
# × 设定完毕 ×
#==============================================================================
}
# -----------------------------------------------------------------------------
RE_DIY = /<ulds_diy +(.*?) +(.*?)>/mi
class << self
# 保存原始的 new 方法(如果需要备用)
alias_method :new_original, :new
# 新的 new 方法:如果位图加载失败,则返回 nil(不创建对象)
def new(settings, viewport)
@settings = settings
bitmap = make_bitmap
return nil unless bitmap # 位图为空则不创建对象
# 创建容器(Sprite 或 Plane)
container = (extract('loop') ? Plane : Sprite).new(viewport)
container.bitmap = bitmap
container.instance_eval(init_container_code, __FILE__, __LINE__)
container
end
# 重写 make_bitmap,捕获文件不存在的异常,返回 nil
def make_bitmap
basename = extract(nil)
return nil if basename.empty? # 文件名为空则跳过
folder_name = "Graphics/#{extract('path', DEFAULT_PATH).chomp}"
Bitmap.new("#{folder_name}/#{basename}")
rescue Errno::ENOENT
# 图片不存在,安静地跳过(不输出警告,避免干扰)
nil
end
# 新的 from_note:处理 <ulds_diy> 标签,合并后逐个解析,自动跳过位图缺失的图层
def from_note(note, viewport)
diy_strings = []
note.scan(RE_DIY).each do |type, name|
template = DIY_SETTINGS[type]
next unless template
diy_strings << template.gsub('[name]', name)
end
combined_note = diy_strings.join("\n") + "\n" + note
# 解析所有 <ulds> 标签,逐个创建对象
combined_note.scan(RE_OUTER).map do |name, contents|
settings = {nil => name}
contents.scan(RE_INNER) do |key, value|
(settings[key] ||= '') << value << "\n"
end
new(settings, viewport)
end.compact
end
end
end