a321321 发表于 2010-1-28 17:46:07

求任务 脚本

   可以得到 任务 完成 可以去交任务的....

小睡 发表于 2010-1-29 23:11:50

这个……需要脚本么……
公共事件不就能解决么……

ugvynietg 发表于 2010-1-30 02:21:01

自己用事件写就好了
要用脚本写的话可以查看F1

酆城浪子 发表于 2010-1-30 09:56:59

往前很多很多去找我分享的东西,要不自己用事件慢慢拼。或者F1学习写脚本

我海市蜃楼 发表于 2010-1-30 21:41:10

很久很久很久………………以前在www.66RPG.com得到的



#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================
=begin
--------------------------------------------------------------------------
详尽任务显示界面 v2.1
--------------------------------------------------------------------------
By 叶子

日期与更新
3-29-2006 -v1.0
4-3-2006-v2.0
-可以改变文字颜色,显示变量,显示图标,显示图片
-大幅简化了编写任务内容的过程,加入自动换行功能
-精简了窗口,使其还可以用作图鉴系统、日记系统等等
4-6-2006-v2.1
-增加了获得全部任务与删除全部任务命令
-改正通假字,修改了示例任务3
--------------------------------------------------------------------------
改版 by snstar2006

修改部分:
- 将XP的一些脚本改成VX版的
- 将窗口大小缩放成VX的大小(依照比例)
- 将一些会变成很长的脚本精简
   (如:用$game_pary.item_no(物品编号)
      代替原来的$game_party.item_number($data_items[物品编号]) = ="好长)
- 精简一些代码,将 Window_Task_Name 和Window_Task 重合部分用继承方式精简
- 依照VX的 RGSS2 规范编写 Scene_Task
- 增加使用16进位颜色代码变换字体颜色功能
- 修改Scene_Menu的召唤方式,使脚本新手使用起来更容易

--------------------------------------------------------------------------
顾名思义,就是显示任务数据的界面
任务数据要预先在这里设定好
下载范例工程,能帮助你更快更好地掌握使用方法
--------------------------------------------------------------------------
使用方法:

1、召唤任务显示界面:$scene = Scene_Task.new

可以在事件中的「脚本」指令加入这段东西,
又或者修改 Scene_Menu 来增加一个显示任务的选项。
如果是修改 Scene_Menu 增加選項的話,请使用

    $scene = Scene_Task.new(任务在菜单的index)

例如:$scene = Scene_Task.new(7)

2、设置任务数据

2.1、相关内容解析

所有内容文字必须用双引号括住

名称:任务的名字(显示在左边窗口中),大小为172×32,如果全部为文字的话,
      够放九个全角字符
      
简介:任务的介绍(显示在右边窗口中),宽308,高不限

      文字可以自动换行

   2.1.1、控制码解析
   
   名称和内容均可用控制码,注意两条反斜杠都要打!
   
   \\\\v] 显示n号变量
   \\\\c] 改变字体颜色。n 为窗口外观图片中所设定的颜色,可为0-31
   \\\\c]设定字体颜色为RRGGBB色, RRGGBB 为16进位颜色代码
   \\\\n] 显示i号角色名字
   \\\\i[图标编号] 显示图标    # 图标编号为图标在IconSet里的顺序
   \\\\p[文件名] 显示图片
   
   2.1.2、高级:内嵌表达式
      
   请参考帮助-脚本入门-字符串-内嵌表达式相关内容。
   它可以用来在任务的名称和简介那里显示变量。
   常用的表达式(注意不要漏了井号和大括号):
   #{$game_variables}       ——插入n号变量的值
   #{$game_party.item_no(n)}—— 插入持有n号物品数量
                                  同理还有 weapon_no,armor_no
   还可以预先定义一个变量,再插入(例子见示例任务3-灵魂线)
   
2.2、注意事项

   2.2.1、括号、逗号和双引号 [ ] , " 必须使用半角符号(英文输入),
          引号内的内容则没有关系
         
   2.2.2、单引号 ' 和双引号 " 的区别:
          为了不出错误,全部用双引号吧!当然如果你对Ruby很熟悉,那就没所谓了

2.3、开始设置吧!
从107行开始设置任务数据,可以参考示例任务来设置,请仔细阅读附加讲解

3、接受任务

事件里的「脚本」指令输入:get_task(任务ID)
例如 get_task(1) 就是接受1号任务

