//============================================================================= // 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: * * * - Insert this into the notebox of any event you wish to not make any * footsteps when moving. * * Tileset Notetags: * * * * * - 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: * * * * * * 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: * * * * * - 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: * * * * * * 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(//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(//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(//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 //=============================================================================