405 lines
13 KiB
JavaScript
405 lines
13 KiB
JavaScript
//
|
|
// 鏡面反射スプライト ver1.01
|
|
//
|
|
// ------------------------------------------------------
|
|
// Copyright (c) 2016 Yana
|
|
// Released under the MIT license
|
|
// http://opensource.org/licenses/mit-license.php
|
|
// ------------------------------------------------------
|
|
//
|
|
// author Yana
|
|
//
|
|
|
|
var Imported = Imported || {};
|
|
Imported["SpecularReflectionSprite"] = 1.01;
|
|
|
|
/*:
|
|
* @plugindesc ver1.01/遠景と下層レイヤーの間に鏡像スプライトを追加します。
|
|
* @author Yana
|
|
*
|
|
* @param TerrainId
|
|
* @desc 鏡像が表示される地形タグです。
|
|
* 地形タグは1,2,3のように複数登録することができます。
|
|
* @default 1
|
|
*
|
|
* @param OffsetYVariableID
|
|
* @desc プレイヤーのY座標の補正値として使用する変数のIDです。
|
|
* 0を指定すると使用しません。
|
|
* @default 0
|
|
*
|
|
* @help ------------------------------------------------------
|
|
* このプラグインについて
|
|
* ------------------------------------------------------
|
|
* このプラグインは、正確には、
|
|
* 「遠景と下層レイヤーの間にキャラクターの鏡像を表示する地形タグを設定するプラグイン」
|
|
* となります。
|
|
* つまり、下層レイヤーの一部が透明や半透明でないと、地形タグを設定しても変化はありません。
|
|
* ------------------------------------------------------
|
|
* 使用方法
|
|
* ------------------------------------------------------
|
|
* プラグインパラメータで地形タグを設定すると、その地形タグに鏡像が表示されるようになります。
|
|
*
|
|
* イベントのメモに
|
|
* <鏡像表示なし>
|
|
* <NoReflection>
|
|
* のいずれかを記述すると、そのイベントの鏡像は表示されません。
|
|
*
|
|
* 同じように、イベントのメモに
|
|
* <鏡像表示補正Y:○>
|
|
* <SpecularOffsetY:○>
|
|
* のいずれかを記述すると、鏡像の表示位置を○分ずらします。
|
|
*
|
|
* ------------------------------------------------------
|
|
* 利用規約
|
|
* ------------------------------------------------------
|
|
* 当プラグインはMITライセンスで公開されています。
|
|
* 使用に制限はありません。商用、アダルト、いずれにも使用できます。
|
|
* 二次配布も制限はしませんが、サポートは行いません。
|
|
* 著作表示は任意です。行わなくても利用できます。
|
|
* 要するに、特に規約はありません。
|
|
* バグ報告や使用方法等のお問合せはネ実ツクールスレ、または、Twitterにお願いします。
|
|
* https://twitter.com/yanatsuki_
|
|
* 素材利用は自己責任でお願いします。
|
|
* ------------------------------------------------------
|
|
* 更新履歴:
|
|
* ver1.01:
|
|
* 戦闘開始演出時に鏡像スプライトが残ってしまうバグを修正。
|
|
* ver1.00:
|
|
* 公開
|
|
*/
|
|
|
|
(function () {
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var parameters = PluginManager.parameters("SpecularReflectionSprite");
|
|
var terrainIds = parameters["TerrainId"].split(",").map(function (n) {
|
|
return Number(n);
|
|
});
|
|
var offsetYVariableId = Number(parameters["OffsetYVariableID"]) || 0;
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
Game_CharacterBase.prototype.isReflect = function () {
|
|
return true;
|
|
};
|
|
|
|
Game_CharacterBase.prototype.isEvent = function () {
|
|
return false;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
Game_Event.prototype.isReflect = function () {
|
|
return (
|
|
this.event() &&
|
|
!(this.event().meta["鏡像表示なし"] || this.event().meta["NoReflection"])
|
|
);
|
|
};
|
|
|
|
Game_Event.prototype.isEvent = function () {
|
|
return true;
|
|
};
|
|
|
|
Game_Event.prototype.specularOffsetY = function () {
|
|
if (!this.event()) return 0;
|
|
if (this.event().meta["鏡像表示補正Y"]) {
|
|
return Number(this.event().meta["鏡像表示補正Y"]) || 0;
|
|
}
|
|
if (this.event().meta["SpecularOffsetY"]) {
|
|
return Number(this.event().meta["SpecularOffsetY"]) || 0;
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
function Sprite_Specular() {
|
|
this.initialize.apply(this, arguments);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
Sprite_Specular.prototype = Object.create(Sprite_Base.prototype);
|
|
Sprite_Specular.prototype.constructor = Sprite_Specular;
|
|
|
|
Sprite_Specular.prototype.initialize = function (character) {
|
|
Sprite_Base.prototype.initialize.call(this);
|
|
this.initMembers();
|
|
this.setCharacter(character);
|
|
};
|
|
|
|
Sprite_Specular.prototype.initMembers = function () {
|
|
this.anchor.x = 0.5;
|
|
this.anchor.y = 1;
|
|
this._character = null;
|
|
this._tilesetId = 0;
|
|
this._upperBody = null;
|
|
this._lowerBody = null;
|
|
this.scale = new Point(1.0, -1.0);
|
|
this.visible = true;
|
|
this.z = 2;
|
|
};
|
|
|
|
Sprite_Specular.prototype.setCharacter = function (character) {
|
|
this._character = character;
|
|
};
|
|
|
|
Sprite_Specular.prototype.updateVisibility = function () {
|
|
Sprite_Base.prototype.updateVisibility.call(this);
|
|
if (
|
|
this._startBattle ||
|
|
this._character.isTransparent() ||
|
|
!this._character.isReflect()
|
|
) {
|
|
this.visible = false;
|
|
return;
|
|
}
|
|
var x = this._character.x;
|
|
var y =
|
|
this._character.y + Math.ceil(this.offsetY() / $gameMap.tileWidth()) + 1;
|
|
var dir = this._character._direction;
|
|
var terrainTag = $gameMap.terrainTag(x, y);
|
|
var reflectTerrain = terrainIds.contains(terrainTag);
|
|
|
|
switch (dir) {
|
|
case 2:
|
|
y = reflectTerrain ? y : y - 1;
|
|
break;
|
|
case 4:
|
|
x = reflectTerrain ? x : x + 1;
|
|
break;
|
|
case 6:
|
|
x = reflectTerrain ? x : x - 1;
|
|
break;
|
|
case 8:
|
|
y = reflectTerrain ? y : y + 1;
|
|
break;
|
|
}
|
|
|
|
terrainTag = $gameMap.terrainTag(x, y);
|
|
this.visible = terrainIds.contains(terrainTag);
|
|
};
|
|
|
|
Sprite_Specular.prototype.isTile = function () {
|
|
return this._character.tileId > 0;
|
|
};
|
|
|
|
Sprite_Specular.prototype.tilesetBitmap = function (tileId) {
|
|
var tileset = $gameMap.tileset();
|
|
var setNumber = 5 + Math.floor(tileId / 256);
|
|
return ImageManager.loadTileset(tileset.tilesetNames[setNumber]);
|
|
};
|
|
|
|
Sprite_Specular.prototype.updateBitmap = function () {
|
|
if (this.isImageChanged()) {
|
|
this._tilesetId = $gameMap.tilesetId();
|
|
this._tileId = this._character.tileId();
|
|
this._characterName = this._character.characterName();
|
|
this._characterIndex = this._character.characterIndex();
|
|
if (this._tileId > 0) {
|
|
this.setTileBitmap();
|
|
} else {
|
|
this.setCharacterBitmap();
|
|
}
|
|
}
|
|
};
|
|
|
|
Sprite_Specular.prototype.isImageChanged = function () {
|
|
return (
|
|
this._tilesetId !== $gameMap.tilesetId() ||
|
|
this._tileId !== this._character.tileId() ||
|
|
this._characterName !== this._character.characterName() ||
|
|
this._characterIndex !== this._character.characterIndex()
|
|
);
|
|
};
|
|
|
|
Sprite_Specular.prototype.setTileBitmap = function () {
|
|
this.bitmap = this.tilesetBitmap(this._tileId);
|
|
};
|
|
|
|
Sprite_Specular.prototype.setCharacterBitmap = function () {
|
|
this.bitmap = ImageManager.loadCharacter(this._characterName);
|
|
this._isBigCharacter = ImageManager.isBigCharacter(this._characterName);
|
|
};
|
|
|
|
Sprite_Specular.prototype.updateFrame = function () {
|
|
if (this._tileId > 0) {
|
|
this.updateTileFrame();
|
|
} else {
|
|
this.updateCharacterFrame();
|
|
}
|
|
};
|
|
|
|
Sprite_Specular.prototype.updateTileFrame = function () {
|
|
var pw = this.patternWidth();
|
|
var ph = this.patternHeight();
|
|
var sx =
|
|
((Math.floor(this._tileId / 128) % 2) * 8 + (this._tileId % 8)) * pw;
|
|
var sy = (Math.floor((this._tileId % 256) / 8) % 16) * ph;
|
|
this.setFrame(sx, sy, pw, ph);
|
|
};
|
|
|
|
Sprite_Specular.prototype.updateCharacterFrame = function () {
|
|
var pw = this.patternWidth();
|
|
var ph = this.patternHeight();
|
|
var sx = (this.characterBlockX() + this.characterPatternX()) * pw;
|
|
var sy = (this.characterBlockY() + this.characterPatternY()) * ph;
|
|
this.updateHalfBodySprites();
|
|
if (this._bushDepth > 0) {
|
|
var d = this._bushDepth;
|
|
this._upperBody.setFrame(sx, sy, pw, ph - d);
|
|
this._lowerBody.setFrame(sx, sy + ph - d, pw, d);
|
|
this.setFrame(sx, sy, 0, ph);
|
|
} else {
|
|
this.setFrame(sx, sy, pw, ph);
|
|
}
|
|
};
|
|
|
|
Sprite_Specular.prototype.characterBlockX = function () {
|
|
if (this._isBigCharacter) {
|
|
return 0;
|
|
} else {
|
|
var index = this._character.characterIndex();
|
|
return (index % 4) * 3;
|
|
}
|
|
};
|
|
|
|
Sprite_Specular.prototype.characterBlockY = function () {
|
|
if (this._isBigCharacter) {
|
|
return 0;
|
|
} else {
|
|
var index = this._character.characterIndex();
|
|
return Math.floor(index / 4) * 4;
|
|
}
|
|
};
|
|
|
|
Sprite_Specular.prototype.characterPatternX = function () {
|
|
return this._character.pattern();
|
|
};
|
|
|
|
Sprite_Specular.prototype.characterPatternY = function () {
|
|
return (this._character.direction() - 2) / 2;
|
|
};
|
|
|
|
Sprite_Specular.prototype.patternWidth = function () {
|
|
if (this._tileId > 0) {
|
|
return $gameMap.tileWidth();
|
|
} else if (this._isBigCharacter) {
|
|
return this.bitmap.width / 3;
|
|
} else {
|
|
return this.bitmap.width / 12;
|
|
}
|
|
};
|
|
|
|
Sprite_Specular.prototype.patternHeight = function () {
|
|
if (this._tileId > 0) {
|
|
return $gameMap.tileHeight();
|
|
} else if (this._isBigCharacter) {
|
|
return this.bitmap.height / 4;
|
|
} else {
|
|
return this.bitmap.height / 8;
|
|
}
|
|
};
|
|
|
|
Sprite_Specular.prototype.updateHalfBodySprites = function () {
|
|
if (this._bushDepth > 0) {
|
|
this.createHalfBodySprites();
|
|
this._upperBody.bitmap = this.bitmap;
|
|
this._upperBody.visible = true;
|
|
this._upperBody.y = -this._bushDepth;
|
|
this._lowerBody.bitmap = this.bitmap;
|
|
this._lowerBody.visible = true;
|
|
this._upperBody.setBlendColor(this.getBlendColor());
|
|
this._lowerBody.setBlendColor(this.getBlendColor());
|
|
this._upperBody.setColorTone(this.getColorTone());
|
|
this._lowerBody.setColorTone(this.getColorTone());
|
|
} else if (this._upperBody) {
|
|
this._upperBody.visible = false;
|
|
this._lowerBody.visible = false;
|
|
}
|
|
};
|
|
|
|
Sprite_Specular.prototype.createHalfBodySprites = function () {
|
|
if (!this._upperBody) {
|
|
this._upperBody = new Sprite();
|
|
this._upperBody.anchor.x = 0.5;
|
|
this._upperBody.anchor.y = 1;
|
|
this.addChild(this._upperBody);
|
|
}
|
|
if (!this._lowerBody) {
|
|
this._lowerBody = new Sprite();
|
|
this._lowerBody.anchor.x = 0.5;
|
|
this._lowerBody.anchor.y = 1;
|
|
this._lowerBody.opacity = 128;
|
|
this.addChild(this._lowerBody);
|
|
}
|
|
};
|
|
|
|
Sprite_Specular.prototype.updateOther = function () {
|
|
this.opacity = this._character.opacity();
|
|
this.blendMode = this._character.blendMode();
|
|
this._bushDepth = this._character.bushDepth();
|
|
};
|
|
|
|
Sprite_Specular.prototype.update = function () {
|
|
Sprite_Base.prototype.update.call(this);
|
|
this.updatePosition();
|
|
this.updateBitmap();
|
|
this.updateFrame();
|
|
this.updatePosition();
|
|
this.updateOther();
|
|
};
|
|
|
|
Sprite_Specular.prototype.updatePosition = function () {
|
|
this.x = this._character.screenX();
|
|
this.y = this._character.screenY() + this.offsetY();
|
|
this.z = this._character.screenZ();
|
|
};
|
|
|
|
Sprite_Specular.prototype.offsetY = function () {
|
|
var offsetY = offsetYVariableId
|
|
? $gameVariables.value(offsetYVariableId)
|
|
: 0;
|
|
offsetY = this._character.isEvent()
|
|
? this._character.specularOffsetY()
|
|
: offsetY;
|
|
return offsetY;
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var _sref_SMap_createParallax = Spriteset_Map.prototype.createParallax;
|
|
Spriteset_Map.prototype.createParallax = function () {
|
|
_sref_SMap_createParallax.call(this);
|
|
this.createSpecular();
|
|
};
|
|
|
|
Spriteset_Map.prototype.createSpecular = function () {
|
|
this._specularSprites = [];
|
|
$gameMap.events().forEach(function (event) {
|
|
this._specularSprites.push(new Sprite_Specular(event));
|
|
}, this);
|
|
$gameMap.vehicles().forEach(function (vehicle) {
|
|
this._specularSprites.push(new Sprite_Specular(vehicle));
|
|
}, this);
|
|
$gamePlayer.followers().reverseEach(function (follower) {
|
|
this._specularSprites.push(new Sprite_Specular(follower));
|
|
}, this);
|
|
this._specularSprites.push(new Sprite_Specular($gamePlayer));
|
|
for (var i = 0; i < this._specularSprites.length; i++) {
|
|
this._baseSprite.addChild(this._specularSprites[i]);
|
|
}
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
var __SMap_snapForBattleBackground =
|
|
Scene_Map.prototype.snapForBattleBackground;
|
|
Scene_Map.prototype.snapForBattleBackground = function () {
|
|
this._spriteset._specularSprites.forEach(function (s) {
|
|
s._startBattle = true;
|
|
s.visible = false;
|
|
});
|
|
__SMap_snapForBattleBackground.call(this);
|
|
};
|
|
|
|
////////////////////////////////////////////////////////////////////////////////////
|
|
})();
|