#==============================================================================
# Quest Journal
# Version: 1.1
# Author: modern algebra (rmrk.net)
# Date: March 24, 2008
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Description:
# Basically, this script is an objective based quest log that allows the
# user to make quests and reveal them to the characters through specified
# script calls. It is objective based, meaning that you advance the quest
# by having the player complete objectives and you can choose when to reveal
# these objectives and when to set them as complete or as failed. That being
# said, this script does not build quests, it more or less gives you a
# graphical interface for showing quest progress. It does run by script
# call, and so read the instructions carefully if you want to use this script
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Instructions:
# Basically, set up all of your quests in the module below. The Constants
# section is annotated, so read the comments near them to determine what you
# should set these constants to. As you can see, they are filled in with
# default values currently, and so that should give you an idea of what to
# do.
#
# Setting up quests can be a little bit harder. You will have to set one
# of these up for every quest that you want represented in the scene. Refer
# to the editable region inside the class Quest for further instructions
#
# Once they are setup, you can activate them at any time in the game by
# this code:
#
# $game_party.quests[quest_id]
#
# There are several methods you can call that are of relevance. Namely:
#
# $game_party.quests[quest_id].reveal_objective (objective_id)
# $game_party.quests[quest_id].conceal_objective (objective_id)
# $game_party.quests[quest_id].complete_objective (objective_id)
# $game_party.quests[quest_id].uncomplete_objective (objective_id)
# $game_party.quests[quest_id].fail_objective (objective_id)
# $game_party.quests[quest_id].unfail_objective (objective_id)
# $game_party.quests[quest_id].complete?
# $game_party.quests[quest_id].failed?
# $game_party.quests[quest_id].reward_given = true/false
# $game_party.quests[quest_id].concealed = true/false
# $game_party.quests.remove (quest_id)
#
# There are other methods that you can access, but they are irrelevant for
# the purposes of controlling quest progress. These are fairly self-
# explanatory methods, but in case they aren't, reveal_objective naturally
# allows the specified objective to appear in the Quest Journal for browsing
# by the user. complete_objective notes when an objective is complete, and
# fail_objective notes when the player has done something that fails this
# objective. complete? returns true if all primary objectives have been
# completed and failed? returns true if any primary objective has been
# failed. reward_given serves the function of a switch. You should
# essentially make the reward event look like this:
#
# @> Conditional Branch: Script: $game_party.quests[quest_id].complete?
# @> Conditional Branch: Script: $game_party.quests[quest_id].reward_given
# @> ...Thank you or whatever you want the event to say once the reward has been given
# @> Else
# @> ...Give Reward
# @> Script: $game_party.quests[quest_id].reward_given = true
# @> Branch End
# @> Branch End
#
# Later versions of this script will have an auto-reward system and also a
# Journal to which the player can write notes.
#
# You can also disable access to the Quest Log at any time with the code:
# $game_system.quest_disabled = true
#
# And you can change how it is accessed with the codes:
#
# $game_system.quest_keyaccess = true / false # ON MAP
# $game_system.quest_menuaccess = true / false # IN MENU
#
# Also, in a message, \nq[quest_id] will retrieve the name of a quest and
# print it in a message
#================================================================================
# *** Quest Data
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# This is the configuration class for the Quest Journal
#================================================================================
module ModAlg_QuestData
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Constants
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Editable Region
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
QUESTS_LABEL = 'Quests' # What you want Quests to be called (eg. 'Missions')
ACTIVE_QUEST_ICON = 149 # What icon signifies a quest is active
COMPLETE_QUEST_ICON = 150 # What icon signifies a quest is complete
FAILED_QUEST_ICON = 179 # What icon signifies a quest is failed
BULLET_CHARACTER = '?' # The character used for listing objectives
ACTIVE_COLOUR = 0 # The colour of a quest that is active
COMPLETE_COLOUR = 11 # The colour of a quest that is complete
FAILED_COLOUR = 18 # The colour of a quest that is failed
MENU_ACCESS = true # Can the script be accessed through the menu?
MENU_INDEX = 4 # If above is true, where in the command window?
KEY_ACCESS = false # Can the quest log be accessed by a key
MAPKEY_BUTTON = Input::L # If above is true, which button?
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Quest Data
#----------------------------------------------------------------------------
# Returns skeleton data for the quesr
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def self.quest_data (id)
# Set class variables to corresponding arguments
objectives = []
name = '??????'
description = '??????????'
icon_index = 0
case id
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * EDITABLE REGION
#------------------------------------------------------------------------
# To set up a quest, first identify it with an ID - this can be anything
# as long as it is not the same as another quest, but it is important to
# remember this ID as it is the only way to access your quest.
# In any case, the format for setting up a quest is:
#
# when # Give the quest an ID number
# name = ''
# description = ''
# objectives[0] = ''
# ...
# objectives[n] = ''
# prime = [, ..., ]
# icon_index =
#
# Each of these values have an importance.
# name is the name of the quest
# description is a small blurb explaining the overall goal of the quest
# objective[0..n] are short-term goals that lead to the overall goal
# primes are which objectives need to be complete before the quest is
# considered to be complete
# icon_index is the icon that represents the quest
#
# Note that any of the above values can be omitted without throwing an
# error, but for the quest to work properly you should at least set the
# name, description, and objectives. If you do omit these, the default
# values are:
#
# name = '??????'
# description = '??????????'
# objectives = []
# prime = [all objectives]
# icon_index = 0
#
# If you do want to require that all objectives must be satisfied before
# the quest is complete, then do not bother defining it. Otherwise, be
# sure to set it.
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
when 1 # Fetch
name = 'Fetch'
description = 'Martha needs someone to play with her dog'
objectives[0] = 'Find a stick'
objectives[1] = 'Throw the stick to the dog'
objectives[2] = 'Retrieve the stick from the dog'
icon_index = 79
when 4 # Cat Retrieval
name = 'Cat Retrieval'
description = 'Mrs. Bunderby has lost her cat, and she has employed you to find it.'
objectives[0] = 'Find the lost cat'
objectives[1] = 'Climb the tree and retrieve the cat'
objectives[2] = "Return a cat to Mrs. Bunderby"
# Set prime objectives in an array based on index
prime = [0, 2]
icon_index = 137
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * END EDITABLE REGION
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
end
return name, description, objectives, prime, icon_index
end
#============================================================================
# ** Quest
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Holds in-game data for a quest
#============================================================================
class Quest
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Public Instance Variables
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
attr_reader :name # The name of the quest
attr_reader :id # The ID in $game_party.quests
attr_reader :description # A blurb explaining the quest
attr_reader :objectives # An array of strings holding objectives
attr_reader :prime_objectives # An array of crucial objectives
attr_reader :icon_index # The Icon associated with this quest
attr_reader :revealed_objectives # An array of revealed objectives
attr_reader :complete_objectives # An array of completed objectives
attr_reader :failed_objectives # An array of failed objectives
attr_accessor :reward_given # A switch to ensure only one reward given
attr_accessor :concealed # A switch to show or not show the quest
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Object Initialization
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def initialize (id)
@id = id
# Set class variables to corresponding arguments
@name, @description, @objectives, prime, @icon_index = ModAlg_QuestData.quest_data (id)
# If no primary objectives are specified
if prime.nil?
# All objectives become primary
prime = []
for i in 0...@objectives.size
prime.push (i)
end
end
@prime_objectives = prime
# Initialize non-public arrays
@revealed_objectives = []
@complete_objectives = []
@failed_objectives = []
@reward_given = false
@concealed = false
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Reveal Objective
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def reveal_objective (index)
return if index >= @objectives.size
# Add to revealed objectives
@revealed_objectives |= [index]
# Sort from lowest index to highest index
@revealed_objectives.sort!
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Conceal Objective
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def conceal_objective (index)
@revealed_objectives.delete (index)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Complete Objective
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def complete_objective (index)
return if index >= @objectives.size
# If the objective is failed, you cannot complete it.
return if @failed_objectives.include? (index)
# Reveal the objective if it was not previously revealed
reveal_objective (index) unless @revealed_objectives.include? (index)
# Add to complete objectives
@complete_objectives |= [index]
# Sort from lowest index to highest index
@complete_objectives.sort!
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Uncomplete Objective
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def uncomplete_objective (index)
@complete_objectives.delete (index)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Fail Objective
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def fail_objective (index)
return if index >= @objectives.size
# Reveal the objective if it has not yet been revealed
reveal_objective (index) unless @revealed_objectives.include? (index)
# Add to revealed objectives
@failed_objectives |= [index]
# Sort from lowest index to highest index
@failed_objectives.sort!
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Unfail Objective
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def unfail_objective (index)
@failed_objectives.delete (index)
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Complete?
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def complete?
# Check if all prime objectives have been completed
return (@complete_objectives & @prime_objectives) == @prime_objectives
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Failed?
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def failed?
# Check if any prime objectives have been failed
return (@failed_objectives & @prime_objectives) != []
end
end
end
#==============================================================================
# ** Ellipse
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Stores an ellipse object.
#==============================================================================
class Ellipse
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Public Instance Variables
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
attr_reader :a # The width of the oval
attr_reader :b # The Height of the oval
attr_reader :x # the top left x position
attr_reader :y # the top left y position
attr_reader :h # The x position of the origin
attr_reader :k # The y position of the origin
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Object Initialization
# x : the top left x position
# y : the top left y position
# a : the width of oval from origin to the side
# b : the height of oval from origin. If nil, then a is radius of circle
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def initialize (x, y, a, b = nil)
@x = x
@y = y
@a = a
@b = b.nil? ? a : b
@h = x + a
@k = y + @b
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Within?
# x : the x coordinate being tested
# y : the y coordinate being tested
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def within? (x, y)
x_square = ((x - @h)*(x - @h)).to_f / (@a*@a)
y_square = ((y - @k)*(y - @k)).to_f / (@b*@B)
# If "radius" 1
ellipse = Ellipse.new (ellipse.x + 1, ellipse.y + 1, ellipse.a - 1, ellipse.b - 1)
outline_ellipse (ellipse, colour, width - 1, steps)
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Fill Ellipse
# ellipse : the ellipse being drawn
# colour : the colour of the outline
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def fill_ellipse (ellipse, colour = font.color, steps = 0)
# For neatness, define local variables a and b to the ellipse variables
a, b = ellipse.a, ellipse.b
# Use Ramanujan's approximation of the Circumference of an ellipse
steps = Math::PI*(3*(a + B) - Math.sqrt((3*a + B)*(a + 3*B))) if steps == 0
radian_modifier = (2*Math::PI) / steps
for i in 0...(steps / 2)
t = (radian_modifier*i) % (2*Math::PI)
# Expressed parametrically:
# x = h + acos(t), y = k + bsin(t) : where t ranges from 0 to 2pi
x = ellipse.h + (a*Math.cos(t))
y = ellipse.k - (b*Math.sin(t))
fill_rect (x, y, 1, 2*(ellipse.k - y), colour)
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Fill Rounded Rectangle
# rect : the rectangle being drawn
# colour : the colour of the outline
# w : the number of pixels to cover by rounding
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Used to fill a rectangle with rounded corners
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def fill_rounded_rect (rect, colour = font.color, w = 8)
# Draw Body of the rectangle
fill_rect (rect.x + w, rect.y, rect.width - 2*w, rect.height, colour)
# Draw Left Vertical Rect
fill_rect (rect.x, rect.y + w, w, rect.height - 2*w, colour)
# Draw Right Vertical Rect
x = rect.x + rect.width - w
fill_rect (x, rect.y + w, w, rect.height - 2*w, colour)
# Make a circle
circle = Ellipse.new (0, 0, w)
for i in 0...w
for j in 0...w
# Upper Left Corner
set_pixel (rect.x + i, rect.y + j, colour) if circle.within? (i, j)
# Upper Right Corner
set_pixel (rect.x + rect.width - w + i, rect.y + j, colour) if circle.within? (i + w, j)
# Bottom Left Corner
set_pixel (rect.x + i, rect.y + rect.height - w + j, colour) if circle.within? (i, j + w)
# Bottom Right Corner
set_pixel (rect.x + rect.width - w + i, rect.y + rect.height - w + j, colour) if circle.within? (i + w, j + w)
end
end
end
end
#==============================================================================
# ** Window_VarySizeHelp
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# This window is the same as Window_Help, but with variable size
#==============================================================================
class Window_VarySizeHelp All, 1 => Active, 2 => Complete, 3 => Failed
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def refresh (category_index = 0)
contents.clear
# Retrieve Icon Bitmaps
bitmap = Cache.system("Iconset")
icon_index = ModAlg_QuestData::ACTIVE_QUEST_ICON
active_rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
icon_index = ModAlg_QuestData::COMPLETE_QUEST_ICON
complete_rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
icon_index = ModAlg_QuestData::FAILED_QUEST_ICON
failed_rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
# Combine the three icons for the All Icon
all_icon = Bitmap.new (40, 32)
all_icon.blt (0, 0, bitmap, complete_rect)
all_icon.blt (20, 0, bitmap, failed_rect)
all_icon.blt (8, 10, bitmap, active_rect)
distance = (contents.width - 112) / 3
x = 0
# Draw the 'All' Icon onto the window
contents.blt (x, 0, all_icon, all_icon.rect, category_index == 0 ? 255 : 128)
x += 40 + distance
# Draw the 'Active' Icon onto the window
contents.blt (x, 4, bitmap, active_rect, category_index == 1 ? 255 : 128)
x += 24 + distance
# Draw the 'Complete' Icon onto the window
contents.blt (x, 4, bitmap, complete_rect, category_index == 2 ? 255 : 128)
x += 24 + distance
# Draw the 'Failed' Icon onto the window
contents.blt (x, 4, bitmap, failed_rect, category_index == 3 ? 255 : 128)
end
end
#==============================================================================
# ** Window_QuestList
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# This window displays the list of quests
#==============================================================================
class Window_QuestList All, 1 => Active, 2 => Complete, 3 => Failed
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def refresh (category_index = 0)
font = Font.new
@data.clear
self.index = 0
# Get the quest list to be drawn
case category_index
when 0
@data = $game_party.quests.list
when 1
@data = $game_party.quests.active_list
font.color = text_color (ModAlg_QuestData::ACTIVE_COLOUR)
when 2
@data = $game_party.quests.completed_list
font.color = text_color (ModAlg_QuestData::COMPLETE_COLOUR)
when 3
@data = $game_party.quests.failed_list
font.color = text_color (ModAlg_QuestData::FAILED_COLOUR)
end
@item_max = @data.size
unless contents == nil
# Clear Contents
contents.clear
return if @data.empty?
contents.dispose
end
# Create Contents
self.contents = Bitmap.new (width - 32, WLH*@data.size)
contents.font = font
# Draw the Quest Names
for i in 0...@data.size
quest = @data[i]
# If all, distinguish between quest types by colour
if category_index == 0
if quest.complete?
contents.font.color = text_color (ModAlg_QuestData::COMPLETE_COLOUR)
elsif quest.failed?
contents.font.color = text_color (ModAlg_QuestData::FAILED_COLOUR)
else # Active
contents.font.color = text_color (ModAlg_QuestData::ACTIVE_COLOUR)
end
end
draw_icon (quest.icon_index, 0, i*WLH)
# Draw the name of the quest
contents.draw_text (24, i*WLH, contents.width - 24, WLH, quest.name)
end
end
end
#==============================================================================
# ** Window_QuestInfo
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# This window displays the information on the quest being viewed
#==============================================================================
class Window_QuestInfo = ModAlg_QuestData::MENU_INDEX
@menu_index += 1
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Create Command Window
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modalg_quest_journal_menu_cmmnd_win_create create_command_window
def create_command_window
modalg_quest_journal_menu_cmmnd_win_create
# If accessed through map, then don't add it to the menu
return unless $game_system.quest_menuaccess
c = @command_window.commands
c.insert (ModAlg_QuestData::MENU_INDEX, ModAlg_QuestData::QUESTS_LABEL)
width = @command_window.width
disabled = @command_window.disabled_commands
@command_window.dispose
@command_window = Window_Command.new(width, c)
@command_window.index = @menu_index
# Disable all of the old commands as well
disabled.each { |i|
i += 1 if i >= ModAlg_QuestData::MENU_INDEX
@command_window.draw_item (i, false)
}
if $game_system.quest_disabled || $game_party.quests.list.empty? # If Quest Journal disabled
@command_window.draw_item (ModAlg_QuestData::MENU_INDEX, false)
end
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Update Command Selection
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modalg_quest_journal_menu_cmmnd_select_upd update_command_selection
def update_command_selection
if $game_system.quest_menuaccess
changed = false
if @command_window.index == ModAlg_QuestData::MENU_INDEX && Input.trigger? (Input::C)
if $game_system.quest_disabled || $game_party.quests.list.empty? # If Quest Journal disabled
Sound.play_buzzer
else
# Open Quest Window
Sound.play_decision
$scene = Scene_Quest.new
end
return
end
# If the command index is greater than it ought to be, make sure
if @command_window.index > ModAlg_QuestData::MENU_INDEX
@command_window.index = (@command_window.index - 1) % @command_window.commands.size
changed = true
end
end
modalg_quest_journal_menu_cmmnd_select_upd
return unless $game_system.quest_menuaccess
@command_window.index = (@command_window.index + 1) % @command_window.commands.size if changed
end
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# * Update Actor Selection
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
alias modalg_quest_jrnl_actor_selection_upd update_actor_selection
def update_actor_selection
changed = false
if $game_system.quest_menuaccess && @command_window.index > ModAlg_QuestData::MENU_INDEX
@command_window.index = (@command_window.index - 1) % @command_window.commands.size
changed = true
end
modalg_quest_jrnl_actor_selection_upd
return unless $game_system.quest_menuaccess
@command_window.index = (@command_window.index + 1) % @command_window.commands.size if changed
end
end
#==============================================================================
# ** Scene_Quest
#------------------------------------------------------------------------------
# This class performs the quest screen processing.
#==============================================================================
class Scene_Quest