设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 1432|回复: 0
打印 上一主题 下一主题

[已经过期] 漫画式对话框和鼠标系统有微妙的冲突

[复制链接]

Lv1.梦旅人

梦石
0
星屑
56
在线时间
171 小时
注册时间
2011-12-13
帖子
107
跳转到指定楼层
1
发表于 2012-3-1 12:01:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
鄙人想做个比较容易上手的AVG,所以既用了鼠标系统又用了漫画式对话框,可是今天发现漫画式对话框在显示选项的时候不能用鼠标控制选项啊……

我知道半身像对话框和漫画式对话框都是沉影不器大大的作品,如果改一下某个地方是不是可以把这个处理掉了呢……

话说鄙人是纯粹的脚本盲……只知道指哪打哪


‘‘──很苦恼的诺诺于2012-3-1 12:29补充以下内容

这是鼠标系统的脚本:



# [VX] SMS - Simple Mouse System
#------------------------------------------------------------------------------
# ◦ by Woratana [[email][email protected][/email]]
# ◦ Released on: 14/04/2008 (D-M-Y)
# ◦ Version: 1.5
#
# ◦ Credit: DerVVulfman, Near Fantastica, and Freak Boy [Mouse Input Module]
# lambchop, shun, Cybersam, Astro_mech, and Mr.Mo [Super Simple Mouse System]
# - Modern Algebra, Zeriab, Patrick Lester [Path Finding]
# - Near Fantastica, Fuso [Path Finding]
#
# - I will not be able to script this without those people and scripts above
#-----------------------------------------------------------------------------
#====[REQUIRE]=====
# - DerVVulfman's Mouse Input Module
# ([url]http://rmxp.org/forums/index.php?topic=26993[/url])
# It's XP script, but also works in VX!
#
# - Near Fantastica's Path Finding [version 1.0]
# ([url]http://www.rmxp.org/forums/index.php?topic=26661.0[/url])
# with a little fix to make it works in VX.
# (get fixed version from Simple Mouse System demo)
#
#====[FEATURE]=====
# - Support to use mouse in many scenes / windows
# - Click on map to move player with Path Finding
# - Mouse Pointer
#
#====[PLAN in next version]=====
# - Cursor change when put on other event
# - Better event trigger check by click mouse
#
#------------------------------------------------------------------------------

#==============================================================================
# **鼠标输出模块
#==============================================================================
class << Mouse
  show_cursor = Win32API.new('user32', 'ShowCursor', 'l', 'l')
  show_cursor.call(0)

  $mousec = Sprite.new
  $mousec.z = 10001
  $mousec.x = $mousec.y = 1000
  $mouse_icon = 'fox_cursor'
  $mousec.bitmap = Cache.system($mouse_icon)
  
  alias wor_mouse_upd_mouse update unless $@
  def Mouse.update
    wor_mouse_upd_mouse
    if $mouse_old_icon.nil? or $mouse_old_icon != $mouse_icon
      $mouse_old_icon = $mouse_icon
      $mousec.bitmap = Cache.system($mouse_old_icon)
    end
    if @pos.nil?
      $mousec.x = 1000 if $mousec.x != 1000
      $mousec.y = 1000 if $mousec.y != 1000
    else
      $mousec.x = @pos[0] if $mousec.x != @pos[0]
      $mousec.y = @pos[1] if $mousec.y != @pos[1]
    end
  end
  
  def Mouse.map_pos
    return nil if @pos == nil
    x = ($game_map.display_x / 256) + (@pos[0] / 32)
    y = ($game_map.display_y / 256) + (@pos[1] / 32)
    return [x, y]
  end
end

#==============================================================================
# ** 输出
#==============================================================================
class << Input
  alias wor_input_upd_mouse update unless $@
  alias wor_input_trig_mouse trigger? unless $@
  alias wor_input_rep_mouse repeat? unless $@
  def Input.update
    wor_input_upd_mouse
    Mouse.update
  end
  
  def Input.trigger?(input)
    return wor_input_trig_mouse(input) if Mouse.pos.nil?
    case input
    when Input::B
      return (wor_input_trig_mouse(input) or Mouse.click?(2))
    when Input::C
      if $scene.is_a?(Scene_Map) and !$game_message.visible
        return wor_input_trig_mouse(input)
      else
        return (wor_input_trig_mouse(input) or Mouse.click?(1))
      end
    else
      return wor_input_trig_mouse(input)
    end
  end
  
  def Input.repeat?(input)
    if input == Input::B
      return (wor_input_rep_mouse(input) or Mouse.click?(2))
    else
      return wor_input_rep_mouse(input)
    end
  end
end
#==============================================================================
# ** 图形
#==============================================================================
class << Graphics
  alias wor_graph_fadeout_mouse fadeout unless $@
  def Graphics.fadeout(frames = 1)
    $mousec.visible = false if !$mousec.nil?
    wor_graph_fadeout_mouse(frames)
  end
end
#==============================================================================
# ** Window_Selectable
#==============================================================================
class Window_Selectable < Window_Base
  alias wor_winsel_ini_mouse initialize
  alias wor_winsel_upd_mouse update
  def initialize(*args)
    wor_winsel_ini_mouse(*args)
    @scroll_wait = 0
    @cursor_wait = 0
  end

  def update
    wor_winsel_upd_mouse
    update_mouse if self.active and self.visible
  end
  
  def update_mouse
    @cursor_wait -= 1 if @cursor_wait > 0
    (0..@item_max - 1).each do |i|
      irect = item_rect(i)
      irx = self.x + 16 + irect.x - self.ox
      iry = self.y + 16 + irect.y - self.oy
      move_cursor(i) if Mouse.area?(irx, iry, irect.width, irect.height)
    end
  end

  def move_cursor(index)
    return if @index == index
    @scroll_wait -= 1 if @scroll_wait > 0
    row1 = @index / @column_max
    row2 = index / @column_max
    bottom = self.top_row + (self.page_row_max - 1)
    if row1 == self.top_row and row2 < self.top_row
      return if @scroll_wait > 0
      @index = [@index - @column_max, 0].max
      @scroll_wait = 4
    elsif row1 == bottom and row2 > bottom
      return if @scroll_wait > 0
      @index = [@index + @column_max, @item_max - 1].min
      @scroll_wait = 4
    else
      @index = index
    end
    return if @cursor_wait > 0
    Sound.play_cursor
    @cursor_wait += 2
  end
end
#==============================================================================
# ** Window_MenuStatus
#==============================================================================
class Window_MenuStatus < Window_Selectable
  def item_rect(index)
    return Rect.new(0, index * 96, contents.width, 96)
  end
end
#==============================================================================
# ** Window_NameInput
#==============================================================================
class Window_NameInput < Window_Base
  alias wor_winnam_upd_mouse update
  def update
    wor_winnam_upd_mouse
    if self.active and self.visible
      (0..TABLE[@mode].size - 1).each do |i|
      irect = item_rect(i)
      irx = self.x + 16 + irect.x - self.ox
      iry = self.y + 16 + irect.y - self.oy
      @index = i if Mouse.area?(irx, iry, irect.width, irect.height)
      end
    end
  end
end
#==============================================================================
# ** Window_PartyCommand
#==============================================================================
class Window_PartyCommand < Window_Command
  def update_mouse
    (0..@item_max - 1).each do |i|
    irect = item_rect(i)
    irx = self.viewport.ox + 16 + irect.x - self.ox
    iry = 288 + 16 + irect.y - self.oy
    self.index = i if Mouse.area?(irx, iry, irect.width, irect.height)
    end
  end
end
#==============================================================================
# ** Window_ActorCommand
#==============================================================================
class Window_ActorCommand < Window_Command
  def update_mouse
    (0..@item_max - 1).each do |i|
    irect = item_rect(i)
    irx = self.viewport.ox + 288 + 16 + irect.x
    iry = 288 + 16 + irect.y
    self.index = i if Mouse.area?(irx, iry, irect.width, irect.height)
    end
  end
end
#==============================================================================
# ** Window_Message
#==============================================================================
class Window_Message < Window_Selectable
  def update_mouse
    (0..@item_max - 1).each do |i|
      irect = item_rect(i)
      irx = self.x + 16 + irect.x - self.ox
      iry = self.y + 16 + irect.y - self.oy + ($game_message.choice_start * WLH)
      self.index = i if Mouse.area?(irx, iry, irect.width, irect.height)
    end
  end
end

#==============================================================================
# ** Scene_Base
#==============================================================================
class Scene_Base
  alias wor_scebase_posstr_mouse post_start
  alias wor_scebase_preter_mouse pre_terminate
  def post_start
    $mousec.visible = true if !$mousec.nil?
    wor_scebase_posstr_mouse
  end
  
  def pre_terminate
    $mousec.visible = false if !$mousec.nil?
    wor_scebase_preter_mouse
  end
