查看: 4958|回复: 9

[RMVA发布] 发一个很不错的任务系统,丢开公会,直接找人交任务~~

[复制链接]
梦石
0
星屑
48
在线时间
331 小时
注册时间
2012-5-4
回帖
117
发表于 2013-6-16 20:46:14 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 wshzya 于 2013-6-16 20:48 编辑

发一个很不错的任务系统,可以直接找任务发布人交付任务。任务接受和完成都是通过变量控制,达不到接受条件的任务不会显示。
俺随便写了几个任务在脚本里,应该可以看得懂。
代码在此:

[pre lang="ruby" line="1"]=begin
      RGSS3
      
      ★ 冒険メモ ★
      
      現在のあらすじなど、任意の文章を表示する項目をメニューに追加します。
      サブイベントの管理もできます。
      
      ● 仕様 ●==========================================================
      イベントでのメッセージ表示と同様の制御文字が使用可能です。
      使用する場合は\マークを2つ続けて入力するようにしてください。
      【例】
      \N[2] => \\N[2]
      \C[1] => \\C[1]
      ====================================================================
      
      ※ RPGツクールVX サンプルゲーム「レクトールと黒獅子の紋章」にて
         使用されているスクリプトを参考にしています。
      
      ver1.00
      
      Last Update : 2012/03/18
      03/18 : 新規
      
      ろかん   http://kaisou-ryouiki.sakura.ne.jp/
=end

#===========================================
#   設定箇所
#===========================================
module STORYEVENT
# メニューに表示される項目名
STORYEVENT_MENU_TEXT = "冒険メモ"

# 項目が表示されるメニューインデックス(一番上が0)
STORYEVENT_MENU_INDEX = 5

# 項目が有効になるスイッチ番号
STORYEVENT_ENABLE_SID = 5

#------------------------------------------------------------------------------
# あらすじに表示する見出し
STORYEVENT_CAPTION = "基本任务"

# あらすじを管理する変数番号
STORYEVENT_VID = 18

