498 lines
No EOL
18 KiB
JavaScript
498 lines
No EOL
18 KiB
JavaScript
//=============================================================================
|
|
// Yanfly Engine Plugins - Footstep Sounds
|
|
// YEP_FootstepSounds.js
|
|
//=============================================================================
|
|
|
|
var Imported = Imported || {};
|
|
Imported.YEP_FootstepSounds = true;
|
|
|
|
var Yanfly = Yanfly || {};
|
|
Yanfly.Footsteps = Yanfly.Footsteps || {};
|
|
Yanfly.Footsteps.version = 1.01;
|
|
|
|
//=============================================================================
|
|
/*:
|
|
* @plugindesc v1.01 Set footstep sounds to play when the player and/or
|
|
* events walk over specific tiles.
|
|
* @author Yanfly Engine Plugins + Chickie Collaboration
|
|
*
|
|
* @param ---Default---
|
|
* @default
|
|
*
|
|
* @param Default Sound
|
|
* @parent ---Default---
|
|
* @type file
|
|
* @dir audio/se/
|
|
* @require 1
|
|
* @desc The default SE sound used for all tiles.
|
|
* @default Move1
|
|
*
|
|
* @param Default Volume
|
|
* @parent ---Default---
|
|
* @desc Volume of the footsteps made by default.
|
|
* Insert a number value.
|
|
* @default 10
|
|
*
|
|
* @param Default Pitch
|
|
* @parent ---Default---
|
|
* @desc Pitch of the footsteps made by default.
|
|
* Insert a number value.
|
|
* @default 150
|
|
*
|
|
* @param ---Player Settings---
|
|
* @default
|
|
*
|
|
* @param Player Enable
|
|
* @parent ---Player Settings---
|
|
* @type boolean
|
|
* @on Enable
|
|
* @off Disable
|
|
* @desc Play footstep sounds for the player character?
|
|
* Disable - false Enable - true
|
|
* @default true
|
|
*
|
|
* @param Player Volume
|
|
* @parent ---Player Settings---
|
|
* @desc What volume rate to play the footsteps at for player?
|
|
* Use a float value. 1.00 = 100% 0.50 = 50%
|
|
* @default 1.00
|
|
*
|
|
* @param Player Pitch
|
|
* @parent ---Player Settings---
|
|
* @desc What pitch rate to play the footsteps at for player?
|
|
* Use a float value. 1.00 = 100% 0.50 = 50%
|
|
* @default 1.00
|
|
*
|
|
* @param ---Event Settings---
|
|
* @default
|
|
*
|
|
* @param Event Enable
|
|
* @parent ---Event Settings---
|
|
* @type boolean
|
|
* @on Enable
|
|
* @off Disable
|
|
* @desc Play footstep sounds for the events?
|
|
* Disable - false Enable - true
|
|
* @default true
|
|
*
|
|
* @param Event Volume
|
|
* @parent ---Event Settings---
|
|
* @desc What volume rate to play the footsteps at for events?
|
|
* Use a float value. 1.00 = 100% 0.50 = 50%
|
|
* @default 1.00
|
|
*
|
|
* @param Distance Volume
|
|
* @parent ---Event Settings---
|
|
* @desc Change the volume by this much per tile difference
|
|
* from event to player. Use a float value.
|
|
* @default -0.10
|
|
*
|
|
* @param Event Pitch
|
|
* @parent ---Event Settings---
|
|
* @desc What pitch rate to play the footsteps at for events?
|
|
* Use a float value. 1.00 = 100% 0.50 = 50%
|
|
* @default 1.00
|
|
*
|
|
* @param Distance Pitch
|
|
* @parent ---Event Settings---
|
|
* @desc Change the pitch by this much per tile difference
|
|
* from event to player. Use a float value.
|
|
* @default -0.00
|
|
*
|
|
* @param Distance Pan
|
|
* @parent ---Event Settings---
|
|
* @desc Change the pan by this much per tile difference
|
|
* from event to player. Use an int value.
|
|
* @default 10
|
|
*
|
|
* @help
|
|
* ============================================================================
|
|
* Introduction
|
|
* ============================================================================
|
|
*
|
|
* This plugin gives your player and/or events footsteps when they walk onto
|
|
* tiles. These footsteps made by players and/or events can have different
|
|
* sounds based on regions, tilesets, and/or terrain tags. If footsteps are
|
|
* enabled for events, they can have distance based volumes and pitches to
|
|
* immerse the player further.
|
|
*
|
|
* This is a collaboration plugin by Chickie and Yanfly to ensure compatibility
|
|
* with the Yanfly Engine Plugins library.
|
|
*
|
|
* ============================================================================
|
|
* Instructions
|
|
* ============================================================================
|
|
*
|
|
* This plugin requires a bit of setup. Adjust the plugin parameters to set up
|
|
* a default set of footsteps that are to be played when nothing else has been
|
|
* set. These sound effects will be played when there are no region-specific
|
|
* sound effects or terrain tag-specific sound effects.
|
|
*
|
|
* That said, if you go into your project's database and go to the Tilesets tab
|
|
* you can set footsteps for each tileset. The tiles can play specific footstep
|
|
* sounds based on their terrain tag ID. Look in the notetags section below for
|
|
* the notetag setup on how to make a set of tiles play certain footsteps. The
|
|
* footsteps made here have higher priority than the default sound effects and
|
|
* if the player or event steps on a tile that has a footstep sound tied to a
|
|
* terrain tag, that footstep sound will be played instead.
|
|
*
|
|
* Even higher on the priority level are the region-based footstep sounds. If
|
|
* the player or an event steps on a tile that has a region-based footstep
|
|
* sound, then that sound will be played regardless of the terrain tag setting
|
|
* made for that specific tile. Look in the notetags section below for the
|
|
* notetag setup on how to make a specific region ID play a footstep sound.
|
|
*
|
|
* To sum it up, from lowest to highest priority:
|
|
*
|
|
* LOWEST - Default Footstep Sound
|
|
* Terrain Tag Footstep Sound
|
|
* HIGHEST - Region-Based Footstep Sound
|
|
*
|
|
* If you wish to give a whole map a certain footsteps sound, use the notetag
|
|
* to set a region-based footstep sound for region ID 0.
|
|
*
|
|
* ============================================================================
|
|
* Notetags
|
|
* ============================================================================
|
|
*
|
|
* Insert the following notetags to add footsteps to your maps.
|
|
*
|
|
* Event Notetag:
|
|
*
|
|
* <No Footsteps>
|
|
* - Insert this into the notebox of any event you wish to not make any
|
|
* footsteps when moving.
|
|
*
|
|
* Tileset Notetags:
|
|
*
|
|
* <Terrain Tag x Footstep Sound: filename>
|
|
* <Terrain Tag x Footstep Sound: filename, volume>
|
|
* <Terrain Tag x Footstep Sound: filename, volume, pitch>
|
|
* - Replace 'x' with the terrain tag ID (from 1 to 7). If 0 is used, it will
|
|
* be ignored. When inserting the filename, the filename must be case
|
|
* sensitive and must not include the extension. The 'volume' and 'pitch'
|
|
* variables must be integar values between 0 and 100 if they are used.
|
|
*
|
|
* Examples:
|
|
*
|
|
* <Terrain Tag 1 Footstep Sound: Move1>
|
|
* <Terrain Tag 2 Footstep Sound: Move2, 80>
|
|
* <Terrain Tag 3 Footstep Sound: Move3, 75, 150>
|
|
*
|
|
* In the above examples, the tiles marked by terrain tags 1, 2, or 3 will
|
|
* play their respective sound effect when stepped on by the player or an
|
|
* event that can trigger footsteps.
|
|
*
|
|
* Map Notetags:
|
|
*
|
|
* <Region x Footstep Sound: filename>
|
|
* <Region x Footstep Sound: filename, volume>
|
|
* <Region x Footstep Sound: filename, volume, pitch>
|
|
* - Replace 'x' with the region tag ID (from 1 to 255). If 0 is used, it
|
|
* will become the default footstep sound. When inserting the filename, the
|
|
* filename must be case sensitive and must not include the extension. The
|
|
* 'volume' and 'pitch' variables must be integar values between 0 and 100 if
|
|
* they are used.
|
|
*
|
|
* Examples:
|
|
*
|
|
* <Region 10 Footstep Sound: Move1>
|
|
* <Region 20 Footstep Sound: Move2, 80>
|
|
* <Region 30 Footstep Sound: Move3, 75, 150>
|
|
*
|
|
* In the above examples, the tiles marked by regions 10, 20, or 30 will play
|
|
* their respective sound effect when stepped on by the player or an event
|
|
* that can trigger footsteps.
|
|
*
|
|
* ============================================================================
|
|
* Plugin Commands
|
|
* ============================================================================
|
|
*
|
|
* If at any time you wish to enable/disable footstep sounds in your game, you
|
|
* can use some plugin commands to do so.
|
|
*
|
|
* Plugin Commands:
|
|
*
|
|
* EnableFootsteps
|
|
* - Turns on footstep sounds.
|
|
*
|
|
* DisableFootsteps
|
|
* - Turns off footstep sounds.
|
|
*/
|
|
//=============================================================================
|
|
|
|
//=============================================================================
|
|
// Parameter Variables
|
|
//=============================================================================
|
|
|
|
Yanfly.Parameters = PluginManager.parameters('YEP_FootstepSounds');
|
|
Yanfly.Param = Yanfly.Param || {};
|
|
|
|
Yanfly.Param.Footsteps = {
|
|
defaultSound: String(Yanfly.Parameters['Default Sound']),
|
|
defaultVolume: Number(Yanfly.Parameters['Default Volume']),
|
|
defaultPitch: Number(Yanfly.Parameters['Default Pitch']),
|
|
|
|
PlayerEnable: eval(String(Yanfly.Parameters['Player Enable'])),
|
|
PlayerVolume: parseFloat(Yanfly.Parameters['Player Volume']),
|
|
PlayerPitch: parseFloat(Yanfly.Parameters['Player Pitch']),
|
|
|
|
EventEnable: eval(String(Yanfly.Parameters['Event Enable'])),
|
|
EventVolume: parseFloat(Yanfly.Parameters['Event Volume']),
|
|
DistanceVolume: parseFloat(Yanfly.Parameters['Distance Volume']),
|
|
EventPitch: parseFloat(Yanfly.Parameters['Event Pitch']),
|
|
DistancePitch: parseFloat(Yanfly.Parameters['Distance Pitch']),
|
|
DistancePan: parseInt(Yanfly.Parameters['Distance Pan'])
|
|
};
|
|
|
|
//=============================================================================
|
|
// DataManager
|
|
//=============================================================================
|
|
|
|
Yanfly.Footsteps.DataManager_isDatabaseLoaded = DataManager.isDatabaseLoaded;
|
|
DataManager.isDatabaseLoaded = function() {
|
|
if (!Yanfly.Footsteps.DataManager_isDatabaseLoaded.call(this)) return false;
|
|
if (!Yanfly._loaded_YEP_FootstepSounds) {
|
|
this.processFootstepNotetags($dataTilesets);
|
|
Yanfly._loaded_YEP_FootstepSounds = true;
|
|
}
|
|
return true;
|
|
};
|
|
|
|
DataManager.processFootstepNotetags = function(group) {
|
|
for (var n = 1; n < group.length; n++) {
|
|
var obj = group[n];
|
|
var notedata = obj.note.split(/[\r\n]+/);
|
|
|
|
obj.terrainTagFootstepSounds = {
|
|
0: [
|
|
Yanfly.Param.Footsteps.defaultSound,
|
|
Yanfly.Param.Footsteps.defaultVolume,
|
|
Yanfly.Param.Footsteps.defaultPitch
|
|
]
|
|
};
|
|
|
|
for (var i = 0; i < notedata.length; i++) {
|
|
var line = notedata[i];
|
|
if (line.match(/<TERRAIN[ ]TAG[ ](\d+)[ ]FOOTSTEP SOUND:[ ](.*)>/i)) {
|
|
var tagId = parseInt(RegExp.$1).clamp(1, 7);
|
|
var footstepData = String(RegExp.$2).split(',');
|
|
footstepData[0] = footstepData[0].trim();
|
|
footstepData[1] = footstepData[1] ||
|
|
Yanfly.Param.Footsteps.defaultVolume;
|
|
footstepData[1] = parseInt(footstepData[1]);
|
|
footstepData[2] = footstepData[2] ||
|
|
Yanfly.Param.Footsteps.defaultPitch;
|
|
footstepData[2] = parseInt(footstepData[2]);
|
|
obj.terrainTagFootstepSounds[tagId] = footstepData;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
DataManager.processMapFootstepNotetags = function() {
|
|
if (!$dataMap) return;
|
|
|
|
$dataMap.regionFootstepSounds = {
|
|
0: [
|
|
Yanfly.Param.Footsteps.defaultSound,
|
|
Yanfly.Param.Footsteps.defaultVolume,
|
|
Yanfly.Param.Footsteps.defaultPitch
|
|
]
|
|
};
|
|
|
|
if (!$dataMap.note) return;
|
|
var notedata = $dataMap.note.split(/[\r\n]+/);
|
|
for (var i = 0; i < notedata.length; i++) {
|
|
var line = notedata[i];
|
|
if (line.match(/<REGION[ ](\d+)[ ]FOOTSTEP SOUND:[ ](.*)>/i)) {
|
|
var regionId = parseInt(RegExp.$1).clamp(0, 255);
|
|
var footstepData = String(RegExp.$2).split(',');
|
|
footstepData[0] = footstepData[0].trim();
|
|
footstepData[1] = footstepData[1] || Yanfly.Param.Footsteps.defaultVolume;
|
|
footstepData[1] = parseInt(footstepData[1]);
|
|
footstepData[2] = footstepData[2] || Yanfly.Param.Footsteps.defaultPitch;
|
|
footstepData[2] = parseInt(footstepData[2]);
|
|
$dataMap.regionFootstepSounds[regionId] = footstepData;
|
|
}
|
|
}
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_System
|
|
//=============================================================================
|
|
|
|
Yanfly.Footsteps.Game_System_initialize = Game_System.prototype.initialize;
|
|
Game_System.prototype.initialize = function() {
|
|
Yanfly.Footsteps.Game_System_initialize.call(this);
|
|
this.initFootstepSettings();
|
|
};
|
|
|
|
Game_System.prototype.initFootstepSettings = function() {
|
|
this._footstepsEnabled = true;
|
|
};
|
|
|
|
Game_System.prototype.canHearFootsteps = function() {
|
|
if (this._footstepsEnabled === undefined) this.initFootstepSettings();
|
|
return this._footstepsEnabled;
|
|
};
|
|
|
|
Game_System.prototype.setHearFootsteps = function(value) {
|
|
if (this._footstepsEnabled === undefined) this.initFootstepSettings();
|
|
this._footstepsEnabled = value;
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_Interpreter
|
|
//=============================================================================
|
|
|
|
Yanfly.Footsteps.Game_Interpreter_pluginCommand =
|
|
Game_Interpreter.prototype.pluginCommand;
|
|
Game_Interpreter.prototype.pluginCommand = function(command, args) {
|
|
Yanfly.Footsteps.Game_Interpreter_pluginCommand.call(this, command, args);
|
|
if (command === 'EnableFootsteps') {
|
|
$gameSystem.setHearFootsteps(true);
|
|
} else if (command === 'DisableFootsteps') {
|
|
$gameSystem.setHearFootsteps(false);
|
|
}
|
|
};
|
|
|
|
Game_Interpreter.prototype.argsToString = function(args) {
|
|
var str = '';
|
|
var length = args.length;
|
|
for (var i = 0; i < length; ++i) {
|
|
str += args[i] + ' ';
|
|
}
|
|
return str.trim();
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_Map
|
|
//=============================================================================
|
|
|
|
Yanfly.FootstepsGame_Map_setup = Game_Map.prototype.setup;
|
|
Game_Map.prototype.setup = function(mapId) {
|
|
if ($dataMap) DataManager.processMapFootstepNotetags();
|
|
Yanfly.FootstepsGame_Map_setup.call(this, mapId);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_CharacterBase
|
|
//=============================================================================
|
|
|
|
Yanfly.Footsteps.Game_CharacterBase_increaseSteps =
|
|
Game_CharacterBase.prototype.increaseSteps;
|
|
Game_CharacterBase.prototype.increaseSteps = function() {
|
|
Yanfly.Footsteps.Game_CharacterBase_increaseSteps.call(this);
|
|
if (this !== $gamePlayer) {
|
|
this.processFootstepSound();
|
|
}
|
|
};
|
|
|
|
Game_CharacterBase.prototype.canPlayFootsteps = function() {
|
|
if (!$gameSystem.canHearFootsteps()) return false;
|
|
if (this._canPlayFootsteps !== undefined) return this._canPlayFootsteps;
|
|
this._canPlayFootsteps = Yanfly.Param.Footsteps.EventEnable;
|
|
return this._canPlayFootsteps;
|
|
};
|
|
|
|
Game_CharacterBase.prototype.processFootstepSound = function() {
|
|
if (this.canPlayFootsteps() && $gameSystem.canHearFootsteps()) {
|
|
var player = $gamePlayer;
|
|
var distance = $gameMap.distance(this.x, this.y, player.x, player.y);
|
|
var volume = Yanfly.Param.Footsteps.EventVolume || 0;
|
|
volume += distance * Yanfly.Param.Footsteps.DistanceVolume;
|
|
var pitch = Yanfly.Param.Footsteps.EventPitch || 0;
|
|
pitch += distance * Yanfly.Param.Footsteps.DistancePitch;
|
|
var pan = 0;
|
|
pan -= $gameMap.deltaX(this.x, player.x);
|
|
this.playFootstepSound(volume, pitch, pan);
|
|
};
|
|
};
|
|
|
|
Game_CharacterBase.prototype.playFootstepSound = function(volume, pitch, pan) {
|
|
if (volume <= 0) return;
|
|
if (pitch <= 0) return;
|
|
if (!$dataMap) return;
|
|
if (!$dataMap.regionFootstepSounds) DataManager.processMapFootstepNotetags();
|
|
var x = this.x;
|
|
if (this.x === 6) {
|
|
x += 1;
|
|
} else if (this.x === 4) {
|
|
x -= 1;
|
|
}
|
|
var y = this.y;
|
|
if (this.y === 2) {
|
|
y += 1;
|
|
} else if (this.y === 8) {
|
|
y -= 1;
|
|
}
|
|
var regionId = $gameMap.regionId(x, y)
|
|
var terrainTag = $gameMap.terrainTag(x, y);
|
|
if (regionId > 0) {
|
|
var footstepData = $dataMap.regionFootstepSounds[regionId];
|
|
}
|
|
if (!footstepData && terrainTag > 0) {
|
|
var footstepData = $gameMap.tileset().terrainTagFootstepSounds[terrainTag];
|
|
}
|
|
if (!footstepData) footstepData = $dataMap.regionFootstepSounds[0];
|
|
var se = {
|
|
name: footstepData[0],
|
|
volume: footstepData[1] * volume,
|
|
pitch: footstepData[2] * pitch,
|
|
pan: pan.clamp(-100, 100)
|
|
};
|
|
AudioManager.playSe(se);
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_Player
|
|
//=============================================================================
|
|
|
|
Yanfly.Footsteps.Game_Player_increaseSteps =
|
|
Game_Player.prototype.increaseSteps;
|
|
Game_Player.prototype.increaseSteps = function() {
|
|
Yanfly.Footsteps.Game_Player_increaseSteps.call(this);
|
|
this.processFootstepSound();
|
|
};
|
|
|
|
Game_Player.prototype.canPlayFootsteps = function() {
|
|
if (!$gameSystem.canHearFootsteps()) return false;
|
|
if (!this.isNormal()) return false;
|
|
return Yanfly.Param.Footsteps.PlayerEnable;
|
|
};
|
|
|
|
Game_Player.prototype.processFootstepSound = function() {
|
|
if (this.canPlayFootsteps()) {
|
|
var volume = Yanfly.Param.Footsteps.PlayerVolume || 0;
|
|
var pitch = Yanfly.Param.Footsteps.PlayerPitch || 0;
|
|
var pan = 0;
|
|
this.playFootstepSound(volume, pitch, pan);
|
|
};
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_Event
|
|
//=============================================================================
|
|
|
|
Game_Event.prototype.canPlayFootsteps = function() {
|
|
if (!$gameSystem.canHearFootsteps()) return false;
|
|
if (this._canPlayFootsteps !== undefined) return this._canPlayFootsteps;
|
|
this._canPlayFootsteps = Yanfly.Param.Footsteps.EventEnable;
|
|
var note = this.event().note;
|
|
if (note.match(/<NO FOOTSTEPS>/i)) this._canPlayFootsteps = false;
|
|
return this._canPlayFootsteps;
|
|
};
|
|
|
|
//=============================================================================
|
|
// Game_Follower
|
|
//=============================================================================
|
|
|
|
Game_Follower.prototype.canPlayFootsteps = function() {
|
|
if (!this.isVisible()) return false;
|
|
return Game_Character.prototype.canPlayFootsteps.call(this);
|
|
};
|
|
|
|
//=============================================================================
|
|
// End of File
|
|
//=============================================================================
|