3.1、获得全部任务

事件里的「脚本」指令输入:get_all_task
这个功能基本上是用来在编写好所有任务数据后测试排版的


4、完成/删除任务

事件里的「脚本」指令输入:finish_task(任务ID)
例如 finish_task(1) 就是完成1号任务

注意:本脚本不负责完成任务后的奖励之类的东西,请自行在事件中判断,
       这里的完成任务指的是从任务列表中删去此任务

4.1、删除全部任务

事件里的「脚本」指令输入:finish_all_task
作为获得全部任务的对应功能存在,似乎不会怎么用到
=end
class Scene_Task
# 这里设置任务内容翻页音效
CHANGE_PAGE_SE = "Audio/SE/046-Book01"
end
class Game_Party
#--------------------------------------------------------------------------
# ● 设置任务资料
#--------------------------------------------------------------------------
def get_tasks_info
    @tasks_info = []
   
    #-讲解-
    # 三个示例任务由浅入深,其实只要看懂第一个就可以使用了。
    # 任务的写法多种多样,不限于这三个任务的方法
    #----
    #-----------------------------
    # 示例任务1:沙漠中的五叶花
    #-----------------------------
    名称 = "\\\\c]帮忙拿5瓶药水"
    #-讲解-
    # 注意!脚本编辑器的变色功能并不是非常完善,所以换行后字变黑了,但仍然是字符
    # 串的一部分,所以不要忘记在内容最后打一个双引号
    # 按回车是强制换行
    #----
    简介 = "\\\\c]帮忙拿5瓶药水
\\\\c]任务目标:
获得5瓶药水,交给任务测试人员
\\\\c]药水数目:/5]\\\\v/5
任务测试人员:
\\\\c]快点!我等着你的好消息"
    #-讲解-
    # 每个任务最后一定要加上:
    # @tasks_info[任务ID] = Game_Task.new(名称, 简介)
    # 接受任务和完成任务都是用这个任务ID来索引
    #----
    @tasks_info = Game_Task.new(名称, 简介)
   
    #-----------------------------
    # 示例任务2:克萝莉亚的药瓶
    #-----------------------------
    名称 = "\\\\c]克萝莉亚的药瓶"
    #-讲解-
    # 这里使用了字符串相加,例如 s = "a" + "b" ,s 就是 "ab"
    # 还用了内嵌表达式,$game_party.item_number(38) 就是38号物品的数量
    #----
    简介 = 名称 + "
   
\\\\c]任务目标:
问克萝莉亚要一个药瓶,交给西露达
\\\\c]药瓶:#{$game_party.item_no(1)}/1
西露达:
克萝莉亚就在西边的屋子里"
    @tasks_info = Game_Task.new(名称, 简介)
   
    #-----------------------------
    # 示例任务3:灵魂线
    #-----------------------------
    #-讲解-
    # 这里用了条件判断,当3号变量大于等于1时,加上“完成”字样,同时变色
    #----
    if $game_variables >= 1
      名称 = "\\\\c]灵魂线(完成)"
      item = "\\\\c]灵魂线:#{$game_variables}/1 (完成)"
    else
      名称 = "\\\\c]灵魂线"
      item = "\\\\c]灵魂线:#{$game_variables}/1"
    end
    #-讲解-
    # 预先定义变量,用内嵌表达式插入
    # 最后用了显示图标
    #----
    简介 = "#{名称}
   
\\\\c]任务目标:
找到埋起来的灵魂线,交给克萝莉亚
#{item}
\\\\c]克萝莉亚:
灵魂线就埋在其中一棵树下,给我好好找\\\\i]"
    @tasks_info = Game_Task.new(名称, 简介)
   
end
end
#==============================================================================
# ■ Interpreter
#------------------------------------------------------------------------------
#  执行事件命令的解释器。本类在 Game_System 类
# 与 Game_Event 类的内部使用。
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ● 接受任务
#--------------------------------------------------------------------------
def get_task(id)
    task = $game_party.tasks_info
    return true if (task.nil? or $game_party.current_tasks.include?(task.id))
    $game_party.current_tasks.unshift(task.id)
    return true
end
#--------------------------------------------------------------------------
# ● 获得全部任务
#--------------------------------------------------------------------------
def get_all_task
    # 清空当前任务
    $game_party.current_tasks.clear
    for task in $game_party.tasks_info
      next if task.nil?
      $game_party.current_tasks.unshift(task.id)
    end
    return true
