/*: * @plugindesc * @author 奏ねこま(おとぶき ねこま) * * @param Spine File * @type string[] * @default * @desc Spineファイル(*.json)の場所を指定してください。 * * @help */ var Imported = Imported || {}; var Makonet = Makonet || {}; const plugin = 'JsScript18Set'; Imported[plugin] = true; Makonet[plugin] = {}; const $mpi = Makonet[plugin]; $mpi.parameters = PluginManager.parameters(plugin); $mpi.spineFiles = eval($mpi.parameters['Spine File']); $mpi.spineData = {}; (function(){ 'use strict'; let element = document.createElement('script'); element.type = 'text/javascript'; element.src = 'js/libs/pixi-spine.js'; document.body.appendChild(element); (function loadSpine() { let loader = new PIXI.loaders.Loader(); $mpi.spineFiles.forEach(function(file) { let name = file.replace(/^.*\//, '').replace(/\.json$/, ''); $mpi.spineData[name] = null; loader = loader.add(name, 'img/spines/' + file.replace(/^\//, '').replace(/\.json$/, '') + '.json'); }); loader.load(function(loader, resource) { Object.keys(resource).forEach(function(key) { if (resource[key].spineData) { $mpi.spineData[key] = resource[key].spineData; } }); if (Object.keys($mpi.spineData).some(function(key) { return !$mpi.spineData[key]; })) { loader.reset(); loadSpine(); } } ); }()); class MosaicFilter extends PIXI.Filter { constructor(size = 10) { let fragment = 'precision mediump float;varying vec2 vTextureCoord;uniform vec2 size;uniform sampler2D uSampler;uniform vec4 filterArea;vec2 mapCoord(vec2 coord){coord*=filterArea.xy;coord+=filterArea.zw;return coord;}vec2 unmapCoord(vec2 coord){coord-=filterArea.zw;coord/=filterArea.xy;return coord;}vec2 pixelate(vec2 coord, vec2 size){return floor(coord / size) * size;}void main(void){vec2 coord=mapCoord(vTextureCoord);coord=pixelate(coord, size);coord=unmapCoord(coord);gl_FragColor=texture2D(uSampler, coord);}'; super(null, fragment); this.uniforms.size = [size, size]; } } PIXI.filters.MosaicFilter = MosaicFilter; function convertVariables(text) { if (typeof(text) !== 'string') return text; let pattern = '\\\\v\\[(\\d+)\\]'; while (text.match(RegExp(pattern, 'i'))) { text = text.replace(RegExp(pattern, 'gi'), function(){ return $gameVariables.value(+arguments[1]); }); } return text; } { let __isReady = Scene_Boot.prototype.isReady; Scene_Boot.prototype.isReady = function() { return __isReady.apply(this, arguments) && Object.keys($mpi.spineData).every(function(key) { return !!$mpi.spineData[key]; }); }; } { let __initialize = Game_Temp.prototype.initialize; Game_Temp.prototype.initialize = function() { __initialize.apply(this, arguments); this._MSS_Spines = {}; }; } { let __pluginCommand = Game_Interpreter.prototype.pluginCommand; Game_Interpreter.prototype.pluginCommand = function(command, args) { __pluginCommand.apply(this, arguments); command = command.toLowerCase(); switch (command) { case 'showspine': var name = convertVariables(args[0]) || ''; var animation = convertVariables(args[1]) || ''; var loop = (convertVariables(args[2]) || 'true').toLowerCase() === 'true'; $gameTemp._MSS_SpineActions = [{ name: name, animation: animation, loop: loop, type: 0 }]; break; case 'setspineanimation': case 'addspineanimation': var id = Number(convertVariables(args[0])) || 0; var animation = convertVariables(args[1]) || ''; var loop = (convertVariables(args[2]) || 'true').toLowerCase() === 'true'; var picture = (id > 0) ? $gameScreen.picture(id) : null; var type = (command === 'setspineanimation') ? 0 : 1; if (picture && picture._MSS_IsSpine) { if (!picture._MSS_SpineActions) { picture._MSS_SpineActions = []; } picture._MSS_SpineActions.push({ animation: animation, loop: loop, type: type }); } break; case 'setspinemix': var id = Number(convertVariables(args[0])) || 0; var from = convertVariables(args[1]) || ''; var to = convertVariables(args[2]) || ''; var duration = Number(convertVariables(args[3])) || 0; var picture = (id > 0) ? $gameScreen.picture(id) : null; if (picture && picture._MSS_IsSpine) { if (!picture._MSS_SpineActions) { picture._MSS_SpineActions = []; } picture._MSS_SpineActions.push({ from: from, to: to, duration: duration, type: 2 }); } break; case 'setspineskin': var id = Number(convertVariables(args[0])) || 0; var skin = convertVariables(args[1]) || ''; var picture = (id > 0) ? $gameScreen.picture(id) : null; if (picture && picture._MSS_IsSpine) { if (!picture._MSS_SpineActions) { picture._MSS_SpineActions = []; } picture._MSS_SpineActions.push({ skin: skin, type: 3 }); } break; case 'addspineskin': var id = Number(convertVariables(args[0])) || 0; var skin = convertVariables(args[1]) || ''; var picture = (id > 0) ? $gameScreen.picture(id) : null; if (picture && picture._MSS_IsSpine) { if (!picture._MSS_SpineActions) { picture._MSS_SpineActions = []; } picture._MSS_SpineActions.push({ skin: skin, type: 11 }); } break; case 'setspinetimescale': var id = Number(convertVariables(args[0])) || 0; var timescale = Number(convertVariables(args[1])) || 1; var picture = (id > 0) ? $gameScreen.picture(id) : null; if (picture && picture._MSS_IsSpine) { if (!picture._MSS_SpineActions) { picture._MSS_SpineActions = []; } picture._MSS_SpineActions.push({ timescale: timescale, type: 4 }); } break; case 'setspinecolor': var id = Number(convertVariables(args[0])) || 0; var red = Number(convertVariables(args[1])) || 0; var green = Number(convertVariables(args[2])) || 0; var blue = Number(convertVariables(args[3])) || 0; var alpha = Number(convertVariables(args[4])) || 0; var picture = (id > 0) ? $gameScreen.picture(id) : null; if (picture && picture._MSS_IsSpine) { if (!picture._MSS_SpineActions) { picture._MSS_SpineActions = []; } picture._MSS_SpineActions.push({ color: { red: red, green: green, blue: blue, alpha: alpha }, type: 5 }); } break; case 'setspinerandomanimation': case 'addspinerandomanimation': case 'setspinerandomanimationex': case 'addspinerandomanimationex': var id = Number(convertVariables(args[0])) || 0; var animations = convertVariables(args[1]) || ''; var loop = (convertVariables(args[2]) || 'true').toLowerCase() === 'true'; var picture = (id > 0) ? $gameScreen.picture(id) : null; var type = 6 + (/^add/.test(command) ? 1 : 0) + (/ex$/.test(command) ? 2 : 0); if (picture && picture._MSS_IsSpine) { if (!picture._MSS_SpineActions) { picture._MSS_SpineActions = []; } picture._MSS_SpineActions.push({ animations: animations, loop: (type <= 7) ? loop : false, type: type }); } break; case 'setspinemosaic': var id = Number(convertVariables(args[0])) || 0; var image = convertVariables(args[1]) || ''; var size = Number(convertVariables(args[2])) || 1; var picture = (id > 0) ? $gameScreen.picture(id) : null; if (picture && picture._MSS_IsSpine) { if (!picture._MSS_SpineActions) { picture._MSS_SpineActions = []; } picture._MSS_SpineActions.push({ image: image, size: size, type: 10 }); } break; } }; } { let __showPicture = Game_Screen.prototype.showPicture; Game_Screen.prototype.showPicture = function(pictureId, name, origin, x, y, scaleX, scaleY, opacity, blendMode) { let spineAnimations = $gameTemp._MSS_SpineActions; if (spineAnimations) { name = ''; } __showPicture.call(this, pictureId, name, origin, x, y, scaleX, scaleY, opacity, blendMode); let picture = this._pictures[this.realPictureId(pictureId)]; if (spineAnimations) { picture._MSS_SpineActions = spineAnimations; picture._MSS_IsSpine = true; delete $gameTemp._MSS_SpineActions; } else { picture._MSS_IsSpine = false; } }; } { let __update = Sprite_Picture.prototype.update; Sprite_Picture.prototype.update = function() { let picture = this.picture(); if (!picture || !picture._MSS_IsSpine) { if (this._MSS_Spine) { this.removeChild(this._MSS_Spine); delete this._MSS_Spine; } let realPictureId = $gameScreen.realPictureId(this._pictureId); if ($gameTemp._MSS_Spines[realPictureId]) { delete $gameTemp._MSS_Spines[realPictureId]; } if (picture) { delete picture._MSS_SpineName; delete picture._MSS_SpineAnimationList; delete picture._MSS_SpineMixList; delete picture._MSS_SpineSkin; delete picture._MSS_SpineTimeScale; delete picture._MSS_SpineStart; delete picture._MSS_SpinePause; delete picture._MSS_SpineColor; delete picture._MSS_SpineRandomAnimationList; delete picture._MSS_SpineMosaicList; } } let update = Sprite.prototype.update; if (this._MSS_Spine) { Sprite.prototype.update = function(){}; } __update.apply(this,arguments); Sprite.prototype.update = update; }; Sprite_Picture.prototype.playAction = function (PicNo ,Spine_State, Spine_Action) { var mLayer = 0; var mSpeed = 1; var loopflg = true; var n = 0; for (n = 0; n <= SpinAnimePLayer.length - 1; n++){ if (SpinAnimePLayer[n]._PicNo == PicNo){ if (SpinAnimePLayer[n]._MtnName == Spine_Action.animation) { loopflg = SpinAnimePLayer[n]._loopflg; mLayer = SpinAnimePLayer[n]._Slayer; mSpeed = SpinAnimePLayer[n]._Speed; } } } Spine_State.setAnimation(mLayer, Spine_Action.animation, loopflg, mSpeed); } Sprite_Picture.prototype.AddAction = function (PicNo, Spine_State, Spine_Action) { var mLayer = 0; Spine_State.addAnimation(mLayer, Spine_Action.animation, Spine_Action.loop, 0); } let __updateBitmap = Sprite_Picture.prototype.updateBitmap; Sprite_Picture.prototype.updateBitmap = function() { __updateBitmap.apply(this, arguments); let picture = this.picture(); if (picture) { if (picture._MSS_RsvSpineActions != undefined) { for (var jj = 0; jj <= picture._MSS_RsvSpineActions.length - 1; jj++) { if (picture._MSS_SpineActions == undefined) { picture._MSS_SpineActions = []; } picture._MSS_SpineActions.push(picture._MSS_RsvSpineActions[jj]); } } picture._MSS_RsvSpineActions = []; let spineActions = picture._MSS_SpineActions; let realPictureId = $gameScreen.realPictureId(this._pictureId); if (spineActions) { spineActions.forEach(function(spineAction) { if (spineAction.name) { if (!$mpi.spineData[spineAction.name]) { console.log("ActionResave"); picture._MSS_RsvSpineActions.push(spineAction); return; } picture._MSS_SpineName = spineAction.name; picture._MSS_SpineAnimationList = [spineAction]; picture._MSS_SpineMixList = {}; picture._MSS_SpineSkin = null; picture._MSS_SpineTimeScale = 1; picture._MSS_SpineStart = performance.now(); picture._MSS_SpinePause = 0; picture._MSS_SpineColor = null; picture._MSS_SpineRandomAnimationList = null; picture._MSS_SpineMosaicList = null; if (this._MSS_Spine) { this.removeChild(this._MSS_Spine); } this._MSS_Spine = $gameTemp._MSS_Spines[realPictureId] = new PIXI.spine.Spine($mpi.spineData[spineAction.name]); this._MSS_Spine.skeleton.Mdlname = spineAction.name; this.playAction(realPictureId , this._MSS_Spine.state, spineAction); if (this._MSS_Spine.spineData.skins.length > 1) { picture._MSS_SpineSkin = this._MSS_Spine.spineData.skins[1].name; this._MSS_Spine.skeleton.setSkinByName(picture._MSS_SpineSkin); } this._MSS_Spine.state.addListener({ event: this.onSpineEvent.bind(this), complete: this.onSpineComplete.bind(this) }); this.addChild(this._MSS_Spine); } else if (spineAction.type === 0) { this.playAction(realPictureId, this._MSS_Spine.state, spineAction); picture._MSS_SpineAnimationList = [spineAction]; picture._MSS_SpineStart = performance.now(); picture._MSS_SpinePause = 0; picture._MSS_SpineRandomAnimationList = null; } else if (spineAction.type === 1) { this.AddAction(realPictureId, this._MSS_Spine.state, spineAction); picture._MSS_SpineAnimationList.push(spineAction); picture._MSS_SpineRandomAnimationList = null; } else if (spineAction.type === 2) { var si = 0; for (si = 0; si <= this._MSS_Spine.spineData.animations.length - 1; si++){ if (spineAction.to != this._MSS_Spine.spineData.animations[si].name) { this._MSS_Spine.stateData.setMix(this._MSS_Spine.spineData.animations[si].name , spineAction.to, spineAction.duration); picture._MSS_SpineMixList[[this._MSS_Spine.spineData.animations[si].name, spineAction.to]] = spineAction; } } //this._MSS_Spine.stateData.setMix(spineAction.from, spineAction.to, spineAction.duration); //nupu元はこれ } else if (spineAction.type === 3) { this._MSS_Spine.skeleton.setSkinByName(spineAction.skin); this._MSS_Spine.skeleton.setSlotsToSetupPose(); picture._MSS_SpineSkin = spineAction.skin; } else if (spineAction.type === 4) { this._MSS_Spine.state.timeScale = spineAction.timescale; picture._MSS_SpineTimeScale = spineAction.timescale; } else if (spineAction.type === 5) { let color = spineAction.color; let filter = new PIXI.filters.ColorMatrixFilter(); filter.matrix = [ color.red, 0, 0, 0, 0, 0, color.green, 0, 0, 0, 0, 0, color.blue, 0, 0, 0, 0, 0, color.alpha, 0 ]; this._MSS_Spine.filters = [filter]; picture._MSS_SpineColor = spineAction.color; } else if (spineAction.type >= 6 && spineAction.type <= 9) { let list = []; let total_weight = 0; spineAction.animations.split(/,/).forEach(animation => { let name = animation.replace(/\((\d+)\)$/, ''); let weight = Number(RegExp.$1) || 1; list.push({ name: name, border: total_weight + weight }); total_weight += weight; }); let value = Math.random() * total_weight; let animation = ''; for (let i = 0; i < list.length; i++) { if (list[i].border > value) { animation = list[i].name; break; } } if (animation) { spineAction.animation = animation; delete spineAction.animations; if ([6, 8].includes(spineAction.type)) { this._MSS_Spine.state.setAnimation(0, animation, spineAction.loop); picture._MSS_SpineAnimationList = [spineAction]; picture._MSS_SpineStart = performance.now(); picture._MSS_SpinePause = 0; } else { this._MSS_Spine.state.addAnimation(0, animation, spineAction.loop, 0); picture._MSS_SpineAnimationList.push(spineAction); } picture._MSS_SpineRandomAnimationList = null; } if (spineAction.type >= 8) { picture._MSS_SpineRandomAnimationList = list; } } else if (spineAction.type == 10) { let image = spineAction.image; let size = spineAction.size; this._MSS_Spine.children.forEach(child => { child.children.forEach(child => { try{ if (child.region.name == image) { let filters = child.filters || []; let index = filters.findIndex(filter => { return (filter instanceof MosaicFilter); }); if (index >= 0) { if (size > 1) { filters.splice(index, 1, new MosaicFilter(size)); spineAction.index = index; } else { filters.splice(index, 1); } } else if (size > 1) { filters.push(new MosaicFilter(size)); spineAction.index = 0; } child.filters = (filters.length > 0) ? filters : null; } }catch(ex){ console.log("mosaic:Err:nupu") } }); }); let list = picture._MSS_SpineMosaicList || {}; (size > 1) ? list[image] = spineAction : delete list[image]; picture._MSS_SpineMosaicList = list; } else if (spineAction.type === 11) { this._MSS_Spine.skeleton.setSkinByName(spineAction.skin); this._MSS_Spine.skeleton.setSlotsToSetupPose(); picture._MSS_SpineSkin = spineAction.skin; } }, this); delete picture._MSS_SpineActions; } else if (!this._MSS_Spine) { if ($gameTemp._MSS_Spines[realPictureId]) { this._MSS_Spine = $gameTemp._MSS_Spines[realPictureId]; this.addChild(this._MSS_Spine); this._MSS_Spine.updateTransform(); this._MSS_Spine.state.timeScale = picture._MSS_SpineTimeScale || 1; } else if (picture._MSS_IsSpine) { if (picture._MSS_SpineName != undefined) { this._MSS_Spine = $gameTemp._MSS_Spines[realPictureId] = new PIXI.spine.Spine($mpi.spineData[picture._MSS_SpineName]); let trackTime = (picture._MSS_SpinePause - picture._MSS_SpineStart) / 1000; let finished = 0; let durations = {}; let durationTotal = 0; this._MSS_Spine.spineData.animations.forEach(function (animation) { durations[animation.name] = animation.duration; }); picture._MSS_SpineAnimationList.forEach(function (spineAnimation, index) { if (index === 0) { this._MSS_Spine.state.setAnimation(0, spineAnimation.animation, spineAnimation.loop); } else { this._MSS_Spine.state.addAnimation(0, spineAnimation.animation, spineAnimation.loop, 0); } durationTotal += durations[spineAnimation.animation]; if (durationTotal <= trackTime) { finished++; } }, this); Object.keys(picture._MSS_SpineMixList).forEach(function (key) { let spineMix = picture._MSS_SpineMixList[key]; try { this._MSS_Spine.stateData.setMix(spineMix.from, spineMix.to, spineMix.duration); }catch(ex){ } }, this); this._MSS_Spine.state.tracks[0].trackTime = trackTime; if (picture._MSS_SpineSkin) { this._MSS_Spine.skeleton.setSkinByName(picture._MSS_SpineSkin); } this._MSS_Spine.state.timeScale = picture._MSS_SpineTimeScale || 1; if (picture._MSS_SpineColor) { let color = picture._MSS_SpineColor; let filter = new PIXI.filters.ColorMatrixFilter(); filter.matrix = [ color.red, 0, 0, 0, 0, 0, color.green, 0, 0, 0, 0, 0, color.blue, 0, 0, 0, 0, 0, color.alpha, 0 ]; this._MSS_Spine.filters = [filter]; } if (picture._MSS_SpineMosaicList) { let list = picture._MSS_SpineMosaicList; Object.keys(list).sort((a, b) => list[a].index - list[b].index) .forEach(key => { this._MSS_Spine.children.forEach(child => { child.children.forEach(child => { if (child.region.name == key) { child.filters = [new MosaicFilter(list[key].size)]; } }); }); }); } this.addChild(this._MSS_Spine); this._MSS_Spine.state.addListener({ complete: this.onSpineComplete.bind(this) }); for (let i = 0; i < finished; i++) { this._MSS_Spine.updateTransform(); } this._MSS_Spine.state.addListener({ event: this.onSpineEvent.bind(this) }); console.log("Nupu : after Load Spine"); SpineLoadFlg = true; } } } if (this._MSS_Spine) { if (this._MSS_Spine.state.timeScale === 0) { if (picture._MSS_SpinePause === 0) { picture._MSS_SpinePause = performance.now(); } } else { if (picture._MSS_SpinePause > 0) { picture._MSS_SpineStart += (performance.now() - picture._MSS_SpinePause); picture._MSS_SpinePause = 0; } } } } }; Sprite_Picture.prototype.onSpineEvent = function(trackEntry, event) { Spine_EvName.push(event.data.name); if (!event.audioData) { let path = event.data.audioPath; let dir = ''; let name = ''; let volume = event.volume; let balance = event.balance; let stringValue = event.stringValue; let volume_id = null; let balance_id = null; path = path ? path.replace(/\.[^.]+$/, '') : ''; if (path.includes('/')) { let index = path.lastIndexOf('/'); dir = path.substr(0, index); name = path.substr(index + 1); } else { dir = ''; name = path; } volume = (typeof volume == 'number') ? volume * 100 : 100; balance = (typeof balance == 'number') ? balance * 100 : 0; stringValue.trim().split(/ *, */).forEach(data => { let [name, value] = data.split(/ *: */); switch (name) { case 'volume': volume_id = Number(value); break; case 'balance': balance_id = Number(value); break; } }); event.audioData = { path: path, dir: dir, name: name, volume: volume, balance: balance, volume_id: volume_id, balance_id: balance_id }; } let audioData = event.audioData; let path = audioData.path; let dir = audioData.dir; let name = audioData.name; let volume = audioData.volume; let balance = audioData.balance; let volume_id = audioData.volume_id; let balance_id = audioData.balance_id; if (path) { let se = { path: path, dir: dir, name: name, volume: volume_id ? $gameVariables.value(volume_id) : volume, pan: balance_id ? $gameVariables.value(balance_id) : balance, pitch: 100 }; AudioManager.playSpineSe(se); } }; Sprite_Picture.prototype.onSpineComplete = function(trackEntry) { if (!trackEntry.next) { let picture = this.picture(); if (picture) { let list = picture._MSS_SpineRandomAnimationList; if (list) { let value = Math.random() * list[list.length - 1].border; let animation = ''; for (let i = 0; i < list.length; i++) { if (list[i].border > value) { animation = list[i].name; break; } } if (animation) { this._MSS_Spine.state.setAnimation(0, animation, false); picture._MSS_SpineAnimationList.reverse().splice(1); picture._MSS_SpineAnimationList[0].animation = animation; picture._MSS_SpineStart = performance.now(); picture._MSS_SpinePause = 0; } } } } }; } { let __terminate = Scene_Base.prototype.terminate; Scene_Base.prototype.terminate = function() { __terminate.apply(this, arguments); if ($gameTemp) { Object.keys($gameTemp._MSS_Spines).forEach(function(key) { $gameTemp._MSS_Spines[key].state.timeScale = 0; }); } if (this._spriteset && this._spriteset._pictureContainer) { this._spriteset._pictureContainer.children.forEach(function(sprite) { if (sprite instanceof Sprite_Picture) { let picture = sprite.picture(); if (picture && picture._MSS_IsSpine) { sprite.update(); } } }); } }; } AudioManager.playSpineSe = function(se) { if (se.name) { this.loadSpineSe(se); for (var i = 0; i < this._staticBuffers.length; i++) { var buffer = this._staticBuffers[i]; if (buffer._reservedSeName === se.path) { buffer.stop(); this.updateSeParameters(buffer, se); buffer.play(false); break; } } } }; AudioManager.loadSpineSe = function(se) { if (se.name && !this.isStaticSe({ name: se.path })) { var buffer = this.createBuffer(se.dir ? 'se/' + se.dir : 'se', se.name); buffer._reservedSeName = se.path; this._staticBuffers.push(buffer); if (this.shouldUseHtml5Audio()) { Html5Audio.setStaticSe(buffer._url); } } }; }());