end
#==============================================================================
# ** Scene_File
#==============================================================================
class Scene_File < Scene_Base
  alias wor_scefil_upd_mouse update
  def update
    (0..@item_max - 1).each do |i|
      ix = @savefile_windows[i].x
      iy = @savefile_windows[i].y
      iw = @savefile_windows[i].width
      ih = @savefile_windows[i].height
      if Mouse.area?(ix, iy, iw, ih)
        @savefile_windows[@index].selected = false
        @savefile_windows[i].selected = true
        @index = i
      end
    end
    wor_scefil_upd_mouse
  end
end
#==============================================================================
# ** Scene_Map
#==============================================================================
class Scene_Map < Scene_Base
  alias wor_scemap_ini_mouse initialize
  alias wor_scemap_upd_mouse update
  def initialize
    @last_click = [nil, nil]
    wor_scemap_ini_mouse
  end
  
  def update
    wor_scemap_upd_mouse
    mouse_xy = Mouse.map_pos
    if Mouse.click?(1) and !mouse_xy.nil? and !$game_message.visible and
      !$game_map.interpreter.running?
      $game_player.turn_toward_pos(mouse_xy[0], mouse_xy[1])
      if $game_player.close?(mouse_xy[0],mouse_xy[1]) and
        $game_player.check_action_event
        $game_player.clear_path
        return
      end
      if $game_map.passable?(mouse_xy[0], mouse_xy[1])
        $game_player.find_path(mouse_xy[0], mouse_xy[1])
      end
      @last_click = mouse_xy
    end
    if Mouse.click?(3) and !mouse_xy.nil? and !$game_message.visible and
      !$game_map.interpreter.running?
      $game_player.clear_path
      $game_player.turn_toward_pos(mouse_xy[0], mouse_xy[1])
    end
  end
end
#==============================================================================
# ** Game_Character
#==============================================================================
class Game_Character
  def turn_toward_pos(x,y)
    sx = distance_x_from_pos(x)
    sy = distance_y_from_pos(y)
    if sx.abs > sy.abs
      sx > 0 ? turn_left : turn_right
    elsif sx.abs < sy.abs
      sy > 0 ? turn_up : turn_down
    end
  end
  
  def distance_x_from_pos(x)
    sx = @x - x
    if $game_map.loop_horizontal?
      if sx.abs > $game_map.width / 2
        sx -= $game_map.width
      end
    end
    return sx
  end
  
  def distance_y_from_pos(y)
    sy = @y - y
    if $game_map.loop_vertical?
      if sy.abs > $game_map.height / 2
        sy -= $game_map.height
      end
    end
    return sy
  end
  
  def close?(x,y)
    sx = (@x - x).abs
    sy = (@y - y).abs
    if sx + sy == 1
      return true
    end
    return false
  end
end









这是漫画式对话框的脚本:


#==============================================================================
# [VX] 漫画式对话框
# [VX] ComicStyle Window_message
#----------------------------------------------------------------------------
# 使用说明:
#
#   ⑴ 关于对话者 (在地图事件里找到对话者,实现漫画式对话)
#      ① 自动抓取对话者名字
#           对于未进行手动填写的,会根据头像的文件名自动抓取对话者名字
#      ② 手动指定对话者名字
#           对话框第一行输入引号内文字"名字:",脚本会把名字提取出来美化显示
#           例如"拉尔夫:",显示为"【拉尔夫】" ,美化符可在参数设定中修改
#           可以使用"\n[队伍第几人]:"获得名字
#      ③ 允许指定事件(对话者)ID
#      ④ 允许暂时停止自动抓取名字
#      ⑤ 允许设定跳过自动抓取名字的头像文件
#      ⑥ 三种指定对话者的方法可以共存
#           优先级: ③ > ② > ①
#           ①和②都必须以对话者名字为地图事件命名
#           事件页无效或暂时消除事件时,③仍然强制指定,即使地图上未显示事件
#
#   ⑵ 默认头像在左边显示
#        当您需要右边显示时,在第一行加"\r"(大小写不限,位置不限)
#        例: "拉尔夫\r:" 请注意此时头像显示为水平翻转
#
#   ⑶ 对话框动态显示功能,但缩放Sprite较消耗系统资源
#
#   ⑷ 使用自定义皮肤, 图片文件保存于Graphics\System内
#                      配置文件保存于游戏文件夹内(Skin.ini)
#
#
#   ⑸ 在对话中更改字体:
#        \f[sX]:更改字号为X
#        \f[nX]:更改字体为X
#               更改字体失败(找不到字体)时,启用默认字体
#        \f[cX]:更改字色为第X号颜色(text_color中的定义)
#
#   ⑹ 在对话中显示(技能 物品 武器 防具)图标和名称:
#        \s[X]: 显示第X号技能图标和名称
#        \i[X]: 显示第X号物品图标和名称
#        \w[X]: 显示第X号武器图标和名称
#        \a[X]: 显示第X号防具图标和名称
#
#   ⑺ 在对话中更改文字不透明度:
#        \o[X]: 把文字不透明度更改为X (取值范围在0~255)
#
#   ⑻ 在对话中指定时间后自动关闭对话框:
#        \x[X]: 对话框将在X帧后自动关闭
#        \x:    省略参数时,将于默认帧数后自动关闭(默认值在参数设定中)
#
#   ⑼ 在对话中调整文字显示速度:
#        \p[X]: 文字在X帧后显示
#
#   ⑽ 指定对话框在人物上方或下方(仅下一段文章有效):
#        在对话前用"事件脚本"输入: ComicStyle "对话框在上"
#                              或: ComicStyle "对话框在下"
#
#   ⑾ 禁用漫画式对话(仅下一段文章有效):
#        在对话前用"事件脚本"输入: ComicStyle "禁用漫画式"
#
#   ⑿ 停止自动抓取名字(仅下一段文章有效):
#        在对话前用"事件脚本"输入: ComicStyle "禁用自动名字"
#
#   ⒀ 指定事件(对话者)ID(仅下一段文章有效):
#        在对话前用"事件脚本"输入: ComicStyle "指定事件[ID号]"
#        主角ID号已设定为 0
#
#   ⒁ 指定新的皮肤:
#        在对话前用"事件脚本"输入: ComicStyle "换皮肤[新的皮肤名]"
#
#   ⒂ 指定背景不透明度:
#        在对话前用"事件脚本"输入: ComicStyle "背景不透明度[0-255]"
#
#   ⒃ 输入文章时设定冻结字符和注释字符:
#        #[XX]: 字符串XX被冻结,不受转义等影响直接显示
#               此功能可用于第一行显示冒号而不会被脚本误识别为对话者名字
#        #<XX>: 字符串XX被当作注释,游戏运行时不会出现
#------------------------------------------------------------------------------
# 素材规格:
#
#   ⑴ 采用vx默认头像素材(Graphics\Faces)的格式
#      即每个素材文件由2行4列共8格头像组成
#
#   ⑵ 所有头像朝向一致,默认是正面偏右
#
#   ⑶ 自定义皮肤有两个必须文件:
#       ① 皮肤图片(Graphics\System),规格请看范例所附图片说明
#       ② 配置文件,统一保存在游戏目录下,命名为Skin.ini,每个皮肤以自身
#          [皮肤图片文件名](包含[])开头,详见范例使用的Skin.ini
#----------------------------------------------------------------------------
#    更新作者: 沉影不器
#    许可协议: FSL
#    项目版本: 2.00.1213
#    引用网址: [url]http://rpg.blue/thread-86073-1-1.html[/url]
#----------------------------------------------------------------------------
#    - *2.1.1213* (2011-12-13) By 沉影不器
#      *新增 切换对话框模式(漫画式 \ 普通模式)
#      *新增 对话框最小宽度和最小高度
#      *新增 手动指定对话者名字
#      *新增 允许首行名字被冻结或被注释
#      *新增 对话者名字启用\n[X]
#      *删简 删除对冒号的补偿转义
#
#    - *2.0.0213* (2011-02-13) By 沉影不器
#      *优化 全部代码重写
#      *优化 自动提取对话者名字功能
#      *优化 两次字符串转义处理合并为一次
#      *优化 改进窗体大小计算,增加行高逐行计算
#      *修改 头像在右的控制符改为"\r"(大小写不限)
#      *新增 自定义对话框皮肤
#      *新增 自定义对话框暂停标记
#      *新增 对话框皮肤不透明度
#      *新增 对话者名字自动美化
#      *新增 对话中修改字体名称、字号和透明度,失败时使用默认字体
#      *新增 显示数据库各种图标及名称
#      *新增 允许不受转义影响的字符串
#      *新增 对话中播放动画和心情
#      *新增 自动关闭对话框
#
#    - *1.1.0517* (2008-05-17) By 沉影不器
#      *修复 消除数值输入影响头像坐标
#      *修复 头像微调错位
#      *新增 附加功能2项
#      *新增 游戏中更改对话框设定多项
#      *优化 对话框箭头图标上下独立
#      *优化 无意义的代码
#
#    - *1.0.0510* (2008-05-10) By 沉影不器
#      *初版
#==============================================================================
$fscript = {} if $fscript == nil
$fscript["ComicStyle_Window_message"] = "2.1.1213"
#----------------------------------------------------------------------------
# ▼ 通用配置模块
#----------------------------------------------------------------------------
module FSL
  module ComicStyle_Window_message
   
    ## 全局
    FastShow = true            ## 是否确定键快速显示文字
    Actional = true            ## 是否动态显示对话框
    AutoClose = 80             ## 默认自动关闭时间(单位:帧)
    TypeDelay = 0              ## 改变全局打字延时(单位:帧)
    LineSpace = 2              ## 文字的行间距
    SkipName = []              ## 跳过自动抓取名字的头像文件
   
    ## 窗体
    Window_MinWidth = 96       ## 对话框最小宽度
    Window_MinHeight = 24      ## 对话框最小高度
    Window_DefWidth = 0        ## 对话框默认宽度(非漫画式时)
    Window_DefHeight = 0       ## 对话框默认高度(非漫画式时)
    Window_MaxLine = 5         ## 对话框最大行数
   
    ## 自定义暂停标记
    Pause_Custom = 3           ## 位置(0:禁用 1:底边居中 2:右下角 3:跟随文字)
    Pause_AniDelay = 8         ## 动画帧间隔(影响动画速度,单位:帧)
   
    ## 皮肤
    Skin_Name = "Default"      ## 对话框皮肤文件名
    Skin_Opacity = 200         ## 皮肤的不透明度
   
  end
