# 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]
#
#===========================================
# 設定箇所
#===========================================
module STORYEVENT
# メニューに表示される項目名
STORYEVENT_MENU_TEXT = "任务"
# 条目所显示的菜单索引(顶部为0)
STORYEVENT_MENU_INDEX = 4
# 启用条目的开关编号
STORYEVENT_ENABLE_SID = 1
#------------------------------------------------------------------------------
# 在概要中显示的标题
STORYEVENT_CAPTION = "主线"
# 管理概况的变量编号
STORYEVENT_VID = 1
# あらすじの設定
#【形式】
# ① => [②, ③],
# ① STORYEVENT_VIDに格納されている値(数値)
# ② 進行中ストーリーの名前(文字列)
# ③ 進行中ストーリーの詳細(文字列)
STORYEVENT_CONTENTS = {
0 => ["【御风猕猴】", "猕猴王,七魔王之通风魔王,神出鬼没,变化多端,
挥舞着棍子,掌管着狂风,奉命在花果山阻击唐僧师徒。
地点:\\C[24]花果山\\C[0] 目的:击败\\C[24]猕猴王"],
1 => ["【乘胜追击】", "战败的猕猴王逃往水帘洞,
前往水帘洞击败他!
地点:\\C[24]水帘洞\\C[0] 目的:击败\\C[24]猕猴王"],
2 => ["【万劫之雷】", "禺狨王,号称驱神魔王,支配着雷电之力,能驱使雷云,召唤闪电,
在桃花源布下重重陷阱,誓要取唐僧师徒性命。
地点:\\C[24]桃花源\\C[0] 目的:击败\\C[24]禺绒王"],
3 => ["【魔化的石像】", "蝙蝠石像被牛魔王魔化后法力大增,它的存在能使蝙蝠能源源不绝地产生,
蝙蝠石像镇守在无皋山山口,前往之人无一身还...
地点\\C[24]蝙蝠洞窟\\C[0] 目的:击败\\C[24]蝙蝠石像"],
4 => ["【凤飞狮吟】", "狮驼王乃移山魔王,善于施毒,又拥有移山之力,
与鹏魔王把守妖森之穴,鹏魔王号称混天魔王,凤凰涅槃般在熊熊烈火中重生。
狮驼王的致命毒术与鹏魔王的涅槃之火使妖森之穴化为炼狱。
地点:\\C[24]妖森之穴\\C[0] 目的:击败\\C[24]狮驼王、鹏魔王"],
5 => ["【死寂东海】", "东海已被蛟魔王与鲨魔王占领,前往东海击败蛟魔王!"],
6 => ["【测试版完结】", "测试版到此结束,敬请期待正版发布。"],
7 => ["【魔鲨漩涡】", "鲨魔王在东海施下妖术,并将周围一带命名为“鲨之漩涡”
前往鲨之漩涡击败鲨魔王!"],
8 => ["【噩梦牛魔谷】", "做好充足的准备后就前往牛魔谷击败牛魔王吧!
期间可以前往神兽森林收集装备。"],
9 => ["【前往阴间】", "测试版到此结束,敬请期待正版发布。"],
}
#------------------------------------------------------------------------------
# サブイベントリストに表示する見出し
SUBEVENT_CAPTION = "支线"
# サブイベント達成率部分に表示する項目名
SUBEVENT_CLEARTEXT = "完成率"
# 子事件详细画面中使用的窗口外观名称
SUBEVENT_SKIN = "Window"
# 要在清除的子事件中显示的字符串
# 在子事件详细画面中显示
SUBEVENT_CLEARED_TEXT = ""
# 显示在清除的子事件中的图标
#显示在id子事件列表中
SUBEVENT_CLEARED_ICON = 125
# 被看作子事件开始的变量值
# 子事件所对应的变量中存储有大于此处设定值的值时,、
# 判断为正在执行事件,并显示在子事件列表中
SUBEVENT_STARTED = 1
# 视为子事件清除的变量值
#在与子事件对应的变量中存储有大于此处设定值的值的情况下,、
#被判断为事件清除,子事件列表的标记为清除时的标记
SUBEVENT_CLEARED = 2000
# 子事件概要设定
#【型号】
# ①= >“②,③,④”,
# ①子事件对应的变量编号(数值)
# ②正在进行的子事件的名称。 在子事件列表中显示(字符串)
# ③子事件发生中的文章。 显示在子事件详细画面(字符串)─
# ④子事件清除后的文章。 显示在子事件详细画面(字符串)
#
# ※subevent _ contents中有有效设定的情况下,那边优先。
SUBEVENT_TITLES = {
101 => ["001:平定花果山",
"\\C[1]事件发生场所\\C[0]
花果山
\\C[1]详细\\C[0]
打败猕猴王后各路小妖都前来花果山妄想将其占领
干掉他们,平定花果山!
报酬:
还魂丹*2",
"\\C[1]事件发生场所\\C[0]
花果山
\\C[1]详细\\C[0]
任务完成!"],
102 => ["002:妖树迷林",
"\\C[1]事件发生场所\\C[0]
花果山
\\C[1]详细\\C[0]
天草本性温和,被猕猴王魔化后变得异常狂暴,
并用树根将花果山一带包围,形成迷宫,前往
花果山找到并打败它!
报酬:
妖森禅杖*1",
"\\C[1]事件发生场所\\C[0]
花果山
\\C[1]详细\\C[0]
任务完成!"],
103 => ["003:玄冰狙击",
"\\C[1]事件发生场所\\C[0]
七星洞
\\C[1]详细\\C[0]
七星洞出现了许多妖魂,操作唐僧使用冰爆术
狙击他们!
报酬:
灵魂*3000",
"\\C[1]事件发生场所\\C[0]
七星洞
\\C[1]详细\\C[0]
任务完成!"],
104 => ["004:遗失的书",
"\\C[1]事件发生场所\\C[0]
七星洞
\\C[1]详细\\C[0]
村民的书似乎落在七星洞了,快去帮他找回来吧!
报酬:
一阶魔泉丹*3",
"\\C[1]事件发生场所\\C[0]
七星洞
\\C[1]详细\\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
180
end
#--------------------------------------------------------------------------
# ● 获取窗口高度
#--------------------------------------------------------------------------
def window_height
line_height + 32
end
#--------------------------------------------------------------------------
# ● リフレッシュ
#--------------------------------------------------------------------------
def refresh
draw_text(20, 20, 124, line_height, STORYEVENT::SUBEVENT_CLEARTEXT)
text = "%"
contents.font.size = 16
cx = text_size(text).width
change_color(system_color)
draw_text(0, 20, 124, line_height, text, 2)
contents.font.size = 20
change_color(normal_color)
draw_text(0, 20, 124-cx-4, line_height, STORYEVENT.completed, 2)
end
end
class WindowOutlineSub < Window_Base
#--------------------------------------------------------------------------
# ● オブジェクト初期化
#--------------------------------------------------------------------------
def initialize
super(0, 180, window_width, window_height)
refresh
end
#--------------------------------------------------------------------------
# ● ウィンドウ幅の取得
#--------------------------------------------------------------------------
def window_width
Graphics.width
end
#--------------------------------------------------------------------------
# ● ウィンドウ高さの取得
#--------------------------------------------------------------------------
def window_height
Graphics.height - 180
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
180
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
544#432
end
#--------------------------------------------------------------------------
# ● ウィンドウ高さの取得
#--------------------------------------------------------------------------
def window_height
416#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
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