end
#--------------------------------------------------------------------------
# ● 完成/放弃任务
#--------------------------------------------------------------------------
def finish_task(id)
    task = $game_party.tasks_info
    return true if task.nil?
    $game_party.current_tasks.delete(task.id)
    return true
end
#--------------------------------------------------------------------------
# ● 删除全部任务
#--------------------------------------------------------------------------
def finish_all_task
    $game_party.current_tasks.clear
    return true
end
end
#==============================================================================
# ■ Game_Party
#------------------------------------------------------------------------------
#  处理同伴的类。包含金钱以及物品的信息。本类的实例
# 请参考 $game_party。
#==============================================================================
class Game_Party
#--------------------------------------------------------------------------
# ● 定义实例变量
#--------------------------------------------------------------------------
attr_writer   :latest_task                  # 上次查看的任务
#--------------------------------------------------------------------------
# ● 取得任务资料
#--------------------------------------------------------------------------
def tasks_info
    if @tasks_info.nil?
      get_tasks_info
    end
    return @tasks_info
end
#--------------------------------------------------------------------------
# ● 取得当前任务
#--------------------------------------------------------------------------
def current_tasks
    if @current_tasks.nil?
      @current_tasks = []
    end
    return @current_tasks
end
#--------------------------------------------------------------------------
# ● 上次查看的任务
#--------------------------------------------------------------------------
def latest_task
    if !current_tasks.include?(@latest_task)
      @latest_task = current_tasks
    end
    return @latest_task
end
end
#==============================================================================
# ■ Game_Task
#------------------------------------------------------------------------------
#  处理任务的类。包含任务的信息。
#==============================================================================
class Game_Task
attr_accessor   :name                   # 名称
attr_accessor   :briefing               # 简介
def initialize(name, briefing)
    @name = name
    @briefing = briefing
end
def height
    text = @briefing.clone
    x = 0
    y = 64
    min_y = 0
    # 限制文字处理
    begin
      last_text = text.clone
      text.gsub!(/\\\\\\[(+)\\]/) { $game_variables[$1.to_i] }
    end until text == last_text
    text.gsub!(/\\\\\\[(+)\\]/) do
      $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
    end
    # 为了方便、将 "\\\\\\\\" 变换为 "\\000"
    text.gsub!(/\\\\\\\\/) { "\\000" }
    # "\\C" 变为 "\\001"
    text.gsub!(/\\\\\\[(+)\\]/) { "\\001[#{$1}]" }
    # "\\I" 变为 "\\002"
    text.gsub!(/\\\\/) { "\\002" }
    # "\\P" 变为 "\\003"
    text.gsub!(/\\\\/) { "\\003" }
    # c 获取 1 个字 (如果不能取得文字就循环)
    while ((c = text.slice!(/./m)) != nil)
      # \\\\ 的情况下
      if c == "\\000"
      # 还原为本来的文字
      c = "\\\\"
      end
      # \\C 的情况下
      if c == "\\001"
      # 更改文字色
      text.sub!(/\\[(+)\\]/, "")
      # 下面的文字
      next
      end
      # 图标的情况下
      if c == "\\002"
      icon_name = ''
      while ((cha = text.slice!(/./m)) != ']')
          next if cha == '['
          icon_name += cha
      end
      if x + 24 > 368
          x = 0
          y += .max
          min_y = 0
      end
      x += 28
      next
      end
      # 图片的情况下
      if c == "\\003"
      pic_name = ''
      while ((cha = text.slice!(/./m)) != ']')
          next if cha == '['
          pic_name += cha
      end
      pic = Cache.picture(pic_name)
      if x + pic.width > 368
          x = 0
          y += .max
          min_y = 0
      end
      x += pic.width
      min_y = .max
      next
      end
      # 另起一行文字的情况下
      if c == "\\n"
      y += .max
      min_y = 0
      x = 0
      # 下面的文字
      next
      end
      # 自动换行处理
      if x + 22 > 368
      y += .max
      min_y = 0
      x = 0
      end
      # x 为要描绘文字的加法运算
      x += 22
    end
    return (y + .max)
end
def id
    return $game_party.tasks_info.index(self)