# あらすじの設定
#【形式】
#   ① => [②, ③],
#     ① STORYEVENT_VIDに格納されている値(数値)
#     ② 進行中ストーリーの名前(文字列)
#     ③ 進行中ストーリーの詳細(文字列)
STORYEVENT_CONTENTS = {

0 => ["道术修习",
"为了成为一个合格的神棍,\\N[1]必须努力修习道术。
道术包括【法术】、【医术】和【方术】,先习得各系
不同的基础技能吧。"],
50 => ["超级神棍",
"已经没有基本任务了"],
}
#------------------------------------------------------------------------------
# サブイベントリストに表示する見出し
SUBEVENT_CAPTION = "任务一览"

# サブイベント達成率部分に表示する項目名
SUBEVENT_CLEARTEXT = "接受率"

# サブイベント詳細画面で使用されるウィンドウスキン名
SUBEVENT_SKIN = "Window"

# クリアしたサブイベントに表示する文字列
#    サブイベント詳細画面に表示されます
SUBEVENT_CLEARED_TEXT = "- クリア -"

# クリアしたサブイベントに表示するアイコンID
#    サブイベントリストに表示されます
SUBEVENT_CLEARED_ICON = 539

# サブイベントスタートと見做す変数値
#    サブイベントに対応する変数に、ここでの設定値以上の値が格納されている場合、
#    イベント実行中と判断され、サブイベントリストに表示されるようになります
SUBEVENT_STARTED = 1

# サブイベントクリアと見做す変数値
#    サブイベントに対応する変数に、ここでの設定値以上の値が格納されている場合、
#    イベントクリアと判断され、サブイベントリストの表記がクリア時のものになります
SUBEVENT_CLEARED = 99

# サブイベントの概要設定
#【形式】
#   ① => [②, ③, ④],
#     ① サブイベントに対応する変数番号(数値)
#     ② 進行中サブイベントの名前。サブイベントリストに表示(文字列)
#     ③ サブイベント発生中の文章。サブイベント詳細画面に表示(文字列) ※
#     ④ サブイベントクリア後の文章。サブイベント詳細画面に表示(文字列)
#
#   ※ SUBEVENT_CONTENTSに有効な設定がある場合はそちらが優先されます。
SUBEVENT_TITLES = {

101 => ["英雄美酒",
"",
""],
102 => ["毒泉净化",
"",
""],
}
# サブイベントの詳細設定
#【形式】
#   ① => [[②, ③], [②, ③], [②, ③],......],
#     ① サブイベントに対応する変数番号(数値)
#     ② ①に格納されている値(数値)
#     ③ ②の条件を満たす際のサブイベント発生中の文章。サブイベント詳細画面に表示(文字列)
SUBEVENT_CONTENTS = {

101 => [
[1, "【任务地点】  南蛮村落
【委托人员】  南蛮守卫
【完成报酬】  无
【推荐等级】  \\C[5]1\\C[0]

想要得到有关祝融的消息,就先去买5
瓶\\C[3]【英雄醉】\\C[0]交给南蛮守卫。
"],
],
102 => [
[1, "【任务地点】  南蛮村落
【委托人员】  南蛮巫师
【完成报酬】  ?
【推荐等级】  \\C[5]3\\C[0]

南蛮村落的泉水突然变得有毒了。查出
泉水变化原因并解决掉,就可以得到
\\C[2]【大巫师】\\C[0]的帮助,使传教活动更加顺
利。"],
],
}end
#===========================================
#   ここまで
#===========================================

$rsi ||= {}
$rsi["冒険メモ"] = true

module STORYEVENT
  #--------------------------------------------------------------------------
  # ● 色々キャッシュ
  #--------------------------------------------------------------------------
  def self.cache
    self.cache_story_data
    self.cache_event_list
  end
  #--------------------------------------------------------------------------
  # ● あらすじ 見出しの取得
  #--------------------------------------------------------------------------
  def self.story_caption
    STORYEVENT_CAPTION
  end
  #--------------------------------------------------------------------------
  # ● メインストーリー情報の取得
  #--------------------------------------------------------------------------
  def self.cache_story_data
    @story_data = STORYEVENT_CONTENTS[$game_variables[STORYEVENT_VID]]
    unless @story_data
      $game_variables[STORYEVENT_VID].downto(0){|n|
        if STORYEVENT_CONTENTS.has_key?(n)
          @story_data = STORYEVENT_CONTENTS[n]
          break
        end
      }
    end
  end
  #--------------------------------------------------------------------------
  # ● あらすじ タイトルの取得
  #--------------------------------------------------------------------------
  def self.story_title
    @story_data[0]
  end
  #--------------------------------------------------------------------------
  # ● あらすじ テキストの取得
  #--------------------------------------------------------------------------
  def self.story_text
    @story_data[1]
  end
  #--------------------------------------------------------------------------
  # ● サブイベント 見出しの取得
  #--------------------------------------------------------------------------
  def self.event_caption
    SUBEVENT_CAPTION
  end
  #--------------------------------------------------------------------------
  # ● サブイベント リスト数の取得
  #--------------------------------------------------------------------------
  def self.event_number
    SUBEVENT_TITLES.size
  end
  #--------------------------------------------------------------------------
  # ● サブイベントが発生しているかどうかの判定
  #--------------------------------------------------------------------------
  def self.event_start?(id)
    $game_variables[id] >= SUBEVENT_STARTED
  end
  #--------------------------------------------------------------------------
  # ● サブイベントをクリアしたかどうかの判定
  #--------------------------------------------------------------------------
  def self.event_clear?(id)
    $game_variables[id] >= SUBEVENT_CLEARED
  end
  #--------------------------------------------------------------------------
  # ● サブイベント フラグ変数リストの取得
  #--------------------------------------------------------------------------
  def self.cache_event_list
    @event_list = SUBEVENT_TITLES.keys.sort
    @event_list.sort!{|a, b|
      title_a = self.event_start?(a) ? 0 : 1
      title_b = self.event_start?(b) ? 0 : 1
      if title_a != title_b
        title_a <=> title_b
      else
        a <=> b
      end
    }
  end
  #--------------------------------------------------------------------------
  # ● サブイベントリストのゲッター
  #--------------------------------------------------------------------------
  def self.event_list
    @event_list
  end
  #--------------------------------------------------------------------------
  # ● サブイベント タイトルの取得
  #--------------------------------------------------------------------------
  def self.event_title(id)
    if event_start?(id)
      SUBEVENT_TITLES[id][0]
    else
      "--------------------"
    end
  end
  #--------------------------------------------------------------------------
  # ● サブイベント テキストの取得
  #--------------------------------------------------------------------------
  def self.event_text(id)
    if event_clear?(id)
      SUBEVENT_TITLES[id][2]
    elsif event_start?(id)
      text = nil
      if SUBEVENT_CONTENTS[id]
        SUBEVENT_CONTENTS[id].each{|data|
          text = data[1] if data[0] <= $game_variables[id]
        }
      end
      text ? text : SUBEVENT_TITLES[id][1]
    else
      ""
    end
  end
  #--------------------------------------------------------------------------
  # ● シナリオ達成率の取得
  #--------------------------------------------------------------------------
  def self.completed
    n = 0
    for i in @event_list
      if event_clear?(i)
        n += 2
      elsif event_start?(i)
        n += 1
      end
    end
    n * 100 / (event_number * 2)
  end
end

class WindowInfo < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(368, 152, window_width, window_height)
    self.opacity = 0
    refresh
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    160
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height
    line_height + 32
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    draw_text(0, 0, 124, line_height, STORYEVENT::SUBEVENT_CLEARTEXT)
    text = "%"
    contents.font.size = 20
    cx = text_size(text).width
    change_color(system_color)
    draw_text(0, 0, 124, line_height, text, 2)
    contents.font.size = 20
    change_color(normal_color)
    draw_text(0, 0, 124-cx-4, line_height, STORYEVENT.completed, 2)
  end
end

class WindowOutlineSub < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 152, window_width, window_height)
    refresh
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    Graphics.width
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height
    Graphics.height - 152
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    change_color(system_color)
    draw_text(0, 0, 352, line_height, STORYEVENT.event_caption)
  end
end

class WindowOutlineList < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 192, window_width, window_height)
    self.index = 0
    self.opacity = 0
    refresh
    activate
  end
  #--------------------------------------------------------------------------
  # ● 選択項目の有効状態を取得
  #--------------------------------------------------------------------------
  def current_item_enabled?
    STORYEVENT.event_start?(STORYEVENT.event_list[index])
  end
  #--------------------------------------------------------------------------
  # ● 桁数の取得
  #--------------------------------------------------------------------------
  def col_max
    2
  end
  #--------------------------------------------------------------------------
  # ● 横に項目が並ぶときの空白の幅を取得
  #--------------------------------------------------------------------------
  def spacing
    16
  end
  #--------------------------------------------------------------------------
  # ● 項目数の取得
  #--------------------------------------------------------------------------
  def item_max
    STORYEVENT.event_number
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    Graphics.width
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height
    Graphics.height - 192
  end
  #--------------------------------------------------------------------------
  # ● 項目の描画
  #--------------------------------------------------------------------------
  def draw_item(index)
    event_id = STORYEVENT.event_list[index]
    rect = item_rect(index)
    rect.x += 2
    color = normal_color
    enabled = STORYEVENT.event_start?(event_id)
    if enabled
      if STORYEVENT.event_clear?(event_id)
        color = text_color(1)
        draw_icon(STORYEVENT::SUBEVENT_CLEARED_ICON, rect.x, rect.y)
      end
    end
    rect.x += 24
    rect.width -= 28
    change_color(color, enabled)
    draw_text(rect, STORYEVENT.event_title(event_id))
  end
end

class WindowOutlineMain < Window_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(0, 0, window_width, window_height)
    refresh
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    Graphics.width
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height
    152
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    cw = contents.width - 32
    change_color(system_color)
    draw_text(0, 0, contents.width - 32, line_height, STORYEVENT.story_caption)
    change_color(normal_color)
    cx = text_size(STORYEVENT.story_caption).width + 16
    draw_text(cx, 0, cw - cx, line_height, STORYEVENT.story_title)
    draw_text_ex(16, line_height + 16, STORYEVENT.story_text.dup)
  end
end

class WindoOutlineText < Window_Selectable
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :item_index               # 表示するインデックス
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    super(window_x, window_y, window_width, window_height)
    self.windowskin = Cache.system(STORYEVENT::SUBEVENT_SKIN)
    self.z = 200
    self.active = false
    self.openness = 0
    @item_index = 0
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ X 座標の取得
  #--------------------------------------------------------------------------
  def window_x
    (Graphics.width - window_width) / 2
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ Y 座標の取得
  #--------------------------------------------------------------------------
  def window_y
    (Graphics.height - window_height) / 2
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ幅の取得
  #--------------------------------------------------------------------------
  def window_width
    432
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウ高さの取得
  #--------------------------------------------------------------------------
  def window_height
    368
  end
  #--------------------------------------------------------------------------
  # ● リフレッシュ
  #--------------------------------------------------------------------------
  def refresh
    contents.clear
    id = STORYEVENT.event_list[@item_index]
    text = STORYEVENT.event_title(id)
    contents.font.shadow = false
    contents.font.bold = true
    contents.font.size = 24
    change_color(system_color)
    cx = contents.width - 96
    cw = text_size(text).width
    contents.fill_rect(Rect.new(4, 32, cw + 8, 2), system_color)
    contents.draw_text(8, 8, cx - 24, line_height, text)
    contents.font.bold = false
    contents.font.size = 20
    change_color(normal_color)
    contents.draw_text(0, 36, cx, line_height, STORYEVENT::SUBEVENT_CLEARED_TEXT) if STORYEVENT.event_clear?(id)
    draw_text_ex(0, line_height * 2+12, STORYEVENT.event_text(id).clone)
  end
  #--------------------------------------------------------------------------
  # ● 表示するインデックスの設定
  #--------------------------------------------------------------------------
  def item_index=(index)
    @item_index = index
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウのアクティブ化
  #--------------------------------------------------------------------------
  def activate
    refresh
    open
    super
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウの非アクティブ化
  #--------------------------------------------------------------------------
  def deactivate
    close
    super
  end
end

class Window_MenuCommand < Window_Command
  #--------------------------------------------------------------------------
  # ● コマンドリストの作成
  #--------------------------------------------------------------------------
  alias _make_command_list_with_story_command make_command_list
  def make_command_list
    _make_command_list_with_story_command
    add_story_command
  end
  #--------------------------------------------------------------------------
  # ● インデックスを指定したコマンドの追加
  #--------------------------------------------------------------------------
  def add_command_with_index(name, symbol, index, enabled = true, ext = nil)
    @list[index, 0] = {:name=>name, :symbol=>symbol, :enabled=>enabled, :ext=>ext}
  end
  #--------------------------------------------------------------------------
  # ● 冒険メモコマンドの有効判定
  #--------------------------------------------------------------------------
  def enable_story_command?
    $game_switches[STORYEVENT::STORYEVENT_ENABLE_SID]
  end
  #--------------------------------------------------------------------------
  # ● 冒険メモコマンドの追加
  #--------------------------------------------------------------------------
  def add_story_command
    add_command_with_index(STORYEVENT::STORYEVENT_MENU_TEXT, :story,
          STORYEVENT::STORYEVENT_MENU_INDEX, enable_story_command?)
  end
end

class SceneOutline < Scene_Base
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    STORYEVENT.cache
    @index = 0
  end
  #--------------------------------------------------------------------------
  # ● 開始処理
  #--------------------------------------------------------------------------
  def start
    super
    create_background
    create_backsprite
    create_windows
    set_handler
  end
  #--------------------------------------------------------------------------
  # ● 背景の作成
  #--------------------------------------------------------------------------
  def create_background
    @background_sprite = Sprite.new
    @background_sprite.bitmap = SceneManager.background_bitmap
    @background_sprite.color.set(16, 16, 16, 128)
  end
  #--------------------------------------------------------------------------
  # ● サブイベント閲覧時用の背景スプライトの作成
  #--------------------------------------------------------------------------
  def create_backsprite
    @back_sprite = Sprite.new
    @back_sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height)
    @back_sprite.bitmap.fill_rect(@back_sprite.bitmap.rect, Color.new(0, 0, 0, 192))
    @back_sprite.visible = false
    @back_sprite.z = 190
  end
  #--------------------------------------------------------------------------
  # ● 各種ウィンドウの作成
  #--------------------------------------------------------------------------
  def create_windows
    @main_window = WindowOutlineMain.new
    @sub_window = WindowOutlineSub.new
    @list_window = WindowOutlineList.new
    @info_window = WindowInfo.new
    @text_window = WindoOutlineText.new
  end
  #--------------------------------------------------------------------------
  # ● ハンドラのセット
  #--------------------------------------------------------------------------
  def set_handler
    @list_window.set_handler(:ok, method(:open_text_window))
    @list_window.set_handler(:cancel, method(:return_scene))
    @text_window.set_handler(:cancel, method(:close_text_window))
  end
  #--------------------------------------------------------------------------
  # ● 終了処理
  #--------------------------------------------------------------------------
  def terminate
    super
    dispose_background
    dispose_backsprite
    dispose_windows
    SceneManager.call(Scene_Menu)#紅茶走
  end
  #--------------------------------------------------------------------------
  # ● 背景の解放
  #--------------------------------------------------------------------------
  def dispose_background
    @background_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● サブイベント閲覧時用の背景スプライトの解放
  #--------------------------------------------------------------------------
  def dispose_backsprite
    @back_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● 各種ウィンドウの解放
  #--------------------------------------------------------------------------
  def dispose_windows
    @main_window.dispose
    @sub_window.dispose
    @list_window.dispose
    @info_window.dispose
    @text_window.dispose
  end
  #--------------------------------------------------------------------------
  # ● サブイベントの詳細ウィンドウ表示
  #--------------------------------------------------------------------------
  def open_text_window
    @list_window.visible = false
    @main_window.visible = false
    @sub_window.visible = false
    @info_window.visible = false
    @back_sprite.visible = true
    @text_window.item_index = @list_window.index
    @text_window.activate
  end
  #--------------------------------------------------------------------------
  # ● サブイベントの詳細ウィンドウ非表示
  #--------------------------------------------------------------------------
  def close_text_window
    @list_window.visible = true
    @main_window.visible = true
    @sub_window.visible = true
    @info_window.visible = true
    @back_sprite.visible = false
    @list_window.activate
  end
