Indie Dev

Hello Guest!. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, sell your games, upload content, as well as connect with other members through your own private inbox!

List Custom Weather Effect in "Set Weather Effect" Window

Sethorion

Towns Guard
Xy$
0.00
I decided to screw around with new weather effects. It seemed pretty easy at first:

I found the weather sprites in the core.js file and, for everywhere that 'snow' was listed, I created a copy and edited it to 'grey' instead of 'white' particles.

There is exactly one problem: When I restart RPG Maker MV and attempt to use the new weather effect, it does not show up in the dropdown of weather effects. How do I make it show up?

Here's all the weather-related code from the core.js file. My additions are in red.


//-----------------------------------------------------------------------------
/**
* The weather effect which displays rain, storm, or snow.
*
* @class Weather
* @constructor
*/
function Weather() {
this.initialize.apply(this, arguments);
}

Weather.prototype = Object.create(PIXI.DisplayObjectContainer.prototype);
Weather.prototype.constructor = Weather;

Weather.prototype.initialize = function() {
PIXI.DisplayObjectContainer.call(this);

this._width = Graphics.width;
this._height = Graphics.height;
this._sprites = [];

this._createBitmaps();
this._createDimmer();

/**
* The type of the weather in ['none', 'rain', 'storm', 'snow'].
*
* @property type
* @type String
*/
this.type = 'none';

/**
* The power of the weather in the range (0, 9).
*
* @property power
* @type Number
*/
this.power = 0;

/**
* The origin point of the weather for scrolling.
*
* @property origin
* @type Point
*/
this.origin = new Point();
};

/**
* Updates the weather for each frame.
*
* @method update
*/
Weather.prototype.update = function() {
this._updateDimmer();
this._updateAllSprites();
};

/**
* @method _createBitmaps
* @private
*/
Weather.prototype._createBitmaps = function() {
this._rainBitmap = new Bitmap(1, 60);
this._rainBitmap.fillAll('white');
this._stormBitmap = new Bitmap(2, 100);
this._stormBitmap.fillAll('white');
this._snowBitmap = new Bitmap(9, 9);
this._snowBitmap.drawCircle(4, 4, 4, 'white');
this._ashBitmap = new Bitmap(9, 9);
this._ashBitmap.drawCircle(3, 3, 3, 'grey');

};

/**
* @method _createDimmer
* @private
*/
Weather.prototype._createDimmer = function() {
this._dimmerSprite = new ScreenSprite();
this._dimmerSprite.setColor(80, 80, 80);
this.addChild(this._dimmerSprite);
};

/**
* @method _updateDimmer
* @private
*/
Weather.prototype._updateDimmer = function() {
this._dimmerSprite.opacity = Math.floor(this.power * 6);
};

/**
* @method _updateAllSprites
* @private
*/
Weather.prototype._updateAllSprites = function() {
var maxSprites = Math.floor(this.power * 10);
while (this._sprites.length < maxSprites) {
this._addSprite();
}
while (this._sprites.length > maxSprites) {
this._removeSprite();
}
this._sprites.forEach(function(sprite) {
this._updateSprite(sprite);
sprite.x = sprite.ax - this.origin.x;
sprite.y = sprite.ay - this.origin.y;
}, this);
};

/**
* @method _addSprite
* @private
*/
Weather.prototype._addSprite = function() {
var sprite = new Sprite(this.viewport);
sprite.opacity = 0;
this._sprites.push(sprite);
this.addChild(sprite);
};

/**
* @method _removeSprite
* @private
*/
Weather.prototype._removeSprite = function() {
this.removeChild(this._sprites.pop());
};

/**
* @method _updateSprite
* @param {Sprite} sprite
* @private
*/
Weather.prototype._updateSprite = function(sprite) {
switch (this.type) {
case 'rain':
this._updateRainSprite(sprite);
break;
case 'storm':
this._updateStormSprite(sprite);
break;
case 'snow':
this._updateSnowSprite(sprite);
break;
case 'ash':
this._updateAshSprite(sprite);
break;

}
if (sprite.opacity < 40) {
this._rebornSprite(sprite);
}
};

/**
* @method _updateRainSprite
* @param {Sprite} sprite
* @private
*/
Weather.prototype._updateRainSprite = function(sprite) {
sprite.bitmap = this._rainBitmap;
sprite.rotation = Math.PI / 16;
sprite.ax -= 6 * Math.sin(sprite.rotation);
sprite.ay += 6 * Math.cos(sprite.rotation);
sprite.opacity -= 6;
};

/**
* @method _updateStormSprite
* @param {Sprite} sprite
* @private
*/
Weather.prototype._updateStormSprite = function(sprite) {
sprite.bitmap = this._stormBitmap;
sprite.rotation = Math.PI / 8;
sprite.ax -= 8 * Math.sin(sprite.rotation);
sprite.ay += 8 * Math.cos(sprite.rotation);
sprite.opacity -= 8;
};

/**
* @method _updateSnowSprite
* @param {Sprite} sprite
* @private
*/
Weather.prototype._updateSnowSprite = function(sprite) {
sprite.bitmap = this._snowBitmap;
sprite.rotation = Math.PI / 16;
sprite.ax -= 3 * Math.sin(sprite.rotation);
sprite.ay += 3 * Math.cos(sprite.rotation);
sprite.opacity -= 3;
};

/**
* @method _updateAshSprite
* @param {Sprite} sprite
* @private
*/
Weather.prototype._updateAshSprite = function(sprite) {
sprite.bitmap = this._ashBitmap;
sprite.rotation = Math.PI / 16;
sprite.ax -= 3 * Math.sin(sprite.rotation);
sprite.ay += 3 * Math.cos(sprite.rotation);
sprite.opacity -= 3;
};


/**
* @method _rebornSprite
* @param {Sprite} sprite
* @private
*/
Weather.prototype._rebornSprite = function(sprite) {
sprite.ax = Math.randomInt(Graphics.width + 100) - 100 + this.origin.x;
sprite.ay = Math.randomInt(Graphics.height + 200) - 200 + this.origin.y;
sprite.opacity = 160 + Math.randomInt(60);
};


Let me know if this contains code not relevant to the problem, so that I can cut it down.
 
Last edited:
You won't be able to, as those are defaults in-built into the program itself. Instead you'll have to call it from the map you want to use the effect.

Firstly, be sure to always alias where you can (even when experimenting). So the _createBitmap method can be aliased.

JavaScript:
var _alias_weather_createBitmaps = Weather.prototype._createBitmaps;
Weather.prototype._createBitmaps = function() {
    _alias_weather_createBitmaps.call(this);
    this._ashBitmap = new Bitmap(9, 9);
    this._ashBitmap.drawCircle(3, 3, 3, 'gray');
};
When you call the map you'll use the Script command and place the following:

JavaScript:
$gameScreen.changeWeather('ash', power, duration);
where the power and duration are the numbers corresponding to the same settings as in the Set Weather Effect command event.
 
Last edited:
Top