查看: 38773|回复: 101

[原创发布] 【相隔1年多的更新][22.1.2015][v0.8】便民任务界面

 火 [复制链接]

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
回帖
3011
发表于 2011-2-15 11:34:39 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 英顺的马甲 于 2015-1-22 21:56 编辑

2015年1月22日正式开坑:下次更新时此脚本将升格为任务系统

@Wait @Cache 防bug=w=

用注释设置使设置更加简单
demo3.png
  1. 更新日志:

  2.   v0.8
  3.     1.添加了自动换行功能
  4.     2.删除了垂直对齐功能(对已使用的人深感抱歉)
  5.     4.更改了文本的解析法
  6.     3.描绘内容与刷新同步(可较顺滑的在任务间切换)
  7.     4.修正一个没被发现的BUG
  8.    
  9.   v0.7
  10.     1.对脚本结构进行优化
  11.     2.更改数据结构(也就是说之前的存档再度全死)
  12.     3.缩短代码
  13.     4.加入自动记录并返回上个界面的功能
  14.     5.移除一个没用却一直忘了删掉的功能 =_=||
  15.     6.添加垂直对齐功能(很坑,请依情况使用)
  16.     7.添加把多行内容显示为一行的功能
  17.    
  18.   v坑爹(超坑爹!失败告终)
  19.     1.添加ERB支持(非常坑,已放弃)
  20.     2.添加任务系统(已暂停并删除,以后会继续)
  21.     3.拥有自己的数据库(很坑,已抛弃)
  22.    
  23.   v0.6
  24.     1.增加滚动功能
  25.     2.对脚本结构进行优化
  26.    
  27.   v0.5
  28.     1.改名为任务界面(总觉得这只是界面不是系统)
  29.     2.优化所有正则表达式的匹配模式
  30.     4.解决一个大BUG
  31.     5.更改数据结构(也就是说之前的存档全死)
  32.     6.增加“追加说明”的功能
  33.    
  34.   v0.4
  35.     1.优化代码
  36.     2.增加“任务更新”的功能
  37.    
  38.   v0.3
  39.     1.增加“放弃任务”的功能
  40.     2.解决一个未曾被发现的BUG
  41.     3.设置简单化
  42.     4.美化打勾
  43.     5.增加打叉
  44.    
  45.   v0.2
  46.     1.加强说明显示效果
  47.     2.去掉一些不必要的工作
复制代码
脚本:
[pre lang="ruby" line="1"]#==============================================================================#
#                          便民任务界面 by EngShun                             #
#                                                                              #
#    由于此版本仅做出了一些小优化,                                            #
#    因此设置方法请参考v0.7的范例                                              #
#                                                                              #
#    效果说明:                                                                #
#    支持普通对话框效果                                                        #
#    \a[号码]     :更改左右对齐方式(0,1,2)。                                 #
#    \itm[物品id] :物品数量                                                    #
#    \wpn[武器id] :武器数量                                                    #
#    \amr[防具id] :防具数量                                                    #
#    \eval{脚本}  :运行脚本                                                    #
#    \1line{内容} :把多行的内容显示为一行                                      #
#    \bold        :字体加粗,插入多一次关闭                                    #
#    \italic      :字体打斜,插入多一次关闭                                    #
#    \f[字体名称] :更改字体                                                    #
#    \s[号码]     :更改字体大小                                                #
#    \p[名称]     :插入图片                                                    #
#    \icon[名称]  :插入图标                                                    #
#                                                                              #
#==============================================================================#

#===============================================================================
# ■ 队伍
#===============================================================================
class Game_Party
  Mission = Struct.new(:id, :name, :info, :status)
  alias org_init_mission initialize if !defined?(org_init_mission)
  #--------------------------------------------------------------------------
  # ● 重定义初始化
  #--------------------------------------------------------------------------
  def initialize
    @mission = {}
    org_init_mission
  end
  def no_mission?
    return @mission == {}
  end
  def missions
    if no_mission?
      m = Mission.new(0,"没有任务","\n\n\n\\a[1]\\s[32]你还没有领取任何任务",0)
      return [m]
    end
    return @mission.values.sort_by {|m|m.id}
  end
  def get_mission(mission,info)
    return if @mission.has_key?(mission)
    id = missions[-1].id + 1
    @mission[mission] = Mission.new(id,mission,info,0)
  end
  def done_mission(mission)
    @mission[mission].status = 1 if @mission[mission].status == 0
  end
  def delete_mission(mission)
    @mission.delete(mission)
  end
  def fail_mission(mission)
    @mission[mission].status = 2 if @mission[mission].status == 0
  end
  def resume_mission(mission)
    @mission[mission].status = 0 if @mission[mission].status == 2
  end
  def done_all_mission
    @mission.each{|k,m|m.status = 1}
  end
  def update_mission(mission,info)
    @mission[mission].info = info
  end
  def add_mission_info(mission,info)
    @mission[mission].info += "\n" + info
  end
  def delete_all_mission
    @mission = {}
  end
  def resume_all_mission
    @mission.each{|k,m|m.status = 0 if m.status == 2}
  end
end

#===============================================================================
# ■ 任务列表窗口
#===============================================================================
class Window_Mission < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super(0, 64, 200, 416)
    self.index = 0
    @mission = $game_party.missions
    @item_max = @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...@mission.size
      t = @mission.status != 0
      self.contents.font.color = t ? disabled_color : normal_color
      text = @mission.name
      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.no_mission?
      if @mission.status == 1
        self.contents.font.color = crisis_color
        self.contents.draw_text(self.contents.width-32, i * 32, 32, 32, "√",1)
      elsif @mission.status == 2
        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_MissionInfo < Window_Base
  attr_accessor :wait
  attr_accessor :scroll_up
  #--------------------------------------------------------------------------
  # ● 初始化对象
  #--------------------------------------------------------------------------
  def initialize
    super(200,64,440,416)
    self.contents =  Bitmap.new(408, 384)
    @scroll_up = false
    @wait = 90
    @items = []
    @progress = 0
    @draw_y = 0
    @align = 0
    @cache = Bitmap.new(160,160)
    @font = Font.new
  end
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    parse_items if @items.size > 0
    return if self.contents.height <= 384
    return @wait -= 1 if @wait > 0
    self.oy += @scroll_up ? -1 : 1
    self.oy = 0 if self.oy < 0
    self.oy = oy_max if self.oy > oy_max
    if self.oy <= 0
      @scroll_up = false
      @wait = 60
    elsif self.oy >= oy_max
      @scroll_up = true
      @wait = 60
    end
  end
  #--------------------------------------------------------------------------
  # ● 释放
  #--------------------------------------------------------------------------
  def dispose
    super
    @cache.dispose
  end
  #--------------------------------------------------------------------------
  # ● 滚动最大值
  #--------------------------------------------------------------------------
  def oy_max
    return self.contents.height - 384
  end
  #--------------------------------------------------------------------------
  # ● 刷新
  #--------------------------------------------------------------------------
  def refresh(str)
    str = str.clone
    @scroll_up = false
    @wait = 120
    @draw_y = 0
    @align = 0
    @progress = 0
    @lines = []
    self.oy = 0
    @cache.font = Font.new
    @font = Font.new
    self.contents.dispose
    self.contents = Bitmap.new(408, 384)
    parse_text(str)
    12.times{parse_items}
  end
  #--------------------------------------------------------------------------
  # ● 描绘行
  #--------------------------------------------------------------------------
  def draw_line(width, height, items)
    bitmap = Bitmap.new(width, height)
    bitmap.font = @font
    x = 0
    for item in items
      if item.is_a?(Color)
        bitmap.font.color = item
      elsif item.is_a?(Integer)
        bitmap.font.size = item
      elsif item.is_a?(Array)
        bitmap.font.name = item[0] if item.size == 1
      elsif item.is_a?(Bitmap)
        bitmap.blt(x + 2, (height - item.height) / 2,
                   item, Rect.new(0,0,item.width,item.height))
        x += item.width + 4
      elsif item == :bold
        bitmap.font.italic = !bitmap.font.bold
      elsif item == :italic
        bitmap.font.italic = !bitmap.font.italic
      else
        bitmap.draw_text(x,0,width,height,item)
        x += bitmap.text_size(item).width
      end
    end
    return bitmap
  end
  #--------------------------------------------------------------------------
  # ● 解析文本
  #--------------------------------------------------------------------------
  def parse_text(str)
    begin
      last_text = str.clone
      str.gsub!(/\\v\[(\d+)\]/i) { $game_variables[$1.to_i] }
      str.gsub!(/\\g/i) { $game_party.gold.to_s }
      str.gsub!(/\\itm\[(\d+)\]/i) { $game_party.item_number($1.to_i) }
      str.gsub!(/\\wpn\[(\d+)\]/i) { $game_party.weapon_number($1.to_i) }
      str.gsub!(/\\amr\[(\d+)\]/i) { $game_party.armor_number($1.to_i) }
      str.gsub!(/\\1line{(.+?)}/im) { $1.delete("\n") }
      str.gsub!(/\\eval{(.+?)}/im) { eval($1) }
    end until str == last_text
    str.gsub!(/\\n\[(\d+)\]/i) do
      $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
    end
    str.gsub!(/\n/){"\000\002n\000"}
    str.gsub!(/\\\\/) { "\001" }
    str.gsub!(/\\a\[([0-2])\]/i){ "\000\0027#{$1}" }
    str.gsub!(/\\c\[(\d+)\]/i) { "\000\0020#{$1}\000" }
    str.gsub!(/\\bold/i) { "\000\0021\000" }
    str.gsub!(/\\italic/i) { "\000\0022\000" }
    str.gsub!(/\\f\[(\w+)\]/i) { "\000\0023#{$1}\000" }
    str.gsub!(/\\s\[(\d+)\]/i) { "\000\0024#{$1}\000" }
    str.gsub!(/\\p\[(.+?)\]/i) { "\000\0025#{$1}\000" }
    str.gsub!(/\\icon\[(.+?)\]/i){ "\000\0026#{$1}\000" }
    str.gsub!(/\001/) {"\\"}
    @items = str.split("\000")
    @items.delete("")
  end
  #--------------------------------------------------------------------------
  # ● 深度解析
  #--------------------------------------------------------------------------
  def parse_items
    return unless @items.size > 0
    bitmap = @cache
    width, height, items = 1, 32, []
    while item = @items.delete_at(0)
      if item[/^\002([0-9a-z])(.*)/]
        case (a = $1)
        when '7'
          @align = $2.to_i
        when '0'
          color = $2.to_i
          bitmap.font.color = if color >= 0 and color <= 9
            text_color(color)
          elsif color == 8
            disabled_color
          elsif color == 9
            system_color
          end
          items.push bitmap.font.color
        when '1'
          items.push :bold
        when '2'
          items.push :italic
        when '3'
          bitmap.font.name = $2
          items.push [bitmap.font.name]
        when '4'
          bitmap.font.size = $2.to_i
          items.push bitmap.font.size
        when '5', '6'
          item = (a == 5) ? RPG::Cache.picture($2) : RPG::Cache.icon($2)
          if item.width > 408
            item.dispose
            items.unshift("[图片太大无法显示]")
            next
          elsif width + item.width > 408
            @items.unshift(item)
            break
          end
          items.push(item)
          width += item.width + 4
          height = item.height + 4 if item.height + 4 > height
        when 'n'
          break
        end
      else
        str = ""
        size = Rect.new(0, 0, 0, 0)
        while s = item.slice!(/./)
          size = bitmap.text_size(str + s)
          if width + size.width > 408
            item.insert(0, s)
            break
          else
            str += s
          end
        end
        if items[-1].is_a?(String)
          items[-1] += str
        else
          items.push(str)
        end
        width += size.width
        height = size.height + 4 if size.height + 4 > height
        if item != ""
          @items.unshift(item)
          break
        end
      end
    end
    b = draw_line(width, height, items)
    if @draw_y + b.height > 384
      c = self.contents
      self.contents = Bitmap.new(408, @draw_y + b.height)
      self.contents.blt(0, 0, c, Rect.new(0,0,c.width, c.height))
      c.dispose
    end
    x = 0
    x = 204 - (b.width / 2) if @align == 1
    x = 408 - b.width if @align == 2
    self.contents.blt(x, @draw_y, b, Rect.new(0,0,b.width, b.height))
    @draw_y += b.height
  end
end

#===============================================================================
# ■ 任务界面
#===============================================================================
class Scene_Mission
  #--------------------------------------------------------------------------
  # ● 初始化
  #--------------------------------------------------------------------------
  def initialize
    @last_scene = $scene
  end
  #--------------------------------------------------------------------------
  # ● 主处理
  #--------------------------------------------------------------------------
  def main
    @mission = $game_party.missions
    @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 = @mission.size - 1
    @index = @mission_window.index
    @info_window = Window_MissionInfo.new
    @info_window.refresh(@mission[@index].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 @index != @mission_window.index
      @index = @mission_window.index
      @info_window.refresh(@mission[@index].info)
    end
    return update_mission if @mission_window.active
    update_info
  end
  #--------------------------------------------------------------------------
  # ● 刷新任务
  #--------------------------------------------------------------------------
  def update_mission
    if Input.trigger?(Input::C)
      $game_system.se_play($data_system.decision_se)
      @mission_window.active = false
      @info_window.oy = 0
    elsif Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      $scene = @last_scene
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 刷新人物详情
  #--------------------------------------------------------------------------
  def update_info
    @info_window.wait = 90
    if Input.press?(Input::UP)
      @info_window.oy -= 3
      @info_window.oy = 0 if @info_window.oy < 0
    elsif Input.press?(Input::DOWN)
      @info_window.oy += 3
      @info_window.oy = @info_window.oy_max if @info_window.oy > @info_window.oy_max
    elsif Input.repeat?(Input::L)
      $game_system.se_play($data_system.cursor_se)
      @mission_window.index -= 1
      @mission_window.index = $game_party.missions.size - 1 if @mission_window.index < 0
    elsif Input.repeat?(Input::R)
      $game_system.se_play($data_system.cursor_se)
      @mission_window.index += 1
      @mission_window.index = 0 if @mission_window.index >= $game_party.missions.size
    elsif Input.trigger?(Input::B)
      $game_system.se_play($data_system.cancel_se)
      @mission_window.active = true
      @info_window.scroll_up = false
      @info_window.oy = 0
    end
  end
end

#===============================================================================
# ■ 事件处理器
#===============================================================================
class Interpreter
  alias orig_ec_mission execute_command if !defined?(orig_ec_mission)
  #--------------------------------------------------------------------------
  # ● 重定义执行事件命令
  #--------------------------------------------------------------------------
  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_mission
  end
  #--------------------------------------------------------------------------
  # ● 注释
  #--------------------------------------------------------------------------
  def command_108
    case @list[@index].parameters[0]
    when (/^删除任务\[(\w+)\]$/)
      $game_party.delete_mission($1)
      return true
    when (/^完成任务\[(\w+)\]$/)
      $game_party.done_mission($1)
      return true
    when "删除所有任务"
      $game_party.delete_all_mission
      return true
    when "完成所有任务"
      $game_party.done_all_mission
      return true
    when (/^放弃任务\[(\w+)\]$/)
      $game_party.fail_mission($1)
      return true
    when (/^恢复任务\[(\w+)\]$/)
      $game_party.resume_mission($1)
      return true
    when "恢复所有任务"
      $game_party.resume_all_mission
      return true
    end
    text = @list[@index].parameters[0]
    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] == "任务设置" or split[0] == "任务更新" or 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
        end
      end
      $game_party.get_mission(name,info) if split[0] == "任务设置"
      $game_party.update_mission(name,info) if split[0] == "任务更新"
      $game_party.add_mission_info(name,info) if split[0] == "追加说明"
    end
    return true
  end
end[/pre]
截图:
demo2.png
demo2.png
下载:
v0.8并没有在功能上做出改动,因此不提供范例,
需要的请下载v0.7范例。

随工程附送VX→XP窗口皮肤一张

旧版本:
便民任务界面v0.7.rar (211.94 KB, 下载次数: 1114)
范例v0.6.rar (211.3 KB, 下载次数: 276)
范例 v0.5.rar (210.53 KB, 下载次数: 284)
范例 v0.4.rar (208.41 KB, 下载次数: 1989)
范例 v0.3.rar (208.18 KB, 下载次数: 2451)
范例.rar (206.2 KB, 下载次数: 845)         

点评

VX→XP的皮肤总是没横条纹……反正是RGSS1的糟糕之处……不管了  发表于 2012-8-30 18:45
谢谢  发表于 2011-2-15 16:12
帮你编辑了一下,  发表于 2011-2-15 15:30

评分

参与人数 7星屑 +76 赞 +1 收起 理由
cc610523 + 1 精品文章
zmz6668 + 10 塞糖
鑫晴 + 30 精品文章
satgo1546 + 8 VX→XP的皮肤总是没横条纹……反正是RGSS1.
acn00269 + 8 塞糖
涂鸦boy + 10 塞糖
77777741 + 10 精品文章

查看全部评分

本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到engshun@1ppl.me咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
梦石
0
星屑
7389
在线时间
453 小时
注册时间
2011-2-11
回帖
1073
发表于 2011-2-15 19:32:13 | 显示全部楼层
啊....得到任务出现情况。
如图: QQ截图未命名2.png
QQ截图未命名.png

点评

字符串要用双引号圈起来的……比如("喜闻乐见","喜闻乐见")  发表于 2014-12-17 13:14
怎么个加引号法?我加了引号还错?  发表于 2011-4-30 13:53
其实,说明可以添加效果,比如说 \\c[1] 来改变颜色,与对话框相同  发表于 2011-2-24 13:35
果然。。。。是这样。。  发表于 2011-2-15 20:09
把文字加上双引号试试- -  发表于 2011-2-15 19:59
回复

使用道具 举报

梦石
0
星屑
55
在线时间
254 小时
注册时间
2010-3-21
回帖
328
发表于 2011-2-17 10:29:01 | 显示全部楼层
好物,非常简易嗯嗯
自由,是火一般的梦想。
回复

使用道具 举报

梦石
0
星屑
54
在线时间
489 小时
注册时间
2009-7-23
回帖
392
发表于 2011-2-19 14:14:19 | 显示全部楼层
表示不能用......
错误.jpg


2578699于2011-2-25 19:43补充以下内容:
额,之前是由于自己的疏忽,对不起啊......麻烦你了

点评

将存档删除,重新游戏  发表于 2011-4-13 13:58
莫名其妙又好了。。  发表于 2011-4-6 09:47
同样的问题呢。。求解  发表于 2011-4-5 22:39
你确定 $game_mission = Game_Mission.new 没打错或者是已经加上了??  发表于 2011-2-24 13:32
回复

使用道具 举报

梦石
0
星屑
50
在线时间
68 小时
注册时间
2010-11-14
回帖
15
发表于 2011-4-7 21:21:30 | 显示全部楼层
能给个工程吗

点评

有工程啊!你近视吗???  发表于 2012-8-18 17:07
回复

使用道具 举报

梦石
0
星屑
50
在线时间
53 小时
注册时间
2011-3-19
回帖
61
发表于 2011-4-12 21:00:16 | 显示全部楼层
:L会用了……但是……比单纯的公共事件还要麻烦……
回复

使用道具 举报

梦石
0
星屑
50
在线时间
35 小时
注册时间
2010-10-10
回帖
22
发表于 2011-4-30 14:07:40 | 显示全部楼层
于Scene_Title ,def command_new_game下面插入$game_mission = Game_Mission.new
  于Scene_Save,Marshal.dump($game_player, file)下面插入Marshal.dump($game_mission, file)
  于Scene_Load,$game_player        = Marshal.load(file)的下面插入$game_mission = Marshal.load(file)
————————————————————————————————--
找不到那三段脚本啊
...
回复

使用道具 举报

路人党员

梦石
0
星屑
52
在线时间
2276 小时
注册时间
2010-12-30
回帖
3011
 楼主| 发表于 2011-8-3 16:34:17 | 显示全部楼层
更新自顶:lol
回复

使用道具 举报

永久原子

梦石
18
星屑
180
在线时间
2054 小时
注册时间
2010-10-25
回帖
3907

开拓者

发表于 2011-9-11 00:54:44 | 显示全部楼层
脚本能使事件使用更简单,支持ZL
人不在了,有事烧纸。
回复

使用道具 举报

神仙

梦石
0
星屑
69
在线时间
596 小时
注册时间
2007-5-14
回帖
1135
发表于 2011-9-12 13:35:44 | 显示全部楼层
不支持鼠标的切换,望修正。

点评

继续填坑。  发表于 2012-5-23 00:04
为何如此之久了...游戏“修仙”还是进度30%,枉费了我对这个游戏的期望...好吧,鉴定完毕,这是一个蛮大的坑。  发表于 2012-5-23 00:02
不支持鼠标不是我的错  发表于 2011-9-12 14:26
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部