end

#==============================================================================
# □ INI
#==============================================================================
module FSL
  module ComicStyle_Window_message
    module_function
    #--------------------------------------------------------------------------
    # ○ 常量
    #--------------------------------------------------------------------------
    RdINI = Win32API.new("kernel32","GetPrivateProfileStringA","pppplp","l")
    WtINI = Win32API.new("kernel32","WritePrivateProfileStringA","pppp","l")
    M2W   = Win32API.new("kernel32","MultiByteToWideChar","ilpipi","l")
    W2M   = Win32API.new("kernel32","WideCharToMultiByte","ilpipipp","l")
    #--------------------------------------------------------------------------
    # ○ 读取配置
    #--------------------------------------------------------------------------
    def readini(app_name, key_name)
      buff = "\0" * 256
      RdINI.call(app_name,key_name,"",buff,buff.size,"./Skin.ini")
      buff.delete!("\0")
      return a2u(buff)
    end
    #--------------------------------------------------------------------------
    # ○ 保存配置
    #--------------------------------------------------------------------------
    def writeini(app_name, key_name, value)
      WtINI.call(app_name,key_name,u2a(value),"./Skin.ini")
    end
    #--------------------------------------------------------------------------
    # ○ ASCII转UTF8
    #--------------------------------------------------------------------------
    def a2u(str)
      len = M2W.call(0,0,str,-1,nil,0)
      buf = "\0" * (len*2)
      M2W.call(0,0,str,-1,buf,buf.size/2)
      len = W2M.call(0xFDE9,0,buf,-1,nil,0,nil,nil)
      ret = "\0" * len
      W2M.call(0xFDE9,0,buf,-1,ret,ret.size,nil,nil)
      return ret.delete!("\0")
    end
    #--------------------------------------------------------------------------
    # ○ UTF8转ASCII
    #--------------------------------------------------------------------------
    def u2a(str)
      len = M2W.call(0xFDE9,0,str,-1,nil,0)
      buf = "\0" * (len*2)
      M2W.call(0xFDE9,0,str,-1,buf,buf.size/2)
      len = W2M.call(0,0,buf,-1,nil,0,nil,nil)
      ret = "\0" * len
      W2M.call(0,0,buf,-1,ret,ret.size,nil,nil)
      return ret.delete!("\0")
    end
  end
end

#==============================================================================
# ■ Bitmap
#==============================================================================
class Bitmap
  #--------------------------------------------------------------------------
  # ○ 平铺
  #--------------------------------------------------------------------------
  def tile(dest_rect, src_bitmap, src_rect, opacity = 255)
    m = dest_rect.width / src_rect.width
    n = dest_rect.height / src_rect.height
    m += 1 if dest_rect.width % src_rect.width > 0
    n += 1 if dest_rect.height % src_rect.height > 0
    buf = Bitmap.new(dest_rect.width, dest_rect.height)
    for i in 0...m
      x = src_rect.width * i
      for j in 0...n
        y = src_rect.height * j
        buf.blt(x, y, src_bitmap, src_rect)
      end
    end
    src_rect = Rect.new(0, 0, dest_rect.width, dest_rect.height)
    self.blt(dest_rect.x, dest_rect.y, buf, src_rect, opacity)
    buf.dispose
  end
end

#==============================================================================
# ■ Game_Message
#==============================================================================
class Game_Message
  include FSL::ComicStyle_Window_message
  #--------------------------------------------------------------------------
  # ◎ 定义实例变量
  #--------------------------------------------------------------------------
  ## 标题
  attr_accessor :title_symbol      ## 为名字添加的修饰符(一对)
  attr_accessor :title_spaceh      ## 名字与对话内容之间的附加距离
  attr_accessor :title_fontname    ## 名字使用的字体
  attr_accessor :title_fontsize    ## 名字使用的字号
  attr_accessor :title_fontcolor   ## 名字使用的字体颜色
  ## 内容
  attr_accessor :content_fontname  ## 对话内容使用的字体
  attr_accessor :content_fontsize      ## 对话内容使用的字号
  attr_accessor :content_fontcolor ## 对话内容使用的字体颜色
  ## 头像
  attr_accessor :face_type         ## 头像制式(0:小头像 1:半身像)
  attr_accessor :face_indentx      ## 头像横坐标微调
  attr_accessor :face_indenty      ## 头像纵坐标微调
  attr_accessor :face_reserved     ## 头像的保留空间(与对话文字的保留间隔)
  ## 皮肤
  attr_accessor :skin_pauseframe   ## 暂停标记的动画帧数(1-5)
  attr_accessor :skin_pausex       ## 暂停标记的x坐标微调
  attr_accessor :skin_pausey       ## 暂停标记的y坐标微调
  attr_accessor :skin_indent       ## 对话框内缩(用于减小框与文字的边距)
  attr_accessor :skin_namegauge    ## 增加名字条和上边框的间距
  attr_accessor :skin_adjarrow     ## 漫画式箭头横向偏移值
  attr_accessor :skin_adjtx        ## 名字背景条横向偏移值
  attr_accessor :skin_adjty        ## 名字背景条纵向偏移值
  attr_accessor :skin_et           ## 名字背景条高度加成值
  attr_accessor :skin_it           ## 名字背景条横向内缩值
  attr_accessor :skin_ib           ## 皮肤背景内缩值
                                   ##   请参考vx帮助文件-素材规格-窗口皮肤
  #--------------------------------------------------------------------------
  # ○ 设定参数
  #--------------------------------------------------------------------------
  def set_arg(app_name)
    @title_symbol = readini(app_name, "Title_Symbol")
    @title_spaceh = readini(app_name, "Title_SpaceH").to_i
    @title_fontname = readini(app_name, "Title_FontName")
    @title_fontsize = readini(app_name, "Title_FontSize").to_i
    @title_fontcolor = readini(app_name, "Title_FontColor").to_i
    @content_fontname = readini(app_name, "Content_FontName")
    @content_fontsize = readini(app_name, "Content_FontSize").to_i
    @content_fontcolor = readini(app_name, "Content_FontColor").to_i
    @face_type = readini(app_name, "Face_Type").to_i
    @face_indentx = readini(app_name, "Face_IndentX").to_i
    @face_indenty = readini(app_name, "Face_IndentY").to_i
    @face_reserved = readini(app_name, "Face_Reserved").to_i   
    @skin_pauseframe = readini(app_name, "Skin_PauseFrame").to_i
    @skin_pausex = readini(app_name, "Skin_PauseX").to_i
    @skin_pausey = readini(app_name, "Skin_PauseY").to_i
    @skin_indent = readini(app_name, "Skin_Indent").to_i
    @skin_namegauge = readini(app_name, "Skin_NameGauge").to_i
    @skin_adjarrow = readini(app_name, "Skin_AdjArrow").to_i
    @skin_adjtx = readini(app_name, "Skin_AdjTx").to_i
    @skin_adjty = readini(app_name, "Skin_AdjTy").to_i
    @skin_et = readini(app_name, "Skin_ET").to_i
    @skin_it = readini(app_name, "Skin_IT").to_i
    @skin_ib = readini(app_name, "Skin_IB").to_i
  end
end

#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
  attr_reader   :erased                 ## 被擦除
  attr_reader   :page                   ## 事件页
  #--------------------------------------------------------------------------
  # ○ 获取名称
  #--------------------------------------------------------------------------
  def name
    return @event.name
  end
end

