//============================================================================= // TRP_SkitMZ_DevPicker.js //============================================================================= // Copyright (c) 2020 Thirop //============================================================================= /*: * @target MZ * @author Thirop * @plugindesc 多層レイヤー使用時の表情データ作成 * @help * 開発用の表情ピッカーを呼び出すためのプラグインです。 * 「多層レイヤー」形式でのみ使用可能です。 * * * 【更新履歴】 * 1.09 2021/12/5 コマンドパラメータ名修正、ほか不具合修正 * 1.02 2021/6/21 サムネール調整時に範囲変更ができない不具合修正 * 1.01 2020/11/28 リスト画像書き出し失敗の不具合修正 * 1.00 2020/11/10 初版 * * @param defaultThumbWidth * @text サムネール幅 * @desc 表情サムネールのデフォルト横幅 * @default 116 * @type Number * * @param defaultThumbHeight * @text サムネール高さ * @desc 表情サムネールのデフォルト縦幅 * @default 116 * @type Number * * @param printCols * @text リスト画像列数 * @desc 表情リスト画像に並べる列の数 * @default 10 * @type Number * * @param printFooterHeight * @text リスト画像フッター高さ * @desc 表情リスト画像の表情IDを表示するフッターの高さ * @default 20 * @type Number * * @param printFooterColor * @text リスト画像フッター色 * @desc 表情リスト画像のフッターの背景色。デフォルト値はrgb(100,255,255) * @default rgb(100,255,255) * @type Number * * * @command picker * @text ピッカー呼び出し * @desc 表情ピッカーの呼び出し * * @arg charaName * @text キャラのフォルダ名 * @desc キャラのフォルダ名 * * @arg poseName * @text ポーズ名 * @desc ポーズ名 * @default normal * * @arg addFlag * @text 追加モード * @desc ON/trueにするとデータの追加モードで起動 * @type boolean * @default false */ //============================================================================= function TRP_SkitDevPicker(){}; TRP_SkitDevPicker.DIR_PATH = Skit.DATA_DIR_PATH; TRP_SkitDevPicker.FILE_PATH = TRP_SkitDevPicker.DIR_PATH+'/TRPSkitDevPickerData.json'; (function(){ "use strict"; if (!Utils.isNwjs() || !Utils.isOptionValid('test')){ return; } var pluginName = 'TRP_SkitMZ_DevPicker'; PluginManager.registerCommand(pluginName, "picker", function(args){ if(!TRP_CORE.skitParameters.useMultiLayer){ SoundManager.playBuzzer(); return; } TRP_SkitDevPicker.startPickExp(args.charaName,args.poseName,args.addFlag==='true'||args.addFlag===true); this.setWaitMode('skit'); }); var fs = require('fs'); var path = require('path'); var base = path.dirname(process.mainModule.filename); var dirPath = path.join(base, TRP_SkitDevPicker.DIR_PATH); StorageManager.fsMkdir(dirPath); var filePath = path.join(base, TRP_SkitDevPicker.FILE_PATH); if(!fs.existsSync(filePath)){ var file = '{}'; fs.writeFileSync(filePath,file); } filePath = path.join(base, Skit.EXP_FILE_PATH); if(!fs.existsSync(filePath)){ var file = '{}'; fs.writeFileSync(filePath,file); } DataManager._databaseFiles.push({ name:'$dataTrpSkitDev', src:'../'+TRP_SkitDevPicker.FILE_PATH }); var _DataManager_loadDataFile = DataManager.loadDataFile; DataManager.loadDataFile = function(name, src) { if(name==='$dataTrpSkitDev'){ src = src.replace('Test_',''); } _DataManager_loadDataFile.call(this,name,src); }; })(); (function(){ 'use strict'; if (!Utils.isNwjs() || !Utils.isOptionValid('test')){ return; } var parameters = null; var pluginName = 'TRP_SkitMZ_DevPicker'; var backspaceKey = Input.keyMapper[8]||'backspace'; Input.keyMapper[8] = backspaceKey; var blinkKey = Input.keyMapper[66]||'b'; Input.keyMapper[66] = blinkKey;//B var displayKey = Input.keyMapper[68]||'d'; Input.keyMapper[68] = displayKey;//D var guideKey = Input.keyMapper[71]||'g'; Input.keyMapper[71] = guideKey;//G var imageKey = Input.keyMapper[73]||'i'; Input.keyMapper[73] = imageKey;//I var lipSyncKey = Input.keyMapper[76]||'l'; Input.keyMapper[76] = lipSyncKey;//L var printKey = Input.keyMapper[80]||'p'; Input.keyMapper[80] = printKey;//P var reloadKey = Input.keyMapper[82]||'r'; Input.keyMapper[82] = reloadKey;//R var saveKey = Input.keyMapper[83]||'s'; Input.keyMapper[83] = saveKey;//S //============================================================================= // Scenes //============================================================================= var _Scene_Boot_start = Scene_Boot.prototype.start; Scene_Boot.prototype.start = function(){ TRP_SkitDevPicker.setup(); _Scene_Boot_start.call(this); }; //============================================================================= // Skit //============================================================================= var _Skit__processCommand = Skit.prototype._processCommand; Skit.prototype._processCommand = function(args,macroPos){ var skitCommand = args[0].toLowerCase(); switch(skitCommand){ case 'pickexp': case '表情ピッカー': TRP_SkitDevPicker.startPickExp(args[1],args[2],args[3]==='true'||args[3]==='t'); break; } _Skit__processCommand.call(this,args,macroPos); }; var _Skit_isBusy = Skit.prototype.isBusy; Skit.prototype.isBusy = function(){ if(_Skit_isBusy.call(this))return true; if(TRP_SkitDevPicker.isBusy())return true; return false; }; //============================================================================= // TRP_SkitDevPicker //============================================================================= TRP_SkitDevPicker._expPicker = null; TRP_SkitDevPicker.setup = function(){ parameters = JSON.parse(JSON.stringify(PluginManager.parameters(pluginName), function(key, value) { try { return JSON.parse(value); } catch (e) { try { if(value[0]==='['||value[0]==='{'){ if(value.contains(' ')){ return value; } return eval(value); }else if(!isNaN(value)){ return Number(value); }else if(value==='true'){ return true; }else if(value==='false'){ return false; }else{ return value; } } catch (e) { return value; } } })); }; TRP_SkitDevPicker.isBusy = function(){ return this._expPicker; }; /* config data ===================================*/ TRP_SkitDevPicker.prepareDevActor = function(name){ if($dataTrpSkitDev[name])return; $dataTrpSkitDev[name] = { poses:{}, }; }; TRP_SkitDevPicker.prepareDevPose = function(name,pose){ this.prepareDevActor(name); var actorData = $dataTrpSkitDev[name]; if(actorData.poses[pose])return; actorData.poses[pose] = { expressions:[], thumbnail:[ 0, 0, parameters.defaultThumbWidth||116, parameters.defaultThumbHeight||116, 1 ] } }; TRP_SkitDevPicker.loadDevPoseData = function(name,pose){ this.prepareDevPose(name,pose); return JsonEx.makeDeepCopy($dataTrpSkitDev[name].poses[pose]); }; TRP_SkitDevPicker.savePoseDevData = function(name,pose,data){ this.prepareDevPose(name,pose); $dataTrpSkitDev[name].poses[pose] = data; this.writeDevSaveData(); }; TRP_SkitDevPicker.writeDevSaveData = function(){ var file = JSON.stringify($dataTrpSkitDev); var fs = require('fs'); var path = require('path'); var base = path.dirname(process.mainModule.filename); var filePath = path.join(base, TRP_SkitDevPicker.FILE_PATH); fs.writeFileSync(filePath, file); }; /* expData ===================================*/ TRP_SkitDevPicker.prepareActor = function(name){ if($dataTrpSkit[name])return; $dataTrpSkit[name] = { poses:{} }; }; TRP_SkitDevPicker.preparePose = function(name,pose){ this.prepareActor(name); var actorData = $dataTrpSkit[name]; if(actorData.poses[pose])return; actorData.poses[pose] = { expressions:[], blinkKind:-1, blinkIds:null, lipSyncKind:-1, lipSyncIds:null, } }; TRP_SkitDevPicker.loadPoseData = function(name,pose){ this.preparePose(name,pose); return JsonEx.makeDeepCopy($dataTrpSkit[name].poses[pose]); }; TRP_SkitDevPicker.savePoseData = function(name,pose,data){ this.preparePose(name,pose); $dataTrpSkit[name].poses[pose] = data; this.writeSaveData(); }; TRP_SkitDevPicker.writeSaveData = function(){ var file = JSON.stringify($dataTrpSkit); var fs = require('fs'); var path = require('path'); var base = path.dirname(process.mainModule.filename); var filePath = path.join(base, Skit.EXP_FILE_PATH); fs.writeFileSync(filePath, file); }; /* exp picker ===================================*/ TRP_SkitDevPicker.startPickExp = function(actorName,pose='normal',addFlag=false){ if(this._expPicker){ SceneManager._scene.removeChild(this._expPicker); this._expPicker = null; } this.prepareDevPose(actorName,pose); var picker = new TRP_SkitExpPicker(actorName,pose,addFlag); this._expPicker = picker; SceneManager._scene.addChild(picker); }; TRP_SkitDevPicker.quitPicker = function(picker){ SceneManager._scene.removeChild(picker); Input.clear(); if(this._expPicker!==picker)return; this._expPicker = null; $gameMap._interpreter._waitMode = ''; } //============================================================================= // TRP_SkitExpPicker //============================================================================= function TRP_SkitExpPicker(){ this.initialize.apply(this, arguments); this.setup(); }; TRP_SkitExpPicker.prototype = Object.create(PIXI.Container.prototype); TRP_SkitExpPicker.prototype.constructor = TRP_SkitExpPicker; TRP_SkitExpPicker.prototype.initialize = function(name,pose='normal',addFlag=false) { PIXI.Container.call(this); this.width = Graphics.width; this.height = Graphics.height; Input.clear(); this.initMembers(); this._name = name; this._pose = pose; this._addMode = addFlag; this._baseBitmap = ImageManager.loadBust(this._name,this._pose); this._baseBitmap.smooth = true; this._guideSprite = new GuideSprite(); this.addChild(this._guideSprite); if(this.needsNaviSprite()){ this.createNaviSprite(); } this.registerWheelListener(); }; TRP_SkitExpPicker.prototype.needsNaviSprite = function(){ return true; }; TRP_SkitExpPicker.prototype.createNaviSprite = function(){ var fontSize = 24; var width = 104; var bitmap = new Bitmap(width,2*fontSize+4); var sprite = new Sprite(bitmap); this.addChild(sprite); bitmap.fillAll('rgb(0,0,0,0.5)'); sprite.anchor.set(1,0); sprite.x = Graphics.width; this._naviSprite = sprite; var bitmap = new Bitmap(width,2*fontSize+4); bitmap.fontSize = fontSize; bitmap.outlineWidth = 4; bitmap.textColor = 'white' bitmap.outlineColor = 'black'; var sprite = new Sprite(bitmap); sprite.anchor.set(1,0); this._naviSprite.addChild(sprite); this._naviContentsSprite = sprite; }; TRP_SkitExpPicker.prototype.setup = function(){ this.initGuide(); this._baseBitmap.addLoadListener(this.didLoadBitmap.bind(this)); }; TRP_SkitExpPicker.prototype.initGuide = function(){ this.showGuide(TRP_SkitExpPicker.GUIDE); }; TRP_SkitExpPicker.GUIDE = [ 'クリック:選択', '←/→:ページ移動', 'R:選択データのみ表示', 'BackSpace:すべてクリア', null, 'S:保存', 'D:サムネイル調整', 'I:リスト画像作成', 'P:二層レイヤー書き出し', 'B:まばたき設定', 'L:口ぱく設定', null, 'G:ガイドを隠す' ]; TRP_SkitExpPicker.prototype.didLoadBitmap = function(bitmap){ this._initialized = true; this.visible = true; var data = TRP_SkitDevPicker.loadDevPoseData(this._name,this._pose); var poseData = TRP_SkitDevPicker.loadPoseData(this._name,this._pose); this._poseDevData = data; this._poseData = poseData; this._savedExpressions = poseData.expressions.concat(); var thumb = data.thumbnail; this.readPartsVariations(); this.setupData(); this.createBackSprite(); this.createMatrixSprite(); this._thumbScale = thumb[4]; this._thumbX = thumb[0]; this._thumbY = thumb[1]; this._thumbW = thumb[2]; this._thumbH = thumb[3]; this.refreshLayout(); }; TRP_SkitExpPicker.prototype.processDevSave = function(){ SoundManager.playSave(); TRP_SkitDevPicker.savePoseDevData(this._name,this._pose,this._poseDevData); this.showInfo(TRP_SkitExpPicker.DEV_SAVE_INFO); }; TRP_SkitExpPicker.prototype.processSave = function(){ this._poseData.expressions = this.processExpressionData(); SoundManager.playSave(); TRP_SkitDevPicker.savePoseData(this._name,this._pose,this._poseData); this.showInfo(TRP_SkitExpPicker.SAVE_INFO); }; TRP_SkitExpPicker.DEV_SAVE_INFO = [ 'ピッカー用の設定を保存しました。' ]; TRP_SkitExpPicker.SAVE_INFO = [ '編集データを保存しました。' ]; TRP_SkitExpPicker.prototype.startPrintDoubleLayer = function(){ if(this._selectedIndexes.length===0){ SoundManager.playBuzzer(); return; } SoundManager.playSave(); this.printDoubleLayers(); }; TRP_SkitExpPicker.PRINT_DOUBLE_LEYAERS = [ '2層レイヤー方式の画像を「_exportフォルダ」に', '保存しました。', ]; TRP_SkitExpPicker.prototype.processPrintList = function(){ if(this._selectedIndexes.length===0){ SoundManager.playBuzzer(); return; } SoundManager.playSave(); this.printThumbnails(); this.showInfo(TRP_SkitExpPicker.PRINT_INFO); }; TRP_SkitExpPicker.PRINT_INFO = [ '表情サムネールリスト画像を「_exportフォルダ」に', '保存しました。', ]; TRP_SkitExpPicker.MIN_SIZE = 48; TRP_SkitExpPicker.prototype.refreshLayout = function(){ this.clampSize(); this._cols = Math.floor(Graphics.width / this._thumbW); this._rows = Math.floor(Graphics.height / this._thumbH); this._dispNum = this._cols*this._rows; this._maxPage = Math.ceil(this._data.length/this._dispNum)-1; this.refreshSprites(); this.setupPage(); this.addChild(this._guideSprite); }; TRP_SkitExpPicker.prototype.initMembers = function(){ this._initialized = false; this._name = ''; this._pose = ''; this._poseDevData = null; this._poseData = null; this._savedExpressions = null; this._thumbX = 0; this._thumbY = 0; this._thumbW = 0; this._thumbH = 0; this._thumbScale = 1; this._cols = 0; this._rows = 0; this._dispNum = 0; this._partsNum = 0; this._partsNums = []; this._partsOptionFlags = []; this._printingParts = 0; this._selectedIndexes = []; this._data = []; this._page = 0; this._maxPage = 0; this._baseBitmap = null; this._displaySettging = null; this._sprites = []; this._selectBitmap = null; this._selectSprites = []; this._selectSpritesCache = []; this._selectSpritesIndexMap = []; this._backSprite = null; this._matrixSprite = null; this._naviSprite = null; this._guideSprite = null; this._wheelListener = null; }; TRP_SkitExpPicker.prototype.readPartsVariations = function(){ var actorName = this._name; var pose = this._pose + '_'; var poseLen = pose.length; var fs = require('fs'); var path = require('path'); var base = path.dirname(process.mainModule.filename); var dirPath = path.join(base,'img/pictures/busts/'+this._name); var data = []; var optFlags = []; var files = fs.readdirSync(dirPath) var length = files.length; for(var i = 0; isize || h>size){ size *= 2; } var sizeChanged = bitmap && bitmap.width!==size; if(!bitmap || sizeChanged){ bitmap = new Bitmap(size,size) }else{ bitmap.clear(); } var lineWidth = 4; var m = 1; bitmap.fillRect(m,m,w-2*m,h-2*m,this._addMode ? 'blue' : 'red'); bitmap.clearRect(m+lineWidth,m+lineWidth,w- 2*m - 2*lineWidth, h- 2*m- 2*lineWidth); this._selectBitmap = bitmap; if(sizeChanged){ for(var sprite of this._selectSpritesCache){ sprite.bitmap = bitmap; sprite.setFrame(0,0,w,h); } } }; /* page ===================================*/ TRP_SkitExpPicker.prototype.registerWheelListener = function(){ var listener = this._onWheel.bind(this); this._wheelListener = listener; document.addEventListener('wheel', listener); }; TRP_SkitExpPicker.prototype.resignWheelListener = function(){ if(!this._wheelListener)return; document.removeEventListener('wheel', this._wheelListener); this._wheelListener = null; }; TRP_SkitExpPicker.WHEEL_DELTA = 4; TRP_SkitExpPicker.prototype._onWheel = function(event) { if(!this.visible)return; if(event.deltaY>TRP_SkitExpPicker.WHEEL_DELTA){ this.proceedPage(); }else if(event.deltaY<-TRP_SkitExpPicker.WHEEL_DELTA){ this.regressPage(); } event.stopPropagation(); }; TRP_SkitExpPicker.prototype.proceedPage = function(){ if(Input.isPressed('shift')){ this._page += 100; }else{ this._page += 1; } if(this._page>this._maxPage){ this._page = this._maxPage; SoundManager.playBuzzer(); return; } this.setupPage(); }; TRP_SkitExpPicker.prototype.regressPage = function(){ if(Input.isPressed('shift')){ this._page -= 100; }else{ this._page -= 1; } if(this._page<0){ this._page = 0; SoundManager.playBuzzer(); return; } this.setupPage(); }; TRP_SkitExpPicker.prototype.clear = function(){ this.setupData(true); this.setupPage() }; /* update ===================================*/ TRP_SkitExpPicker.prototype.update = function(){ if(!this.visible || !this._initialized)return; if(this._printingParts>0)return; var children = this.children; var length = children.length; for(var i = length-1; i>=0; i=(i-1)|0){ var child = children[i]; if(child && child.update)child.update(); } if(this._subPicker){ if(this._subPicker.isTerminated()){ this.finishSubPikcer(); } }else if(this._displaySettging){ this.updateDisplaySettingMode(); }else{ this.updateMain(); } }; TRP_SkitExpPicker.prototype.finishSubPikcer = function(){ var poseData = this._poseData; if(this._subPicker.processSave(poseData)){ var name = this._subPicker.pickerName(); this.showInfo([ name+TRP_SkitExpPicker.SUB_PICKER_COMPLETE_INFO_TEXT, TRP_SkitExpPicker.SUB_PICKER_COMPLETE_INFO_TEXT2 ]); } this.removeChild(this._subPicker); this._subPicker = null; }; TRP_SkitExpPicker.SUB_PICKER_COMPLETE_INFO_TEXT = 'の設定が完了しました。'; TRP_SkitExpPicker.SUB_PICKER_COMPLETE_INFO_TEXT2 = 'Sキーで保存時に設定内容を保存します。'; TRP_SkitExpPicker.prototype.updateMain = function(){ if(Input._latestButton){ this.updateInput(); }else if(TouchInput.isCancelled()){ this.proceedPage(); } if(TouchInput.isTriggered()){ this.trySelect(); } if(this._naviSprite.opacity > 0){ this._naviSprite.opacity -= 2; if(this._naviSprite.opacity < 230){ this._naviSprite.opacity -= 5; } } }; TRP_SkitExpPicker.prototype.updateInput = function(){ if(Input.isTriggered('left')){ this.regressPage(); }else if(Input.isTriggered('right')){ this.proceedPage(); }else if(Input.isTriggered('ok')){ this.processOk(); }else if(Input.isTriggered('cancel')){ this.processQuit(); }else if(Input.isTriggered(backspaceKey)){ this.processCancel(); }else{ this.updateExInput(); } }; TRP_SkitExpPicker.prototype.updateExInput = function(){ if(Input.isTriggered(reloadKey)){ this.trimData(); }else if(Input.isTriggered(saveKey)){ this.processSave(); }else if(Input.isTriggered(displayKey)){ SoundManager.playCursor(); this.startDisplaySetting(); }else if(Input.isTriggered(blinkKey)){ SoundManager.playCursor(); this.startBlinkPicker(); }else if(Input.isTriggered(imageKey)){ this.processPrintList(); }else if(Input.isTriggered(printKey)){ this.startPrintDoubleLayer(); }else if(Input.isTriggered(lipSyncKey)){ SoundManager.playCursor(); this.startLipSyncPicker(); } }; TRP_SkitExpPicker.prototype.processOk = function(){ this.proceedPage(); }; TRP_SkitExpPicker.prototype.processCancel = function(){ SoundManager.playCancel(); this.clear(); }; /* trim ===================================*/ TRP_SkitExpPicker.prototype.trimData = function(){ if(this._selectedIndexes.length===0){ SoundManager.playBuzzer(); return; } var data = this._data = this._data.concat(); var length = data.length; var trimNum = 0; for(var i=0; i{return a-b}); var length = selected.length; var str = '['; for(var i = 0; i0){ str += ','; } str += '"'+String(data).replace(/,/gi,' ')+'"'; } str += ']'; this.copyToClipboard(str); return expressions; }; TRP_SkitExpPicker.prototype.copyToClipboard = function(string){ var listener = function(e){ e.clipboardData.setData("text/plain" , string); e.preventDefault(); document.removeEventListener("copy", listener); } document.addEventListener("copy" , listener); document.execCommand('copy'); }; /* setup ===================================*/ TRP_SkitExpPicker.prototype.setupData = function(noLoad){ this._data.length = 0; this._selectedIndexes.length = 0; var maxParts = this._partsNums; var typeLen = maxParts.length; var options = this._partsOptionFlags; var idxes = []; for(var i=0; i=2){ idxes[1] += 1; if(options[1] && idxes[1]===0){ idxes[1]=1; } }else{ idxes[0] += 1; } for(var i=0; imaxParts[i]){ idxes[i] = options[i] ? -1 : 0; if(i===typeLen-1){ idxes[0] += 1; if(idxes[0]<=0)idxes[0] = 1; }else{ idxes[i+1] += 1; if(idxes[i+1]<=0)idxes[i+1] = 1; } } } }; this._data.push(idxes); var saveData = this._poseData.expressions; if(!noLoad && saveData){ var length = this._data.length; var saveLen = saveData.length; for(var i=0; i this._cols || row > this._rows)return; var baseIdx = this._page*this._dispNum; var index = col+row*this._cols; var realIndex = baseIdx + index; if(realIndex>=this._data.length){ SoundManager.playBuzzer(); return; } this.didSelect(index,realIndex); }; TRP_SkitExpPicker.prototype.didSelect = function(index,realIndex){ if(this._selectedIndexes.contains(realIndex)){ this.hideSelectSprite(index); var idx = this._selectedIndexes.indexOf(realIndex); this._selectedIndexes.splice(idx,1); }else{ this.showSelectSprite(index); this._selectedIndexes.push(realIndex); this._selectedIndexes.sort((a,b)=>{return a-b}); } this.refreshSelectedNumNavi(); }; TRP_SkitExpPicker.prototype.showSelectSprite = function(index){ var col = index%this._cols; var row = Math.floor(index/this._cols); var sprite = this._selectSpritesCache.pop(); if(!sprite){ sprite = new Sprite(this._selectBitmap); this.addChild(sprite); } sprite.x = col * this._thumbW; sprite.y = row * this._thumbH; sprite.setFrame(0,0,this._thumbW,this._thumbH); sprite.visible = true; this._selectSprites.push(sprite); this._selectSpritesIndexMap.push(index); }; TRP_SkitExpPicker.prototype.hideSelectSprite = function(index){ var sprIndex = this._selectSpritesIndexMap.indexOf(index); var sprite = this._selectSprites[sprIndex]; this._selectSprites.splice(sprIndex,1); this._selectSpritesIndexMap.splice(sprIndex,1); this._selectSpritesCache.push(sprite); sprite.visible = false; }; TRP_SkitExpPicker.prototype.refreshSelectedNumNavi = function(refreshPage=false){ if(!this._naviSprite)return; this._naviSprite.opacity = 255; this.addChild(this._naviSprite); var sprite = this._naviContentsSprite; var bitmap = sprite.bitmap; var text; if(refreshPage){ bitmap.clearRect(0,0,bitmap.width,bitmap.height/2); bitmap._baseTexture.update(); text = this._page + '/' + this._maxPage; bitmap.drawText(text,2,0,bitmap.width-4,bitmap.height/2,'right'); } bitmap.clearRect(0,bitmap.height/2,bitmap.width,bitmap.height/2); text = '<'; if(this._addMode){ text += this._savedExpressions.length+'+'; } text += this._selectedIndexes.length+'>'; bitmap.drawText(text,2,bitmap.height/2,bitmap.width-4,bitmap.height/2,'right'); }; /* guide ===================================*/ TRP_SkitExpPicker.prototype.showGuide = function(guide,color){ this._guideSprite.setTexts(guide,color); this.addChild(this._guideSprite); }; /* adjust display ===================================*/ TRP_SkitExpPicker.GUIDE_DISPLAY_SETTING = [ 'カーソル:移動', 'shift+カーソル:移動(大)', 'ctrl/opt+カーソル:サイズ変更', 'Q/W:縮小・拡大', null, 'Enter:保存', 'Esc:キャンセル', null, 'G:ガイドを隠す' ]; TRP_SkitExpPicker.prototype.startDisplaySetting = function(){ this._displaySettging = [this._thumbX,this._thumbY,this._thumbW,this._thumbH,this._thumbScale]; this.showGuide(TRP_SkitExpPicker.GUIDE_DISPLAY_SETTING,'rgba(155,0,0,0.6)'); }; TRP_SkitExpPicker.prototype.cancelDisplaySettingMode = function(){ this._thumbX = this._displaySettging[0]; this._thumbY = this._displaySettging[1]; this._thumbW = this._displaySettging[2]; this._thumbH = this._displaySettging[3]; this._thumbScale = this._displaySettging[4]; this._displaySettging = null; this.refreshLayout(); SoundManager.playCancel(); this.showGuide(TRP_SkitExpPicker.GUIDE); }; TRP_SkitExpPicker.prototype.finishDisplaySettingMode = function(){ this._displaySettging = null; SoundManager.playOk(); this._poseDevData.thumbnail = [ this._thumbX, this._thumbY, this._thumbW, this._thumbH, this._thumbScale ]; this.processDevSave(); this.showGuide(TRP_SkitExpPicker.GUIDE); }; TRP_SkitExpPicker.prototype.updateDisplaySettingMode = function(){ if(Input._latestButton){ if(Input.isTriggered('ok')){ this.finishDisplaySettingMode(); }else if(Input.isTriggered('cancel')){ this.cancelDisplaySettingMode(); }else if(Input.isRepeated('left')){ if(Input.isPressed('control')){ this.adjustSize(-1,0); }else{ this.movePosition(1,0); } }else if(Input.isRepeated('right')){ if(Input.isPressed('control')){ this.adjustSize(1,0); }else{ this.movePosition(-1,0); } }else if(Input.isRepeated('up')){ if(Input.isPressed('control')){ this.adjustSize(0,-1); }else{ this.movePosition(0,1); } }else if(Input.isRepeated('down')){ if(Input.isPressed('control')){ this.adjustSize(0,1); }else{ this.movePosition(0,-1); } }else if(Input.isRepeated('pageup')){ this.adjustScale(-0.1); }else if(Input.isRepeated('pagedown')){ this.adjustScale(0.1); } } }; TRP_SkitExpPicker.prototype.movePosition = function(dx,dy,noRefresh=false){ if(Input.isPressed('shift')){ dx *= 10; dy *= 10; } this._thumbX = this._thumbX + dx; this._thumbY = this._thumbY + dy; if(!noRefresh){ this.setupSkitSprites(); } }; TRP_SkitExpPicker.prototype.adjustSize = function(dw,dh){ if(Input.isPressed('shift')){ dw *= 10; dh *= 10; } this._thumbW += dw; this._thumbH += dh; this.refreshLayout(); }; TRP_SkitExpPicker.prototype.adjustScale = function(delta){ if(Input.isPressed('shift')){ delta *= 2; } this._thumbScale = Math.max(0.1,this._thumbScale+delta); this.setupSkitSprites(); }; /* quit ===================================*/ TRP_SkitExpPicker.prototype.processQuit = function(){ TRP_SkitDevPicker.quitPicker(this); }; /* info ===================================*/ TRP_SkitExpPicker.prototype.showInfo = function(texts){ var sprite = new InfoSprite(texts); this.addChild(sprite); }; /* pring double layer images ===================================*/ TRP_SkitExpPicker.prototype.printDoubleLayers = function(){ var maxParts = this._partsNums; var options = this._partsOptionFlags; var num = 0; var length = maxParts.length; for(var i = 0; i0)return; this._printingParts = 0; var name = 'thumbnail_'+this._name+'_'+this._pose+'.png'; var dirPath = TRP_SkitExpPicker.EXPORT_PATH; StorageManager.fsMkdir(dirPath); var fs = require('fs'); var path = require('path'); var filePath = path.join(dirPath,name); var urlData = bitmap._canvas.toDataURL('image/png') var regex = (/^data:image\/png;base64,/); var base64Data = urlData.replace(regex, ""); fs.writeFileSync(filePath, base64Data, 'base64'); }; /* blink picker ===================================*/ TRP_SkitExpPicker.prototype.startBlinkPicker = function(){ this._subPicker = new BlinkPicker(this._name,this._pose); this.addChild(this._subPicker); }; /* lipSync picker ===================================*/ TRP_SkitExpPicker.prototype.startLipSyncPicker = function(){ this._subPicker = new LipSyncPicker(this._name,this._pose); this.addChild(this._subPicker); }; //============================================================================= // InfoSprite //============================================================================= function InfoSprite(){ this.initialize.apply(this, arguments); }; InfoSprite.prototype = Object.create(Sprite.prototype); InfoSprite.prototype.constructor = InfoSprite; InfoSprite.prototype.initialize = function(texts){ Sprite.prototype.initialize.call(this); var width = Math.min(Graphics.width,512); var lineHeight = 24; var length = texts.length; var height = lineHeight * length; var bitmap = new Bitmap(width,height); this.bitmap = bitmap; bitmap.fontSize = lineHeight-6; bitmap.outlineColor = 'black'; var x = 0; var margin = 30; for(var i = 0; i=120){ this.opacity -= 26; if(this.opacity===0){ this.parent.removeChild(this); } } }; //============================================================================= // GuideSprite //============================================================================= function GuideSprite(){ this.initialize.apply(this, arguments); } GuideSprite.prototype = Object.create(Sprite.prototype); GuideSprite.prototype.constructor = GuideSprite; GuideSprite.LINE_HEIGHT = 20; GuideSprite.prototype.initialize = function() { Sprite.prototype.initialize.call(this); var bitmap = new Bitmap(256,256); this.bitmap = bitmap; this._texts = null; this._folding = false; this._backColor = 'rgba(0,0,0,0.5)'; bitmap.fontSize = GuideSprite.LINE_HEIGHT - 4; bitmap.outlineWidth = 3; bitmap.outlineColor = 'black'; }; GuideSprite.prototype.setTexts = function(texts,color='rgba(0,0,0,0.5)'){ this._backColor = color; if(!texts){ this._texts = null; this.vibible = false; return; }else if(this._texts && texts.equals(this._texts)){ return; }else{ this._texts = texts; if(!this._folding){ this.refreshTexts(texts); } } }; GuideSprite.prototype.refreshTexts = function(texts){ var bitmap = this.bitmap; bitmap.clear(); var lineHeight = GuideSprite.LINE_HEIGHT; var x = 0; var y = 0; var length = texts.length; for(var i = 0; i1){ text += ','; } text += i+1; } text += '>'; bitmap.fontSize = bitmap.height-2; bitmap.textColor = 'rgb(0,0,255)'; bitmap.outlineWidth = 5; bitmap.outlineColor = 'white'; bitmap.drawText(text,1,0,bitmap.width-2,bitmap.height,'right'); }; SubPicker.prototype.processOk = function(){ if(this.isKindPickerMode()){ SoundManager.playBuzzer(); }else{ this.executeOk(); } }; SubPicker.prototype.executeOk = function(){ SoundManager.playOk(); this.completed = true; this._terminated = true; }; SubPicker.prototype.processSave = function(poseData){ if(this.completed){ var data = this.processExpressionData(); this._processSave(poseData,data); return true; }else{ return false; } }; //============================================================================= // BlinkPicker //============================================================================= function BlinkPicker(){ this.initialize.apply(this, arguments); this.setup(); }; BlinkPicker.prototype = Object.create(SubPicker.prototype); BlinkPicker.prototype.constructor = BlinkPicker; BlinkPicker.prototype.initialize = function(name,pose){ var sequenceMode = true; SubPicker.prototype.initialize.call(this,name,pose,sequenceMode); }; BlinkPicker.prototype.pickerName = function(){ return 'まばたきピッカー'; }; BlinkPicker.prototype._processSave = function(poseData,data){ var kind = -1; var ids = null; var length = data.length; if(length>0){ kind = this._kind; ids = []; var kindIdx = kind-1; for(var i = 0; i0){ kind = this._kind; ids = []; var kindIdx = kind-1; for(var i = 0; i