| 
 
| 赞 | 0 |  
| VIP | 0 |  
| 好人卡 | 0 |  
| 积分 | 1 |  
| 经验 | 869 |  
| 最后登录 | 2013-3-20 |  
| 在线时间 | 107 小时 |  
 Lv1.梦旅人 
	梦石0 星屑50 在线时间107 小时注册时间2010-10-10帖子228 | 
| 这个是任务脚本,比如有两个任务,鼠标选择两个任何,内容不会变。 而用键盘上下选择,则任务就会切换,鼠标选择两个任务却不会切换。
 复制代码#==============================================================================#
#           任务系统v0.3 by EngShun                                            #
#                                                                              #
#    设置方法请参考范例                                                        #
#                                                                              #
#    效果说明:                                                                #
#    支持普通对话框效果                                                        #
#    \a[号码]     :更改对齐方式(0,1,2)。                                     #
#    \itm[物品id] :物品数量                                                    #
#    \wpn[武器id] :武器数量                                                    #
#    \amr[防具id] :防具数量                                                    #
#    \eval{脚本}  :运行脚本                                                    #
#    \bold        :字体加粗,插入多一次关闭                                    #
#    \italic      :字体打斜,插入多一次关闭                                    #
#    \f[字体名称] :更改字体                                                    #
#    \s[号码]     :更改字体大小                                                #
#    \p[名称]     :插入图片                                                    #
#    \icon[名称]  :插入图标                                                    #
#                                                                              #
#==============================================================================#
class Game_Mission
  attr_reader :doned
  attr_reader :failed
  def initialize
    @mission = []
    @info = []
    @doned = []
    @failed = []
  end
  def none?
    return @mission == []
  end
  def mission
    if @mission == []
      return ["没有任务"]
    end
    return @mission
  end
  def info
    if @info == []
      return ["\\a[1]\\c[2]\\s[50]\\f[楷体]没有任何的任务"]
    end
    return @info
  end
  def get(mission,info)
    unless @mission.include?(mission)
      @mission.push(mission)
      @info.push(info)
    end
  end
  def done(done_mission)
    for i in [email protected]
      if @mission[i] == done_mission and [email protected]?(i)
        @doned.delete(i) if @doned.include?(i)
        @doned.push(i)
      end
    end
  end
  def delete(delete_mission)
    for i in [email protected]
      if @mission[i] == delete_mission
        @mission.delete(delete_mission)
        delete_info = @info[i]
        @info.delete(delete_info)
        @doned.delete(i) if @doned.include?(i)
      end
    end
  end
  def fail(mission)
    for i in [email protected]
      if @mission[i] == mission and [email protected]?(i)
        @failed.delete(i) if @failed.include?(i)
        @failed.push(i)
      end
    end
  end
  def resume(mission)
    for i in [email protected]
      if @mission[i] == mission and
        @failed.delete(i)
      end
    end
  end
  def done_all
    for i in [email protected]
      @doned.delete(i) if @doned.include?(i)
      @doned.push(i)
    end
  end
  def delete_all
    @mission = []
    @info = []
    @doned = []
    @failed = []
  end
  def resume_all
    @failed = []
  end
end
class Window_Mission < Window_Selectable
  def initialize
    super(0, 64, 200, 416)
    self.index = 0
    @item_max = $game_party.mission.mission.size
    if self.contents != nil
      self.contents.dispose
      self.contents = nil
    end
    self.contents = Bitmap.new(width - 32, @item_max * 32)
    for i in 0...$game_party.mission.mission.size
      t = ($game_party.mission.doned.include?(i) or $game_party.mission.failed.include?(i))
      self.contents.font.color = t ? disabled_color : normal_color
      text = $game_party.mission.mission[i]
      self.contents.draw_text(4, i * 32, 160, 32, text.to_s)
      self.contents.font.color = system_color
      self.contents.draw_text(self.contents.width-32, i * 32, 32, 32, "□",1) unless $game_party.mission.none?
      if $game_party.mission.doned.include?(i)
        self.contents.font.color = crisis_color
        self.contents.draw_text(self.contents.width-32, i * 32, 32, 32, "√",1)
      elsif $game_party.mission.failed.include?(i)
        self.contents.font.color = knockout_color
        self.contents.draw_text(self.contents.width-32, i * 32, 32, 32, "×",1)
      end
    end
  end