#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ○ 漫画式开关
  #--------------------------------------------------------------------------
  def ComicStyle(str)
    msg_win = $scene.instance_variable_get :@message_window
    ## 直接匹配
    msg_win.instance_variable_set :@fix_type, 2 if str =~ /对话框在上/
    msg_win.instance_variable_set :@fix_type, 8 if str =~ /对话框在下/
    msg_win.instance_variable_set :@comic_style, false if str =~ /禁用漫画式/
    msg_win.instance_variable_set :@auto_name, false if str =~ /禁用自动名字/
    ## 待解释
    str.sub(/换皮肤\[(\S+)\]/) {"#{$1}"}
    msg_win.set_skin($1) if $1
    str.sub(/指定事件\[(\d+)\]/) {"#{$1}"}
    msg_win.instance_variable_set :@target_id, $1.to_i if $1
    str.sub(/背景不透明度\[(\d+)\]/) {"#{$1}"}
    msg_win.instance_variable_set :@skin_opacity, $1.to_i if $1
  end
end

#==============================================================================
# ■ Sprite_Character
#==============================================================================
class Sprite_Character < Sprite_Base
  #--------------------------------------------------------------------------
  # ◎ 开始显示心情图标
  #--------------------------------------------------------------------------
  def start_balloon
    dispose_balloon
    @balloon_duration = 8 * 8 + BALLOON_WAIT
    @balloon_sprite = ::Sprite.new##(viewport)
    @balloon_sprite.bitmap = Cache.system("Balloon")
    @balloon_sprite.ox = 16
    @balloon_sprite.oy = 32
    update_balloon
  end
end

#==============================================================================
# □ Spriteset_Skin
#==============================================================================
class Spriteset_Skin
  include FSL::ComicStyle_Window_message
  #--------------------------------------------------------------------------
  # ○ 实例变量
  #--------------------------------------------------------------------------
  attr_reader   :type                   ## 指定上箭头或下箭头
  #--------------------------------------------------------------------------
  # ○ 初始化
  #--------------------------------------------------------------------------
  def initialize(filename, width, height, type = 2)
    @type =type
    @bitmap = Cache.system(filename)
    @main_sprite = Sprite.new
    @main_sprite.bitmap = Bitmap.new(width, height + 32)
    draw_skin(width, height + 32)
    if Actional
      @main_sprite.zoom_x = @main_sprite.zoom_y = 0
      self.visible = false
    else
      @main_sprite.zoom_x = @main_sprite.zoom_y = 1
      self.visible = true
    end
  end
  #--------------------------------------------------------------------------
  # ○ 释放
  #--------------------------------------------------------------------------
  def dispose
    @main_sprite.bitmap.dispose
    @main_sprite.dispose
    @sprite_2.bitmap.dispose
    @sprite_8.bitmap.dispose
    @sprite_2.dispose
    @sprite_8.dispose
  end
  #--------------------------------------------------------------------------
  # ○ 宽度
  #--------------------------------------------------------------------------
  def width
    return @main_sprite.bitmap.width
  end
  #--------------------------------------------------------------------------
  # ○ 高度
  #--------------------------------------------------------------------------
  def height
    return @main_sprite.bitmap.height
  end
  #--------------------------------------------------------------------------
  # ○ X原点
  #--------------------------------------------------------------------------
  def ox
    return @main_sprite.ox
  end
  #--------------------------------------------------------------------------
  # ○ Y原点
  #--------------------------------------------------------------------------
  def oy
    return @main_sprite.oy
  end
  #--------------------------------------------------------------------------
  # ○ X坐标
  #--------------------------------------------------------------------------
  def x
    return @main_sprite.x
  end
  #--------------------------------------------------------------------------
  # ○ Y坐标
  #--------------------------------------------------------------------------
  def y
    return @main_sprite.y
  end
  #--------------------------------------------------------------------------
  # ○ Z坐标
  #--------------------------------------------------------------------------
  def z
    return @main_sprite.z
  end
  #--------------------------------------------------------------------------
  # ○ 修改X坐标
  #--------------------------------------------------------------------------
  def x=(val)
    @main_sprite.x = val
    @sprite_2.x = val - @main_sprite.ox + 16
    @sprite_8.x = val - @main_sprite.ox + 16
  end
  #--------------------------------------------------------------------------
  # ○ 修改Y坐标
  #--------------------------------------------------------------------------
  def y=(val)
    @main_sprite.y = val
    @sprite_2.y = val - @main_sprite.oy + @main_sprite.height - 32
    @sprite_8.y = val - @main_sprite.oy
  end
  #--------------------------------------------------------------------------
  # ○ 修改Z坐标
  #--------------------------------------------------------------------------
  def z=(val)
    @main_sprite.z = val
    @sprite_2.z = val + 1
    @sprite_8.z = val + 1
  end
  #--------------------------------------------------------------------------
  # ○ 修改可视性
  #--------------------------------------------------------------------------
  def visible=(val)
    @main_sprite.visible = val
    @sprite_2.visible = val
    @sprite_8.visible = val
  end
  #--------------------------------------------------------------------------
  # ○ 更改类型
  #--------------------------------------------------------------------------
  def type=(val)
    if @type != val
      @type = val
      @sprite_8.src_rect.x,@sprite_2.src_rect.x =
      @sprite_2.src_rect.x,@sprite_8.src_rect.x
    end
  end
  #--------------------------------------------------------------------------
  # ○ 修改不透明度
  #--------------------------------------------------------------------------
  def opacity=(val)
    @main_sprite.opacity = val
    @sprite_2.opacity = val
    @sprite_8.opacity = val
  end
  #--------------------------------------------------------------------------
  # ○ 显示标题
  #--------------------------------------------------------------------------
  def draw_title(height)
    x = $game_message.skin_it + $game_message.skin_adjtx
    y = $game_message.skin_adjty + 32 - $game_message.skin_indent + $game_message.skin_namegauge
    width = @main_sprite.width - $game_message.skin_it*2
    dst_rect = Rect.new(x, y, width, height + $game_message.skin_et)
    src_rect = Rect.new(96,80,24,32)
    @main_sprite.bitmap.stretch_blt(dst_rect, @bitmap, src_rect)
    dst_rect = Rect.new(x, y, width, height + $game_message.skin_et)
    src_rect = Rect.new(120,80,24,32)
    @main_sprite.bitmap.tile(dst_rect, @bitmap, src_rect)
  end
  #--------------------------------------------------------------------------
  # ○ 描绘底面
  #--------------------------------------------------------------------------
  def draw_skin(width, height)
    ## 背景
    dst_rect = Rect.new($game_message.skin_ib,$game_message.skin_ib+16,width-$game_message.skin_ib*2,height-$game_message.skin_ib*2-32)
    src_rect = Rect.new(0,0,64,64)
    @main_sprite.bitmap.stretch_blt(dst_rect, @bitmap, src_rect)
    src_rect = Rect.new(0,64,64,64)
    @main_sprite.bitmap.tile(dst_rect, @bitmap, src_rect)
    ## 四角
    src_rect = Rect.new(64,16,16,16)
    @main_sprite.bitmap.blt(0, 16, @bitmap, src_rect)
    src_rect = Rect.new(128,16,16,16)
    @main_sprite.bitmap.blt(width-16, 16, @bitmap, src_rect)
    src_rect = Rect.new(64,48,16,16)
    @main_sprite.bitmap.blt(0, height-32, @bitmap, src_rect)
    src_rect = Rect.new(128,48,16,16)
    @main_sprite.bitmap.blt(width-16, height-32, @bitmap, src_rect)
    ## 左右边框
    dst_rect=Rect.new(0,32,16,height-64)
    src_rect=Rect.new(64,32,16,16)
    @main_sprite.bitmap.stretch_blt(dst_rect, @bitmap, src_rect)
    dst_rect=Rect.new(width-16,32,16,height-64)
    src_rect=Rect.new(128,32,16,16)
    @main_sprite.bitmap.stretch_blt(dst_rect, @bitmap, src_rect)
    ## 箭头(上下框)
    draw_arrow(width-32, height)
  end
  #--------------------------------------------------------------------------
  # ○ 描绘箭头
  #--------------------------------------------------------------------------
  def draw_arrow(width, height)
    @sprite_2 = Sprite.new
    @sprite_8 = Sprite.new
    @sprite_2.bitmap = Bitmap.new(width*2+16, 32)
    @sprite_8.bitmap = Bitmap.new(width*2+16, 32)
    ##2
    dst_rect=Rect.new(0, 0, width, 32)
    src_rect=Rect.new(80,48,16,32)
    @sprite_2.bitmap.stretch_blt(dst_rect, @bitmap, src_rect)
    dst_rect=Rect.new(width+16,0,width, 32)
    src_rect=Rect.new(112,48,16,32)
    @sprite_2.bitmap.stretch_blt(dst_rect, @bitmap, src_rect)
    src_rect=Rect.new(96,48,16,32)
    @sprite_2.bitmap.blt(width, 0, @bitmap, src_rect)
    ## 8
    dst_rect=Rect.new(0, 0, width, 32)
    src_rect=Rect.new(80,0,16,32)
    @sprite_8.bitmap.stretch_blt(dst_rect, @bitmap, src_rect)
    dst_rect=Rect.new(width+16,0,width, 32)
    src_rect=Rect.new(112,0,16,32)
    @sprite_8.bitmap.stretch_blt(dst_rect, @bitmap, src_rect)
    src_rect=Rect.new(96,0,16,32)
    @sprite_8.bitmap.blt(width, 0, @bitmap, src_rect)
    ## 位图区域
    @sprite_2.src_rect = @sprite_8.src_rect = Rect.new(0,0,width,32)
  end
  #--------------------------------------------------------------------------
  # ○ 移动箭头
  #--------------------------------------------------------------------------
  def slide(val)
    ## 微调 + 箭头宽度/2
    val += $game_message.skin_adjarrow + 8
    val = [@main_sprite.width-32, [@main_sprite.width-val, 16].max].min
    @sprite_2.src_rect.x = val if @type == 2
    @sprite_8.src_rect.x = val if @type == 8
  end
  #--------------------------------------------------------------------------
  # ○ 动作
  #--------------------------------------------------------------------------
  def action(openness)
    case @type
    when 2
      @main_sprite.ox = width - @sprite_2.src_rect.x - 8
      @main_sprite.oy = @main_sprite.height - 16
    when 8
      @main_sprite.ox = width - @sprite_8.src_rect.x - 8
      @main_sprite.oy = 16
    when nil
      @main_sprite.ox = @main_sprite.width / 2
      @main_sprite.oy = @main_sprite.height / 2
    end
    zoom = openness / 255.0
    @main_sprite.zoom_x = zoom
    @main_sprite.zoom_y = zoom
    if openness == 255
      self.visible = true
      ## 还原
      if @backup
        @main_sprite.bitmap.clear_rect(16, 0, width-32, 32)
        @main_sprite.bitmap.clear_rect(16, height-32, width-32, 32)
        @main_sprite.bitmap.blt(16, 0, @backup, Rect.new(0,0,width-32,32))
        @main_sprite.bitmap.blt(16, height-32, @backup, Rect.new(0,32,width-32,32))
        @backup.dispose
      end
    else
      @main_sprite.visible = true
      @sprite_2.visible = @sprite_8.visible = false
      ## 临时描绘
      unless @backup
        @backup = Bitmap.new(width-32,64)
        r = Rect.new(16, 0, width-32, 32)
        @backup.blt(0, 0, @main_sprite.bitmap, r)
        r = Rect.new(16, height-32, width-32, 32)
        @backup.blt(0, 32, @main_sprite.bitmap, r)
        @main_sprite.bitmap.blt(16, 0, @sprite_8.bitmap, @sprite_8.src_rect)
        @main_sprite.bitmap.blt(16, height-32, @sprite_2.bitmap, @sprite_2.src_rect)
      end
    end
  end