end
end
#==============================================================================
# ■ Window_Task_Name
#------------------------------------------------------------------------------
#  任务名称显示窗口。
#==============================================================================
class Window_Task_Name < Window_Selectable
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize(tasks)
    super(0, 0, 204, 416)
    @tasks = []
    for id in tasks
      @tasks.push($game_party.tasks_info)
    end
    @item_max = tasks.size
    self.contents = Bitmap.new(
    self.width - 32, @item_max == 0 ? 32 : @item_max * 32)
    refresh
    self.index = 0
end
#--------------------------------------------------------------------------
# ● 刷新
#--------------------------------------------------------------------------
def refresh
    self.contents.clear
    if @tasks != []
      for task in @tasks
      draw_item(task)
      end
    else
      draw_blank
    end
end
#--------------------------------------------------------------------------
# ● 描绘项目
#--------------------------------------------------------------------------
def draw_item(task)
    text = task.name.clone
    y = @tasks.index(task) * WLH
    chenge_special_character(text, 0, y)
end
#--------------------------------------------------------------------------
# ● 描绘空行
#--------------------------------------------------------------------------
def draw_blank
    self.contents.font.color = Color.new(255, 255, 255, 128)
    rect = Rect.new(4, 0, self.contents.width - 8, 32)
    self.contents.fill_rect(rect, Color.new(0, 0, 0, 0))
    self.contents.draw_text(rect, '当前没有任何任务')
end
#--------------------------------------------------------------------------
# ● 获取任务
#--------------------------------------------------------------------------
def task
    return @tasks
end
end

#==============================================================================
# ■ Window_Task
#------------------------------------------------------------------------------
#  任务内容显示窗口。
#==============================================================================
class Window_Task < Window_Base
#--------------------------------------------------------------------------
# ● 初始化对像
#--------------------------------------------------------------------------
def initialize(task_id)
    super(204, 0, 340, 416)
    refresh(task_id)
end
#--------------------------------------------------------------------------
# ● 刷新内容
#--------------------------------------------------------------------------
def refresh(task_id)
    self.oy = 0
    self.visible = true
    return if task_id.nil?
    task = $game_party.tasks_info
    if !task.nil?
      self.contents = Bitmap.new(self.width - 32, task.height)
    else
      self.contents = Bitmap.new(self.width - 32, self.height - 32)
      return
    end
    self.contents.font.color = normal_color
    # 描绘任务内容
    draw_task_info(task)
end
#--------------------------------------------------------------------------
# ● 描绘任务内容
#--------------------------------------------------------------------------
def draw_task_info(task)
    self.contents.font.color = normal_color
    # 描绘任务简介
    chenge_special_character(task.briefing.clone)
end
end
class Window_Base < Window
def chenge_special_character(text, x=0, y=0)
    # 记录换行时y坐标最小加值
    min_y = 0
    # 限制文字处理
    begin
      last_text = text.clone
      text.gsub!(/\\\\\\[(+)\\]/) { $game_variables[$1.to_i] }
    end until text == last_text
    text.gsub!(/\\\\\\[(+)\\]/) do
      $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
    end
    # 为了方便、将 "\\\\\\\\" 变换为 "\\000"
    text.gsub!(/\\\\\\\\/) { "\\000" }
    # "\\C" 变为 "\\001"
    text.gsub!(/\\\\\\[(+)\\]/){ "\\001[#{$1}]" }
    # "\\I" 变为 "\\002"
    text.gsub!(/\\\\/) { "\\002" }
    # "\\P" 变为 "\\003"
    text.gsub!(/\\\\/) { "\\003" }
    # c 获取 1 个字 (如果不能取得文字就循环)
    while ((c = text.slice!(/./m)) != nil)
      # \\\\ 的情况下
      if c == "\\000"
      # 还原为本来的文字
      c = "\\\\"
      end
      # \\C 的情況下
      if c == "\\001"
      # 更改文字色
      text.sub!(/\\[(+)\\]/, "")
      # 如果是设定RGB颜色
      if $1=="H"
          # 先拷贝一下文字
          c=$1.dup
          # 分3段分别取出R,G,B颜色
          c.sub!(/H({2})({2})({2})/, "")
          # 设定文字颜色
          self.contents.font.color = Color.new($1.to_i(16), $2.to_i(16), $3.to_i(16))
      else
          color = $1.to_i
          if color >= 0 and color <= 31
            self.contents.font.color = text_color(color)
          elsif color == 32
            self.contents.font.color = disabled_color
          elsif color == 33
            self.contents.font.color = system_color
          end
      end
      # 下面的文字
      next
      end
      # 图标的情况下
      if c == "\\002"
      icon_name = ''
      while ((cha = text.slice!(/./m)) != ']')
          next if cha == '['
          icon_name += cha
      end
      if x + 24 > self.contents.width
          x = 0
          y += .max
          min_y = 0
      end
      draw_icon(icon_name.to_i, x+4, y+4, true)
      x += 28
      next
      end
      # 图片的情况下
      if c == "\\003"
      pic_name = ''
      while ((cha = text.slice!(/./m)) != ']')
          next if cha == '['
          pic_name += cha
      end
      pic = Cache.picture(pic_name)
      if x + pic.width > self.contents.width
          x = 0
          y += .max
          min_y = 0
      end
      self.contents.blt(x + 4, y, pic, Rect.new(0, 0, pic.width, pic.height))
      x += pic.width
      min_y = .max
      next
      end
      # 另起一行文字的情况下
      if c == "\\n"
      y += .max
      min_y = 0
      x = 0
      # 下面的文字
      next
      end
      # 自动换行处理
      if x + self.contents.text_size(c).width > self.contents.width
      y += .max
      min_y = 0
      x = 0
      end
      # 描绘文字
      self.contents.draw_text(4 + x, y, 40, WLH, c)
      # x 为要描绘文字的加法运算
      x += self.contents.text_size(c).width
    end
