// (C) 2015 Triacontane // 1.5.5 2019/02/13 コマンド「PA_SET_CELL」において0番(最初のセル)に対する指定が機能しない問題を修正 /*: * @plugindesc * @author トリアコンタン * * @param 最初のセルに戻る * @desc ループしないアニメーションの終了後、最初のセルに戻ります。無効にすると最後のセルで止まります。 * @default true * @type boolean * * @help */ (function() { 'use strict'; var pluginName = 'JsScript61Set'; var settings = { /* maxCellAnimation:セル数の最大値 */ maxCellAnimation: 200 }; var getParamString = function(paramNames) { if (!Array.isArray(paramNames)) paramNames = [paramNames]; for (var i = 0; i < paramNames.length; i++) { var name = PluginManager.parameters(pluginName)[paramNames[i]]; if (name) return name; } return ''; }; var getParamBoolean = function(paramNames) { var value = getParamString(paramNames); return value.toUpperCase() === 'ON' || value.toUpperCase() === 'TRUE'; }; var getCommandName = function(command) { return (command || '').toUpperCase(); }; var getArgArrayString = function(args, upperFlg) { var values = getArgString(args, upperFlg); return (values || '').split(','); }; var getArgArrayNumber = function(args, min, max) { if (!args) { return []; } var values = getArgArrayString(args.substring(1, args.length - 1), false); if (arguments.length < 2) min = -Infinity; if (arguments.length < 3) max = Infinity; for (var i = 0; i < values.length; i++) values[i] = (parseInt(values[i], 10) || 0).clamp(min, max); return values; }; var getArgString = function(arg, upperFlg) { arg = convertEscapeCharacters(arg); return upperFlg ? arg.toUpperCase() : arg; }; var getArgNumber = function(arg, min, max) { if (arguments.length < 2) min = -Infinity; if (arguments.length < 3) max = Infinity; return (parseInt(convertEscapeCharacters(arg), 10) || 0).clamp(min, max); }; var convertEscapeCharacters = function(text) { if (text == null) text = ''; var window = SceneManager._scene._windowLayer.children[0]; return window ? window.convertEscapeCharacters(text) : text; }; var param = {}; param.returnToFirstCell = getParamBoolean(['ReturnToFirstCell', '最初のセルに戻る']); var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand; Game_Interpreter.prototype.pluginCommand = function(command, args) { _Game_Interpreter_pluginCommand.call(this, command, args); this.pluginCommandPictureAnimation(command, args); }; Game_Interpreter.prototype.pluginCommandPictureAnimation = function(command, args) { var pictureNum, animationType, picture, cellNumber, frameNumber, direction, fadeDuration, wait, customArray; switch (getCommandName(command)) { case 'PA_INIT' : case 'ピクチャのアニメーション準備': cellNumber = getArgNumber(args[0], 1, settings.maxCellAnimation); frameNumber = getArgNumber(args[1], 1, 9999); direction = getArgString(args[2], true) || '縦'; fadeDuration = getArgNumber(args[3], 0, 9999) || 0; $gameScreen.setPicturesAnimation(cellNumber, frameNumber, direction, fadeDuration); break; case 'PA_SOUND' : case 'ピクチャのアニメーション効果音予約': cellNumber = getArgNumber(args[0], 1, settings.maxCellAnimation); this.reservePaSound(cellNumber); break; case 'PA_START' : case 'ピクチャのアニメーション開始': pictureNum = getArgNumber(args[0], 1, $gameScreen.maxPictures()); animationType = getArgNumber(args[1], 1, 3); customArray = getArgArrayNumber(args[2], 1, settings.maxCellAnimation); picture = $gameScreen.picture(pictureNum); if (picture) picture.startAnimationFrame(animationType, false, customArray); break; case 'PA_START_LOOP' : case 'ピクチャのループアニメーション開始': pictureNum = getArgNumber(args[0], 1, $gameScreen.maxPictures()); animationType = getArgNumber(args[1], 1, 3); customArray = getArgArrayNumber(args[2], 1, settings.maxCellAnimation); picture = $gameScreen.picture(pictureNum); if (picture) picture.startAnimationFrame(animationType, true, customArray); break; case 'PA_STOP' : case 'ピクチャのアニメーション終了': pictureNum = getArgNumber(args[0], 1, $gameScreen.maxPictures()); picture = $gameScreen.picture(pictureNum); if (picture) picture.stopAnimationFrame(false); break; case 'PA_STOP_FORCE' : case 'ピクチャのアニメーション強制終了': pictureNum = getArgNumber(args[0], 1, $gameScreen.maxPictures()); picture = $gameScreen.picture(pictureNum); if (picture) picture.stopAnimationFrame(true); break; case 'PA_SET_CELL' : case 'ピクチャのアニメーションセル設定': pictureNum = getArgNumber(args[0], 1, $gameScreen.maxPictures()); cellNumber = getArgNumber(args[1], 0, settings.maxCellAnimation); wait = getArgString(args[2]); picture = $gameScreen.picture(pictureNum); if (picture) { if (wait === 'ウェイトあり' || wait.toUpperCase() === 'WAIT') this.wait(picture._fadeDuration); picture.cell = cellNumber; } break; case 'PA_PROG_CELL' : case 'ピクチャのアニメーションセル進行': pictureNum = getArgNumber(args[0], 1, $gameScreen.maxPictures()); wait = getArgString(args[1]); picture = $gameScreen.picture(pictureNum); if (picture) { if (wait === 'ウェイトあり' || wait.toUpperCase() === 'WAIT') this.wait(picture._fadeDuration); picture.addCellCount(); } break; case 'PA_SET_VARIABLE' : case 'ピクチャのアニメーションセル変数の設定': pictureNum = getArgNumber(args[0], 1, $gameScreen.maxPictures()); picture = $gameScreen.picture(pictureNum); if (picture) picture.linkToVariable(getArgNumber(args[1])); break; } }; Game_Interpreter.prototype.reservePaSound = function(cellNumber) { this._paSoundFrame = cellNumber; }; var _Game_Interpreter_command250 = Game_Interpreter.prototype.command250; Game_Interpreter.prototype.command250 = function() { if (this._paSoundFrame) { var se = this._params[0]; AudioManager.loadStaticSe(se); $gameScreen.addPaSound(se, this._paSoundFrame); this._paSoundFrame = null; return true; } return _Game_Interpreter_command250.apply(this, arguments); }; Game_Screen.prototype.setPicturesAnimation = function(cellNumber, frameNumber, direction, fadeDuration) { this._paCellNumber = cellNumber; this._paFrameNumber = frameNumber; this._paDirection = direction; this._paFadeDuration = fadeDuration; }; Game_Screen.prototype.addPaSound = function(sound, frame) { if (!this._paSounds) this._paSounds = []; this._paSounds[frame] = sound; }; Game_Screen.prototype.clearPicturesAnimation = function() { this._paCellNumber = 1; this._paFrameNumber = 1; this._paDirection = ''; this._paFadeDuration = 0; this._paSounds = null; }; var _Game_Screen_showPicture = Game_Screen.prototype.showPicture; Game_Screen.prototype.showPicture = function(pictureId, name, origin, x, y, scaleX, scaleY, opacity, blendMode) { _Game_Screen_showPicture.apply(this, arguments); var realPictureId = this.realPictureId(pictureId); if (this._paCellNumber > 1) { this._pictures[realPictureId].setAnimationFrameInit( this._paCellNumber, this._paFrameNumber, this._paDirection, this._paFadeDuration, this._paSounds); this.clearPicturesAnimation(); } }; Game_Screen.prototype.isActivePicture = function(picture) { var realId = this._pictures.indexOf(picture); return realId > this.maxPictures() === $gameParty.inBattle(); }; var _Game_Picture_initialize = Game_Picture.prototype.initialize; Game_Picture.prototype.initialize = function() { _Game_Picture_initialize.call(this); this.initAnimationFrameInfo(); }; Game_Picture.prototype.initAnimationFrameInfo = function() { this._cellNumber = 1; this._frameNumber = 1; this._cellCount = 0; this._frameCount = 0; this._animationType = 0; this._customArray = null; this._loopFlg = false; this._direction = ''; this._fadeDuration = 0; this._fadeDurationCount = 0; this._prevCellCount = 0; this._animationFlg = false; this._linkedVariable = 0; this._cellSes = []; }; Game_Picture.prototype.direction = function() { return this._direction; }; Game_Picture.prototype.cellNumber = function() { return this._cellNumber; }; Game_Picture.prototype.prevCellCount = function() { return this._prevCellCount; }; Game_Picture.prototype.isMulti = function() { var dir = this.direction(); return dir === '連番' || dir === 'N'; }; /** * The cellCount of the Game_Picture (0 to cellNumber). * * @property cellCount * @type Number */ Object.defineProperty(Game_Picture.prototype, 'cell', { get: function() { if (this._linkedVariable > 0) { return $gameVariables.value(this._linkedVariable) % this._cellNumber; } switch (this._animationType) { case 3: return (this._customArray[this._cellCount] - 1).clamp(0, this._cellNumber - 1); case 2: return this._cellNumber - 1 - Math.abs(this._cellCount - (this._cellNumber - 1)); case 1: return this._cellCount; default: return this._cellCount; } }, set: function(value) { var newCellCount = value % this.getCellNumber(); if (this._cellCount !== newCellCount) { this._prevCellCount = this.cell; this._fadeDurationCount = this._fadeDuration; } this._cellCount = newCellCount; } }); Game_Picture.prototype.getCellNumber = function() { switch (this._animationType) { case 3: return this._customArray.length; case 2: return (this._cellNumber - 1) * 2; case 1: return this._cellNumber; default: return this._cellNumber; } }; var _Game_Picture_update = Game_Picture.prototype.update; Game_Picture.prototype.update = function() { _Game_Picture_update.call(this); if (this.isFading()) { this.updateFading(); } else if (this.hasAnimationFrame() && this.isActive()) { this.updateAnimationFrame(); } }; Game_Picture.prototype.linkToVariable = function(variableNumber) { this._linkedVariable = variableNumber.clamp(1, $dataSystem.variables.length); }; Game_Picture.prototype.updateAnimationFrame = function() { this._frameCount = (this._frameCount + 1) % this._frameNumber; if (this._frameCount === 0) { this.addCellCount(); this.playCellSe(); if (this.isEndFirstLoop() && !this._loopFlg) { this._animationFlg = false; } } }; Game_Picture.prototype.isEndFirstLoop = function() { return this._cellCount === (param.returnToFirstCell ? 0 : this.getCellNumber() - 1); }; Game_Picture.prototype.updateFading = function() { this._fadeDurationCount--; }; Game_Picture.prototype.prevCellOpacity = function() { if (this._fadeDuration === 0) return 0; return this.opacity() / this._fadeDuration * this._fadeDurationCount; }; Game_Picture.prototype.addCellCount = function() { this.cell = this._cellCount + 1; }; Game_Picture.prototype.playCellSe = function() { var se = this._cellSes[this.cell + 1]; if (se) { AudioManager.playSe(se); } }; Game_Picture.prototype.setAnimationFrameInit = function(cellNumber, frameNumber, direction, fadeDuration, cellSes) { this._cellNumber = cellNumber; this._frameNumber = frameNumber; this._frameCount = 0; this._cellCount = 0; this._direction = direction; this._fadeDuration = fadeDuration; this._cellSes = cellSes || []; }; Game_Picture.prototype.startAnimationFrame = function(animationType, loopFlg, customArray) { this._animationType = animationType; this._customArray = customArray; this._animationFlg = true; this._loopFlg = loopFlg; if (this._cellNumber <= this._cellCount) { this._cellCount = this._cellNumber - 1; } this.playCellSe(); }; Game_Picture.prototype.stopAnimationFrame = function(forceFlg) { this._loopFlg = false; if (forceFlg) { this._animationFlg = false; } }; Game_Picture.prototype.hasAnimationFrame = function() { return this._animationFlg; }; Game_Picture.prototype.isFading = function() { return this._fadeDurationCount !== 0; }; Game_Picture.prototype.isNeedFade = function() { return this._fadeDuration !== 0; }; Game_Picture.prototype.isActive = function() { return $gameScreen.isActivePicture(this); }; var _Sprite_Picture_initialize = Sprite_Picture.prototype.initialize; Sprite_Picture.prototype.initialize = function(pictureId) { this._prevSprite = null; _Sprite_Picture_initialize.apply(this, arguments); }; var _Sprite_Picture_update = Sprite_Picture.prototype.update; Sprite_Picture.prototype.update = function() { _Sprite_Picture_update.apply(this, arguments); var picture = this.picture(); if (picture && picture.name()) { if (picture.isMulti() && !this._bitmaps) { this.loadAnimationBitmap(); } if (this.isBitmapReady()) { this.updateAnimationFrame(this, picture.cell); if (picture.isNeedFade()) this.updateFading(); } } }; var _Sprite_Picture_updateBitmap = Sprite_Picture.prototype.updateBitmap; Sprite_Picture.prototype.updateBitmap = function() { _Sprite_Picture_updateBitmap.apply(this, arguments); if (!this.picture()) { this._bitmaps = null; if (this._prevSprite) { this._prevSprite.bitmap = null; } } }; Sprite_Picture.prototype.updateFading = function() { if (!this._prevSprite) { this.makePrevSprite(); } if (!this._prevSprite.bitmap) { this.makePrevBitmap(); } var picture = this.picture(); if (picture.isFading()) { this._prevSprite.visible = true; this.updateAnimationFrame(this._prevSprite, picture.prevCellCount()); this._prevSprite.opacity = picture.prevCellOpacity(); } else { this._prevSprite.visible = false; } }; Sprite_Picture.prototype.updateAnimationFrame = function(sprite, cellCount) { switch (this.picture().direction()) { case '連番': case 'N': sprite.bitmap = this._bitmaps[cellCount]; sprite.setFrame(0, 0, sprite.bitmap.width, sprite.bitmap.height); break; case '縦': case 'V': var height = sprite.bitmap.height / this.picture().cellNumber(); var y = cellCount * height; sprite.setFrame(0, y, sprite.bitmap.width, height); break; case '横': case 'H': var width = sprite.bitmap.width / this.picture().cellNumber(); var x = cellCount * width; sprite.setFrame(x, 0, width, sprite.bitmap.height); break; default: sprite.setFrame(0, 0, this.bitmap.width, this.bitmap.height); } }; var _Sprite_Picture_loadBitmap = Sprite_Picture.prototype.loadBitmap; Sprite_Picture.prototype.loadBitmap = function() { _Sprite_Picture_loadBitmap.apply(this, arguments); this._bitmapReady = false; this._bitmaps = null; if (this._prevSprite) { this._prevSprite.visible = false; } }; Sprite_Picture.prototype.loadAnimationBitmap = function() { var cellNumber = this.picture().cellNumber(); var cellDigit = cellNumber.toString().length; this._bitmaps = [this.bitmap]; for (var i = 1; i < cellNumber; i++) { var filename = this._pictureName.substr(0, this._pictureName.length - cellDigit) + i.padZero(cellDigit); this._bitmaps[i] = ImageManager.loadPicture(filename); } this._bitmapReady = false; }; Sprite_Picture.prototype.makePrevSprite = function() { this._prevSprite = new Sprite(); this._prevSprite.visible = false; this.addChild(this._prevSprite); }; Sprite_Picture.prototype.makePrevBitmap = function() { this._prevSprite.bitmap = this.bitmap; this._prevSprite.anchor.x = this.anchor.x; this._prevSprite.anchor.y = this.anchor.y; }; Sprite_Picture.prototype.isBitmapReady = function() { if (!this.bitmap) return false; if (this._bitmapReady) return true; var result; if (this.picture().isMulti()) { result = this._bitmaps.every(function(bitmap) { return bitmap.isReady(); }); } else { result = this.bitmap.isReady(); } this._bitmapReady = result; return result; }; })();