end
class Window_Info < Window_Base
  def initialize
    super(200,64,440,416)
    self.contents =  Bitmap.new(408, 384)
  end
  def refresh(str)
    self.contents = Bitmap.new(408, 384) if self.contents == nil
    self.contents.clear
    y = 0
    align = 0
    begin
      last_text = str.clone
      str.gsub!(/\\[Vv]\[([0-9]+)\]/) { $game_variables[$1.to_i] }
      str.gsub!(/\\[Gg]/) { $game_party.gold.to_s }
      str.gsub!(/\\[Ii][Tt][Mm]\[(\d+)\]/) { $game_party.item_number($1.to_i) }
      str.gsub!(/\\[Ww][Pp][Nn]\[(\d+)\]/) { $game_party.weapon_number($1.to_i) }
      str.gsub!(/\\[Aa][Mm][Rr]\[(\d+)\]/) { $game_party.armor_number($1.to_i) }
      str.gsub!(/\\[Ee][Vv][Aa][Ll]{([.,\r,\n]+)}/) { eval($1) }
    end until str == last_text
      str.gsub!(/\\[Nn]\[([0-9]+)\]/) do
      $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
    end
    lines = str.split("\n")
    for line in lines
      bitmap,align = bitmap_line(line,align)
      w = bitmap.width
      h = bitmap.height
      case align
      when 0
        x = 4
      when 1
        x = 204 - w / 2
      when 2
        x = 404 - w
      end
      self.contents.blt(x,y,bitmap,Rect.new(0,0,w,h))
      y += h
    end
  end
  def bitmap_line(str,old_align)
    w,h = get_wh(str.clone)
    w = 1 if w == 0
    bitmap = Bitmap.new(w,h)
    text = str
    align = old_align
    x = 0
    text.gsub!(/\\\\/) { "\000" }
    text.gsub!(/\\[Aa]\[(\d+)\]/){ 
      align = $1.to_i
      ""
    }
    text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
    text.gsub!(/\\[Bb][Oo][Ll][Dd]/) { "\002" }
    text.gsub!(/\\[Ii][Tt][Aa][Ll][Ii][Cc]/) { "\003" }
    text.gsub!(/\\[Ff]\[(\w+)\]/) { "\004[#{$1}]" }
    text.gsub!(/\\[Bb][Dd]\[(\w+)\]/) { "\005[#{$1}]" }
    text.gsub!(/\\[Ss]\[(\d+)\]/) { "\006[#{$1}]" }
    text.gsub!(/\\[Pp]\[([\w,-]+)\]/) { "\007[#{$1}]" }
    text.gsub!(/\\[Ii][Cc][Oo][Nn]\[([\w,-]+)\]/){ "\201[#{$1}]" }
    while ((c = text.slice!(/./m)) != nil)
      if c == "\000"
        c = "\\"
      end
      if c == "\001"
        text.sub!(/\[([0-9]+)\]/, "")
        color = $1.to_i
        if color >= 0 and color <= 9
          bitmap.font.color = text_color(color)
        elsif color == 8
          bitmap.font.color = disabled_color
        elsif color == 9
          bitmap.font.color = system_color
        end
        next
      end
      if c == "\002"
        bitmap.font.bold = bitmap.font.bold ? false : true
        next
      end
      if c == "\003"
        bitmap.font.italic = bitmap.font.italic ? false : true
        next
      end
      if c == "\004"
        text.sub!(/\[(\w+)\]/,"")
        bitmap.font.name = $1
        next
      end
      if c == "\005"
        text.sub!(/\[(\w+)\]/,"")
        color = bitmap.font.color.clone
        w = bitmap.text_size($1).width
        bitmap.font.color = Color.new(0,0,0,255)
        bitmap.draw_text((4 + x)-1, y-1, w, 32, $1)
        bitmap.draw_text((4 + x)-1, y+1, w, 32, $1)
        bitmap.draw_text((4 + x)+1, y-1, w, 32, $1)
        bitmap.draw_text((4 + x)+1, y+1, w, 32, $1)
        bitmap.font.color = color
        bitmap.draw_text(4 + x, y, w, 32, $1)
        x += bitmap.text_size($1).width
        next
      end
      if c == "\006"
        text.sub!(/\[(\d+)\]/,"")
        bitmap.font.size = $1.to_i
        next
      end
      if c == "\007"
        text.sub!(/\[([\w,-]+)\]/,"")
        pic = RPG::Cache.picture($1)
        r = Rect.new(0,0,pic.width,pic.height)
        y = h / 2 - pic.height / 2
        bitmap.blt(x+2,y,pic,r)
        x += pic.width + 4
        next
      end
      if c == "\201"
        text.sub!(/\[([\w,-]+)\]/,"")
        pic = RPG::Cache.icon($1)
        r = Rect.new(0,0,pic.width,pic.height)
        y = h / 2 - pic.height / 2
        bitmap.blt(x+2,y,pic,r)
        x += pic.width + 4
        next
      end
      bitmap.draw_text(x,0,w,h,c)
      x += bitmap.text_size(c).width
    end
    return bitmap.clone,align
  end
  def get_wh(str)
    bitmap = Bitmap.new(160,160)
    w = 0
    h = 32
    text = str
    text.gsub!(/\\\\/) { "\000" }
    text.gsub!(/\\[Aa]\[(\d+)\]/) { "" }
    text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "" }
    text.gsub!(/\\[Bb][Oo][Ll][Dd]/) { "" }
    text.gsub!(/\\[Ii][Tt][Aa][Ll][Ii][Cc]/) { "" }
    text.gsub!(/\\[Ff]\[(\w+)\]/) { "\001[#{$1}]" }
    text.gsub!(/\\[Bb][Dd]\[(\w+)\]/) { $1 }
    text.gsub!(/\\[Ss]\[(\d+)\]/) { "\002[#{$1}]" }
    text.gsub!(/\\[Pp]\[([\w,-]+)\]/) { "\003[#{$1}]" }
    text.gsub!(/\\[Ii][Cc][Oo][Nn]\[(\w,[A-Za-z0-9_-]+)\]/) { "\004[#{$1}]" }
    while ((c = text.slice!(/./m)) != nil)
      if c == "\000"
        c = "\\"
      end
      if c == "\001"
        text.sub!(/\[(\w+)]/,"")
        bitmap.font.name = $1
        next
      end
      if c == "\002"
        text.sub!(/\[(\d+)]/,"")
        bitmap.font.size = $1.to_i
        next
      end
      if c == "\003"
        text.sub!(/\[([\w,-]+)\]/,"")
        w += RPG::Cache.picture($1).width+4
        h = RPG::Cache.picture($1).height if RPG::Cache.picture($1).height > 32 and RPG::Cache.picture($1).height > h
        next
      end
      if c == "\004"
        text.sub!(/\[([\w,-]+)\]/,"")
        w += RPG::Cache.icon($1).width+4
        h = RPG::Cache.icon($1).height if RPG::Cache.icon($1).height > 32 and RPG::Cache.icon($1).height > h
        next
      end
      w += bitmap.text_size(c).width
      h = bitmap.text_size(c).height if bitmap.text_size(c).height > 32 and bitmap.text_size(c).height > h
    end
    return w,h
  end