end
end
class Game_Party < Game_Unit
def item_no(n)
    return item_number($data_items)
end
def weapon_no(n)
    return item_number($data_weapons)
end
def armor_no(n)
    return item_number($data_armors)
end
end
#==============================================================================
# ■ Scene_Task
#------------------------------------------------------------------------------
#  处理任务画面的类。
#==============================================================================
class Scene_Task < Scene_Base
def initialize(index=nil)
    @menu_index = index
end
#--------------------------------------------------------------------------
# ● 主处理
#--------------------------------------------------------------------------
def start
    # 刷新任务资料
    $game_party.get_tasks_info
    # 生成任务名称窗口
    @task_names_window = Window_Task_Name.new($game_party.current_tasks)
    @task_names_window.active = true
    if $game_party.current_tasks != []
      @task_names_window.index = $game_party.current_tasks.index($game_party.latest_task)
    end
    # 生成任务内容窗口
    @task_info_window = Window_Task.new($game_party.latest_task)
    @task_info_window.active = true
end
def terminate
    # 释放窗口
    @task_names_window.dispose
    @task_info_window.dispose
end
#--------------------------------------------------------------------------
# ● 刷新画面
#--------------------------------------------------------------------------
def update
    # 刷新窗口
    @task_names_window.update
    @task_info_window.update
    update_task_names_window
end
#--------------------------------------------------------------------------
# ● 刷新任务名称窗口
#--------------------------------------------------------------------------
def update_task_names_window
    # 按下 B 键的情况下
    if Input.trigger?(Input::B)
      # 演奏取消 SE
      Sound.play_cancel
      # 这里设置返回的场景,返回地图是Scene_Map.new,菜单是Scene_Menu.new(任务界面index)
      if @menu_index == nil
      $scene = Scene_Menu.new
      else
      $scene = Scene_Menu.new(@menu_index)
      end
      return
    end
    # 按下 C 键的情况下
    if Input.trigger?(Input::C)
      # 无任务可显示的话
      if @task_names_window.task == nil
      # 演奏冻结 SE
      Sound.play_buzzer
      return
      end
      # 如果光标没有移动的话,翻页
      if $game_party.latest_task == @task_names_window.task.id
      if @task_info_window.oy + @task_info_window.height - 32 > @task_info_window.contents.height
          @task_info_window.oy = 0
      else
          @task_info_window.oy += 480-32
      end
      if @task_info_window.contents.height > @task_info_window.height - 32
          # 演奏翻页 SE
          Sound.se_play(CHANGE_PAGE_SE)
      end
      else
      @task_info_window.refresh(@task_names_window.task.id)
      $game_party.latest_task = @task_names_window.task.id
      # 演奏确定 SE
      Sound.play_decision
      end
    end
end
end


#==============================================================================
# 本脚本来自www.66RPG.com,使用和转载请保留此信息
#==============================================================================

a3514612 发表于 2010-1-30 23:20:19

好多啊,其实我觉得还是用事件容易些
页: [1]
查看完整版本: 求任务 脚本