OMORI_Android/www.eng/js/plugins/TDS Text Effects.js
2024-01-15 18:44:53 +03:00

715 lines
26 KiB
JavaScript

//=============================================================================
// TDS Text Effects
// Version: 1.0
//=============================================================================
// Add to Imported List
var Imported = Imported || {} ; Imported.TDS_TextEffects = true;
// Initialize Alias Object
var _TDS_ = _TDS_ || {} ; _TDS_.TextEffects = _TDS_.TextEffects || {};
//=============================================================================
/*:
* @plugindesc
* Text Effects.
*
* @author TDS
*
* @param Effects
*
* @param SINV
* @text Vertical Sinusoidal
* @parent Effects
* @type struct<SINVEffect>[]
* @default []
* @desc Vertical Sinusoidal wave effect. (Moves up and down in a wave)
*
* @param SINH
* @text Horizontal Sinusoidal
* @parent Effects
* @type struct<SINHEffect>[]
* @default []
* @desc Horizontal Sinusoidal wave effect. (Moves left and right in a wave)
*
* @param SHAKE
* @text Shake
* @parent Effects
* @type struct<SHAKEEffect>[]
* @default []
* @desc Makes the text shake based on power set.
*
* @param RAINBOW
* @text Rainbow
* @parent Effects
* @type struct<RAINBOWEffect>[]
* @default []
* @desc Cycles through colors to create a rainbow effect on the text.
*/
//=============================================================================
// * Parameter Structures
//=============================================================================
/*~struct~SINVEffect:
* @param spacing
* @text Spacing
* @type number
* @default 1
* @desc Separation value of the wave.
*
* @param speed
* @text Speed
* @type number
* @decimals 2
* @default 0.50
* @desc Movement speed of the wave.
*
* @param amplitude
* @type Amplitude
* @type number
* @decimals 2
* @default 0.15
* @desc Amount of space to move vertically up and down.
*
*/
/*~struct~SINHEffect:
* @param spacing
* @text Spacing
* @type number
* @default 1
* @desc Separation value of the wave.
*
* @param speed
* @text Speed
* @type number
* @decimals 2
* @default 0.50
* @desc Movement speed of the wave.
*
* @param amplitude
* @type Amplitude
* @type number
* @decimals 2
* @default 0.15
* @desc Amount of space to move vertically up and down.
*
* @param anchor
* @type Anchor
* @type boolean
* @default false
* @desc Use anchor point instead of X coordinate.
*
*/
/*~struct~SHAKEEffect:
* @param powerX
* @text Power X
* @type number
* @default 3
* @desc X-Axis shaking power.
*
* @param powerY
* @text Power Y
* @type number
* @default 3
* @desc Y-Axis shaking power.
*
* @param timing
* @text Timing
* @type number
* @default 1
* @desc Amount of time to wait in frames between each movement.
*
*/
/*~struct~RAINBOWEffect:
* @param speed
* @type Speed
* @type number
* @decimals 2
* @default 0.30
* @desc Cycle speed for the rainbow
*
* @param amplitude
* @text Amplitude
* @type number
* @default 128
* @desc Amount of opacity to apply to rainbow cycles.
*
* @param center
* @text Center
* @type number
* @default 128
* @desc Opacity color from which amplitude will move to and from.
*
* @param redPhase
* @text Red Phase
* @type number
* @default 2
* @desc Red color phase. Used for color application in the cycle.
*
* @param greenPhase
* @text Green Phase
* @type number
* @default 4
* @desc Green color phase. Used for color application in the cycle.
*
* @param bluePhase
* @text Blue Phase
* @type number
* @default 6
* @desc Blue color phase. Used for color application in the cycle.
*
* @param opacity
* @text Opacity
* @type number
* @default 255
* @desc Base opacity of the rainbow color.
*
* @param useWaveOpacity
* @text Use Wave Opacity
* @type boolean
* @default false
* @desc If true it applies a wave effect to the opacity of the rainbow.
*/
// Node.js path
var path = require('path');
// Get Parameters
var parameters = PluginManager.parameters("TDS Text Effects");
// Initialize After Battle Commmon Event Parameters
_TDS_.TextEffects.params = {};
_TDS_.TextEffects.letterEffects = {}
// List of Letter Effects
var letterEffects = ['SINV', 'SINH', 'SHAKE', 'RAINBOW']
// Go through letter effects
for (var i = 0; i < letterEffects.length; i++) {
// Get Letter Effect Name
var name = letterEffects[i];
// Get Data List
var dataList = JSON.parse(parameters[name]);
// Initialize Letter Effects List
var list = _TDS_.TextEffects.letterEffects[name] = [];
// Go Through Data list
for (var i2 = 0; i2 < dataList.length; i2++) {
// Get Data
var data = JSON.parse(dataList[i2])
// Parse data
Object.keys(data).map(function(key, index) { data[key] = JSON.parse(data[key])});
// Set Data name
data.name = name
// Add data to list
list.push(data);
};
};
//=============================================================================
// ** Bitmap
//-----------------------------------------------------------------------------
// The basic object that represents an image.
//=============================================================================
// Alias Listing
//=============================================================================
_TDS_.TextEffects.Bitmap_initialize = Bitmap.prototype.initialize;
_TDS_.TextEffects.Bitmap_drawText = Bitmap.prototype.drawText;
//=============================================================================
// * Object Initialization
//=============================================================================
Bitmap.prototype.initialize = function(width, height) {
// Text Drawing Block flag
this._blockTextDrawing = false;
// Run Original Function
_TDS_.TextEffects.Bitmap_initialize.call(this, width, height);
};
//=============================================================================
// * Block or Unblock text drawing
//=============================================================================
Bitmap.prototype.blockTextDrawing = function() { this._blockTextDrawing = true; }
Bitmap.prototype.unblockTextDrawing = function() { this._blockTextDrawing = false; }
//=============================================================================
// * Draw Text
//=============================================================================
Bitmap.prototype.drawText = function(text, x, y, maxWidth, lineHeight, align) {
// If Block Text Drawing
if (this._blockTextDrawing) { return; }
// Run Original Function
_TDS_.TextEffects.Bitmap_drawText.call(this, text, x, y, maxWidth, lineHeight, align);
};
//=============================================================================
// ** Window_Base
//-----------------------------------------------------------------------------
// The game object class for the party. Information such as gold and items is
// included.
//=============================================================================
// Alias Listing
//=============================================================================
_TDS_.TextEffects.Window_Base__createAllParts = Window_Base.prototype._createAllParts;
_TDS_.TextEffects.Window_Base_initialize = Window_Base.prototype.initialize;
_TDS_.TextEffects.Window_Base_update = Window_Base.prototype.update
_TDS_.TextEffects.Window_Base_processEscapeCharacter = Window_Base.prototype.processEscapeCharacter
_TDS_.TextEffects.Window_Base_processNormalCharacter = Window_Base.prototype.processNormalCharacter;
//=============================================================================
// * Object Initialize
//=============================================================================
Window_Base.prototype.initialize = function(x, y, width, height) {
// Initialize Letter Effects
this.initLetterEffects();
// Super Call
_TDS_.TextEffects.Window_Base_initialize.call(this, x, y, width, height);
};
//=============================================================================
// * Create All Parts
//=============================================================================
Window_Base.prototype._createAllParts = function() {
// Super Call
_TDS_.TextEffects.Window_Base__createAllParts.call(this);
// Create Letter container
this.createLetterEffectContainer();
};
//=============================================================================
// * Process Normal Character
//=============================================================================
Window_Base.prototype.processNormalCharacter = function(textState) {
// If Character is not empty
if (this.canCreateLetterEffectSprite()) {
// Create Letter Effect Sprite
this.createLetterEffectSprite(textState);
// Block Text Drawing
this.contents.blockTextDrawing();
};
// // Block Text Drawing
// this.contents.unblockTextDrawing();
// Super Call
_TDS_.TextEffects.Window_Base_processNormalCharacter.call(this, textState);
};
//=============================================================================
// * Process Escape Character
//=============================================================================
Window_Base.prototype.processEscapeCharacter = function(code, textState) {
// If Not ignoring letter effec escape codes
if (!this.isIgnoringLetterEffectEscapeCodes()) {
switch (code) {
case 'LETAG': // Tag effects
// Set Letter Effect Tag
this._letterEffectTag = this.obtainEscapeParam(textState);
break
case 'LESTP': // Stop all tagged
// Get Tag
var tag = this.obtainEscapeParam(textState);
// Go Through Letter Effects
for (var i = 0; i < this._letterEffects.length; i++) {
// Get Letter Effect
var effect = this._letterEffects[i];
// If the effect has a matching tag
if (effect.tag === tag) {
// Deactivate Effect
effect.active = false
};
};
break
case 'LESYNCH':
// Set Letter Effect Synch index
this._letterEffectSynchIndex = this.obtainEscapeParam(textState);
break
case 'LETMR': // Set Timer
// Get Time
var time = this.obtainEscapeParam(textState);
// If Time is 0
if (time === 0) {
// Set timer to null
this._letterEffectTimer = null;
} else {
// Set Letter Effect timer time
this._letterEffectTimer = time;
};
break
case 'LECLEAR': // Clear All Letter Effects
// Go Through Letter Effects
for (var i = 0; i < this._letterEffects.length; i++) {
// Get Letter Effect
var effect = this._letterEffects[i];
// If the effect has no end index
if (effect.endIndex === Infinity) {
// Set Letter Effect End Index
effect.endIndex = textState.index;
};
};
// Increase Text State Index (Accounts for needed space)
textState.index++
break;
case 'SINV':
// Setup Letter Effect
this.setupLetterEffect(code, this.obtainEscapeParam(textState), textState);
break;
case 'SINH':
// Setup Letter Effect
this.setupLetterEffect(code, this.obtainEscapeParam(textState), textState);
break;
case 'QUAKE':
// Setup Letter Effect
this.setupLetterEffect('SHAKE', this.obtainEscapeParam(textState), textState);
break;
case 'RAINBOW':
// Setup Letter Effect
this.setupLetterEffect(code, this.obtainEscapeParam(textState), textState);
break;
};
};
// Run Original Function
_TDS_.TextEffects.Window_Base_processEscapeCharacter.call(this, code, textState);
};
//=============================================================================
// * Frame Update
//=============================================================================
Window_Base.prototype.update = function() {
// Run Original Function
_TDS_.TextEffects.Window_Base_update.call(this);
// Update Letter Effects
this.updateLetterEffects();
};
//=============================================================================
// * Initialize Letter Effects
//=============================================================================
Window_Base.prototype.initLetterEffects = function() {
// Clear Letter Effect Sprites
this.clearLetterEffectSprites();
// Initialize Letter Efffect Sprites
this._letterEffectSprites = [];
// Array of Letter Effects
this._letterEffects = []
// Array of Finished Letter Effects
this._finishedLetterEffects = [];
// Letter Effects Active flag
this._letterEffectsActive = false;
// Set Letter Effect Tag
this._letterEffectTag = 0;
// Set Letter Effect Timer to null
this._letterEffectTimer = null;
// Synch Next Letter Effect Sprite
this._synchNextLetterEffectSprite = false;
// Letter Effect Synch Index
this._letterEffectSynchIndex = null;
};
//=============================================================================
// * Create Letter Container
//=============================================================================
Window_Base.prototype.createLetterEffectContainer = function() {
// Create Letter container sprite
this._letterEffectContainerSprite = new Sprite();
this.addChild(this._letterEffectContainerSprite);
};
//=============================================================================
// * Determine if Letter Effect Sprite can be created
//=============================================================================
Window_Base.prototype.canCreateLetterEffectSprite = function() {
if (this._checkWordWrapMode) { return false; }
if (this._letterEffectsActive) { return true; }
return false
};
//=============================================================================
// * Determine if Letter Effect Effect Escape Codes should be ignored
//=============================================================================
Window_Base.prototype.isIgnoringLetterEffectEscapeCodes = function() {
if (this._checkWordWrapMode) { return true; }
return false
};
//=============================================================================
// * Clear Letter Effect Sprites
//=============================================================================
Window_Base.prototype.clearLetterEffectSprites = function() {
// If Letter Effect Sprites Exist
if (this._letterEffectSprites) {
// Go through Letter Effect Sprites
for (var i = 0; i < this._letterEffectSprites.length; i++) {
// Remove Child From container
this._letterEffectContainerSprite.removeChild(this._letterEffectSprites[i]);
};
};
};
//=============================================================================
// * Setup Letter Effect
//=============================================================================
Window_Base.prototype.setupLetterEffect = function(code, index, textState) {
// If Index is 0 (Stop)
if (index === 0) {
// Set Letter Effect End Index
this.setLetterEffectEndIndex(code, textState);
} else {
// Add Letter Effect
this.addLetterEffect(this.getLetterEffectBase(code, index-1, textState));
};
// If there are Letter Effects
if (this._letterEffects.length > 0) {
// Check Effect Active State
var active = this._letterEffects.some(function(effect) {
return textState.index < effect.endIndex;
}, this);
// Set Letter Effects Active Flag
this._letterEffectsActive = active;
// Bock or Unlock Text drawing
active ? this.contents.blockTextDrawing() : this.contents.unblockTextDrawing()
};
};
//=============================================================================
// * Add Letter Effect
//=============================================================================
Window_Base.prototype.getLetterEffectBase = function(name, index, textState) {
// Create Effect
var effect = Object.assign({active: true, tag: this._letterEffectTag, startIndex: textState.index, endIndex: Infinity}, _TDS_.TextEffects.letterEffects[name][index])
// Set Timer
if (this._letterEffectTimer !== null) { effect.timer = 60; };
// Return Effect
return effect
};
//=============================================================================
// * Add Letter Effect
//=============================================================================
Window_Base.prototype.addLetterEffect = function(effect) {
// Add Letter Effec to Array
this._letterEffects.push(effect);
// Return effect
return effect;
};
//=============================================================================
// * Set Letter Effect End Index
//=============================================================================
Window_Base.prototype.setLetterEffectEndIndex = function(name, textState) {
// Go Through Letter Effects
for (var i = 0; i < this._letterEffects.length; i++) {
// Get Letter Effect
var lEffect = this._letterEffects[i];
// If It's a
if (lEffect.name === name && lEffect.endIndex === Infinity) {
// Set Letter Effect End Index
lEffect.endIndex = textState.index;
};
};
};
//=============================================================================
// * Create Letter Effect Sprite
//=============================================================================
Window_Base.prototype.createLetterEffectSprite = function(textState) {
// Get Character
var c = textState.text[textState.index];
// Get Character width
var w = Math.round(this.textWidth(c));
// If Character Is empty
if (c === ' ') { return; }
// Create Bitmap
var bitmap = new Bitmap(w, textState.height + 10);
// Copy Bitmap Settings
bitmap.fontFace = this.contents.fontFace;
bitmap.fontSize = this.contents.fontSize;
bitmap.textColor = this.contents.textColor;
// bitmap.fillAll('rgba(255, 0, 0, 0.5)')
// Draw Character
bitmap.drawText(c, 0, 0, bitmap.width, bitmap.height, 'center');
// Create Sprite
var sprite = new Sprite(bitmap)
var padding = this.standardPadding();
sprite.x = textState.x + padding;
sprite.y = textState.y + padding - 5;
// sprite.x = Math.floor(textState.x + padding + (w / 2));
// sprite.y = textState.y + padding + (textState.height / 2) + 5;
// sprite.x += 250;
// sprite.y += 30
// sprite.anchor.set(0.5, 0.5)
// sprite.pivot.set(sprite.width / 2, (sprite.height / 2) + 5 )
// sprite.scale.x += 0.1
// sprite.pivot.set(0, 0);
// sprite.anchor.set(0.5, 0.5)
// sprite.scale.y += 0.1
// sprite.rotation = 0 + (Math.sin((Graphics.frameCount + (index * 1)) * 0.1) * 1)
// Set Effect Data
sprite._effectData = {origin: new Point(sprite.x, sprite.y), offset: new Point(), index: textState.index, position: this._letterEffectSprites.length, tag: this._letterEffectTag }
// Add Sprite to Letter Sprites Array
this._letterEffectSprites.push(sprite);
// Add Sprite as Child to container
this._letterEffectContainerSprite.addChild(sprite)
// If Letter Effect Synch index is not null
if (this._letterEffectSynchIndex !== null) {
// Go Through Letter Effects
for (var i = 0; i < this._letterEffects.length; i++) {
// Get Letter Effect
var effect = this._letterEffects[i];
// If the effect has a matching tag
if (effect.tag === this._letterEffectSynchIndex) {
// Set Effect Synch Sprite
effect.synchSprite = sprite;
};
};
// Set Letter Effect synch index to null
this._letterEffectSynchIndex = null;
}
};
//=============================================================================
// * Update Letter Effects
//=============================================================================
Window_Base.prototype.updateLetterEffects = function() {
// Set Letter Effects Container Sprite Visibility
this._letterEffectContainerSprite.visible = this.isOpen();
// Get Letter Sprites
var letterSprites = this._letterEffectSprites;
// If Letter Effects Exist
if (letterSprites.length > 0) {
// Go through Letter Effects
for (var i = 0; i < this._letterEffects.length; i++) {
// Get Effect
var effect = this._letterEffects[i];
// Get Synch Sprite
var synchSprite = effect.synchSprite;
// Go through Letter Sprites
for (var i2 = 0; i2 < this._letterEffectSprites.length; i2++) {
// Get Sprite
var sprite = this._letterEffectSprites[i2];
// If Synch Sprite Exists
if (synchSprite) {
// If Sprite matches synch sprite
if (sprite === synchSprite) {
// Apply Letter Effect to Sprite
this.applyLetterEffectToSprite(effect, sprite);
} else {
// Get Effect Data
var synchEffectData = synchSprite._effectData;
var effectData = sprite._effectData;
// If Effect Data Matches Effect Tag
if (effectData.tag === effect.tag) {
// Set Sprite Anchor
sprite.anchor.set(synchSprite.anchor.x, synchSprite.anchor.y)
// Set Sprite Position
sprite.x = effectData.origin.x + synchEffectData.offset.x
sprite.y = effectData.origin.y + synchEffectData.offset.y
sprite.rotation = synchSprite.rotation;
sprite.setBlendColor(synchSprite._blendColor)
}
}
} else {
// Apply Letter Effect to Sprite
this.applyLetterEffectToSprite(effect, sprite);
};
};
// If Effect has a timer
if (effect.timer && effect.endIndex !== Infinity) {
// Decrease Effect Timer
effect.timer--;
// If Effect timer is 0 or less
if (effect.timer <= 0) { effect.active = false; };
};
// Add Effect to Finished Letter Effects array if not active
if (!effect.active) { this._finishedLetterEffects.push(effect) }
};
// If Finished Letter Effects has members
if (this._finishedLetterEffects.length > 0) {
// Get removed Indexes
var removedIndexes = []
// Go through finished effects
for (var i = 0; i < this._finishedLetterEffects.length; i++) {
// Get Effect
var effect = this._finishedLetterEffects[i];
// Get Index of Effect
var index = this._letterEffects.indexOf(effect);
// Remove Effect
if (index >= 0) { this._letterEffects.splice(index, 1); }
// Add indexes to removed indexes array
removedIndexes.push([effect.startIndex, effect.endIndex])
};
// Go through Letter Sprites
for (var i = 0; i < this._letterEffectSprites.length; i++) {
// Get Sprite
var sprite = this._letterEffectSprites[i]
// Get Sprite Effect Data
var effectData = sprite._effectData;
// Reset Sprite Position
sprite.x = effectData.origin.x
sprite.y = effectData.origin.y
sprite.setBlendColor([0, 0, 0, 0])
};
// Clear Finished Letter Effects Array
this._finishedLetterEffects = []
};
};
};
//=============================================================================
// * Apply Letter Effect to Sprite
//=============================================================================
Window_Base.prototype.applyLetterEffectToSprite = function(effect, sprite) {
// Get Sprite Effect Data
var effectData = sprite._effectData;
// Get Index
var index = effectData.index;
// Check if Effect should run
if (!effect.active) { return }
if (index < effect.startIndex || index >= effect.endIndex) { return; }
// Switch Case Effect name
switch (effect.name) {
case 'test':
break;
case 'SINH':
// Set Effect Anchor
if (effect.anchor) {
// Set Anchor Position
sprite.anchor.y = 0 + (Math.sin((Graphics.frameCount + (index * effect.spacing)) * effect.speed) * effect.amplitude)
} else {
effectData.offset.x = Math.round((Math.sin((Graphics.frameCount + (index * effect.spacing)) * effect.speed) * effect.amplitude))
sprite.x = effectData.origin.x + effectData.offset.x;
}
break;
case 'SINV':
sprite.anchor.y = 0 + (Math.sin((Graphics.frameCount + (index * effect.spacing)) * effect.speed) * effect.amplitude)
break
case 'SHAKE':
// If Frame Count matches timing
if (Graphics.frameCount % effect.timing === 0) {
// Set X & Y Offsets
if (effect.powerX > 0) { effectData.offset.x = (Math.max(Math.randomInt(effect.powerX), 1) * (Math.randomInt(100) > 50 ? -1 : 1)) };
if (effect.powerY > 0) { effectData.offset.y = (Math.max(Math.randomInt(effect.powerY), 1) * (Math.randomInt(100) > 50 ? -1 : 1)) };
// Set Sprite Position
sprite.x = effectData.origin.x + effectData.offset.x;
sprite.y = effectData.origin.y + effectData.offset.y;
};
break
case 'RAINBOW':
var frame = Graphics.frameCount + index;
var red = Math.sin(effect.speed * frame + effect.redPhase) * effect.amplitude + effect.center
var green = Math.sin(effect.speed * frame + effect.greenPhase) * effect.amplitude + effect.center
var blue = Math.sin(effect.speed * frame + effect.bluePhase) * effect.amplitude + effect.center
var alpha = effect.useWaveOpacity ? Math.sin(effect.speed * frame) * effect.amplitude + effect.center : effect.opacity;
// Set Sprite Color
sprite.setBlendColor([red, green, blue, alpha])
break;
}
};
//=============================================================================
// ** Window_Message
//-----------------------------------------------------------------------------
// The window for displaying text messages.
//=============================================================================
// Alias Listing
//=============================================================================
_TDS_.TextEffects.Window_Message_startMessage = Window_Message.prototype.startMessage;
//=============================================================================
// * Start Message
//=============================================================================
Window_Message.prototype.startMessage = function() {
// Initialize Letter Effects
this.initLetterEffects();
// Run Original Function
_TDS_.TextEffects.Window_Message_startMessage.call(this);
};