end
class Scene_Mission
  def main
    @window1 = Window_Base.new(0,0,200,64)
    @window1.contents = Bitmap.new(168,32)
    @window1.contents.draw_text(0,0,168,32,"任务",1)
    @window2 = Window_Base.new(200,0,440,64)
    @window2.contents = Bitmap.new(408,32)
    @window2.contents.draw_text(0,0,408,32,"任务说明",1)
    @mission_window = Window_Mission.new
    @mission_window.index = $game_party.mission.mission.size - 1
    @info_window = Window_Info.new
    info = $game_party.mission.info[@mission_window.index].clone
    @info_window.refresh(info)
    Graphics.transition
    loop do
      Graphics.update
      Input.update
      update
      if $scene != self
        break
      end
    end
    Graphics.freeze
    @window1.dispose
    @window2.dispose
    @mission_window.dispose
    @info_window.dispose
  end
  def update
    @mission_window.update
    @info_window.update
    if Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = Scene_Map.new
      return
    end
    if Input.repeat?(Input::UP) or
       Input.repeat?(Input::DOWN)
      info = $game_party.mission.info[@mission_window.index].clone
      @info_window.refresh(info)
    end
  end
end
class Game_Party
  attr_accessor :mission
  alias orig_init initialize
  def initialize
    @mission = Game_Mission.new
    orig_init
  end
end
class Interpreter
  alias orig_ec execute_command
  def execute_command
    if @index >= @list.size - 1
      command_end
      return true
    end
    @parameters = @list[@index].parameters
    return command_108 if @list[@index].code == 108
    return orig_ec
  end
  def command_108
    text = @list[@index].parameters[0]
    if text.sub!(/删除任务\[(\w+)\]/,"") != nil
      $game_party.mission.delete($1)
      return true
    elsif text.sub!(/完成任务\[(\w+)\]/,"") != nil
      $game_party.mission.done($1)
      return true
    elsif text.sub!(/删除所有任务/,"") != nil
      $game_party.mission.delete_all
      return true
    elsif text.sub!(/完成所有任务/,"") != nil
      $game_party.mission.done_all
      return true
    elsif text.sub!(/放弃任务\[(\w+)\]/,"") != nil
      $game_party.mission.fail($1)
      return true
    elsif text.sub!(/恢复任务\[(\w+)\]/,"") != nil
      $game_party.mission.resume($1)
      return true
    elsif text.sub!(/恢复所有任务/,"") != nil
      $game_party.mission.resume_all
      return true
    end
    loop do
      if @list[@index+1].code == 108 or @list[@index+1].code == 408
        text += "\n" + @list[@index+1].parameters[0]
      else
        break
      end
      @index += 1
    end
    split = text.split("\n")
    if split[0] == "任务设置" and split.size >= 3
      info , name = split[2] , split[1]
      if split.size >= 4
        for i in 3...split.size
          info += "\n" + split[i]
        end
      end
      $game_party.mission.get(name,info)
    end
    return true
  end
end
 | 
 |