456 lines
19 KiB
JavaScript
456 lines
19 KiB
JavaScript
// (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;
|
|
};
|
|
})();
|