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