578 lines
No EOL
18 KiB
JavaScript
578 lines
No EOL
18 KiB
JavaScript
//=============================================================================
|
|
// Gacha.js
|
|
//
|
|
// (c)2016 KADOKAWA CORPORATION./YOJI OJIMA
|
|
//=============================================================================
|
|
|
|
/*:
|
|
* @plugindesc Get the item at random
|
|
* @author Takeya Kimura
|
|
*
|
|
* @param Help Message Text
|
|
* @desc The help message for gacha window. "Required Amount" is replaced with the Required Amount.
|
|
* @default 1回Required Amount\Gでガチャを引きます
|
|
*
|
|
* @param Button Text
|
|
* @desc The button text for gacha commands.
|
|
* @default ガチャを引く
|
|
*
|
|
* @param Get Message Text
|
|
* @desc The message of After receiving. "Item Name" is replaced with the received item name.
|
|
* @default GET Item Name
|
|
*
|
|
* @param Show Item Description
|
|
* @desc The switch of item description display
|
|
* @default 0
|
|
*
|
|
* @param Effect
|
|
* @desc The animation number for get effect.
|
|
* @default 119
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank1 Effect
|
|
* @desc The animation number for rank 1 effect. If you specify -1, does not display the animation.
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank2 Effect
|
|
* @desc The animation number for rank 2 effect. If you specify -1, does not display the animation.
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank3 Effect
|
|
* @desc The animation number for rank 3 effect. If you specify -1, does not display the animation.
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank4 Effect
|
|
* @desc The animation number for rank 4 effect. If you specify -1, does not display the animation.
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank5 Effect
|
|
* @desc The animation number for rank 5 effect. If you specify -1, does not display the animation.
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param ME
|
|
* @desc The ME name for get music effect.
|
|
* @default Organ
|
|
* @require 1
|
|
* @dir audio/me/
|
|
* @type file
|
|
*
|
|
* @param Required Amount
|
|
* @desc The Gold for gacha.
|
|
* @default 100
|
|
*
|
|
* @noteParam gachaImage
|
|
* @noteRequire 1
|
|
* @noteDir img/gacha/
|
|
* @noteType file
|
|
* @noteData items
|
|
*
|
|
* @help
|
|
*
|
|
* Plugin Command:
|
|
* Gacha open # Open the Gacha screen
|
|
* Gacha add item 1 # Add item #1 to the Gacha
|
|
* Gacha remove item 1 # Remove item #1 from the Gacha
|
|
* Gacha clear # Clear the Gacha
|
|
*
|
|
*
|
|
* Item Note:
|
|
* <gachaImage:image> # Gacha image file name. Please image put in "img/gacha/" folder.
|
|
* <gachaNumLot:10> # The number of the lottery.
|
|
* <gachaRank:5> # The rank of the item(1-5).
|
|
*/
|
|
|
|
/*:ja
|
|
* @plugindesc ランダムにアイテムを取得します。
|
|
* @author Takeya Kimura
|
|
*
|
|
* @param Help Message Text
|
|
* @desc ガチャ画面のヘルプメッセージです。「Required Amount」は消費Gと置換されます。
|
|
* @default 1回Required Amount\Gでガチャを引きます
|
|
*
|
|
* @param Button Text
|
|
* @desc ガチャボタンに表示するテキストです。
|
|
* @default ガチャを引く
|
|
*
|
|
* @param Get Message Text
|
|
* @desc ガチャを引いた後のメッセージです。「Item Name」は取得アイテム名と置換されます。
|
|
* @default GET Item Name
|
|
*
|
|
* @param Show Item Description
|
|
* @desc 1でアイテム取得時に説明を表示します。[0: 説明非表示 1: 説明表示]
|
|
* @default 0
|
|
*
|
|
* @param Effect
|
|
* @desc アイテム取得時のアニメーションIDを指定します。
|
|
* @default 119
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank1 Effect
|
|
* @desc ランク1の時のアニメーションIDを指定します。-1を指定するとアニメーションを表示しません。
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank2 Effect
|
|
* @desc ランク2の時のアニメーションIDを指定します。-1を指定するとアニメーションを表示しません。
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank3 Effect
|
|
* @desc ランク3の時のアニメーションIDを指定します。-1を指定するとアニメーションを表示しません。
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank4 Effect
|
|
* @desc ランク4の時のアニメーションIDを指定します。-1を指定するとアニメーションを表示しません。
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param Rank5 Effect
|
|
* @desc ランク5の時のアニメーションIDを指定します。-1を指定するとアニメーションを表示しません。
|
|
* @default -1
|
|
* @require 1
|
|
* @type animation
|
|
*
|
|
* @param ME
|
|
* @desc アイテム取得時のMEを指定します。
|
|
* @default Organ
|
|
* @require 1
|
|
* @dir audio/me/
|
|
* @type file
|
|
*
|
|
* @param Required Amount
|
|
* @desc ガチャを引くのに必要なGです。
|
|
* @default 100
|
|
*
|
|
* @noteParam gachaImage
|
|
* @noteRequire 1
|
|
* @noteDir img/gacha/
|
|
* @noteType file
|
|
* @noteData items
|
|
*
|
|
* @help
|
|
*
|
|
* Plugin Command:
|
|
* Gacha open # ガチャ画面を開きます。
|
|
* Gacha add item 1 # アイテム番号1をガチャ対象に追加します。
|
|
* Gacha remove item 1 # アイテム番号1をガチャ対象から外します。
|
|
* Gacha clear # 全てのガチャ対象をクリアします。
|
|
*
|
|
*
|
|
* Item Note:
|
|
* <gachaImage:image> # ガチャアイテムの画像を指定します。画像はimg/gacha/フォルダ内に入れてください。
|
|
* <gachaNumLot:10> # ガチャアイテムのくじ数を指定します。
|
|
* <gachaRank:5> # ガチャアイテムのランクを1から5の間で指定します。
|
|
*/
|
|
|
|
(function () {
|
|
|
|
var parameters = PluginManager.parameters('Gacha');
|
|
var message;
|
|
var itemDescEnable = !!Number(parameters['Show Item Description'] || 0);
|
|
var rankEffect = [];
|
|
rankEffect.push(Number(parameters['Rank1 Effect'] || '-1'));
|
|
rankEffect.push(Number(parameters['Rank2 Effect'] || '-1'));
|
|
rankEffect.push(Number(parameters['Rank3 Effect'] || '-1'));
|
|
rankEffect.push(Number(parameters['Rank4 Effect'] || '-1'));
|
|
rankEffect.push(Number(parameters['Rank5 Effect'] || '-1'));
|
|
var me = String(parameters['ME'] || 'Organ');
|
|
var amount = Number(parameters['Required Amount'] || '100');
|
|
var reg = /Required Amount/gi;
|
|
|
|
|
|
Scene_Boot = class extends Scene_Boot {
|
|
|
|
start() {
|
|
super.start();
|
|
message = LanguageManager.getMessageData("gacha_minigame.message_0").text;
|
|
message = message.replace(reg, String(amount));
|
|
}
|
|
}
|
|
|
|
|
|
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
|
|
Game_Interpreter.prototype.pluginCommand = function (command, args) {
|
|
_Game_Interpreter_pluginCommand.call(this, command, args);
|
|
if (command === "Gacha") {
|
|
switch (args[0]) {
|
|
case "open":
|
|
SceneManager.push(Scene_Gacha);
|
|
break;
|
|
|
|
case 'add':
|
|
$gameSystem.addToGacha(args[1], Number(args[2]));
|
|
break;
|
|
|
|
case 'remove':
|
|
$gameSystem.removeFromGacha(args[1], Number(args[2]));
|
|
break;
|
|
|
|
case 'clear':
|
|
$gameSystem.clearGacha();
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
// YIN
|
|
Game_Interpreter.prototype.initGacha = function() {
|
|
ImageManager.loadAtlas("gacha_prizes");
|
|
// INIT GACHA
|
|
this._gachaItem = null;
|
|
this._gachaLot = [];
|
|
|
|
this._rankSprite = new Sprite_GachaEffect();
|
|
this._rankSprite.keepDisplay(true);
|
|
SceneManager._scene.addChild(this._rankSprite);
|
|
|
|
var wy = 120;
|
|
var wh = 320;
|
|
this._getWindow = new Window_GachaGet(0, wy, 280, wh);
|
|
this._getWindow.itemDescEnable(itemDescEnable);
|
|
this._getWindow.hide();
|
|
SceneManager._scene.addWindow(this._getWindow);
|
|
|
|
var numLot;
|
|
var item, i, j;
|
|
for (i = 1; i < $dataItems.length; i++) {
|
|
item = $dataItems[i];
|
|
if ($gameSystem.isInGacha(item)) {
|
|
numLot = Number(item.meta.gachaNumLot || '0');
|
|
for (j = 0; j < numLot; j++) {
|
|
this._gachaLot.push(item);
|
|
}
|
|
}
|
|
}
|
|
for (i = 1; i < $dataWeapons.length; i++) {
|
|
item = $dataWeapons[i];
|
|
if ($gameSystem.isInGacha(item)) {
|
|
numLot = Number(item.meta.gachaNumLot || '0');
|
|
for (j = 0; j < numLot; j++) {
|
|
this._gachaLot.push(item);
|
|
}
|
|
}
|
|
}
|
|
for (i = 1; i < $dataArmors.length; i++) {
|
|
item = $dataArmors[i];
|
|
if ($gameSystem.isInGacha(item)) {
|
|
numLot = Number(item.meta.gachaNumLot || '0');
|
|
for (j = 0; j < numLot; j++) {
|
|
this._gachaLot.push(item);
|
|
}
|
|
}
|
|
}
|
|
|
|
this._gachaItem = this._gachaLot[(Math.random() * this._gachaLot.length) >> 0];
|
|
this._getWindow.setItem(this._gachaItem);
|
|
$gameParty.gainItem(this._gachaItem, 1);
|
|
}
|
|
|
|
// YIN
|
|
Game_Interpreter.prototype.displayGachaItem = function(item) {
|
|
this._getWindow._gachaSprite.opacity = 0;
|
|
this._moveGet = true;
|
|
this._getWindow.x = (Graphics.boxWidth - this._getWindow.width) / 2;
|
|
this._getWindow.y = 120;
|
|
this._getWindow.show();
|
|
}
|
|
|
|
// YIN
|
|
Game_Interpreter.prototype.removeGachaWindow = function() {
|
|
this._gachaClosing = true;
|
|
}
|
|
|
|
var yin_Interpreter_Update = Game_Interpreter.prototype.update;
|
|
Game_Interpreter.prototype.update = function () {
|
|
yin_Interpreter_Update.call(this);
|
|
if (this._gachaClosing) {
|
|
this._getWindow._gachaSprite.opacity -= 20;
|
|
this._rankSprite.opacity -= 28;
|
|
if (this._getWindow._gachaSprite.opacity <= 0) {
|
|
this._getWindow.close();
|
|
this._gachaItem = null;
|
|
this._gachaLot = [];
|
|
this._rankSprite.allRemove();
|
|
SceneManager._scene.removeChild(this._rankSprite);
|
|
SceneManager._scene.removeChild(this._getWindow);
|
|
|
|
this._getWindow = null;
|
|
this._rankSprite = null;
|
|
this._moveGet = null;
|
|
this._gachaClosing = null;
|
|
}
|
|
}
|
|
if (this._getWindow && this._getWindow._gachaSprite.opacity < 255 && this._moveGet) {
|
|
this._getWindow._gachaSprite.opacity += 4;
|
|
this._getWindow.y -= 5;
|
|
if (this._getWindow.y <= 32) {
|
|
this._getWindow.y = 32;
|
|
}
|
|
if (this._getWindow._gachaSprite.opacity >= 255) {
|
|
this._getWindow._gachaSprite.opacity = 255;
|
|
}
|
|
if (this._getWindow._gachaSprite.opacity === 255 && this._getWindow.y === 32) {
|
|
this._moveGet = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
Game_System.prototype.addToGacha = function(type, dataId) {
|
|
if (!this._GachaFlags) {
|
|
this.clearGacha();
|
|
}
|
|
var typeIndex = this.gachaTypeToIndex(type);
|
|
if (typeIndex >= 0) {
|
|
this._GachaFlags[typeIndex][dataId] = true;
|
|
}
|
|
};
|
|
|
|
Game_System.prototype.removeFromGacha = function(type, dataId) {
|
|
if (this._GachaFlags) {
|
|
var typeIndex = this.gachaTypeToIndex(type);
|
|
if (typeIndex >= 0) {
|
|
this._GachaFlags[typeIndex][dataId] = false;
|
|
}
|
|
}
|
|
};
|
|
|
|
Game_System.prototype.gachaTypeToIndex = function(type) {
|
|
switch (type) {
|
|
case 'item':
|
|
return 0;
|
|
case 'weapon':
|
|
return 1;
|
|
case 'armor':
|
|
return 2;
|
|
default:
|
|
return -1;
|
|
}
|
|
};
|
|
|
|
Game_System.prototype.clearGacha = function() {
|
|
this._GachaFlags = [[], [], []];
|
|
};
|
|
|
|
Game_System.prototype.isInGacha = function(item) {
|
|
if (this._GachaFlags && item) {
|
|
var typeIndex = -1;
|
|
if (DataManager.isItem(item)) {
|
|
typeIndex = 0;
|
|
} else if (DataManager.isWeapon(item)) {
|
|
typeIndex = 1;
|
|
} else if (DataManager.isArmor(item)) {
|
|
typeIndex = 2;
|
|
}
|
|
if (typeIndex >= 0) {
|
|
return !!this._GachaFlags[typeIndex][item.id];
|
|
} else {
|
|
return false;
|
|
}
|
|
} else {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
function Window_GachaGet() {
|
|
this.initialize.apply(this, arguments);
|
|
}
|
|
|
|
Window_GachaGet.prototype = Object.create(Window_Base.prototype);
|
|
Window_GachaGet.prototype.constructor = Window_GachaGet;
|
|
|
|
Window_GachaGet.prototype.initialize = function(x, y, width, height) {
|
|
Window_Base.prototype.initialize.call(this, x, y, width, height);
|
|
this.opacity = 0;
|
|
this._item = null;
|
|
this._itemDescEnable = true;
|
|
this._gachaSprite = new Sprite();
|
|
this._gachaSprite.anchor.x = 0.5;
|
|
this._gachaSprite.anchor.y = 0.5; // bottom
|
|
this._gachaSprite.x = width / 2;
|
|
this._gachaSprite.y = Graphics.boxHeight - height - this._gachaSprite.height - this.standardPadding();
|
|
this._gachaSprite.opacity = 0;
|
|
this.addChildToBack(this._gachaSprite);
|
|
this.refresh();
|
|
};
|
|
|
|
Window_GachaGet.prototype.isUsingCustomCursorRectSprite = function () { return true; };
|
|
|
|
Window_GachaGet.prototype.itemDescEnable = function(value) {
|
|
if (this._itemDescEnable !== value) {
|
|
this._itemDescEnable = value;
|
|
this.refresh();
|
|
}
|
|
};
|
|
|
|
Window_GachaGet.prototype.setItem = function(item) {
|
|
if (this._item !== item) {
|
|
this._item = item;
|
|
this.refresh();
|
|
}
|
|
};
|
|
|
|
Window_GachaGet.prototype.update = function() {
|
|
Window_Base.prototype.update.call(this);
|
|
if (this._gachaSprite.bitmap) {
|
|
var bitmapHeight = this._gachaSprite.bitmap.height;
|
|
var contentsHeight = this.contents.height;
|
|
if (this._itemDescEnable) {
|
|
contentsHeight -= this.lineHeight() * 3
|
|
}
|
|
var scale = 1;
|
|
if (bitmapHeight > contentsHeight) {
|
|
scale = contentsHeight / bitmapHeight;
|
|
}
|
|
this._gachaSprite.scale.x = scale;
|
|
this._gachaSprite.scale.y = scale;
|
|
}
|
|
};
|
|
|
|
Window_GachaGet.prototype.refresh = function() {
|
|
var item = this._item;
|
|
this.contents.clear();
|
|
|
|
if (this._itemDescEnable) {
|
|
var y = this.contentsHeight() - this.lineHeight() * 3;
|
|
this.drawHorzLine(y);
|
|
this.drawDescription(0, y + this.lineHeight());
|
|
}
|
|
|
|
if (!item || !item.meta.gachaImage) {
|
|
this._gachaSprite.bitmap = null;
|
|
return;
|
|
}
|
|
else {
|
|
var bitmap;
|
|
bitmap = ImageManager.loadPicture(this._item.meta.gachaImage);
|
|
this._gachaSprite.bitmap = bitmap;
|
|
bitmap.smooth = true;
|
|
if ([83,90,91,92,93].contains(this._item.id)) {
|
|
this._gachaSprite.y = this._gachaSprite.y - 32;
|
|
}
|
|
}
|
|
};
|
|
|
|
Window_GachaGet.prototype.drawDescription = function(x, y) {
|
|
if (this._item) this.drawTextEx(this._item.description, x, y);
|
|
};
|
|
|
|
Window_GachaGet.prototype.drawHorzLine = function(y) {
|
|
var lineY = y + this.lineHeight() / 2 - 1;
|
|
this.contents.paintOpacity = 48;
|
|
this.contents.fillRect(0, lineY, this.contentsWidth(), 2, this.lineColor());
|
|
this.contents.paintOpacity = 255;
|
|
};
|
|
|
|
Window_GachaGet.prototype.lineColor = function() {
|
|
return this.normalColor();
|
|
};
|
|
|
|
|
|
|
|
function Sprite_GachaEffect() {
|
|
this.initialize.apply(this, arguments);
|
|
}
|
|
|
|
Sprite_GachaEffect.prototype = Object.create(Sprite.prototype);
|
|
Sprite_GachaEffect.prototype.constructor = Sprite_GachaEffect;
|
|
|
|
Sprite_GachaEffect.prototype.initialize = function() {
|
|
Sprite.prototype.initialize.call(this);
|
|
this._animationSprites = [];
|
|
this._endSprites = [];
|
|
this._effectTarget = this;
|
|
this._hiding = false;
|
|
this._keepDisplay = false;
|
|
};
|
|
|
|
Sprite_GachaEffect.prototype.keepDisplay = function(value) {
|
|
this._keepDisplay = value;
|
|
};
|
|
|
|
Sprite_GachaEffect.prototype.update = function() {
|
|
Sprite.prototype.update.call(this);
|
|
this.updateVisibility();
|
|
this.updateAnimationSprites();
|
|
};
|
|
|
|
Sprite_GachaEffect.prototype.hide = function() {
|
|
this._hiding = true;
|
|
this.updateVisibility();
|
|
};
|
|
|
|
Sprite_GachaEffect.prototype.show = function() {
|
|
this._hiding = false;
|
|
this.updateVisibility();
|
|
};
|
|
|
|
Sprite_GachaEffect.prototype.updateVisibility = function() {
|
|
this.visible = !this._hiding;
|
|
};
|
|
|
|
Sprite_GachaEffect.prototype.updateAnimationSprites = function() {
|
|
if (this._animationSprites.length > 0) {
|
|
var sprites = this._animationSprites.clone();
|
|
this._animationSprites = [];
|
|
for (var i = 0; i < sprites.length; i++) {
|
|
var sprite = sprites[i];
|
|
if (sprite.isPlaying()) {
|
|
this._animationSprites.push(sprite);
|
|
} else {
|
|
if (!this._keepDisplay) {
|
|
sprite.remove();
|
|
}
|
|
else {
|
|
this._endSprites.push(sprite);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
Sprite_GachaEffect.prototype.startAnimation = function(animation, mirror, delay) {
|
|
var sprite = new Sprite_Animation();
|
|
sprite.setup(this._effectTarget, animation, mirror, delay);
|
|
this.parent.addChild(sprite);
|
|
this._animationSprites.push(sprite);
|
|
};
|
|
|
|
Sprite_GachaEffect.prototype.isAnimationPlaying = function() {
|
|
return this._animationSprites.length > 0;
|
|
};
|
|
|
|
Sprite_GachaEffect.prototype.allRemove = function() {
|
|
var sprites, sprite, i;
|
|
if (this._animationSprites.length > 0) {
|
|
sprites = this._animationSprites.clone();
|
|
this._animationSprites = [];
|
|
for (i = 0; i < sprites.length; i++) {
|
|
sprite = sprites[i];
|
|
sprite.remove();
|
|
}
|
|
}
|
|
if (this._endSprites.length > 0) {
|
|
sprites = this._endSprites.clone();
|
|
this._endSprites = [];
|
|
for (i = 0; i < sprites.length; i++) {
|
|
sprite = sprites[i];
|
|
sprite.remove();
|
|
}
|
|
}
|
|
};
|
|
|
|
})(); |