注册会员 登录
Project1 返回首页

喵呜喵5的树洞 https://rpg.blue/?291206 [收藏] [复制] [分享] [RSS]

日志

【脚本】基础脚本

热度 39已有 9737 次阅读2014-7-21 18:24 |个人分类:脚本

#==============================================================================
# ■ 基础脚本
#------------------------------------------------------------------------------
#   请将基础脚本放在我的所有脚本之上。
#
#   Tips: 什么是基础脚本?
#
#     这个基础脚本包含我自己的脚本中经常使用的一些【完全相同】的代码
#     虽然不能保证百分百兼容,但是基础脚本中所有的代码都能与大部分脚本和谐共处
#     相应的,如果基础脚本中的某些代码与其他脚本发生了冲突
#     只能证明,我脚本的【思路】和那个脚本【必定会发生冲突】
#     这种情况下,即使我将脚本改写成一个不需要基础脚本的版本,冲突仍然会发生
#
#==============================================================================

$m5script ||= {}; $m5script[:ScriptData] ||= {}
$m5script[:M5Base] = 20170304
#--------------------------------------------------------------------------
# ● 版本检查
#
#     M5script.version(ver) 检查脚本版本是否高于指定版本
#--------------------------------------------------------------------------
module M5script
  def self.version(ver,name="基础",key=:M5Base)
    version = $m5script[key.to_sym] || $m5script[key.to_s] ||
      fail("需要喵呜喵5#{name}脚本的支持")
    fail("喵呜喵5#{name}脚本版本过低") if (ver > version)
  end
end
#--------------------------------------------------------------------------
# ● 读取备注、匹配文本
#
#     M5script::M5note.match_text(text, note[, option, &block])
#     匹配文本的基本指令
#
#     text   : 文本内容(String)
#     note   : 需要匹配的文字(String)
#     option : 匹配文本的设置的哈希表
#       :default 缺省值(nil)
#       :value   待匹配文字是否包含内容(true)
#       :list    是否返回全部匹配结果的数组(nil)
#     &block : 成功匹配时执行的回调
#
#     M5script::M5note.map_note(map, note[, option, &block])
#     读取地图备注
#
#     M5script::M5note.event_note(map, id, note[, option, &block])
#     读取活动事件页的第一条指令,如果为注释则进行匹配
#
#--------------------------------------------------------------------------
module M5script; module M5note; class << self
  def match_text(text, note, *option, &block)
    config = option[0].is_a?(Hash) ?
      [option[0][:default], option[0][:value], option[0][:list]] : option
    default, value, list =  *config
    value = true if value.nil?
    return list ? [] : default if text.empty?
    all_result = []
    text.each_line do |line|
      line.chomp!
      if value
        result = /^\s*<\s*#{note}\s+(\S+)\s*>\s*$/ =~ line ? $1 : nil
        next unless result
        yield(result) if block_given?
        return result unless list
        all_result << result
      else
        return true if /^\s*<\s*#{note}\s*>\s*$/ =~ line
      end
    end
    return false unless value
    list ? all_result : default
  end
  def map_note(map, *args)
    text = load_data(sprintf("Data/Map%03d.rvdata2", map)).note
    match_text(text, *args)
  end
  def event_note(map, id, *args)
    begin
      if map == $game_map.map_id then page = $game_map.events[id]
      else
        ev = load_data(sprintf("Data/Map%03d.rvdata2", map)).events[id]
        (page = Game_Event.new(map,ev)).refresh
      end
      page.empty? ? raise : ev_list = page.list
    rescue then return match_text('', *args)
    end
    text = ''
    ev_list.each do |c|
      c.code == 108 || c.code == 408 || break
      text += c.parameters[0] + "\n"
    end
    match_text(text, *args)
  end
end; end; end
#--------------------------------------------------------------------------
# ● 读取物品备注
#--------------------------------------------------------------------------
class RPG::BaseItem
  def m5note *a,&b; M5script::M5note.match_text(@note,*a,&b); end
end
#--------------------------------------------------------------------------
# ● 与旧版基础脚本的兼容
#--------------------------------------------------------------------------
class << M5script
  def match_text *a,&b;      M5script::M5note.match_text *a,&b; end
  def read_map_note *a,&b;   M5script::M5note.map_note *a,&b;   end
  def read_event_note *a,&b; M5script::M5note.event_note *a,&b; end
end
#--------------------------------------------------------------------------
# ● 精灵 Sprite_M5_Base / Sprite_M5
#--------------------------------------------------------------------------
class Sprite_M5_Base < Sprite
  def dispose
    dispose_bitmap
    super
  end
  def dispose_bitmap; end
