phantom-soul-sword-lambda-n.../www/js/plugins/CategorySynthesis.js
2025-07-11 18:31:55 -07:00

1910 lines
No EOL
74 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// カテゴリ合成 ver1.02
//
// ------------------------------------------------------
// Copyright (c) 2016 Yana
// Released under the MIT license
// http://opensource.org/licenses/mit-license.php
// ------------------------------------------------------
//
// author Yana
//
var Imported = Imported || {};
Imported['CategorySythesis'] = 1.02;
/*:
* @plugindesc ver1.02/アイテムを合成する機能を追加します。【SecondaryCategories必須】
* @author Yana
*
* @param DefaultSynthesisName
* @desc 合成シーンの名前として表示する名称のデフォルト値です。
* @default 合成
*
* @param DefaultSynthesisCategories
* @desc 合成で投入できるカテゴリの初期設定です。
* @default アイテム,武器,防具,大事なもの
*
* @param NeedMachineryName
* @desc 必要器材の名称です。
* @default 必要器材
*
* @param NeedMaterialName
* @desc 必要素材の名称です。
* @default 必要素材
*
* @param MaterialListText
* @desc 素材リストの上に表示するウィンドウの名前です。
* @default マテリアルリスト
*
* @param SynthesisText
* @desc 「合成する」として表示するテキストです。
* @default 合成する
*
* @param NumberSynthesisText
* @desc 「○個合成する」として表示するテキストです。
* @default _num個合成する
*
* @param SynthesisHelp
* @desc 「○個合成する」にカーソルがあっているときにヘルプに表示されるテキストです。
* @default 上下キーで製作個数を選択します。
*
* @param EstimateText
* @desc 結果予測ウィンドウに表示するテキストです。
* @default 結果予測
*
* @param SynthesisPriceText
* @desc 合成ショップ時に合成するにカーソルがあっているとき、表示される合成代金のテキストです。
* @default 合成代金
*
* @param ChangeRecipeTone
* @desc レシピが変化した際の予測ウィンドウと結果ウィンドウのウィンドウトーンです。
* @default 206,68,24,0
*
* @param SynthesisResultText
* @desc 合成結果ウィンドウに表示するテキストです。
* @default 合成結果
*
* @param SynthesisSeName
* @desc 合成時に鳴らすSE名です。
* @default Item1
* @require 1
* @dir audio/se/
* @type file
*
* @param SynthesisSeSettings
* @desc 合成時に鳴らすSEの設定です。
* @default 90,100,0
*
* @param MenuSynthesisCommandName
* @desc メニューに表示する合成のコマンド名です。
* 空欄にするとメニューに合成を追加しません。
* @default 合成
*
* @help------------------------------------------------------
* プラグインコマンド
* ------------------------------------------------------
* ***合成シーンを直接呼び出す***
* カテゴリ合成呼び出し
* CallCategorySynthesis
*
* 追加設定として、名前、ピクチャ、カテゴリの設定が可能です。
* 名前の設定をすると、レシピリストに表示されます。
* ピクチャの設定をすると、レシピステータスに指定した画像が表示されます。
* カテゴリの設定をすると、その合成で合成できるカテゴリを設定できます。
* カテゴリを未設定にすると、通常通り、「アイテム、武器、防具、大事なもの」が設定されます。
*
* 例:名前を合成屋、ピクチャをtest1、カテゴリを回復薬,インゴットに設定する。
* カテゴリ合成呼び出し 名前:合成屋 ピクチャ:test1 カテゴリ:回復薬,インゴット
*
* ***ショップを経由して合成シーンを呼び出す***
* 合成ショップ設定
* SettingSynthesisShop
*
* 合成ショップの設定も上記の呼び出しと同じように設定が可能です。
* この設定を呼び出した後イベントコマンドでショップを呼び出すことにより、
* 合成ショップを呼び出すことができます。
*
* ショップ経由で合成を呼び出した場合、合成可能なレシピは所持しているレシピブックを無視し、
* イベントコマンドで設定したラインナップを合成できます。
* また、ショップ経由の場合は合成に合成料が必要となり、器具の設定が無視されます。
*
* ------------------------------------------------------
* 使い方
* ------------------------------------------------------
* ***レシピの設定***
* 合成の為のレシピはアイテムのメモを使って設定します。
*
* ―――材料の設定―――
* <合成材料:○:x,○:x…>
* <SyntheticMaterials:○:x,○:x…>
*
* そのアイテムのレシピを○:x,○:x…に設定します。
* ○にはアイテムまたはカテゴリの指定、xには個数を設定します。
* アイテムの指定は、I◇,W◇,A◇のように行います。
* I◇の場合は、ID◇番のアイテム、W◇の場合は◇番の武器、A◇の場合は◇番の防具になります。
* カテゴリを指定する場合は、カテゴリ名で直接指定してください。
* 必要な材料が1つの場合は:xを省略することができます。
*
* 例:5番のアイテム2個、1番の武器1つ、7番の防具1つを材料に指定する
* <合成材料:I5:2,W1,A7>
*
* ―――器材の設定―――
* <必要器材:○,○…>
* <Machinery:○,○…>
*
* そのアイテムの必要器材を○,○…に設定します。
* ○にはアイテムを指定します。アイテムの設定方法は上記のレシピと同じです。
* 器材はカテゴリと数量の指定ができません。
* この器材は合成シーンをプラグインコマンドで呼び出した時のみ必要になります。
* ショップシーンを経由した場合は、この設定は無視されます。
*
* 例:6番のアイテムと8番の武器を必要器材に指定する
* <必要器材:I6,W8>
*
* ―――合成数の設定―――
* <合成数:x>
* <SyntheticNumber:x>
*
* そのアイテムの制作数をx個に指定します。
*
* ―――合成料の設定―――
* <合成料:x>
* <SyntheticPrice:x>
*
* そのアイテムの合成料をxに設定します。
* 合成料はショップを経由して呼び出された場合のみ使用されます。
* 設定がない場合は、アイテムの価格が合成料として設定されます。
*
* ―――ダミーレシピの設定―――
* <ダミーレシピ:○>
* <DummyRecipe:○>
*
* ダミーレシピとは1つのアイテムのレシピを複数設定するための仕組みです。
* ダミーレシピの設定されたアイテムを合成すると、
* 生成されるアイテムがダミーレシピで設定したアイテムに置き換わります。
* ○にはレシピと同じようにI◇,W◇,A◇でアイテムを設定します。
*
* ―――合成優先度の設定―――
* <合成優先度:x>
* <SyntheticPriority:x>
*
* 合成優先度はレシピ変化が起きた際に変化先のアイテムを指定するための仕組みです。
* レシピを満たした時、優先度が最も高いものに変化します。
* 優先度が同じ場合、IDの高いものが優先されます。
*
* ***レシピブックの設定***
* レシピブックもアイテムのメモを使って設定します。
*
* <掲載レシピ:○,○,○…>
* <PublishedRecipe:○,○,○…>
*
* そのアイテムの掲載レシピを○,○,○…に設定します。
* ○にはレシピと同じようにI◇,W◇,A◇でアイテムを設定します。
* 例:5番のアイテム、2番の武器、6番の防具
* <掲載レシピ:I5,W2,A6>
*
* ------------------------------------------------------
* 利用規約
* ------------------------------------------------------
* 当プラグインはMITライセンスで公開されています。
* 使用に制限はありません。商用、アダルト、いずれにも使用できます。
* 二次配布も制限はしませんが、サポートは行いません。
* 著作表示は任意です。行わなくても利用できます。
* 要するに、特に規約はありません。
* バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
* https://twitter.com/yanatsuki_
* 素材利用は自己責任でお願いします。
* ------------------------------------------------------
* 更新履歴:
* ver1.02:190212
* 合成結果で変化したアイテムの最大合成数が正常に処理されていなかったバグを修正。
* アイテム重量制と併用時、所持重量がオーバーしているときは合成できないように変更。
* ver1.01:180214
* 所持限界以上に合成できていたバグを修正。
* ver1.00:
* 公開
*/
(function() {
'use strict';
////////////////////////////////////////////////////////////////////////////////////
var parameters = PluginManager.parameters('CategorySynthesis');
var defaultSynthesisName = parameters['DefaultSynthesisName'];
var defaultSynthesisCategories = parameters['DefaultSynthesisCategories'].split(',');
var needMachineryName = parameters['NeedMachineryName'];
var needMaterialName = parameters['NeedMaterialName'];
var materialListText = parameters['MaterialListText'];
var synthesisText = parameters['SynthesisText'];
var numberSynthesisText = parameters['NumberSynthesisText'];
var synthesisHelp = parameters['SynthesisHelp'];
var estimateText = parameters['EstimateText'];
var synthesisPriceText = parameters['SynthesisPriceText'];
var changeRecipeTone = parameters['ChangeRecipeTone'].split(',').map(function(s){ return Number(s)});
var synthesisResultText = parameters['SynthesisResultText'];
var synthesisSeName = parameters['SynthesisSeName'];
var synthesisSeSettings = parameters['SynthesisSeSettings'].split(',').map(function(s){ return Number(s)});
var menuSynthesisCommandName = parameters['MenuSynthesisCommandName'];
////////////////////////////////////////////////////////////////////////////////////
var __WMCommand_addOriginalCommands = Window_MenuCommand.prototype.addOriginalCommands;
Window_MenuCommand.prototype.addOriginalCommands = function() {
__WMCommand_addOriginalCommands.call(this);
if (menuSynthesisCommandName){
this.addCommand(menuSynthesisCommandName, 'categorySynthesis', true);
}
};
var __SMenu_createCommandWindow = Scene_Menu.prototype.createCommandWindow;
Scene_Menu.prototype.createCommandWindow = function() {
__SMenu_createCommandWindow.call(this);
this._commandWindow.setHandler('categorySynthesis', this.commandCategorySynthesis.bind(this));
};
Scene_Menu.prototype.commandCategorySynthesis = function() {
$gameTemp._callShopSynthesis = false;
SceneManager.push(Scene_CategorySynthesis);
SceneManager.prepareNextScene('');
};
////////////////////////////////////////////////////////////////////////////////////
DataManager.isRecipeBook = function(item) {
return item && (item.meta['掲載レシピ'] || item.meta['PublishedRecipe']);
};
DataManager.publishedItemRecipes = function(item) {
var recipes = item.meta['掲載レシピ'] || item.meta['PublishedRecipe'];
return recipes.split(',');
};
DataManager.hasRecipe = function(item) {
var recipe = this.itemRecipe(item);
if (recipe.recipe) return true;
return false;
};
DataManager.itemRecipe = function(item) {
if (item._recipe) return item._recipe;
var recipe = item.meta['合成材料'] || item.meta['SyntheticMaterials'] || '';
var machinery = item.meta['必要器材'] || item.meta['Machinery'] || '';
var num = item.meta['合成数'] || item.meta['SyntheticNumber'] || 1;
var value = item.meta['合成料'] || item.meta['SyntheticPrice'] || item.price;
var dummy = item.meta['ダミーレシピ'] || item.meta['DummyRecipe'] || '';
var priority = Number(item.meta['合成優先度'] || item.meta['SyntheticPriority']) || 0;
var mats = recipe.split(',').filter(function(m){
return m;
}).map(function(m){
var n = 1;
if (m.match(/:(\d+)/)) n = Number(RegExp.$1);
m = m.replace(/:\d+/,'');
return [m,n];
});
var mache = machinery.split(',').filter(function(m){
return m;
}).map(function(m){
var n = 1;
if (m.match(/:(\d+)/)) n = Number(RegExp.$1);
m = m.replace(/:\d+/,'');
return [m,n];
});
item._recipe = {num:num, value:value, recipe:mats, machinery:mache, dummy:dummy, priority:priority};
return item._recipe;
};
DataManager.encodeSynthesisItem = function(obj) {
if (!obj) return null;
if (this.isItem(obj)) return 'I' + obj.id;
if (this.isWeapon(obj)) return 'W' + obj.id;
if (this.isArmor(obj)) return 'A' + obj.id;
return null;
};
DataManager.decodeSynthesisItem = function(obj) {
if (!obj) return null;
var type = obj[0].toUpperCase();
var item = null;
var id = Number(obj.replace(/[IWA]/,''));
if (id) {
switch (type) {
case 'I': item = $dataItems[id]; break;
case 'W': item = $dataWeapons[id]; break;
case 'A': item = $dataArmors[id]; break;
}
}
return item;
};
DataManager.isSynthesisItem = function(item) {
return /^[IWA]\d+/i.test(item);
};
DataManager.isMaterial = function(item) {
return item && !(item.meta['材料指定不可'] || item.meta['NotMaterial']);
};
////////////////////////////////////////////////////////////////////////////////////
var __GInterpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
if (command === 'カテゴリ合成呼び出し' || command === 'CallCategorySynthesis') {
this.callCategorySynthesis(args);
} else if (command === '合成ショップ設定' || command === 'SettingSynthesisShop') {
this.callSynthesisShop(args);
} else {
__GInterpreter_pluginCommand.call(this, command, args);
}
};
Game_Interpreter.prototype.callCategorySynthesis = function(args) {
$gameTemp._callShopSynthesis = false;
SceneManager.push(Scene_CategorySynthesis);
SceneManager.prepareNextScene(args);
};
Game_Interpreter.prototype.callSynthesisShop = function(args) {
$gameTemp._categoryShopSetting = args;
};
// Shop Processing
var __GInterpreter_command302 = Game_Interpreter.prototype.command302;
Game_Interpreter.prototype.command302 = function() {
if (!$gameParty.inBattle()) {
if ($gameTemp._categoryShopSetting) {
var goods = [this._params];
while (this.nextEventCode() === 605) {
this._index++;
goods.push(this.currentCommand().parameters);
}
$gameTemp._callShopSynthesis = true;
SceneManager.push(Scene_CategorySynthesis);
SceneManager.prepareNextScene($gameTemp._categoryShopSetting, goods);
} else {
__GInterpreter_command302.call(this);
}
}
return true;
};
////////////////////////////////////////////////////////////////////////////////////
Window_Base.prototype.drawSynthesisStretchIcon = 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;
var n = this.contents.fontSize + 4;
this.contents.blt(bitmap, sx, sy, pw, ph, x, y, n, n);
};
Window_Base.prototype.drawSynthesisItemName = function(item, num, x, y, width) {
width = width || 312;
if (item) {
var iconBoxWidth = this.contents.fontSize + 8;
this.resetTextColor();
this.drawSynthesisStretchIcon(item.iconIndex, x + 2, y + 4);
var text = item.name;
if (num > 1) text += 'x' + num;
this.drawText(text, x + iconBoxWidth, y, width - iconBoxWidth);
}
};
Window_Base.prototype.drawSynthesisHorzLine = function(y) {
this.contents.fillRect(4, y, this.contentsWidth() - 8, 2, 'rgba(255,255,255,0.5)');
};
////////////////////////////////////////////////////////////////////////////////////
//並列処理でレシピの配列を作成
var __SBase_update = Scene_Base.prototype.update;
Scene_Base.prototype.update = function() {
__SBase_update.call(this);
if ($gameTemp && !$gameTemp._allCheckedRecipes){
$gameTemp.updateMakeRecipeArray();
}
};
////////////////////////////////////////////////////////////////////////////////////
Game_Temp.prototype.updateMakeRecipeArray = function() {
if (!this._recipeArray){
this._recipeArray = [];
this._allCheckedRecipes = false;
this._recipeCheckIndex = 0;
}
for (var i=0;i<10;i++) {
var item = null;
if (this._recipeCheckIndex < 10000) {
item = $dataItems[this._recipeCheckIndex];
if (item) this.setRecipeArray('I', item);
} else if (this._recipeCheckIndex < 20000){
item = $dataWeapons[this._recipeCheckIndex - 10000];
if (item) this.setRecipeArray('W', item);
} else {
item = $dataArmors[this._recipeCheckIndex - 20000];
if (item) this.setRecipeArray('A', item);
}
this._recipeCheckIndex++;
if (this._recipeCheckIndex === $dataItems.length) {
this._recipeCheckIndex = 10000;
} else if (this._recipeCheckIndex === $dataWeapons.length + 10000) {
this._recipeCheckIndex = 20000;
} else if (this._recipeCheckIndex === $dataArmors.length + 20000) {
this._allCheckedRecipes = true;
}
}
};
Game_Temp.prototype.setRecipeArray = function(type, item) {
if (DataManager.hasRecipe(item)) {
var recipe = DataManager.itemRecipe(item);
var l = 0;
for (var i=0,max=recipe.recipe.length;i<max;i++) l += recipe.recipe[i][1];
if (l > 0) {
if (!this._recipeArray[l]) this._recipeArray[l] = [];
this._recipeArray[l].push(type + item.id);
}
}
};
Game_Temp.prototype.recipeArray = function() {
if (!this._allCheckedRecipes) {
for (;;) {
this.updateMakeRecipeArray();
if (this._allCheckedRecipes) break;
}
}
return this._recipeArray;
};
////////////////////////////////////////////////////////////////////////////////////
Game_Party.prototype.setExRecipe = function(base, exItem) {
if (!this._exRecipes) this._exRecipes = {};
base = DataManager.encodeSynthesisItem(base);
exItem = DataManager.encodeSynthesisItem(exItem);
if (!this._exRecipes[base]) this._exRecipes[base] = [];
if (this._exRecipes[base].indexOf(exItem) < 0) this._exRecipes[base].push(exItem);
this._exRecipes[base].sort();
};
Game_Party.prototype.exRecipes = function(base) {
if (!this._exRecipes) return null;
base = DataManager.encodeSynthesisItem(base);
return this._exRecipes[base];
};
Game_Party.prototype.isLearnedExRecipe = function(base, item) {
var exRecipes = this.exRecipes(base);
item = DataManager.encodeSynthesisItem(item);
return exRecipes && exRecipes.indexOf(item) >= 0;
};
////////////////////////////////////////////////////////////////////////////////////
function Window_Recipe() {
this.initialize.apply(this, arguments);
}
Window_Recipe.prototype = Object.create(Window_ShopBuy.prototype);
Window_Recipe.prototype.constructor = Window_Recipe;
Window_Recipe.prototype.initialize = function(x, y, h, recipes, name) {
this._name = name;
if (Imported['LimitPossession']) this._allWeight = $gameParty.allItemsWeight();
Window_ShopBuy.prototype.initialize.call(this, x, y, h, recipes);
};
Window_Recipe.prototype.standardFontSize = function() {
return 24;
};
Window_Recipe.prototype.maxPageRows = function() {
return Window_ShopBuy.prototype.maxPageRows.call(this) - 1;
};
Window_Recipe.prototype.setCategory = function(category) {
this._category = category;
this.refresh();
};
Window_Recipe.prototype.windowWidth = function() {
return 456;
};
Window_Recipe.prototype.itemRect = function(index) {
var rect = Window_ShopBuy.prototype.itemRect.call(this, index);
rect.y += 40;
return rect;
};
Window_Recipe.prototype.makeItemList = function() {
this._data = [];
this._price = [];
this._shopGoods.forEach(function(g){
var item = DataManager.decodeSynthesisItem(g[0]);
if (item && this.includes(item)){
this._data.push(item);
this._price.push(g[1]);
if (!$gameTemp._callShopSynthesis) {
var exRecipes = $gameParty.exRecipes(item);
if (exRecipes) {
for (var i = 0, max = exRecipes.length; i < max; i++) {
var er = exRecipes[i];
if (this._shopGoods.filter(function(s){ return s[0] === er}).length === 0) {
var ei = DataManager.decodeSynthesisItem(er);
if (this._data.indexOf(ei) < 0) {
this._data.push(ei);
this._price.push(g[1]);
}
}
}
}
}
}
}.bind(this));
};
Window_Recipe.prototype.refresh = function() {
Window_ShopBuy.prototype.refresh.call(this);
var name = this._name ? this._name : defaultSynthesisName;
this.contents.fontSize = 20;
this.drawText(name, 4, 0, this.contentsWidth() - 8);
this.drawSynthesisHorzLine(28);
};
Window_Recipe.prototype.drawItem = function(index) {
var item = this._data[index];
var rect = this.itemRect(index);
var priceWidth = 96;
var recipe = DataManager.itemRecipe(item);
rect.width -= this.textPadding();
this.changePaintOpacity(this.isEnabled(item));
this.drawSynthesisItemName(item, recipe.num, rect.x, rect.y, rect.width - priceWidth);
if (this.price(item)) {
this.drawText(this.price(item), rect.x + rect.width - priceWidth,
rect.y, priceWidth, 'right');
}
this.changePaintOpacity(true);
};
Window_Recipe.prototype.includes = function(item) {
if (this._category === '_item') return DataManager.isItem(item) && item.itypeId === 1;
if (this._category === '_weapon') return DataManager.isWeapon(item);
if (this._category === '_armor') return DataManager.isArmor(item);
if (this._category === '_keyItem') return DataManager.isItem(item) && item.itypeId === 2;
var categories = DataManager.itemSecondaryCategories(item);
return categories.indexOf(this._category) >= 0;
};
Window_Recipe.prototype.isEnabled = function(item) {
var result = (item && this.price(item) <= this._money && !$gameParty.hasMaxItems(item));
result = result && this.checkEnableRecipe(DataManager.itemRecipe(item));
if (Imported['LimitPossession']) {
if ((this._allWeight + item._weight) > $gameParty.maxWeight()) return false;
}
return result;
};
Window_Recipe.prototype.checkEnableRecipe = function(recipe) {
var ary = recipe.recipe;
if (!$gameTemp._callShopSynthesis) ary = ary.concat(recipe.machinery);
for (var i=0,max=ary.length;i<max;i++) {
var m = ary[i];
var item = null;
if (DataManager.isSynthesisItem(m[0])) {
item = DataManager.decodeSynthesisItem(m[0]);
if ($gameParty.numItems(item) < m[1]) return false;
} else {
item = m[0];
var n = $gameParty.allItems().reduce(function(r,it){
if (DataManager.itemSecondaryCategories(it).indexOf(item) >= 0) {
r += $gameParty.numItems(it);
}
return r;
}.bind(this),0);
if (n < m[1]) return false;
}
}
return true;
};
Window_Recipe.prototype.currentPrice = function() {
return this.price(this.item());
};
Window_Recipe.prototype.baseItem = function() {
return Window_ShopBuy.prototype.item.call(this);
};
Window_Recipe.prototype.item = function() {
var item = this.baseItem();
if (!item) return item;
var dummy = DataManager.itemRecipe(item).dummy;
return dummy ? DataManager.decodeSynthesisItem(dummy) : item;
};
////////////////////////////////////////////////////////////////////////////////////
function Window_SynthesisCategory() {
this.initialize.apply(this, arguments);
}
Window_SynthesisCategory.prototype = Object.create(Window_HorzCommand.prototype);
Window_SynthesisCategory.prototype.constructor = Window_SynthesisCategory;
Window_SynthesisCategory.prototype.initialize = function(x, y, w) {
this._width = w;
Window_HorzCommand.prototype.initialize.call(this, x, y);
};
Window_SynthesisCategory.prototype.windowWidth = function() {
return this._width;
};
Window_SynthesisCategory.prototype.setCategories = function(categories) {
this._categories = categories;
this.refresh();
};
Window_SynthesisCategory.prototype.setRecipeWindow = function(window) {
this._recipeWindow = window;
};
Window_SynthesisCategory.prototype.maxCols = function() {
if (this._categories && this._categories.length > 0) return this._categories.length;
return 4;
};
Window_SynthesisCategory.prototype.category = function() {
if (!this._categories) this._categories = [];
if (this._categories.length > 0) {
return this._categories[this.index()];
} else {
return this.currentSymbol();
}
};
Window_SynthesisCategory.prototype.makeCommandList = function() {
if (this._categories) {
if (this._categories.length > 0) {
for (var i=0,max=this._categories.length;i<max;i++) {
var name = this._categories[i];
this.addCommand(name, name);
}
} else {
this.addCommand(TextManager.item, '_item');
this.addCommand(TextManager.weapon, '_weapon');
this.addCommand(TextManager.armor, '_armor');
this.addCommand(TextManager.keyItem, '_keyItem');
}
}
};
Window_SynthesisCategory.prototype.updateHelp = function() {
Window_HorzCommand.prototype.updateHelp.call(this);
if (this._recipeWindow) this._recipeWindow.setCategory(this.category());
};
////////////////////////////////////////////////////////////////////////////////////
function Window_SynthesisStatus() {
this.initialize.apply(this, arguments);
}
Window_SynthesisStatus.prototype = Object.create(Window_ShopStatus.prototype);
Window_SynthesisStatus.prototype.constructor = Window_SynthesisStatus;
Window_SynthesisStatus.prototype.initialize = function(x, y, width, height, picture) {
this._picture = picture;
Window_ShopStatus.prototype.initialize.call(this, x, y, width, height);
this.createPictureSprite();
};
Window_SynthesisStatus.prototype.createPictureSprite = function() {
if (this._picture) {
if (!this._sprite) {
var sprite = new Sprite();
sprite.bitmap = ImageManager.loadPicture(this._picture);
sprite.anchor.x = 0.5;
sprite.anchor.y = 0.5;
sprite.x = Math.floor(this.width / 2);
sprite.y = Math.floor(this.height / 2);
this._sprite = sprite;
this._windowSpriteContainer.addChildAt(this._sprite, 1);
}
}
};
Window_SynthesisStatus.prototype.setRecipeWindow = function(window) {
this._recipeWindow = window;
};
Window_SynthesisStatus.prototype.standardFontSize = function() {
return 24;
};
Window_SynthesisStatus.prototype.clearNumItems = function() {
this._numItems = {};
};
Window_SynthesisStatus.prototype.refresh = function() {
this.contents.clear();
this.changePaintOpacity(true);
this.resetFontSettings();
var x = this.textPadding();
var y = 0;
var l = this.lineHeight();
if (this._sprite) this._sprite.opacity = 255;
if (this._item) {
if (this._sprite) this._sprite.opacity = 64;
this.drawPossession(x, y);
y += l;
if (Imported['LimitPossession']) {
this.drawWeight(x, y);
y += l;
}
this.drawSynthesisHorzLine(y-4);
y += 8;
var recipe = DataManager.itemRecipe(this._recipeWindow.baseItem());
this.contents.fontSize = 20;
l -= 8;
if (!$gameTemp._callShopSynthesis) {
for (var i = 0, max = recipe.machinery.length; i < max; i++) {
var item = recipe.machinery[i];
if (item && item[0]) {
var num = item[1];
item = item[0];
if (i === 0) {
this.changeTextColor(this.systemColor());
this.drawText(needMachineryName, 4, y, this.contentsWidth() - 8);
y += l;
this.drawSynthesisHorzLine(y);
y += 4;
}
this.changePaintOpacity(this.isEnable([item, num]));
item = DataManager.decodeSynthesisItem(item);
this.drawSynthesisItemName(item, 1, 24, y, this.contentsWidth());
y += l;
}
}
if (recipe.machinery.length > 0) y += 8;
}
this.changePaintOpacity(true);
for (var i=0,max=recipe.recipe.length;i<max;i++) {
var item = recipe.recipe[i];
if (item) {
var num = item[1];
item = item[0];
if (i === 0) {
this.changeTextColor(this.systemColor());
this.drawText(needMaterialName, 4, y, this.contentsWidth() - 8);
y += l;
this.drawSynthesisHorzLine(y);
y += 4
}
if (DataManager.isSynthesisItem(item)) {
this.changePaintOpacity(this.isEnable([item, num]));
this.drawSynthesisItemName(DataManager.decodeSynthesisItem(item), 1, 24, y, this.contentsWidth() - 80);
} else {
this.changeTextColor(this.normalColor());
this.changePaintOpacity(this.isEnable([item, num]));
this.drawText('('+item+')', 24, y, this.contentsWidth() - 80);
}
this.drawItemNumber(item, num, 24, y, this.contentsWidth());
y += l;
}
}
}
};
Window_SynthesisStatus.prototype.drawPossession = function(x, y) {
var width = this.contents.width - this.textPadding() - x;
var possessionWidth = this.textWidth('0000');
var item = this._item;
var recipe = DataManager.itemRecipe(item);
if (recipe.dummy) item = DataManager.decodeSynthesisItem(recipe.dummy);
this.changeTextColor(this.systemColor());
this.drawText(TextManager.possession, x, y, width - possessionWidth);
this.resetTextColor();
this.drawText($gameParty.numItems(item), x, y, width, 'right');
};
Window_SynthesisStatus.prototype.drawItemNumber = function(item, num, x, y, width) {
var n = this.numItems(item);
this.drawText(n, x, y, width - 68,'right');
this.drawText('/', x, y, width - 52,'right');
this.drawText(num, x, y, width - 24,'right');
};
Window_SynthesisStatus.prototype.numItems = function(item) {
if (this._numItems && this._numItems[item]) return this._numItems[item];
if (!this._numItems) this.clearNumItems();
this._numItems[item] = 0;
if (DataManager.isSynthesisItem(item)) {
this._numItems[item] = $gameParty.numItems(DataManager.decodeSynthesisItem(item));
} else {
var n = $gameParty.allItems().reduce(function(r,it){
var categories = DataManager.itemSecondaryCategories(it);
if (categories.indexOf(item) >= 0 && DataManager.isMaterial(it)) {
r += $gameParty.numItems(it);
}
return r
}.bind(this),0);
this._numItems[item] = n;
}
return this._numItems[item];
};
Window_SynthesisStatus.prototype.isEnable = function(item) {
return this.numItems(item[0]) >= item[1];
};
////////////////////////////////////////////////////////////////////////////////////
function Window_MaterialList() {
this.initialize.apply(this, arguments);
}
Window_MaterialList.prototype = Object.create(Window_Selectable.prototype);
Window_MaterialList.prototype.constructor = Window_MaterialList;
Window_MaterialList.prototype.initialize = function(x, y, height) {
this._synthesisNum = 1;
Window_Selectable.prototype.initialize.call(this, x, y, this.windowWidth(), height);
};
Window_MaterialList.prototype.windowWidth = function() {
return 456;
};
Window_MaterialList.prototype.standardFontSize = function() {
return 24;
};
Window_MaterialList.prototype.maxPageRows = function() {
return Window_Selectable.prototype.maxPageRows.call(this) - 2;
};
Window_MaterialList.prototype.maxItems = function() {
if (this._recipe) {
return this._needs.length;
} else {
return 1;
}
};
Window_MaterialList.prototype.itemRect = function(index) {
var rect = Window_Selectable.prototype.itemRect.call(this, index);
rect.y += this.lineHeight() + 2;
return rect;
};
Window_MaterialList.prototype.isCurrentItemEnabled = function() {
return !DataManager.isSynthesisItem(this._needs[this.index()]);
};
Window_MaterialList.prototype.setEstimateWindow = function(window) {
this._estimateWindow = window;
};
Window_MaterialList.prototype.setMaterialWindow = function(window) {
this._materialWindow = window;
};
Window_MaterialList.prototype.setNumber = function(number) {
this._synthesisNum = number;
this.refresh();
};
Window_MaterialList.prototype.setRecipe = function(item) {
this._recipe = DataManager.itemRecipe(item);
this._needs = [];
this._sets = [];
var recipe = this._recipe.recipe;
for (var i=0,max=recipe.length;i<max;i++) {
var it = recipe[i];
for (var j=0;j<it[1];j++) this._needs.push(it[0]);
}
this._estimateWindow.setNeeds(this._needs);
this.autoSet();
this.refresh();
this._estimateWindow.setItem(item);
};
Window_MaterialList.prototype.autoSet = function() {
for (var i=0,max=this._needs.length;i<max;i++) {
var need = this._needs[i];
if (DataManager.isSynthesisItem(need)) {
this.setMaterial(i, DataManager.decodeSynthesisItem(need));
} else {
var items = $gameParty.allItems().filter(function(it){
return DataManager.itemSecondaryCategories(it).indexOf(need);
}.bind(this));
if (items.length === 1) this.setMaterial(i, items[0]);
}
}
this._estimateWindow.setMaterials(this._sets);
};
Window_MaterialList.prototype.setCurrentMaterial = function (item) {
this.setMaterial(this.index(), item);
this._estimateWindow.setMaterials(this._sets);
};
Window_MaterialList.prototype.setMaterial = function(index, item) {
this._sets[index] = item;
};
Window_MaterialList.prototype.refresh = function() {
Window_Selectable.prototype.refresh.call(this);
this.changePaintOpacity(true);
this.contents.fontSize = 20;
this.changeTextColor(this.systemColor());
this.drawText(materialListText, 4, 0, this.contentsWidth()-8);
this.drawSynthesisHorzLine(28);
this.resetFontSettings();
};
Window_MaterialList.prototype.drawItem = function(index) {
var rect = this.itemRect(index);
var item = this._sets[index];
if (item) {
this.changePaintOpacity(true);
this.drawSynthesisItemName(item, 1, 8, rect.y, rect.width - 16);
var num = $gameParty.numItems(item);
var l = this._sets.filter(function(s){ return s === item}).length;
this.drawText(Math.floor(num / l), 0, rect.y, rect.width - 8, 'right');
this.drawText('/', 0, rect.y, rect.width - 36, 'right');
this.drawText(this._synthesisNum, 0, rect.y, rect.width - 52,'right');
} else {
this.changePaintOpacity(false);
this.drawText('('+this._needs[index]+')',8, rect.y, rect.width - 16, 'center');
}
};
Window_MaterialList.prototype.item = function() {
if (this._sets[this.index()]) return this._sets[this.index()];
return null;
};
Window_MaterialList.prototype.updateHelp = function() {
this._helpWindow.clear();
if (this.item()) this._helpWindow.setItem(this.item());
if (this._materialWindow) this._materialWindow.setData(this._needs[this.index()], this._sets);
};
Window_MaterialList.prototype.isOkSynthesis = function() {
return this._sets.filter(function(s){ return s }).length === this._needs.length;
};
Window_MaterialList.prototype.smoothSelect = function() {
if (this._sets) {
for (var i=0,max=this._needs.length;i<max;i++) {
if (!this._sets[i]) {
this.select(i);
return;
}
}
}
this.select(0);
};
// rpg_core.js
Window_MaterialList.prototype._refreshArrows = function() {
Window_Selectable.prototype._refreshArrows.call(this);
this._downArrowSprite.y -= 48;
this._upArrowSprite.y += 40;
};
////////////////////////////////////////////////////////////////////////////////////
function Window_Estimate() {
this.initialize.apply(this, arguments);
}
Window_Estimate.prototype = Object.create(Window_Base.prototype);
Window_Estimate.prototype.constructor = Window_Estimate;
Window_Estimate.prototype.initialize = function(x, y, width) {
this._synthesisNum = 1;
Window_Base.prototype.initialize.call(this, x, y, width, this.windowHeight());
};
Window_Estimate.prototype.windowHeight = function() {
return 108;
};
Window_Estimate.prototype.standardFontSize = function() {
return 24;
};
Window_Estimate.prototype.clear = function() {
this._item = null;
this._num = null;
this._exItem = null;
this._recipe = null;
this._synthesisNum = 1;
};
Window_Estimate.prototype.setItem = function(item) {
this._item = item;
this._recipe = DataManager.itemRecipe(this._item);
this._num = this._recipe.num;
this.refresh();
};
Window_Estimate.prototype.setNeeds = function(needs) {
this._needs = needs;
};
Window_Estimate.prototype.setNumber = function(number) {
this._synthesisNum = number;
this.refresh();
};
Window_Estimate.prototype.refresh = function() {
this.contents.clear();
this.resetFontSettings();
if (this._item) {
this.changePaintOpacity(true);
this.contents.fontSize = 20;
this.changeTextColor(this.systemColor());
this.drawText(estimateText, 4, 0, this.contentsWidth());
this.drawSynthesisHorzLine(28);
this.resetFontSettings();
this.changePaintOpacity(this.isSynthesizable());
var item = this.item();
if (this._exItem && !$gameParty.isLearnedExRecipe(this._item, this._exItem)) {
var text = '';
var chr = '';
for (var i=0,max=this.item().name.length + 1;i<max;i++) text += chr;
this.drawText(text, 24, 40, this.contentsWidth() - 8);
} else {
this.drawSynthesisItemName(item, this.itemNumber(), 24, 40, this.contentsWidth() - 8);
}
}
};
Window_Estimate.prototype.isSynthesizable = function() {
if (this._sets && this._needs) {
var ms = this._sets.filter(function(m){ return m });
if (ms.length === this._needs.length) {
return true;
}
}
return false;
};
Window_Estimate.prototype.setMaterials = function(sets) {
this._sets = sets;
this.refresh();
};
Window_Estimate.prototype.item = function() {
if (this.isSynthesizable() && !$gameTemp._callShopSynthesis) this.checkItemChange();
if (this._exItem) return this._exItem;
if (this._recipe.dummy){
return DataManager.decodeSynthesisItem(this._recipe.dummy);
} else {
return this._item;
}
};
Window_Estimate.prototype.updateTone = function() {
var tone = this._exItem ? changeRecipeTone : $gameSystem.windowTone();
this.setTone(tone[0], tone[1], tone[2]);
};
Window_Estimate.prototype.itemNumber = function() {
return Number(this._num ? this._num : 1) * this._synthesisNum;
};
Window_Estimate.prototype.checkItemChange = function() {
var l = this._needs.length;
var r = $gameTemp.recipeArray();
var rn = r[l].filter(function(rr){
var item = DataManager.decodeSynthesisItem(rr);
var recipe = DataManager.itemRecipe(item);
var r1 = recipe.recipe.reduce(function(rs,a){
for(var i=0;i<a[1];i++) rs.push(a[0]);
return rs;
}.bind(this),[]);
return this.checkMachinery(recipe) && this.checkRecipe(r1);
}.bind(this));
rn = rn.map(function(a){ return DataManager.decodeSynthesisItem(a) });
rn.sort(function(a,b){
var r1 = DataManager.itemRecipe(a);
var r2 = DataManager.itemRecipe(b);
return r1.priority - r2.priority;
});
if (rn[rn.length-1] !== this._item){
this._exItem = rn[rn.length-1];
this._num = DataManager.itemRecipe(this._exItem).num;
} else {
this._exItem = null;
this._num = this._recipe.num;
}
};
Window_Estimate.prototype.checkMachinery = function(recipe) {
var m1 = this._recipe.machinery;
var m2 = recipe.machinery;
return String(m1.sort()) === String(m2.sort());
};
Window_Estimate.prototype.checkRecipe = function(ary) {
var sets = this._sets.clone();
for (var i=0,max=ary.length;i<max;i++) {
if (DataManager.isSynthesisItem(ary[i])) {
var index = sets.indexOf(DataManager.decodeSynthesisItem(ary[i]));
if (index < 0) {
return false;
} else {
sets[index] = null;
ary[i] = null;
}
} else {
for (var j=0,jmax=sets.length;j<jmax;j++) {
if (sets[j]){
var sc = DataManager.itemSecondaryCategories(sets[j]);
if (sc.indexOf(ary[i]) < 0) {
return false;
} else {
sets[j] = null;
ary[i] = null;
break;
}
}
}
}
}
return true;
};
////////////////////////////////////////////////////////////////////////////////////
function Window_Material() {
this.initialize.apply(this, arguments);
}
Window_Material.prototype = Object.create(Window_Selectable.prototype);
Window_Material.prototype.constructor = Window_Material;
Window_Material.prototype.initialize = function(x, y, width, height) {
Window_Selectable.prototype.initialize.call(this, x, y, width, height);
};
Window_Material.prototype.standardFontSize = function() {
return 24;
};
Window_Material.prototype.maxPageRows = function() {
return Window_Selectable.prototype.maxPageRows.call(this) - 1;
};
Window_Material.prototype.maxItems = function() {
return this._data ? this._data.length : 1;
};
Window_Material.prototype.item = function() {
return this._data[this.index()];
};
Window_Material.prototype.isEnabled = function(index) {
return this.itemNumber(this._data[index]) > 0;
};
Window_Material.prototype.isCurrentItemEnabled = function() {
return this.isEnabled(this.index());
};
Window_Material.prototype.setData = function(category, sets) {
this._category = category;
this._sets = sets;
this._price = 0;
this._number = 0;
this.refresh();
};
Window_Material.prototype.setPrice = function(price) {
this._price = price;
};
Window_Material.prototype.setNumber = function(number) {
this._number = number;
this.refresh();
};
Window_Material.prototype.makeItemList = function() {
this._data = [];
var items = $gameParty.allItems();
for (var i=0,max=items.length;i<max;i++) {
var item = items[i];
if (this.includes(item)) this._data.push(item);
}
};
Window_Material.prototype.includes = function(item) {
if (!this._category) return false;
if (!DataManager.isMaterial(item)) return false;
if (DataManager.isItem(item) && item.itypeId > 2) return false;
if (DataManager.itemSecondaryCategories(item).indexOf(this._category) >= 0) return true;
if (DataManager.isSynthesisItem(this._category)) {
return DataManager.decodeSynthesisItem(this._category) === item;
}
return false
};
Window_Material.prototype.itemRect = function(index) {
var rect = Window_Selectable.prototype.itemRect.call(this, index);
rect.y += this.lineHeight();
return rect;
};
Window_Material.prototype.refresh = function() {
this.contents.clear();
this.resetFontSettings();
if (this._category) {
this.makeItemList();
this.drawAllItems();
this.changePaintOpacity(true);
this.contents.fontSize = 20;
//this.changeTextColor(this.systemColor());
var name = this._category;
if (DataManager.isSynthesisItem(name)) name = DataManager.decodeSynthesisItem(name).name;
this.drawText(name, 4, 0, this.contentsWidth()-8);
this.drawSynthesisHorzLine(28);
} else {
if (this._price && this._number) {
this.changeTextColor(this.systemColor());
this.drawText(synthesisPriceText, 0, 0, this.contentsWidth());
this.changeTextColor(this.normalColor());
this.drawText(this._price * this._number, 0, 0, this.contentsWidth() - 36, 'right');
this.changeTextColor(this.systemColor());
this.drawText(TextManager.currencyUnit, 0, 0, this.contentsWidth(), 'right');
}
}
};
Window_Material.prototype.drawItem = function(index) {
var item = this._data[index];
var rect = this.itemRect(index);
rect.x += 8;
rect.width -= 48;
this.changePaintOpacity(this.isEnabled(index));
this.drawSynthesisItemName(item, 1,rect.x, rect.y, rect.width);
this.drawItemNumber(item, rect.x, rect.y, rect.width + 36, 'right');
};
Window_Material.prototype.drawItemNumber = function(item, x, y, width) {
var num = this.itemNumber(item);
this.drawText(':', x, y, width - this.textWidth('00'), 'right');
this.drawText(num, x, y, width, 'right');
};
Window_Material.prototype.itemNumber = function(item) {
var num = $gameParty.numItems(item);
if (this._sets) {
for (var i=0,max=this._sets.length;i<max;i++) {
if (this._sets[i] === item) num--;
}
}
return num;
};
Window_Material.prototype.updateHelp = function() {
this.setHelpWindowItem(this.item());
};
Window_Material.prototype.smoothSelect = function() {
for (var i=0,max=this._data.length;i<max;i++) {
if (this.isEnabled(i)) {
this.select(i);
return;
}
}
this.select(0);
};
////////////////////////////////////////////////////////////////////////////////////
function Window_SynthesisResult() {
this.initialize.apply(this, arguments);
}
Window_SynthesisResult.prototype = Object.create(Window_Selectable.prototype);
Window_SynthesisResult.prototype.constructor = Window_SynthesisResult;
Window_SynthesisResult.prototype.initialize = function() {
var w = this.windowWidth();
var h = this.windowHeight();
var x = Math.floor((Graphics.boxWidth / 2) - (w / 2));
var y = Math.floor((Graphics.boxHeight / 2) - (h / 2));
Window_Selectable.prototype.initialize.call(this, x, y, w, h);
};
Window_SynthesisResult.prototype.windowWidth = function() {
return 360;
};
Window_SynthesisResult.prototype.windowHeight = function() {
return 112;
};
Window_SynthesisResult.prototype.updateTone = function() {
var tone = this._changed ? changeRecipeTone : $gameSystem.windowTone();
this.setTone(tone[0], tone[1], tone[2]);
};
Window_SynthesisResult.prototype.setItemAndNumber = function(item, num, changed) {
this._item = item;
this._num = num;
this._changed = changed;
this.refresh();
};
Window_SynthesisResult.prototype.maxItems = function() {
return 0;
};
Window_SynthesisResult.prototype.refresh = function () {
this.contents.clear();
if (this._item) {
this.contents.fontSize = 20;
this.changeTextColor(this.systemColor());
this.drawText(synthesisResultText, 4, 0, this.contentsWidth());
this.drawSynthesisHorzLine(28);
this.contents.fontSize = 24;
this.changeTextColor(this.normalColor);
this.drawSynthesisItemName(this._item, this._num,24, 40, this.contentsWidth() - 8);
}
};
Window_SynthesisResult.prototype.onTouch = function(triggered) {
var x = this.canvasToLocalX(TouchInput.x);
var y = this.canvasToLocalY(TouchInput.y);
if (this.isContentsArea(x, y)) this.processOk();
};
////////////////////////////////////////////////////////////////////////////////////
function Window_Synthesis() {
this.initialize.apply(this, arguments);
}
Window_Synthesis.prototype = Object.create(Window_Selectable.prototype);
Window_Synthesis.prototype.constructor = Window_Synthesis;
Window_Synthesis.prototype.initialize = function(x, width) {
var height = this.windowHeight();
var y = Graphics.boxHeight - height;
Window_Selectable.prototype.initialize.call(this, x, y, width, height);
this.refresh();
this.opacity = 0;
};
Window_Synthesis.prototype.clear = function() {
this._num = 0;
this._maxSynthesis = 0;
this._maxBuy = 99;
};
Window_Synthesis.prototype.windowHeight = function() {
return 72;
};
Window_Synthesis.prototype.standardFontSize = function() {
return 24;
};
Window_Synthesis.prototype.setListWindow = function(window) {
this._listWindow = window;
this.clear();
};
Window_Synthesis.prototype.setEstimateWindow = function(window) {
this._estimateWindow = window;
};
Window_Synthesis.prototype.setMaterialWindow = function(window) {
this._materialWindow = window;
};
Window_Synthesis.prototype.setMaxBuy = function(maxBuy) {
this._maxBuy = maxBuy;
};
Window_Synthesis.prototype.itemRect = function(index) {
var rect = Window_Selectable.prototype.itemRect.call(this, index);
rect.y += 6;
return rect;
};
Window_Synthesis.prototype.refresh = function() {
this.contents.clear();
if (this._listWindow) {
this.changePaintOpacity(true);
var y = this.contentsHeight() - this.lineHeight();
this.drawSynthesisHorzLine(y);
this.changePaintOpacity(this._listWindow.isOkSynthesis() && this.isCurrentItemEnabled());
this._maxSynthesis = 0;
if (this.maxSynthesis() > 1) {
var text = numberSynthesisText;
text = text.replace(/_num/,this._num+1);
this.drawText(text, 8, y + 4, this.contentsWidth() - 16, 'center');
} else {
this.drawText(synthesisText, 8, y + 4, this.contentsWidth() - 16, 'center');
}
this.resetFontSettings();
}
};
Window_Synthesis.prototype.maxSynthesis = function() {
if (!this._maxSynthesis) {
var n = 0;
for (var i = 0, max = this._listWindow._sets.length; i < max; i++) {
var item = this._listWindow._sets[i];
var num = $gameParty.numItems(item);
var l = this._listWindow._sets.filter(function (s) { return s === item }).length;
var nn = Math.floor(num / l);
n = (n === 0 || n > nn) ? nn : n;
}
var item = this._estimateWindow.item();
this._maxSynthesis = Math.min(Math.min(n, this._maxBuy),$gameParty.maxItems(item));
if (this._maxSynthesis + $gameParty.numItems(item) > $gameParty.maxItems(item)) {
this._maxSynthesis = $gameParty.maxItems(item) - $gameParty.numItems(item);
}
}
return this._maxSynthesis;
};
Window_Synthesis.prototype.isCursorMovable = function() {
return this.isOpenAndActive();
};
Window_Synthesis.prototype.processCursorMove = function() {
if (this.isCursorMovable()) {
if (Input.isTriggered('down')) {
this.cursorDown(Input.isTriggered('down'));
}
if (Input.isTriggered('up')) {
this.cursorUp(Input.isTriggered('up'));
}
}
};
Window_Synthesis.prototype.cursorUp = function(wrap) {
if (this.maxSynthesis() > 1) {
var num = (this._num + 1) % this.maxSynthesis();
this.updateSynthesisNumber(num);
SoundManager.playCursor();
}
};
Window_Synthesis.prototype.cursorDown = function(wrap) {
if (this.maxSynthesis() > 1) {
var num = (this._num + (this.maxSynthesis() - 1)) % this.maxSynthesis();
this.updateSynthesisNumber(num);
SoundManager.playCursor();
}
};
Window_Synthesis.prototype.onTouch = function(triggered) {
var x = this.canvasToLocalX(TouchInput.x);
var y = this.canvasToLocalY(TouchInput.y);
var hitIndex = this.hitTest(x, y);
if (hitIndex >= 0) {
if (hitIndex === this.index()) {
if (triggered && this.isTouchOkEnabled()) {
this.processOk();
}
}
} else if (this._stayCount >= 15) {
if (y < this.padding) {
this.cursorUp();
} else if (y >= this.height - this.padding) {
this.cursorDown();
}
this._stayCount = 0;
}
};
Window_Synthesis.prototype.hitTest = function(x, y) {
if (this.isContentsArea(x, y)) return 0;
return -1;
};
Window_Synthesis.prototype.updateSynthesisNumber = function(number) {
this._num = number;
this._listWindow.setNumber(number + 1);
this._estimateWindow.setNumber(number + 1);
this._materialWindow.setNumber(number + 1);
this.refresh();
};
Window_Synthesis.prototype.processOk = function() {
if (this.isCurrentItemEnabled()) {
this.playSynthesisSound();
this.updateInputData();
this.deactivate();
this.callOkHandler();
} else {
this.playBuzzerSound();
}
};
Window_Synthesis.prototype.playSynthesisSound = function() {
var settings = synthesisSeSettings;
var se = {name:synthesisSeName, volume:settings[0], pitch:settings[1], pan:settings[2] };
AudioManager.playSe(se);
};
Window_Synthesis.prototype.isCurrentItemEnabled = function() {
if (this.maxSynthesis() < 1) return false;
return Window_Selectable.prototype.isCurrentItemEnabled.call(this);
};
////////////////////////////////////////////////////////////////////////////////////
function Scene_CategorySynthesis() {
this.initialize.apply(this, arguments);
}
Scene_CategorySynthesis.prototype = Object.create(Scene_MenuBase.prototype);
Scene_CategorySynthesis.prototype.constructor = Scene_CategorySynthesis;
Scene_CategorySynthesis.prototype.create = function() {
Scene_MenuBase.prototype.create.call(this);
this.createHelpWindow();
this.createGoldWindow();
this.createCategoryWindow();
this.createRecipeListWindow();
this.createStatusWindow();
this.createMaterialListWindow();
this.createEstimateWindow();
this.createMaterialWindow();
this.createSynthesisWindow();
this.createResultWindow();
this._categoryWindow.setRecipeWindow(this._recipeWindow);
this._recipeWindow.setStatusWindow(this._statusWindow);
this._listWindow.setEstimateWindow(this._estimateWindow);
this._listWindow.setMaterialWindow(this._materialWindow);
};
Scene_CategorySynthesis.prototype.setParameters = function(args) {
var categories = defaultSynthesisCategories;
var name = '';
var picture = '';
for (var i=0,max=args.length;i<max;i++) {
var m = args[i].split(':');
switch(m[0]) {
case 'カテゴリ':
case 'categories':
categories = m[1].split(',');
break;
case '名前':
case 'name':
name = m[1];
break;
case 'ピクチャ':
case 'picture':
picture = m[1];
break;
default:
categories = m.split(',');
}
}
this._categories = categories;
this._name = name;
this._picture = picture;
};
Scene_CategorySynthesis.prototype.prepare = function(args, goods) {
this.setParameters(args);
this.createRecipe(goods);
};
Scene_CategorySynthesis.prototype.createRecipe = function(goods) {
this._recipes = [];
if (goods) {
for (var i=0,max=goods.length;i<max;i++) {
var good = goods[i];
var item = null;
if (good[0] === 0){
item = 'I' + good[1];
} else if (good[0] === 1) {
item = 'W' + good[1];
} else if (good[0] === 2){
item = 'A' + good[1];
}
var price = good[2] ? good[3] : DataManager.decodeSynthesisItem(item).price;
this._recipes.push([item,price]);
}
} else {
var allItems = $gameParty.allItems();
var ary = [];
for (var i = 0, max = allItems.length; i < max; i++) {
var item = allItems[i];
if (DataManager.isRecipeBook(item)) {
var recipe = DataManager.publishedItemRecipes(item);
ary = ary.concat(recipe);
}
}
for (var i=0,max=ary.length;i<max;i++) this._recipes[i] = [ary[i]];
}
};
Scene_CategorySynthesis.prototype.createGoldWindow = function() {
this._goldWindow = new Window_Gold(0, this._helpWindow.height);
this._goldWindow.x = Graphics.boxWidth - this._goldWindow.width;
this.addWindow(this._goldWindow);
if (!$gameTemp._callShopSynthesis) this._goldWindow.hide();
};
Scene_CategorySynthesis.prototype.createCategoryWindow = function() {
var x = 0;
var y = this._helpWindow.y + this._helpWindow.height;
var w = Graphics.boxWidth - this._goldWindow.width;
if (!$gameTemp._callShopSynthesis) w = Graphics.boxWidth;
this._categoryWindow = new Window_SynthesisCategory(x, y, w);
this._categoryWindow.setHandler('ok', this.onCategoryOk.bind(this));
this._categoryWindow.setHandler('cancel', this.popScene.bind(this));
this._categoryWindow.setCategories(this._categories);
this._categoryWindow.activate();
this._categoryWindow.select(0);
this._categoryWindow.setHelpWindow(this._helpWindow);
this.addWindow(this._categoryWindow);
};
Scene_CategorySynthesis.prototype.createRecipeListWindow = function() {
var x = 0;
var y = this._categoryWindow.y + this._categoryWindow.height;
var h = Graphics.boxHeight - y;
this._recipeWindow = new Window_Recipe(x, y, h, this._recipes, this._name, this._price);
this._recipeWindow.setHandler('ok', this.onRecipeOk.bind(this));
this._recipeWindow.setHandler('cancel', this.onRecipeCancel.bind(this));
this._recipeWindow.setCategory(this._categoryWindow.category());
this._recipeWindow.deselect();
this._recipeWindow.setHelpWindow(this._helpWindow);
this._recipeWindow.setMoney(this.money());
this.addWindow(this._recipeWindow);
};
Scene_CategorySynthesis.prototype.createStatusWindow = function() {
var x = this._recipeWindow.x + this._recipeWindow.width;
var y = this._recipeWindow.y;
var w = Graphics.boxWidth - (this._recipeWindow.x + this._recipeWindow.width);
var h = this._recipeWindow.height;
this._statusWindow = new Window_SynthesisStatus(x,y,w,h,this._picture);
this._statusWindow.setRecipeWindow(this._recipeWindow);
this._windowLayer.addChildAt(this._statusWindow, 0);
};
Scene_CategorySynthesis.prototype.createMaterialListWindow = function() {
var x = 0;
var y = this._categoryWindow.y + this._categoryWindow.height;
var height = Graphics.boxHeight - y;
this._listWindow = new Window_MaterialList(x, y, height);
this._listWindow.setHandler('ok', this.onListOk.bind(this));
this._listWindow.setHandler('cancel', this.onListCancel.bind(this));
this._listWindow.setHelpWindow(this._helpWindow);
this.addWindow(this._listWindow);
this._listWindow.hide();
};
Scene_CategorySynthesis.prototype.createEstimateWindow = function() {
var x = this._listWindow.x + this._listWindow.width;
var y = this._listWindow.y;
var width = Graphics.boxWidth - (this._listWindow.x + this._listWindow.width);
this._estimateWindow = new Window_Estimate(x, y, width);
this.addWindow(this._estimateWindow);
this._estimateWindow.hide();
};
Scene_CategorySynthesis.prototype.createMaterialWindow = function() {
var x = this._estimateWindow.x;
var y = this._estimateWindow.y + this._estimateWindow.height;
var width = this._estimateWindow.width;
var height = Graphics.boxHeight - (this._estimateWindow.y + this._estimateWindow.height);
this._materialWindow = new Window_Material(x, y, width ,height);
this._materialWindow.setHandler('ok', this.onMaterialOk.bind(this));
this._materialWindow.setHandler('cancel', this.onMaterialCancel.bind(this));
this._materialWindow.setHelpWindow(this._helpWindow);
this.addWindow(this._materialWindow);
this._materialWindow.hide();
};
Scene_CategorySynthesis.prototype.createSynthesisWindow = function() {
var x = 0;
var width = this._listWindow.width;
this._synthesisWindow = new Window_Synthesis(x, width);
this._synthesisWindow.setHandler('ok', this.onSynthesisOk.bind(this));
this._synthesisWindow.setHandler('cancel', this.onSynthesisCancel.bind(this));
this._synthesisWindow.setListWindow(this._listWindow);
this._synthesisWindow.setEstimateWindow(this._estimateWindow);
this._synthesisWindow.setMaterialWindow(this._materialWindow);
this._synthesisWindow.setHelpWindow(this._helpWindow);
this.addChild(this._synthesisWindow);
this._synthesisWindow.hide();
};
Scene_CategorySynthesis.prototype.createResultWindow = function() {
this._resultWindow = new Window_SynthesisResult();
this._resultWindow.setHandler('ok', this.onResultOk.bind(this));
this._resultWindow.setHandler('cancel', this.onResultOk.bind(this));
this.addChild(this._resultWindow);
this._resultWindow.hide();
};
Scene_CategorySynthesis.prototype.popScene = function() {
Scene_MenuBase.prototype.popScene.call(this);
$gameTemp._callShopSynthesis = false;
$gameTemp._categoryShopSetting = null;
};
Scene_CategorySynthesis.prototype.money = function() {
return this._goldWindow.value();
};
Scene_CategorySynthesis.prototype.onCategoryOk = function() {
this._categoryWindow.deactivate();
this._recipeWindow.activate();
this._recipeWindow.select(0);
this._recipeWindow.setMoney(this.money());
};
Scene_CategorySynthesis.prototype.onRecipeOk = function() {
this._recipeWindow.deactivate();
this._recipeWindow.hide();
this._statusWindow.hide();
this._listWindow.setRecipe(this._recipeWindow.baseItem());
this._listWindow.show();
this._listWindow.activate();
this._estimateWindow.show();
this._materialWindow.show();
this._synthesisWindow.show();
this._synthesisWindow.refresh();
if (this._listWindow.isOkSynthesis()) {
this.activateSynthesis();
} else {
this._listWindow.smoothSelect();
}
};
Scene_CategorySynthesis.prototype.onRecipeCancel = function() {
this._recipeWindow.deactivate();
this._recipeWindow.deselect();
this._statusWindow._item = null;
this._statusWindow.refresh();
this._categoryWindow.activate();
this._helpWindow.clear();
};
Scene_CategorySynthesis.prototype.onListOk = function() {
this._listWindow.deactivate();
this._materialWindow.activate();
this._materialWindow.smoothSelect();
};
Scene_CategorySynthesis.prototype.onListCancel = function() {
this._listWindow.deactivate();
this._listWindow.deselect();
this._recipeWindow.activate();
this._recipeWindow.show();
this._statusWindow.show();
this._estimateWindow.hide();
this._materialWindow.hide();
this._listWindow.hide();
this._estimateWindow.clear();
this._synthesisWindow.hide();
};
Scene_CategorySynthesis.prototype.onMaterialOk = function() {
this._listWindow.setCurrentMaterial(this._materialWindow.item());
this._listWindow.refresh();
this._listWindow.activate();
this._listWindow.smoothSelect();
this._materialWindow.deselect();
this._materialWindow.deactivate();
if (this._listWindow.isOkSynthesis()) this.activateSynthesis();
};
Scene_CategorySynthesis.prototype.onMaterialCancel = function() {
this._materialWindow.deselect();
this._materialWindow.deactivate();
this._listWindow.activate();
};
Scene_CategorySynthesis.prototype.onSynthesisOk = function() {
var item = this._estimateWindow.item();
var num = this._estimateWindow.itemNumber();
var changed = !!this._estimateWindow._exItem;
this._resultWindow.setItemAndNumber(item, num, changed);
this.doSynthesis();
this._resultWindow.show();
this._resultWindow.activate();
this._synthesisWindow.deactivate();
this._synthesisWindow.deselect();
};
Scene_CategorySynthesis.prototype.onSynthesisCancel = function() {
this._listWindow.activate();
this._listWindow.select(0);
this._synthesisWindow.deactivate();
this._synthesisWindow.deselect();
this._synthesisWindow.updateSynthesisNumber(0);
};
Scene_CategorySynthesis.prototype.onResultOk = function() {
this._estimateWindow.clear();
this._listWindow.setNumber(1);
this._synthesisWindow.clear();
this._resultWindow.hide();
this._resultWindow.deactivate();
this._listWindow.hide();
this._estimateWindow.hide();
this._materialWindow.hide();
this._recipeWindow.show();
this._recipeWindow.refresh();
this._recipeWindow.activate();
this._statusWindow.show();
this._statusWindow.refresh();
this._synthesisWindow.hide();
};
Scene_CategorySynthesis.prototype.activateSynthesis = function() {
this._synthesisWindow.setMaxBuy(this.maxBuy());
this._synthesisWindow.refresh();
this._synthesisWindow.activate();
this._synthesisWindow.select(0);
this._listWindow.deactivate();
this._listWindow.deselect();
this._materialWindow._category = null;
this._materialWindow.setPrice(this._recipeWindow.currentPrice());
this._materialWindow.setNumber(1);
this._materialWindow.refresh();
//this._helpWindow.clear();
if (synthesisHelp && this._synthesisWindow.maxSynthesis() > 1){
this._synthesisWindow._helpWindow.setText(synthesisHelp);
}
};
Scene_CategorySynthesis.prototype.doSynthesis = function() {
var num = this._estimateWindow._synthesisNum;
for (var i=0,max=this._listWindow._sets.length;i<max;i++) {
var item = this._listWindow._sets[i];
$gameParty.loseItem(item, num);
}
$gameParty.gainItem(this._estimateWindow.item(), this._estimateWindow.itemNumber());
if (this._recipeWindow.currentPrice()) $gameParty.loseGold(this._recipeWindow.currentPrice() * num);
this._goldWindow.refresh();
this._recipeWindow.setMoney(this.money());
this._statusWindow._numItems = null;
if (this._estimateWindow._exItem) {
var item = this._recipeWindow.item();
$gameParty.setExRecipe(item, this._estimateWindow._exItem);
}
};
Scene_CategorySynthesis.prototype.maxBuy = function() {
var item = this._estimateWindow.item();
var max = $gameParty.maxItems(item) - $gameParty.numItems(item);
var price = this._recipeWindow.currentPrice();
if (price > 0) {
return Math.min(max, Math.floor(this.money() / price));
} else {
return max;
}
};
////////////////////////////////////////////////////////////////////////////////////
}());