end

class Scene_Menu < Scene_MenuBase
  #--------------------------------------------------------------------------
  # ● コマンドウィンドウの作成
  #--------------------------------------------------------------------------
  alias _create_story_command create_command_window
  def create_command_window
    _create_story_command
    @command_window.set_handler(:story, method(:command_story))
  end
  #--------------------------------------------------------------------------
  # ● コマンド[冒険メモ]
  #--------------------------------------------------------------------------
  def command_story
    SceneManager.call(SceneOutline)
  end
end[/pre]
梦石
0
星屑
55
在线时间
116 小时
注册时间
2008-5-12
回帖
236
发表于 2013-6-16 22:00:36 | 显示全部楼层
你发错区了 这是原创区哦
回复

使用道具 举报

梦石
0
星屑
48
在线时间
331 小时
注册时间
2012-5-4
回帖
117
 楼主| 发表于 2013-6-16 22:16:48 | 显示全部楼层
shinliwei 发表于 2013-6-16 22:00
你发错区了 这是原创区哦

…………貌似不晓得怎么转区……斑竹大人看到麻烦一下吧…………
回复

使用道具 举报

傀儡师

梦石
0
星屑
1507
在线时间
1319 小时
注册时间
2012-1-18
回帖
1026
发表于 2013-6-18 11:52:00 | 显示全部楼层
请lz制作一个范例供参考吧,,不懂脚本呀……