end
class Sprite_M5 < Sprite_M5_Base; end
#--------------------------------------------------------------------------
# ● 显示端口 Viewport_M5
#--------------------------------------------------------------------------
class Viewport_M5 < Viewport; end
#--------------------------------------------------------------------------
# ● 精灵组 Spriteset_M5
#--------------------------------------------------------------------------
class Spriteset_M5
  def update; end
  def dispose; end
end
#--------------------------------------------------------------------------
# ● 自动更新释放精灵以及显示端口
#--------------------------------------------------------------------------
class Scene_Base
  alias m5_20141113_update_basic update_basic
  def update_basic
    m5_20141113_update_basic
    instance_variables.each do |varname|
      ivar = instance_variable_get(varname)
      ivar.update if ivar.is_a?(Sprite_M5) && !ivar.disposed?
      ivar.update if ivar.is_a?(Spriteset_M5)
    end
  end
  alias m5_20141113_terminate terminate
  def terminate
    m5_20141113_terminate
    instance_variables.each do |varname|
      ivar = instance_variable_get(varname)
      ivar.dispose if ivar.is_a?(Sprite_M5_Base)
      ivar.dispose if ivar.is_a?(Spriteset_M5)
      ivar.dispose if ivar.is_a?(Viewport_M5)
    end
  end
end
#--------------------------------------------------------------------------
# ● 获取控制符的参数(这个方法会破坏原始数据)
#
#     m5_obtain_escape_param(text)
#--------------------------------------------------------------------------
class Window_Base
  def m5_obtain_escape_param(text)
    text.slice!(/^\[.*?\]/)[1..-2] rescue ""
  end
end
#--------------------------------------------------------------------------
# ● 字体大小调整
#
#     include M5script::M5_Window_FontSize
#
#     m5_font_width       默认文字宽度
#     m5_font_height      默认文字高度
#     m5_font_size_change 调整文字大小
#--------------------------------------------------------------------------
module M5script; module M5_Window_FontSize
  def m5_font_size_change(width = m5_font_width, height = m5_font_height)
    contents.font.size = 40
    contents.font.size -= 1 while text_size("口").width > width if width
    contents.font.size -= 1 while text_size("口").height > height if height
  end
  def m5_font_width;  return nil; end
  def m5_font_height; return nil; end
end;end
class Window_Base
  alias m5_20140728_reset_font_settings reset_font_settings
  def reset_font_settings
    m5_20140728_reset_font_settings
    m5_font_size_change if respond_to?(:m5_font_size_change)
  end
  alias m5_20140728_create_contents create_contents
  def create_contents
    m5_20140728_create_contents
    m5_font_size_change if respond_to?(:m5_font_size_change)
  end
end
#--------------------------------------------------------------------------
# ● M5script::Window_Cal
#
#     计算一段文字大小时使用的临时窗口
#
#     cal_all_text_height(text) 计算总高度
#     cal_all_text_width(text)  计算最大宽度
#     calc_line_width(text)     计算单行宽度
#     m5_contents               要描绘目标文字的contents
#     line_height               设置每行文字的高度
#--------------------------------------------------------------------------
module M5script; class Window_Cal < Window_Base
  attr_writer :line_height, :m5_contents
  def initialize
    super(0, 0, Graphics.width, Graphics.height)
    self.visible = false
    @text = ""
    @line_height = nil
    @m5_contents = nil
  end
  def line_height
    return @line_height if @line_height
    super
  end
  def initialize_contents
    if @m5_contents
      self.contents.dispose
      self.contents = @m5_contents.clone
    end
  end
  def cal_all_text_height(text)
    initialize_contents
    reset_font_settings
    @text = text.clone
    all_text_height = 1
    convert_escape_characters(@text).each_line do |line|
      all_text_height += calc_line_height(line, false)
    end
    @m5_contents = nil
    return all_text_height
  end
  def cal_all_text_width(text)
    initialize_contents
    reset_font_settings
    @text = text.clone
    all_text_width = 1
    convert_escape_characters(@text).each_line do |line|
      all_text_width = [all_text_width,calc_line_width(line,false)].max
    end
    @m5_contents = nil
    return all_text_width
  end
  def calc_line_width(target, need_refresh = true)
    initialize_contents if need_refresh
    reset_font_settings
    text = target.clone
    pos = {:x => 0, :y => 0, :new_x => 0, :height => Graphics.height}
    process_character(text.slice!(0, 1), text, pos) until text.empty?
    @m5_contents = nil if need_refresh
    return pos[:x]
  end
  def process_new_line(text, pos);end
  def draw_text(*args);end
