You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1059 lines
42 KiB
JavaScript
1059 lines
42 KiB
JavaScript
//=============================================================================
|
|
// Gameus Quest System
|
|
// Author gameus
|
|
// Version 1.0
|
|
//-----------------------------------------------------------------------------
|
|
// Intro:
|
|
// This is a (for the most part) basic quest system. Has a basic layout to help
|
|
// players keep track of all the different quests they might encounter. Also
|
|
// gives you plenty of commands and script calls to keep track of said quests
|
|
// behind the scenes.
|
|
//
|
|
// Features:
|
|
// Simple UI to keep track of quests with some customization options
|
|
// Friendly commands to track/complete/fail/reset/count/progress quests
|
|
// Auto rewards upon quest completion (optional)
|
|
// Quest categories (optional)
|
|
// Full blown quest editor included
|
|
//
|
|
//
|
|
// Instructions:
|
|
// Place in your plugins folder and save as 'GameusQuestSystem.js'
|
|
// Configure the options as you please.
|
|
//
|
|
// I highly recommend checking out the demo (includes Quest Editor)
|
|
// http://jugglingcode.com/scripts/MV/QuestSystem/Demo.zip
|
|
//
|
|
// Credits:
|
|
// gameus ~ For creating it.
|
|
//=============================================================================
|
|
|
|
/*:
|
|
* @plugindesc v1.0 - A simplistic quest system with various customization options.
|
|
* @author gameus
|
|
*
|
|
* @param Auto Rewards
|
|
* @desc True or False. Tells the script whether or not to automatically give quest rewards upon completion.
|
|
* @default true
|
|
*
|
|
* @param ---------------
|
|
*
|
|
* @param Words
|
|
*
|
|
* @param ---------------
|
|
*
|
|
* @param Hidden Reward Text
|
|
* @desc The text used to hide rewards
|
|
* @default ??????
|
|
*
|
|
* @param No Quests Text
|
|
* @desc The text used for "No Quests"
|
|
* @default No Quests
|
|
*
|
|
* @param All Word
|
|
* @desc Word for "All"
|
|
* @default All
|
|
*
|
|
* @param Completed Word
|
|
* @desc Word for "Completed"
|
|
* @default Completed
|
|
*
|
|
* @param Failed Word
|
|
* @desc Word for "Failed"
|
|
* @default Failed
|
|
*
|
|
* @param In-Progress Word
|
|
* @desc Word for "In-Progress"
|
|
* @default In-Progress
|
|
*
|
|
* @param Steps Word
|
|
* @desc Word for "Steps"
|
|
* @default Steps
|
|
*
|
|
* @param Rewards Word
|
|
* @desc Word for "Rewards"
|
|
* @default Rewards
|
|
*
|
|
* @param ---------------
|
|
*
|
|
* @param Display Options
|
|
*
|
|
* @param ---------------
|
|
*
|
|
* @param Reverse Layout
|
|
* @desc Reverses the quest log layout
|
|
* @default false
|
|
*
|
|
* @param Filter Position
|
|
* @desc Positions the filter window. Can use Top or Bottom
|
|
* @default Top
|
|
*
|
|
* @param Use Categories
|
|
* @desc Use customizable sub-categories e.g. "Story", "Crafting", "Gathering" quests.
|
|
* @default true
|
|
*
|
|
* @param Show Empty Categories
|
|
* @desc 0 - Don't show; 1 - Show but greyed out; 2 - Show, but with "No Quests" under it
|
|
* @default 0
|
|
*
|
|
* @param Show Quest Count
|
|
* @desc This shows the quest count for each category.
|
|
* @default true
|
|
*
|
|
* @param Bullet Character
|
|
* @desc The character used to display each step and reward
|
|
* @default -
|
|
*
|
|
* @param Max Steps
|
|
* @desc Defines the number of steps to show at once under a quest info. Will only show steps you've completed or are already on.
|
|
* @default 3
|
|
*
|
|
* @param ---------------
|
|
*
|
|
* @param Image Options
|
|
*
|
|
* @param ---------------
|
|
*
|
|
* @param Use Icons
|
|
* @desc Option to allow quest icons
|
|
* @default true
|
|
*
|
|
* @param Completed Image
|
|
* @desc Image that's drawn over a quest when it's completed. Leave blank for no image
|
|
*
|
|
* @param Completed Image Opacity
|
|
* @desc The opacity for the above image
|
|
* @default 128
|
|
*
|
|
* @param Failed Image
|
|
* @desc Image that's drawn over a quest if it's marked as failed. Leave blank for no image
|
|
*
|
|
* @param Failed Image Opacity
|
|
* @desc The opacity for the above image
|
|
* @default 128
|
|
*
|
|
* @help
|
|
* Report any bugs, editor or plugin related here:
|
|
* http://forums.rpgmakerweb.com/index.php?/topic/49234-gameus-quest-system/
|
|
* Before reporting a bug, check the version of editor/plugin to see if you're using an outdated version
|
|
*
|
|
* I highly recommend checking out the demo found here:
|
|
* http://jugglingcode.com/scripts/MV/QuestSystem/Demo.zip
|
|
* ----------------------------------------------------
|
|
* These are a list of following Plugin Commands:
|
|
* ----------------------------------------------------
|
|
* Quest Add QuestID
|
|
* Activates a quest.
|
|
*
|
|
* Quest NextStep QuestID
|
|
* Progresses the quest to the next step.
|
|
*
|
|
* Quest BackStep QuestID
|
|
* Makes the quest go back a step, allowing for steps to be failed.
|
|
*
|
|
* Quest Complete QuestID
|
|
* Completes the quest, if Auto Reward is on, the script will give out the rewards.
|
|
*
|
|
* Quest Fail QuestID
|
|
* Fails the quest.
|
|
*
|
|
* Quest Remove QuestID
|
|
* Removes the quest from the quest log, allowing it to be reset.
|
|
*
|
|
* Quest Reset QuestID
|
|
* Resets the step and status of a quest. NOTE: Any switches/variables you might have set during a quest, WILL have to be reset manually.
|
|
*
|
|
* Quest Open
|
|
* This opens up the quest log. Alternatively, there's a script call you can use below.
|
|
*
|
|
* ----------------------------------------------------
|
|
* Here's a list of script calls you can use in a conditional branch:
|
|
* ----------------------------------------------------
|
|
* SceneManager.push(Scene_Quest)
|
|
* This opens up the quest scene, for those who enjoy script calls or are using it in a different plugin
|
|
*
|
|
* $gameQuests.get(quest_id).completed()
|
|
* $gameQuests.get(quest_id).failed()
|
|
* $gameQuests.get(quest_id).inProgress()
|
|
* These calls are used to check the progress of a quest
|
|
* Note, even if the party does not have the quest yet, these will return true/false.
|
|
*
|
|
* $gameParty.hasQuest(quest_id)
|
|
* This is how you check if the party has activated the quest yet. Use in conjunction with the above script calls
|
|
*
|
|
* $gameParty.hasQuests([quest ids], filter)
|
|
* Not to be confused with the one above, this checks multiple quests the party has and see if they match the filter.
|
|
* Filter can be "progress", "completed", or "failed"
|
|
* Returns true if all the input quests match the filter AND the party has them active. e.g. Can be used to see if the party has completed a range of quests before moving on
|
|
*
|
|
* $gameQuests.get(quest_id).currentStep === step_number
|
|
* This is how you check which step a quest is on. step_number starts from 0. NOTE: This will still return a number even if the quest hasn't been activated.
|
|
*
|
|
* $gameQuests.get(quest_id).status === "status"
|
|
* This will return what status the quest is. "status" can be "progress", "completed", or "failed"
|
|
*
|
|
* $gameQuests.totalQuests(filter)
|
|
* This gets you a total number of quests by the filter. Filter can be "all", "progress", "completed", or "failed". This applies to all quests.
|
|
*
|
|
* $gameParty.totalQuests(filter)
|
|
* Does the same as above, but only applies to the quests that the party has.
|
|
*
|
|
*/
|
|
|
|
// Import 'Quest System'
|
|
var GameusScripts = GameusScripts || {};
|
|
GameusScripts["Config"] = GameusScripts["Config"] || {};
|
|
GameusScripts["QuestSystem"] = 1.0;
|
|
GameusScripts["Config"]["QuestSystem"] = PluginManager.parameters("GameusQuestSystem");
|
|
|
|
// Initialize global quest variables
|
|
var $dataQuests = null;
|
|
var $gameQuests = null;
|
|
|
|
|
|
// Load quest data
|
|
DataManager._databaseFiles.push(
|
|
{name: "$dataQuests", src: "Quests.json"}
|
|
|
|
);
|
|
|
|
//---------------------------------------------------------------------------------------------
|
|
// Alias methods
|
|
//---------------------------------------------------------------------------------------------
|
|
gameus_Quest_Party_Initialize = Game_Party.prototype.initialize;
|
|
gameus_Quest_Data_Initialize = DataManager.createGameObjects;
|
|
gameus_Quest_Save_Data = DataManager.makeSaveContents;
|
|
gameus_Quest_Load_Data = DataManager.extractSaveContents;
|
|
gameus_Quest_Plugin_Commands = Game_Interpreter.prototype.pluginCommand;
|
|
|
|
//---------------------------------------------------------------------------------------------
|
|
// Plugin Commands
|
|
//---------------------------------------------------------------------------------------------
|
|
Game_Interpreter.prototype.pluginCommand = function(command, args) {
|
|
gameus_Quest_Plugin_Commands.call(this, command, args);
|
|
if (command.toLowerCase() === "quest") {
|
|
switch (args[0].toLowerCase()) {
|
|
case 'open':
|
|
SceneManager.push(Scene_Quest);
|
|
break;
|
|
case 'add':
|
|
$gameParty.addQuest(Number(args[1]));
|
|
break;
|
|
case 'remove':
|
|
$gameParty.removeQuest(Number(args[1]));
|
|
break;
|
|
case 'complete':
|
|
$gameQuests.get(Number(args[1])).complete();
|
|
break;
|
|
case 'fail':
|
|
$gameQuests.get(Number(args[1])).fail();
|
|
break;
|
|
case 'reset':
|
|
$gameQuests.get(Number(args[1])).reset();
|
|
break;
|
|
case 'nextstep':
|
|
$gameQuests.get(Number(args[1])).nextStep();
|
|
break;
|
|
case 'backstep':
|
|
$gameQuests.get(Number(args[1])).backStep();
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
//---------------------------------------------------------------------------------------------
|
|
// DataManager
|
|
//---------------------------------------------------------------------------------------------
|
|
DataManager.makeSaveContents = function() {
|
|
contents = gameus_Quest_Save_Data.call(this);
|
|
// Include the quests in the save file
|
|
contents.quests = $gameQuests;
|
|
return contents;
|
|
};
|
|
|
|
DataManager.extractSaveContents = function(contents) {
|
|
gameus_Quest_Load_Data.call(this, contents);
|
|
// Then take them back because we really don't trust banks
|
|
$gameQuests = contents.quests;
|
|
};
|
|
|
|
DataManager.createGameObjects = function() {
|
|
gameus_Quest_Data_Initialize.call(this);
|
|
// Create global quests
|
|
$gameQuests = new Game_Quests();
|
|
};
|
|
|
|
//---------------------------------------------------------------------------------------------
|
|
// Game_Party
|
|
//---------------------------------------------------------------------------------------------
|
|
Game_Party.prototype.initialize = function() {
|
|
gameus_Quest_Party_Initialize.call(this);
|
|
// Initialize quest data
|
|
this.quests = [];
|
|
};
|
|
|
|
Game_Party.prototype.addQuest = function(quest_id) {
|
|
// Does party already have quest?
|
|
if (this.quests.indexOf(quest_id) < 0) {
|
|
// If not, give that crap to them. They don't have a choice now.
|
|
this.quests.push(quest_id);
|
|
}
|
|
};
|
|
|
|
// Removes the quest from the party. NOTE: This does NOT reset the quest
|
|
Game_Party.prototype.removeQuest = function(quest_id) {
|
|
// Check if quest exists
|
|
if (this.quests.indexOf(quest_id) > -1) {
|
|
// I was wrong...
|
|
var index = this.quests.indexOf(quest_id);
|
|
this.quests.splice(index, 1);
|
|
}
|
|
};
|
|
|
|
// Returns total number of quests the party has
|
|
// filter can be "all", "progress" "completed" or "failed"
|
|
Game_Party.prototype.totalQuests = function(filter) {
|
|
// Returns a list of ALL quests
|
|
if (filter === undefined || filter === "all")
|
|
return this.quests.length;
|
|
// Time to cycle through quests....(dammit, I did this exact thing in the quest list window)
|
|
var count = 0;
|
|
for (var i = 0; i < this.quests.length; i += 1) {
|
|
var q = $gameQuest.get(this.quests[i]);
|
|
if (q.status === filter.toLowerCase())
|
|
count += 1;
|
|
}
|
|
return count;
|
|
};
|
|
|
|
// Gets all quest id's
|
|
Game_Party.prototype.getQuests = function(filter) {
|
|
// Returns a list of ALL quests
|
|
if (filter === undefined || filter === "all")
|
|
return this.quests;
|
|
// Time to cycle through quests....(dammit, I did this exact thing in the quest list window)
|
|
var data = [];
|
|
for (var i = 0; i < this.quests.length; i += 1) {
|
|
var q = $gameQuest.get(this.quests[i]);
|
|
if (q.status === filter.toLowerCase())
|
|
data.push(q.questId);
|
|
}
|
|
return data;
|
|
};
|
|
|
|
// This method is actually extremely useless. Ignore it for now.
|
|
Game_Party.prototype.getQuest = function(index) {
|
|
return $gameQuests.get(this.quests[index]);
|
|
};
|
|
|
|
Game_Party.prototype.hasQuest = function(quest_id){
|
|
// Returns whether or not they have the quest
|
|
return this.quests.indexOf(quest_id) > -1;
|
|
};
|
|
|
|
// This checks a list of quests and its status.
|
|
// If the party has all and they match the input filter, it returns true
|
|
// Used to check a range of quests completion
|
|
Game_Party.prototype.hasQuests = function(quests, filter) {
|
|
flag = true;
|
|
for (var i = 0; i < quests.length; i += 1) {
|
|
if (!this.hasQuest(quests[i]))
|
|
flag = false;
|
|
if ($gameQuests.get(quests[i]).status !== filter)
|
|
flag = false;
|
|
}
|
|
return flag;
|
|
}
|
|
|
|
//---------------------------------------------------------------------------------------------
|
|
// Game_Quest
|
|
//---------------------------------------------------------------------------------------------
|
|
function Game_Quest() {
|
|
this.initialize.apply(this, arguments);
|
|
};
|
|
|
|
Game_Quest.prototype.initialize = function(questId) {
|
|
var questData = $dataQuests[questId];
|
|
this.questId = questId;
|
|
this.rawData = questData;
|
|
this.cat = questData.cat;
|
|
this.name = questData.name;
|
|
this.desc = questData.desc;
|
|
this.rewards = questData.rewards;
|
|
this.icon = questData.icon;
|
|
this.steps = questData.steps;
|
|
this.maxSteps = this.steps.length;
|
|
this.currentStep = 0;
|
|
this.status = "progress";
|
|
};
|
|
|
|
Game_Quest.prototype.giveRewards = function() {
|
|
for (var i = 0; i < this.rewards.length; i += 1) {
|
|
var reward = this.rewards[i];
|
|
switch (reward[0]) {
|
|
case "item":
|
|
item = $dataItems[reward[1]];
|
|
$gameParty.gainItem(item, Number(reward[2]));
|
|
break;
|
|
case "armor":
|
|
item = $dataArmors[reward[1]];
|
|
$gameParty.gainItem(item, Number(reward[2]));
|
|
break;
|
|
case "weapon":
|
|
item = $dataWeapons[reward[1]];
|
|
$gameParty.gainItem(item, Number(reward[2]));
|
|
break;
|
|
case "xp":
|
|
for (var j = 0; j < $gameParty.members().length; j++) {
|
|
$gameParty.members()[j].gainExp(reward[1]);
|
|
};
|
|
break;
|
|
case "gold":
|
|
$gameParty.gainGold(Number(reward[1]));
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
|
|
Game_Quest.prototype.completed = function() {
|
|
return this.status == "completed";
|
|
}
|
|
|
|
Game_Quest.prototype.inProgress = function() {
|
|
return this.status == "progress";
|
|
}
|
|
|
|
Game_Quest.prototype.failed = function() {
|
|
return this.status == "failed";
|
|
}
|
|
|
|
Game_Quest.prototype.nextStep = function() {
|
|
this.currentStep = this.currentStep + 1 > this.maxSteps - 1 ? this.maxSteps - 1 : this.currentStep + 1;
|
|
};
|
|
|
|
Game_Quest.prototype.backStep = function() {
|
|
this.currentStep = this.currentStep - 1 < 0 ? 0 : this.currentStep - 1;
|
|
};
|
|
|
|
Game_Quest.prototype.currentStep = function() {
|
|
return this.currentStep;
|
|
};
|
|
|
|
Game_Quest.prototype.fail = function() {
|
|
this.status = "failed";
|
|
};
|
|
|
|
Game_Quest.prototype.complete = function() {
|
|
if ((GameusScripts["Config"]["QuestSystem"]["Auto Rewards"] || "false").toLowerCase() === "true") {
|
|
this.giveRewards();
|
|
}
|
|
this.currentStep = this.maxSteps - 1;
|
|
this.status = "completed";
|
|
};
|
|
|
|
Game_Quest.prototype.reset = function() {
|
|
this.status = "progress";
|
|
this.currentStep = 0;
|
|
};
|
|
|
|
//---------------------------------------------------------------------------------------------
|
|
// Game_Quests
|
|
//---------------------------------------------------------------------------------------------
|
|
function Game_Quests() {
|
|
this.initialize.apply(this, arguments);
|
|
};
|
|
|
|
Game_Quests.prototype.initialize = function() {
|
|
this.data = [];
|
|
};
|
|
|
|
Game_Quests.prototype.get = function(quest_id) {
|
|
if ($dataQuests[quest_id]) {
|
|
if (!this.data[quest_id]) {
|
|
this.data[quest_id] = new Game_Quest(quest_id);
|
|
}
|
|
return this.data[quest_id];
|
|
}
|
|
return null;
|
|
};
|
|
|
|
Game_Quests.prototype.categories = function() {
|
|
if ($dataQuests[0])
|
|
return $dataQuests[0];
|
|
return null;
|
|
};
|
|
|
|
Game_Quests.prototype.totalQuests = function(filter) {
|
|
// Returns a list of ALL quests
|
|
if (filter === undefined || filter === "all")
|
|
return $dataQuests.length;
|
|
// Time to cycle through quests....(dammit, I did this exact thing in the quest list window)
|
|
var count = 0;
|
|
for (var i = 0; i < $dataQuests.length; i += 1) {
|
|
var q = this.get(this.quests[i]);
|
|
if (q.status === filter.toLowerCase())
|
|
count += 1;
|
|
}
|
|
return data;
|
|
};
|
|
//---------------------------------------------------------------------------------------------
|
|
// Window_Base
|
|
//---------------------------------------------------------------------------------------------
|
|
Window_Base.prototype.sliceText = function(text, width) {
|
|
var words = text.split(" ");
|
|
if (words.length === 1)
|
|
return words;
|
|
var result = [];
|
|
var current_text = words.shift();
|
|
for (var i = 0; i < words.length; i += 1) {
|
|
var word = words[i];
|
|
var textW = this.contents.measureTextWidth(current_text + " " + word);
|
|
if (textW > width) {
|
|
result.push(current_text);
|
|
current_text = word;
|
|
} else {
|
|
current_text += " " + word;
|
|
}
|
|
if (i >= words.length - 1)
|
|
result.push(current_text)
|
|
}
|
|
return result
|
|
}
|
|
//---------------------------------------------------------------------------------------------
|
|
// Window_QuestInfo
|
|
//---------------------------------------------------------------------------------------------
|
|
function Window_QuestInfo() {
|
|
this.initialize.apply(this, arguments);
|
|
}
|
|
|
|
Window_QuestInfo.prototype = Object.create(Window_Selectable.prototype);
|
|
Window_QuestInfo.prototype.constructor = Window_QuestInfo;
|
|
|
|
Window_QuestInfo.prototype.initialize = function() {
|
|
var xx = (GameusScripts["Config"]["QuestSystem"]["Reverse Layout"] || "false").toLowerCase() === "true" ? 0 : 320;
|
|
this.failedImg = GameusScripts["Config"]["QuestSystem"]["Failed Image"] || '';
|
|
this.completedImg = GameusScripts["Config"]["QuestSystem"]["Completed Image"] || '';
|
|
if (this.failedImg !== '')
|
|
this.failedImg = ImageManager.loadPicture(this.failedImg, 0);
|
|
if (this.completedImg !== '')
|
|
this.completedImg = ImageManager.loadPicture(this.completedImg, 0);
|
|
this.quest = 0;
|
|
this.offY = 0;
|
|
this.lineY = 0;
|
|
this.resizeFlag = false;
|
|
Window_Selectable.prototype.initialize.call(this, xx, 0, Graphics.boxWidth - 320, Graphics.boxHeight);
|
|
this.questBitmap = new Bitmap(this.contentsWidth(), this.contentsHeight());
|
|
this.refresh();
|
|
};
|
|
|
|
Window_QuestInfo.prototype.setQuest = function(quest_id) {
|
|
this.quest = quest_id;
|
|
this.offY = 0;
|
|
this.resizeFlag = false;
|
|
this.createQuestBitmap();
|
|
this.refresh();
|
|
};
|
|
|
|
Window_QuestInfo.prototype.refresh = function() {
|
|
this.contents.clear();
|
|
if (this.quest > 0) {
|
|
this.contents.blt(this.questBitmap, 0, this.offY, this.contentsWidth(), this.contentsHeight(), 0, 0, this.contentsWidth(), this.contentsHeight());
|
|
}
|
|
}
|
|
|
|
// This function is used to keep track of the height of the bitmap, has to be called after every line of text drawn
|
|
Window_QuestInfo.prototype.write = function() {
|
|
this.lineY += this.lineHeight() + this.textPadding();
|
|
if (this.lineY > this.questBitmap.height) {
|
|
this.questBitmap.resize(this.questBitmap.width, this.lineY);
|
|
this.resizeFlag = true;
|
|
}
|
|
}
|
|
|
|
Window_QuestInfo.prototype.createQuestBitmap = function() {
|
|
this.questBitmap.clear();
|
|
if (this.quest > 0) {
|
|
this.questBitmap.paintOpacity = 255;
|
|
var q = $gameQuests.get(this.quest);
|
|
this.drawQuestInfo(q);
|
|
this.drawQuestSteps(q);
|
|
this.drawQuestRewards(q);
|
|
// Check for resize, then redraw
|
|
if (this.resizeFlag) {
|
|
this.resizeFlag = false;
|
|
this.createQuestBitmap();
|
|
}
|
|
if (this.failedImg !== '' && q.status === "failed") {
|
|
this.questBitmap.paintOpacity = Number(GameusScripts["Config"]["QuestSystem"]["Failed Image Opacity"] || 128);
|
|
this.questBitmap.blt(this.failedImg, 0, 0, this.failedImg.width, this.failedImg.height,
|
|
this.contentsWidth() / 2 - this.failedImg.width / 2,
|
|
this.contentsHeight() / 2 - this.failedImg.height / 2);
|
|
}
|
|
if (this.completedImg !== '' && q.status === "completed") {
|
|
this.questBitmap.paintOpacity = Number(GameusScripts["Config"]["QuestSystem"]["Completed Image Opacity"] || 128);
|
|
this.questBitmap.blt(this.completedImg, 0, 0, this.completedImg.width, this.completedImg.height,
|
|
this.contentsWidth() / 2 - this.completedImg.width / 2,
|
|
this.contentsHeight() / 2 - this.completedImg.height / 2);
|
|
}
|
|
}
|
|
};
|
|
|
|
Window_QuestInfo.prototype.drawQuestInfo = function(q) {
|
|
var headerX = 0;
|
|
this.questBitmap.paintOpacity = 255;
|
|
this.lineY = 0;
|
|
if (q.icon > -1) {
|
|
this.drawIcon(q.icon, 0, this.lineY);
|
|
headerX = 40;
|
|
}
|
|
this.questBitmap.textColor = this.systemColor();
|
|
this.questBitmap.drawText(q.name, headerX, this.lineY, this.contentsWidth() - headerX, this.lineHeight());
|
|
this.write();
|
|
this.questBitmap.textColor = this.normalColor();
|
|
var lines = this.sliceText(q.desc, this.contentsWidth());
|
|
for (var i = 0; i < lines.length; i += 1) {
|
|
this.questBitmap.drawText(lines[i], 0, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.write();
|
|
}
|
|
this.drawHorzLine(this.lineY);
|
|
this.write();
|
|
}
|
|
|
|
Window_QuestInfo.prototype.drawQuestSteps = function(q) {
|
|
// Draw the quest steps
|
|
var bullet = String(GameusScripts["Config"]["QuestSystem"]["Bullet Character"] || "-" ) + " ";
|
|
this.questBitmap.textColor = this.systemColor();
|
|
this.questBitmap.drawText("Steps", 0, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.write();
|
|
this.questBitmap.textColor = this.normalColor();
|
|
var maxSteps = Number(GameusScripts["Config"]["QuestSystem"]["Max Steps"] || 3);
|
|
if (maxSteps === 0)
|
|
maxSteps = q.steps.length;
|
|
if (q.currentStep >= q.steps.length)
|
|
q.currentStep = q.steps.length - 1;
|
|
var startStep = Math.max(0, q.currentStep - maxSteps + 1);
|
|
var drawableSteps = q.steps.slice(startStep, q.currentStep + 1);
|
|
for (var i = 0; i < drawableSteps.length; i += 1) {
|
|
var step = drawableSteps[i];
|
|
var stepText = bullet + step[0];
|
|
if (step[1] === true) {
|
|
var varVal = $gameVariables.value(step[2]);
|
|
var maxVal = step[3];
|
|
if (step[4])
|
|
stepText += " " + String(Math.floor(varVal / maxVal * 100)) + "%";
|
|
else
|
|
stepText += " " + String(varVal) + " / " + String(maxVal);
|
|
}
|
|
lines = this.sliceText(stepText, this.contentsWidth());
|
|
var done = i + startStep < q.currentStep || (q.status === "completed" || q.status === "failed");
|
|
this.questBitmap.paintOpacity = done ? 160 : 255
|
|
for (var j = 0; j < lines.length; j += 1) {
|
|
var bulletOffset = 0;
|
|
if (j > 0)
|
|
bulletOffset += this.contents.measureTextWidth(bullet);
|
|
this.questBitmap.drawText(lines[j], bulletOffset, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.write();
|
|
}
|
|
}
|
|
this.drawHorzLine(this.lineY);
|
|
this.write();
|
|
}
|
|
|
|
Window_QuestInfo.prototype.drawQuestRewards = function(q) {
|
|
var bullet = String(GameusScripts["Config"]["QuestSystem"]["Bullet Character"] || "-" ) + " ";
|
|
// Draw Rewards
|
|
this.questBitmap.textColor = this.systemColor();
|
|
this.questBitmap.drawText("Rewards", 0, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.write();
|
|
this.questBitmap.textColor = this.normalColor();
|
|
for (var i = 0; i < q.rewards.length; i += 1) {
|
|
var reward = q.rewards[i];
|
|
// If the reward is hidden and quest not completed yet...
|
|
if (reward[3] === true && q.status !== "completed") {
|
|
// Draw this shit as hidden
|
|
var hidden = bullet + (GameusScripts["Config"]["QuestSystem"]["Hidden Reward Text"] || "??????");
|
|
this.questBitmap.drawText(hidden, 0, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.write();
|
|
continue;
|
|
}
|
|
var item = null;
|
|
var amount = null;
|
|
var done = (q.status === "completed" || q.status === "failed");
|
|
this.questBitmap.paintOpacity = done ? 160 : 255
|
|
switch (reward[0]) {
|
|
case "item":
|
|
item = $dataItems[reward[1]];
|
|
amount = reward[2];
|
|
this.questBitmap.drawText(bullet, 0, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.drawItemName(item, this.contents.measureTextWidth(bullet), this.lineY, this.contentsWidth());
|
|
this.questBitmap.drawText("x" + String(amount), 0, this.lineY, this.contentsWidth(), this.lineHeight(), "right");
|
|
this.write();
|
|
break;
|
|
case "armor":
|
|
item = $dataArmors[reward[1]];
|
|
amount = reward[2];
|
|
this.questBitmap.drawText(bullet, 0, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.drawItemName(item, this.contents.measureTextWidth(bullet), this.lineY, this.contentsWidth());
|
|
this.questBitmap.drawText("x" + String(amount), 0, this.lineY, this.contentsWidth(), this.lineHeight(), "right");
|
|
this.write();
|
|
break;
|
|
case "weapon":
|
|
item = $dataWeapons[reward[1]];
|
|
amount = reward[2];
|
|
this.questBitmap.drawText(bullet, 0, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.drawItemName(item, this.contents.measureTextWidth(bullet), this.lineY, this.contentsWidth());
|
|
this.questBitmap.drawText("x" + String(amount), 0, this.lineY, this.contentsWidth(), this.lineHeight(), "right");
|
|
this.write();
|
|
break;
|
|
case "xp":
|
|
amount = reward[1];
|
|
this.questBitmap.drawText(bullet + TextManager.exp, 0, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.questBitmap.drawText("x" + String(amount), 0, this.lineY, this.contentsWidth(), this.lineHeight(), "right");
|
|
this.write();
|
|
break;
|
|
case "gold":
|
|
amount = reward[1];
|
|
this.questBitmap.drawText(bullet + TextManager.currencyUnit, 0, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.questBitmap.drawText("x" + String(amount), 0, this.lineY, this.contentsWidth(), this.lineHeight(), "right");
|
|
this.write();
|
|
break;
|
|
case "custom":
|
|
amount = this.sliceText(bullet + reward[1], this.contentsWidth());
|
|
for (var j = 0; j < amount.length; j += 1) {
|
|
var bulletOffset = 0;
|
|
if (j > 0)
|
|
bulletOffset += this.contents.measureTextWidth(bullet);
|
|
this.questBitmap.drawText(amount[j], bulletOffset, this.lineY, this.contentsWidth(), this.lineHeight());
|
|
this.write();
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Borrow some drawing methods since we're drawing to a secondary bitmap
|
|
Window_QuestInfo.prototype.drawItemName = function(item, x, y, width) {
|
|
width = width || 312;
|
|
if (item) {
|
|
var iconBoxWidth = Window_Base._iconWidth + 8;
|
|
this.questBitmap.textColor = this.normalColor();
|
|
this.drawIcon(item.iconIndex, x - 2, y + 2);
|
|
this.questBitmap.drawText(item.name, x + iconBoxWidth, y, width - iconBoxWidth, this.lineHeight());
|
|
}
|
|
};
|
|
|
|
Window_QuestInfo.prototype.drawIcon = function(iconIndex, x, y) {
|
|
var bitmap = ImageManager.loadSystem('IconSet');
|
|
var pw = Window_Base._iconWidth;
|
|
var ph = Window_Base._iconHeight;
|
|
var sx = iconIndex % 16 * pw;
|
|
var sy = Math.floor(iconIndex / 16) * ph;
|
|
this.questBitmap.blt(bitmap, sx, sy, pw, ph, x, y);
|
|
};
|
|
|
|
Window_QuestInfo.prototype.drawHorzLine = function(y) {
|
|
var lineY = y + this.lineHeight() / 2 - 1;
|
|
this.questBitmap.paintOpacity = 48;
|
|
this.questBitmap.fillRect(0, lineY, this.contentsWidth(), 2, this.normalColor());
|
|
this.questBitmap.paintOpacity = 255;
|
|
};
|
|
|
|
// Update the up/down arrows to indicate scrolling is available
|
|
Window_QuestInfo.prototype.updateArrows = function() {
|
|
this.downArrowVisible = (this.questBitmap.height > this.contentsHeight() && this.offY < this.questBitmap.height - this.contentsHeight());
|
|
this.upArrowVisible = this.offY > 0;
|
|
};
|
|
|
|
// Override the arrow key controls so we can scroll instead, let's be honest, that's way cooler
|
|
Window_QuestInfo.prototype.isCursorMovable = function() {
|
|
return (this.isOpenAndActive());
|
|
};
|
|
|
|
Window_QuestInfo.prototype.cursorDown = function(wrap) {
|
|
if (this.questBitmap.height > this.contentsHeight() && this.offY < this.questBitmap.height - this.contentsHeight()) {
|
|
SoundManager.playCursor();
|
|
this.offY += this.lineHeight() + this.textPadding();
|
|
this.refresh();
|
|
}
|
|
};
|
|
|
|
Window_QuestInfo.prototype.cursorUp = function(wrap) {
|
|
if (this.offY > 0) {
|
|
SoundManager.playCursor();
|
|
this.offY -= this.lineHeight() + this.textPadding();
|
|
if (this.offY < 0)
|
|
this.offY = 0;
|
|
this.refresh();
|
|
}
|
|
};
|
|
|
|
Window_QuestInfo.prototype.cursorPagedown = function() {
|
|
this.cursorDown();
|
|
};
|
|
|
|
Window_QuestInfo.prototype.cursorPageup = function() {
|
|
this.cursorUp();
|
|
};
|
|
|
|
Window_QuestInfo.prototype.cursorRight = function(wrap) {
|
|
// We are basically...
|
|
};
|
|
|
|
Window_QuestInfo.prototype.cursorLeft = function(wrap) {
|
|
// ...screwing the system
|
|
};
|
|
|
|
//---------------------------------------------------------------------------------------------
|
|
// Window_Quests
|
|
//---------------------------------------------------------------------------------------------
|
|
function Window_Quests() {
|
|
this.initialize.apply(this, arguments);
|
|
};
|
|
|
|
Window_Quests.prototype = Object.create(Window_Command.prototype);
|
|
Window_Quests.prototype.constructor = Window_Quests;
|
|
|
|
Window_Quests.prototype.initialize = function() {
|
|
var xx = (GameusScripts["Config"]["QuestSystem"]["Reverse Layout"] || "false").toLowerCase() === "true" ? Graphics.boxWidth - 320 : 0;
|
|
var yy = String(GameusScripts["Config"]["QuestSystem"]["Filter Position"]).toLowerCase() === "top" ? this.fittingHeight(1) : 0;
|
|
// Stores all quests available from $gameParty
|
|
this.qFilters = ["all", "progress", "completed", "failed"];
|
|
this.filterIndex = 0;
|
|
this.data = [];
|
|
this.cats = $gameQuests.categories();
|
|
this.expanded = [];
|
|
for (var i = 0; i < this.cats.length; i += 1)
|
|
this.expanded[i] = false;
|
|
this.filter = "all";
|
|
this.refreshQuests();
|
|
Window_Command.prototype.initialize.call(this, xx, yy);
|
|
};
|
|
|
|
Window_Quests.prototype.windowWidth = function() {
|
|
return 320;
|
|
};
|
|
|
|
Window_Quests.prototype.numVisibleRows = function() {
|
|
return 10;
|
|
};
|
|
|
|
Window_Quests.prototype.windowHeight = function() {
|
|
return Graphics.boxHeight - this.fittingHeight(1)
|
|
}
|
|
|
|
Window_Quests.prototype.drawItem = function(index) {
|
|
var item = this._list[index];
|
|
var rect = this.itemRectForText(index);
|
|
var align = this.itemTextAlign();
|
|
this.resetTextColor();
|
|
this.changePaintOpacity(this.isCommandEnabled(index));
|
|
var tempX = 0;
|
|
if (item.symbol === "quest") {
|
|
var q = $gameQuests.get(Number(item.ext));
|
|
if (q.icon > -1 && (GameusScripts["Config"]["QuestSystem"]["Use Icons"]).toLowerCase() === "true") {
|
|
this.drawIcon(q.icon, rect.x + 8, rect.y + 2);
|
|
tempX = 40;
|
|
}
|
|
}
|
|
this.drawText(this.commandName(index), rect.x + tempX / 2, rect.y, rect.width, align);
|
|
};
|
|
|
|
|
|
Window_Quests.prototype.questData = function(quest_id) {
|
|
return $gameQuests.get(quest_id);
|
|
};
|
|
|
|
Window_Quests.prototype.refreshQuests = function() {
|
|
this.data = $gameParty.getQuests();
|
|
this.cats = $gameQuests.categories();
|
|
this.counter = [];
|
|
for (var i = 0; i < this.cats.length; i += 1)
|
|
this.expanded[i] = false;
|
|
for (var i = 0; i < this.cats.length; i += 1) {
|
|
this.counter[i] = 0;
|
|
for (var j = 0; j < this.data.length; j += 1) {
|
|
var q = $gameQuests.get(this.data[j]);
|
|
if (q.cat == i && (this.filter == q.status || this.filter == "all"))
|
|
this.counter[i] += 1;
|
|
}
|
|
}
|
|
};
|
|
|
|
Window_Quests.prototype.setFilter = function(filter) {
|
|
this.filter = filter;
|
|
};
|
|
|
|
Window_Quests.prototype.toggle = function(cat) {
|
|
this.expanded[cat] = !this.expanded[cat];
|
|
this.refresh();
|
|
};
|
|
|
|
Window_Quests.prototype.makeCommandList = function() {
|
|
var q;
|
|
var flag = false;
|
|
var count = "";
|
|
var useCats = (GameusScripts["Config"]["QuestSystem"]['Use Categories'] || "false").toLowerCase();
|
|
var catMode = Number(GameusScripts["Config"]["QuestSystem"]["Show Empty Categories"] || 0);
|
|
var showCount = (GameusScripts["Config"]["QuestSystem"]["Show Quest Count"] || "false").toLowerCase();
|
|
if (useCats === "true") {
|
|
for (var i = 0; i < this.cats.length; i += 1) {
|
|
flag = true;
|
|
if (showCount === "true")
|
|
count = " (" + String(this.counter[i]) + ")";
|
|
if (catMode == 1 && this.counter[i] == 0)
|
|
flag = false;
|
|
if (catMode > 0 || this.counter[i] > 0)
|
|
this.addCommand(this.cats[i] + count, "cat", flag, String(i));
|
|
if (this.expanded[i]) {
|
|
flag = false;
|
|
for (var j = 0; j < this.data.length; j += 1) {
|
|
q = $gameQuests.get(this.data[j]);
|
|
if ((q.status == this.filter || this.filter == "all") && i == q.cat) {
|
|
flag = true;
|
|
this.addCommand(" " + q.name, "quest", true, q.questId);
|
|
}
|
|
}
|
|
if (!flag)
|
|
this.addCommand(" " + GameusScripts["Config"]["QuestSystem"]["No Quests Text"] || "No Quests", "none");
|
|
}
|
|
}
|
|
} else {
|
|
for (var i = 0; i < this.data.length; i += 1) {
|
|
q = $gameQuests.get(this.data[i]);
|
|
if (q.status == this.filter || this.filter == "all")
|
|
this.addCommand(q.name, "quest", true, q.questId);
|
|
}
|
|
}
|
|
if (this._list.length < 1) {
|
|
this.addCommand(GameusScripts["Config"]["QuestSystem"]["No Quests Text"] || "No Quests", "none");
|
|
}
|
|
};
|
|
|
|
Window_Quests.prototype.cursorRight = function(wrap) {
|
|
this.filterIndex = this.filterIndex + 1 > 3 ? 0 : this.filterIndex + 1;
|
|
this.filter = this.qFilters[this.filterIndex];
|
|
this.refreshQuests();
|
|
this.refresh();
|
|
this.select(0);
|
|
};
|
|
|
|
Window_Quests.prototype.cursorLeft = function(wrap) {
|
|
this.filterIndex = this.filterIndex - 1 < 0 ? 3 : this.filterIndex - 1;
|
|
this.filter = this.qFilters[this.filterIndex];
|
|
this.refreshQuests();
|
|
this.refresh();
|
|
this.select(0);
|
|
};
|
|
//---------------------------------------------------------------------------------------------
|
|
// Window_QuestFilter
|
|
//---------------------------------------------------------------------------------------------
|
|
function Window_QuestFilter() {
|
|
this.initialize.apply(this, arguments);
|
|
}
|
|
|
|
Window_QuestFilter.prototype = Object.create(Window_Base.prototype);
|
|
Window_QuestFilter.prototype.constructor = Window_QuestFilter;
|
|
|
|
Window_QuestFilter.prototype.initialize = function() {
|
|
this.qFilters = [
|
|
GameusScripts["Config"]["QuestSystem"]["All Word"] || "All",
|
|
GameusScripts["Config"]["QuestSystem"]["Progress Word"] || "In-Progress",
|
|
GameusScripts["Config"]["QuestSystem"]["Completed Word"] || "Completed",
|
|
GameusScripts["Config"]["QuestSystem"]["Failed Word"] || "Failed",
|
|
];
|
|
var xx = (GameusScripts["Config"]["QuestSystem"]["Reverse Layout"] || "false").toLowerCase() === "true" ? Graphics.boxWidth - 320 : 0;
|
|
var yy = String(GameusScripts["Config"]["QuestSystem"]["Filter Position"]).toLowerCase() === "top" ? 0 : Graphics.boxHeight - this.windowHeight();
|
|
this.filterIndex = 0;
|
|
this.filter = "";
|
|
var width = this.windowWidth();
|
|
var height = this.windowHeight();
|
|
Window_Base.prototype.initialize.call(this, xx, yy, width, height);
|
|
this.refresh();
|
|
};
|
|
|
|
Window_QuestFilter.prototype.windowWidth = function() {
|
|
return 320;
|
|
};
|
|
|
|
Window_QuestFilter.prototype.windowHeight = function() {
|
|
return this.fittingHeight(1);
|
|
};
|
|
|
|
Window_QuestFilter.prototype.refresh = function() {
|
|
if (this.filter == this.qFilters[this.filterIndex])
|
|
return;
|
|
this.filter = this.qFilters[this.filterIndex];
|
|
this.contents.clear();
|
|
this.drawText(this.filter, 0, 0, this.contentsWidth(), "center");
|
|
};
|
|
//---------------------------------------------------------------------------------------------
|
|
// Scene_Quest
|
|
//---------------------------------------------------------------------------------------------
|
|
function Scene_Quest() {
|
|
this.initialize.apply(this, arguments);
|
|
};
|
|
|
|
Scene_Quest.prototype = Object.create(Scene_MenuBase.prototype);
|
|
Scene_Quest.prototype.constructor = Scene_Quest;
|
|
|
|
Scene_Quest.prototype.initialize = function() {
|
|
Scene_MenuBase.prototype.initialize.call(this);
|
|
};
|
|
|
|
Scene_Quest.prototype.create = function() {
|
|
Scene_MenuBase.prototype.create.call(this);
|
|
this.qFilters = ["all", "progress", "completed", "failed"];
|
|
this.createQuestWindow();
|
|
};
|
|
|
|
Scene_Quest.prototype.createQuestWindow = function() {
|
|
this.oldIndex = 0;
|
|
this.questWindow = new Window_Quests();
|
|
this.questWindow.setHandler("cat", this.handleCategory.bind(this));
|
|
this.questWindow.setHandler("quest", this.handleQuest.bind(this));
|
|
this.questWindow.setHandler("cancel", this.popScene.bind(this));
|
|
this.addWindow(this.questWindow);
|
|
this.questInfo = new Window_QuestInfo();
|
|
this.questInfo.setHandler("cancel", this.cancelInfo.bind(this));
|
|
this.addWindow(this.questInfo);
|
|
this.questFilter = new Window_QuestFilter();
|
|
this.addWindow(this.questFilter);
|
|
};
|
|
|
|
Scene_Quest.prototype.update = function() {
|
|
var index = this.questWindow.index();
|
|
if (this.oldIndex != index) {
|
|
var q = this.questWindow._list[index];
|
|
if (q.symbol === "quest")
|
|
this.questInfo.setQuest(q.ext);
|
|
else
|
|
this.questInfo.setQuest(-1);
|
|
this.oldIndex = index;
|
|
}
|
|
this.questFilter.filterIndex = this.questWindow.filterIndex;
|
|
this.questFilter.refresh();
|
|
Scene_Base.prototype.update.call(this);
|
|
};
|
|
|
|
Scene_Quest.prototype.cancelInfo = function() {
|
|
this.questWindow.activate();
|
|
this.questInfo.deactivate();
|
|
}
|
|
|
|
Scene_Quest.prototype.handleQuest = function() {
|
|
this.questWindow.deactivate();
|
|
this.questInfo.activate();
|
|
};
|
|
|
|
Scene_Quest.prototype.handleCategory = function() {
|
|
var catIndex = this.questWindow.currentExt();
|
|
this.questWindow.toggle(catIndex);
|
|
this.questWindow.refresh();
|
|
this.questWindow.activate();
|
|
};
|
|
|
|
// This is used to open up the Quest Log from the menu
|
|
// Used in conjunction with Yanfly's Menu plugin
|
|
Scene_Menu.prototype.commandQuest = function() {
|
|
SceneManager.push(Scene_Quest);
|
|
};
|
|
|