pastime/js/plugins/TRP_ParticleMZ_Editor.js
2026-03-15 16:45:22 -05:00

5678 lines
No EOL
154 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

//=============================================================================
// TRP_ParticleMZ_Editor.js
//=============================================================================
/*:
* @target MZ
* @author Thirop
* @plugindesc パーティクルデータの編集[開発用]
* @base TRP_ParticleMZ
* @orderAfter TRP_ParticleMZ
*
* @help
* 【更新履歴】
* 1.32 2022/03/29 グループエディタでエスケープ文字(\)対応(\V[1]など変数使用可)
* 1.31 2022/01/22 Ctrl+Shift+Sで別名で一度だけ保存する機能の追加
* 1.24 2022/06/24 アニメーション画像の自動キャッシュクリア
* 1.23 2022/06/04 コアスクリプトv1.5.0のタイルサイズ変更対応
* 1.22 2022/05/26 アニメーション画像使用時の不具合修正
* 1.21 2022/05/02 目隠しボタンの位置を調整
* 1.18 2022/02/02 エディタからアツマールにアップロードできない不具合修正
* 1.15 2021/12/06 カラーピッカーの不具合修正
* 1.13 2021/11/03 不具合修正
* 1.09 2021/08/18 プリセットピッカーの操作性修正
* 1.06 2021/06/01 コマンド生成のデフォルト値変更
* 1.03 2021/04/14 表示の微修正
* 1.01 2021/04/12 内部処理の微細な変更
* 1.00 2021/04/10 初版。
*
*
* @param showGuide
* @text 項目ヘルプの表示
* @desc ON/trueにすると編集中の項目の説明が左下に表示されます。
* @type Boolean
* @default true
*
* @param paramFontSize
* @text 項目フォントサイズ
* @desc 画面右に表示される項目のフォントサイズ。見切れる場合には小さくしてください。(デフォ値18)
* @type number
* @default 18
*
* @param noColorCode
* @text 色コード非表示
* @desc colorパラメータのコード(#ffffffなど)の非表示設定。横幅が見切れる場合はON(非表示)推奨
* @type Boolean
* @default false
*
* @param buttonFontSize
* @text ボタンフォントサイズ
* @desc 画面右下に表示されるボタンのフォントサイズ。見切れる場合には小さくしてください。(デフォ値13)
* @type number
* @default 13
*
* @param buttonWidth
* @text ボタンの横幅
* @desc 画面右下に表示されるボタンの横幅。見切れる場合には小さくしてください。(デフォ値120)
* @type number
* @default 86
*
* @param saveAsArray
* @text 配列圧縮して保存
* @desc 配列圧縮して保存することでファイル容量を削減します。
* @type boolean
* @default false
*
* @param copyAsArray
* @text 配列圧縮してコピー
* @desc 配列圧縮してコピーすることでテキスト量を削減します。
* @type boolean
* @default true
*
* @param skipListCommand
* @text リストのコマンド削除
* @desc TRP_ParticleMZ_Listプラグインの簡易set/play呼び出しコマンドを削除
* @default false
* @type boolean
*
*/
//=============================================================================
//PRAGMA_END: editorHeader
//PRAGMA: englishHeader
//PRAGMA_END: englishHeader
// ParticleEditor
// ParticleParam
// ParticleParam.ValueParam
// ParticleParam.NodeParam
// ParticleParam.ColorNodeParam
// ColorPicker
// ImagePicker
function ParticleEditor(){
this.initialize.apply(this, arguments);
}
if (Utils.isNwjs() && Utils.isOptionValid('test')){
//PRAGMA: editorPathSetting
ParticleEditor.DATA_DIR_PATH = 'dataEx';
ParticleEditor.FILE_PATH = 'dataEx/TrpParticles.json';
ParticleEditor.HELP_PATH = 'js/plugins/TRP_ParticleMZ_List.js';
ParticleEditor.IMAGE_PATH = 'img/particles/';
ParticleEditor.ANIMATION_PATH = 'img/animations/';
//PRAGMA_END: editorPathSetting
//make animation dir
var fs = require('fs');
var path = require('path');
var base = path.dirname(process.mainModule.filename);
var filePath = path.join(base, ParticleEditor.ANIMATION_PATH);
if(!fs.existsSync(filePath)){
fs.mkdirSync(ParticleEditor.ANIMATION_PATH)
}
if(!fs.existsSync(ParticleEditor.DATA_DIR_PATH)){
fs.mkdirSync(ParticleEditor.DATA_DIR_PATH);
}
};
(function(){
"use strict";
if (!Utils.isNwjs() || !Utils.isOptionValid('test')){
return;
}
var fs = require('fs');
var path = require('path');
var base = path.dirname(process.mainModule.filename);
var filePath = path.join(base, ParticleEditor.FILE_PATH);
if(!fs.existsSync(filePath)){
var defData = JSON.stringify(JsonEx.makeDeepCopy(Game_Particle.DEFAULT_DATA));
var file = '{"test":'+defData+'}';
fs.writeFileSync(filePath,file);
}
})();
(function(){
"use strict";
if (!Utils.isNwjs() || !Utils.isOptionValid('test')){
return;
};
//PRAGMA: editorPluginNames
var pluginName = 'TRP_ParticleMZ_Editor';
var basePluginName = 'TRP_ParticleMZ';
var listPluginName = 'TRP_ParticleMZ_List';
//PRAGMA_END: editorPluginNames
var LC = TRP_Localize.localize.bind(TRP_Localize,'parEd');
var NLC = TRP_Localize.noLocalize;
var parameters = PluginManager.parameters(pluginName);
parameters.imageNames = null;
parameters.animationNames = null;
var showGuide = parameters.showGuide==='true';
var paramFontSize = Number(parameters.paramFontSize)||18;
var noColorCode = parameters.noColorCode==='true';
var saveAsArray = parameters.saveAsArray==='true';
var copyAsArray = parameters.copyAsArray==='true';
var noLineBreaks = parameters.noLineBreaks===saveAsArray;
var isMac = navigator.userAgent.match(/Macintosh|Mac/);
var displayCount = PluginManager.parameters(basePluginName).displayCount==='true';
ParticleEditor.DEFAULT_DATA = Game_Particle.DEFAULT_DATA;
(function(){
ParticleEditor.GUIDE_TEXTS = {
alpha:[LC('【アルファ/不透明度】',0),LC('値の範囲:0~1',1),null,LC('<中間値設定可能>',2),LC('左端が開始時(時間0)、右端が終了時(時間1)の値',3),LC('@時間(0~1) + Enterで中間値を設定可能',4),LC('delete(Macはfn+delete)で中間値の削除',5),LC('中間値編集中にshift+@時間(0~1)+Enterで時間変更',6),LC('例)@0.5 + Enterで中間地点での値を設定開始',7)],
scale:[LC('【スケール/拡大率】',8),LC('1で等倍',9),null,LC('<中間値設定可能>',10),LC('左端が開始時(時間0)、右端が終了時(時間1)の値',11),LC('@時間(0~1) + Enterで中間値を設定可能',12),LC('delete(Macはfn+delete)で中間値の削除',13),LC('中間値編集中にshift+@時間(0~1)+Enterで時間変更',14),LC('例)@0.5 + Enterで中間地点での値を設定開始',15)],
minimumScaleMultiplier:[LC('【最小スケール倍率】',16),LC('パーティクル生成時の最小スケール倍率',17),LC('例)0.1として開始時のスケールが0.5の場合は',18),LC('  0.5*0.1=0.05から0.5の間の',19),LC('  ランダムなスケールのパーティクルが発生。',20)],
speed:[LC('【スピード/速度】',21),LC('パーティクルの速度。開始値は0にしないこと。',22),null,LC('<中間値設定可能>',23),LC('左端が開始時(時間0)、右端が終了時(時間1)の値',24),LC('@時間(0~1) + Enterで中間値を設定可能',25),LC('delete(Macはfn+delete)で中間値の削除',26),LC('中間値編集中にshift+@時間(0~1)+Enterで時間変更',27),LC('例)@0.5 + Enterで中間地点での値を設定開始',28)],
minimumSpeedMultiplier:[LC('【最小スピード倍率】',29),LC('パーティクル生成時の最小スピード倍率',30),LC('例)0.1として開始時のスピードが0.5の場合は',31),LC('  0.5*0.1=0.05から0.5の間の',32),LC('  ランダムなスピードのパーティクルが発生。',33)],
color:[LC('【カラー/色】',34),LC('左上のカラーピッカーで設定可能',35),LC('バックスペース(Macはdelete)で白にリセット',36),null,LC('<中間値設定可能>',37),LC('左端が開始時(時間0)、右端が終了時(時間1)の値',38),LC('@時間(0~1) + Enterで中間値を設定可能',39),LC('delete(Macはfn+delete)で中間値の削除',40),LC('中間値編集中にshift+@時間(0~1)+Enterで時間変更',41),LC('例)@0.5 + Enterで中間地点での値を設定開始',42)],
colorMode:[LC('【カラーモード】',43),LC('0で時間によって色が変化。',44),LC('0以外で発生時の色の分布を変化(時間変化無し)',45)],
acceleration:[LC('【加速度】',46),LC('加速度が有効な場合は画像の向きは移動方向で固定',47)],
startRotation:[LC('【発生時の射出角度】',48),LC('パーティクルの飛び出す方向。(画像の向きも連動)',49),LC('0で右,90で下,180で左,270(-90)で上方向。',50)],
rotationSpeed:[LC('【画像回転速度】',51),LC('画像の回転速度の最小値と最大値。',52),LC('動きには影響なし。',53)],
imageOption:[LC('【画像表示設定】',54),LC('画像の向き/反転の設定。動きには影響なし。',55),LC('angle:0~360で画像のみ回転、-1でランダムな角度。',56),LC('mirror:0で調整なし,1で反転,2でランダム。',57)],
lifetime:[LC('【パーティクル寿命】',58),LC('個々のパーティクルの消えるまでの秒数',59)],
blendMode:[],
frequency:[LC('【フリクエンシー/発生間隔】',60),LC('パーティクルが発生する間隔',61),LC('0.01とすると0.01秒に1回発生し、1秒間に100回',62)],
spawnChance:[LC('【発生確率】',63),LC('各発生タイミングに、パーティクルが発生する確率。',64)],
particlesPerWave:[LC('【1回での発生個数】',65),LC('各発生タイミングに同時に発生する個数。',66),LC('同時に発生するパーティクルのlifetimeは固定',67)],
emitterLifetime:[LC('【エミッター寿命】',68),LC('-1で無限。0より大きくすると、指定時間で発生終了',69)],
maxParticles:[LC('【最大表示数の制限】',70),LC('このエミッターから発生する最大数の制限値',71)],
fluctuation:[LC('【フラクチュエーション/ゆらぎ】',72),LC('角度のゆらぎ設定。',73),LC('max:各フレームで角度の変化幅の最大値',74),LC('sensitivity:0~1で指定。小さいほどゆるやかに、大きいほど激しくゆらぐ。',75)],
pos:[LC('【ポイント(発生方法)】',76),LC('指定の点から発生。',77),LC('<※発生方法はいずれか1つのみ指定が有効>',78)],
rect:[LC('【レクト/四角(発生方法)】',79),LC('四角形の中からランダムに発生。',80),LC('左上の点をx,y、幅/高さをwidth,heightで指定',81),LC('<※発生方法はいずれか1つのみ指定が有効>',82)],
circle:[LC('【サークル/円(発生方法)】',83),LC('円の中からからランダムに発生',84),LC('中心点をx,y、半径をradiusで指定。',85),LC('<※発生方法はいずれか1つのみ指定が有効>',86)],
ring:[LC('【リング(発生方法)】',87),LC('ドーナツ状のリングからランダムに発生。',88),LC('中心点をx,y、外側の半径をradius',89),LC('内側の半径をminRで指定。',90),LC('<※発生方法はいずれか1つのみ指定が有効>',91)],
burst:[LC('【バースト(発生方法)】',92),LC('particlesPerWaveで規則的に発生させる',93),LC('ps:射出角度の差(particleSpacing)',94),LC('sa:開始角度。ps*sa=360とすると放射状に射出(startAngle)',95),LC('dt:射出時間の差(deltaTime)',96),LC('rt:0=開始角度(startRotation)無視',97),LC('└1=開始角度優先,2=開始角度を加算(rotationType)',98),LC('r:半径(radius)',99),LC('dr:半径の差。マイナスで1周ごとの差(deltaRadius)',100),LC('dx:xの差(deltaX)',101),LC('dy:yの差(deltaY)',102),LC('<※発生方法はいずれか1つのみ指定が有効>',103)],
sub:[LC('【サブエミッター設定】',104),LC('st:射出開始タイミング(0~1)',105),LC('et:射出終了タイミング(0~1。-1で無効)',106),LC('spd:慣性の影響度合い。0=影響なし、1=100%影響。',107),LC('iAngle:1=開始角度は慣性方向基準',108),LC('iScale:1=親パーティクルの拡大率乗数を継承',109)]
};
//blend mode guide text
var texts = ParticleEditor.GUIDE_TEXTS.blendMode;
ParticleEditor.BLEND_MODE_NAMES = Game_Particle.BLEND_MODE_NAMES;
texts.push(LC('【ブレンドモード/画像合成方法】',110));
var length = ParticleEditor.BLEND_MODE_NAMES.length;
var text = '';
for(var i = 0; i<length; i=(i+1)|0){
if(i%3 === 0){
if(i>0){
texts.push(text);
}
text = '';
}else{
text += ',';
}
text += i + ':' + ParticleEditor.BLEND_MODE_NAMES[i];
if(i===length-1){
texts.push(text);
}
}
})();
function supplement(defaultValue,optionArg){
if(optionArg === undefined){
return defaultValue;
}
return optionArg;
};
function supplementNum(defaultValue,optionArg){
return Number(supplement(defaultValue,optionArg));
};
var _supplementDefWords = ['default','def','d'];
function supplementDef(defaultValue, optionArg, otherWords) {
var value = supplement(defaultValue,optionArg);
var defTargetWords = otherWords || [];
if(defTargetWords){
defTargetWords = defTargetWords.concat(_supplementDefWords);
}else{
defTargetWords = _supplementDefWords;
}
var length = defTargetWords.length;
for(var i=0; i<length; i=(i+1)|0){
var target = defTargetWords[i];
if(value === target){
value = defaultValue;
break;
}
}
return value;
};
function supplementDefNum(defaultValue, optionArg, otherWords) {
var value = supplementDef(defaultValue,optionArg,otherWords);
return Number(value);
};
//=============================================================================
// Game_Particle
//=============================================================================
Game_Particle.prototype.particleEdit = function(eventId,id,target,name,z,x,y,image){
this._particleEdit(eventId,null,id,target,name,z,x,y,image);
};
Game_Particle.prototype._particleEditWithExData = function(exData,eventId,copyName,id,target,name,z,x,y,image){
this._particleEdit(eventId,copyName,id,target,name,z,x,y,image,exData);
};
Game_Particle.prototype._particleEdit = function(eventId,copyName,id,target,name,z,x,y,image,exData=null){
var mainId = '';
var subId = '';
if(id.contains(Game_Particle.SUB_EMITTER_DEV_SUFFIX)){
var args = id.split(Game_Particle.SUB_EMITTER_DEV_SUFFIX);
mainId = args[0];
subId = args[1];
name = supplementDef(subId,name)||subId;
}else{
mainId = id;
name = supplementDef(id,name)||id;
}
//ensure config data exists
if(copyName){
var copyData = $dataTrpParticles[copyName];
if(!copyData){
throw new Error('not found copy original data for name '+copyName);
}
$dataTrpParticles[name] = JsonEx.makeDeepCopy($dataTrpParticles[copyName]);
}else if(!$dataTrpParticles[name]){
if($dataTrpParticlePreset[name]){
$dataTrpParticles[name] = JsonEx.makeDeepCopy($dataTrpParticlePreset[name]);
}else{
$dataTrpParticles[name] = JsonEx.makeDeepCopy(ParticleEditor.DEFAULT_DATA);
}
}
//ensure emitter data exists
var data = this.dataWithId(mainId,true);
if(!data){
if(!subId){
this.particleSet(eventId,mainId,target,name,z,x,y,image);
}else{
throw new Error(LC('管理ID「%1」は再生されてません。',111).format(mainId));
}
}
id = this.idWithSuffix(id);
SceneManager._scene.startParticleEdit(this,id,exData);
return true;
};
//=============================================================================
// ParticleEmitter
//=============================================================================
var _ParticleEmitter_update = ParticleEmitter.prototype.update;
ParticleEmitter.prototype.update = function(){
if(this._destroyed)return false;
var changed = false;
if(this._data.editing){
ParticleEditor.EDITING_EMITTER = this;
changed = this.updateForEditing();
}
return _ParticleEmitter_update.call(this) || changed;
};
ParticleEmitter.prototype.updateForEditing = function(){
var changed = false;
if(this._data.forceChangeImage){
this._data.forceChangeImage = false;
this.changeImage(this._data.image);
}
if(this._data.editingSubData){
var subData = this._data.editingSubData;
if(subData.forceChangeImage){
subData.forceChangeImage = false;
this.changeImage(subData.image,this.subEmitter(subData.name));
}
if(subData.pChanged){
this.updateParams(subData,this.subEmitter(subData.name));
subData.pChanged = false;
changed = true;
}
}
return changed;
};
var _ParticleEmitter_updateEmitter = ParticleEmitter.prototype.updateEmitter;
ParticleEmitter.prototype.updateEmitter = function(){
_ParticleEmitter_updateEmitter.call(this);
if(this._restartCount<=0
&& this._data
&& this._data.editing
&& this._emitter
&& ((this._emitter._emitterLife===0||!this._emitter.emit)||this.isEmitByOriginalTrigger())
&& this._emitter.particleCount===0
&& this._targetType!==TARGET_TYPES.click
&& this._targetType!==TARGET_TYPES.drag)
{
this.restartForEditing();
}
};
var _ParticleEmitter_tryDestroy = ParticleEmitter.prototype.tryDestroy;
ParticleEmitter.EDIT_RESTART_COUNT = 10;
ParticleEmitter.prototype.tryDestroy = function(){
if(this._data.editing){
this.restartForEditing();
return;
}
_ParticleEmitter_tryDestroy.call(this);
};
ParticleEmitter.prototype.restartForEditing = function(){
this._emitter.emit = false;
this._restartCount = ParticleEmitter.EDIT_RESTART_COUNT;
this._stop = false;
this._data.stop = false;
};
var _ParticleEmitter_updateForWalk = ParticleEmitter.prototype.updateForWalk;
ParticleEmitter.prototype.updateForWalk = function(){
if(this._data.editing){
this._emitter.emit = true;
}else{
_ParticleEmitter_updateForWalk.call(this);
}
};
var _ParticleEmitter_updateForStartDash = ParticleEmitter.prototype.updateForStartDash;
ParticleEmitter.prototype.updateForStartDash = function(){
if(this._data.editing){
this._emitter.emit = true;
}else{
_ParticleEmitter_updateForStartDash.call(this);
}
};
//=============================================================================
// Scenes
//=============================================================================
var _Scene_Boot_start = Scene_Boot.prototype.start;
Scene_Boot.prototype.start = function() {
_Scene_Boot_start.call(this);
PresetPicker.CATEGORY_NAMES = [NLC('キャラ対象',158,'character'),NLC('スクリーン/天候/リージョン',159,'screen/weather/region'),NLC('マウス/タップ',160,'click/drag'),NLC('その他',161,'Others'),NLC('非表示(/h)',162,'hidden(/h)')];
};
Scene_Base.prototype.particleCountHandlerWithId = function(id,subId){
if(!this._particleSystem)return null;
var emitter = this._particleSystem._emitters[id];
if(!emitter)return null;
return emitter.particleCount.bind(emitter,subId);
};
Scene_Base.prototype.startParticleEdit = function(particle,id,exData){
if(this._particleEditor){
this.addChild(this._particleEditor);
return;
}
if(!this._particleSystem)return;
this._particleEditor = new ParticleEditor(particle,id,exData);
this.addChild(this._particleEditor);
};
var _Scene_Base_update = Scene_Base.prototype.update;
Scene_Base.prototype.update = function(){
if(!!this._particleEditor){
this.updateForParticleEdit();
}else{
_Scene_Base_update.call(this);
}
};
Scene_Base.prototype.updateForParticleEdit = function(){
$gameScreen._particle.update();
this._particleSystem.updateForEditor(this);
this._particleEditor.update();
if(this._particleEditor.isTerminated()){
this.removeChild(this._particleEditor);
this._particleEditor = null;
}
};
var _Scene_Map_update = Scene_Map.prototype.update;
Scene_Map.prototype.update = function() {
if(!!this._particleEditor){
Scene_Base.prototype.update.call(this);
this._spriteset._destinationSprite.update();
}else{
_Scene_Map_update.call(this);
}
};
var _Scene_Battle_update = Scene_Battle.prototype.update;
Scene_Battle.prototype.update = function() {
if(!!this._particleEditor){
Scene_Base.prototype.update.call(this);
}else{
_Scene_Battle_update.call(this);
}
};
//=============================================================================
// Manager
//=============================================================================
ImageManager.loadParticlePreset = function(filename, hue) {
return this.loadBitmap('img/particlePresets/', filename, hue, true);
};
//=============================================================================
// ParticleEditor
//=============================================================================
ParticleEditor.EDITING_EMITTER = null;
ParticleEditor.prototype = Object.create(PIXI.Container.prototype);
ParticleEditor.prototype.constructor = ParticleEditor;
ParticleEditor.prototype.initialize = function(particle,id,exData){
PIXI.Container.call(this);
this.initMembers();
this.width = Graphics.width;
this.height = Graphics.height;
Input.clear();
var data,subData,targetData;
var subConfig = null;
var mainId = id;
var subId = '';
if(id.contains(Game_Particle.SUB_EMITTER_DEV_SUFFIX)){
var args = id.split(Game_Particle.SUB_EMITTER_DEV_SUFFIX);
mainId = args[0];
subId = args[1];
data = particle._data[mainId];
targetData = subData = particle.particleData(0,subId,'this',args[1],data.z,data.x,data.y);
subConfig = exData||{
timing:0,
speedRate:0,
inheritAngle:0,
inheritScale:0,
};
}else{
targetData = data = particle._data[id];
subData = null;
}
var config = Game_Particle.configData(targetData);
config = JsonEx.makeDeepCopy(config);
if(targetData.image){
this.checkImageExists(targetData);
}else if(config.image){
this.checkImageExists(config);
}
data.editing = true;
if(subData){
subData.editing = true;
}
data.editingSubData = subData;
this._id = id;
this._mainId = mainId;
this._subId = subId;
this._particle = particle;
this._data = data;
this._subData = subData;
this._config = config;
this._subConfig = subConfig;
this._image = config.image;
this.trySearchImageNames();
this.createSelectorSprite();
this.createParts(targetData,config);
this.createColorPicker();
this.createMenuButtons();
this.createNumInfo();
if(showGuide){
this.createGuideSprite();
}
this.registerKeyListeners();
this.resetInputingWords();
this.refreshPartsHidden();
};
ParticleEditor.prototype.initMembers = function(){
this._id = '';
this._mainId = '';
this._subId = '';
this._particle = null;
this._terminated = false;
this._data = null;
this._subData = null;
this._config = null;
this._subConfig = null;
this._image = '';
this._lastEditingIndex = -1;
this._editingIndex = -1;
this._particleCount = 0;
this._particleCountInterval = 0;
this._commands = [];
this._menuCommands = [];
this._saveButton = null;
this._hiddenButton = null;
this._guideSprite = null;
this._guideCache = null;
this._countHandler = null;
this._keydownListener = null;
this._keyupListener = null;
this._keyCode = 0;
this._key = '';
this._parts = [];
this._particleCountSprite = null;
this._inputtingWords = null;
this._colorPicker = null;
this._imagePicker = null;
this._tilePicker = null;
this._animationPicker = null;
this._presetPicker = null;
this._loadPicker = null;
this._activePicker = null;
this._menuSprites = [];
};
ParticleEditor.prototype.terminate = function(){
this._terminated = true;
var emitter = ParticleEditor.EDITING_EMITTER;
ParticleEditor.EDITING_EMITTER = null;
if(this._data){
delete this._data.editing;
delete this._data.editingSubData;
if(emitter && emitter._emitter && emitter._emitter._emitterLife>=0){
this._data.clear = true;
}
}
if(this._subData){
delete this._subData.editing;
}
this._countHandler = null;
this._particle = null;
this._data = null;
this._subData = null;
this._config = null;
this.removeEventListeners();
emitter = null;
}
ParticleEditor.prototype.isTerminated = function(){
return this._terminated;
};
ParticleEditor.prototype.trySearchImageNames = function(){
if(parameters.imageNames)return;
var fs = require('fs');
var path = require('path');
var base = path.dirname(process.mainModule.filename);
var dirPath = path.join(base,ParticleEditor.IMAGE_PATH);
var imageNames = [];
var animImageNames = [];
var files = fs.readdirSync(dirPath)
var length = files.length;
for(var i = 0; i<length; i=(i+1)|0){
var file = files[i];
var fp = path.join(dirPath,file);
if(!fs.statSync(fp).isFile())continue;
if(!(/.*\.png$/.test(file)))continue;
if(file.indexOf('_ANIM_')!==0){
imageNames.push(file.replace('.png',''));
}else{
animImageNames.push(file.replace('.png',''));
}
}
imageNames.sort();
parameters.imageNames = imageNames;
parameters.splitAnimImageNames = animImageNames;
//animations
dirPath = path.join(base,ParticleEditor.ANIMATION_PATH);
var animationNames = [];
var files = fs.readdirSync(dirPath)
var length = files.length;
for(var i = 0; i<length; i=(i+1)|0){
var file = files[i];
var fp = path.join(dirPath,file);
if(!fs.statSync(fp).isFile())continue;
if(!(/.*\.png$/.test(file)))continue;
animationNames.push(file.replace('.png',''));
}
animationNames.sort();
parameters.animationNames = animationNames;
};
ParticleEditor.prototype.targetData = function(){
return this._subData || this._data;
};
/* key
===================================*/
ParticleEditor.prototype.registerKeyListeners = function(){
var listener = this._onKeyDown.bind(this);
this._keydownListener = listener;
document.addEventListener('keydown', listener);
listener = this._onKeyUp.bind(this);
this._keyupListener = listener;
document.addEventListener('keyup', listener);
listener = this.processCopy.bind(this);
this._copyListener = listener;
document.addEventListener('copy', listener);
listener = this.processPaste.bind(this);
this._pasteListener = listener;
document.addEventListener('paste', listener);
};
ParticleEditor.prototype.removeEventListeners = function(){
if(this._keydownListener){
document.removeEventListener('keydown',this._keydownListener);
this._keydownListener = null;
}
if(this._keyupListener){
document.removeEventListener('keyup',this._keyupListener);
this._keyupListener = null;
}
if(this._copyListener){
document.removeEventListener('copy',this._copyListener);
this._copyListener = null;
}
if(this._pasteListener){
document.removeEventListener('paste',this._pasteListener);
this._pasteListener = null;
}
};
ParticleEditor.prototype._onKeyDown = function(event){
if((event.ctrlKey||event.metaKey) && event.keyCode===KEY_CODE.g){
this.processHide();
return;
}
if(this._activePicker){
this._activePicker.onKeyDown(event.keyCode,event);
return;
}
var isEscapeKey = (event.code==='intlYen'||event.key==='\\');
if((event.ctrlKey||event.metaKey) && !isEscapeKey){
this._onControlKeyDown(event);
}else if((!event.ctrlKey && !event.altKey)||isEscapeKey){
this._keyCode = event.keyCode;
this._key = event.key;
}
};
ParticleEditor.prototype._onControlKeyDown = function(event){
if(event.keyCode===KEY_CODE.s){
//save
var name;
if(event.shiftKey){
name = this.tryProcessAliasSave();
if(!name){
SoundManager.playBuzzer();
return;
}
}
this.processSave(name);
}else if(event.keyCode===KEY_CODE.i){
if(parameters.imageNames&&parameters.imageNames.length>0){
this.processPickImage();
}
}else if(event.keyCode===KEY_CODE.p){
this.processPickPreset();
}else if(event.keyCode===KEY_CODE.a){
if(parameters.animationNames&&parameters.animationNames.length>0){
this.processPickAnimation();
}
}else if(event.keyCode===KEY_CODE.w){
this.processQuit();
}else if(event.keyCode===KEY_CODE.e){
this.processComplete();
}else if(event.keyCode===KEY_CODE.t){
this.processPickTile();
}else if(event.keyCode===KEY_CODE.l){
this.processPickLoad();
}
}
ParticleEditor.prototype.tryProcessAliasSave = function(){
var targetName = this.targetData().name;
if(targetName.contains('_auto')||targetName.contains('_sub')){
return null;
}
if($gameSystem && $gameSystem.isJapanese()){
name = window.prompt('別名で一度だけ保存:設定名を入力\n(元の設定名も保存されます)',targetName);
}else{
name = window.prompt('Save once under a different name: Enter a setting name\n(The original configuration name is also saved.)',targetName);
}
if(!name){
SoundManager.playCancel();
return;
}
name = name.trim();
return name;
};
ParticleEditor.prototype._onKeyUp = function(event){
// this._keyCode = 0;
};
/* word inputting
===================================*/
ParticleEditor.prototype.resetInputingWords = function(){
if(this._inputtingWords==='')return;
this._inputtingWords = '';
this.prepareInputtingCandidates();
};
ParticleEditor.prototype.prepareInputtingCandidates = function(){
this._inputtingCandidates = this._commands.concat();
this._inputtingCandidates.push('SCREEN');
};
ParticleEditor.prototype.pushInputtingCharacter = function(chara){
this._inputtingWords += chara;
var words = this._inputtingWords;
var candidates = this._inputtingCandidates;
var length = candidates.length;
var firstHit = null;
for(var i = 0; i<length; i=(i+1)|0){
var word = candidates[i];
if(word.indexOf(words)!==0){
candidates.splice(i,1);
i -= 1;
length -= 1;
}else{
firstHit = firstHit || word;
}
}
if(!firstHit){
this.prepareInputtingCandidates();
candidates = this._inputtingCandidates
var length = candidates.length;
while(words.length>0 && !firstHit){
for(var i=0; i<length; i=(i+1)|0){
if(candidates[i].indexOf(words)!==0)continue;
firstHit = candidates[i];
break;
}
if(!firstHit){
words = words.substr(1);
}
}
if(firstHit){
for(var i=length-1; i>=0; i=(i-1)|0){
if(candidates[i].indexOf(words)!==0)continue;
candidates.splice(i,1);
}
}
this._inputtingWords = words;
}
if(firstHit){
this.tryInputtingFirstHit(firstHit)
}
};
ParticleEditor.prototype.tryInputtingFirstHit = function(firstHit){
var perfectHit = this._inputtingWords===firstHit;
if(firstHit==='SCREEN'){
if(perfectHit){
var index = this._commands.indexOf('RECT');
this.targetData().params.rect = [-Graphics.width/2,-Graphics.height/2,Graphics.width,Graphics.height];
this._parts[index].refreshParts();
this.startEditing(index);
}
}else{
var index = this._commands.indexOf(firstHit);
this.startEditing(index);
}
};
/* update
===================================*/
ParticleEditor.prototype.update = function(){
if(this._terminated)return;
if(this.updateParticleCount){
this.updateParticleCount();
}
if(this._activePicker){
this._activePicker.update();
this._keyCode = 0;
this._key = '';
return;
}
var children = this.children;
var length = children.length;
var i=length-1;
for(;i>=0;i-=1){
var child = children[i];
if (child && child.update){
child.update();
}
}
/* input & return
===================================*/
if(TouchInput.isTriggered()||TouchInput.isPressed()){
this.processTouch();
}else if(Input._latestButton || this._keyCode){
this.processInput();
}
this._keyCode = 0;
this._key = '';
};
ParticleEditor.prototype.processTouch = function(){
var allParts = this._parts;
var length = allParts.length;
var x = TouchInput.x;
var y = TouchInput.y;
var margin = ParticleEditor.SELECTOR_MARGIN;
for(var i = 0; i<length; i=(i+1)|0){
var parts = allParts[i];
if(parts.processTouch(x,y,margin)){
TouchInput.clear();
this.startEditing(i);
return;
}else if(this._editingIndex===i){
if(parts.hasSaveData()){
this.saveEditingParams();
}
}
}
//menu
var sprites = this._menuSprites;
var length = sprites.length;
for(var i = 0; i<length; i=(i+1)|0){
var sprite = sprites[i];
if(!sprite.visible)continue;
if(sprite.x<=x && x<=sprite.x+sprite.width &&
sprite.y<=y && y<=sprite.y+sprite.height)
{
this.processMenuCommand(i);
TouchInput.clear();
return;
}
}
};
ParticleEditor.prototype.processInput = function(){
if(Input.isRepeated('down') && this._keyCode!==98){
var index = this._editingIndex;
do{
index = (index+1)%this._parts.length;
}while(this._parts[index].isSpawnParam());
this.startEditing(index);
this.resetInputingWords();
}else if(Input.isRepeated('up') && this._keyCode!==104){
var index = this._editingIndex;
do{
index -= 1;
if(index<0)index = this._parts.length-1;
}while(this._parts[index].isSpawnParam());
this.startEditing(index);
this.resetInputingWords();
}else if(this._keyCode>=KEY_CODE.alphabet && this._keyCode<=KEY_CODE.alphabetEnd){
this.pushInputtingCharacter(String.fromCharCode(this._keyCode));
}else{
var editing = this._editingIndex>=0 ? this.editingParts() : null;
if(editing){
if(!editing.processInput(this._keyCode,this._key)){
this.endEditing();
}else{
this.selectParts(this._editingIndex);
if(editing.hasSaveData()){
this.saveEditingParams();
}
}
}else if(Input.isTriggered('cancel')&&this._keyCode!==96){
if(this._saveButton.opacity<255){
this.processQuit();
}else{
SoundManager.playBuzzer();
}
}
if(this._keyCode!==0){
this.resetInputingWords();
}
}
};
ParticleEditor.prototype.saveEditingParams = function(){
var editing = this.editingParts();
if(!editing)return;
this.supplyEditingParams(editing);
var saveData = editing.handOverSaveData();
if(!saveData)return;
this.saveEditingData(saveData);
editing.didSaveParams();
};
ParticleEditor.prototype.supplyEditingParams = function(editing){};
ParticleEditor.prototype.saveEditingData = function(saveData){
var editing = this.editingParts();
if(!editing)return;
this._saveEditingData(editing._title,saveData);
};
ParticleEditor.prototype._saveEditingData = function(title,saveData){
saveData.unshift(title);
saveData.unshift(this._id);
this._applySaveData(saveData);
this._saveButton.opacity = 255;
};
ParticleEditor.prototype._applySaveData = function(saveData){
if(this._subData){
var id = saveData.shift();
var key = saveData.shift();
var data = this._subData;
this._particle.tryUpdateSpawnType(key,data);
data.params[key] = saveData;
data.pChanged = true;
}else{
this._particle.particleUpdate(saveData);
}
};
var _ParticleEmitter__updateParam = ParticleEmitter.prototype._updateParam;
ParticleEmitter.prototype._updateParam = function(key,args,rate,emitter=this._emitter){
if(key==='sub'){
emitter.timing = Number(args[0])||0;
emitter.endTiming = supplementDefNum(-1,args[1]);
emitter.speedRate = Number(args[2])||0;
emitter.inheritAngle = Number(args[3])||0;
emitter.inheritScale = Number(args[4])||0;
if(Game_Particle.GROUP_EDITOR){
Game_Particle.GROUP_EDITOR.changeSubEmitterConfig(emitter.timing,emitter.endTiming,emitter.speedRate,emitter.inheritAngle,emitter.inheritScale);
}
}else{
_ParticleEmitter__updateParam.apply(this,arguments);
}
};
ParticleEditor.prototype.startEditing = function(index){
if(index<0)return;
if(this._editingIndex === index)return;
SoundManager.playCursor();
var target = this._parts[index];
if(this._editingIndex>=0){
this._endEditing();
index = this._parts.indexOf(target);
if(index<0){
this._editingIndex = -1;
this.deselectParts();
return;
}
}
if(!target){
this.refreshPartsHidden();
return;
}
this._editingIndex = index;
target.startEditing();
var title = target.title();
this.showGuideWithTitle(title);
if(target.type() === 'color'){
target.setPicker(this._colorPicker);
}
if(target.isSpawnParam()){
var saveData = target.paramSaveData();
this.saveEditingData(saveData);
}
this.refreshPartsHidden();
this.selectParts(index);
};
ParticleEditor.prototype.spawnType = function(){
var spawnType = this._config.spawnType;
var params = this.targetData().params;
if(params.rect)spawnType = 'rect';
else if(params.circle)spawnType = 'circle';
else if(params.ring)spawnType = 'ring';
else if(params.burst)spawnType = 'burst';
else if(params.pos||params.point||params.spawnPos)spawnType = 'point';
if(spawnType==='position'||spawnType==='pos')spawnType = 'point';
return spawnType;
};
ParticleEditor.prototype.refreshPartsHidden = function(){
var spawnType = this.spawnType();
var allParts = this._parts;
var length = allParts.length;
for(var i = 0; i<length; i=(i+1)|0){
var parts = allParts[i];
if(parts.isSpawnParam() && parts._title!==spawnType){
parts.hide();
}else{
parts.show();
}
}
};
ParticleEditor.prototype.endEditing = function(){
SoundManager.playCancel();
this._lastEditingIndex = this._editingIndex;
this._endEditing();
this._editingIndex = -1;
this.deselectParts();
};
ParticleEditor.prototype._endEditing = function(){
var editing = this.editingParts();
if(editing){
editing.endEditing();
if(editing.hasSaveData()){
this.saveEditingParams();
}
}
}
ParticleEditor.prototype.editingParts = function(){
return this._parts[this._editingIndex];
};
/* selector
===================================*/
ParticleEditor.prototype.createSelectorSprite = function(){
var size = ParticleParam.LINE_HEIGHT;
var bitmap = new Bitmap(size,size);
bitmap.fillAll('rgb(255,255,255)');
var sprite = new Sprite(bitmap);
sprite.opacity = 150;
this._selectorSprite = sprite;
this.addChild(sprite);
sprite.visible = false;
};
ParticleEditor.SELECTOR_MARGIN = 20;
ParticleEditor.prototype.selectParts = function(index){
var parts = this._parts[index];
var sprite = this._selectorSprite;
var size = sprite.bitmap.height;
sprite.y = parts.y;
if(parts._align==='right'){
sprite.anchor.set(1,0);
sprite.x = Graphics.width;
}else{
sprite.anchor.set(0,0);
sprite.x = 0;
}
sprite.scale.x = (parts._width+ParticleEditor.SELECTOR_MARGIN)/size;
sprite.visible = true;
};
ParticleEditor.prototype.deselectParts = function(){
this._selectorSprite.visible = false;
};
/* parts
===================================*/
ParticleEditor.prototype.createParts = function(data,config){
var title,configNames,headers;
var y = 5;
title = 'alpha';
configNames = ['alpha'];
y += this.addNodeParts(y,data,config,configNames,title);
title = 'scale';
configNames = ['scale'];
y += this.addNodeParts(y,data,config,configNames,title);
title = 'minimumScaleMultiplier';
configNames = ['scale.minimumScaleMultiplier'];
headers = null;
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'speed';
configNames = ['speed'];
y += this.addNodeParts(y,data,config,configNames,title);
title = 'minimumSpeedMultiplier';
configNames = ['speed.minimumSpeedMultiplier'];
headers = null;
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'color';
configNames = ['color'];
y += this.addColorNodeParts(y,data,config,configNames,title);
title = 'colorMode';
configNames = ['colorMode'];
headers = null;
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'acceleration';
configNames = ['acceleration.x','acceleration.y'];
headers = ['x','y'];
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'startRotation';
configNames = ['startRotation.min','startRotation.max'];
headers = ['min','max'];
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'rotationSpeed';
configNames = ['rotationSpeed.min','rotationSpeed.max'];
headers = ['min','max'];
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'imageOption';
configNames = ['angle','mirrorType'];
headers = ['angle','mirror'];
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'lifetime';
configNames = ['lifetime.min','lifetime.max'];
headers = ['min','max'];
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'blendMode';
configNames = ['blendMode'];
headers = null;
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'frequency';
configNames = ['frequency'];
headers = null;
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'spawnChance';
configNames = ['spawnChance'];
headers = null;
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'particlesPerWave';
configNames = ['particlesPerWave'];
headers = null;
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'emitterLifetime';
configNames = ['emitterLifetime'];
headers = null;
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'maxParticles';
configNames = ['maxParticles'];
headers = null;
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'fluctuation';
configNames = ['fluctuation.max','fluctuation.sensitivity'];
headers = ['max','sensitivity'];
y += this.addValueParts(y,data,config,configNames,title,headers);
y += 10;
title = 'point';
configNames = ['pos.x','pos.y'];
headers = ['x','y'];
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'rect';
configNames = ['spawnRect.x','spawnRect.y','spawnRect.w','spawnRect.h'];
headers = ['x','y','w','h'];
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'circle';
configNames = ['spawnCircle.x','spawnCircle.y','spawnCircle.r'];
headers = ['x','y','r'];
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'ring';
configNames = ['spawnCircle.x','spawnCircle.y','spawnCircle.r','spawnCircle.minR'];
headers = ['x','y','r','minR'];
y += this.addValueParts(y,data,config,configNames,title,headers);
title = 'burst';
configNames = ['particleSpacing','angleStart','bdt','brt','br','bdr','bdx','bdy'];
headers = ['ps','as','dt','rt','r','dr','dx','dy'];
y += this.addValueParts(y,data,config,configNames,title,headers);
if(this._subData){
y += 10;
title = 'sub';
configNames = ['timing','endTiming','speedRate','inheritAngle',''];
headers = ['st','et','spd','iAngle','iScale'];
y += this.addValueParts(y,data,this._subConfig,configNames,title,headers);
}
};
ParticleEditor.POS_PARAMS = ['point','rect','circle','ring','burst'];
ParticleEditor.prototype.addValueParts = function(y,data,config,configNames,title,headers){
var parts = new ParticleParam.ValueParam(data,config,configNames,title,headers);
return this._addParts(y,parts,title);
};
ParticleEditor.prototype.addNodeParts = function(y,data,config,configNames,title){
var parts = new ParticleParam.NodeParam(data,config,configNames,title);
return this._addParts(y,parts,title);
};
ParticleEditor.prototype.addColorNodeParts = function(y,data,config,configNames,title){
var parts = new ParticleParam.ColorNodeParam(data,config,configNames,title);
return this._addParts(y,parts,title);
};
ParticleEditor.prototype._addParts = function(y,parts,title){
parts.refresh();
this.addChild(parts);
this._commands.push(title.toUpperCase());
this._parts.push(parts);
parts.y = y;
return parts._height;
};
/* picker
===================================*/
ParticleEditor.prototype.createColorPicker = function(){
var size = 144;
var picker = new ColorPicker(size);
this._colorPicker = picker;
this.addChild(picker);
picker.x = 10;
picker.y = 30;
picker.visible = false;
};
ParticleEditor.prototype.createMenuButtons = function(){
var sprite;
var commands = this._menuCommands;
var color = 'black';
var index = 0;
var xOffset = 54;
var categoryOffset = 10;
//complete
commands.push('processComplete');
sprite = this.menuButtonSprite(index++,xOffset,color,LC('保存&終了',113),'(ctrl+E)');
//save
commands.push('processSave');
sprite = this.menuButtonSprite(index++,xOffset,color,LC('保存',114),'(ctrl+S)');
this._saveButton = sprite;
xOffset += categoryOffset;
if(this.usePickingMenuButtons()){
//change image
if(parameters.imageNames){
commands.push('processPickImage');
sprite = this.menuButtonSprite(index++,xOffset,color,LC('画像選択',115),'(ctrl+I)');
}
//change tile
commands.push('processPickTile');
sprite = this.menuButtonSprite(index++,xOffset,color,LC('タイル選択',116),'(ctrl+T)');
//change animation
if(parameters.animationNames){
commands.push('processPickAnimation');
sprite = this.menuButtonSprite(index++,xOffset,color,LC('アニメーション選択',117),'(ctrl+A)');
}
}
xOffset += categoryOffset;
//preset
commands.push('processPickPreset');
sprite = this.menuButtonSprite(index++,xOffset,color,LC('プリセット',118),'(ctrl+P)');
//load
commands.push('processPickLoad');
sprite = this.menuButtonSprite(index++,xOffset,color,LC('読みこみ',119),'(ctrl+L)');
xOffset += categoryOffset;
//quit
commands.push('processQuit');
sprite = this.menuButtonSprite(index++,xOffset,'rgb(100,100,100)',LC('終了',120),'(ctrl+W)');
//hidden
commands.push('processHide');
sprite = this.hideButtonSprite();
this._hiddenButton = sprite;
};
ParticleEditor.prototype.usePickingMenuButtons = function(){
return true;
};
ParticleEditor.BUTTON_FONT_SIZE = Number(parameters.buttonFontSize||16);
ParticleEditor.BUTTON_WIDTH = Number(parameters.buttonWidth||144)
ParticleEditor.BUTTON_MIN_HEIGHT = 24;
ParticleEditor.prototype.menuButtonSprite = function(index,xOffset,color,name,keyInfo){
var fontSize = ParticleEditor.BUTTON_FONT_SIZE;
var keyFontSize = fontSize - 2;
var marginTB = 2;
var calcHeight = fontSize+keyFontSize + 2*marginTB;
var height = Math.max(ParticleEditor.BUTTON_MIN_HEIGHT,calcHeight);
var width = ParticleEditor.BUTTON_WIDTH;
var margin = 4;
var bitmap = new Bitmap(width,height);
var sprite = new Sprite(bitmap);
this._menuSprites.push(sprite);
this.addChild(sprite);
bitmap.fillAll('rgba(255,255,255,0.8)');
var y = marginTB;
bitmap.fontSize = fontSize;
bitmap.textColor = color;
bitmap.outlineWidth = 0;
bitmap.drawText(name,0,y,width,fontSize,'center');
y += fontSize
bitmap.fontSize = keyFontSize;
bitmap.drawText(keyInfo,0,y,width,keyFontSize,'center');
sprite.x = Graphics.width-margin-index*(width+margin)-width - xOffset;
sprite.y = Graphics.height-margin-height;
return sprite;
};
ParticleEditor.prototype.hideButtonSprite = function(){
var w = 42;
var h = 30;
var margin = 4;
var bitmap = new Bitmap(w,h);
var sprite = new Sprite(bitmap);
this._menuSprites.push(sprite);
this.addChild(sprite);
sprite.x = Graphics.width-w-5;
var button = this._menuSprites[0];
sprite.y = Graphics.height-h-margin;
var ctx = bitmap._context;
var textH = 12;
//rounded rect
var r = 5;
ctx.save();
ctx.fillStyle = 'rgba(255,255,255,0.8)';
ctx.beginPath();
ctx.moveTo(0+r,0);
ctx.lineTo(w-r,0);
ctx.arc(w-r,r,r,-90*Math.PI/180,0,false);
ctx.lineTo(w,h-r);
ctx.arc(w-r,h-r,r,0,90*Math.PI/180,false);
ctx.lineTo(r,h);
ctx.arc(r,h-r,r,90*Math.PI/180,180*Math.PI/180,false);
ctx.lineTo(0,r);
ctx.arc(r,r,r,180*Math.PI/180,270*Math.PI/180,false);
ctx.fill();
ctx.restore();
//icon
var cx = w/2;
var cy = Math.floor((h-textH)/2)+2;
var ir = ((h-textH)-10)/2;
var irx = 15;
var ia = 50;
ctx.save();
ctx.fillStyle = ctx.strokeStyle = 'rgb(160,160,160)';
ctx.lineWidth = 2;
ctx.beginPath();
ctx.arc(cx,cy,ir,0,Math.PI*2,false);
ctx.fill();
ctx.beginPath();
ctx.arc(cx,cy+(irx-ir-2),irx,(-90-ia)*Math.PI/180,(-90+ia)*Math.PI/180);
ctx.arc(cx,cy-(irx-ir-2),irx,(90-ia)*Math.PI/180,(90+ia)*Math.PI/180);
ctx.closePath();
ctx.stroke();
ctx.restore();
//text
var y = h-textH;
bitmap.fontSize = textH-2;
bitmap.textColor = 'black';
bitmap.outlineWidth = 0;
bitmap.drawText('ctrl+G',0,y,w,textH,'center');
};
ParticleEditor.prototype.processMenuCommand = function(i){
this[this._menuCommands[i]]();
};
ParticleEditor.prototype.processSave = function(name){
if(this._saveButton.opacity<255)return;
this.executeSave(name);
SoundManager.playSave();
if(!name){
this._saveButton.opacity = 100;
}
};
ParticleEditor.prototype.processQuit = function(){
this.executeQuit();
};
ParticleEditor.prototype.executeQuit = function(){
this.terminate();
SoundManager.playCancel();
};
ParticleEditor.prototype.processComplete = function(){
this.processSave();
this.executeQuit();
};
ParticleEditor.prototype.processPickImage = function(){
if(!this._imagePicker){
this.createImagePicker();
if(!this._imagePicker)return;
}
var image = this.targetData().image || this._config.image;
this._imagePicker.startPicking(this,image);
this.startPicking(this._imagePicker);
};
ParticleEditor.prototype.processPickTile = function(){
if(!(SceneManager._scene instanceof Scene_Map)){
SoundManager.playBuzzer();
return;
}
if(!this._tilePicker){
this.createTilePicker();
}
var image = this.targetData().image || this._config.image;
this._tilePicker.startPicking(this,image);
this.startPicking(this._tilePicker);
};
ParticleEditor.prototype.processPickAnimation = function(){
if(!this._animationPicker){
this.createAnimationPicker();
}
var image = this.targetData().image || this._config.image;
this._animationPicker.startPicking(this,image);
this.startPicking(this._animationPicker);
};
ParticleEditor.prototype.processPickPreset = function(){
if(!this._presetPicker){
this.createPresetPicker();
if(!this._presetPicker)return;
}
var targetType = this.targetData().targetType;
var currentData = this.editingDataObject();
this._presetPicker.startPicking(this,targetType,currentData);
this.startPicking(this._presetPicker);
};
ParticleEditor.prototype.processPickLoad = function(){
if(!this._loadPicker){
this.createLoadPicker();
if(!this._loadPicker)return;
}
var targetType = this.targetData().targetType;
var currentData = this.editingDataObject();
this._loadPicker.startPicking(this,targetType,currentData);
this.startPicking(this._loadPicker);
};
ParticleEditor.prototype.startPicking = function(picker){
this.endEditing();
this._activePicker = picker;
this.addChild(picker);
this.hideMenu();
this.hideParts();
var dx = picker.x+ picker._width;
this.slideNumSpritesX(dx);
if(this._guideSprite){
this._guideSprite.visible = false;
}
};
ParticleEditor.prototype.didEndPicking = function(){
var dx = -this._activePicker.x -this._activePicker._width;
this.slideNumSpritesX(dx);
this._activePicker.parent.removeChild(this._activePicker);
this._activePicker = null;
this.showParts();
this.showMenu();
if(this._lastEditingIndex>=0){
this.startEditing(this._lastEditingIndex);
}
if(this._guideSprite){
this._guideSprite.visible = true;
}
};
ParticleEditor.prototype.slideNumSpritesX = function(dx){
var system = SceneManager._scene._particleSystem;
for(var i=0; i<3; i=(i+1)|0){
var sprite;
if(i===0)sprite = this._particleCountSprite;
else if(i===1)sprite = system ? system._countSprite : null;
else sprite = system ? system._limitedSprite : null;
if(sprite){
sprite.x += dx;
}
}
};
ParticleEditor.prototype.hideParts = function(){
var parts = this._parts;
var length = parts.length;
for(var i = 0; i<length; i=(i+1)|0){
var sprite = parts[i];
sprite.alpha = 0.3;
}
};
ParticleEditor.prototype.showParts = function(){
var parts = this._parts;
var length = parts.length;
for(var i = 0; i<length; i=(i+1)|0){
var sprite = parts[i];
sprite.alpha = 1;
}
};
ParticleEditor.prototype._addPicker = function(picker){
this.addChild(picker);
picker.x = 10;
picker.y = 0;
}
ParticleEditor.prototype.createImagePicker = function(){
if(!parameters.imageNames||parameters.imageNames.length===0)return;
var picker = new ImagePicker(parameters.imageNames);
this._imagePicker = picker;
this._addPicker(picker);
};
ParticleEditor.prototype.createTilePicker = function(){
var picker = new TilePicker();
this._tilePicker = picker;
this._addPicker(picker);
};
ParticleEditor.prototype.createAnimationPicker = function(){
var picker = new AnimationPicker(parameters.animationNames);
this._animationPicker = picker;
this._addPicker(picker);
};
ParticleEditor.prototype.createPresetPicker = function(){
var picker = new PresetPicker();
this._presetPicker = picker;
this._addPicker(picker);
};
ParticleEditor.prototype.createLoadPicker = function(){
var picker = new LoadPicker();
this._loadPicker = picker;
this._addPicker(picker);
};
ParticleEditor.prototype.didPickImage = function(image){
this.forceChangeImage(image);
};
ParticleEditor.prototype.changeImage = function(image){
this._image = image || this._image;
this.targetData().image = this._image;
this.checkImageExists(this.targetData());
};
ParticleEditor.prototype.forceChangeImage = function(image){
this.changeImage(image);
this.targetData().forceChangeImage = true;
};
ParticleEditor.prototype.checkImageExists = function(data){
var images = data.image.split(',');
var length = images.length;
var fs = require('fs');
var path = require('path');
var base = path.dirname(process.mainModule.filename);
var dirPath = path.join(base, ParticleEditor.IMAGE_PATH);
var animPath = path.join(base,ParticleEditor.ANIMATION_PATH);
var splitAnimImages = PluginManager.parameters(listPluginName).animImages||[];
var ext = '.png';
for(var i=length-1; i>=0; i=(i-1)|0){
var image = images[i];
if(image.indexOf('tile:')===0)continue
var filePath;
if(image.indexOf('ANIM:')===0){
if(splitAnimImages.contains(image)){
filePath = path.join(dirPath, '_'+image.replace(/:/gi,'_')+ext);
}else{
filePath = path.join(animPath, image.split(':')[1]+ext);
}
}else{
filePath = path.join(dirPath, image+ext)
}
if(!fs.existsSync(filePath)){
images.splice(i,1);
}
}
if(length !== images.length){
var length = images.length;
var image = '';
for(var i = 0; i<length; i=(i+1)|0){
if(i>0){
image += ',';
}
image += images[i];
}
if(image.length===0){
image = Game_Particle.defaultImage();
}
data.image = image;
}
};
/* applyData
===================================*/
ParticleEditor.prototype.applyData = function(applyData,originalName){
Game_Particle.migrateConfig(applyData);
var allParts = this._parts;
var length = allParts.length;
if(this._subData){
length -=1 ;
}
var data = this.targetData();
data.params = {};
for(var i = 0; i<length; i=(i+1)|0){
var parts = allParts[i];
parts.refreshWithConfigData(applyData);
}
var spawnType = applyData.spawnType;
var spawnTitles = [spawnType];
if(spawnType==='point')spawnTitles.push('pos');
if(spawnType==='pos')spawnTitles.push('point');
for(var i = 0; i<length; i=(i+1)|0){
var parts = allParts[i];
if(parts.isSpawnParam()){
if(!spawnTitles.contains(parts._title)){
continue;
}
}
parts.applyAll();
var saveData = parts.handOverSaveData();
if(saveData){
this._saveEditingData(parts._title,saveData);
}
}
if(!applyData.image){
applyData.image = Game_Particle.defaultImage();
}
// this.changeImage(applyData.image);
this.forceChangeImage(applyData.image);
this.refreshPartsHidden();
this.cleanupCurrentParticles();
};
ParticleEditor.prototype.cleanupCurrentParticles = function(){
var emitter = ParticleEditor.EDITING_EMITTER;
if(!emitter)return;
emitter.cleanup();
};
/* numInfo
===================================*/
ParticleEditor.PARTICLE_NUM_HEADER_WIDTH = 128;
ParticleEditor.PARTICLE_NUM_HEIGHT = 20;
ParticleEditor.prototype.createNumInfo = function(){
var width = 192;
var height = ParticleEditor.PARTICLE_NUM_HEIGHT;
var fontSize = 16;
var margin = 6;
var bitmap = new Bitmap(width,height);
// bitmap.fillAll('rgba(0,0,0,0.3)')
var sprite = new Sprite(bitmap);
this._particleCountSprite = sprite;
this.addChild(sprite);
sprite.x = margin;
sprite.y = margin;
if(displayCount){
sprite.y += 26;
}
bitmap.fontSize = fontSize;
bitmap.outlineColor ='black';
bitmap.outlineWidth = 4;
bitmap.textColor = 'rgb(255,255,150)';
var dw = ParticleEditor.PARTICLE_NUM_HEADER_WIDTH;
bitmap.drawText(LC('パーティクル数:',121),0,0,dw,height);
};
ParticleEditor.PARTICLE_COUNT_INTERVAL = 10;
ParticleEditor.prototype.updateParticleCount = function(){
var handler = this._countHandler;
if(!handler){
handler = SceneManager._scene.particleCountHandlerWithId(this._mainId,this._subId);
if(handler){
this._countHandler = handler;
}else{
return;
}
}
this._particleCountInterval -= 1;
if(this._particleCountInterval>0){
return;
}
this._particleCountInterval = ParticleEditor.PARTICLE_COUNT_INTERVAL;
var num = handler();
if(this._particleCount === num)return;
this._particleCount = num;
var bitmap = this._particleCountSprite.bitmap;
var x = ParticleEditor.PARTICLE_NUM_HEADER_WIDTH;
var width = bitmap.width-x;
var height = bitmap.height;
bitmap.clearRect(x-2,0,width+2,height);
bitmap.drawText(num,x,0,width,height);
};
/* guideSprite
===================================*/
ParticleEditor.GUIDE_TEXT_MARGIN = 5;
ParticleEditor.GUIDE_TEXT_FONT_SIZE = 14;
ParticleEditor.GUIDE_TEXT_LINE_HEIGHT = 18;
ParticleEditor.GUIDE_TEXT_MAX_ROW = 12;
ParticleEditor.prototype.createGuideSprite = function(){
var maxRow = ParticleEditor.GUIDE_TEXT_MAX_ROW;
var fontSize = ParticleEditor.GUIDE_TEXT_FONT_SIZE;
var lineHeight = ParticleEditor.GUIDE_TEXT_LINE_HEIGHT;
var width = $gameSystem.isJapanese() ? 300 : 500;
var height = lineHeight*maxRow+2*ParticleEditor.GUIDE_TEXT_MARGIN;
var bitmap = new Bitmap(width,height)
var sprite = new Sprite(bitmap);
this.addChild(sprite);
this._guideSprite = sprite;
sprite.anchor.set(0,1);
sprite.visible = false;
sprite.x = 5;
sprite.y = Graphics.height - ParticleEditor.GUIDE_TEXT_LINE_HEIGHT - 20;
bitmap.fontSize = fontSize;
bitmap.outlineColor = 'black';
bitmap.outlineWidth = 4;
};
ParticleEditor.prototype.guideTexts = function(title){
return ParticleEditor.GUIDE_TEXTS[title];
};
ParticleEditor.prototype.showGuideWithTitle = function(title){
if(!showGuide)return;
var sprite = this._guideSprite;
var texts = this.guideTexts(title);
if(!texts || texts.length===0){
sprite.visible = false;
return;
}
sprite.visible = true;
if(this._guideCache===title)return;
this._guideCache = title;
var bitmap = sprite.bitmap;
bitmap.clear();
bitmap.fillAll('rgba(0,0,0,0.3)')
var margin = ParticleEditor.GUIDE_TEXT_MARGIN;
var width = bitmap.width;
var height = ParticleEditor.GUIDE_TEXT_LINE_HEIGHT;
var length = Math.min(ParticleEditor.GUIDE_TEXT_MAX_ROW,texts.length);
var y = ParticleEditor.GUIDE_TEXT_MARGIN;
for(var i = 0; i<length; i=(i+1)|0){
var text = texts[i];
if(text){
if(i===0){
bitmap.textColor = 'rgb(255,200,150)';
}else if(i===1){
bitmap.textColor = 'white';
}
bitmap.drawText(text,margin,y,width-2*margin,height)
}else{
bitmap.textColor = 'rgb(220,220,255)';
}
y += height;
}
y += margin;
sprite.setFrame(0,0,width,y);
};
/* save
===================================*/
ParticleEditor.prototype.executeSave = function(name=this.targetData().name){
var data = this.editingDataObject();
if(saveAsArray){
data = Game_Particle.compressConfigDataToArray(data);
}
var date = new Date();
var year = (date.getFullYear()%100).padZero(2);
var month = (date.getMonth()+1).padZero(2);
var day = date.getDate().padZero(2);
data.comment = year+month+day;
//register to config
$dataTrpParticles[name] = data;
var file;
if(noLineBreaks){
file = JSON.stringify($dataTrpParticles);
}else{
file = JSON.stringify($dataTrpParticles,null,4);
}
this.writeSaveData(file);
//save help
this.writeHelpFile();
};
ParticleEditor.prototype.editingDataObject = function(){
var allParts = this._parts;
var length = allParts.length;
var data = JsonEx.makeDeepCopy(ParticleEditor.DEFAULT_DATA);
for(var i = 0; i<length; i=(i+1)|0){
var parts = allParts[i];
if(parts._title==='point' || !parts._hidden){
parts.pushSaveDataParams(data);
}
}
if(!isNaN(data.blendMode)){
data.blendMode = ParticleEditor.BLEND_MODE_NAMES[data.blendMode];
if(data.blendMode === undefined){
data.blendMode = 0;
}
}
this.adjustSpawnParamData(data,this.spawnType());
var spawnParams = ParticleEditor.POS_PARAMS;
var length = spawnParams.length;
for(var i = 0; i<length; i=(i+1)|0){
var spawnParam = spawnParams[i];
if(spawnParam==='point'){
continue;
}
if(data.spawnType !== spawnParam){
delete data[spawnParam];
}
}
data.noRotation = false;
data.addAtBack = false;
data.image = this._image;
//add meta data
data.targetType = this.targetData().targetType;
return data;
};
ParticleEditor.prototype.writeSaveData = function(file,filePath = this.saveFilePath()){
var fs = require('fs');
var path = require('path');
var base = path.dirname(process.mainModule.filename);
filePath = path.join(base, filePath);
fs.writeFileSync(filePath, file);
};
ParticleEditor.prototype.saveFilePath = function(){
return ParticleEditor.FILE_PATH
};
ParticleEditor.prototype.adjustSpawnParamData = function(data,spawnType){
data.spawnType = spawnType;
if(!data.pos){
data.pos = {x:0,y:0};
}
var spawnParams = ParticleEditor.POS_PARAMS;
var length = spawnParams.length;
for(var i = 0; i<length; i=(i+1)|0){
var spawnParam = spawnParams[i];
if(spawnParam === 'point')continue;
if(spawnType !== spawnParam){
delete data[spawnParam];
}
}
};
/* save help plugin
===================================*/
Game_Particle.isIdHidden = function(id){
return /\/(?:h|H)(?:$|\/)/.test(id);
};
ParticleEditor.prototype.writeHelpFile = function(){
var database = $dataTrpParticles;
var keys = Object.keys(database);
keys.sort();
var length = keys.length;
var file = '/*'+': @target MZ\n';
file += ' * @'+'base TRP_ParticleMZ\n';
file += ' * @'+'plugindesc '+LC('自作パーティクル設定の一覧',122)+'\n';
file += ' * @'+'help\n';
var images = [];
var idx = 0;
for(var i = 0; i<length; i=(i+1)|0){
var key = keys[i];
var data = database[key];
var isHidden = Game_Particle.isIdHidden(key)
if(Array.isArray(data)){
data = Game_Particle.decompressConfigDataFromArray(data.concat());
}
var imageStr = data.image;
var targetType = data.targetType;
var comment = data.comment;
if(!isHidden){
if(idx++>0){
file += '\n';
}
file += ' * '+ParticleEditor.helpFileListText(key,targetType,comment);
}
if(imageStr){
imageStr.split(',').forEach(function(image){
if(image.indexOf('tile:')===0)return;
if(image.indexOf('ANIM:')===0){
}else if(!images.contains(image)){
images.push(image);
}
});
}
}
file += this.helpPluginExtraHelpTexts();
file += '\n *';
if(parameters.skipListCommand !=='true'){
file += this.helpPluginCommandTexts();
file += '\n *';
}
var length = images.length;
for(var i = 0; i<length; i=(i+1)|0){
file += '\n * @requiredAssets img/particles/'+images[i];
}
var animImages = parameters.splitAnimImageNames||[];
var length = animImages ? animImages.length : 0;
var animImageArrStr = '';
for(var i = 0; i<length; i=(i+1)|0){
var image = '_'+animImages[i].replace(/:/gi,'_');
file += '\n * @requiredAssets img/particles/'+image;
if(i>0){
animImageArrStr+=',';
}
animImageArrStr+='"'+animImages[i]+'"';
}
file += '\n *'+'/';
if(animImageArrStr.length>0){
//PRAGMA: saveListData
file += '\nif(PluginManager._parameters)PluginManager._parameters.trp_particlemz_list = {';
file += '\n\tanimImages:['+animImageArrStr+']';
file += '\n};';
//PRAGMA_END: saveListData
}
var fs = require('fs');
var path = require('path');
var base = path.dirname(process.mainModule.filename);
var filePath = path.join(base, ParticleEditor.HELP_PATH);
fs.writeFileSync(filePath, file);
};
ParticleEditor.helpFileListText = function(key,targetType,comment){
var text = key + ' <';
text += PresetPicker.TARGET_NAMES[targetType]||'---';
text += '> ';
var date = comment;
if(!date){
text += '---';
}else if(isNaN(date)){
text += comment;
}else{
var day = date%100;
var month = Math.floor(date/100)%100;
var year = Math.floor(date/10000)%100;
text += '20'+year+'/'+month+'/'+day;
}
return text;
}
ParticleEditor.prototype.helpPluginExtraHelpTexts = function(){
return '';
};
ParticleEditor.prototype.helpPluginCommandTexts = function(database = $dataTrpParticles){
var texts = '';
var allKeys = Object.keys(database);
allKeys.sort();
var length = allKeys.length;
var setDatabase = {};
var playDatabase = {};
var INDEXES = Game_Particle.CONFIG_PARAM_INDEXES.all;
for(var i=0; i<length; i=(i+1)|0){
var key = allKeys[i];
var data = database[key];
if(Game_Particle.isIdHidden(key)){
continue;
}
if(Array.isArray(data)){
data = Game_Particle.decompressConfigDataFromArray(data.concat());
}
var emitterLifetime = data.emitterLifetime;
if(emitterLifetime>0){
playDatabase[key] = data;
}else{
setDatabase[key] = data;
}
}
var setData = [];
var setNames = [];
PresetPicker.setCategoriedList(setDatabase,setData,setNames);
var playData = [];
var playNames = [];
PresetPicker.setCategoriedList(playDatabase,playData,playNames);
var dataArr,keysArr,command;
for(var i=0; i<2; i=(i+1)|0){
var isSetCommand = i===0;
if(isSetCommand){
dataArr = setData;
keysArr = setNames;
}else{
dataArr = playData;
keysArr = playNames;
}
var categoryLen = keysArr.length;
for(var j=0; j<categoryLen; j=(j+1)|0){
var dataList = dataArr[j];
var keys = keysArr[j];
var category = PresetPicker.CATEGORY_NAMES_EN[j];
var categoryText = PresetPicker.CATEGORY_NAMES[j];
var keysLen = keys.length;
if(keysLen===0)continue;
if(isSetCommand){
texts += '\n * @command set_'+category;
texts += LC('\n * @text set/表示 > ',123)+categoryText+'('+keysLen+')';
texts += LC('\n * @desc パーティクル表示',124);
}else{
texts += '\n * @command play_'+category;
texts += LC('\n * @text play/1回再生 > ',125)+categoryText+'('+keysLen+')';
texts += LC('\n * @desc パーティクルを1回だけ再生',126);
}
texts += '\n *';
texts += '\n * @arg id';
texts += LC('\n * @text 管理ID',127);
texts += LC('\n * @desc 他と被らない管理ID。「def」で設定名,「-EID」で設定名-EID',128);
texts += '\n * @default def';
texts += '\n *';
texts += '\n * @arg target';
texts += LC('\n * @text ターゲット',129);
texts += LC('\n * @desc thisでこのイベント。「event:イベントID」「player」「weather」など',130);
if(category==='screen'){
texts += '\n * @default this';
}else{
texts += '\n * @default weather';
}
texts += '\n *';
texts += '\n * @arg name';
texts += LC('\n * @text 《データ名》',131);
texts += LC('\n * @desc データ名。defとすると管理IDをデータ名として使用。重み同じデータ名を複数表示するときは管理IDを分ける',132);
texts += LC('\n * @default 《呼び出す設定を選択》',133);
texts += '\n * @type select';
for(var k = 0; k<keysLen; k=(k+1)|0){
var key = keys[k];
var data = dataList[k];
var targetType = data.targetType;
var comment = data.comment;
texts += '\n * @option '+ParticleEditor.helpFileListText(key,targetType,comment);
texts += '\n * @value '+key;
}
texts += '\n *';
texts += '\n * @arg z';
texts += LC('\n * @text Z値',134);
texts += LC('\n * @desc 重なり順。above:上、below:後ろ、screen、spritesetなど。数値指定も可',135);
texts += '\n * @default def';
texts += '\n *';
texts += '\n * @arg tag';
texts += LC('\n * @text 管理タグ',136);
texts += LC('\n * @desc 管理用のタグ名',137);
texts += '\n *';
texts += '\n * @arg edit';
texts += LC('\n * @text Editモード',138);
texts += LC('\n * @desc ONにするとエディタを呼び出し(テストプレイ時のみ有効)',139);
texts += '\n * @default false';
texts += '\n * @type boolean';
texts += '\n *';
texts += '\n * @arg delay';
texts += LC('\n * @text _ディレイ',140);
texts += LC('\n * @desc 1以上とすると、指定フレーム後にコマンドを実効',141);
texts += '\n * @default 0';
texts += '\n * @type number';
texts += '\n * @min 0';
texts += '\n *';
texts += '\n *';
}
}
return texts;
};
/* copy & paste
===================================*/
ParticleEditor.prototype.processCopy = function(e){
var data = this.editingDataObject();
delete data.comment;
var file;
if(copyAsArray){
if(!Array.isArray(data)){
data = Game_Particle.compressConfigDataToArray(data);
}
file = JSON.stringify(data);
}else{
file = JSON.stringify(data,null,4);
}
e.clipboardData.setData("text/plain" , file);
e.preventDefault();
SoundManager.playSave();
};
ParticleEditor.prototype.processPaste = function(e){
e.preventDefault();
var clipboardData = e.clipboardData;
if(!clipboardData){
SoundManager.playBuzzer();
return;
}
var text = clipboardData.getData("text/plain");
try{
var data = JSON.parse(text);
var dataObj = null;
if(Array.isArray(data)){
dataObj = Game_Particle.decompressConfigDataFromArray(data);
}else{
dataObj = data;
}
this.endEditing();
this.applyData(dataObj);
SoundManager.playLoad();
} catch(e){
SoundManager.playBuzzer();
}
};
/* helper
===================================*/
ParticleEditor.prototype.hideMenu = function(){
var menuSprites = this._menuSprites;
var length = menuSprites.length;
for(var i = 0; i<length; i=(i+1)|0){
var sprite = menuSprites[i];
sprite.opacity = 0.3*255;
}
};
ParticleEditor.prototype.showMenu = function(){
var menuSprites = this._menuSprites;
var length = menuSprites.length;
for(var i = 0; i<length; i=(i+1)|0){
var sprite = menuSprites[i];
sprite.opacity = 255;
}
};
ParticleEditor.prototype.processHide = function(){
if(this.alpha === 1){
this.alpha = 0.25;
}else{
this.alpha = 1;
}
SoundManager.playCursor();
};
//=============================================================================
// ParticleParam
//=============================================================================
ParticleEditor.ParticleParam = function ParticleParam(){
this.initialize.apply(this, arguments);
};
var ParticleParam = ParticleEditor.ParticleParam;
ParticleParam.FONT_SIZE = paramFontSize||18;
ParticleParam.LINE_HEIGHT = ParticleParam.FONT_SIZE+4;
ParticleParam.prototype = Object.create(PIXI.Container.prototype);
ParticleParam.prototype.constructor = ParticleParam;
ParticleParam.prototype.initialize = function(data,config,configNames,title) {
PIXI.Container.call(this);
this.width = Graphics.width;
this.height = Graphics.height;
this._data = data;
this._config = config;
this._configNames = configNames;
this._title = title;
this._hidden = false;
this._align = 'right';
this._isSpawnParam = ParticleEditor.POS_PARAMS.contains(title);
this._width = 0;
this._height = ParticleParam.LINE_HEIGHT;
this._titleWidth = 0;
this._titleSprite = null;
this._parts = [];
this._textsCache = [];
this._saveData = null;
this._editingIndex = -1;
this._inputting = '';
};
ParticleParam.prototype.title = function(){
return this._title;
};
ParticleParam.prototype.type = function(){
return 'value';
};
ParticleParam.prototype.isSpawnParam = function(){
return this._isSpawnParam;
};
ParticleParam.prototype.refreshWithConfigData = function(config){
this.refresh();
};
ParticleParam.prototype.refresh = function(){
this.refreshParts();
};
ParticleParam.prototype.titleColor = function(){
if(this._isSpawnParam){
return 'rgb(255,200,100)';
}else{
return 'rgb(100,200,255)';
}
};
ParticleParam.prototype.partsColor = function(){
if(this._isSpawnParam){
return 'rgb(255,255,200)';
}else{
return 'rgb(200,255,255)';
}
};
ParticleParam.prototype.titleText = function(){
return '['+this._title+']';
};
ParticleParam.prototype.createTitleSprite = function(){
var sprite = new Sprite();
this.addChild(sprite);
this._titleSprite = sprite;
this.refreshTitleSprite();
};
ParticleParam.prototype.refreshTitleSprite = function(){
var text = this.titleText();
var sprite = this._titleSprite;
var bitmap = sprite.bitmap;
var fontSize = ParticleParam.FONT_SIZE;
var width = text.length*fontSize+4;
var height = fontSize+4;
if(bitmap && bitmap.width<width){
bitmap.clear();
}else{
bitmap = new Bitmap(width,height);
sprite.bitmap = bitmap;
}
sprite.anchor.set(this._align==='right'?1:0,0);
bitmap.fontSize = fontSize;
bitmap.outlineColor = 'black';
bitmap.outlineWidth = 5;
bitmap.textColor = this.titleColor();
bitmap.drawText(text,0,0,width,height,this._align);
this._titleWidth = bitmap.measureTextWidth(text);
};
ParticleParam.prototype.setAlign = function(align){
this._align = align||'right';
}
ParticleParam.prototype.refreshParts = function(){
var parts = this._parts;
var length = this.partsNum();
for(var i = 0; i<length; i=(i+1)|0){
var text = this.partsText(i);
var sprite = parts[i];
if(!sprite){
sprite = this.createPartsSprite();
this.addChild(sprite);
parts[i] = sprite;
this._textsCache[i] = null;
}else{
sprite.visible = true;
}
if(this.checkChangeFromCache(text,i)){
this.refreshPartsText(sprite,text,i);
}
}
var partsLen = parts.length;
for(;i<partsLen;i=(i+1)|0){
parts[i].parent.removeChild(parts[i]);
}
parts.length = length;
this.layout();
};
ParticleParam.prototype.checkChangeFromCache = function(text,i){
if(this._textsCache[i] === text){
return false;
}
this._textsCache[i] = text;
return true;
};
ParticleParam.prototype.partsNum = function(){
return 1;
};
ParticleParam.prototype.partsText = function(index){};
ParticleParam.prototype.defaultValue = function(){
return 0;
};
ParticleParam.prototype.pushSaveDataParams = function(data){
};
ParticleParam.prototype.configValue = function(configName,config){
var elems = configName.split('.');
config = config || this._config;
while(elems.length>0 && config){
var elem = elems.shift();
config = config[elem];
}
return config||this.defaultValue();
};
ParticleParam.prototype.defaultValue = function(){
return 0;
};
ParticleParam.MAX_PARTS_WIDTH = 128;
ParticleParam.prototype.maxPartsWidth = function(){
return ParticleParam.MAX_PARTS_WIDTH;
};
ParticleParam.prototype.createPartsSprite = function(){
var fontSize = ParticleParam.FONT_SIZE;
var width = this.maxPartsWidth();
var height = fontSize+4;
var bitmap = new Bitmap(width,height);
bitmap.fontSize = fontSize;
bitmap.outlineColor = 'black';
bitmap.outlineWidth = 5;
bitmap.textColor = this.partsColor();
var sprite = new Sprite(bitmap);
return sprite;
};
ParticleParam.prototype.refreshPartsText = function(sprite,text,i){
var bitmap = sprite.bitmap;
bitmap.clear();
var width = bitmap.width;
var height = bitmap.height;
var textWidth = Math.min(width,bitmap.measureTextWidth(text)+2);
bitmap.drawText(text,1,0,width-2,height);
sprite._frame.width = textWidth;
sprite._refresh();
};
ParticleParam.prototype.layout = function(){
if(!this._titleSprite){
this.createTitleSprite();
}
var margin = 5;
var x;
var rightAlign = this._align==='right';
var title = this._titleSprite;
if(rightAlign){
x = Graphics.width-margin;
}else{
x = margin;
title.x = x;
x += this._titleWidth + margin;
}
var allParts = this._parts;
var length = allParts.length;
if(rightAlign){
for(var i=length-1; i>=0; i=(i-1)|0){
var parts = allParts[i];
parts.visible = !this._hidden;
if(!parts.visible)continue;
x -= parts.width;
parts.x = x;
x -= margin;
}
}else{
for(var i = 0; i<length; i=(i+1)|0){
var parts = allParts[i];
parts.visible = !this._hidden;
if(!parts.visible)continue;
parts.x = x;
x += parts.width + margin;
}
}
var title = this._titleSprite;
if(rightAlign){
title.x = x;
this._width = Graphics.width-x + this._titleWidth;
}else{
this._width = x-margin;
}
};
ParticleParam.prototype.show = function(){
if(!this._hidden)return;
this._hidden = false;
this.layout();
};
ParticleParam.prototype.hide = function(){
if(this._hidden)return;
this._hidden = true;
this.layout();
};
/* edit
===================================*/
ParticleParam.prototype.processTouch = function(x,y,margin){
if(y<this.y)return false;
if(y>this.y+this._height)return false;
var rightAlign = this._align==='right';
if(rightAlign){
if(x<Graphics.width-this._width-margin)return false;
}else{
if(this._width+margin<x)return false;
}
var allParts = this._parts;
var length = allParts.length;
for(var i = 0; i<length; i=(i+1)|0){
var parts = allParts[i];
if(parts.x<=x && x<=parts.x+parts.width){
this.setEditing(i);
return true;
}
}
return true;
};
ParticleParam.prototype.startEditing = function(){
this.setEditing(Math.max(0,this._editingIndex));
};
ParticleParam.prototype.setEditing = function(index){
var parts = this._parts;
var length = parts.length;
index = index % length;
this._editingIndex = index;
this.clearInputting();
for(var i = 0; i<length; i=(i+1)|0){
parts[i].opacity = i===index ? 255 : 150;
}
this.refreshParts();
};
ParticleParam.prototype.endEditing = function(){
var needsRefresh = this._editingIndex>=0;
this._editingIndex = -1;
var parts = this._parts;
var length = parts.length;
for(var i = 0; i<length; i=(i+1)|0){
parts[i].opacity = 255;
}
if(needsRefresh){
this.refreshParts();
}
};
ParticleParam.KEY_CODE = {
backSpace:8,
tab:9,
delete:46,
num:48,
alphabet:65,
a:65,
c:67,
e:69,
f:70,
g:71,
i:73,
l:76,
p:80,
s:83,
t:84,
v:86,
w:87,
alphabetEnd: 90,
tenkey:96,
minus:189,
tenkeyMinus:109,
dot:190,
tenkeyDot:110,
at: 192,
bracket: 219
};
var KEY_CODE = ParticleParam.KEY_CODE;
ParticleParam.prototype.processInput = function(keyCode,key){
if(Input.isTriggered('cancel')&&keyCode!==96){
return false;
}else if(Input.isTriggered('ok')){
this.clearInputting();
}else if(keyCode===KEY_CODE.tab || (Input.isTriggered('right')&&keyCode!==102)){
var index = this._editingIndex+1;
if(index>this._parts.length-1)index = 0;
this.setEditing(index);
}else if(Input.isTriggered('left') && keyCode!==100){
var index = this._editingIndex-1;
if(index<0)index = this._parts.length-1;
this.setEditing(index);
}else if(keyCode===KEY_CODE.backSpace){
this.clearInputting(true);
this.applyEditing();
}else{
this._processCharacterInput(keyCode,key);
}
return true;
};
ParticleParam.prototype._processCharacterInput = function(keyCode){
var numKeyCode = KEY_CODE.num;
var tenKeyCode = KEY_CODE.tenkey;
var chara = null;
if(keyCode>=numKeyCode&&keyCode<numKeyCode+10){
chara = Number(keyCode-numKeyCode);
}else if(keyCode>=tenKeyCode&&keyCode<tenKeyCode+10){
chara = Number(keyCode-tenKeyCode);
}else if(keyCode===KEY_CODE.minus||keyCode===KEY_CODE.tenkeyMinus){
chara = '-';
this._inputting = '';
}else if(keyCode===KEY_CODE.dot||keyCode===KEY_CODE.tenkeyDot){
if(!this._inputting.contains('.')){
chara = '.';
}
}
if(chara!==null){
this._inputting += chara;
this.applyEditing();
}
};
ParticleParam.prototype.clearInputting = function(){
this._inputting = '';
};
ParticleParam.prototype.applyEditing = function(){
var index = this._editingIndex;
if(index<0)return;
var value = this.valueWithInputting();
var data = this.paramSaveData(index,value);
if(data){
this.saveToParam(data);
}
this.refreshParts();
};
ParticleParam.prototype.valueWithInputting = function(){
var input = this._inputting;
var value;
if(this.type()==='color'){
value = this._inputting;
}else{
value = Number(this._inputting);
if(value === NaN){
value = this.value(this._editingIndex);
this._inputting = String(value);
}
}
return value;
};
ParticleParam.prototype.value = function(config){return 0;};
ParticleParam.prototype.shouldSave = function(data){
return true;
};
ParticleParam.prototype.isEqualsToLast = function(){
};
ParticleParam.prototype.saveToParam = function(data){
if(!this.shouldSave(data)){
return false;
}
data = data||this.paramSaveData();
if(!data)return;
this._saveData = data;
};
ParticleParam.prototype.hasSaveData = function(){
return !!this._saveData;
};
ParticleParam.prototype.handOverSaveData = function(){
var data = this._saveData;
this._saveData = null;
return data;
};
ParticleParam.prototype.didSaveParams = function(){};
//=============================================================================
// ParticleParam.ValueParam
//=============================================================================
ParticleParam.ValueParam = function(){
this.initialize.apply(this, arguments);
};
var ValueParam = ParticleParam.ValueParam;
ValueParam.prototype = Object.create(ParticleParam.prototype);
ValueParam.prototype.constructor = ValueParam;
ValueParam.prototype.initialize = function(data,config,name,title,headers){
ParticleParam.prototype.initialize.call(this,data,config,name,title);
this._headers = headers;
};
ValueParam.prototype.partsHeader = function(index){
var headers = this._headers;
if(!headers || headers.length===0)return '';
else if(headers.length===1)return headers[0];
else return headers[index];
};
ValueParam.prototype.partsNum = function(){
return this._configNames.length;
};
ValueParam.prototype.partsText = function(index){
var text = index===this._editingIndex ? this._inputting : String(this.value(index));
if(text === ''){
text = String(this.value(index))
}
var header = this.partsHeader(index);
if(header){
text = header + ':'+ text;
}
return text
};
ValueParam.prototype.paramSaveData = function(index,value){
var values = this.values();
if(this._configNames[0]==='frequency' && value===0){
return null;
}
if(value !== undefined){
if(isNaN(value))return null;
values[index] = Number(value);
}
return values;
};
ValueParam.prototype.values = function(){
var ret = [];
var num = this._parts.length;
for(var i = 0; i<num; i=(i+1)|0){
var value = this.value(i);
ret.push(value);
}
return ret;
};
ValueParam.prototype.value = function(index){
var name = this._title;
var params = this._data.params[name];
if(params!==undefined)return params[index];
var config = this.configValue(this._configNames[index]);
if(config!==undefined)return config;
return 0;
};
ValueParam.prototype.pushSaveDataParams = function(data){
var saveData = this.paramSaveData();
var length = saveData.length;
for(var i = 0; i<length; i=(i+1)|0){
var value = saveData[i];
var configName = this._configNames[i];
configName = configName.replace('point','pos');
var elems = configName.split('.');
var targetObj = data;
while(elems.length>1){
var elem = elems.shift();
if(!targetObj[elem]){
targetObj[elem] = {};
}
targetObj = targetObj[elem];
}
targetObj[elems[0]] = value;
}
};
ValueParam.prototype.refreshWithConfigData = function(config){
var names = this._configNames;
var length = names.length;
var data = this._data.params[this._title];
for(var i = 0; i<length; i=(i+1)|0){
var name = names[i];
var value = this.configValue(name,config);
if(value===undefined || value===null){
if(data){
delete this._data.params[this._title];
}
return;
}
if(!data){
data = this._data.params[this._title] = [];
}
data[i] = value;
}
ParticleParam.prototype.refreshWithConfigData.call(this,config);
};
ParticleParam.prototype.applyAll = function(){
var names = this._configNames;
var length = names.length;
var data = this.paramSaveData();
if(data){
this.saveToParam(data);
}
};
//=============================================================================
// ParticleParam.NodeParam
//=============================================================================
ParticleParam.NodeParam = function(){
this.initialize.apply(this, arguments);
};
var NodeParam = ParticleParam.NodeParam;
NodeParam.prototype = Object.create(ParticleParam.prototype);
NodeParam.prototype.constructor = NodeParam;
NodeParam.prototype.initialize = function(data,config,name,title) {
ParticleParam.prototype.initialize.call(this,data,config,name,title);
this._inputtingTimeSprite = null;
this._lastInputtingTimeText = null;
this._inputtingTime = null;
this._innerData = [];
this.initInnerData(data,config,title);
};
NodeParam.prototype.initInnerData = function(data,config,title){
this._innerData.length = 0;
var params = data.params[title];
if(params){
var length = params.length;
for(var i = 0; i<length; i=(i+1)|0){
var elems = params[i].split('@');
this._innerData.push({
time:Number(elems[1]),
value:isNaN(elems[0])?elems[0]:Number(elems[0])
});
}
}else if(config[title].list){
this._innerData = config[title].list.concat();
}else{
this._innerData.push({
time:0,
value:config[title].start
});
this._innerData.push({
time:1,
value:config[title].end
});
}
this.sortInnerData();
};
NodeParam.prototype.refreshParts = function(){
this.refreshInputtingSprite();
ParticleParam.prototype.refreshParts.call(this);
};
NodeParam.prototype.refreshInputtingSprite = function(){
var sprite = this._inputtingTimeSprite;
if(this._inputtingTime!==null && this._editingIndex<0){
if(!sprite){
this._inputtingTimeSprite = sprite = this.createPartsSprite();
this.addChild(sprite);
sprite.anchor.set(1,0);
}
sprite.visible = true;
var text = '@' + this._inputtingTime + '→';
if(text !== this._lastInputtingTimeText){
this._lastInputtingTimeText = text;
var bitmap = sprite.bitmap;
bitmap.clear();
bitmap.fillAll('rgb(150,150,0)');
bitmap.drawText(text,0,0,bitmap.width,bitmap.height,'right');
}
}else{
if(sprite){
sprite.visible = false;
}
}
};
NodeParam.prototype.layout = function(){
ParticleParam.prototype.layout.call(this);
var sprite = this._inputtingTimeSprite;
if(!sprite || !sprite.visible)return;
sprite.x = this._titleSprite.x - this._titleWidth - 4;
};
NodeParam.prototype.partsText = function(index){
var data = this._innerData[index];
var editing = index===this._editingIndex;
var text = (editing&&this._inputtingTime===null) ? this._inputting : String(data.value);
if(text === '')text = String(data.value);
text += this._timeText(index)
return text;
};
NodeParam.prototype._timeText = function(index){
var data = this._innerData[index];
var editing = index===this._editingIndex;
var text = '';
if(index>0 && index<this._innerData.length-1){
text += '@'+data.time;
if(this._inputtingTime!==null && editing){
text += '→' + this._inputtingTime;
}
}
return text;
};
NodeParam.prototype.titleColor = function(){
return 'rgb(200,150,255)';
};
// NodeParam.prototype.titleText = function(){
// return '['+this._title+']';
// };
NodeParam.prototype.paramSaveData = function(index,value){
var data;
if(value !== undefined){
value = isNaN(value) ? value : Number(value)
var data = this._innerData[index];
data.value = value;
this.sortInnerData();
var lastInputting = this._inputting;
this.setEditing(this._innerData.indexOf(data));
this._inputting = lastInputting;
}
var saveData = [];
var innerData = this._innerData;
var length = innerData.length;
for(var i = 0; i<length; i=(i+1)|0){
var data = innerData[i];
saveData.push(data.value+'@'+data.time);
};
return saveData;
};
NodeParam.prototype.sortInnerData = function(){
this._innerData.sort(NodeParam.prototype.compareInnerData.bind(this));
};
NodeParam.prototype.compareInnerData = function(a, b) {
return a.time-b.time;
};
NodeParam.prototype.partsNum = function(){
return this._innerData.length;
};
/* input
===================================*/
NodeParam.prototype.processInput = function(keyCode,key){
if(keyCode === KEY_CODE.delete){
if(this._editingIndex!==0&&this._editingIndex!==this._innerData.length-1){
this._innerData.splice(this._editingIndex,1);
this.saveToParam();
this._inputting = String(this._innerData[this._editingIndex].value);
this.refreshParts();
}
}else if(keyCode===KEY_CODE.at && (isMac || Input.isPressed('shift'))){
// mac > at = shift + @
if(this._editingIndex>0 && this._editingIndex<this._innerData.length-1){
this._inputtingTime = '';
this.refreshParts();
}else{
SoundManager.playBuzzer();
}
}else if(isMac ? keyCode===KEY_CODE.bracket : keyCode===KEY_CODE.at){//[ > new
// mac > @ = bracket
this.setEditing(-1);
this._inputtingTime = '';
this.refreshParts();
}else if(this._inputtingTime!==null){
this.processInputForInputtingTime(keyCode,key);
}else{
return ParticleParam.prototype.processInput.call(this,keyCode,key);
}
return true;
};
NodeParam.prototype.processInputForInputtingTime = function(keyCode,key){
var numKeyCode = KEY_CODE.num;
var tenKeyCode = KEY_CODE.tenkey;
if(Input.isTriggered('ok')){
this.startEditingPartsWithTime(Number(this._inputtingTime));
this._inputtingTime = null;
}else if(keyCode===KEY_CODE.backSpace){
this._inputtingTime = null;
this.refreshParts();
}else if(keyCode===KEY_CODE.dot||keyCode===KEY_CODE.tenkeyDot){
if(this._inputtingTime.contains('.')){
SoundManager.playBuzzer();
}else{
this._inputtingTime += '.';
}
this.refreshParts();
}else if((keyCode>=numKeyCode&&keyCode<numKeyCode+10)
||(keyCode>=tenKeyCode&&keyCode<tenKeyCode+10))
{
var num = (keyCode>=tenKeyCode ? keyCode-tenKeyCode : keyCode-numKeyCode);
if(this._inputtingTime.contains('.')){
this._inputtingTime += num;
}else{
this._inputtingTime = num===0 ? '0' : '1';
}
this.refreshParts();
}else{
return;
}
};
NodeParam.prototype.setEditing = function(index){
this._inputtingTime = null;
ParticleParam.prototype.setEditing.call(this,index);
};
NodeParam.prototype.startEditingPartsWithTime = function(time){
var innerData = this._innerData;
var length = innerData.length;
var data = this._editingIndex>=0 ? innerData[this._editingIndex] : null;
if(data){
data.time = time;
this._inputting = String(data.value);
}
for(var i = 0; i<length; i=(i+1)|0){
if(innerData[i].time === time){
if(this._editingIndex>=0){
if(this._editingIndex!==i){
innerData.splice(i,1);
break;
}
}else{
this.setEditing(i);
return;
}
}
}
if(!data){
data = {
time:time,
value:this.defaultValue()
};
this._inputting = data.value;
innerData.push(data);
}
this.sortInnerData();
var index = innerData.indexOf(data);
this._editingIndex = index;
this.setEditing(index);
this.applyAll();
};
NodeParam.prototype.endEditing = function(){
this._inputtingTime = null;
ParticleParam.prototype.endEditing.call(this);
if(this._inputtingTimeSprite){
this._inputtingTimeSprite.visible = false;
}
};
NodeParam.prototype.pushSaveDataParams = function(data){
var list = this._innerData.concat();
var configName = this._configNames[0];
if(!data[configName]){
data[configName] = {};
}
data[configName].list = list;
};
NodeParam.prototype.refreshWithConfigData = function(config){
var params = config[this._title];
if(!params || !params.list)return;
this._innerData = params.list.concat();
this.sortInnerData();
ParticleParam.prototype.refreshWithConfigData.call(this,config);
};
//=============================================================================
// ParticleParam.ColorNodeParam
//=============================================================================
ParticleParam.ColorNodeParam = function(){
this.initialize.apply(this, arguments);
};
var ColorNodeParam = ParticleParam.ColorNodeParam;
ColorNodeParam.prototype = Object.create(NodeParam.prototype);
ColorNodeParam.prototype.constructor = ColorNodeParam;
ColorNodeParam.prototype.initialize = function(data,config,name,title) {
NodeParam.prototype.initialize.call(this,data,config,name,title);
this._colorPicker = null;
};
ColorNodeParam.prototype.type = function(){
return 'color';
};
ColorNodeParam.prototype.defaultValue = function(){
return this._colorPicker ? this._colorPicker.color() : 'rgb(255,255,255)';
};
ColorNodeParam.prototype.setPicker = function(picker){
this._colorPicker = picker;
picker.visible = true;
this.refreshPickerColor();
};
ColorNodeParam.prototype.refreshPickerColor = function(){
var picker = this._colorPicker;
if(!picker)return;
var index = this._editingIndex;
if(index<0)return;
var value = this._innerData[index].value;
picker.setColor(value);
};
ColorNodeParam.prototype.setEditing = function(index){
NodeParam.prototype.setEditing.call(this,index);
this.refreshPickerColor();
};
ColorNodeParam.prototype.endEditing = function(){
NodeParam.prototype.endEditing.call(this);
this._colorPicker.visible = false;
this._colorPicker = null;
};
ColorNodeParam.prototype.processTouch = function(x,y,margin){
var editingData = this._innerData[this._editingIndex];
if(!!editingData && this._colorPicker){
var color = this._colorPicker.color();
if(color !== editingData.value){
this._inputting = color;
this.applyEditing();
}
}
return NodeParam.prototype.processTouch.call(this,x,y,margin);
};
ColorNodeParam.prototype.paramSaveData = function(index,value){
//check value is color
if(value!==undefined){
if(value.indexOf('rgb')===0){
if(!value.match(/rgb\(\d+,\d+,\d+\)/)){
return null;
}
}else{
var color;
if(value[0]==='#'){
color = value.substr(1);
}else{
color = value;
value = '#'+value;
}
if(isNaN(color) && color.length!==6){
return null;
}
}
}
return NodeParam.prototype.paramSaveData.call(this,index,value);
};
/* input
===================================*/
ColorNodeParam.prototype.processInput = function(keyCode,key){
if(keyCode === KEY_CODE.delete){
if(this._editingIndex!==0&&this._editingIndex!==this._innerData.length-1){
var index = this._editingIndex;
this._innerData.splice(this._editingIndex,1);
this._inputting = this._innerData[this._editingIndex].value;
this.applyEditing();
}
}else{
return NodeParam.prototype.processInput.call(this,keyCode,key);
}
return true;
};
ColorNodeParam.prototype.clearInputting = function(deleteFlag=false){
if(deleteFlag){
if(this._editingIndex===0){
this._inputting = '#ffffff';
}else{
var previousNode = this._innerData[this._editingIndex-1];
this._inputting = this.colorCodeWithValue(previousNode.value);
}
}else{
var innerData = this._innerData[this._editingIndex];
if(!innerData){
innerData = this._innerData[this._editingIndex-1];
}
this._inputting = innerData ? innerData.value : '#ffffff';
}
};
ColorNodeParam.prototype.refreshPartsText = function(sprite,text,i){
var bitmap = sprite.bitmap;
bitmap.clear();
var width = bitmap.width;
var height = bitmap.height;
var data = this._innerData[i];
var color = data ? data.value : null;
if(color.indexOf('rgb')===0){
if(!color.match(/rgb\(\d+,\d+,\d+\)/)){
color = 'white';
}
}else{
if(color[0]==='#'){
color = color.substr(1);
}
if(!color.match(/[0-9a-f]+/)){
color = 'white;'
}else if(color.length!==6){
color = 'white';
}else{
color = '#'+color;
}
}
bitmap.fillRect(0,1,height-2,height-2,'black');
bitmap.fillRect(1,2,height-4,height-4,color);
var textWidth = Math.min(width,height+bitmap.measureTextWidth(text)+2);
bitmap.drawText(text,height,0,width-2-height,height);
sprite._frame.width = textWidth;
sprite._refresh();
};
ColorNodeParam.prototype.partsText = function(index){
return this._partsText(index,noColorCode);
};
ColorNodeParam.prototype._partsText = function(index,noColorCode){
var data = this._innerData[index];
var text;
if(noColorCode){
text = '';
}else{
text = index===this._editingIndex ? this._inputting : String(data.value);
}
if(index>0 && index<this._innerData.length-1){
// text += '@'+data.time;
text += this._timeText(index);
}
return text;
};
ColorNodeParam.prototype.checkChangeFromCache = function(text,i){
var withColorCode = this._partsText(i,false);
if(this._textsCache[i] === withColorCode){
return false;
}
this._textsCache[i] = withColorCode;
return true;
};
ColorNodeParam.prototype.pushSaveDataParams = function(data){
var list = this._innerData.concat();
var configName = this._configNames[0];
if(!data[configName]){
data[configName] = {};
}
var length = list.length;
for(var i = 0; i<length; i=(i+1)|0){
var node = list[i];
var value = node.value;
node.value = this.colorCodeWithValue(value);
}
data[configName].list = list;
};
ColorNodeParam.prototype.colorCodeWithValue = function(value){
if(value.indexOf('rgb')===0){
var values = value.match(/\((\d+),(\d+),(\d+)/);
return '#'+Number(values[1]).toString(16)+Number(values[2]).toString(16)+Number(values[3].toString(16));
}else{
return value
}
};
//=============================================================================
// ColorPicker
//=============================================================================
ParticleEditor.ColorPicker = function ColorPicker(){
this.initialize.apply(this, arguments);
};
var ColorPicker = ParticleEditor.ColorPicker;
ColorPicker.colorWithHsv = function(h,s,v){
var max = v;
var min = max-((s/255)*max);
var r,g,b;
if(h<=60){
r = max;
g = (h/60)*(max-min)+min;
b = min;
}else if(h<=120){
r = ((120-h)/60)*(max-min)+min;
g = max;
b = min;
}else if(h<=180){
r = min;
g = max;
b = ((h-120)/60)*(max-min)+min;
}else if(h<=240){
r = min;
g = ((240-h)/60)*(max-min)+min;
b = max;
}else if(h<=300){
r = ((h-240)/60)*(max-min)+min;
g = min;
b = max;
}else{
r = max;
g = min;
b = ((360-h)/60)*(max-min)+min;
}
r = Math.round(r).toString(16);
g = Math.round(g).toString(16);
b = Math.round(b).toString(16);
if(r.length===1)r='0'+r;
if(g.length===1)g='0'+g;
if(b.length===1)b='0'+b;
var color = '#'+r+g+b;
return color;
};
ColorPicker.HUE_WIDTH = 20;
ColorPicker.MARGIN = 3;
ColorPicker.prototype = Object.create(PIXI.Container.prototype);
ColorPicker.prototype.constructor = ColorPicker;
ColorPicker.prototype.initialize = function(size){
PIXI.Container.call(this);
this._size = size;
this._hue = -1;
this._saturation = -1;
this._value = -1;
this._color = null;
this._touchingHue = false;
this._touchingSv = false;
var margin = ColorPicker.MARGIN;
var hueWidth = ColorPicker.HUE_WIDTH;
var totalWidth = margin*3 + size + hueWidth;
var totalHeight = margin*2 + size;
var bitmap,sprite;
//this > backBitmap
bitmap = new Bitmap(16,16);
bitmap.fillAll('rgba(0,0,0,0.5)');
sprite = new Sprite(bitmap);
this.addChild(sprite);
sprite.scale.set(totalWidth/16,totalHeight/16);
this._backSprite = sprite;
//pickerSprite
bitmap = new Bitmap(size,size);
sprite = new Sprite(bitmap);
this.addChild(sprite);
sprite.x = margin;
sprite.y = margin;
this._pickerSprite = sprite;
this.bitmap = bitmap;
//huePicker
bitmap = new Bitmap(hueWidth,size);
sprite = new Sprite(bitmap);
this.addChild(sprite);
sprite.x = margin*2 + size;
sprite.y = margin;
this._huePicker = sprite;
//pointer
bitmap = new Bitmap(16,16);
sprite = new Sprite(bitmap);
this.addChild(sprite);
sprite.anchor.set(0.5,0.5);
this._pointer = sprite;
var ctx = bitmap._context;
ctx.beginPath();
ctx.arc(8,8,6,0,360*Math.PI/180,false);
ctx.fillStyle = 'rgb(255,255,255)';
ctx.fill();
ctx.beginPath();
ctx.arc(8,8,3,0,360*Math.PI/180,false);
ctx.globalCompositeOperation = "destination-out";
ctx.fill();
//huePointer
var lineWidth = 2;
var spaceHeight = 2;
bitmap = new Bitmap(hueWidth+lineWidth*2,spaceHeight+lineWidth*2);
sprite = new Sprite(bitmap);
this.addChild(sprite);
sprite.anchor.set(0.5,0.5);
this._huePointer = sprite;
bitmap.fillAll('black');
bitmap.clearRect(lineWidth,lineWidth,bitmap.width-lineWidth*2,bitmap.height-lineWidth*2);
this.setupHuePicker();
this.setColor('rgb(255,255,255)');
};
ColorPicker.prototype.setupHuePicker = function(){
var bitmap = this._huePicker.bitmap;
var width = bitmap.width;
var height = bitmap.height;
var s = 255;
var v = 255;
for(var y=0; y<height; y=(y+1)|0){
var h = 360*(y/height);
var color = ColorPicker.colorWithHsv(h,s,v);
bitmap.fillRect(0,y,width,1,color);
}
};
ColorPicker.prototype.setupPallete = function(h){
var bitmap = this._pickerSprite.bitmap;
bitmap.clear();
var width = this.width;
var height = this.height;
var r,g,b;
for(var x=0; x<width; x=(x+1)|0){
var s = 255*x/width;
for(var y=0; y<height; y=(y+1)|0){
var v = 255*y/height;
var color = ColorPicker.colorWithHsv(h,s,v);
bitmap.fillRect(x,height-y-1,1,1,color);
}
}
};
ColorPicker.prototype.setColor = function(color){
var r,g,b;
if(color.indexOf('rgb')!==0){
if(color[0] == "#"){
color = color.substr(1);
}else if(color.indexOf("0x")===0){
color = color.substr(2);
}
if(color.length == 8){
color = color.substr(2);
}
r = parseInt(color.substr(0, 2), 16);
g = parseInt(color.substr(2, 2), 16);
b = parseInt(color.substr(4, 2), 16);
}else{
var args = color.match(/\((.+)\)/)[1].split(',');
r = Number(args[0]);
g = Number(args[1]);
b = Number(args[2]);
}
var h,s,v;
var max = Math.max(r,g,b);
var min = Math.min(r,g,b);
if(r===g && g===b){
h = Math.max(0,this._hue);
}else if(r>=g && r>=b){
h = 60*(g-b)/(max-min);
}else if(g>=r && g>=b){
h = 60*(b-r)/(max-min)+120;
}else{
h = 60*(r-g)/(max-min)+240;
}
s = (max-min)/max*255;
v = max;
if(h<0){
h += 360;
}else if(h>360){
h -= 360;
}
this.setHue(h);
this.setSV(s,v);
};
ColorPicker.prototype.updateResultColor = function(){
this._color = ColorPicker.colorWithHsv(this._hue,this._saturation,this._value);
};
ColorPicker.prototype.color = function(){
return this._color;
};
ColorPicker.prototype.setHue = function(h){
h = h.clamp(0,360);
if(this._hue === h)return;
var dh = h-this._hue;
this._hue = h;
this.setupPallete(this._hue);
var sprite = this._huePicker;
var pointer = this._huePointer;
pointer.x = sprite.x+sprite.width/2;
pointer.y = sprite.y+sprite.height*h/360;
this.updateResultColor();
};
ColorPicker.prototype.setSV = function(s,v){
if(this._saturation===s && this._value===v)return;
this._saturation = s;
this._value = v;
var margin = ColorPicker.MARGIN
var size = this._size;
var pointer = this._pointer;
pointer.x = margin+Math.round((s/255)*size);
pointer.y = margin+Math.round(size-(v/255)*size-1);
this.updateResultColor();
};
ColorPicker.prototype.update = function(){
if(!this.visible){
this._touchingHue = false;
this._touchingSv = false;
return;
}
if(!TouchInput.isTriggered() && !TouchInput.isPressed()){
this._touchingHue = false;
this._touchingSv = false;
return;
}
var x = TouchInput.x-this.x;
var y = TouchInput.y-this.y;
var dx,dy,touchInside;
var hPicker = this._huePicker;
dx = x-hPicker.x;
dy = y-hPicker.y;
touchInside = (dx>=0 && dx<=hPicker.width && dy>=0 && dy<=hPicker.height);
if(this._touchingHue || (!this._touchingSv&&touchInside)){
dy = dy.clamp(0,hPicker.height-1);
var hue = Math.round(dy/(hPicker.height-1)*360);
this.setHue(hue);
this._touchingHue = true;
return;
}
var svPicker = this._pickerSprite;
dx = x-svPicker.x;
dy = y-svPicker.y;
touchInside = (dx>=0 && dx<=svPicker.width && dy>=0 && dy<=svPicker.height);
if(this._touchingSv || (!this._touchingHue&&touchInside)){
dx = dx.clamp(0,svPicker.width-1);
dy = dy.clamp(0,svPicker.height-1);
var s = Math.round(dx/(svPicker.width-1)*255);
var v = Math.round((svPicker.height-1-dy)/(svPicker.height-1)*255);
this.setSV(s,v);
this._touchingSv = true;
return;
}
};
//=============================================================================
// PickerBase
//=============================================================================
var PickerBase = ParticleEditor.PickerBase = function PickerBase(){
this.initialize.apply(this, arguments);
};
PickerBase.TINT_SEVERAL = 0xaaffff;
PickerBase.TINT_NORMAL = 0xffffaa;
PickerBase.TINT_SEARCH = 0xaaffaa;
PickerBase.LAYOUT = {
marginTopBottom:5
};
PickerBase.prototype = Object.create(PIXI.Container.prototype);
PickerBase.prototype.constructor = PickerBase;
PickerBase.prototype.initialize = function() {
PIXI.Container.call(this);
this.initMembers();
this.createBackSprite();
this.createHighlightBitmap();
this.createGuideSprite();
this.createHeaderSprite();
};
PickerBase.prototype.initMembers = function(){
this._header = '';
this._headerSprite = null;
this._topRow = 0;
this._maxRow = 0;
this._dispRows = 0;
this._maxTopRow = 0;
this._owner = null;
this._severalMode = false;
this._severalModeSwitched = false;
this._selectingIndexes = [];
this._backSprite = null;
this._highlightSprites = [];
this._highlightBitmap = null;
this._guideSprite = null;
this._searchSprite = null;
this._listType = null;
this._categoryIndex = 0;
};
PickerBase.prototype.startPicking = function(owner){
this.visible = true;
this._owner = owner;
Input.clear();
TouchInput.clear();
this.registerWheelListener();
this.refresh();
this._headerSprite.opacity = 255;
this._headerSprite.visible = true;
if(this._guideSprite){
var sprite = this._guideSprite;
sprite.x = this._width + 10;
sprite.y = Graphics.height-50+(this._topRow*this.itemHeight());
}
};
PickerBase.prototype.end = function(){
if(this._owner){
this._owner.didEndPicking();
}
this._owner = null;
this.resignWheelListener();
this.visible = false;
SoundManager.playCancel();
Input.clear();
TouchInput.clear();
};
PickerBase.prototype.refresh = function(){
var type = this.categoryType();
if(this._listType === type)return;
this.setListType(type);
if(this.isReady()){
this._refresh();
}
};
PickerBase.prototype.isReady = function(){
return true;
};
PickerBase.prototype._refresh = function(){
var col = this.maxColumns();
var itemWidth = this.itemWidth();
var itemHeight = this.itemHeight();
var margin = PickerBase.LAYOUT.marginTopBottom;
var itemNum = this.maxItems();
var mx = this.itemMarginX();
var my = this.itemMarginY();
this._maxRow = Math.ceil(itemNum/col);
this._dispRows = Math.floor((Graphics.height-2*margin)/(itemHeight+my));
this._maxTopRow = Math.max(0,this._maxRow-this._dispRows-1);
var row = this._maxRow;
var width = itemWidth*col+mx*(col-1)+margin*2;
this._width = width;
this._height = Graphics.height;
this.refreshBackSprite();
this.refreshItems();
};
PickerBase.prototype.setListType = function(type){
this._listType = type;
this.refreshHeaderSprite();
};
PickerBase.prototype.refreshItems = function(){};
/* needs overwrite
===================================*/
PickerBase.prototype.maxColumns = function(){return 4;};
PickerBase.prototype.itemHeight = function(){return 48;};
PickerBase.prototype.itemWidth = function(){return 48;};
PickerBase.prototype.maxItems = function(){return 0;};
PickerBase.prototype.guideTexts = function(){return null;};
PickerBase.prototype.itemMarginX = function(){return 0;};
PickerBase.prototype.itemMarginY = function(){return 0;};
PickerBase.prototype.categoryType = function(){
return 1;
};
PickerBase.prototype.headerText = function(){return '';}
//category
PickerBase.prototype.maxCategories = function(){return 1};
PickerBase.prototype.isCategoryValid = function(index){return true};
PickerBase.prototype.isSeveralModeValid = function(){return true};
PickerBase.prototype.applyData = function(){};
/* select
===================================*/
PickerBase.prototype.deselectIndex = function(index){
if(index<0)return;
var arrayIdx = this._selectingIndexes.indexOf(index);
if(arrayIdx<0)return;
this._selectingIndexes.splice(arrayIdx,1);
var sprite = this._highlightSprites[arrayIdx];
if(sprite){
this._highlightSprites.splice(arrayIdx,1);
sprite.parent.removeChild(sprite);
}
};
PickerBase.prototype.didPickData = function(index){
if(this._selectingIndexes.contains(index)){
this.deselectIndex(index);
}else{
this.setSelectingIndex(index);
}
this.applyData();
};
/* update
===================================*/
PickerBase.prototype.update = function(){
if(this._headerSprite.visible){
this.updateHeaderSprite();
}
if(this._searchSprite && this._searchSprite.opacity>0){
this._searchSprite.opacity -= 3;
}
if(Input._latestButton){
this.processInput();
}else if(TouchInput.isLongPressed() && this.isSeveralModeValid()){
if(!this._severalModeSwitched){
this.switchSelectingMode();
this._severalModeSwitched = true;
if(this._selectingIndexes.length===0){
this.processTouch();
}
this.applyData();
}
}else if(TouchInput.isTriggered()){
this.processTouch();
this._severalModeSwitched = false;
}
};
PickerBase.prototype.onKeyDown = function(keyCode,event){
if((!event.ctrlKey&&!event.metaKey) && keyCode>=KEY_CODE.alphabet && keyCode<=KEY_CODE.alphabetEnd){
var chara = event.key;
this.search(chara);
}
};
PickerBase.prototype.search = function(chara){};
PickerBase.prototype.didSuccessSearch = function(index){
this.setTopIndex(index);
var sprite = this._searchSprite;
if(!sprite){
sprite = this.createHighlightSprite();
this._searchSprite = sprite;
sprite.tint = PickerBase.TINT_SEARCH;
}
this.setHighlightSpritePosition(sprite,index);
sprite.opacity = 150;
};
PickerBase.prototype.processTouch = function(){
var x = TouchInput.x - this.x;
var y = TouchInput.y - this.y;
if(x<0 || x>this._width){
this.end();
return;
}
var maxCol = this.maxColumns();
var length = this.maxItems();
var margin = PickerBase.LAYOUT.marginTopBottom;
var mx = this.itemMarginX();
var my = this.itemMarginY();
var itemWidth = this.itemWidth();
var itemHeight = this.itemHeight();
var colW = itemWidth+mx;
var rowH = itemHeight+my;
var x0 = margin/2;
var ix = x0;
var iy = margin/2;
for(var i = 0; i<length; i=(i+1)|0){
if(i===0){
}else if(i%maxCol === 0){
ix = margin/2;
iy += rowH;
}else{
ix += colW;
}
if(ix<=x && x<=ix+colW && iy<=y && y<=iy+rowH){
this.didPickData(i);
return;
}
}
};
PickerBase.prototype.setSelectingIndex = function(index){
SoundManager.playCursor();
var sprite = null;
var noSelect = index<0;
if(this._severalMode){
if(this._selectingIndexes.contains(index)){
return;
}
this._selectingIndexes.push(index);
}else{
this._selectingIndexes[0] = index;
sprite = this._highlightSprites[0];
if(noSelect){
if(sprite){
this._highlightSprites.length = 0;
sprite.parent.removeChild(sprite);
}
return;
}
}
if(noSelect)return;
if(!sprite){
sprite = this.createHighlightSprite();
this._highlightSprites.push(sprite);
}
sprite.tint = this._severalMode?PickerBase.TINT_SEVERAL:PickerBase.TINT_NORMAL;
this.setHighlightSpritePosition(sprite,index);
};
PickerBase.prototype.setHighlightSpritePosition = function(sprite,index){
var maxCol = this.maxColumns();
var margin = PickerBase.LAYOUT.marginTopBottom;
var mx = this.itemMarginX();
var my = this.itemMarginY();
var itemWidth = this.itemWidth();
var itemHeight = this.itemHeight();
var col = index%maxCol;
var row = Math.floor(index/maxCol);
sprite.visible = true;
sprite.x = margin + col*itemWidth+(col-1)*mx;
sprite.y = margin + row*itemHeight+(row-1)*my;
};
PickerBase.prototype.deselectAll = function(){
var sprites = this._highlightSprites;
var length = sprites.length;
for(var i = 0; i<length; i=(i+1)|0){
var sprite = sprites[i];
sprite.parent.removeChild(sprite);
}
sprites.length = 0;
this._selectingIndexes.length = 0;
};
/* headerSprite
===================================*/
PickerBase.prototype.createHeaderSprite = function(){
var bitmap = new Bitmap(256,24);
var sprite = new Sprite(bitmap);
bitmap.fontSize = 21;
bitmap.textColor = 'white'
bitmap.outlineWidth = 6;
this.addChild(sprite);
this._headerSprite = sprite;
};
PickerBase.prototype.refreshHeaderSprite = function(){
var header = this.headerText();
this.showHeaderSprite(header);
};
PickerBase.prototype.showHeaderSprite = function(header,color='rgb(0,0,200)'){
if(header === this._header)return;
this._header = header;
var sprite = this._headerSprite;
var bitmap = sprite.bitmap;
bitmap.clear();
bitmap.outlineColor = color;
bitmap.drawText(header,1,0,bitmap.width-2,bitmap.height);
sprite.opacity = 255;
sprite.visible = true;
this.addChild(sprite);
};
PickerBase.prototype.updateHeaderSprite = function(){
if(this._headerSprite.opacity>200){
this._headerSprite.opacity -= 1;
}else{
this._headerSprite.opacity -= 5;
}
if(this._headerSprite.opacity<=0){
this._headerSprite.visible = false;
}
};
/* backSprite
===================================*/
PickerBase.prototype.createBackSprite = function(){
var sprite,bitmap;
bitmap = new Bitmap(16,16);
sprite = new Sprite(bitmap);
this.addChild(sprite);
this._backSprite = sprite;
sprite.opacity = 150;
bitmap.fillAll('black');
};
PickerBase.prototype.refreshBackSprite = function(){
var width = this._width;
var height = Graphics.height;
var sprite = this._backSprite;
sprite.scale.set(width/16,height/16);
};
/* highlight sprites
===================================*/
PickerBase.prototype.createHighlightBitmap = function(){
var bitmap = new Bitmap(16,16);
bitmap.fillAll('white');
this._highlightBitmap = bitmap;
};
PickerBase.prototype.createHighlightSprite = function(){
var itemHeight = this.itemHeight();
var itemWidth = this._width / this.maxColumns();
var bitmap = this._highlightBitmap;
var sprite = new Sprite(bitmap);
this.addChild(sprite);
sprite.opacity = 100;
sprite.scale.set(itemWidth/bitmap.width,itemHeight/bitmap.height);
return sprite;
};
/* guide sprite
===================================*/
PickerBase.prototype.createGuideSprite = function(){
var texts = this.guideTexts();
if(!texts)return;
var fontSize = 14;
var width = $gameSystem.isJapanese() ? 200 : 400;
var lineHeight = fontSize + 4;
var lines = texts.length;
var height = lineHeight*lines;
var bitmap = new Bitmap(width,height);
var sprite = new Sprite(bitmap);
this.addChild(sprite);
this._guideSprite = sprite;
sprite.anchor.set(0,1);
bitmap.fontSize = fontSize;
bitmap.fillAll('rgb(0,0,150,0.6)');
var y = 0;
var length = texts.length;
for(var i = 0; i<length; i=(i+1)|0){
var text = texts[i];
bitmap.drawText(text,1,y,width-2,lineHeight);
y += lineHeight;
};
};
/* scroll
===================================*/
PickerBase.prototype.setTopIndex = function(i){
var row = Math.floor(i/this.maxColumns());
var newRow = row.clamp(0,this._maxTopRow);
if(this._topRow === newRow)return;
this._topRow = newRow;
this.refreshPosition();
};
PickerBase.prototype.setTopRowNext = function(){
var index = (this._topRow-1)*this.maxColumns()
this.setTopIndex(index);
};
PickerBase.prototype.setTopRowPrevious = function(){
var index = (this._topRow+1)*this.maxColumns();
this.setTopIndex(index);
};
PickerBase.prototype.refreshPosition = function(){
var oldY = this.y
this.y = -this._topRow*this.itemHeight();
if(this._topRow!==0){
this.y -= PickerBase.LAYOUT.marginTopBottom;
}
var dy = this.y - oldY;
this._backSprite.y -= dy;
if(this._guideSprite){
this._guideSprite.y -= dy;
}
if(this._headerSprite){
this._headerSprite.y -= dy;
}
};
PickerBase.prototype.processInput = function(){
if(Input.isTriggered('ok')||Input.isTriggered('cancel')){
this.end();
}else if(Input.isRepeated('up')){
SoundManager.playCursor();
this.setTopRowNext();
}else if(Input.isRepeated('down')){
SoundManager.playCursor();
this.setTopRowPrevious();
}else if(Input.isRepeated('left')){
this.processPageDown();
}else if(Input.isRepeated('right')){
this.processPageUp();
}
};
PickerBase.prototype.processPageUp = function(){
SoundManager.playCursor();
if(this.maxCategories()>1){
this._topRow = 0;
var index = this._categoryIndex;
do{
index += 1;
if(index>=this.maxCategories()){
index = 0;
}
}while(index!==this._categoryIndex && !this.isCategoryValid(index));
this._categoryIndex = index;
this.refreshCategory();
}else{
this._topRow = Math.min(this._maxTopRow,this._topRow+this._dispRows);
this.refreshPosition();
}
};
PickerBase.prototype.processPageDown = function(){
SoundManager.playCursor();
if(this.maxCategories()>1){
this._topRow = 0;
var index = this._categoryIndex;
do{
index -= 1;
if(index<0){
index = this.maxCategories()-1;
}
}while(index!==this._categoryIndex && !this.isCategoryValid(index));
this._categoryIndex = index;
this.refreshCategory();
}else{
this._topRow = Math.max(0,this._topRow-this._dispRows);
this.refreshPosition();
}
};
PickerBase.prototype.refreshCategory = function(){
this.deselectAll();
this.refresh();
this.refreshPosition();
};
/* several mode
===================================*/
PickerBase.prototype.switchSelectingMode = function(){
this.setSeveralMode(!this._severalMode);
};
PickerBase.prototype.setSeveralMode = function(valid){
if(this._severalMode===valid)return;
this._severalMode = valid;
this.deselectAll();
};
/* wheel
===================================*/
PickerBase.prototype.registerWheelListener = function(){
var listener = this._onWheel.bind(this);
this._wheelListener = listener;
document.addEventListener('wheel', listener);
};
PickerBase.prototype.resignWheelListener = function(){
if(!this._wheelListener)return;
document.removeEventListener('wheel', this._wheelListener);
this._wheelListener = null;
};
PickerBase.prototype._onWheel = function(event) {
if(event.deltaY>0){
this.setTopRowNext();
}else if(event.deltaY<0){
this.setTopRowPrevious();
}
event.stopPropagation();
};
//=============================================================================
// ImagePickerBase
//=============================================================================
ParticleEditor.ImagePickerBase = function ImagePickerBase(){
this.initialize.apply(this, arguments);
};
var ImagePickerBase = ParticleEditor.ImagePickerBase;
ImagePickerBase.prototype = Object.create(PickerBase.prototype);
ImagePickerBase.prototype.constructor = ImagePickerBase;
ImagePickerBase.prototype.initialize = function() {
PickerBase.prototype.initialize.call(this);
};
ImagePickerBase.prototype.applyData = function(){
if(this._owner){
var imageName = this.imageName();
this._owner.didPickImage(imageName);
}
};
ImagePickerBase.prototype.imageName = function(){return '';};
//=============================================================================
// ImagePicker
//=============================================================================
ParticleEditor.ImagePicker = function ImagePicker(){
this.initialize.apply(this, arguments);
};
var ImagePicker = ParticleEditor.ImagePicker;
ImagePicker.MARGIN = 5;
ImagePicker.NAME_HEIGHT = 14;
ImagePicker.MAX_COL = 4;
ImagePicker.IMAGE_SIZE = 48;
ImagePicker.prototype = Object.create(ImagePickerBase.prototype);
ImagePicker.prototype.constructor = ImagePicker;
ImagePicker.prototype.initialize = function(){
ImagePickerBase.prototype.initialize.call(this);
this._imageNames = parameters.imageNames;
this._imageSize = this.imageSize();
this._imageSprites = [];
this._nameSprites = [];
};
/* overwrite setting
===================================*/
ImagePicker.prototype.maxItems = function(){
return this._imageNames.length;
};
ImagePicker.prototype.maxColumns = function(){
return ImagePicker.MAX_COL;
};
ImagePicker.prototype.itemHeight = function(){
var nameHeight = ImagePicker.NAME_HEIGHT;
return this.imageSize() + nameHeight;
};
ImagePicker.prototype.itemWidth = function(){
return this.imageSize();
};
ImagePicker.prototype.itemMarginX = function(){
return ImagePicker.MARGIN;
};
ImagePicker.prototype.itemMarginY = function(){
return 0;
};
ImagePicker.prototype.guideTexts = function(){
return [
LC('↑↓キー、マウスホイールでスクロール',142),
LC('決定キー、リスト外クリックで選択終了',143),
LC('長押しクリックで複数<=>単体選択切り替え',144)
];
};
ImagePicker.prototype.imageName = function(){
var name = '';
var indexes = this._selectingIndexes;
var length = indexes.length;
for(var i = 0; i<length; i=(i+1)|0){
if(i>0){
name += ',';
}
var index = indexes[i];
name += this._imageNames[index];
}
return name;
};
/* originalSetting
===================================*/
ImagePicker.prototype.imageSize = function(){
return ImagePicker.IMAGE_SIZE;
};
/* refresh
===================================*/
ImagePicker.prototype.refreshItems = function(){
var nameHeight = ImagePicker.NAME_HEIGHT;
var mx = this.itemMarginX();
var my = this.itemMarginY();
var margin = PickerBase.LAYOUT.marginTopBottom;
//images
var width = this._width;
var itemWidth = this.itemWidth();
var itemHeight = this.itemHeight();
var imageSize = this.imageSize();
var colW = itemWidth + mx;
var rowH = itemHeight + my;
var nameSprites = this._nameSprites;
var nameSprite,nameBitmap,bitmap,sprite;
var col = this.maxColumns();
var imageNames = this._imageNames;
var length = imageNames.length;
for(var i = 0; i<length; i=(i+1)|0){
var r = Math.floor(i/col);
var c = i%col;
if(c===0){
nameSprite = nameSprites[r];
if(!nameSprite){
nameBitmap = new Bitmap(width,nameHeight);
nameBitmap.fontSize = nameHeight-2;
nameSprite = new Sprite(nameBitmap);
this.addChild(nameSprite);
nameSprites[r] = nameSprite;
nameSprite.y = margin+imageSize+r*rowH;
}else{
nameSprite.bitmap.clear();
}
nameBitmap = nameSprite.bitmap;
}
var name = imageNames[i];
var x = margin+c*(colW);
var y = margin+r*(rowH);
bitmap = ImageManager.loadParticle(name);
sprite = new Sprite(bitmap);
this.addChild(sprite);
sprite.anchor.set(0.5,0.5);
sprite.x = x+imageSize/2;
sprite.y = y+imageSize/2;
this._imageSprites.push(sprite);
bitmap.addLoadListener(this._adjustSpriteScale.bind(this,sprite,itemWidth,itemHeight));
nameBitmap.drawText(name,x,0,imageSize,nameHeight,'center');
}
};
ImagePicker.prototype._adjustSpriteScale = function(sprite,width,height,bitmap){
if(sprite.bitmap !== bitmap)return;
var scale = Math.min(1,width/sprite.width,height/sprite.height);
sprite.scale.set(scale,scale);
};
/* start picking
===================================*/
ImagePicker.prototype.startPicking = function(owner,image){
ImagePickerBase.prototype.startPicking.call(this,owner);
if(image){
var images = image.split(',');
var length = images.length;
var validIndexes = [];
for(var i = 0; i<length; i=(i+1)|0){
var index = this._imageNames.indexOf(images[i]);
if(index>=0){
validIndexes.push(index);
}
}
length = validIndexes.length;
var severalMode = length>=2;
this.setSeveralMode(severalMode);
for(var i = 0; i<length; i=(i+1)|0){
var index = validIndexes[i];
this.setSelectingIndex(index);
}
}
};
/* search
===================================*/
ImagePicker.prototype.search = function(chara){
var names = this._imageNames;
var length = names.length;
for(var i = 0; i<length; i=(i+1)|0){
var name = names[i];
if(name[0] === chara){
this.didSuccessSearch(i);
return;
}
}
};
//=============================================================================
// TilePicker
//=============================================================================
ParticleEditor.TilePicker = function TilePicker(){
this.initialize.apply(this, arguments);
};
var TilePicker = ParticleEditor.TilePicker;
TilePicker.MAX_COL = 8;
TilePicker.TILE_SCALE = 0.5;
TilePicker.prototype = Object.create(ImagePickerBase.prototype);
TilePicker.prototype.constructor = ImagePicker;
TilePicker.prototype.initialize = function(){
ImagePickerBase.prototype.initialize.call(this);
this._bitmaps = this.tilesetBitmaps();
this._maxItems = 0;
this._tileSize = this.tileSize();
this._imageRows = 0;
this._imageCols = 0;
var scale = this.tileScale();
var sprite = new Sprite();
this._upperSprite = sprite;
this.addChild(sprite);
sprite.scale.set(scale,scale);
sprite = new Sprite();
this._lowerSprite = sprite;
this.addChild(sprite);
sprite.scale.set(scale,scale);
};
//PRAGMA: tilesetBitmaps
TilePicker.prototype.tilesetBitmaps = function(){
return SceneManager._scene._spriteset._tilemap._bitmaps;
};
//PRAGMA_END: tilesetBitmaps
/* overwrite setting
===================================*/
TilePicker.prototype.maxItems = function(){
return this._maxItems;
};
TilePicker.prototype.maxColumns = function(){
return TilePicker.MAX_COL;
};
TilePicker.prototype.itemHeight = function(){
return this.tileSize()*this.tileScale();
};
TilePicker.prototype.itemWidth = function(){
return this.tileSize()*this.tileScale();
};
TilePicker.prototype.itemMarginX = function(){
return 0;
};
TilePicker.prototype.itemMarginY = function(){
return 0;
};
TilePicker.prototype.guideTexts = function(){
return [
LC('1つのタイルセットのみから選択可',145),
LC('↑↓キー、マウスホイールでスクロール',146),
LC('←→キー、タイルセット切り替え',147),
LC('決定キー、リスト外クリックで選択終了',148),
LC('長押しクリックで複数<=>単体選択切り替え',149)
];
};
TilePicker.prototype.bitmapsImages = function(){
var bitmaps = this._bitmaps;
var images = [];
var length = bitmaps.length;
for(var i=0; i<length; i=(i+1)|0){
var bitmap = bitmaps[i];
if(bitmap){
images.push(this.imageNameForBitmap(bitmap));
}
}
return images;
};
TilePicker.prototype.imageNameForBitmap = function(bitmap){
var bitmapNameElems = bitmap._url.split('/');
var bitmapName = bitmapNameElems[bitmapNameElems.length-1].replace('.png','');
return bitmapName;
};
TilePicker.prototype.imageName = function(){
var bitmapIndex = this._categoryIndex;
var bitmapName = this.imageNameForBitmap(this._bitmaps[bitmapIndex]);
var name = '';
var indexes = this._selectingIndexes;
var length = indexes.length;
var rows = this._imageRows;
var cols = this.maxColumns();
var tilesetCols = ParticleEmitter.TILESET_COLUMNS;
var lowerSpriteIndex = rows*cols;
for(var i = 0; i<length; i=(i+1)|0){
if(i>0){
name += ',';
}
var index = indexes[i];
var tileIndex;
var c = index%cols;
var r = Math.floor(index/cols);
if(index>=lowerSpriteIndex){
c += cols;
r -= rows;
}
var tileIndex = r*tilesetCols+c;
// name += 'tile:'+bitmapIndex+':'+tileIndex;
name +='tile:'+bitmapName+':'+tileIndex;
}
return name;
};
TilePicker.prototype.categoryType = function(){
return this._categoryIndex;
};
TilePicker.prototype.maxCategories = function(){
return this._bitmaps ? this._bitmaps.length : 1;
};
TilePicker.prototype.isCategoryValid = function(index){
var bitmap = this._bitmaps[index];
if(!bitmap)return false;
return bitmap.width>=this.tileSize() && bitmap.height>=this.tileSize();
};
/* originalSetting
===================================*/
TilePicker.prototype.tileSize = function(){
return $gameMap.tileWidth();
};
TilePicker.prototype.tileScale = function(){
return TilePicker.TILE_SCALE;
};
/* refresh
===================================*/
TilePicker.prototype.setListType = function(type){
ImagePickerBase.prototype.setListType.call(this,type);
var tileSize = this.tileSize();
var bitmap = this.bitmap();
var width = bitmap.width;
var height = bitmap.height;
var imageCols = Math.floor(width/tileSize);
var imageRows = Math.floor(height/tileSize);
this._imageCols = imageCols;
this._imageRows = imageRows;
var maxCol = this.maxColumns();
var validCols = Math.ceil(imageCols/maxCol)*maxCol;
this._maxItems = validCols*imageRows;
};
TilePicker.prototype.refreshItems = function(){
var tileSize = this.tileSize();
var bitmap = this.bitmap();
var width = bitmap.width;
var height = bitmap.height;
var imageCols = Math.floor(width/tileSize);
var imageRows = Math.floor(height/tileSize);
var maxCol = this.maxColumns();
var margin = PickerBase.LAYOUT.marginTopBottom;
var sprite = this._upperSprite;
sprite.bitmap = bitmap;
sprite._frame.width = maxCol*tileSize;
sprite._refresh();
sprite.x = margin;
sprite.y = margin;
sprite = this._lowerSprite
sprite.visible = imageCols>maxCol
if(sprite.visible){
sprite.bitmap = bitmap;
sprite._frame.x = maxCol*tileSize;
sprite._refresh();
sprite.x = margin;
sprite.y = margin+height*this.tileScale();
}
};
TilePicker.prototype.bitmap = function(){
return this._bitmaps[this._categoryIndex];
};
/* start picking
===================================*/
TilePicker.prototype.startPicking = function(owner,imagestr){
var tileIndexes = [];
if(imagestr){
var images = imagestr.split(',');
var tilesetImages = this.bitmapsImages();
var bitmaps = this._bitmaps;
var tilesetIndex = -1;
var length = images.length;
for(var i = 0; i<length; i=(i+1)|0){
var image = images[i];
var setIndex = -1;
if(image.indexOf('tile:')===0){
var elems = image.split(':');
setIndex = tilesetImages.indexOf(elems[1]);
if(tilesetIndex<0){
tilesetIndex = setIndex;
}else if(tilesetIndex!==setIndex){
continue;
}
var tileIndex = Number(elems[2]);
tileIndexes.push(tileIndex)
}
}
this._categoryIndex = tilesetIndex;
};
if(this._categoryIndex<0){
this._categoryIndex = this._bitmaps.length>=6 ? 5 : 0;
}
ImagePickerBase.prototype.startPicking.call(this,owner);
var rows = this._imageRows;
var cols = this.maxColumns();
var tilesetCols = ParticleEmitter.TILESET_COLUMNS;
var lowerSpriteIndex = cols*rows;
var length = tileIndexes.length;
var severalMode = length>=2;
this.setSeveralMode(severalMode);
for(var i = 0; i<length; i=(i+1)|0){
var tileIndex = tileIndexes[i];
var col,row;
var col = tileIndex%tilesetCols;
var row = Math.floor(tileIndex/tilesetCols);
if(col >= cols){
row += rows;
col -= cols;
}
var index = row*cols + col;
this.setSelectingIndex(index);
}
};
//=============================================================================
// AnimationPicker
//=============================================================================
ParticleEditor.AnimationPicker = function AnimationPicker(){
this.initialize.apply(this, arguments);
};
var AnimationPicker = ParticleEditor.AnimationPicker;
AnimationPicker.MAX_COL = 5;
AnimationPicker.IMAGE_SCALE = 1/3;
AnimationPicker.prototype = Object.create(ImagePickerBase.prototype);
AnimationPicker.prototype.constructor = ImagePicker;
AnimationPicker.prototype.initialize = function(){
ImagePickerBase.prototype.initialize.call(this);
this._imageNames = parameters.animationNames;
this._monoTone = false;
this._maxItems = 0;
this._imageSize = this.imageSize();
this._imageRows = 0;
this._imageCols = 0;
this._bitmap = null;
this._useAutoCacheRealease = !!ImageManager._cache&&Utils.RPGMAKER_NAME==="MZ";
this._autoReleaseURL = null;;
var scale = this.imageScale();
var sprite = new Sprite();
this._imageSprite = sprite;
this.addChild(sprite);
sprite.scale.set(scale,scale);
};
/* overwrite setting
===================================*/
AnimationPicker.prototype.maxItems = function(){
return this._maxItems;
};
AnimationPicker.prototype.maxColumns = function(){
return AnimationPicker.MAX_COL;
};
AnimationPicker.prototype.itemHeight = function(){
return this.imageSize()*this.imageScale();
};
AnimationPicker.prototype.itemWidth = function(){
return this.imageSize()*this.imageScale();
};
AnimationPicker.prototype.itemMarginX = function(){
return 0;
};
AnimationPicker.prototype.itemMarginY = function(){
return 0;
};
AnimationPicker.prototype.guideTexts = function(){
return [
LC('1つのアニメーション画像のみから選択可',150),
LC('↑↓キー、マウスホイールでスクロール',151),
LC('←→キー、画像切り替え',152),
LC('キーボードで頭1文字をサーチ可能',153),
LC('決定キー、リスト外クリックで選択終了',154),
LC('長押しクリックで複数<=>単体選択切り替え',155),
LC('Shiftでモトーン切り替え',156),
LC('(モノトーンはピッカー終了時に反映)',157)
];
};
AnimationPicker.prototype.imageName = function(){
var imageName = this._imageNames[this._categoryIndex];
var name = ''
var indexes = this._selectingIndexes;
var length = indexes.length;
for(var i = 0; i<length; i=(i+1)|0){
if(i>0){
name += ',';
}
var index = indexes[i];
name +='ANIM:'+imageName+':'+index;
if(this._monoTone){
name += ':M';
}
}
return name;
};
AnimationPicker.prototype.headerText = function(){
var imageName = this._imageNames[this._categoryIndex];
var text = '【'+imageName+'】('+(this._categoryIndex+1)+'/'+this._imageNames.length+')';
return text;
};
AnimationPicker.prototype.categoryType = function(){
return this._categoryIndex;
};
AnimationPicker.prototype.maxCategories = function(){
return this._imageNames ? this._imageNames.length : 1;
};
AnimationPicker.prototype.isCategoryValid = function(index){
return !!this._imageNames[index];
};
/* originalSetting
===================================*/
AnimationPicker.prototype.imageSize = function(){
return 192;
};
AnimationPicker.prototype.imageScale = function(){
return AnimationPicker.IMAGE_SCALE;
};
/* refresh
===================================*/
AnimationPicker.prototype.setListType = function(type){
ImagePickerBase.prototype.setListType.call(this,type);
this._imageCols = 0;
this._imageRows = 0;
this._maxItems = 0;
var bitmap = this.bitmap();
this._bitmap = bitmap;
bitmap.addLoadListener(AnimationPicker.prototype._setListType.bind(this));
};
AnimationPicker.prototype._setListType = function(bitmap){
if(this._bitmap !== bitmap)return;
var imageSize = this.imageSize();
var width = bitmap.width;
var height = bitmap.height;
var imageCols = Math.floor(width/imageSize);
var imageRows = Math.floor(height/imageSize);
this._imageCols = imageCols;
this._imageRows = imageRows;
var maxCol = this.maxColumns();
var validCols = Math.ceil(imageCols/maxCol)*maxCol;
this._maxItems = validCols*imageRows;
this._refresh();
};
AnimationPicker.prototype.refreshItems = function(){
var imageSize = this.imageSize();
var bitmap = this.bitmap();
var width = bitmap.width;
var height = bitmap.height;
var imageCols = Math.floor(width/imageSize);
var imageRows = Math.floor(height/imageSize);
var maxCol = this.maxColumns();
var margin = PickerBase.LAYOUT.marginTopBottom;
var sprite = this._imageSprite;
sprite.bitmap = bitmap;
sprite._frame.width = maxCol*imageSize;
sprite._refresh();
sprite.x = margin;
sprite.y = margin;
};
AnimationPicker.prototype.bitmap = function(){
var imageName = this._imageNames[this._categoryIndex];
if(this._useAutoCacheRealease){
var folder = "img/animations/";
var url = folder + Utils.encodeURI(imageName) + ".png"
if(this._autoReleaseURL&&this._autoReleaseURL!==url){
this.tryReleaseAnimationImageCache();
}
if(!!ImageManager._cache[url]){
this._autoReleaseURL = url;
}
}
return ImageManager.loadAnimation(imageName);
};
AnimationPicker.prototype.tryReleaseAnimationImageCache = function(){
var url = this._autoReleaseURL;
if(url && ImageManager._cache[url]){
ImageManager._cache[url].destroy();
delete ImageManager._cache[url];
}
};
/* start picking
===================================*/
AnimationPicker.prototype.startPicking = function(owner,imagestr){
var frames = [];
if(imagestr){
var images = imagestr.split(',');
var length = images.length;
var index = -1;
for(var i = 0; i<length; i=(i+1)|0){
var image = images[i];
if(image.indexOf('ANIM:')===0){
var elems = image.split(':');
var animImage = elems[1];
if(index<0){
index = this._imageNames.indexOf(animImage);
}
var frame = Number(elems[2]);
frames.push(frame)
}
}
this._categoryIndex = index;
};
if(this._categoryIndex<0){
this._categoryIndex = 0;
}
ImagePickerBase.prototype.startPicking.call(this,owner);
var rows = this._imageRows;
var cols = this.maxColumns();
var length = frames.length;
var severalMode = length>=2;
this.setSeveralMode(severalMode);
for(var i = 0; i<length; i=(i+1)|0){
var frame = frames[i];
var col,row;
var col = frame%cols;
var row = Math.floor(frame/cols);
if(col >= cols){
row += rows;
col -= cols;
}
var index = row*cols + col;
this.setSelectingIndex(index);
}
};
/* search
===================================*/
AnimationPicker.prototype.search = function(chara){
var imageNames = this._imageNames;
var length = imageNames.length;
for(var i = 0; i<length; i=(i+1)|0){
var image = imageNames[i];
if(image[0].toLowerCase()===chara){
SoundManager.playCursor();
if(this._categoryIndex===i){
this._headerSprite.opacity = 255;
this._headerSprite.visible = true;
}else{
this._categoryIndex = i;
this._topRow = 0;
this.refreshCategory();
}
return;
}
}
};
/* MonoTone
===================================*/
AnimationPicker.prototype.update = function(){
PickerBase.prototype.update.call(this);
if(Input.isTriggered('shift')){
this.changeMonoTone();
}
};
AnimationPicker.prototype.changeMonoTone = function(){
if(PIXI.filters.ColorMatrixFilter){
this._monoTone = !this._monoTone;
SoundManager.playCursor();
if(this._monoTone){
var filter = new PIXI.filters.ColorMatrixFilter();
filter.saturate(-1);
this._imageSprite.filters = [filter];
}else{
this._imageSprite.filters = null;
}
}
};
/* write image
===================================*/
AnimationPicker.prototype.end = function(){
var indexes = this._selectingIndexes;
var imageName = this.imageName();
if(indexes.length>0){
this.writeImageFiles(indexes);
this.registerAnimationImageNames(imageName);
}
var owner = this._owner;
PickerBase.prototype.end.call(this);
if(owner && indexes.length>0){
owner.forceChangeImage(imageName);
owner.writeHelpFile();
}
};
AnimationPicker.prototype.registerAnimationImageNames = function(imageName){
var params = PluginManager._parameters.trp_particlelist;
if(!params){
params = PluginManager._parameters.trp_particlelist = {};
}
var animImages = params.animImages;
if(!animImages){
animImages = params.animImages = [];
}
var imageNames = imageName.split(',');
var length = imageNames.length;
for(var i = 0; i<length; i=(i+1)|0){
var image = imageNames[i];
if(!animImages.contains(image)){
animImages.push(image);
}
}
};
AnimationPicker.prototype.writeImageFiles = function(indexes){
var bitmap = this.bitmap();
var length = indexes.length;
for(var i = 0; i<length; i=(i+1)|0){
var index = indexes[i];
this.writeImageFile(bitmap,index);
}
};
AnimationPicker.prototype.writeImageFile = function(bitmap,index){
var size = this.imageSize();
var cols = this._imageCols;
var col = index%cols;
var row = Math.floor(index/cols);
var x = col*size;
var y = row*size;
var sprite = new Sprite(this._imageSprite.bitmap);
sprite.setFrame(x,y,size,size);
sprite.filters = this._imageSprite.filters;
var renderTexture = PIXI.RenderTexture.create(size,size);
//PRAGMA: renderAnimation
Graphics.app.renderer.render(sprite, renderTexture);
sprite.worldTransform.identity();
var canvas = Graphics.app.renderer.extract.canvas(renderTexture);
//PRAGMA_END: renderAnimation
var imageName = this._imageNames[this._categoryIndex];
imageName += '_'+index;
if(this._monoTone){
imageName+='_M';
}
var name = '_ANIM_'+imageName;
if(!parameters.splitAnimImageNames.contains(name)){
parameters.splitAnimImageNames.push(name);
}
var fs = require('fs');
var path = require('path');
var base = ParticleEditor.IMAGE_PATH;
var filePath = path.join(base,name+'.png');
var urlData = canvas.toDataURL('image/png')
var regex = (/^data:image\/png;base64,/);
var base64Data = urlData.replace(regex, "");
fs.writeFileSync(filePath, base64Data, 'base64');
renderTexture.destroy({ destroyBase: true });
};
//=============================================================================
// PresetPicker
//=============================================================================
ParticleEditor.PresetPicker = function PresetPicker(){
this.initialize.apply(this, arguments);
};
var PresetPicker = ParticleEditor.PresetPicker
PresetPicker.MARGIN = 5;
PresetPicker.ROW_HEIGHT = 20;
PresetPicker.COL_WIDTH = 300;
PresetPicker.COL_WIDTH_ENG = 380;
PresetPicker.MAX_COL = 1;
var TARGET_TYPES = ParticleEmitter.TARGET_TYPES;
PresetPicker.TARGET_NAMES = [];
PresetPicker.TARGET_NAMES[TARGET_TYPES.character] = 'character';
PresetPicker.TARGET_NAMES[TARGET_TYPES.walk] = 'walk';
PresetPicker.TARGET_NAMES[TARGET_TYPES.startdash] = 'startdash';
PresetPicker.TARGET_NAMES[TARGET_TYPES.attach] = 'character';
PresetPicker.TARGET_NAMES[TARGET_TYPES.tilemap] = 'tilemap';
PresetPicker.TARGET_NAMES[TARGET_TYPES.screen] = 'screen';
PresetPicker.TARGET_NAMES[TARGET_TYPES.weather] = 'weather';
PresetPicker.TARGET_NAMES[TARGET_TYPES.region] = 'region';
PresetPicker.TARGET_NAMES[TARGET_TYPES.actor] = 'actor';
PresetPicker.TARGET_NAMES[TARGET_TYPES.party] = 'party';
PresetPicker.TARGET_NAMES[TARGET_TYPES.enemy] = 'enemy';
PresetPicker.TARGET_NAMES[TARGET_TYPES.battle] = 'battle';
PresetPicker.TARGET_NAMES[TARGET_TYPES.battleWeather] = 'bWeather';
PresetPicker.TARGET_NAMES[TARGET_TYPES.click] = 'click';
PresetPicker.TARGET_NAMES[TARGET_TYPES.drag] = 'drag';
PresetPicker.TARGET_NAMES[TARGET_TYPES.picture] = 'picture';
PresetPicker.TARGET_NAMES[TARGET_TYPES.battlePicture] = 'picture';
PresetPicker.TARGET_NAMES[TARGET_TYPES.skit] = 'skit';
PresetPicker.TARGET_NAMES[TARGET_TYPES.battleSkit] = 'skit';
PresetPicker.TARGET_NAMES[TARGET_TYPES.attachActor] = 'actor';
PresetPicker.TARGET_NAMES[TARGET_TYPES.attachParty] = 'party';
PresetPicker.TARGET_NAMES[TARGET_TYPES.attachEnemy] = 'enemy';
// Game_Particle.TARGET_CATEGORIES = [['character','walk','tilemap','startdash'],['screen','weather','region'],['click','drag'],['others'],['hidden']];
// Game_Particle.CATEGORY_NAMES = ['character','screen','system','others','hidden'];
PresetPicker.CATEGORIES = Game_Particle.TARGET_CATEGORIES;
PresetPicker.CATEGORY_NAMES_EN = Game_Particle.CATEGORY_NAMES;
//dummySet > Scene_Boot.prototype.start
PresetPicker.CATEGORY_NAMES = [LC('キャラ対象',158),NLC('スクリーン/天候/リージョン',159,'screen/weather/region'),NLC('マウス/タップ',160,'click/drag'),LC('その他',161,'Others'),LC('非表示(/h)',162)];
PresetPicker.prototype = Object.create(PickerBase.prototype);
PresetPicker.prototype.constructor = PresetPicker;
PresetPicker.prototype.initialize = function(){
PickerBase.prototype.initialize.call(this);
this._list = [];
this._names = [];
this._contentsSprite = null;
this._allData = null;
this._allNames = null;
this._filterMode = '';
this._targetType = -1;
this._currentData = null;
this.createAllData();
this.createContentsSprite();
};
PresetPicker.prototype.createContentsSprite = function(){
var maxNum = 0;
var allData = this.allData();
var length = allData.length;
for(var i = 0; i<length; i=(i+1)|0){
var categoryData = allData[i];
maxNum = Math.max(maxNum,Object.keys(categoryData).length);
}
var width = this.itemWidth();
var height = this.itemHeight()*maxNum;
var bitmap = new Bitmap(width,height);
var sprite = new Sprite(bitmap);
this.addChild(sprite);
this._contentsSprite = sprite;
sprite.y = PickerBase.LAYOUT.marginTopBottom;
};
PresetPicker.prototype.rawData = function(){
return $dataTrpParticlePreset;
};
PresetPicker.prototype.createAllData = function(){
return this._createAllData(this.rawData());
};
PresetPicker.prototype._createAllData = function(database){
var allData = [];
var allNames = [];
this._allData = allData;
this._allNames = allNames;
PresetPicker.setCategoriedList(database,allData,allNames);
};
PresetPicker.setCategoriedList = function(database,allData,allNames){
var categoryLength = PresetPicker.CATEGORIES.length;
for(var i = 0; i<categoryLength; i=(i+1)|0){
allData.push([]);
allNames.push([]);
}
//add hidden category
var keys = Object.keys(database).sort();
var length = keys.length;
for(var i = 0; i<length; i=(i+1)|0){
var key = keys[i];
var data = database[key];
if(Array.isArray(data)){
data = Game_Particle.decompressConfigDataFromArray(data.concat());
}
if(Game_Particle.isIdHidden(key)){
allData[allData.length-1].push(data);
allNames[allNames.length-1].push(key);
}else{
var targetType = PresetPicker.TARGET_NAMES[data.targetType];
var pushed = false;
for(var j=0; j<categoryLength-1; j=(j+1)|0){
if(PresetPicker.CATEGORIES[j].contains(targetType)){
pushed = true;
allData[j].push(data);
allNames[j].push(key);
break;
}
}
if(!pushed){
allData[allData.length-2].push(data);
allNames[allNames.length-2].push(key);
}
}
}
};
PresetPicker.prototype.allData = function(){
return this._allData;
};
/* overwrite setting
===================================*/
PresetPicker.prototype.maxItems = function(){
return this._list.length;
};
PresetPicker.prototype.maxColumns = function(){
return PresetPicker.MAX_COL;
};
PresetPicker.prototype.itemHeight = function(){
return PresetPicker.ROW_HEIGHT;
};
PresetPicker.prototype.itemWidth = function(){
return $gameSystem.isJapanese() ? PresetPicker.COL_WIDTH : PresetPicker.COL_WIDTH_ENG;
};
PresetPicker.prototype.itemMarginX = function(){
return PresetPicker.MARGIN;
};
PresetPicker.prototype.itemMarginY = function(){
return 0;
};
PresetPicker.prototype.guideTexts = function(){
return [
LC('プリセットの設定を読み込みます。',163),
LC('↑↓キー、マウスホイールでスクロール',164),
LC('←→キー、カテゴリー切り替え',165),
LC('決定キー、リスト外クリックで選択終了',166)
];
};
PresetPicker.prototype.headerText = function(){
return '【'+PresetPicker.CATEGORY_NAMES[this._categoryIndex]+'】';
};
PresetPicker.prototype.categoryType = function(){
return this._categoryIndex;
};
PresetPicker.prototype.maxCategories = function(){
return PresetPicker.CATEGORIES.length;
};
PresetPicker.prototype.isCategoryValid = function(index){
return index===0 || (this._allData[index]&&this._allData[index].length>0);
}
PresetPicker.prototype.isSeveralModeValid = function(){return false};
PresetPicker.prototype.applyData = function(){
if(!this._owner)return;
var index = this._selectingIndexes[0];
var data = this._list[index];
if(!data)return;
var name = this._names[index];
this._owner.applyData(JsonEx.makeDeepCopy(data),name);
};
/* refresh
===================================*/
PresetPicker.prototype.setListType = function(type){
PickerBase.prototype.setListType.call(this,type);
var names = this._allNames[this._categoryIndex];
var list = this.allData()[this._categoryIndex];
if(this._filterMode){
names = names.concat();
list = list.concat();
var length = names.length;
for(var i=length-1; i>=0; i=(i-1)|0){
var data = list[i];
if(data){
var mode = data.emitterLifetime>0 ? 'play' : 'set';
if(this._filterMode!==mode){
list.splice(i,1);
names.splice(i,1);
}
}
}
}
this._names = names;
this._list = list;
};
PresetPicker.prototype.refreshItems = function(){
var width = this.itemWidth();
var lineHeight = this.itemHeight();
var list = this._list;
var length = list.length;
var height = lineHeight * length;
var bitmap = this._contentsSprite.bitmap;
bitmap.clear();
var margin = 5;
var names = this._names;
var length = list.length;
for(var i = 0; i<length; i=(i+1)|0){
var data = list[i];
var name = names[i];
var x = margin;
var y = i*lineHeight;
var elemWidth = 100;
bitmap.fontSize = lineHeight-3;
//name
bitmap.drawText(name,x,y,elemWidth,lineHeight);
x += elemWidth + margin;
//comment(target)
var text = data.comment;
if(!text){
text = PresetPicker.TARGET_NAMES[data.targetType]||null;
if(text){
text = '['+text+']';
}
}
if(text){
bitmap.drawText(text,x,y,width-x,lineHeight);
}
}
};
/* start picking
===================================*/
PresetPicker.prototype.startPicking = function(owner,targetType,currentData){
this._categoryIndex = 0;
this._currentData = currentData;
this._targetType = targetType;
this.deselectAll();
if(targetType>=0){
var typeName = PresetPicker.TARGET_NAMES[targetType];
var categories = PresetPicker.CATEGORIES;
var length = categories.length;
for(var i=0; i<length; i=(i+1)|0){
if(categories[i].contains(typeName)){
this._categoryIndex = i;
this.refreshCategory();
break;
}
}
}
PickerBase.prototype.startPicking.call(this,owner);
};
/* search
===================================*/
PresetPicker.prototype.search = function(chara){
var names = this._names;
var length = names.length;
for(var i = 0; i<length; i=(i+1)|0){
var name = names[i];
if(name[0] === chara){
this.didSuccessSearch(i);
return;
}
}
};
/* filter
===================================*/
PresetPicker.prototype.onKeyDown = function(keyCode,event){
if(keyCode === KEY_CODE.f && (event.ctrlKey||event.metaKey)){
this.changeFilterMode();
}else{
PickerBase.prototype.onKeyDown.call(this,keyCode,event);
}
};
PickerBase.prototype.changeFilterMode = function(){
var header;
if(this._filterMode==='set'){
this._filterMode = 'play';
header = LC('《フィルター=play用》',167);
}else if(this._filterMode==='play'){
this._filterMode = '';
header = LC('《フィルター=なし》',168);
}else{
this._filterMode = 'set';
header = LC('《フィルター=set用》',169);
}
this._listType = -1;
SoundManager.playCursor();
this.refreshCategory();
this.showHeaderSprite(header,'rgb(0,150,0)');
};
/* input
===================================*/
PresetPicker.prototype.processInput = function(){
if(Input.isRepeated('cancel')){
this._owner.applyData(this._currentData);
this.end();
}else if(Input.isRepeated('down')){
this.selectNext();
}else if(Input.isRepeated('up')){
this.selectPrevious();
}else{
PickerBase.prototype.processInput.call(this);
}
};
PresetPicker.prototype.selectNext = function(){
var index = this._selectingIndexes.length ? this._selectingIndexes[0] : -1;
index += 1;
if(index>=this.maxItems()){
SoundManager.playBuzzer();
return;
}
this.didPickData(index);
if(index > this._topRow+this._dispRows){
this.setTopRowPrevious();
}
};
PresetPicker.prototype.selectPrevious = function(){
var index = this._selectingIndexes.length ? this._selectingIndexes[0] : this.maxItems();
index -= 1;
if(index<0){
SoundManager.playBuzzer();
return;
}
this.didPickData(index);
if(index < this._topRow){
this.setTopRowNext();
}
};
//=============================================================================
// LoadPicker
//=============================================================================
ParticleEditor.LoadPicker = function LoadPicker(){
this.initialize.apply(this, arguments);
};
var LoadPicker = ParticleEditor.LoadPicker
LoadPicker.prototype = Object.create(PresetPicker.prototype);
LoadPicker.prototype.constructor = LoadPicker;
LoadPicker.prototype.initialize = function(){
PresetPicker.prototype.initialize.call(this);
};
LoadPicker.prototype.refreshItems = function(){
var width = this.itemWidth();
var lineHeight = this.itemHeight();
var list = this._list;
var length = list.length;
var height = lineHeight * length;
var bitmap = this._contentsSprite.bitmap;
bitmap.clear();
var margin = 5;
var names = this._names;
var length = list.length;
var today = new Date();
for(var i = 0; i<length; i=(i+1)|0){
var data = list[i];
var name = names[i];
var x = margin;
var y = i*lineHeight;
var elemWidth = 140;
bitmap.fontSize = lineHeight-3;
bitmap.drawText(name,x,y,elemWidth,lineHeight);
x += elemWidth + margin;
elemWidth = 60;
var text = PresetPicker.TARGET_NAMES[data.targetType]||null;
if(text){
bitmap.textColor = 'rgb(150,200,255)';
bitmap.fontSize -= 1;
bitmap.drawText(text,x,y,elemWidth,lineHeight)
bitmap.textColor = 'white';
bitmap.fontSize += 1;
}
x += elemWidth + margin;
elemWidth = 90;
bitmap.fontSize -= 2;
var comment = data.comment;
var text;
if(!comment){
text = '---';
}else if(isNaN(comment)){
text = '-'+comment+'-';
}else{
var dateNum = Number(comment);
var day = dateNum%100;
var month = Math.floor(dateNum/100)%100;
var year = 2000+Math.floor(dateNum/10000)%100;
var date = new Date(year,month-1,day);
var diff = today - date;
var diffDate = Math.floor(diff/(1000*60*60*24));
text = '-'+month+'/'+day;
if(diffDate===0)text += LC('(今日)-',171);
else if(diffDate===1)text += LC('(昨日)-',172);
else text += '('+diffDate+LC('日前)-',173);
}
text = text;
bitmap.drawText(text,x,y,elemWidth,lineHeight)
}
};
/* overwrite setting
===================================*/
LoadPicker.prototype.guideTexts = function(){
return [
LC('保存データ設定をコピーします。',174),
LC('マウスホイールでスクロール',175),
LC('↑↓キー、上下のデータを選択',181),
LC('←→キー、カテゴリー切り替え',176),
LC('決定キー、リスト外クリックで選択終了',177),
LC('対象は編集時に設定していた対象(参考用)。',178),
LC('deleteキー(macはfn+delete)でデータ削除',179),
LC('(データ削除は保存を行った時点で確定します)',180),
];
};
LoadPicker.prototype.rawData = function(){
return $dataTrpParticles;
};
/* delete
===================================*/
LoadPicker.prototype.onKeyDown = function(keyCode,event){
PresetPicker.prototype.onKeyDown.call(this,keyCode,event);
if(keyCode === KEY_CODE.delete){
this.processDelete();
}
};
LoadPicker.prototype.processDelete = function(){
if(this._selectingIndexes.length===0)return;
var index = this._selectingIndexes[0];
var key = this._names[index];
delete this.rawData()[key];
this._names.splice(index,1);
this._list.splice(index,1);
this.refreshItems();
this.deselectAll();
};
})();