end; end
#--------------------------------------------------------------------------
# ● 自动计算大小和位置并包含背景的信息显示窗口
#
#     M5script::Window_Var
#
#     cal    计算窗口大小使用的临时窗口,M5script::Window_Cal 的实例
#     config 窗口设置的哈希表,使用了以下键值:
#            :X :X2 :Y :Y2 :Z :BACK :SX :SY
#--------------------------------------------------------------------------
module M5script; class Window_Var < Window_Base
  def initialize(config, cal = nil)
    get_config(config)
    @dispose_flag = true unless cal
    @size_window = cal || M5script::Window_Cal.new
    super(0,0,0,0)
    self.arrows_visible = false
    self.z = @config[:Z]
    self.openness = 0
    create_back_sprite
  end
  def get_config(config)
    @config = config.clone
    @config[:SX] ||= 0
    @config[:SY] ||= 0
    @config[:Z] ||= 0
  end
  def create_back_sprite
    return unless @config[:BACK]
    self.opacity = 0
    bitmap = Cache.system(@config[:BACK]) rescue nil
    return unless bitmap
    @background_sprite = Sprite.new
    @background_sprite.x, @background_sprite.y = @config[:SX], @config[:SY]
    @background_sprite.z = self.z - 1
    @background_sprite.bitmap = bitmap
  end
  def update_placement
    if @config[:X] && @config[:X2]
      self.width = (@config[:X2] - @config[:X]).abs
    else
      @size_window.m5_contents = self.contents
      self.width  = @size_window.cal_all_text_width(@word)
      self.width += standard_padding * 2
    end
    if @config[:Y] && @config[:Y2]
      self.height = (@config[:Y2] - @config[:Y]).abs
    else
      @size_window.m5_contents = self.contents
      self.height = @size_window.cal_all_text_height(@word)
      self.height += standard_padding * 2
    end
    create_contents
  end
  def update_position
    if    @config[:X]  then self.x = @config[:X]
    elsif @config[:X2] then self.x = @config[:X2] - self.width
    else                    self.x = 0
    end
    if    @config[:Y]  then self.y = @config[:Y]
    elsif @config[:Y2] then self.y = @config[:Y2] - self.height
    else                    self.y = 0
    end
  end
  def dispose
    super
    @size_window.dispose if @dispose_flag
    @background_sprite.dispose if @background_sprite
  end
end; end
#--------------------------------------------------------------------------
# ● 生成TXT
#
#     M5script.creat_text(name,word,type)
#--------------------------------------------------------------------------
module M5script
  def self.creat_text(name,word,type = 'w')
    content = File.open("#{name}",type)
    content.puts word
    content.close
  end
end
#--------------------------------------------------------------------------
# ● 打开地址
#
#     M5script.open_url(addr)
#--------------------------------------------------------------------------
module M5script
  def self.open_url(addr)
    api = Win32API.new('shell32.dll','ShellExecuteA','pppppi','i')
    api.call(0,'open',addr,0, 0, 1)
  end
end
#--------------------------------------------------------------------------
# ● 读取、写入Game.ini
#
#     M5script::M5ini.get(key, default_value[, section])
#     M5script::M5ini.write(key, value[, section])
#--------------------------------------------------------------------------
module M5script; module M5ini; class << self
  def filename; './Game.ini'; end
  def default_section; 'M5script'; end
  def get(key, default_value, section = default_section)
    buffer = [].pack('x256')
    api = Win32API.new('kernel32','GetPrivateProfileString','ppppip', 'i')
    l = api.call(section, key, default_value, buffer, buffer.size, filename)
    return buffer[0, l]
  end
  def write(key, value, section = default_section)
    api = Win32API.new('kernel32','WritePrivateProfileString','pppp', 'i')
    api.call(section, key, value.to_s, filename)
  end
end; end; end
25

鸡蛋
2

鲜花

刚表态过的朋友 (27 人)

发表评论 评论 (20 个评论)

回复 taroxd 2014-7-22 19:13
http://rm.66rpg.com/thread-365967-1-1.html

在这个页面上搜索 note 可以看到我写的读取备注的方法。靠谱一些,效率高一些(因为缓存)=。=

顺便:
    result = /<#{note}\s+(\S+)\s*>/ =~ @note ? $1.to_s : default
    result
那个 to_s 是多余的,result 也是多余的
回复 喵呜喵5 2014-7-22 19:53
taroxd: http://rm.66rpg.com/thread-365967-1-1.html

在这个页面上搜索 note 可以看到我写的读取备注的方法。靠谱一些,效率高一些(因为缓存)=。=

顺便:
    resul ...
……我其实看不懂我会乱说=口=
回复 余烬之中 2014-7-24 21:42
taroxd: http://rm.66rpg.com/thread-365967-1-1.html

在这个页面上搜索 note 可以看到我写的读取备注的方法。靠谱一些,效率高一些(因为缓存)=。=

顺便:
    resul ...
短暂回来的吐槽:
居然用上了__FILE__和__LINE__
(其实我一直想在我脚本的最后加上__END__然后在下面抄上我喜欢的歌词233)

===================