end

#==============================================================================
# ■ Window_Selectable
#==============================================================================
class Window_Selectable < Window_Base
  #--------------------------------------------------------------------------
  # ◎ 更新画面
  #--------------------------------------------------------------------------
  alias selectable_update update
end

#==============================================================================
# ■ Window_NumberInput
#==============================================================================
class Window_NumberInput < Window_Base
  include FSL::ComicStyle_Window_message
  #--------------------------------------------------------------------------
  # ◎ 刷新
  #--------------------------------------------------------------------------
  def refresh
    self.contents.clear
    self.contents.font.color = normal_color
    s = sprintf("%0*d", @digits_max, @number)
    h = self.contents.font.size + LineSpace
    for i in 0...@digits_max
      self.contents.draw_text(24 + i * h, 0, h, h, s[i,1], 1)
    end
  end
  #--------------------------------------------------------------------------
  # ◎ 更新光标
  #--------------------------------------------------------------------------
  def update_cursor
    h = self.contents.font.size + LineSpace
    self.cursor_rect.set(24 + @index * h, 0, h, h)
  end
end

#==============================================================================
# □ Window_ComicStyle
#==============================================================================
class Window_ComicStyle < Window_Message
  include FSL::ComicStyle_Window_message
  #--------------------------------------------------------------------------
  # ◎ 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super
    self.opacity = 0
    ## 冻结字符池
    @frozen_char = []
    ## 头像右判断
    @show_right = false
    ## 指定上下型
    @fix_type = 0
    ## 自定义暂停标记
    @custom_pause = false
    ## 本行最大高度
    @line_maxh = []
    ## 漫画式标志
    @comic_style = true
    ## 手动输入名字
    @auto_name = true
    ## 指定事件ID
    @target_id = nil
    ## 设定系统窗体的皮肤
    set_skin(Skin_Name)
    ## 修改默认字体
    contents.font = default_font
    ## 皮肤不透明度
    @skin_opacity = Skin_Opacity
    ## 生成头像
    create_face_sprite
  end
  #--------------------------------------------------------------------------
  # ○ 设定皮肤
  #--------------------------------------------------------------------------
  def set_skin(skin_name)
    ## 名字
    @skin_name = skin_name
    ## 参数
    $game_message.set_arg(skin_name)
    ## 选择框
    src_bitmap = Cache.system @skin_name
    src_rect = Rect.new(64, 80, 32, 32)
    new_skin = self.windowskin.clone
    new_skin.blt(64, 64, src_bitmap, src_rect)
    @number_input_window.windowskin = self.windowskin = new_skin
    ## 字体
    @number_input_window.contents.font = @gold_window.contents.font = default_font
    ## 暂停标记
    create_pause_sprite
  end
  #--------------------------------------------------------------------------
  # ◎ 更新画面
  #--------------------------------------------------------------------------
  def update
    selectable_update
    update_gold_window
    update_number_input_window
    update_back_sprite
    update_show_fast
    ## 更新自定义暂停标记
    update_pause_sprite
    unless @opening or @closing             # 除窗体关闭以外
      if @wait_count > 0                    # 文章内等待中
        @wait_count -= 1
      elsif @custom_pause                   # 等待文章翻页待机中
        input_pause
      elsif self.active                     ## 正在输入选择项
        input_choice
      elsif @number_input_window.visible    # 正在输入数值
        input_number
      elsif @text != nil                    # 还有剩余的文章
        update_message                        # 更新消息
      elsif continue?                       # 继续的情况
        start_message                       # 开始消息
        ## 更新窗体坐标
        update_window_pos
        open                                  # 打开窗体
        $game_message.visible = true
      else                                  # 不继续的情况
        close                                 # 关闭窗体
        $game_message.visible = @closing
      end
      ## 更新窗体坐标
      update_window_pos
    end
    ## 自动关闭对话框
    if @auto_close != nil
      if @auto_close > 0
        @auto_close -= 1
      else
        terminate_message
      end
    end
  end
  #--------------------------------------------------------------------------
  # ◎ 更新快速显示标志
  #--------------------------------------------------------------------------
  def update_show_fast
    if @custom_pause or self.openness < 255
      @show_fast = false
    elsif Input.trigger?(Input::C)
      if FastShow ## 快速显示文字
        @show_fast = true
        @wait_count = 0
      end
    elsif not Input.press?(Input::C)
      @show_fast = false
    end
    if @show_fast and @wait_count > 0
      @wait_count -= 1
    end
  end
  #--------------------------------------------------------------------------
  # ◎ 开始显示消息
  #--------------------------------------------------------------------------
  def start_message
    @text = ""
    ## 回避无文章的情况
    unless $game_message.texts.empty?
      ## 暂存消息
      tmp_texts = []
      $game_message.texts.each{|text| tmp_texts.push text.clone}
      ## 特定字符预处理
      tmp_texts[0].gsub!(/#\[(.*?)\]/)   { @frozen_char.push($1); "\xff" }
      tmp_texts[0].gsub!(/#\<(.*?)\>/)   { "" }
      tmp_texts[0].gsub!(/\\N\[(\d+)\]/i){ $game_actors[$1.to_i].name }
      ## 判断头像朝向
      @show_right = tmp_texts[0].sub!(/\\R/i){""} != nil
      ## 处理名字
      if tmp_texts[0].sub!(/[::]/){""}
        ## 手动输入
        unless tmp_texts[0].sub("\xff\]"){""}.empty?
          @name = tmp_texts[0].clone
        end
      end
      if @auto_name and show_face? and @name.nil?
        ## 自动抓取
        unless SkipName.include? $game_message.face_name
          @name = $game_message.face_name
          tmp_texts.unshift @name
          $game_message.choice_start += 1
        end
      end
      ## 名字美化
      if show_name?
        ## 去冒号加修饰符(可选)
        unless $game_message.title_symbol.empty?
          size = $game_message.title_symbol.size/2
          tmp_texts[0] = $game_message.title_symbol[0, size] +
          tmp_texts[0] + $game_message.title_symbol[size, size]
        end
        ## 设定文字颜色
        tmp_texts[0] = "\\C[#{$game_message.title_fontcolor}]" +
        tmp_texts[0] + "\\C[#{$game_message.content_fontcolor}]"
        ## 设定文字字体
        tmp_texts[0] = "\\F[N#{$game_message.title_fontname}]" +
        tmp_texts[0] + "\\F[N#{$game_message.content_fontname}]"
        ## 设定文字大小
        tmp_texts[0] = "\\F[S#{$game_message.title_fontsize}]" +
        tmp_texts[0] + "\\F[S#{$game_message.content_fontsize}]"
        ## 内容缩进
        for i in 1...tmp_texts.size
          tmp_texts[i] = " " + tmp_texts[i]
        end
      end
      for i in 0...tmp_texts.size
        @text += "  " if i >= $game_message.choice_start
        @text += tmp_texts[i].clone + "\x00"
      end
    end
    @item_max = $game_message.choice_max
    get_target
    convert_special_characters
    new_page #条件:@show_right
    ## 重设窗体背景与位置
    reset_window(*get_window_size) #条件:@text @name
  end
  #--------------------------------------------------------------------------
  # ◎ 更换页面处理
  #--------------------------------------------------------------------------
  def new_page
    contents.clear
    ## 初始化文字描绘起点
    @contents_x = 0
    if show_face?
      refresh_face_sprite
      ## 计算文字横坐标起始
      @contents_x += face_width + $game_message.face_reserved unless @show_right
    else
      @face_sprite.bitmap.clear
    end
    @contents_y = 0
    @line_count = 0
    @show_fast = false
    @line_show_fast = false
    @pause_skip = false
  end
  #--------------------------------------------------------------------------
  # ◎ 换行处理
  #--------------------------------------------------------------------------
  def new_line
    ## 提前处理自定义暂停标记
    set_pause_sprite_pos
    @contents_x = 0
    if show_face? and !@show_right
      @contents_x = face_width + $game_message.face_reserved
    end
    @contents_y += @line_maxh[@line_count]
    @line_count += 1
    @line_show_fast = false
  end
  #--------------------------------------------------------------------------
  # ◎ 特殊文字变换
  #--------------------------------------------------------------------------
  def convert_special_characters
    ## 特定字符处理
    @text.gsub!(/#\[(.*?)\]/)    {@frozen_char.push($1); "\xff"}
    @text.gsub!(/#\<(.*?)\>/)    {""}
    ## 更改不透明度
    @text.gsub!(/\\O\[(\d+)\]/i) {"\x09[#{$1}]"}
    ## 显示数据库元素
    @text.gsub!(/\\S\[(\d+)\]/i) {"\x0a[#{$1}]" + $data_skills[$1.to_i].name}
    @text.gsub!(/\\I\[(\d+)\]/i) {"\x0b[#{$1}]" + $data_items[$1.to_i].name}
    @text.gsub!(/\\W\[(\d+)\]/i) {"\x0c[#{$1}]" + $data_weapons[$1.to_i].name}
    @text.gsub!(/\\A\[(\d+)\]/i) {"\x0d[#{$1}]" + $data_armors[$1.to_i].name}
    ## 更改字体
    @text.gsub!(/\\F\[S(\d+)\]/i){"\x0e[#{$1}]"}
    @text.gsub!(/\\F\[N(.+?)\]/i){"\x0f[#{$1}]"}
    @text.gsub!(/\\F\[C(\d+)\]/i){"\x01[#{$1}]"}
    ## 字速控制
    @text.gsub!(/\\P\[(\d+)\]/i) {"\x10[#{$1}]"}
    ## 自动关闭
    @text.gsub!(/\\X\[(\d+)\]/i) {"\x11[#{$1}]"}
    @text.gsub!(/\\X/i)          {"\x12"}
    ## 提取动画对象和 ID
    @text.gsub!(/\\A\[(\S+)\,(\d+)\]/i) {"\x13[#{$1},#{$2}]"}
    @text.gsub!(/\\B\[(\S+)\,(\d+)\]/i) {"\x14[#{$1},#{$2}]"}
    super
  end
  #--------------------------------------------------------------------------
  # ◎ 设置窗体背景与位置
  #--------------------------------------------------------------------------
  def reset_window(width = nil, height = nil)
    unless width.nil? || height.nil?
      self.width = width
      self.height = height
      font = self.contents.font.clone
      self.contents.dispose
      self.contents = Bitmap.new(width - 32, height - 32)
      ## 修改默认字体
      contents.font = font
      ## 坐标
      if comic_style?
        if @target.x < visual_width / 2
          self.x = -$game_message.skin_indent
        elsif @target.x > Graphics.width - visual_width / 2
          self.x = Graphics.width - visual_width - $game_message.skin_indent
        else
          self.x = @target.x - visual_width / 2
        end
        if @target.y < visual_height
          self.y = @target.y - $game_message.skin_indent
          type = 8
        else
          self.y = @target.y - @target.height - self.height + $game_message.skin_indent
          type = 2
        end
        ## 修复名字条预留
        self.y += $game_message.skin_namegauge if show_name? and type == 8
      else
        self.x = (Graphics.width - self.width) / 2
        case $game_message.position
        when 0  # 上
          self.y = visual_height-self.height
          @gold_window.y = 360
        when 1  # 中
          self.y = (Graphics.height - self.height) / 2
          @gold_window.y = 0
        when 2  # 下
          self.y = $game_message.skin_indent + Graphics.height - self.height
          @gold_window.y = 0
        end
      end
      ## 皮肤
      create_skin_sprite(width, height, type)
      @skin_sprite.draw_title(self.contents.font.size) if show_name?
      @skin_sprite.x = self.x + $game_message.skin_indent + @skin_sprite.ox
      @skin_sprite.y = self.y + $game_message.skin_indent - 16 + @skin_sprite.oy
      @skin_sprite.y -= $game_message.skin_namegauge if show_name?
      @skin_sprite.opacity = @skin_opacity
    end
  end
  #--------------------------------------------------------------------------
  # ○ 更新窗体坐标
  #--------------------------------------------------------------------------
  def update_window_pos
    return unless self.openness == 255 or Actional
    return unless comic_style?
    return unless @skin_sprite
    ## 超出屏幕时
    unless within_screen_range?(@target)
      self.x = (Graphics.width - self.width) / 2
      case $game_message.position
      when 0  # 上
        self.y = 0
        @gold_window.y = 360
      when 1  # 中
        self.y = (Graphics.height - self.height) / 2
        @gold_window.y = 0
      when 2  # 下
        self.y = $game_message.skin_indent + Graphics.height - self.height
        @gold_window.y = 0
      end
      ## 取消箭头
      @skin_sprite.slide(0)
      return
    end
    ## 指定上下型
    @skin_sprite.type = @fix_type if @fix_type != 0
    ## 处理X
    if @target.x < visual_width / 2
      self.x = -$game_message.skin_indent
    elsif @target.x > Graphics.width - visual_width / 2
      self.x = Graphics.width - visual_width - $game_message.skin_indent
    else
      self.x = @target.x - visual_width / 2
    end
    ## 处理Y
    case @skin_sprite.type
    when 2
      if @target.y < visual_height + @target.height
        self.y = @target.y - $game_message.skin_indent
        type = 8
      else
        self.y = @target.y - @target.height - self.height + $game_message.skin_indent
      end
    when 8
      if @target.y < visual_height
        self.y = @target.y - $game_message.skin_indent
      elsif @target.y > Graphics.height - self.height - $game_message.skin_indent
        self.y = @target.y - @target.height - self.height + $game_message.skin_indent
        type = 2
      else
        self.y = @target.y - $game_message.skin_indent
      end
    end
    ## 修改上下型
    @skin_sprite.type = type if @skin_sprite and type
    ## 修复名字条预留
    self.y += $game_message.skin_namegauge if show_name? and @skin_sprite.type == 8
    ## 皮肤箭头
    val = @target.x - self.x - $game_message.skin_indent
    if @skin_sprite
      @skin_sprite.slide(val)
      @skin_sprite.x = self.x + $game_message.skin_indent + @skin_sprite.ox
      @skin_sprite.y = self.y + $game_message.skin_indent - 16 + @skin_sprite.oy
      @skin_sprite.y -= $game_message.skin_namegauge if show_name?
    end
    ## 金钱窗体
    @gold_window.y = self.y > @gold_window.height ? 0 : 360
  end
  #--------------------------------------------------------------------------
  # ◎ 消息结束
  #--------------------------------------------------------------------------
  def terminate_message
    @fix_type = 0
    @custom_pause = false
    @auto_close = nil
    @name = nil
    @face_sprite.visible = false if @face_sprite
    @skin_sprite.dispose
    @skin_sprite = nil
    @comic_style = true
    @auto_name = true
    @target_id = nil
    super
    close
  end
  #--------------------------------------------------------------------------
  # ◎ 消息更新结束
  #--------------------------------------------------------------------------
  def finish_message
    if $game_message.choice_max > 0
      start_choice
    elsif $game_message.num_input_variable_id > 0
      start_number_input
    elsif @pause_skip
      terminate_message
    else
      @custom_pause = true
    end
    @wait_count = 10
    @text = nil
    @speed = nil
  end
  #--------------------------------------------------------------------------
  # ◎ 更新消息
  #--------------------------------------------------------------------------
  def update_message
    loop do
      c = @text.slice!(/./m)            # 获取下一条文字
      case c
      when nil                          # 没有可以显示的文字
        finish_message                  # 更新结束
        break
      when "\x00"                       # 换行
        new_line
        if @line_count >= Window_MaxLine# 行数为最大时
          unless @text.empty?           # 如果还有增加则继续
            ## 暂停
            @custom_pause = true        # 等待输入
            break
          end
        end
      when "\x01"                       # \C[n]  (更改文字色)
        @text.sub!(/\[([0-9]+)\]/, "")
        contents.font.color = text_color($1.to_i)
        next
      when "\x02"                       # \G  (显示所持金)
        @gold_window.refresh
        @gold_window.open
      when "\x03"                       # \.  (等待 1/4 秒)
        @wait_count = 15
        break
      when "\x04"                       # \|  (等待 1 秒)
        @wait_count = 60
        break
      when "\x05"                       # \!  (等待输入)
        @custom_pause = true
        break
      when "\x06"                       # \>  (瞬间显示 ON)
        @line_show_fast = true
      when "\x07"                       # \<  (瞬间显示 OFF)
        @line_show_fast = false
      when "\x08"                       # \^  (不等待输入)
        @pause_skip = true
      ## 更改不透明度的情况下
      when "\x09"
        @text.sub!(/\[(\d+)\]/, "")
        contents.font.color.alpha = $1.to_i
      ## 显示技能情况下
      when "\x0a"
        @text.sub!(/\[(\d+)\]/, "")
        draw_icon($data_skills[$1.to_i].icon_index, @contents_x, @contents_y)
        ## 横坐标增加图标宽度
        @contents_x += 24
      ## 显示物品情况下
      when "\x0b"
        @text.sub!(/\[(\d+)\]/, "")
        draw_icon($data_items[$1.to_i].icon_index, @contents_x, @contents_y)
        ## 横坐标增加图标宽度
        @contents_x += 24
      ## 显示武器情况下
      when "\x0c"
        @text.sub!(/\[(\d+)\]/, "")
        draw_icon($data_weapons[$1.to_i].icon_index, @contents_x, @contents_y)
        ## 横坐标增加图标宽度
        @contents_x += 24
      ## 显示防具情况下
      when "\x0d"
        @text.sub!(/\[(\d+)\]/, "")
        draw_icon($data_armors[$1.to_i].icon_index, @contents_x, @contents_y)
        ## 横坐标增加图标宽度
        @contents_x += 24
      ## 更改字体的情况下
      when "\x0e"
        @text.sub!(/\[(\d+)\]/, "")
        contents.font.size = $1.to_i
      when "\x0f"
        @text.sub!(/\[(.+?)\]/, "")
        contents.font.name = Font.exist?($1) ? $1 : Font.default_name
      ## \P[n] (字速)
      when "\x10"
        @text.sub!(/\[(\d+)\]/, "")
        ## 获取字体显示速度
        @speed = $1.to_i
      ## 自动关闭对话框的情况下
      when "\x11"
        @text.sub!(/\[(\d+)\]/, "")
        @auto_close = $1.to_i
      when "\x12"
        @auto_close = AutoClose
      ## 显示角色动画
      when "\x13"
        @text.sub!(/\[(\S+)\,(\d+)\]/, "")
        character = interpreter.get_character($1.to_i)
        character.animation_id = $2.to_i unless character.nil?
        next
      ## 显示心情动画
      when "\x14"
        @text.sub!(/\[(\S+)\,(\d+)\]/, "")
        character = interpreter.get_character($1.to_i)
        character.balloon_id = $2.to_i unless character.nil?
        next
      ## 特定字符处理
      when "\xff"
        @text.insert(0, @frozen_char.shift)
      else
        ## 字速控制
        @wait_count = TypeDelay
        @wait_count = @speed if @speed != nil
        contents.draw_text(@contents_x, @contents_y, contents.font.size, @line_maxh[@line_count], c)
        c_width = contents.text_size(c).width
        @contents_x += c_width
      end
      break unless @show_fast or @line_show_fast
    end
  end
  #--------------------------------------------------------------------------
  # ◎ 开始输入数值
  #--------------------------------------------------------------------------
  def start_number_input
    digits_max = $game_message.num_input_digits_max
    number = $game_variables[$game_message.num_input_variable_id]
    @number_input_window.digits_max = digits_max
    @number_input_window.number = number
    @number_input_window.x = x
    ## 代入头像宽度
    @number_input_window.x += face_width if show_face? and !@show_right
    @number_input_window.y = y + @contents_y
    @number_input_window.active = true
    @number_input_window.visible = true
    @number_input_window.update
  end
  #--------------------------------------------------------------------------
  # ◎ 更新光标
  #--------------------------------------------------------------------------
  def update_cursor
    if @index >= 0
      x = $game_message.skin_indent
      x += face_width + $game_message.face_reserved if show_face? and !@show_right
      y = 0
      for i in 0...$game_message.choice_start + @index
        y += @line_maxh[i]
      end
      width = contents.width - x
      height = @line_maxh[$game_message.choice_start + @index]
      self.cursor_rect.set(x, y, width, height)
    else
      self.cursor_rect.empty
    end
  end
  #--------------------------------------------------------------------------
  # ◎ 文章显示输入处理
  #--------------------------------------------------------------------------
  def input_pause
    if Input.trigger?(Input::C) or Input.trigger?(Input::B)
      ## 还原自定义暂停标记
      @custom_pause = false
      unless @text.nil? or @text.empty?
        new_page if @line_count >= Window_MaxLine
      else
        terminate_message
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ 是否启用漫画式
  #--------------------------------------------------------------------------
  def comic_style?
    return @comic_style && [email protected]?
  end
  #--------------------------------------------------------------------------
  # ○ 是否显示名字
  #--------------------------------------------------------------------------
  def show_name?
    return [email protected]?
  end
  #--------------------------------------------------------------------------
  # ○ 是否显示头像
  #--------------------------------------------------------------------------
  def show_face?
    return !$game_message.face_name.empty?
  end
  #--------------------------------------------------------------------------
  # ○ 头像宽度
  #--------------------------------------------------------------------------
  def face_width
    return 0 unless show_face?
    return @face_sprite.bitmap.width
  end
  #--------------------------------------------------------------------------
  # ○ 头像高度
  #--------------------------------------------------------------------------
  def face_height
    return 0 unless show_face?
    return @face_sprite.bitmap.height
  end
  #--------------------------------------------------------------------------
  # ○ 视觉宽度
  #--------------------------------------------------------------------------
  def visual_width
    return self.width - $game_message.skin_indent * 2
  end
  #--------------------------------------------------------------------------
  # ○ 视觉高度
  #--------------------------------------------------------------------------
  def visual_height
    if show_face? and $game_message.face_type == 1
      return face_height - $game_message.face_indenty
    else
      return self.height - $game_message.skin_indent * 2
    end
  end
  #--------------------------------------------------------------------------
  # ○ 计算窗体尺寸
  #--------------------------------------------------------------------------
  def get_window_size
    ## 非漫画式对话模式时,恢复默认尺寸
    unless comic_style? or Window_DefWidth <= 0 or Window_DefHeight <= 0
      return Window_DefWidth + $game_message.skin_indent*2, Window_DefHeight + $game_message.skin_indent
    end
    ## 计算呼出窗体
    x,y,width,height = 0,0,0,0
    ## 最后一行宽度
    width_last = 0
    text = @text.clone
    frozen_char = @frozen_char.clone
    @line_maxh.clear
    loop do
      c = text.slice!(/./m)
      case c
      when nil    ## 完结
        break
      when "\x00" ## 换行
        width = x if width < x
        y += $game_message.title_spaceh if @line_maxh.empty? and show_name?
        @line_maxh.push y + LineSpace
        width_last = x
        x,y = 0,0
      when "\x01"                       # \C[n]  (更改文字色)
        text.sub!(/\[(\d+)\]/, "")
        next
      ## 更改不透明度的情况下
      when "\x09"
        text.sub!(/\[(\d+)\]/, "")
      ## 显示技能情况下
      when "\x0a"
        text.sub!(/\[(\d+)\]/, "")
        x += 24
        y = 24 if y < 24
      ## 显示物品情况下
      when "\x0b"
        text.sub!(/\[(\d+)\]/, "")
        x += 24
        y = 24 if y < 24
      ## 显示武器情况下
      when "\x0c"
        text.sub!(/\[(\d+)\]/, "")
        x += 24
        y = 24 if y < 24
      ## 显示防具情况下
      when "\x0d"
        text.sub!(/\[(\d+)\]/, "")
        x += 24
        y = 24 if y < 24
      ## 更改字体的情况下
      when "\x0e"
        text.sub!(/\[(\d+)\]/, "")
        contents.font.size = $1.to_i
        y = $1.to_i if y < $1.to_i
      when "\x0f"
        text.sub!(/\[(.+?)\]/, "")
        contents.font.name = Font.exist?($1) ? $1 : Font.default_name
      ## \P[n] (字速)
      when "\x10"
        text.sub!(/\[(\d+)\]/, "")
      ## 自动关闭对话框的情况下
      when "\x11"
        text.sub!(/\[(\d+)\]/, "")
      ## 显示角色动画
      when "\x13"
        text.sub!(/\[(\S+)\,(\d+)\]/, "")
        next
      ## 显示心情动画
      when "\x14"
        text.sub!(/\[(\S+)\,(\d+)\]/, "")
        next
      ## 特定字符处理
      when "\xff"
        text.insert(0, frozen_char.shift)
      else
        c_rect = contents.text_size(c)
        x += c_rect.width
        y = c_rect.height if y < c_rect.height
        next
      end
    end
    ## 输入数值的情况
    if $game_message.num_input_variable_id > 0
      shift = 24 + $game_message.num_input_digits_max * ($game_message.content_fontsize + LineSpace)
      width = shift if width < shift
      ## 数值窗体高度
      shift = $game_message.content_fontsize + LineSpace
      @line_maxh.push shift
    else
      width += 16 if Pause_Custom > 1 and $game_message.choice_start > 98 and width < width_last + 16
    end
    width += 32 + 1  ## 边框+阴影
    height += 32 + 1 ## 边框+阴影
    @line_maxh.each{|h| height += h}
    ## 头像
    if show_face?
      case $game_message.face_type
      when 0 ## 小头像
        shift = face_width + $game_message.face_reserved
        width += shift
        shift = face_height + $game_message.face_indenty + 32
        height = shift if shift > height
      when 1 ## 半身像
        shift = face_width + $game_message.face_reserved
        width += shift
      end
    end
    ## 保证窗体最小值
    min = Window_MinWidth + $game_message.skin_indent * 2
    width = min if width < min
    min = Window_MinHeight + $game_message.skin_indent * 2
    height = min if height < min
    return width, height
  end
  #--------------------------------------------------------------------------
  # ○ 生成皮肤
  #--------------------------------------------------------------------------
  def create_skin_sprite(width, height, type)
    width  -= $game_message.skin_indent * 2
    height -= $game_message.skin_indent * 2
    height += $game_message.skin_namegauge if show_name?
    @skin_sprite = Spriteset_Skin.new(@skin_name, width, height, type)
    @skin_sprite.z = self.z - 1
  end
  #--------------------------------------------------------------------------
  # ○ 生成头像
  #--------------------------------------------------------------------------
  def create_face_sprite
    @face_sprite = Sprite.new
    @face_sprite.bitmap = Bitmap.new(1, 1)
    @face_sprite.visible = false
    @face_sprite.z = self.z + 1
  end
  #--------------------------------------------------------------------------
  # ○ 刷新头像
  #--------------------------------------------------------------------------
  def refresh_face_sprite
    face_name  = $game_message.face_name
    face_index = $game_message.face_index
    @face_sprite.bitmap.clear
    buff = Cache.face(face_name)
    width = buff.width / 4
    height = buff.height / 2
    rect = Rect.new(face_index%4*width, face_index/4*height, width, height)
    @face_sprite.bitmap = Bitmap.new(width, height)
    @face_sprite.bitmap.blt(0, 0, buff, rect)
    @face_sprite.mirror = @show_right
    @face_sprite.visible = true unless Actional
    ###buff.dispose
  end
  #--------------------------------------------------------------------------
  # ○ 生成暂停标记
  #--------------------------------------------------------------------------
  def create_pause_sprite
    return if Pause_Custom == 0
    if @pause_sprite
      @pause_sprite.bitmap.dispose
      @pause_sprite.dispose
    end
    @pause_sprite = Sprite.new
    @pause_sprite.visible = false
    bitmap = Cache.system(@skin_name)
    @pause_sprite.bitmap = Bitmap.new(16*$game_message.skin_pauseframe, 16)
    @pause_sprite.bitmap.blt(0, 0, bitmap, Rect.new(64, 112, 16*$game_message.skin_pauseframe, 16))
    @pause_sprite.ox = @pause_sprite.oy = 8
    @pause_sprite.z = self.z + 2
    @pause_aniindex = -1
    @pause_anidelay = 0
  end
  #--------------------------------------------------------------------------
  # ○ 更新暂停标记
  #--------------------------------------------------------------------------
  def update_pause_sprite
    return unless @pause_sprite
    @pause_sprite.visible = @custom_pause
    @pause_sprite.visible = false if @pause_aniindex == -1
    return unless @custom_pause
    if @pause_anidelay > 0
      @pause_anidelay -= 1
    else
      @pause_aniindex = (@pause_aniindex + 1) % $game_message.skin_pauseframe
      @pause_sprite.src_rect.set(@pause_aniindex*16, 0, 16, 16)
      @pause_anidelay = Pause_AniDelay
    end
  end
  #--------------------------------------------------------------------------
  # ○ 设定暂停标记坐标
  #--------------------------------------------------------------------------
  def set_pause_sprite_pos
    return if Pause_Custom == 0
    case Pause_Custom
    when 1 ## 底边居中
      @pause_sprite.x = self.x + self.width / 2
      @pause_sprite.y = self.y + self.height - $game_message.skin_indent - 8
    when 2 ## 右下角
      @pause_sprite.x = self.x + self.width - $game_message.skin_indent - 8
      @pause_sprite.y = self.y + self.height - $game_message.skin_indent - 8
      @pause_sprite.x -= face_width if @show_right
    when 3 ## 文字后
      @pause_sprite.x = self.x + @contents_x + 24
      @pause_sprite.y = self.y + @contents_y + 16 + @line_maxh.last/2
    end
    @pause_sprite.x += $game_message.skin_pausex
    @pause_sprite.y += $game_message.skin_pausey
  end
  #--------------------------------------------------------------------------
  # ○ 获取目标(Sprite_Character)
  #--------------------------------------------------------------------------
  def get_target
    @target = nil
    return unless @name or @target_id
    ## 精灵
    spriteset = $scene.instance_variable_get :@spriteset
    sprites   = spriteset.instance_variable_get :@character_sprites
    ## 主角
    if $game_party.members[0].name == @name or @target_id == 0
      @target = sprites.last
      return
    end
    ## 事件
    $game_map.events.values.each do |e|
      if @target_id == e.id or e.name == @name && e.page && !e.erased
        sprites.each do |s|
          if s.character == e
            @target = s
            return
          end
        end
      end
    end
  end
  #--------------------------------------------------------------------------
  # ○ 是否在屏幕范围内
  #--------------------------------------------------------------------------
  def within_screen_range?(sprite)
    return false if sprite.x < 0
    return false if sprite.y < 0
    return false if sprite.x > Graphics.width
    return false if sprite.y > Graphics.height
    return true
  end
  #--------------------------------------------------------------------------
  # ○ 默认字体
  #--------------------------------------------------------------------------
  def default_font
    font = Font.new($game_message.content_fontname, $game_message.content_fontsize)
    font.shadow = Font.default_shadow
    font.italic = Font.default_italic
    font.color = text_color($game_message.content_fontcolor)
    font.bold = Font.default_bold
    return font
  end
  #--------------------------------------------------------------------------
  # ○ 当前解释器
  #--------------------------------------------------------------------------
  def interpreter
    if $game_temp.in_battle
      return $game_troop.interpreter
    else
      return $game_map.interpreter
    end
  end
  #--------------------------------------------------------------------------
  # ○ 横坐标同步
  #--------------------------------------------------------------------------
  def x=(val)
    @skin_sprite.x = val + $game_message.skin_indent + @skin_sprite.ox if @skin_sprite
    @pause_sprite.x += val - self.x if @pause_sprite
    @number_input_window.x += val - self.x if @number_input_window
    if @face_sprite
      if @show_right
        @face_sprite.x = val - $game_message.face_indentx + self.width - face_width - 16
      else
        @face_sprite.x = val + $game_message.face_indentx + 16
      end
    end
    super
  end
  #--------------------------------------------------------------------------
  # ○ 纵坐标同步
  #--------------------------------------------------------------------------
  def y=(val)
    if @skin_sprite
      @skin_sprite.y = val + $game_message.skin_indent - 16 + @skin_sprite.oy
      @skin_sprite.y -= $game_message.skin_namegauge if show_name?
    end
    @pause_sprite.y += val - self.y if @pause_sprite
    @number_input_window.y += val - self.y if @number_input_window
    if @face_sprite
      case $game_message.face_type
      when 0
        @face_sprite.y = val + $game_message.face_indenty + 16 - $game_message.skin_namegauge
      when 1
        @face_sprite.y = val + $game_message.face_indenty + self.height - face_height - 16
      end
    end
    super
  end
  #--------------------------------------------------------------------------
  # ○ 开启度同步
  #--------------------------------------------------------------------------
  def openness=(val)
    super(val)
    if @skin_sprite and Actional
      @skin_sprite.action(self.openness)
      @skin_sprite.x = self.x + $game_message.skin_indent + @skin_sprite.ox
      @skin_sprite.y = self.y + $game_message.skin_indent - 16 + @skin_sprite.oy
      @skin_sprite.y -= $game_message.skin_namegauge if show_name?
      @face_sprite.visible = true if @face_sprite and self.openness == 255
    end
  end
end

#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # ◎ 开始处理
  #--------------------------------------------------------------------------
  alias comic_style_start start
  def start
    comic_style_start
    @message_window = Window_ComicStyle.new
  end
end

’’

点评

这种问题,请附上你的脚本  发表于 2012-3-1 12:21
不思善,不思恶。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-12-27 14:53

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表