slave-thistle/www/js/plugins/YEP_EventChasePlayer.js
2025-05-26 09:44:24 -05:00

337 lines
13 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//=============================================================================
// Yanfly Engine Plugins - Event Chase Player
// YEP_EventChasePlayer.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_EventChasePlayer = true;
var Yanfly = Yanfly || {};
Yanfly.ECP = Yanfly.ECP || {};
//=============================================================================
/*:
* @plugindesc v1.00 When a player is in the proximity of a certain event,
* the event will start chasing or fleeing from the player.
* @author Yanfly Engine Plugins
*
* @param Sight Lock
* @desc This is the number of frames for how long an event chases
* the player if 'this._seePlayer = true' is used.
* @default 300
*
* @param See Player
* @desc Does the event have to be able to see the player by default?
* NO - false YES - true
* @default true
*
* @param Alert Timer
* @desc This is the number of frames that must occur before the
* alert balloon will show up on the same event.
* @default 120
*
* @param Alert Balloon
* @desc This is the default balloon used when the player is seen.
* Refer to balloon ID's.
* @default 1
*
* @param Alert Sound
* @desc This is the default sound played when the player is seen.
* @default Attack1
*
* @param Alert Common Event
* @desc The default common event played when the player is seen.
* Use 0 if you do not wish to use a Common Event.
* @default 0
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* This plugin allows you to make events that will chase the player or flee
* from the player when the player enters within range of the event or when the
* event sees the player.
*
* ============================================================================
* How to Use
* ============================================================================
*
* Insert these lines into the script call window within the Movement Route
* event to give an event the chase or flee flag.
*
* Note: This doesnt work with players.
*
* Script Call lines
* this._chaseRange = x Event will chase player if reaching x range.
* this._fleeRange = x Event will flee from player if reaching x range.
* this._chaseSpeed = x Event's movement speed when chasing.
* this._fleeSpeed = x Event's movement speed when fleeing.
* this._sightLock = x Event will flee/chase player for x frames.
* this._seePlayer = true Requires the event to be able to see player.
* this._seePlayer = false Doesn't require event to be able to see player.
* this._alertBalloon = x This balloon will play when player is seen.
* this._alertSound = x This sound will play when player is seen.
* this._alertCommonEvent = x This event will play when player is seen.
*
* It is best to play this inside of a custom move route for the event at a
* high frequency rate. Keep in mind these effects only occur after the setting
* is made and ran, which means upon loading a map, if the event with a low
* frequency hasn't loaded up 'this._chaseRange = x' in its movement queue yet,
* the event will not chase the player just yet.
*/
/*:ja
* @plugindesc プレイヤーが近づいた際に、イベントがプレイヤーを追いかけたり
* プレイヤーから逃げるアクションを取ります
* @author Yanfly Engine Plugins
*
* @param Sight Lock
* @desc 'seePlayer'がtrueの時、イベントがプレイヤーを追いかける時間を設定します(フレーム単位)
* @default 300
*
* @param See Player
* @desc イベントがプレイヤーを認識する必要があるか設定します
* NO - false YES - true
* @default true
*
* @param Alert Timer
* @desc イベント上でフキダシを表示するまでにかかるフレーム数を指定します
* @default 120
*
* @param Alert Balloon
* @desc プレイヤーが認識された際に表示される、フキダシを指定します
* @default 1
*
* @param Alert Sound
* @desc プレイヤーが認識された際に表示される、サウンドを指定します
* @default Attack1
*
* @param Alert Common Event
* @desc プレイヤーが認識された際に再生される、コモンイベントを指定します
* コモンイベントを利用しない場合は、0を指定してください
* @default 0
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* このプラグインでは、プレイヤーを追いかけるイベント、もしくは
* プレイヤーから逃げるイベントを作成することができます。
* プレイヤーがイベントから一定の距離範囲内に入った時や
* イベントがプレイヤーを認識した際に発動させることができます。
*
* ============================================================================
* How to Use
* ============================================================================
*
* 下記のコードをスクリプトコールウィンドウ内の、
* Movement Routeイベント内に挿入することで、そのイベントに
* 追跡もしくは逃走のフラグを付与することができます。
*
* 注*プレイヤーに対しては無効です。
*
* <スクリプトコール>
* this._chaseRange = x
* →x の距離内に入った時、イベントがプレイヤーを追いかけます
* this._fleeRange = x
* →x の距離内に入った時、イベントはプレイヤーから逃げます
* this._chaseSpeed = x
* →追いかける時のイベントの速度 x を決定します
* this._fleeSpeed = x
* →逃げる時のイベントの速度 x を決定します
* this._sightLock = x
* →追いかける/逃げる際のイベントフレームレート x を決定します
* this._seePlayer = true
* →イベントはプレイヤーを認識する必要があります
* this._seePlayer = false
* →イベントはプレイヤーを認識する必要がありません
* this._alertBalloon = x
* →プレイヤーが認識されると、x というフキダシを表示します
* this._alertSound = x
* →プレイヤーが認識されると、x というサウンドを再生します
* this._alertCommonEvent = x
* →プレイヤーが認識されると、x というイベントを再生します
*
* カスタムした移動ルート内でイベントを再生させる際は、
* 移動頻度はなるべく高く設定するようにしてください。
*
* 設定が完了し有効になるまでは、これらのエフェクトは発動しません。
* 移動頻度の低いイベントですと、マップロード中に'this._chaseRange = x'の
* 読み込みを完了できず、プレイヤーを追いかけなくなってしまう可能性があります。
*
*/
//=============================================================================
//=============================================================================
// Parameter Variables
//=============================================================================
Yanfly.Parameters = PluginManager.parameters('YEP_EventChasePlayer');
Yanfly.Param = Yanfly.Param || {};
Yanfly.Param.ECPSightLock = Number(Yanfly.Parameters['Sight Lock']);
Yanfly.Param.ECPSeePlayer = String(Yanfly.Parameters['See Player']);
Yanfly.Param.ECPAlertTimer = Number(Yanfly.Parameters['Alert Timer']);
Yanfly.Param.ECPAlertBalloon = Number(Yanfly.Parameters['Alert Balloon']);
Yanfly.Param.ECPAlertSound = String(Yanfly.Parameters['Alert Sound']);
Yanfly.Param.ECPAlertEvent = Number(Yanfly.Parameters['Alert Common Event']);
//=============================================================================
// Main Code
//=============================================================================
Yanfly.ECP.Game_Event_setupPage = Game_Event.prototype.setupPage;
Game_Event.prototype.setupPage = function() {
Yanfly.ECP.Game_Event_setupPage.call(this);
this.clearChaseSettings();
};
Game_Event.prototype.clearChaseSettings = function() {
this._alertBalloon = Yanfly.Param.ECPAlertBalloon;
this._alertCommonEvent = Yanfly.Param.ECPAlertEvent;
this._alertLock = 0;
this._alertPlayer = false;
this._alertSound = Yanfly.Param.ECPAlertSound;
this._alertTimer = 0;
this._chasePlayer = false;
this._chaseRange = 0;
this._chaseSpeed = this._moveSpeed;
this._defaultSpeed = this._moveSpeed;
this._fleePlayer = false;
this._fleeRange = 0;
this._fleeSpeed = this._moveSpeed;
this._seePlayer = eval(Yanfly.Param.ECPSeePlayer);
this._sightLock = eval(Yanfly.Param.ECPSightLock);
};
Yanfly.ECP.Game_Event_updateSelfMovement =
Game_Event.prototype.updateSelfMovement;
Game_Event.prototype.updateSelfMovement = function() {
if (Imported.YEP_StopAllMove && $gameSystem.isEventMoveStopped()) return;
this.updateChaseDistance();
this.updateFleeDistance();
this.updateChaseMovement();
};
Yanfly.ECP.Game_Event_update = Game_Event.prototype.update;
Game_Event.prototype.update = function() {
Yanfly.ECP.Game_Event_update.call(this);
this.updateAlert();
};
Game_Event.prototype.canSeePlayer = function() {
if (!this._seePlayer) return false;
var sx = this.deltaXFrom($gamePlayer.x);
var sy = this.deltaYFrom($gamePlayer.y);
if (Math.abs(sx) > Math.abs(sy)) {
var direction = (sx > 0) ? 4 : 6;
} else {
var direction = (sy > 0) ? 8 : 2;
}
if (direction === this.direction()) {
this._alertLock = this._sightLock;
return true;
}
return false;
};
Game_Event.prototype.updateChaseDistance = function() {
if (this._erased) return;
if (this._chaseRange <= 0) return;
var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
dis += Math.abs(this.deltaYFrom($gamePlayer.y));
if (this.chaseConditions(dis)) {
this._chasePlayer = true;
this.setMoveSpeed(this._chaseSpeed);
} else if (this._chasePlayer) {
this._chasePlayer = false;
this.setMoveSpeed(this._defaultSpeed);
if (this._alertTimer <= 0) this._alertPlayer = false;
}
};
Game_Event.prototype.chaseConditions = function(dis) {
if (this._alertLock > 0) return true;
if (dis <= this._chaseRange && this.canSeePlayer()) return true;
if (dis <= this._chaseRange && !this._seePlayer) {
this._alertLock = this._sightLock;
return true;
}
return false;
};
Game_Event.prototype.updateFleeDistance = function() {
if (this._erased) return;
if (this._fleeRange <= 0) return;
var dis = Math.abs(this.deltaXFrom($gamePlayer.x));
dis += Math.abs(this.deltaYFrom($gamePlayer.y));
if (this.fleeConditions(dis)) {
this._fleePlayer = true;
this.setMoveSpeed(this._fleeSpeed);
} else if (this._fleePlayer) {
this._fleePlayer = false;
this.setMoveSpeed(this._defaultSpeed);
if (this._alertTimer <= 0) this._alertPlayer = false;
}
};
Game_Event.prototype.fleeConditions = function(dis) {
if (this._alertLock > 0) return true;
if (dis <= this._fleeRange && this.canSeePlayer()) return true;
if (dis <= this._fleeRange && !this._seePlayer) {
this._alertLock = this._sightLock;
return true;
}
return false;
};
Game_Event.prototype.updateChaseMovement = function() {
if (this._stopCount > 0 && this._chasePlayer) {
this.moveTowardPlayer();
} else if (this._stopCount > 0 && this._fleePlayer) {
this.moveAwayFromPlayer();
} else {
Yanfly.ECP.Game_Event_updateSelfMovement.call(this);
}
};
Game_Event.prototype.updateAlert = function() {
if (this._erased) return;
this._alertLock--;
if (this.alertConditions()) this.activateAlert();
if (this._alertPlayer) this._alertTimer--;
};
Game_Event.prototype.alertConditions = function() {
return (this._chasePlayer || this._fleePlayer) && !this._alertPlayer;
};
Game_Event.prototype.activateAlert = function() {
if (this._alertBalloon >= 0) this.requestBalloon(this._alertBalloon);
this._alertPlayer = true;
this._alertTimer = Yanfly.Param.ECPAlertTimer;
this.playAlertSound();
this.playAlertCommonEvent();
};
Game_Event.prototype.playAlertSound = function() {
if (this._alertSound === '') return;
var sound = {
name: this._alertSound,
volume: 100,
pitch: 100,
pan: 100
};
AudioManager.playSe(sound);
};
Game_Event.prototype.playAlertCommonEvent = function() {
if (this._alertCommonEvent <= 0) return;
$gameTemp.reserveCommonEvent(this._alertCommonEvent);
};
//=============================================================================
// End of File
//=============================================================================