另 to m5
$1本身就是字符串 需要数字的情况需要to_i或to_f 没有必要to_s……
回复 喵呜喵5 2014-7-27 23:44
余烬之中: 短暂回来的吐槽:
居然用上了__FILE__和__LINE__
(其实我一直想在我脚本的最后加上__END__然后在下面抄上我喜欢的歌词233)

===================

另 to m5
$1本 ...
怎么谁都在吐槽.to_s

…………我能说那个.to_s是为了让我日后能够想起这个方法获取的是字符串调用时可能需要to_i的么…………
回复 喵呜喵5 2014-8-21 16:48
余烬之中: 短暂回来的吐槽:
居然用上了__FILE__和__LINE__
(其实我一直想在我脚本的最后加上__END__然后在下面抄上我喜欢的歌词233)

===================

另 to m5
$1本 ...
__END__ 是用来做什么的?
去查了一下说是__END__后的为数据区,但是数据区又是什么?
回复 余烬之中 2014-8-24 12:49
a = 3
b = 5
p a #=> 3
报个错 rescue p "Orz" #=> "Orz"
__END__
p b
# 什么都没有发生
再报个错
什么都不会发生
回复 喵呜喵5 2014-8-24 14:57
余烬之中: a = 3
b = 5
p a #=> 3
报个错 rescue p &quot;Orz&quot; #=> &quot;Orz&quot;
__END__
p b
# 什么都没有发生
再报个错
什么都不会发生 ...
所以?如何获取 __END__ 之后数据的内容?还是说__END__类似于一个注释?
回复 余烬之中 2014-8-24 21:35
Denotes the end of the regular source code section of a program file. Lines below __END__ will not be executed. Those lines will be available via the special filehandle DATA. The following code will print out two stanzas of personal information. Note that __END__ has to be flush left, and has to be the only thing on its line.
回复 余烬之中 2014-8-24 21:36
http://www.ruby-doc.org/docs/keywords/1.9/files/keywords_rb.html#M000003
回复 喵呜喵5 2014-8-24 21:48
通过DATA来访问吗?
那么能否在一个脚本页中访问其他脚本页的DATA呢?
回复 喵呜喵5 2014-8-24 21:54
卧槽为什么现在再去搜索__END__的时候就有Ruby1.9的结果了……上次去搜只有2.1的结果看了半天看不懂cat是什么玩意儿……
$ cat t.rb
puts DATA.gets
__END__
hello world!

$ ruby t.rb
hello world!
回复 余烬之中 2014-8-24 22:00
喵呜喵5: 通过DATA来访问吗?
那么能否在一个脚本页中访问其他脚本页的DATA呢?
在RGSS里还不如直接用$RGSS_SCRIPTS
回复 喵呜喵5 2014-8-25 20:42
余烬之中: 在RGSS里还不如直接用$RGSS_SCRIPTS
在class中如何获取DATA?直接用的时候被当成常量了…………
回复 余烬之中 2014-8-26 20:24
喵呜喵5: 在class中如何获取DATA?直接用的时候被当成常量了…………
class A
  def s
    while _ = DATA.gets
      p _
    end
  end
end

A.new.s
# 一切正常 Orz
回复 喵呜喵5 2014-8-26 22:07
余烬之中: class A
  def s
    while _ = DATA.gets
      p _
    end
  end
end

A.new.s
# 一切正常 Orz
如果还包含了一个名叫DATA的常量时如何处理二义性?
回复 余烬之中 2014-8-26 22:15
处理方案:不要使用名为DATA的常量
我说真的 Orz
回复 喵呜喵5 2014-8-26 22:19
余烬之中: 处理方案:不要使用名为DATA的常量
我说真的 Orz
使用了以后………………是随机读一个么?
回复 余烬之中 2014-8-26 22:23
喵呜喵5: 使用了以后………………是随机读一个么?
目测是读常量啦
回复 taroxd 2014-9-10 12:35
为什么我记得RGSS里面不支持读DATA……
回复 永燃的狂炎 2014-10-5 00:25
=begin
                   _ooOoo_
                  o8888888o
                  88" . "88
                  (| -_- |)
                  O\  =  /O
               ____/`---'\____
             .'  \\|     |//  `.
            /  \\|||  :  |||//  \
           /  _||||| -:- |||||-  \
           |   | \\\  -  /// |   |
           | \_|  ''\---/''  |   |
           \  .-\__  `-`  ___/-. /
         ___`. .'  /--.--\  `. . __
      ."" '<  `.___\_<|>_/___.'  >'"".
     | | :  `- \`.;`\ _ /`;.`/ - ` : | |
     \  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======
                   `=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


           佛祖保佑       永无BUG
=end

恶意卖萌!

facelist doodle 涂鸦笔

您需要登录后才可以评论 登录 | 注册会员

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

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-3-29 23:51

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部