广告位招租?!
回复

使用道具 举报

梦石
0
星屑
50
在线时间
44 小时
注册时间
2013-5-25
回帖
89
发表于 2013-6-18 20:03:21 | 显示全部楼层
可以请求版主帮你转去地球村。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
99 小时
注册时间
2012-9-11
回帖
20
发表于 2013-8-15 12:25:38 | 显示全部楼层
很好的样子,但求发个范例看起来更直观些。
回复

使用道具 举报

梦石
0
星屑
336
在线时间
464 小时
注册时间
2009-10-2
回帖
117
发表于 2013-8-19 20:45:07 | 显示全部楼层
求范例呀。。。。。。这样不能复制
...
回复

使用道具 举报

梦石
0
星屑
565
在线时间
431 小时
注册时间
2012-8-14
回帖
500
发表于 2013-8-19 21:00:23 | 显示全部楼层
XP默默路过……
看起来的确很好用……
希望是永不沉眠的梦。
回复

使用道具 举报

梦石
0
星屑
1529
在线时间
260 小时
注册时间
2008-7-11
回帖
567
发表于 2013-9-24 19:06:39 | 显示全部楼层
本帖最后由 涂鸦boy 于 2013-9-24 20:03 编辑

好吧。。。没看懂怎么用。。。
回复

使用道具 举报

梦石
0
星屑
50
在线时间
46 小时
注册时间
2013-12-6
回帖
21
发表于 2014-1-28 13:13:53 | 显示全部楼层
菜单里已经有了按钮,但是禁用的,怎么打开
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部