-
DeadElf79
-
-
Вне сайта
-
Звездный Страж
-
- Сообщений: 3147
- Спасибо получено: 2650
-
-
|
DE79's Quest System
Информация:
Автор: DeadElf79
Версия скрипта: 1.0.1
Версия мейкера: RPG Maker VX Ace
Описание:
Собственно, перенос моего же скрипта, написанного для XP (он используется в моем проекте, пока не публикую), на VX Ace.
Скрипт является простейшим потому как использует только стандартные окна и средства RGSS, требует для своей работы
минимум переключателей (можно использовать один для всех квестов) и не проверяет ход выполнения задания.
Особенности:
позволяет посмотреть полученные квесты
добавляет кнопочку во внутриигровое меню
Установка:
Установите весь приведенный ниже код на страницы, следующие друг за другом.
Код:
Сама квестовая система:#==================================================
#--------------------------------------------------
#
# DE79 QUEST SYSTEM MODULE
#
#--------------------------------------------------
# Автор: DeadElf79
# Версия: 1.0.4
# История версий:
# 1.0
# - Первая публикация
# 1.0.1
# - Добавлено возвращение массива заданий
# для сохранения
# - Добавлена загрузка из хэш-таблицы
# для загрузки из сохраненной игры
# 1.0.2
# - Исправлена проверка видимости задания
# - Добавлен метод set_switch
# 1.0.3
# - Добавлен метод index, возвращающий
# номер заданий по метке shrt
# 1.0.4
# - Удалена необходимость обязательного
# ввода хэш-таблицы в QS.add
#--------------------------------------------------
# Простейший скрипт для добав-
# ления квестов и проверки их
# завершенности.
# Скрипт не включает в себя моди-
# фикацию для Scene_Menu.
# -------------------------------------------------
# Пример добавления квеста:
# QS.add({
# :name=>'Спасти принцессу',
# :desc=>'Она находится в плену у коварного злодея',
# :swit=>40,
# :comp=>false,
# :town=>'Корнелия',
# :recv=>'Король'
# })
# Просмотр данных о квесте:
# QS[0][:shrt] # возвращает метку квеста (она используется при поиске)
# QS[0][:name] # возвращает название квеста
# QS[0][:desc] # возвращает описаниее квеста
# QS[0][:swit] # возвращает номер переключателя, который отвечает за показ задания
# QS[0][:comp] # возвращает статус готовности задания (true или false)
# QS[0][:town] # возвращает город, в котором нужно сдавать задание
# QS[0][:recv] # возвращает имя персонажа, который принимает выполненное задание
# Примечания:
# 1. Параметры :town и :recv могут использоваться для хранения
# другого текста (не относящегося к их предназначению),
# но при использовании DE79_QuestSystemMenu вам нужно
# будет поменять соответствующие текстовые строки
# для отображения нужной вам информации.
# 2. Параметр :swit отвечает за то, будет ли
# при использованиия DE79_QuestSystemMenu отображаться
# задание в списке или же нет. Скрипт не проверяет,
# выполнено ли задание на самом деле, делайте
# эту проверку в соответствии со своими предпочтениями
# и используйте QS[*НОМЕР КВЕСТА][:comp]=true,
# в событии тогда, когда посчитаете, что задание
# действительно завершено.
# 3. Из пункта 2 следует, что переменная :comp не зависит от значения
# какого-либо переключателя и ее значение хранится внутри модуля.
# 4. Вы можете добавлять или изменять данные о квесте по условию в событии так:
# QS.add({:name=>'Спаси принцессу!'})
# далее добавить условие, спасена ли принцесса (какой-нибудь переключатель)
# QS[QS.last][:name]='Спас? Верни ее в замок!'
# В данном случае QS.last возвращает номер последнего занесенного в систему
# квеста. Будьте осторожны с этим. Используйте QS.find[*МЕТКА КВЕСТА (:shrt)*],
# если между получением последнего задания и его измением может быть получение
# какого-нибудь другого задания:
# QS.find('qu_0')[:name]='Спас? Верни ее в замок!'
#--------------------------------------------------
#==================================================
# Добавляет метод to_b для простейшей конвертации
# в булевые значения (true и false)
class Fixnum
def to_b
return self!=0 ? true : false
end
end
# Добавляет метод для совместимости
class TrueClass
def to_b
true
end
end
# Добавляет метод для совместимости
class FalseClass
def to_b
false
end
end
# Основной модуль для работы с системой
# квестов от DeadElf79
module QS
class << self
# Возвращает хэш-таблицу данных о задании
# под номером, указанным в параметре index
# Если элемента массива под номером index
# не существует, возвращает пустую
# хэш-таблицу {}
def [](index)
@data||=[]
return {} if @data.nil?
return {} if !index.between?(0,@data.size-1)
return @data[index]
end
# Добавляет новое задание. Переменная hash принимает
# значение, относящееся к классу Hash и ничего более.
def add(hash={})
return if !hash.is_a? Hash
@data||=[]
@data<<{
:shrt=>(hash.include?(:shrt) ? hash[:shrt].to_s : "qu_#{@data.size}"),
:name=>(hash.include?(:name) ? hash[:name].to_s : '' ),
:desc=>(hash.include?(:desc) ? hash[:desc].to_s : '' ),
:swit=>(hash.include?(:swit) ? hash[:swit].to_i : 001 ),
:comp=>(hash.include?(:comp) ? hash[:comp].to_b : false ),
:town=>(hash.include?(:town) ? hash[:town].to_s : '' ),
:recv=>(hash.include?(:recv) ? hash[:recv].to_s : '' ),
}
end
# Удаляет задание по указанным номеру или метке (переменная :shrt).
def remove(ios)
return if @data.nil?
case ios.class
when Fixnum
return if !ios.between?(0,@data.size-1)
@data-=[@data[ios]]
when String
return if !include?(ios)
index=0
@data.each{|hash|
index+=1
break if hash[:shrt]==shrt
}
@data-=[@data[index]]
end
end
# Проверяет наличие задания в общем списке заданий по его метке.
def include?(shrt)
return false if @data.nil?
return false if @data.size==0
@data.each{|hash|
return true if hash[:shrt]==shrt.to_s
}
false
end
# Возвращает значение TRUE, если задание было выполнено
# (то есть переменная :comp приняла значение TRUE).
def complete?(shrt)
return false if @data.nil?
return false if @data.size==0
@data.each{|hash|
if hash[:shrt]==shrt.to_s
return true if hash[:comp]==true
end
}
false
end
# Возвращает true, если переключатель, номер которого указан в :swit
# принял состояние TRUE (ВКЛ).
def show?(index)
return false if !global_variables.include?(:$game_switches)
return false if $game_switches.nil?
return if @data.nil?
@data.each{|q|
if q[:shrt]==index[:shrt]
return true if $game_switches[q[:swit].to_i]==true
end
}
false
end
# Задает номер переключателя, при включении которого
# задание будет показано в списке.
def set_switch(index,switch)
return false if @data.nil?
return if !index.between?(0,@data.size-1)
@data[index][:swit]=switch.to_b
end
# Задает город, в котором нужно сдать задание под номером, указанным
# в переменной index.
def set_town(index,string)
return false if @data.nil?
return if !index.between?(0,@data.size-1)
@data[index][:town]=string.to_s
end
# Задает имя персонажа, который будет принимать выполенное задание
# под номером, указанным в переменной index.
def set_receiver(index,string)
return false if @data.nil?
return if !index.between?(0,@data.size-1)
@data[index][:recv]=string.to_s
end
# Возвращает номер последнего элемента в списке заданий.
def last
@data.index(@data.last)
end
# Метод находит задание по соответствующей метке (:shrt)
# и возвращает хэш-таблицу найденного задания.
# Если задание найдено не было, возвращает
# пустую хэш-таблицу.
def find(shrt)
return {} if @data.nil?
if include?(shrt)
@data.each{|hash|
return @data[@data.index(hash)] if hash[:shrt]==shrt.to_s
}
end
{}
end
# Метод находит задание по соответствующей метке (:shrt)
# и возвращает номер задания в списке.
# Если задание найдено не было, возвращает -1.
def index(shrt)
return {} if @data.nil?
if include?(shrt)
@data.each{|hash|
return @data.index(hash) if hash[:shrt]==shrt.to_s
}
end
-1
end
# Метод, аналогичный Array.each, позволяет производить
# работу над всеми заданиями, существующими в модуле.
# Два примера кода действуют одинакова:
# for index in 0...QS.last
# QS[index][:comp]=true
# end
#
# QS.each{|qu|
# qu[:comp]=true
# }
# Метод может принимать блок в качестве параметра.
def each
return if @data.nil?
@data.compact.each {|hash| yield hash } if block_given?
end
# Метод возвращает все
# созданные задания,
# которые имеются в модуле.
def save
array=[]
@data||=[]
@data.each{|hash|
array<<hash
}
array
end
# Загружает данные о созданных заданиях
# из массива. Применяется при загрузке
# сохраненной ранее игры.
def load(d)
@data.clear if !@data.nil?
@data=d
end
end
end Аддон: меню к ней#==================================================
#--------------------------------------------------
#
# DE79 QUEST SYSTEM MODULE
# Addon: Menu
#
#--------------------------------------------------
# Автор: DeadElf79
# Версия: 1.0.1
# История версий:
# 1.0
# - Первая публикация
# 1.0.1
# - Устранен вылет при пустом списке
# заданий (спасибо, Subzeroy)
# Требует для работы:
# * DE79 QUEST SYSTEM MODULE
# Желательно для использования с:
# * DE79 QUEST SYSTEM MODULE Addon: Menu
#--------------------------------------------------
# Добавляет меню для показа
# списка заданий. Не требует
# настроек.
#--------------------------------------------------
#==================================================
# Добавленяет аттрибут "чтение/запись"
# для переменной list в составе класса
class Window_Selectable < Window_Base
attr_accessor :list
end
# Добавляет строки для окна
# описания выбранного задания
# для убодной замены на свои
# Форматирование(цвет) поддерживается,
# но имеет одну специфическую деталь:
# символ \c в двойных кавычках
# обычно превращается в нечто непонятное.
# Используйте \\c для того, чтобы
# не возникало проблемы с указанием цвета
# текста. Или же заключайте строку
# в одинарные кавычки.
module Vocab
DE79_qs_town = '\c[2]Куда сдавать:\c[0]' # одинарные кавычки
DE79_qs_recv = "\\c[2]Кому сдавать:\\c[0]" # двойные кавычки
DE79_qs_desc = "\\c[2]Описание:\\c[0]"
end
# Этот класс реализует отображение
# отдельного меню со списком всех
# заданий, для которых включены
# указанные переключатели.
# По умолчанию задание будет показано,
# если включен переключатель
# под номером один, если номер
# переключателя не был задан отдельно.
class DE79_QuestSystemMenu < Scene_MenuBase
# Старт сцены с меню,
# запуск создания всех окон
def start
super
@last_index=0
create_quest_list_window
create_quest_name_window
create_quest_info_window
end
# Создание окна со списком заданий
def create_quest_list_window
@quest_list_window = Window_Command.new(0,0)
@quest_list_window.width=240
@quest_list_window.height = Graphics.height
@quest_list_window.back_opacity = 160
@quest_list_window.set_handler(:cancel, method(:return_scene))
index=0
QS.each{|qu|
if QS.show?(QS.find(qu[:shrt]))
@quest_list_window.add_command(qu[:name],qu[:shrt].to_sym,true)
end
index+=1
}
@quest_list_window.create_contents
@quest_list_window.draw_all_items
@quest_list_window.select 0
end
# Создание окна для отображения
# названия выбранного задания
def create_quest_name_window
@quest_name_window = Window_Base.new(0,0,160,48)
@quest_list_window.back_opacity = 160
@quest_name_window.x = @quest_list_window.width
@quest_name_window.width = Graphics.width - @quest_list_window.width
@quest_name_window.create_contents
draw_quest_name
end
# Отрисовка информации
# в окно, которое отображает
# название текущего задания
def draw_quest_name
return if @quest_list_window.item_max==0
@quest_name_window.contents.clear
@quest_name_window.draw_text(0,0,@quest_name_window.contents_width,
@quest_name_window.contents.height,@quest_list_window.command_name(
@quest_list_window.index))
end
# Создает окно для вывода
# описания задания, а также
# информации о городе
# и персонаже, если они были
# указаны при создании квеста
def create_quest_info_window
@quest_info_window = Window_Base.new(0,0,160,48)
@quest_info_window.back_opacity = 160
@quest_info_window.x = @quest_list_window.width
@quest_info_window.y = @quest_name_window.height
@quest_info_window.width = Graphics.width - @quest_list_window.width
@quest_info_window.height = Graphics.height - @quest_name_window.height
@quest_info_window.create_contents
draw_quest_info
end
# Отрисовка описания
# выбранного задания
def draw_quest_info
@quest_info_window.contents.clear
return if @quest_list_window.list == []
hash=QS.find(@quest_list_window.list[@quest_list_window.index][:symbol])
offset=0
if hash[:town]!=''
@quest_info_window.draw_text_ex(0,offset,Vocab::DE79_qs_town)
@quest_info_window.draw_text_ex(0,offset+20,hash[:town])
offset+=40
end
if hash[:recv]!=''
@quest_info_window.draw_text_ex(0,offset,Vocab::DE79_qs_recv)
@quest_info_window.draw_text_ex(0,offset+20,hash[:recv])
offset+=40
end
@quest_info_window.draw_text_ex(0,offset,Vocab::DE79_qs_desc)
@quest_info_window.draw_text_ex(0,offset+20,hash[:desc])
end
# Обновление меню
def update
super
update_info
end
# Обновление окон
# с название и описанием
# выбранного задания
def update_info
if @quest_list_window.index!=@last_index
draw_quest_name
draw_quest_info
@last_index=@quest_list_window.index
end
end
# Завершение сцены
def terminate
super
dispose_all_quest_windows
end
# Удаление всех окон
def dispose_all_quest_windows
@quest_list_window.dispose
@quest_name_window.dispose
@quest_info_window.dispose
end
end Аддон: добавление кнопки во внутриигровое меню#==================================================
#--------------------------------------------------
#
# DE79 QUEST SYSTEM MODULE
# Addon: MainMenu
#
#--------------------------------------------------
# Автор: DeadElf79
# Версия: 1.0.0
# Требует для работы:
# * DE79 QUEST SYSTEM MODULE
# * DE79 QUEST SYSTEM MODULE Addon: Menu
#--------------------------------------------------
# Добавляет команду вызова
# меню заданий в основное меню
# (класс Scene_Menu).
#--------------------------------------------------
#==================================================
# Измените значение на false,
# если вы не хотите, чтобы меню заданий
# было доступно для вызова из меню.
# Эта настройка только выключает кнопку,
# не удаляя ее из меню!
ENABLE_DE79_QS_MENU = true
# Добавляет название кнопки в общий словарь
# для убодной замены
module Vocab
DE79_qs = 'Задания'
end
# Добавляет кнопку в окно общего меню
class Window_MenuCommand < Window_Command
# Создает алиас метода для обеспечения совместимости
alias before_qs_add_original_commands add_original_commands
# Метод, который был создан специально для
# для добавления кнопок, вызывающих
# меню из нестандартных скриптов
def add_original_commands
before_qs_add_original_commands
add_command(Vocab::DE79_qs, :de79_qs, ENABLE_DE79_QS_MENU)
end
end
# Добавляет обработку нажатия кнопки
class Scene_Menu < Scene_MenuBase
# Создает алиас метода для обеспечения совместимости
alias before_qs_create_command_window create_command_window
# Добавляет метод, который вызывается
# при нажатии кнопки вызова меню заданий
# (см. de79_QuestSystem - Menu)
def create_command_window
before_qs_create_command_window
@command_window.set_handler(:de79_qs, method(:command_de79_qs))
end
# Вызывает меню из скрипта
# de79_QuestSystem - Menu
def command_de79_qs
SceneManager.call(DE79_QuestSystemMenu)
end
end Аддон: запись данных о квестах в сохранение#==================================================
#--------------------------------------------------
#
# DE79 QUEST SYSTEM MODULE
# Addon: Save/Load
#
#--------------------------------------------------
# Автор: DeadElf79
# Версия: 1.0.2
# История версий:
# 1.0
# - Первая публикация
# 1.0.1
# - Исправлены сохранение и загрузка
# 1.0.2
# - Скрипт совместим с другими скриптами,
# меняющими сохранение
# Требует для работы:
# * DE79 QUEST SYSTEM MODULE
#--------------------------------------------------
# Добавляет возможность сохранения/загрузки
# игры вместе с текущим состоянием квестов.
#--------------------------------------------------
#==================================================
module DataManager
class <<self
# Модификация метода сохранения
alias de79qs_make_save_contents make_save_contents
def make_save_contents
contents = de79qs_make_save_contents
contents[:de79_qs] = QS.save
contents
end
# Модификация метода загрузки
alias de79qs_extract_save_contents extract_save_contents
def extract_save_contents(contents)
de79qs_extract_save_contents(contents)
QS.load contents[:de79_qs]
end
end
end
Скриншоты:
Скачать:
Архив ZIP (1,3 МБ)
|