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

330 lines
11 KiB
JavaScript

//=============================================================================
// TDS Particles
// Version: 1.0
//=============================================================================
// Add to Imported List
var Imported = Imported || {} ; Imported.TDS_Particles = true;
// Initialize Alias Object
var _TDS_ = _TDS_ || {} ; _TDS_.Particles = _TDS_.Particles || {};
//=============================================================================
/*:
* @plugindesc
* Particle system.
*
* @author TDS
*
*/
//=============================================================================
//=============================================================================
// ** Sprite_Particle
//-----------------------------------------------------------------------------
// This sprite class is used to draw and process particle sprites.
//=============================================================================
function Sprite_Particle() { this.initialize.apply(this, arguments); };
Sprite_Particle.prototype = Object.create(Sprite.prototype);
Sprite_Particle.prototype.constructor = Sprite_Particle;
//=============================================================================
// * Initialize Object
//=============================================================================
Sprite_Particle.prototype.initialize = function(bitmap) {
// Super Call
Sprite.prototype.initialize.call(this, bitmap);
// Phase Index
this._phaseIndex = 0;
// Phases
this._phases = []
};
//=============================================================================
// * Setup
//=============================================================================
Sprite_Particle.prototype.setup = function(phases) {
// Clone Phases
this._phases = phases.clone();
};
//=============================================================================
// * Determine if Finished
//=============================================================================
Sprite_Particle.prototype.isFinished = function() { return this._phaseIndex >= this._phases.length; };
//=============================================================================
// * Frame Update
//=============================================================================
Sprite_Particle.prototype.update = function() {
// Super Call
Sprite.prototype.update.call(this);
// Get Current Phase
var phase = this._phases[this._phaseIndex];
// If Phase Exists
if (phase) {
// Update Phase
this.updatePhase(phase);
// If Phase is Finished
if (phase.duration <= 0) {
// Increase Phase Index
this._phaseIndex++
};
};
};
//=============================================================================
// * Frame Update
//=============================================================================
Sprite_Particle.prototype.updatePhase = function(phase) {
// Decrease Phase Duration
phase.duration--
// If Phase as a Function
if (phase.functStart) { phase.functStart.call(this, phase); };
this.x += phase.x;
this.y += phase.y;
this.rotation += phase.rotation * (Math.PI / 360);
this.opacity += phase.opacity;
this.scale.x += phase.scaleX;
this.scale.y += phase.scaleY;
// If Phase as a Function
if (phase.functEnd) { phase.functEnd.call(this, phase); };
};
//=============================================================================
// ** Sprite_BattleFaceStatusEmitter
//-----------------------------------------------------------------------------
// This sprite is used to display battle face status particles.
//=============================================================================
function Sprite_BattleFaceStatusEmitter() { this.initialize.apply(this, arguments); };
Sprite_BattleFaceStatusEmitter.prototype = Object.create(Sprite.prototype);
Sprite_BattleFaceStatusEmitter.prototype.constructor = Sprite_BattleFaceStatusEmitter;
//=============================================================================
// * Initialize Object
//=============================================================================
Sprite_BattleFaceStatusEmitter.prototype.initialize = function() {
// Super Call
Sprite.prototype.initialize.call(this);
// Clear Values
this.clear();
// Deactivate
this.deactivate();
// this.setupGenerator('suns')
// this.activate();
};
//=============================================================================
// * Activate & Deactivate
//=============================================================================
Sprite_BattleFaceStatusEmitter.prototype.activate = function() { this._active = true;};
Sprite_BattleFaceStatusEmitter.prototype.deactivate = function() { this._active = false;};
//=============================================================================
// * Clear
//=============================================================================
Sprite_BattleFaceStatusEmitter.prototype.clear = function() {
// Set Intensity (How many sprites to spawn each time)
this._intensity = 1;
this._intensityVariance = 0;
// Set Generation Type
this._generateFunct = null;
// Set Spawn Timer
this._spawnTimer = 0;
this._spawnTimerVariance = 0;
this._spawnTimerCount = this._spawnTimer;
// Set Child Limit
this._childLimit = 0;
};
//=============================================================================
// * Setup generator
//=============================================================================
Sprite_BattleFaceStatusEmitter.prototype.setupGenerator = function(type, settings = {}) {
// Clear
this.clear();
// Switch Type Case
switch (type.toLowerCase()) {
case 'angrytest':
this._intensity = 1;
this._intensityVariance = 0;
// Set Generation Type
this._generateFunct = this.generateAngry;
// Set Spawn Timer
this._spawnTimer = 10;
this._spawnTimerVariance = 0;
this._spawnTimerCount = this._spawnTimer;
// Set Child Limit
this._childLimit = 20;
break;
}
};
//=============================================================================
// * Generate Angry
//=============================================================================
Sprite_BattleFaceStatusEmitter.prototype.generateAngry = function() {
// Get Bitmap
var bitmap = ImageManager.loadPicture('StatusParticles');
// Create Sprite
var sprite = new Sprite_Particle(bitmap);
sprite.anchor.set(0.5, 0.5)
sprite.x = (Math.round(Math.random()) * 2 - 1) * Math.randomInt(45)
sprite.y = 0
sprite.setFrame(30, 30, 30, 31)
sprite.opacity = 0;
sprite.scale.set(0, 0);
this.addChild(sprite);
// Set Unique Sprite Values
sprite._baseX = sprite.x;
sprite._angryOffset = Math.randomInt(5)
sprite._angrySpeed = 1.5 + (Math.randomInt(100) / 100);
// Create Shake Function
var shakeFunct = function() {
// Shake Sprite X value
this.x = sprite._baseX + (Math.sin((Graphics.frameCount + sprite._angryOffset) * sprite._angrySpeed) * 3);
};
// Initialize Phase
var phases = [];
// Set Phase Values
var xSpeed = 0;
var ySpeed = -(1 + Math.randomInt(1));
var rotation = 0
// Appear Phase
var phase = {duration: 10, x: xSpeed, y: ySpeed, rotation: rotation, opacity: 26, scaleX: 0.1, scaleY: 0.1}
phase.functEnd = shakeFunct;
phases.push(phase);
// Main Phase (Move up)
var phase = {duration: 30, x: xSpeed, y: ySpeed * 2, rotation: rotation, opacity: 0, scaleX: 0, scaleY: 0}
phase.functEnd = shakeFunct;
phases.push(phase);
// Disappear Phase (Explode rotating)
var phase = {duration: 10, x: xSpeed, y: ySpeed, rotation: 30, opacity: -26, scaleX: 0.1, scaleY: 0.1}
phase.functEnd = shakeFunct;
phases.push(phase);
// Setup Particle Phases
sprite.setup(phases)
};
//=============================================================================
// * Frame Update
//=============================================================================
Sprite_BattleFaceStatusEmitter.prototype.update = function() {
// Super Call
Sprite.prototype.update.call(this);
// If Children Exists
if (this.children.length > 0) {
// Go Through Children
this.children.forEach(function(particle) {
// Remove Child if Finished
if (particle.isFinished()) { this.removeChild(particle); };
}, this);
};
// If Active
if (this._active) {
// If Children Length exceeds child limit
if (this.children.length >= this._childLimit) { return; }
// If Spawn Timer is not null
if (this._spawnTimerCount !== null) {
// Reduce Spawn Timer Count
this._spawnTimerCount--;
// If Timer is 0 or less
if (this._spawnTimerCount <= 0) {
// Set Spawn Timer Count
this._spawnTimerCount = this._spawnTimer + Math.randomInt(this._spawnTimerVariance);
} else {
return;
};
}
// Call Generation Function
if (this._generateFunct) {
// Generate Amount of Sprites
for (var i = 0; i < this._intensity + Math.randomInt(this._intensityVariance); i++) {
// Run Generation Function
this._generateFunct();
};
};
};
};
//=============================================================================
// * Generate
//=============================================================================
Sprite_BattleFaceStatusEmitter.prototype.generate = function() {
var bitmap = ImageManager.loadPicture('StatusParticles');
var sprite = new Sprite_Particle(bitmap);
sprite.anchor.set(0.5, 0.5)
sprite.x = (Math.round(Math.random()) * 2 - 1) * Math.randomInt(50)
sprite.y = Math.randomInt(5);
sprite.setFrame(30, 30, 30, 31)
sprite.opacity = 0;
sprite.scale.set(0, 0);
this.addChild(sprite);
// sprite.opacity = 0;
// sprite.scale.x = sprite.scale.y = 0;
// sprite.blendMode = Math.random() > 0.5 ? Graphics.BLEND_ADD : 0;
// sprite.setBlendColor([219, 10, 91, 100]);
var phases = [];
sprite._sadSpeed = Math.randomInt(10) / 100
var shakeFunct = function() {
this.x = sprite._baseX + (Math.sin(Graphics.frameCount * sprite._sadSpeed) * 3);
// this.x = this._baseX + (Math.round(Math.random()) * 2 - 1) * Math.randomInt(3)
}
var xSpeed = 0;
var ySpeed = 0//- (1 + Math.randomInt(1))
sprite.x = (Math.round(Math.random()) * 2 - 1) * Math.randomInt(30)
sprite.y = -80;
sprite.y += Math.randomInt(10)
sprite.setFrame(90, 30, 30, 31)
sprite._baseX = sprite.x;
// Appear Phase
var phase = {duration: 10, x: xSpeed, y: ySpeed, rotation: 0, opacity: 26, scaleX: 0.1, scaleY: 0.1}
phase.functEnd = shakeFunct;
phases.push(phase);
var phase = {duration: 60, x: xSpeed, y: ySpeed, rotation: 0, opacity: 0, scaleX: 0, scaleY: 0}
phase.functEnd = shakeFunct;
phases.push(phase);
var phase = {duration: 10, x: xSpeed, y: ySpeed, rotation: 10 + Math.randomInt(10), opacity: -26, scaleX: -0.1, scaleY: -0.1}
phase.functEnd = shakeFunct;
phases.push(phase);
// Setup Particle Phases
sprite.setup(phases)
};