//============================================================================= // TRP_ParticleMZ_Editor.js //============================================================================= /*: * @target MZ * @author Thirop * @plugindesc パーティクルデータの編集[開発用] * @base TRP_ParticleMZ * @orderAfter TRP_ParticleMZ * * @help * 【更新履歴】 * 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); 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; } if (event.ctrlKey || event.metaKey) { this._onControlKeyDown(event); } else if (!event.ctrlKey && !event.altKey) { this._keyCode = event.keyCode; this._key = event.key; } }; ParticleEditor.prototype._onControlKeyDown = function (event) { if (event.keyCode === KEY_CODE.s) { //save this.processSave(); } 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._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 () { if (this._saveButton.opacity < 255) return; this.executeSave(); SoundManager.playSave(); 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 () { 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 var name = this.targetData().name; $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(); }; })();