module RPG
module Notable
#------------------------------------------------------------------------
# ● 任意备注
#------------------------------------------------------------------------
def note_any(name, default, re, capture)
raise ArgumentError, "default can't be nil" if default.nil?
name = name.to_s
mark = name.slice!(/[?!]\Z/)
if method_defined? name
message = "already defined method `#{name}' for #{self}"
raise NameError.new(message, name.to_sym)
end
re = "/<#{name.gsub(/_/, '\s*')}#{re.source}>/i"
default = default.inspect
class_eval %{
def #{name}
return @#{name} unless @#{name}.nil?
@#{name} = @note =~ #{re} ? (#{capture}) : (#{default})
end
}
alias_method name + mark, name if mark
end
#------------------------------------------------------------------------
# ● 备注整数
#------------------------------------------------------------------------
def note_i(name, default = 0)
note_any(name, default, /\s*(-?\d+)/, '$1.to_i')
end
#------------------------------------------------------------------------
# ● 备注小数
#------------------------------------------------------------------------
def note_f(name, default = 0.0)
note_any(name, default, /\s*(-?\d+(?:\.\d+)?)/, '$1.to_f')
end
#------------------------------------------------------------------------
# ● 备注字符串
#------------------------------------------------------------------------
def note_s(name, default = '')
note_any(name, default, /\s*(\S.*)/, '$1')
end
#------------------------------------------------------------------------
# ● 备注是否匹配
#------------------------------------------------------------------------
def note_bool(name)
note_any(name, false, //, 'true')
end
end
BaseItem.extend Notable
Map.extend Notable
Tileset.extend Notable
end