赞 | 0 |
VIP | 1 |
好人卡 | 0 |
积分 | 1 |
经验 | 3179 |
最后登录 | 2013-10-25 |
在线时间 | 140 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 66
- 在线时间
- 140 小时
- 注册时间
- 2012-2-6
- 帖子
- 384
|
xuzhengchi 发表于 2012-3-9 00:49
这个外站的脚本如何?
代码太长,直接上范例吧:http://115.com/file/anjixvgo
此脚本的汉化版:- #==============================================================================
- # Quest Journal [VXA]
- # Version: 1.0d
- # Author: modern algebra (rmrk.net)
- # Date: February 27, 2012
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Description:
- #
- # This script provides a graphical interface for showing quest progress. It
- # is objective-based, meaning that you choose when to reveal objectives and
- # you can set it so that they show up as complete or failed. That said, this
- # script does not build quests for you; it is only a supplementary scene for
- # showing them. As such, you need to event all of the quests yourself and
- # update quest progress via script call. Therefore, pay close attention to
- # the instructions here and in the Editable Regions at lines 232 and 612.
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Instructions:
- #
- # Paste this script into its own slot or slots, above Main and below
- # Materials. If you are using the menu access feature, you should put any
- # other menu scripts above this one.
- #
- # All of the configuration is done in the QuestData module. While it is not
- # necessary, it is recommended that you separate the configuration module
- # from the rest of the script by cutting and pasting it into its own slot in
- # the Script Editor (as you will see if you have the demo). The reason for
- # this is that, if and when this script gets updated, you can preserve the
- # configuration section and only replace the other parts of the script. If
- # you wish to do that, you must cut everything from the first line down to
- # the final end of the module. The first lines of the body script should be
- # the equals bar right above # ** Game_Quest. Again, it's up to you whether
- # you do it.
- #
- # You can go to EDITABLE REGION A at line 232 to configure the default
- # settings for the script. All of these will work fine without modification,
- # of course, but even if do not want to configure now, you should familiarize
- # yourself with all the settings so that you can make the best use of your
- # script. I have included tons of settings so that you can make the Quest
- # Journal unique for your game, even down to the order in which each section
- # of the info window is drawn. A brief description of each setting is
- # included either to the right or directly above each constant.
- #
- # EDITABLE REGION B is the real heart of the script however - this is where
- # you fill in all of the details for the quests. Read the instructions at
- # line 612 very carefully!
- #
- # You can activate and access a quest with this code in the Script event
- # command:
- #
- # quest(quest_id)
- # quest_id : the integer ID of the quest you want to access
- #
- # From that, you can access or alter any relevant data stored in the quest,
- # like name, description, objectives, etc... Example:
- # quest(1).name = "Rest in Pieces"
- #
- # More relevantly, when it comes to controlling the progress of quests the
- # following codes can be used in a Script event command. The arguments are
- # the same for each command so I only explain them once. All of them are
- # pretty self-explanatory and using any of them will activate the quest
- # (unless you are using the MANUAL REVEAL setting at line 267).
- #
- # reveal_objective(quest_id, objective_id_1, ..., objective_id_n)
- # quest_id : the integer ID of the quest you want to access.
- # objective_id_1, ..., objective_id_n : a list of the IDs of the
- # objectives you want to operate on. It can be as few as one or as
- # many as all of them.
- # Will show the listed objectives in the Quest's information
- #
- # conceal_objective(quest_id, objective_id_1, ..., objective_id_n)
- # Will hide the listed objectives in the Quest's information
- #
- # complete_objective(quest_id, objective_id_1, ..., objective_id_n)
- # Changes the colour of the listed objectives to the completed colour.
- # The quest is completed once all prime objectives are.
- #
- # uncomplete_objective (quest_id, objective_id_1, ..., objective_id_n)
- # Changes the status of the listed complete objectives back to active
- #
- # fail_objective(quest_id, objective_id_1, ..., objective_id_n)
- # Changes the colour of the listed objectives to the failed colour.
- # The quest is failed once one prime objective is.
- #
- # unfail_objective(quest_id, objective_id_1, ..., objective_id_n)
- # Changes the status of the listed failed objectives back to active
- #
- # change_reward_status(quest_id, value)
- # value : either true or false. If excluded, defaults to true.
- # Totally optional, but this is just a personal switch which you can
- # turn on when the reward is given. You can then make it a condition
- # so you don't reward the players more than once. (see line 180)
- #
- # EXAMPLES:
- # reveal_objective(1, 0)
- # This would reveal the first objective of the quest with ID 1
- # complete_objective(6, 2, 3)
- # This would complete the third & fourth objectives of the quest with ID 6
- # change_reward_status(8)
- # This would set the reward switch to true for the quest with ID 8.
- #
- # Another new feature is the ability to set rewards that will show up in the
- # menu (see EDITABLE REGION B). In addition to that, you can use the following
- # code to automatically distribute the specified rewards for a quest if the
- # quest is complete and no reward has yet been given:
- #
- # distribute_quest_rewards(quest_id)
- # quest_id : the ID of the quest whose rewards you want to distribute
- #
- # Of course, it can only distribute the material rewards (items, weapons,
- # armors, gold, or exp). It won't distribute rewards you specify by string.
- # To that end though, you can also use this code in a conditional branch and
- # it will be satisfied only if it distributes the rewards. Thus, if you
- # wanted to add some special rewards or do things like that, you can just put
- # that in the branch for when it is true. This feature is not really
- # recommended, since I think it is better to do it by events.
- #
- # Other codes for the Script event command that can be useful are:
- #
- # reset_quest(quest_id)
- # quest_id : the integer ID of the quest you want to access.
- # This will re-initialize the quest, meaning all quest progress to
- # date will be lost
- #
- # remove_quest(quest_id)
- # Deactivates the quest and resets it
- #
- # conceal_quest(quest_id)
- # Deactivates the quest so it won't show up in the scene, but progress
- # is saved
- #
- # reveal_quest(quest_id)
- # Activates or reactivates the quest. This command is NECESSARY if
- # MANUAL_REVEAL at line 284 is true or it has previously been
- # concealed. Otherwise, it is sufficient just to operate on the quest
- #
- # change_quest_access(:symbol)
- # :symbol must be one of six options (include the colon!):
- # :disable - prevents access to the quest scene (greys out in menu)
- # :enable - enables access to the quest scene
- # :disable_menu - this removes the quest option from the menu
- # :enable_menu - this adds the quest option to the menu
- # :disable_map - this prevents access by key from the map
- # :enable_map - this allows access by key to the map
- #
- # change_quest_background("bg_filename", bg_opacity, bg_blend_type)
- # bg_filename : the filename of the picture for the background in
- # the Pictures folder
- # bg_opacity : the opacity of the background graphic. If
- # excluded, this defaults to the value of the setting at line 434.
- # bg_blend_type : the blend type of the background graphic. If
- # excluded, this defaults to the value of the setting at line 437.
- #
- # change_quest_windows ("windowskin_filename", tone, opacity)
- # windowskin_filename : the name of the Window graphic in the
- # System folder of Graphics
- # opacity : the opacity of the windows. If excluded,
- # this defaults to the value of the setting at line 423.
- # blend_type : the blend_type of the windows. If excluded,
- # this defaults to the value of the setting at line 426.
- #
- # Also, there are a few codes that can be used in the Script command of a
- # conditional branch. I note here that all of these are optional. You could
- # use switch and variable checks and monitor quest progress solely through
- # events. However, these commands make it a little easier and they are:
- #
- # quest_revealed?(quest_id)
- # quest_id : the integer ID of the quest you want to access.
- # This is satisfied if the quest has been activated.
- #
- # quest_complete?(quest_id)
- # This is satisfied if all prime objectives of the quest are complete
- #
- # quest_failed?(quest_id)
- # This is satisfied if any prime objective of the quest is failed
- #
- # quest_rewarded?(quest_id)
- # This is satisfied if you have changed the reward status to true.
- #
- # objective_revealed?(quest_id, objective_id_1, ... objective_id_n)
- # objective_id_1, ..., objective_id_n : a list of the IDs of the
- # objectives you want to operate on. It can be as few as one or as
- # many as all of them.
- # This is satisfied if the listed objectives have been revealed
- #
- # objective_active?(quest_id, objective_id_1, ... objective_id_n)
- # This is satisfied if all the listed objectives are revealed and
- # neither complete nor failed.
- #
- # objective_complete?(quest_id, objective_id_1, ... objective_id_n)
- # This is satisfied if all the listed objectives have been completed
- #
- # objective_failed?(quest_id, objective_id_1, ... objective_id_n)
- # This is satisfied if all the listed objectives have been failed
- #
- # If you want to call the Quest scene from an event, you use the following
- # code in a call script:
- #
- # call_quest_journal
- # call_quest_journal(quest_id)
- # quest_id : ID of the quest you want to open the scene on
- #
- # If you do not specify a quest_id (line 198) then it will simply open the
- # scene as it would normally. If you do specify a quest_id (line 199) then it
- # will open the scene on that quest so long as it has been revealed and it is
- # normally accessible through the quest menu.
- #
- # Finally, the default way this script operates is that quests automatically
- # complete or fail based on the status of the prime objectives. However, you
- # can set it so that there are no prime objectives, in which case you can only
- # complete, fail, or (re)activate a quest manually through the following code
- # in a script call:
- #
- # manually_complete_quest(quest_id)
- # quest_id : ID of the quest you want to manually complete
- # manually_fail_quest(quest_id)
- # quest_id : ID of the quest you want to manually fail
- # manually_activate_quest(quest_id)
- # quest_id : ID of the quest you want to manually activate
- #==============================================================================
- $imported ||= {}
- $imported[:"MA_QuestJournal_1.0"] = true
- #==============================================================================
- # *** QuestData
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This module contains all the configuration data for the quest journal
- #==============================================================================
- module QuestData
- #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- # BEGIN Editable Region A
- #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- # MENU_ACCESS - If true, you can access the quest journal through a command
- # in the menu. If false, there will be no such command.
- MENU_ACCESS = false
- # MENU_INDEX - If MENU_ACCESS is true, this determines where it appears
- MENU_INDEX = 4
- # MAP_ACCESS - If true, this allows you to access the quest journal by
- # pressing a key on the map.
- MAP_ACCESS = true
- # MAP_BUTTON - If MAP_ACCESS is true, this determines which button calls the
- # Quest Journal
- MAP_BUTTON = :L
- # OPEN_TO_LAST_REVEALED_QUEST - If true, then the first time you open the
- # quest journal after revealing a new quest, it will open to the new quest.
- OPEN_TO_LAST_REVEALED_QUEST = true
- # OPEN_TO_LAST_CHANGED_QUEST - If true, then the Quest Journal will open to
- # the last quest whose objective status has changed.
- OPEN_TO_LAST_CHANGED_QUEST = false
- # LIST_WINDOW_WIDTH - The width, in pixels, of the List Window
- LIST_WINDOW_WIDTH = 192
- # BASIC_DATA_TYPES - This lets you set up additional types of data. Just
- # include an identifying signal in the Array. Then, you will need to give
- # each signal an icon (in the ICONS hash at line 322) and a signal text (in
- # the VOCAB array at line 333, though it can be an empty string). Then, you
- # can set the data itself when setting up quests by simply adding a:
- # q[:symbol] = ""
- # line to the quest. You will also need to include the data type somewhere in
- # the DATA_LAYOUT at line 306. As an example of this, I have included :client
- # and :location by default. You can CTRL+F for anything in this section with
- # one of those symbols (excluding :) and you will there need to add something
- # for any new data types you add.
- BASIC_DATA_TYPES = [:client, :location]
- # BASIC_DATA_WIDTH - This determines how much room, in pixels, is given to
- # any basic data types you set up in the data window.
- BASIC_DATA_WIDTH = 240
- # CONCURRENT_ACTIVITY - If true, then when in the Quest Journal scene, you
- # can switch categories or scroll down the quest list at the same time. If
- # false, you will first need to select a category before you can start
- # scrolling through the quest list.
- CONCURRENT_ACTIVITY = true
- # HIDE_CATEGORY_CURSOR - If true, then the Category Window will not have a
- # cursor and will instead just highlight the currently selected category.
- # This is best when CONCURRENT_ACTIVITY is true.
- HIDE_CATEGORY_CURSOR = true
- # SHOW_QUEST_ICONS - If true, then the icon you choose for each quest will
- # be displayed to the left of its name in the Quest List window
- SHOW_QUEST_ICONS = true
- # MANUAL_REVEAL - If false, then quests will be revealed the moment you
- # first reveal, complete, or fail an objective. If this is true, you will
- # need to specifically reveal each quest via a separate script call:
- # reveal_quest(quest_id)
- MANUAL_REVEAL = false
- # DATA_LAYOUT - This controls the way that the quest window lays out all of
- # the relevant data. If you set one of the entries to be an array, then any
- # of the commands there will be drawn at the same y. With exception to :line,
- # none of the commands will be drawn if the quest is not set to have that
- # particular data. The symbols are:
- # :line - Draws a horizontal line across the window.
- # :name - Draws the name of the quest
- # :level - Draws the level of the quest
- # :banner - Draws the banner for the quest
- # :client - Draws the client set in the quest (basic data)
- # :location - Draws the location set in the quest (basic data)
- # :description - Draws the quest's description
- # :objectives - Draws all the quest's objectives that have been revealed
- # :rewards - Draws whatever rewards have been set
- #
- # You will also need to add an entry for any new BASIC_DATA that you place
- # in BASIC_DATA_TYPES at line 264.
- #
- # Remember to place a comma after each entry. Also note that this is only the
- # default layout. You can set a different layout for any quest, and when
- # viewing that quest, it will be the custom layout that is shown.
- DATA_LAYOUT = [
- [:line, :name, :level],
- :banner,
- :client,
- :location,
- :description,
- :objectives,
- [:line, :rewards],
- :line,
- ] # <= Do not touch.
- # ICONS - This is where you setup many of the icons used in the script. The
- # purpose of each is listed next to it. Also, if you make any custom
- # categories, you NEED to give them an icon by placing a line like the
- # others. So, if the new custom category is :romance then you would need to
- # set it like this:
- # romance: 107,
- ICONS = {
- all: 226, # The icon for the All Quests category
- active: 236, # The icon for the Active Quests category
- complete: 238, # The icon for the Complete Quests category
- failed: 227, # The icon for the Failed Quests category
- client: 121, # The icon for client data. If none wanted, set to 0
- location: 231, # The icon for location data. If none wanted, set to 0
- reward_gold: 262, # The icon for gold rewards. If none wanted, set to 0
- reward_exp: 117, # The icon for exp rewards. If none wanted, set to 0
- } # <= Do not touch.
- # VOCAB - This lets you choose some of the words used in the quest scene
- VOCAB = {
- # menu_label: The command name in the menu if MENU_ACCESS is true
- menu_label: "任务",
- # scene_label: The label at the top of the scene. If empty, no window
- scene_label: "任务选单",
- # description: The heading to identify the description
- description: "任务介绍",
- # objectives: The heading to identify the objectives
- objectives: "任务目标",
- # objective_bullet: The bullet which shows up to the left of every
- # objective. If %d is included, it shows the objective's ID.
- objective_bullet: "?",
- # rewards: The heading to identify the rewards.
- rewards: "奖励",
- # reward_amount: For item rewards, this is the text to show the amount.
- # It should include %d to show the amount.
- reward_amount: "x%d",
- # reward_gold: Text to identify gold rewards
- reward_gold: "",
- # reward_exp: Text to identify exp rewards
- reward_exp: "",
- # level: If LEVEL_ICON is 0, this is the text which precedes the level
- level: "",#级别:",
- # location: The text label for quest location
- location: "",
- # location: The text label for quest client
- client: "",
- } # <= Do not touch.
- # CATEGORIES - This array allows you to set which categories are available
- # in the Quest scene. The default categories are :all, :active, :complete,
- # and :failed, and their names are self-explanatory. You can add custom
- # categories as well, but note that you will need to make sure that each new
- # category has an icon set in the ICONS hash, as well as a label set in the
- # CATEGORY_VOCAB hash (if you are using SHOW_CATEGORY_LABEL). It is also
- # advisable to give it a sort type, unless you are fine with it being sorted
- # by ID, as is default.
- CATEGORIES = [:all, :active, :complete, :failed]
- # SHOW_CATEGORY_LABEL - This allows you to choose whether to show the name
- # of the currently selected category. If true, it will choose the name out
- # of the CATEGORY_VOCAB hash.
- SHOW_CATEGORY_LABEL = true
- # CATEGORY_LABEL_IN_SAME_WINDOW - If SHOW_CATEGORY_LABEL is true, then this
- # options lets you choose whether the label is shown in the same window as
- # the category icons or in a separate window below. true = same window.
- CATEGORY_LABEL_IN_SAME_WINDOW = true
- # CATEGORY_VOCAB - If SHOW_CATEGORY_LABEL is true, this hash lets you set the
- # label for each category. For any custom categories you create, you will
- # need to add a line for each below and in the same format:
- # :category => "Label",
- # Don't forget to add the comma at the end of each line.
- CATEGORY_VOCAB = {
- :all => "所有任务", # The label for the :all category
- :active => "当前任务", # The label for the :active category
- :complete => "已完成任务", # The label for the :complete category
- :failed => "失败的任务", # The label for the :failed category
- } # <= Do not touch.
- # SORT_TYPE - This hash allows you to choose how each category is sorted.
- # For each category, default or custom, you can set a different sort method
- # There are seven options to choose from:
- # :id - The quests are sorted from lowest to highest ID
- # :alphabet - The quests are sorted in alphabetical order
- # :level - The quests are sorted from the lowest to highest level
- # :reveal - The quests are sorted from most recently revealed on.
- # Every time a new quest is revealed, it will be at the top.
- # :change - The quests are sorted from the one whose status most recently
- # changed on. So, every time an objective is modified, that quest
- # will be thrown to the top.
- # :complete - The quests are sorted from the most recently completed on.
- # Every time a quest is completed, it will be thrown to the top.
- # :failed - The quests are sorted from the most recently failed on.
- # Every time a quest is failed, it will be thrown to the top.
- #
- # Additionally, you can put _r at the end of any of the sort options and it
- # will reverse the order. So, for instance, if the sort method for a category
- # is :alphabet_r, then the quests will show up from Z-A
- SORT_TYPE = {
- :all => :id, # Sort type for the All Quests category
- :active => :change, # Sort type for the Active Quests category
- :complete => :complete, # Sort type for the Complete Quests category
- :failed => :failed, # Sort type for the Failed Quests category
- } # <= Do not touch.
- # WINDOWSKIN - The windowskin for each window in the Quest scene. It must
- # refer to a graphic in the System folder of Graphics. If set to false, then
- # it will use whatever windowskin is default. If you are using a script which
- # lets the player choose the windowskin, false is the recommended value.
- WINDOWSKIN = false
- # WINDOW_TONE - The tone for each window. It must be an array in the form:
- # WINDOW_TONE = [red, green, blue, gray]
- # gray can be excluded, but the other three must be present. If you set this
- # value to false, then the windows will have whatever tone is default.
- WINDOW_TONE = false
- # WINDOW_OPACITY - The opacity of the windows in the Quest scene. If set to
- # false, it will use the default opacity for windows.
- WINDOW_OPACITY = false
- # BG_PICTURE - This is a string referring to a picture in the Picture folder
- # of Graphics. If set to "", then there will be no picture. Otherwise, it
- # will display the selected picture below the windows but above the map in
- # the Quest scene.
- BG_PICTURE = ""
- # BG_OPACITY - This allows you to set the opacity of the background picture,
- # if you have selected one.
- BG_OPACITY = 255
- # BG_BLEND_TYPE - This allows you to set the blend type of the background
- # picture, if you have selected one.
- BG_BLEND_TYPE = 0
- # DESCRIPTION_IN_BOX - This is a graphical option, and it allows you to
- # choose whether the description should be shown in a box.
- DESCRIPTION_IN_BOX = true
- # LEVEL_ICON - This sets how levels are shown. If set to an integer, then it
- # will draw the same icon numerous times up to the level of the quest. Ie. If
- # the level's quest is 1, then the icon will only be drawn once, but if the
- # level's quest is 4, it will be drawn 4 times. LEVEL_ICONS_SPACE determines
- # the space between them. If you set LEVEL_ICON to 0, however, then it will
- # instead draw a signal for the level, corresponding to that index in the
- # LEVEL_SIGNALS array. If the LEVEL_SIGNALS array is empty, then it will just
- # draw the integer for the level. Finally, LEVEL_ICON can also be an array of
- # integers, in which case the level will be represented only by the icon set
- # which corresponds to it in the array.
- LEVEL_ICON = 0
- # LEVEL_ICONS_SPACE - If LEVEL_ICON is an integer, this is the amount of
- # space between each time the icon is drawn.
- LEVEL_ICONS_SPACE = 12
- # LEVEL_SIGNALS - If LEVEL_ICON is 0, this allows you to set what string
- # should be the signal for each level. If this array is empty, then it will
- # just draw the level integer. Ie. if the Quest is Level 4, it will draw 4.
- LEVEL_SIGNALS = ["傻逼", "普通", "智者", "疯子", "国战", "种族", "天道"]
- # COLOURS - This lets you change the colour for various aspects of the
- # quest scene. Each can be set in one of three ways:
- # :symbol - If you use a symbol, the colour will be the result of calling
- # the method of the same name. For instance, if you set something to
- # :system_color, it will set the colour to the result of the Window_Base
- # system_color method.
- # Integer - If you set the colour to an integer, then it will take its
- # colour from the windowskin palette, just like using \c[x] in messages.
- # Array - You can also set the rgba values directly with an array in the
- # format: [red, green, blue, alpha]. alpha can be excluded, but you must
- # have values for red, green, and blue.
- COLOURS = {
- # active: This sets the colour for active quests in the list and the name
- # of the active quest when shown in the data window.
- active: :normal_color,
- # complete: This sets the colour for complete quests in the list and the
- # name of the complete quest when shown in the data window.
- complete: 3,
- # failed: This sets the colour for failed quests in the list and the name
- # of the failed quest when shown in the data window.
- failed: 10,
- # line: This sets the colour for lines or boxes drawn in the quest scene
- line: :system_color,
- # line_shadow: This sets the colour of the shadow for lines or boxes drawn
- # in the quest scene
- line_shadow: [0, 0, 0, 128],
- # scene_label: This sets the colour for the scene label, if shown
- scene_label: :system_color,
- # category_label: This sets the colour for the category label, if shown
- category_label: :normal_color,
- # level_signal: This sets the colour for the level signal, if shown
- level_signal: :normal_color,
- # objective_bullet: This sets the colour for objectives; if set to
- # :maqj_objective_color, it will reflect the completion status of the
- # objective, but you can change it to something else if you prefer
- objective_bullet: :maqj_objective_color,
- # reward_amount: The colour of the item amount, when shown
- reward_amount: :normal_color,
- # heading: The colour of any headings in the script, like "Description"
- heading: :system_color,
- # basic_label: For basic data, like client, the colour of the label
- basic_label: :system_color,
- # basic_value: For basic data, like client, the colour of the value
- basic_value: :normal_color,
- } # <= Do not touch.
- # HEADING_ALIGN - This sets the alignment for the aspects listed. 0 is Left;
- # 1 is Centre; 2 is Right
- HEADING_ALIGN = {
- description: 0, # Alignment for the Description heading
- objectives: 0, # Alignment for the Objectives heading
- rewards: 1, # Alignment for the Rewards heading
- level: 2 # Alignment when showing the level
- } # <= Do not touch.
- #````````````````````````````````````````````````````````````````````````````
- # Font Aspects
- #
- # All of the following options (FONTNAMES, FONTSIZES, FONTBOLDS, and
- # FONTITALICS) allow you to alter the fonts used for various aspects of the
- # scene. The only one listed there by default is normal:, which is the
- # font used by default for the entire scene. However, you can change the
- # fonts for almost any aspect - all you need to do is add a line like so:
- #
- # description: value,
- #
- # and that will change that font aspect when drawing the description. The
- # following symbols are available for changing:
- #
- # normal: The default font used for every part of the scene
- # list: The font used in the List Window
- # scene_label: The font used when drawing the Scene Label, if shown
- # category_label: The font used when drawing the Category Label, if shown
- # heading: The font used when drawing any headings, like "Description"
- # name: The font used when drawing the quest name in data window
- # description: The font used when drawing the Description
- # objectives: The font used when drawing the objectives
- # rewards: The font used when drawing the rewards
- # client: The font used when drawing the client
- # location: The font used when drawing the location
- #
- # For any of them, you need to set a value. What the value can be depends
- # on which font aspect you are changing and is described below, but for any
- # of them setting it to the false will mean it will simply use the default
- #
- # For any that you add, remember that you must put a comma after the value.
- #````````````````````````````````````````````````````````````````````````````
- # FONTNAMES - Here you can change the font used for any of the various
- # options. It can take any of the following types of values:
- # false - The default font will be used
- # "String" - The font with the name "String" will be used.
- # [Array] - The array must be in the form: ["String1", "String2", ...]
- # The font used will be the first one in the array that the
- # player has installed.
- #
- # EXAMPLES:
- #
- # normal: false,
- # The font used for unaltered aspects of the scene is the default font
- # scene_label: "Algerian",
- # The font used for the Scene Label will be Algerian.
- # description: ["Cambria", "Times New Roman"],
- # The font used when drawing the description will be Cambria if the
- # player has Cambria installed. If the player does not have Cambria
- # installed, then the font used will be Times New Roman
- FONTNAMES = {
- normal: false, # normal: the default font name
- } # <= Do not touch.
- # FONTSIZES - Here you can change the size of the font. There are two types
- # of values you can set:
- # false - The default fontsize will be used
- # Integer - The fontsize will be equal to the value of the Integer.
- #
- # For everything but the label windows, this shouldn't exceed 24, since that
- # is the line_height. However, for scene_label: and category_label:, the size
- # of the window will be adjusted to whatever size you set the font.
- FONTSIZES = {
- normal: false, # normal: default font size
- scene_label: 28, # scene_label: fontsize for the Scene Label window
- category_label: 24, # category_label: fontsize for Category Label window
- } # <= Do not touch.
- # FONTBOLDS - Here you can set whether the font will be bolded. You can set
- # it to either false, in which case it will not be bolded, or true, in which
- # case it will be bolded.
- FONTBOLDS = {
- scene_label: true, # scene_label: whether font is bold for Scene Label
- heading: true, # heading: whether font is bold for the headings
- level_signal: true, # level_signal: whether font is bold for level
- } # <= Do not touch.
- # FONTITALICS - Here you can set whether the font will be italicized. You
- # can set it to either false, in which case it will not be italicized, or
- # true, in which case it will be italicized.
- FONTITALICS = {
- }
- #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- # END Editable Region A
- #//////////////////////////////////////////////////////////////////////////
- CATEGORIES = [:all] if !CATEGORIES || CATEGORIES.empty?
- VOCAB.default = ""
- ICONS.default = 0
- CATEGORY_VOCAB.default = ""
- SORT_TYPE.default = :id
- COLOURS.default = :normal_color
- HEADING_ALIGN.default = 0
- FONTNAMES.default = false
- FONTSIZES.default = false
- FONTBOLDS.default = false
- FONTITALICS.default = false
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Setup Quest
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def self.setup_quest(quest_id)
- q = { objectives: [] }
- case quest_id
- #\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
- # BEGIN Editable Region B
- #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- # Quest Setup
- #
- # This is where you set up the data for every quest in the game. While
- # it may seem complicated, I urge you to pay attention and, once you get
- # the hang of it, I am sure it will quickly become second nature.
- #
- # Every single quest should be set up in the following format, but note
- # that if you are not setting anything for a particular aspect, you can
- # delete that line. Anyway, this is what each quest should look like, with
- # the values on the left being the default values if you don't set them:
- #
- # when quest_id
- # q[:name] = "??????"
- # q[:icon_index] = 0
- # q[:level] = 0
- # q[:description] = ""
- # q[:banner] = ""
- # q[:banner_hue] = 0
- # q[:objectives][0] = ""
- # q[:objectives][1] = ""
- # q[:objectives][2] = ""
- # q[:objectives][n] = ""
- # q[:prime_objectives] = [0, 1, 2, n]
- # q[:custom_categories] = []
- # q[:client] = ""
- # q[:location] = ""
- # q[:rewards] = []
- # q[:common_event_id] = 0
- # q[:layout] = false
- #
- # For each line, with the exception of objectives, it is only the value on
- # the right of the equals sign that you will need to change. Now I will
- # explain each line:
- #
- # when quest_id
- # quest_id - is an integer of your choosing, and this is how you
- # reference a quest in order to advance and do anything else. It
- # must be unique for every quest; if you use 1 for the first quest,
- # you cannot use 1 for any other quest.
- #
- # q[:name] = ""
- # "" - This line sets the name of the quest which shows in the Quest
- # List.
- #
- # q[:icon_index] = 0
- # 0 - This line sets the icon to be used for this quest. It will show
- # to the left of the quest's name in the Quest List.
- #
- # q[:level] = 0
- # 0 - This line sets the level of the quest. If 0, no level will be
- # shown. See the level options at lines 441-458 for more detail.
- #
- # q[:description] = ""
- # "" - This line sets the description of the quest. You can use message
- # codes in this string, but if you are using "" then you need to use
- # \\ to identify codes and not just \. Ie. It's \\v[x], not \v[x]
- #
- # q[:objectives][0] = ""
- # q[:objectives][1] = ""
- # q[:objectives][2] = ""
- # q[:objectives][n] = ""
- # Objectives are slightly different. Notice that after q[:objectives] on
- # each line there is an integer enclosed in square brackets:
- # [n] - This is the ID of the objective, and n MUST be an integer. No
- # quest can have more than one objective with the same ID. This is
- # how you identify which objective you want to reveal, complete or
- # fail. That said, you can make as many objectives as you want, as
- # long as you give them all distinct IDs. The IDs should be in
- # sequence as well, so there shouldn't be a q[:objectives][5] if
- # there is no q[:objectives][4].
- # "" - This is the text of the objective. You can use message codes in
- # this string, but if you are using "" then you will need to use
- # \\ to identify codes and not just \. Ie: It's \\v[x], not \v[x]
- #
- # q[:prime_objectives] = [0, 1, 2, n]
- # [0, 1, 2, n] - This array determines what objectives need to be
- # completed in order for the quest to be complete. In other words,
- # all of the objectives with the IDs in this array need to be
- # complete for the quest to be complete. If any one of them is
- # failed, the quest will be failed. If you remove this line
- # altogether, then all objectives are prime. If you set this to [],
- # then the quest will never be automatically completed or failed and
- # you need to use the manual options described at lines 207-218.
- #
- # q[:custom_categories] = []
- # [] - This allows you to set an array of custom categories for this
- # quest, whiich means this quest will show up in each of those
- # categories if you add it to the CATEGORIES array at line 369.
- # Note that each category you make must be identified by a unique
- # :symbol, and you must set up all the category details for that
- # :symbol.
- #
- # q[:banner] = ""
- # "" - This line sets the banner to be used for a quest. It must be the
- # filename of an image in the Pictures folder of Graphics.
- #
- # q[:banner_hue] = 0
- # 0 - The hue of the banner graphic, if used
- #
- # q[:client] = ""
- # "" - This line sets the client name for this quest. (basic data)
- #
- # q[:location] = ""
- # "" - This line sets the location of the quest. (basic data)
- #
- # q[:rewards] = []
- # [] - In this array, you can identify particular rewards that will
- # show up
- #
- # q[:common_event_id] = 0
- # 0 - This allows you to call the identified common event immediately
- # and automatically once the quest is completed. It is generally
- # not recommended, as for most quests you should be controlling it
- # enough not to need this feature.
- #
- # q[:layout] = false
- # false - The default value for this is false, and when it is false the
- # layout for the quest will be inherited from the default you set at
- # 302. However, you can also give the quest its own layout - the
- # format would be the same as you set for the default at line 306.
- #
- # Template:
- #
- # When making a new quest, I recommend that you copy and paste the
- # following template, removing whichever lines you don't want to alter.
- # Naturally, you need to remove the #~. You can do so by highlighting
- # the entire thing and pressing CTRL+Q:
- #~ when 2 # <= REMINDER: The Quest ID MUST be unique
- #~ q[:name] = "??????"
- #~ q[:icon_index] = 0
- #~ q[:level] = 0
- #~ q[:description] = ""
- #~ # REMINDER: You can make as many objectives as you like, but each must
- #~ # have a unique ID.
- #~ q[:objectives][0] = ""
- #~ q[:objectives][1] = ""
- #~ q[:objectives][2] = ""
- #~ q[:prime_objectives] = [0, 1, 2]
- #~ q[:custom_categories] = []
- #~ q[:banner] = ""
- #~ q[:banner_hue] = 0
- #~ q[:client] = ""
- #~ q[:location] = ""
- #~ q[:rewards] = []
- #~ q[:common_event_id] = 0
- when 1 # Quest 1 - SAMPLE QUEST
- q[:name] = "黑暗的苏醒"
- q[:level] = 7
- q[:icon_index] = 7
- q[:description] = "圣骑士长的膝盖中了一箭,投靠了黑
- 暗势力。请联络大天使加百列讨论天
- 人联盟的问题。"
- q[:objectives][0] = "与大天使加百列对话"
- q[:objectives][1] = "组建天人联盟"
- q[:objectives][2] = "帮助重建天国"
- q[:objectives][3] = "与黑暗圣骑士战斗并取得胜利"
- q[:prime_objectives] = [0, 1]
- q[:custom_categories] = []
- q[:banner] = ""
- q[:banner_hue] = 0
- q[:client] = "加百列"
- q[:location] = "天堂遗迹"
- q[:common_event_id] = 0
- q[:rewards] = [
- [:item, 1, 3],
- [:gold, 500],
- ]
- q[:layout] = false
- #||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
- # END Editable Region B
- #//////////////////////////////////////////////////////////////////////
- end
- q
- end
- end
- #==============================================================================
- # *** DataManager
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Summary of Changes:
- # aliased method - self.extract_save_contents
- #==============================================================================
- class << DataManager
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Extract Save Contents
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- alias maqj_extractsavecons_2kw5 extract_save_contents
- def extract_save_contents(*args, &block)
- maqj_extractsavecons_2kw5(*args, &block) # Call Original Method
- if $game_party.quests.nil?
- $game_party.init_maqj_data
- $game_system.init_maqj_data
- end
- end
- end
- #==============================================================================
- # ** MAQJ_SortedArray
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This module mixes in to an array to maintain the sorted order when inserting
- #==============================================================================
- module MAQJ_SortedArray
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Insert to Array
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def maqj_insert_sort(el, &block)
- index = bsearch_index(el, 0, size, &block)
- index ? insert(index, el) : push(el)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Retrieve Index from Binary Search
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def bsearch_index(el, b = 0, e = size, &block)
- return bsearch_index(el, b, e) { |a,b| a <=> b } if block.nil?
- return b if b == e # Return the discovered insertion index
- return if b > e
- m = (b + e) / 2 # Get Middle
- block.call(el, self[m]) > 0 ? b = m + 1 : e = m
- bsearch_index(el, b, e, &block)
- end
- end
- #==============================================================================
- # ** Game_Quest
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This class holds all instance data for a quest
- #==============================================================================
- class Game_Quest
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Public Instance Variables
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- attr_reader :id # Unique identifier for this quest
- attr_reader :name # The name to be shown for the quest
- attr_reader :level # The level of difficulty of the quest
- attr_reader :objectives # An array of objective strings
- attr_reader :prime_objectives # An array of crucial objective IDs
- attr_reader :revealed_objectives # An array of revealed objective IDs
- attr_reader :complete_objectives # An array of completed objective IDs
- attr_reader :failed_objectives # An array of failed objective IDs
- attr_reader :custom_categories # An array of category symbols
- attr_accessor :icon_index # Icon associated with this quest
- attr_accessor :common_event_id # ID of common event to call upon complete
- attr_accessor :description # The description for the quest
- attr_accessor :banner # Picture shown to represent the quest
- attr_accessor :banner_hue # The hue of the banner
- attr_accessor :layout # The layout of this quest in scene
- attr_accessor :rewards # An array of rewards to show
- attr_accessor :reward_given # Boolean tracking if quest was rewarded
- attr_accessor :concealed # Whether or not the quest is visible
- attr_accessor :manual_status # Quest status if not using prime objectives
- QuestData::BASIC_DATA_TYPES.each { |data_type| attr_accessor(data_type) }
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def initialize(quest_id)
- @id = quest_id
- @concealed = default_value_for(:concealed)
- @reward_given = default_value_for(:reward_given)
- reset
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Reset
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def reset
- data = QuestData.setup_quest(@id)
- data_symbol_array.each { |meth| instance_variable_set(:"@#{meth}",
- data[meth] ? data[meth] : default_value_for(meth)) }
- @revealed_objectives = [].send(:extend, MAQJ_SortedArray)
- @complete_objectives = [].send(:extend, MAQJ_SortedArray)
- @failed_objectives = [].send(:extend, MAQJ_SortedArray)
- @manual_status = default_value_for(:manual_status)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Data Symbol Array
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def data_symbol_array
- [:name, :level, :objectives, :prime_objectives, :custom_categories,
- :icon_index, :description, :banner, :banner_hue, :common_event_id,
- :layout, :rewards] + QuestData::BASIC_DATA_TYPES
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Default Value
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def default_value_for(method)
- case method
- when :name then "??????"
- when :description, :banner then ""
- when :level, :banner_hue, :icon_index, :common_event_id then 0
- when :objectives, :rewards, :custom_categories then []
- when :prime_objectives then Array.new(objectives.size) { |x| x }
- when :concealed then QuestData::MANUAL_REVEAL
- when :manual_status then :active
- when :layout, :reward_given then false
- else ""
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Reveal/Conceal Objective
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def reveal_objective(*obj)
- valid_obj = obj.select {|x| x < objectives.size && !@revealed_objectives.include?(x) }
- valid_obj.each {|i| @revealed_objectives.maqj_insert_sort(i) }
- quest_status_changed unless valid_obj.empty?
- end
- def conceal_objective(*obj)
- quest_status_changed unless (obj & @revealed_objectives).empty?
- obj.each { |obj_id| @revealed_objectives.delete(obj_id) }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Complete/Uncomplete Objective
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def complete_objective(*obj)
- valid_obj = obj.select {|x| x < objectives.size && !@complete_objectives.include?(x) }
- reveal_objective(*valid_obj)
- unfail_objective(*valid_obj)
- was_complete = status?(:complete)
- valid_obj.each {|i| @complete_objectives.maqj_insert_sort(i) }
- quest_status_changed unless valid_obj.empty?
- # If just completed
- if status?(:complete) && !was_complete
- $game_temp.reserve_common_event(common_event_id)
- $game_party.quests.add_to_sort_array(:complete, @id)
- end
- end
- def uncomplete_objective(*obj)
- quest_status_changed unless (obj & @complete_objectives).empty?
- obj.each { |obj_id| @complete_objectives.delete(obj_id) }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Fail/Unfail Objective
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def fail_objective(*obj)
- valid_obj = obj.select {|x| x < objectives.size && !@failed_objectives.include?(x) }
- reveal_objective(*valid_obj)
- uncomplete_objective(*valid_obj)
- was_failed = status?(:failed)
- valid_obj.each {|i| @failed_objectives.maqj_insert_sort(i) }
- quest_status_changed unless valid_obj.empty?
- $game_party.quests.add_to_sort_array(:failed, @id) if status?(:failed) && !was_failed
- end
- def unfail_objective(*obj)
- quest_status_changed unless (obj & @failed_objectives).empty?
- obj.each { |obj_id| @failed_objectives.delete(obj_id) }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Updates when the quest status has been changed
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def quest_status_changed
- $game_party.quests.add_to_sort_array(:change, @id)
- $game_system.last_quest_id = @id if QuestData::OPEN_TO_LAST_CHANGED_QUEST
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Objective Status?
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def objective_status?(status_check, *obj)
- return false if obj.empty?
- case status_check
- when :failed then !(obj & @failed_objectives).empty?
- when :complete then obj.size == (obj & @complete_objectives).size
- when :revealed then obj.size == (obj & @revealed_objectives).size
- when :active then objective_status?(:revealed, *obj) &&
- !objective_status?(:complete, *obj) && !objective_status?(:failed, *obj)
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Status?
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def status?(status_check)
- case status_check
- when :failed
- @prime_objectives.empty? ? @manual_status == :failed :
- !(@failed_objectives & @prime_objectives).empty?
- when :complete
- @prime_objectives.empty? ? @manual_status == :complete : !status?(:failed) &&
- ((@prime_objectives & @complete_objectives) == @prime_objectives)
- when :active then !concealed && !status?(:complete) && !status?(:failed)
- when :reward then @reward_given
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Name
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def name=(new_name)
- @name = new_name
- $game_party.quests.add_to_sort_array(:alphabet, @id) if $game_party &&
- $game_party.quests
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Level
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def level=(new_lvl)
- @level = new_lvl
- $game_party.quests.add_to_sort_array(:level, @id) if $game_party &&
- $game_party.quests
- end
- end
- #==============================================================================
- # ** Game_Quests
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This is a wrapper for an array holding Game_Quest objects
- #==============================================================================
- class Game_Quests
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def initialize
- @data = {}
- @sort_arrays = {
- reveal: [], change: [], complete: [], failed: [],
- id: [].send(:extend, MAQJ_SortedArray),
- alphabet: [].send(:extend, MAQJ_SortedArray),
- level: [].send(:extend, MAQJ_SortedArray)
- }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Get Quest
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def [](quest_id)
- reset_quest(quest_id) if !@data[quest_id]
- @data[quest_id]
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Quest <- Not sure when this would ever be useful.
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def []=(quest_id, value)
- @data[quest_id] = value
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * List
- # list_type : the type of list to return
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def list(list_type = :all, sort_type = $game_system.quest_sort_type[list_type])
- sort_type_s = sort_type.to_s
- reverse = !(sort_type_s.sub!(/_r$/, "")).nil?
- sort_type = sort_type_s.to_sym
- list = @sort_arrays[sort_type].select { |quest_id| include?(quest_id, list_type) }
- list.reverse! if reverse
- list.collect { |quest_id| @data[quest_id] }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Include?
- # determines whether to include a particular quest depending on list type
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def include?(quest_id, list_type = :all)
- return false if !revealed?(quest_id)
- case list_type
- when :all then true
- when :complete, :failed, :active then @data[quest_id].status?(list_type)
- else
- @data[quest_id].custom_categories.include?(list_type)
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Revealed?
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def revealed?(quest_id)
- (!@data[quest_id].nil? && !@data[quest_id].concealed)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Setup Quest
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def setup_quest(quest_id)
- return if @data[quest_id]
- @data[quest_id] = Game_Quest.new(quest_id)
- # Open to this quest next time the QJ is opened
- $game_system.last_quest_id = quest_id if QuestData::OPEN_TO_LAST_REVEALED_QUEST
- # Save sorting order in separate arrays to avoid re-sorting every time
- @sort_arrays.keys.each { |sym| add_to_sort_array(sym, quest_id) }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Delete Quest
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def delete_quest(quest_id)
- @data.delete(quest_id)
- @sort_arrays.values.each { |ary| ary.delete(quest_id) }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Reset Quest
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def reset_quest(quest_id)
- delete_quest(quest_id)
- setup_quest(quest_id)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Add to Sorted Array
- # sort_type : array to alter
- # quest_id : ID of the quest to add.
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def add_to_sort_array(sort_type, quest_id)
- @sort_arrays[sort_type].delete(quest_id) # Make sure always unique
- case sort_type
- when :reveal, :change, :complete, :failed
- @sort_arrays[sort_type].unshift(quest_id)
- when :id
- @sort_arrays[sort_type].maqj_insert_sort(quest_id)
- when :alphabet
- @sort_arrays[sort_type].maqj_insert_sort(quest_id) { |a, b| @data[a].name.downcase <=> @data[b].name.downcase }
- when :level
- @sort_arrays[sort_type].maqj_insert_sort(quest_id) { |a, b| @data[a].level <=> self[b].level }
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Find Location
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def find_location(quest_id, cat = nil)
- if revealed?(quest_id)
- categories = $game_system.quest_categories.dup
- # If cat specified, check in that category first.
- if cat && categories.include?(cat)
- categories.delete(cat)
- categories.unshift(cat)
- end
- for category in categories # Check all categories
- index = list(category).index(@data[quest_id])
- return category, index if index != nil
- end
- end
- return nil, nil
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Clear
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def clear
- @data.clear
- end
- end
- #==============================================================================
- # ** Game System
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Summary of Changes:
- # new attr_accessor - quest_menu_access; quest_map_access; quest_sort_type;
- # quest_bg_picture; quest_bg_opacity; quest_windowskin;
- # quest_window_opacity; quest_access_disabled; last_quest_cat;
- # last_quest_id
- # aliased methods - initialize
- # new methods - init_maqj_data
- #==============================================================================
- class Game_System
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Public Instance Variables
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- attr_reader :quest_menu_access # Whether the scene is called from menu
- attr_accessor :quest_map_access # Whether the scene is called from map
- attr_accessor :quest_sort_type # The sort types for each category
- attr_accessor :quest_bg_picture # The filename of the background picture
- attr_accessor :quest_bg_opacity # The opacity of the background picture
- attr_accessor :quest_bg_blend_type # The blend type of the background pic
- attr_accessor :quest_windowskin # The windowskin used for the scene
- attr_accessor :quest_window_tone # The tone of windows in the scene
- attr_accessor :quest_window_opacity # The opacity of windows in the scene
- attr_accessor :quest_access_disabled # Whether access to Quests is disabled
- attr_accessor :quest_categories # The categories to show in the scene
- attr_accessor :quest_scene_label # The label to show in the scene
- attr_accessor :last_quest_cat # The category to open to
- attr_accessor :last_quest_id # The ID to open to
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- alias maqj_initialze_2cy9 initialize
- def initialize(*args, &block)
- maqj_initialze_2cy9(*args, &block)
- init_maqj_data
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Initialize Quest Data
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def init_maqj_data
- # Initialize new variables
- self.quest_menu_access = QuestData::MENU_ACCESS
- @quest_map_access = QuestData::MAP_ACCESS
- @quest_sort_type = QuestData::SORT_TYPE
- @quest_bg_picture = QuestData::BG_PICTURE
- @quest_bg_opacity = QuestData::BG_OPACITY
- @quest_bg_blend_type = QuestData::BG_BLEND_TYPE
- @quest_windowskin = QuestData::WINDOWSKIN
- @quest_window_tone = QuestData::WINDOW_TONE
- @quest_window_opacity = QuestData::WINDOW_OPACITY
- @quest_access_disabled = false
- @quest_categories = QuestData::CATEGORIES
- @quest_scene_label = QuestData::VOCAB[:scene_label]
- @last_quest_cat = @quest_categories[0]
- @last_quest_id = 0
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Quest Menu Access
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def quest_menu_access=(boolean)
- @quest_menu_access = boolean
- maic_inserted_menu_commands.delete(:quest_journal)
- maic_inserted_menu_commands.push(:quest_journal) if @quest_menu_access
- maic_inserted_menu_commands.sort!
- end
- end
- #==============================================================================
- # ** Game_Party
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Summary of Changes:
- # new attr_reader - quests
- # aliased method - initialize
- # new method - init_maqj_data
- #==============================================================================
- class Game_Party
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Public Instance Variables
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- attr_reader :quests
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- alias maqj_intiaze_2si9 initialize
- def initialize(*args, &block)
- maqj_intiaze_2si9(*args, &block) # Call Original Method
- init_maqj_data
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Initialize Quests
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def init_maqj_data
- @quests = Game_Quests.new # Initialize @quests
- end
- end
- #==============================================================================
- # ** Game_Interpreter
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Summary of Changes:
- # new methods - change_quest_access; change_quest_background;
- # change_quest_windows; setup_quest; delete_quest; reset_quest; quest;
- # reveal_quest; conceal_quest; manually_complete_quest;
- # manually_fail_quest; reveal_objective; conceal_objective;
- # complete_objective; uncomplete_objective; fail_objective;
- # unfail_objective; quest_revealed?; quest_complete?; quest_active?;
- # quest_failed?; objective_complete?; objective_active?;
- # objective_failed?; distribute_quest_rewards; distribute_quest_reward;
- # call_quest_journal
- #==============================================================================
- class Game_Interpreter
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Change Quest Access
- # sym : symbol representing what aspect of access is being changed
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def change_quest_access(sym)
- case sym
- when :enable then $game_system.quest_access_disabled = false
- when :disable then $game_system.quest_access_disabled = true
- when :enable_menu then $game_system.quest_menu_access = true
- when :disable_menu then $game_system.quest_menu_access = false
- when :enable_map then $game_system.quest_map_access = true
- when :disable_map then $game_system.quest_map_access = false
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Change Quest Background
- # picture : picture to show in the scene's background
- # opacity : opacity of the picture shown in the scene's background
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def change_quest_background(picture, opacity = $game_system.quest_bg_opacity,
- blend_type = $game_system.quest_bg_blend_type)
- $game_system.quest_bg_picture = picture
- $game_system.quest_bg_opacity = opacity
- $game_system.quest_bg_blend_type = blend_type
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Change Quest Windows
- # skin : windowskin name to use in the scene
- # tone : tone for the windowskin
- # opacity : opacity of windows in the scene
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def change_quest_windows(skin, tone = $game_system.quest_window_tone,
- opacity = $game_system.quest_window_opacity)
- $game_system.quest_windowskin = skin
- $game_system.quest_window_tone = tone
- $game_system.quest_window_opacity = opacity
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Setup/Delete/Reset Quest
- # quest_id : ID of the quest to be setup or deleted or reset
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- [:setup_quest, :delete_quest, :reset_quest].each { |method|
- define_method(:"quest_#{method}") do |quest_id|
- $game_party.quests.send(method, quest_id)
- end
- }
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Retrieve Quest
- # quest_id : ID of the quest to retrieve
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def quest(quest_id); $game_party.quests[quest_id]; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Reveal/Conceal Quest
- # quest_id : ID of the quest to be revealed or concealed
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def reveal_quest(quest_id); quest(quest_id).concealed = false; end
- def conceal_quest(quest_id); quest(quest_id).concealed = true; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Manually Complete/Fail Quest
- # quest_id : ID of the quest to be revealed or concealed
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def manually_complete_quest(quest_id)
- quest(quest_id).prime_objectives.clear
- quest(quest_id).manual_status = :complete
- end
- def manually_fail_quest(quest_id)
- quest(quest_id).prime_objectives.clear
- quest(quest_id).manual_status = :failed
- end
- def manually_activate_quest(quest_id)
- quest(quest_id).manual_status = :active
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Reveal/Complete/Fail/Conceal/Uncomplete/Unfail Objective
- # quest_id : ID of the quest whose objectives will be modified
- # *obj : IDs of objectives to reveal or complete or fail (or opposite)
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- [:reveal_objective, :complete_objective, :fail_objective, :conceal_objective,
- :uncomplete_objective, :unfail_objective].each { |method|
- define_method(method) do |quest_id, *obj|
- quest(quest_id).send(method, *obj)
- end
- }
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Quest Revealed?
- # quest_id : ID of the quest you are checking is revealed
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def quest_revealed?(quest_id)
- $game_party.quests.revealed?(quest_id)
- end
- [:complete, :failed, :active].each { |method|
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Quest Complete/Failed/Active?
- # quest_id : ID of the quest whose completion status is being checked
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- define_method(:"quest_#{method}?") do |quest_id|
- quest_revealed?(quest_id) && quest(quest_id).status?(method)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Objective Complete/Failed/Active?
- # quest_id : ID of the quest whose objectives are being checked
- # *obj : IDs of objectives to check completion status
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- define_method(:"objective_#{method}?") do |quest_id, *obj|
- quest_revealed?(quest_id) && quest(quest_id).objective_status?(method, *obj)
- end
- }
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Objective Revealed?
- # quest_id : ID of the quest you are checking is revealed
- # *obj : IDs of objectives to check completion status
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def objective_revealed?(quest_id, *obj)
- quest_revealed?(quest_id) && quest(quest_id).objective_status?(:revealed, *obj)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Quest Rewarded?
- # quest_id : ID of the quest you are checking is revealed
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def quest_rewarded?(quest_id)
- quest_revealed?(quest_id) && quest(quest_id).status?(:reward)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Change Reward Status
- # quest_id : ID of the quest you are checking is revealed
- # value : true or false
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def change_reward_status(quest_id, value = true)
- quest(quest_id).reward_given = value
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Distribute Rewards
- # quest_id : ID of the quest whose rewards are to be distributed
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def distribute_quest_rewards(quest_id)
- if quest_revealed?(quest_id) && !quest_rewarded?(quest_id)
- params = @params.dup
- change_reward_status(quest_id, true)
- quest(quest_id).rewards.each { |reward| distribute_quest_reward(reward) }
- @params = params
- true
- else
- false
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Distribute Reward
- # reward : an array identifying the reward
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def distribute_quest_reward(reward)
- @params = [reward[1], 0, 0, (reward[2] ? reward[2] : 1)]
- case reward[0]
- when :item, 0 then command_126 # Item
- when :weapon, 1 then command_127 # Weapon
- when :armor, 2 then command_128 # Armor
- when :gold, 3 # Gold
- @params = [0, 0, reward[1] ? reward[1] : 0]
- command_125
- when :exp, 4 # Exp
- @params = [0, 0, 0, 0, reward[1] ? reward[1] : 0, true]
- command_315
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Call Quest Journal
- # quest_id : ID of the quest to open the journal to
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def call_quest_journal(quest_id = nil)
- return if $game_party.in_battle
- $game_system.last_quest_id = quest_id if quest_id
- SceneManager.call(Scene_Quest)
- Fiber.yield
- end
- end
- unless $imported[:"MA_ParagraphFormat_1.0"]
- #==============================================================================
- # ** MA_Window_ParagraphFormat
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This module inserts into Window_Base and provides a method to format the
- # strings so as to go to the next line if it exceeds a set limit. This is
- # designed to work with draw_text_ex, and a string formatted by this method
- # should go through that, not draw_text.
- #==============================================================================
- module MA_Window_ParagraphFormat
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Calc Line Width
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def mapf_calc_line_width(line, tw = 0, contents_dummy = false)
- return tw if line.nil?
- line = line.clone
- unless contents_dummy
- real_contents = contents # Preserve Real Contents
- # Create a dummy contents
- self.contents = Bitmap.new(contents_width, 24)
- reset_font_settings
- end
- pos = {x: 0, y: 0, new_x: 0, height: calc_line_height(line)}
- while line[/^(.*?)\e(.*)/]
- tw += text_size($1).width
- line = $2
- # Remove all ancillaries to the code, like parameters
- code = obtain_escape_code(line)
- # If direct setting of x, reset tw.
- tw = 0 if ($imported[:ATS_SpecialMessageCodes] && code.upcase == 'X') ||
- ($imported["YEA-MessageSystem"] && code.upcase == 'PX')
- # If I need to do something special on the basis that it is testing,
- # alias process_escape_character and differentiate using @atsf_testing
- process_escape_character(code, line, pos)
- end
- # Add width of remaining text, as well as the value of pos[:x] under the
- # assumption that any additions to it are because the special code is
- # replaced by something which requires space (like icons)
- tw += text_size(line).width + pos[:x]
- unless contents_dummy
- contents.dispose # Dispose dummy contents
- self.contents = real_contents # Restore real contents
- end
- return tw
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Format Paragraph
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def mapf_format_paragraph(text, max_width = contents_width)
- text = text.clone
- # Create a Dummy Contents - I wanted to boost compatibility by using the
- # default process method for escape codes. It may have the opposite effect,
- # for some :(
- real_contents = contents # Preserve Real Contents
- self.contents = Bitmap.new(contents_width, 24)
- reset_font_settings
- paragraph = ""
- while !text.empty?
- text.lstrip!
- oline, nline, tw = mapf_format_by_line(text.clone, max_width)
- # Replace old line with the new one
- text.sub!(/#{Regexp.escape(oline)}/m, nline)
- paragraph += text.slice!(/.*?(\n|$)/)
- end
- contents.dispose # Dispose dummy contents
- self.contents = real_contents # Restore real contents
- return paragraph
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Format By Line
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def mapf_format_by_line(text, max_width = contents_width)
- oline, nline, tw = "", "", 0
- loop do
- # Format each word until reach the width limit
- oline, nline, tw, done = mapf_format_by_word(text, nline, tw, max_width)
- return oline, nline, tw if done
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Format By Word
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def mapf_format_by_word(text, line, tw, max_width)
- return line, line, tw, true if text.nil? || text.empty?
- # Extract next word
- if text.sub!(/(\s*)([^\s\n\f]*)([\n\f]?)/, "") != nil
- prespace, word, line_end = $1, $2, $3
- ntw = mapf_calc_line_width(word, tw, true)
- pw = contents.text_size(prespace).width
- if (pw + ntw >= max_width)
- # Insert
- if line.empty?
- # If one word takes entire line
- return prespace + word, word + "\n", ntw, true
- else
- return line + prespace + word, line + "\n" + word, tw, true
- end
- else
- line += prespace + word
- tw = pw + ntw
- # If the line is force ended, then end
- return line, line, tw, true if !line_end.empty?
- end
- else
- return line, line, tw, true
- end
- return line, line, tw, false
- end
- end
- class Window_Base
- include MA_Window_ParagraphFormat
- end
- $imported[:"MA_ParagraphFormat_1.0"] = true
- end
- #==============================================================================
- # *** MAQJ Window_QuestBase
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This module mixes in with all quest windows
- #==============================================================================
- module MAQJ_Window_QuestBase
- attr_reader :maqj_objective_color
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def initialize(*args, &block)
- super(*args, &block)
- reset_font_settings
- set_data_font(:normal)
- @maqj_default_font = contents.font.dup
- # Change the windowskin, tone if they are set to be changed
- self.windowskin = Cache.system($game_system.quest_windowskin) if $game_system.quest_windowskin
- self.opacity = $game_system.quest_window_opacity if $game_system.quest_window_opacity
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Reset Font Settings
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def reset_font_settings(*args, &block)
- super(*args, &block)
- set_data_font(@maqj_font_data_type) if @maqj_font_data_type
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Data Font
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def set_data_font(data_type)
- @maqj_default_font = contents.font.dup unless @maqj_default_font
- contents.font.name = QuestData::FONTNAMES[data_type] ?
- QuestData::FONTNAMES[data_type] : @maqj_default_font.name
- contents.font.size = QuestData::FONTSIZES[data_type] ?
- QuestData::FONTSIZES[data_type] : @maqj_default_font.size
- contents.font.bold = QuestData::FONTBOLDS.keys.include?(data_type) ?
- QuestData::FONTBOLDS[data_type] : @maqj_default_font.bold
- contents.font.italic = QuestData::FONTITALICS.keys.include?(data_type) ?
- QuestData::FONTITALICS[data_type] : @maqj_default_font.italic
- case data_type
- when :objectives then change_color(@maqj_objective_color) if @maqj_objective_color
- when :name then change_color(quest_name_colour(@quest)) if @quest
- else
- change_color(text_color(QuestData::COLOURS[data_type])) if QuestData::COLOURS.keys.include?(data_type)
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Horizontal Line
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_horizontal_line(y, h = 2)
- contents.fill_rect(0, y, contents_width, h, text_color(QuestData::COLOURS[:line]))
- contents.fill_rect(0, y + h, contents_width, [h / 2, 1].max, text_color(QuestData::COLOURS[:line_shadow]))
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * MA Text Color
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def text_color(param)
- begin
- colour = case param
- when Integer then super(param) rescue normal_color
- when Symbol then send(param) rescue normal_color
- when Array then Color.new(*param) rescue normal_color
- else
- normal_color
- end
- end
- colour.is_a?(Color) ? colour : normal_color
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Quest Name Colour
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def quest_name_colour(quest = @quest)
- return if !quest
- quest = $game_party.quests[quest] if quest.is_a?(Integer)
- s = [:failed, :complete, :active].find { |status| quest.status?(status) }
- text_color(QuestData::COLOURS[s])
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Quest Objective Colour
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def quest_objective_colour(quest, obj_id)
- return if !quest
- quest = $game_party.quests[quest] if quest.is_a?(Integer)
- s = [:failed, :complete, :active].find { |status| quest.objective_status?(status, obj_id) }
- text_color(QuestData::COLOURS[s])
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Update Tone
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def update_tone
- $game_system.quest_window_tone ?
- self.tone.set(*$game_system.quest_window_tone) : super
- end
- end
- unless $imported[:"MA_IconHorzCommand_1.0"]
- #==============================================================================
- # ** Window_MA_IconHorzCommand
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This window is a base window to show a horizontal command window populated
- # with icons.
- #==============================================================================
- class Window_MA_IconHorzCommand < Window_HorzCommand
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Public Instance Variable
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- attr_reader :observing_procs
- attr_accessor :cursor_hide
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def initialize(*args, &block)
- @observing_procs = {}
- super(*args, &block)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Column Max
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def col_max; [(width - standard_padding) / (24 + spacing), item_max].min; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Item
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def item
- @list[index] ? @list[index][:symbol] : nil
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Enabled? / Current Item Enabled?
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def enable?(index); self.index == index; end
- def current_item_enabled?; !current_data.nil?; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Item
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_item(index)
- rect = item_rect(index)
- contents.clear_rect(rect)
- draw_icon(@list[index][:ext], rect.x + ((rect.width - 24) / 2), rect.y, enable?(index))
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Index
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def index=(index)
- old_index = self.index
- super(index)
- draw_item(old_index)
- draw_item(self.index)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Frame Update
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def update
- super
- @observing_procs.values.each { |block| block.call(item) }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Add/Remove Observing Window
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def add_observing_proc(id, &block)
- @observing_procs[id] = block
- update
- end
- def remove_observing_proc(id) ; @observing_procs.delete(id) ; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Update Cursor
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def update_cursor
- super
- cursor_rect.empty if @cursor_hide
- end
- end
- $imported[:"MA_IconHorzCommand_1.0"] = true
- end
- #==============================================================================
- # ** Window_QuestCategory
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This window allows the player to switch between quest categories.
- #==============================================================================
- class Window_QuestCategory < Window_MA_IconHorzCommand
- include MAQJ_Window_QuestBase
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def initialize(x, y, categories = $game_system.quest_categories)
- @cursor_hide = QuestData::HIDE_CATEGORY_CURSOR
- @categories = categories
- super(x, y)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Window Width
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def window_width; QuestData::LIST_WINDOW_WIDTH; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Category=
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def category=(category)
- self.index = @categories.index(category) if @categories.include?(category)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Make Command List
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def make_command_list
- @categories.each { |cat|
- add_command("", cat, false, QuestData::ICONS[cat]) }
- end
- end
- #==============================================================================
- # ** Window QuestLabel
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This window simply shows a label for the Quests scene
- #==============================================================================
- class Window_QuestLabel < Window_Base
- include MAQJ_Window_QuestBase
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def initialize(x, y, label = "")
- super(x, y, window_width, window_height)
- refresh(label)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Reset Font Settings
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def reset_font_settings; set_data_font(:scene_label); end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Window Attributes
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def window_width
- w = ($game_system.quest_categories.size > 1 || QuestData::SHOW_CATEGORY_LABEL) ?
- Graphics.width - QuestData::LIST_WINDOW_WIDTH : QuestData::LIST_WINDOW_WIDTH
- end
- def window_height; line_height + (standard_padding*2); end
- def line_height(*args)
- line_h = super(*args)
- QuestData::FONTSIZES[:scene_label] ?
- [QuestData::FONTSIZES[:scene_label], line_h].max : line_h
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Refresh
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def refresh(label = @label)
- @label = label.is_a?(String) ? convert_escape_characters(label) : ""
- contents.clear
- reset_font_settings
- tw = mapf_calc_line_width(@label)
- draw_text_ex((contents_width - tw) / 2, 0, @label)
- end
- end
- #==============================================================================
- # ** Window QuestLabel
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This window simply shows a label for category currently selected
- #==============================================================================
- class Window_QuestCategoryLabel < Window_QuestLabel
- include MAQJ_Window_QuestBase
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Reset Font Settings
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def reset_font_settings; set_data_font(:category_label); end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Window Attributes
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def window_width; QuestData::LIST_WINDOW_WIDTH; end
- def line_height(*args)
- line_h = super(*args)
- QuestData::FONTSIZES[:category_label] ?
- [QuestData::FONTSIZES[:category_label], line_h].max : line_h
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Category
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def category=(category)
- return if @category == category
- @category = category
- refresh(QuestData::CATEGORY_VOCAB[category])
- end
- end
- #==============================================================================
- # ** Window_QuestCategoryDummy
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This window shows up behind the category and category label window
- #==============================================================================
- class Window_QuestCategoryDummy < Window_Base
- include MAQJ_Window_QuestBase
- end
- #==============================================================================
- # ** Window_QuestList
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This window shows all quests in a selected category.
- #==============================================================================
- class Window_QuestList < Window_Selectable
- include MAQJ_Window_QuestBase
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def initialize(x, y, width, height)
- super
- @data = []
- self.index = 0
- activate
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Category
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def category=(category)
- return if @category == category
- @category = category
- refresh
- self.index = 0
- update_help if @help_window
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Get Quest
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def item; @data && index >= 0 ? @data[index] : nil; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Column/Item Max
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def col_max; 1; end
- def item_max; @data ? @data.size : 1; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Whether it should be drawn enabled
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def enable?(item); true; end
- def current_item_enabled?
- (@help_window && @help_window.maqj_visible_height < @help_window.contents_height)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Make Item List
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def make_item_list
- @data = @category ? $game_party.quests.list(@category) : []
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Item
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_item(index)
- quest = @data[index]
- if quest
- rect = item_rect_for_text(index)
- if QuestData::SHOW_QUEST_ICONS
- draw_icon(quest.icon_index, rect.x, rect.y, enable?(quest))
- rect.x += 24
- rect.width -= 24
- end
- change_color(quest_name_colour(quest), enable?(quest))
- draw_text(rect, quest.name)
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Refresh
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def refresh
- make_item_list
- create_contents
- set_data_font(:list)
- draw_all_items
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Update Help
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def update_help
- @help_window.quest = item
- end
- end
- #==============================================================================
- # ** Window_QuestData
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This window shows all quest data
- #==============================================================================
- class Window_QuestData < Window_Selectable
- include MAQJ_Window_QuestBase
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Object Initialization
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def initialize(x, y, w, h, layout = QuestData::DATA_LAYOUT)
- @dest_scroll_oy = 0
- super(x, y, w, h)
- @dest_scroll_oy = self.oy
- self.layout = layout
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Contents Height
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- alias maqj_visible_height contents_height
- def contents_height
- @q_contents_height ? [@q_contents_height, maqj_visible_height].max : maqj_visible_height
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Calculate Contents Height
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def calc_contents_height
- @q_contents_height = 0
- @layout.each { |dt| @q_contents_height += data_height(dt) } if @quest
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Data?
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_data?(data_type)
- case data_type
- when :line then true
- when :level then @quest.level > 0
- when :objectives then [email protected]_objectives.empty?
- when Array then (data_type - [:line]).any? { |dt| draw_data?(dt) }
- else [email protected](data_type).empty? # :description, :name, etc...
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Get Data Height
- # This method calculates the height required for a specified element of
- # the current quest. This is to calculate the needed space in contents,
- # as well as advance the @draw_y variable.
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def data_height(data_type)
- return 0 unless draw_data?(data_type)
- return line_height if QuestData::BASIC_DATA_TYPES.include?(data_type)
- @maqj_font_data_type = data_type
- reset_font_settings
- return case data_type
- when :line, :level, :name then line_height
- when :banner
- bmp = Cache.picture(@quest.banner)
- hght = bmp.rect.height
- bmp.dispose
- hght
- when :description
- buff = description_x*2
- paragraph = mapf_format_paragraph(@quest.description, contents_width - buff)
- line_num = paragraph.scan(/\n/).size + 1
- line_num += (QuestData::DESCRIPTION_IN_BOX ? 2 :
- !QuestData::VOCAB[:description].empty? ? 1 : 0)
- line_num*line_height
- when :objectives
- objectives = @quest.revealed_objectives.collect { |obj_id|
- @quest.objectives[obj_id] }
- line_num = QuestData::VOCAB[:objectives].empty? ? 0 : 1
- buff = (objective_x*2) + text_size(QuestData::VOCAB[:objective_bullet]).width
- objectives.each { |obj|
- paragraph = mapf_format_paragraph(obj, contents_width - buff)
- line_num += paragraph.scan(/\n/).size + 1 }
- line_num*line_height
- when :rewards
- line_num = QuestData::VOCAB[:rewards].empty? ? 0 : 1
- (line_num + @quest.rewards.size)*line_height
- when Array then data_height(data_type.max_by { |dt| data_height(dt) })
- else 0
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Quest
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def quest=(value)
- return if @quest == value
- @quest = value
- @layout = (@quest && @quest.layout) ? @quest.layout : @default_layout
- refresh
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Layout
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def layout=(value)
- return if @default_layout == value && @layout == value
- @default_layout = value
- @layout = value
- refresh
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Refresh
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def refresh
- contents.clear
- calc_contents_height
- create_contents
- return unless @quest && @layout
- self.oy = 0
- @dest_scroll_oy = 0
- # The basic idea here is that each draw_ method will rely on and advance
- # the @draw_y variable. Where they are an array, the elements will be
- # drawn at the same @draw_y.
- @draw_y = 0
- @layout.each {|dt|
- next unless draw_data?(dt)
- dt.is_a?(Array) ? draw_data_array(dt) : draw_data(dt)
- }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Data
- # data_type : the data block to draw next
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_data(data_type)
- @maqj_font_data_type = data_type
- reset_font_settings
- send(:"draw_#{data_type}") if self.class.method_defined?(:"draw_#{data_type}")
- @draw_y += data_height(data_type)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Data Array
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_data_array(layout_array)
- y, max_y = @draw_y, @draw_y
- # Draw each data aspect at the same starting @draw_y
- layout_array.each { |dt|
- @draw_y = y
- draw_data(dt)
- max_y = @draw_y if @draw_y > max_y
- }
- @draw_y = max_y
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Line
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_line; draw_horizontal_line(@draw_y + (line_height / 2) - 1, 2); end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Name
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_name
- set_data_font(:name)
- clear_and_draw_text(0, @draw_y, contents_width, line_height, @quest.name, 1)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Level
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_level
- case QuestData::LEVEL_ICON
- when Array then QuestData::LEVEL_ICON.empty? ? draw_level_text : draw_level_array
- when 0 then draw_level_text
- else
- draw_level_stacked
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Stacked Level
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_level_stacked(icon_index = QuestData::LEVEL_ICON)
- align = QuestData::HEADING_ALIGN[:level]
- es = QuestData::LEVEL_ICONS_SPACE*(@quest.level - 1)
- x = align == 2 ? contents_width - 24 : align == 1 ?
- (contents_width - 24 - (es)) / 2 : es
- @quest.level.times do
- draw_icon(icon_index, x, @draw_y)
- x -= QuestData::LEVEL_ICONS_SPACE
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Array Level
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_level_array(icon_index = QuestData::LEVEL_ICON)
- return if icon_index.empty?
- icon_index = icon_index[@quest.level - 1] ? icon_index[@quest.level - 1] : icon_index[-1]
- align = QuestData::HEADING_ALIGN[:level]
- x = align == 2 ? contents_width - 24 : align == 1 ? (contents_width-24)/2 : 0
- draw_icon(icon_index, x, @draw_y)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Text Level
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_level_text
- reset_font_settings
- level = QuestData::LEVEL_SIGNALS && QuestData::LEVEL_SIGNALS[@quest.level - 1] ?
- QuestData::LEVEL_SIGNALS[@quest.level - 1] : @quest.level.to_s
- align = QuestData::HEADING_ALIGN[:level]
- tw = text_size(QuestData::VOCAB[:level]).width + 4
- tw2 = text_size(level).width + 2
- space = contents_width - tw - tw2
- x = align == 2 ? space : align == 1 ? space / 2 : 0
- clear_and_draw_text(x, @draw_y, tw, line_height, QuestData::VOCAB[:level])
- set_data_font(:level_signal)
- clear_and_draw_text(x + tw, @draw_y, tw2, line_height, level, 2)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Banner
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_banner
- bmp = Cache.picture(@quest.banner) # Get Picture
- # Shift the hue if requested
- bmp.hue_change(@quest.banner_hue) unless @quest.banner_hue == 0
- x = (contents_width - bmp.rect.width) / 2
- if x < 0 # Stretch horizontally if the banner is too wide
- dest_rect = bmp.rect.dup
- dest_rect.width = contents_width
- contents.stretch_blt(dest_rect, bmp, bmp.rect)
- else
- contents.blt(x, @draw_y, bmp, bmp.rect)
- end
- bmp.dispose
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Description
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_description
- buff = description_x*2
- paragraph = mapf_format_paragraph(@quest.description, contents_width - buff)
- y = @draw_y
- # Draw Rect
- draw_box(paragraph.scan(/\n/).size + 1) if QuestData::DESCRIPTION_IN_BOX
- # Draw Description Label
- draw_heading(:description, y) unless QuestData::VOCAB[:description].empty?
- # Draw Description
- y += line_height if !QuestData::VOCAB[:description].empty? || QuestData::DESCRIPTION_IN_BOX
- draw_text_ex(description_x, y, paragraph)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Objectives
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_objectives
- y = @draw_y
- unless QuestData::VOCAB[:objectives].empty?
- draw_heading(:objectives, y)
- y += line_height
- end
- @quest.revealed_objectives.each { |obj_id| y = draw_objective(obj_id, y) }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Objective
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_objective(obj_id, y)
- bullet = QuestData::VOCAB[:objective_bullet]
- bullet_tw = text_size(bullet).width + 2
- buff = (objective_x*2) + bullet_tw
- paragraph = mapf_format_paragraph(@quest.objectives[obj_id], contents_width - buff)
- line_num = 1 + paragraph.scan(/\n/).size
- # Since draw_text_ex resets the font, set colour here
- @maqj_objective_color = quest_objective_colour(@quest, obj_id)
- change_color(text_color(QuestData::COLOURS[:objective_bullet]))
- draw_text(objective_x, y, bullet_tw, line_height, sprintf(bullet, obj_id + 1))
- draw_text_ex(objective_x + bullet_tw, y, paragraph)
- @maqj_objective_color = false
- y += (line_num*line_height)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Rewards
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_rewards
- y = @draw_y
- unless QuestData::VOCAB[:rewards].empty?
- draw_heading(:rewards, y)
- y += line_height
- end
- for i in [email protected] do draw_reward(i, y + i*line_height) end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Reward
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_reward(r_id, y)
- reward = @quest.rewards[r_id]
- case reward[0]
- when :item, 0 # Item
- draw_item_reward(y, $data_items[reward[1]], reward[2] ? reward[2] : 1)
- when :weapon, 1 # Weapon
- draw_item_reward(y, $data_weapons[reward[1]], reward[2] ? reward[2] : 1)
- when :armor, 2 # Armor
- draw_item_reward(y, $data_armors[reward[1]], reward[2] ? reward[2] : 1)
- when :gold, 3 # Gold
- draw_basic_data(y, QuestData::ICONS[:reward_gold],
- QuestData::VOCAB[:reward_gold], (reward[1] ? reward[1] : 0).to_s)
- when :exp, 4 # Exp
- draw_basic_data(y, QuestData::ICONS[:reward_exp],
- QuestData::VOCAB[:reward_exp], (reward[1] ? reward[1] : 0).to_s)
- when :string, 5 # String
- draw_basic_data(y, reward[1] ? reward[1] : 0, reward[3] ? reward[3] : "",
- reward[2] ? reward[2] : "")
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Item Reward
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_item_reward(y, item, amount = 1)
- w = contents_width
- w = QuestData::BASIC_DATA_WIDTH if QuestData::BASIC_DATA_WIDTH.between?(1, w)
- x = (contents_width - w) / 2
- draw_item_name(item, x, y, true, w - 40)
- if amount > 1
- change_color(text_color(QuestData::COLOURS[:reward_amount]))
- draw_text(x + w - 40, y, 40, line_height, sprintf(QuestData::VOCAB[:reward_amount], amount), 2)
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Basic Data Methods
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- QuestData::BASIC_DATA_TYPES.each { |data_type|
- define_method(:"draw_#{data_type}") {
- draw_basic_data(@draw_y, QuestData::ICONS[data_type],
- QuestData::VOCAB[data_type], @quest.send(data_type))
- }
- }
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Basic Data
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_basic_data(y, icon_index, vocab, value)
- w = contents_width
- w = QuestData::BASIC_DATA_WIDTH if QuestData::BASIC_DATA_WIDTH.between?(1, w)
- x = (contents_width - w) / 2
- unless icon_index == 0
- draw_icon(icon_index, x, y)
- x += 24
- w -= 24
- end
- tw = text_size(vocab).width
- change_color(text_color(QuestData::COLOURS[:basic_label]))
- draw_text(x, y, tw, line_height, vocab)
- change_color(text_color(QuestData::COLOURS[:basic_value]))
- draw_text(x + tw, y, w - tw, line_height, value, 2)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Heading
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_heading(data_type, y)
- set_data_font(:heading)
- clear_and_draw_text(40, y, contents_width - 80, line_height,
- QuestData::VOCAB[data_type], QuestData::HEADING_ALIGN[data_type])
- reset_font_settings
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Clear and Draw Text
- # Clear the field before drawing the text
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def clear_and_draw_text(*args)
- rect = []
- while !args[0].is_a?(String) do rect.push(args.shift) end
- rect[0].is_a?(Rect) ? rect = rect[0] : rect = Rect.new(*rect)
- align = args[1] ? args[1] : 0
- ts = text_size(args[0])
- ts.width = [ts.width + 4, rect.width].min
- align == 1 ? ts.x = rect.x + ((rect.width - ts.width) / 2) :
- align == 2 ? ts.x = rect.x + rect.width - ts.width : ts.x = rect.x
- ts.y = rect.y
- contents.clear_rect(ts)
- ts.x += 2
- draw_text(ts, args[0], align)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Description Box
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_box(line_num)
- return if line_num < 1
- x = (line_height / 2) - 1
- y = @draw_y + (line_height / 2) - 1
- w = contents_width - 2*x
- h = (1 + line_num)*line_height
- draw_rect_outline_with_shadow(x, y, w, h)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Rect Outline
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_rect_outline(x, y, w, h, colour)
- # Horizontal Lines
- contents.fill_rect(x, y, w, 2, colour)
- contents.fill_rect(x, y + h - 2, w, 2, colour)
- # Vertical Lines
- contents.fill_rect(x, y, 2, h, colour)
- contents.fill_rect(x + w - 2, y, 2, h, colour)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Draw Rect Outline with Shadow
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def draw_rect_outline_with_shadow(x, y, w, h)
- draw_rect_outline(x + 1, y + 1, w, h, text_color(QuestData::COLOURS[:line_shadow]))
- draw_rect_outline(x, y, w, h, text_color(QuestData::COLOURS[:line]))
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Objective/Description X
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def objective_x; line_height / 2; end
- def description_x; QuestData::DESCRIPTION_IN_BOX ? line_height : (line_height/2); end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Update
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def update(*args, &block)
- super(*args, &block)
- if open? && active && @dest_scroll_oy == self.oy
- scroll_down if Input.press?(:DOWN)
- scroll_up if Input.press?(:UP)
- end
- if self.oy != @dest_scroll_oy
- mod = (@dest_scroll_oy <=> self.oy)
- self.oy += 3*mod
- self.oy = @dest_scroll_oy if (@dest_scroll_oy <=> self.oy) != mod
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Scroll Down
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def scroll_down(*args, &block)
- max_oy = contents_height - maqj_visible_height
- dest = ((@dest_scroll_oy / line_height) + 1)*line_height
- @dest_scroll_oy = [dest, max_oy].min
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Scroll Up
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def scroll_up(*args, &block)
- dest = ((@dest_scroll_oy / line_height) - 1)*line_height
- @dest_scroll_oy = [dest, 0].max
- end
- end
- #==============================================================================
- # ** Scene_Quest
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # This class handles processing for the Quest scene
- #==============================================================================
- class Scene_Quest < Scene_MenuBase
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Start Scene Processing
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def start
- super
- @init_category, @init_quest_index = $game_party.quests.find_location($game_system.last_quest_id, $game_system.last_quest_cat)
- create_maqj_picture unless $game_system.quest_bg_picture.empty?
- create_all_windows
- adjust_window_positions
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Terminate Scene
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def terminate
- $game_system.quest_categories = QuestData::CATEGORIES
- $game_system.quest_scene_label = QuestData::VOCAB[:scene_label]
- $game_system.last_quest_id = @quest_list_window.item ? @quest_list_window.item.id : 0
- $game_system.last_quest_cat = @quest_category_window.item
- super
- dispose_maqj_picture
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Create Background Picture
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def create_maqj_picture
- @maqj_picture_sprite = Sprite.new
- @maqj_picture_sprite.bitmap = Cache.picture($game_system.quest_bg_picture)
- @maqj_picture_sprite.opacity = $game_system.quest_bg_opacity
- @maqj_picture_sprite.blend_type = $game_system.quest_bg_blend_type
- @maqj_picture_sprite.z = @background_sprite.z + 1 if @background_sprite
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Create All Windows
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def create_all_windows
- create_quest_label_window unless $game_system.quest_scene_label.empty?
- create_quest_category_window if $game_system.quest_categories.size > 1
- create_quest_category_label_window if QuestData::SHOW_CATEGORY_LABEL
- create_dummy_category_window if QuestData::CATEGORY_LABEL_IN_SAME_WINDOW &&
- @quest_category_window && @quest_category_label_window
- create_quest_list_window
- create_quest_data_window
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Create QuestLabel Window
- # This window shows the name of the scene
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def create_quest_label_window
- @quest_label_window = Window_QuestLabel.new(0, 0, $game_system.quest_scene_label)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Create QuestCategory Window
- # This window allows the player to switch categories.
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def create_quest_category_window
- @quest_category_window = Window_QuestCategory.new(0, 0, $game_system.quest_categories)
- @quest_category_window.category = @init_category if @init_category
- @quest_category_window.set_handler(:cancel, method(:on_category_cancel))
- @quest_category_window.set_handler(:ok, method(:on_category_ok))
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Create QuestCategoryLabel Window
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def create_quest_category_label_window
- if @quest_category_window
- @quest_category_label_window = Window_QuestCategoryLabel.new(0, @quest_category_window.height)
- @quest_category_window.add_observing_proc(:label) { |category|
- @quest_category_label_window.category = category }
- else
- @quest_category_label_window = Window_QuestCategoryLabel.new(0, 0)
- @quest_category_label_window.category = $game_system.quest_categories ? $game_system.quest_categories[0] : :all
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Create Dummy Category Label Window
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def create_dummy_category_window
- @quest_category_label_window.y -= 12
- @quest_category_label_window.opacity = 0
- @quest_category_window.opacity = 0
- w = [@quest_category_window.width, @quest_category_label_window.width].max
- h = @quest_category_window.height + @quest_category_label_window.height - 12
- @category_dummy_window = Window_QuestCategoryDummy.new(0, 0, w, h)
- @category_dummy_window.z = [@quest_category_window.z, @quest_category_label_window.z].min - 1
- # Draw Horz Line
- @category_dummy_window.draw_horizontal_line(@quest_category_window.height - @quest_category_window.padding - 7, 2)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Create QuestList Window
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def create_quest_list_window
- if @category_dummy_window
- y = @category_dummy_window.height
- else
- y = @quest_category_window ? @quest_category_window.height : 0
- y += @quest_category_label_window ? @quest_category_label_window.height : 0
- y = @quest_label_window.height if y == 0
- end
- @quest_list_window = Window_QuestList.new(0, y, QuestData::LIST_WINDOW_WIDTH,
- Graphics.height - y)
- @quest_list_window.set_handler(:ok, method(:on_list_ok))
- if !QuestData::CONCURRENT_ACTIVITY
- @quest_list_window.deactivate
- @quest_list_window.set_handler(:cancel, method(:on_list_cancel))
- end
- if @quest_category_window
- @quest_category_window.add_observing_proc(:list) { |category|
- @quest_list_window.category = category }
- else
- @quest_list_window.category = $game_system.quest_categories[0]
- end
- @quest_list_window.index = @init_quest_index if @init_quest_index
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Create QuestData Window
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def create_quest_data_window
- x = @quest_list_window.width
- y = (@quest_label_window && (@quest_category_window ||
- @quest_category_label_window)) ? @quest_label_window.height : 0
- @quest_data_window = Window_QuestData.new(x, y, Graphics.width - x,
- Graphics.height - y)
- @quest_list_window.help_window = @quest_data_window
- @quest_data_window.quest = @quest_list_window.item
- @quest_data_window.set_handler(:ok, method(:on_data_ok))
- @quest_data_window.set_handler(:cancel, method(:on_data_cancel))
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Dispose Background Picture
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def dispose_maqj_picture
- @maqj_picture_sprite.dispose if @maqj_picture_sprite
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Adjust Window Positions
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def adjust_window_positions
- if @quest_label_window && (@quest_category_window || @quest_category_label_window)
- @quest_label_window.x = QuestData::LIST_WINDOW_WIDTH
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Category OK
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def on_category_ok; @quest_list_window.activate; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Category Cancel
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def on_category_cancel; return_scene; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * List OK
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def on_list_ok
- @quest_category_window.deactivate
- @quest_data_window.activate
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * List Cancel
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def on_list_cancel; @quest_category_window.activate; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Data OK
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def on_data_ok; on_data_cancel; end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Data Cancel
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def on_data_cancel
- @quest_list_window.activate
- @quest_category_window.activate if QuestData::CONCURRENT_ACTIVITY
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Update All Windows
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def update_all_windows(*args, &block)
- # To accomodate for concurrent activity, must deactivate category
- @quest_category_window.deactivate if QuestData::CONCURRENT_ACTIVITY &&
- @quest_list_window.active && Input.trigger?(:C)
- super(*args, &block)
- @quest_category_window.activate if QuestData::CONCURRENT_ACTIVITY &&
- @quest_list_window.active
- end
- end
- #==============================================================================
- # ** Scene_Map
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Summary of Changes:
- # aliased method - update_scene
- # new methods - update_call_quest_journal; call_quest_journal
- #==============================================================================
- class Scene_Map
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Update Scene
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- alias maqj_updascne_9kh4 update_scene
- def update_scene(*args, &block)
- maqj_updascne_9kh4(*args, &block)
- update_call_quest_journal if $game_system.quest_map_access && !scene_changing?
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Update Call Quest Journal
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def update_call_quest_journal
- if $game_map.interpreter.running?
- @quest_journal_calling = false
- else
- if Input.trigger?(QuestData::MAP_BUTTON)
- $game_system.quest_access_disabled || $game_party.quests.list.empty? ?
- Sound.play_buzzer : @quest_journal_calling = true
- end
- call_quest_journal if @quest_journal_calling && !$game_player.moving?
- end
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Call Quest Journal
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def call_quest_journal
- @quest_journal_calling = false
- Sound.play_ok
- SceneManager.call(Scene_Quest)
- end
- end
- # Menu Access
- if !$imported[:MA_InsertCommand]
- # Initialize the Insertion Hash
- MA_COMMAND_INSERTS = {}
- MA_InsertableMenuCommand = Struct.new(:name, :index, :enable, :scene, :other)
- #==============================================================================
- # ** Game_System
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Summary of Changes:
- # new public instance variable - maic_menu_commands
- # aliased method - initialize
- #==============================================================================
- class Game_System
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Inserted Menu Commands
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def maic_inserted_menu_commands
- # Lazy Instantiation so that old save files are not corrupted
- if !@maic_inserted_menu_commands
- @maic_inserted_menu_commands = MA_COMMAND_INSERTS.keys
- # Sort by index
- @maic_inserted_menu_commands.sort! { |a, b| MA_COMMAND_INSERTS[a].index <=> MA_COMMAND_INSERTS[b].index }
- end
- @maic_inserted_menu_commands
- end
- end
- #==============================================================================
- # ** Window_MenuCommand
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Summary of Changes:
- # aliased method - make_command_list; maic_insert_command
- #==============================================================================
- class Window_MenuCommand
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Make Command List
- #``````````````````````````````````````````````````````````````````````````
- # I alias this method instead of add_original_commands because I need to
- # have all commands created before I can insert at the correct index
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- alias maic_mkcmmndl_6yd2 make_command_list
- def make_command_list(*args, &block)
- maic_mkcmmndl_6yd2(*args, &block) # Run Original Method
- # Insert new commands
- $game_system.maic_inserted_menu_commands.each { |sym| maic_insert_command(sym) }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Insert Command
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def maic_insert_command(symbol)
- command = MA_COMMAND_INSERTS[symbol]
- # Get the command name
- name = command.name.is_a?(Symbol) ? eval(command.name.to_s) : command.name
- # Check whether enabled
- enabled = case command.enable
- when Integer then command.enable == 0 ? true : $game_switches[command.enable]
- when String then eval(command.enable)
- when Symbol then self.send(command.enable)
- else
- enabled = true
- end
- # Add the command to the list
- add_command(name, symbol, enabled)
- added = @list.pop
- @list.insert([command.index, @list.size].min, added) # Insert at specific index
- end
- end
- #==============================================================================
- # ** Scene_Menu
- #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- # Summary of Changes:
- # aliased method - create_command_window; on_personal_ok
- # new methods - maic_set_insert_handler; maic_command_insert
- #==============================================================================
- class Scene_Menu
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Create Command Window
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- alias maic_createcndwin_3ey7 create_command_window
- def create_command_window(*args, &block)
- maic_createcndwin_3ey7(*args, &block) # Run Original Method
- # Add handlers for all custom commands
- $game_system.maic_inserted_menu_commands.each { |symbol| maic_set_insert_handler(symbol) }
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Set Inserted Handler
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def maic_set_insert_handler(symbol)
- other = MA_COMMAND_INSERTS[symbol].other
- handler = case other
- when Symbol then method(other)
- when String then lambda { eval(other) }
- when TrueClass then method(:command_personal)
- else
- handler = method(:maic_command_insert)
- end
- @command_window.set_handler(symbol, handler)
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Custom Command
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- def maic_command_insert
- SceneManager.call(Kernel.const_get(MA_COMMAND_INSERTS[@command_window.current_symbol].scene))
- end
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- # * Personal OK
- #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- alias maic_onpok_3ek9 on_personal_ok
- def on_personal_ok(*args, &block)
- if $game_system.maic_inserted_menu_commands.include?(@command_window.current_symbol)
- maic_command_insert
- else
- maic_onpok_3ek9(*args, &block) # Run Original Method
- end
- end
- end
- $imported[:MA_InsertCommand] = true
- end
- MA_COMMAND_INSERTS[:quest_journal] =
- MA_InsertableMenuCommand.new(QuestData::VOCAB[:menu_label], QuestData::MENU_INDEX,
- "!$game_system.quest_access_disabled && !$game_party.quests.list.empty?",
- :Scene_Quest, false)
复制代码 |
评分
-
查看全部评分
|