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

253 lines
No EOL
9.9 KiB
JavaScript

//=============================================================================
// Yanfly Engine Plugins - Event Proximity Activate
// YEP_EventProxActivate.js
//=============================================================================
var Imported = Imported || {};
Imported.YEP_EventProxActivate = true;
var Yanfly = Yanfly || {};
Yanfly.EvPrAc = Yanfly.EvPrAc || {};
Yanfly.EvPrAc.version = 1.01;
//=============================================================================
/*:
* @plugindesc v1.01 Allows events to activate by being in range of them
* instead of needing to be exactly next to or on top of them.
* @author Yanfly Engine Plugins
*
* @help
* ============================================================================
* Introduction
* ============================================================================
*
* In RPG Maker MV, events can only activate when you are either standing next
* to them or on top of them. There is no activation proximity range that can
* be used to activate some events from afar. This plugin gives you multiple
* ways to activate certain events from a distance, through means of a square
* area around an event, a radius, row-centric, or column-centric. These new
* activation proximity ranges can be coupled with an event's triggers: through
* the Action Button, Player Touch, Event Touch, Autorun, and Parallels giving
* multitudes of ways to activate events. And these can all be done by simply
* adding Comment Tags into an event page.
*
* ============================================================================
* Comment Tags
* ============================================================================
*
* By default, each event page has zero proximity features. They have to be
* added manually per event page using comment tags. You can use the following
* comment tags to give each event page a proximity activation range.
*
* ---
*
* Comment Tags:
*
* <Activation Square: x>
* - Creates an activation range around the event in the form of a square,
* x tiles to the left, right, above, and below the event. This makes the
* activation range look like a square.
*
* <Activation Radius: x>
* - Creates an activation range around the event requiring the player to be
* within x tiles of the event (difference of x and y positions). Think of
* this more like a diamond.
*
* <Activation Row: x>
* - Creates an activation range spanning horizontally from the event. The
* row's horizontal range is the whole map, but the vertical range is x tiles
* above and below the event. If x is 0, then the player must be exactly on
* the same vertical tile as the event.
*
* <Activation Column: x>
* - Creates an activation range spanning vertically from the event. The
* row's vertical range is the whole map, but the horizontal range is x tiles
* left and right of the event. If x is 0, then the player must be exactly on
* the same horizontal tile as the event.
*
* ---
*
* Event proximity activations behave differently depending on the event page's
* trigger type. Here is how the event page will activate based on the trigger:
*
* Action Button
* - As long as the player is within the event's proximity range, pressing
* the OK button will activate the event.
*
* Player Touch
* - If the player moves within the event's proximity range, the event will
* automatically activate. This will not occur if the event moves into range
* of the player, however. The player can also press the OK button to trigger
* the event.
*
* Event Touch
* - If the player moves within the event's proximity range or vice versa,
* the event will automatically activate. The player can also press the OK
* button to trigger the event.
*
* Autorun
* - If the player moves within the event's proximity range or vice versa,
* the event will automatically activate. There is no escaping this autorun
* unless you have a way of turning it off.
*
* Parallel
* - If the player moves within the event's proximity range or vice versa,
* the event will automatically activate. The player is granted a few frames
* of movement each time the parallel process loops.
*
* ============================================================================
* Changelog
* ============================================================================
*
* Version 1.01:
* - Fixed a bug where parallel events don't loop.
*
* Version 1.00:
* - Finished Plugin!
*
* ============================================================================
* End of Helpfile
* ============================================================================
*/
//=============================================================================
//=============================================================================
// Game_CharacterBase
//=============================================================================
Yanfly.EvPrAc.Game_CharacterBase_increaseSteps =
Game_CharacterBase.prototype.increaseSteps;
Game_CharacterBase.prototype.increaseSteps = function() {
Yanfly.EvPrAc.Game_CharacterBase_increaseSteps.call(this);
this.eventProximityIncreaseSteps();
};
Game_CharacterBase.prototype.eventProximityIncreaseSteps = function() {
};
//=============================================================================
// Game_Player
//=============================================================================
Yanfly.EvPrAc.Game_Player_startMapEvent = Game_Player.prototype.startMapEvent;
Game_Player.prototype.startMapEvent = function(x, y, triggers, normal) {
Yanfly.EvPrAc.Game_Player_startMapEvent.call(this, x, y, triggers, normal);
if (!$gameMap.isEventRunning() && !$gameMap.isAnyEventStarting()) {
this.startProximityEvent(triggers, normal);
}
};
Game_Player.prototype.startProximityEvent = function(triggers, normal) {
var events = $gameMap.events();
var length = events.length;
for (var i = 0; i < length; ++i) {
var ev = events[i];
if (!ev) continue;
if (!ev.isTriggerIn(triggers)) continue;
if (!ev._activationType || ev._activationType === 'none') continue;
if (this.meetPlayerProximityConditions(ev)) ev.start();
}
};
Game_Player.prototype.meetPlayerProximityConditions = function(ev) {
if (ev._activationType === 'radius') {
var x1 = this.x;
var y1 = this.y;
var x2 = ev.x;
var y2 = ev.y;
var radius = $gameMap.distance(x1, y1, x2, y2);
return ev._activationDist >= radius
} else if (ev._activationType === 'square') {
return ev._activationDist >= Math.abs(ev.deltaXFrom(this.x)) &&
ev._activationDist >= Math.abs(ev.deltaYFrom(this.y));
} else if (ev._activationType === 'row') {
return ev._activationDist >= Math.abs(ev.deltaYFrom(this.y));
} else if (ev._activationType === 'column') {
return ev._activationDist >= Math.abs(ev.deltaXFrom(this.x));
} else {
return false;
}
};
//=============================================================================
// Game_Event
//=============================================================================
Yanfly.EvPrAc.Game_Event_setupPage = Game_Event.prototype.setupPage;
Game_Event.prototype.setupPage = function() {
this._initialAutoTriggerBypass = true;
Yanfly.EvPrAc.Game_Event_setupPage.call(this);
this._initialAutoTriggerBypass = false;
this.setupEventProximitySettings();
};
Game_Event.prototype.setupEventProximitySettings = function() {
this.initEventProximitySettings();
this.setupEventProximityCommentTags();
};
Game_Event.prototype.initEventProximitySettings = function() {
this._activationDist = 0;
this._activationType = 'none';
};
Game_Event.prototype.setupEventProximityCommentTags = function() {
if (!this.page()) return;
var note1 = /<ACTIVATION SQUARE: (\d+)>/i;
var note2 = /<ACTIVATION (?:RADIUS|PROXIMITY): (\d+)>/i;
var note3 = /<ACTIVATION (?:ROW|X|HORIZONTAL): (\d+)>/i;
var note4 = /<ACTIVATION (?:COLUMN|Y|VERTICAL): (\d+)>/i;
var list = this.list();
var length = list.length;
for (var i = 0; i < length; ++i) {
var ev = list[i];
if ([108, 408].contains(ev.code)) {
if (ev.parameters[0].match(note1)) {
this._activationDist = parseInt(RegExp.$1);
this._activationType = 'square';
} else if (ev.parameters[0].match(note2)) {
this._activationDist = parseInt(RegExp.$1);
this._activationType = 'radius';
} else if (ev.parameters[0].match(note3)) {
this._activationDist = parseInt(RegExp.$1);
this._activationType = 'row';
} else if (ev.parameters[0].match(note4)) {
this._activationDist = parseInt(RegExp.$1);
this._activationType = 'column';
}
}
}
};
Game_Event.prototype.eventProximityIncreaseSteps = function() {
if (!$gameMap.isEventRunning() && !$gameMap.isAnyEventStarting()) {
$gamePlayer.startProximityEvent([2], this.isNormalPriority());
}
};
Yanfly.EvPrAc.Game_Event_checkEventTriggerAuto =
Game_Event.prototype.checkEventTriggerAuto;
Game_Event.prototype.checkEventTriggerAuto = function() {
if (this._trigger !== 3) return;
if (this._initialAutoTriggerBypass) return;
if (!this.meetEventProximityConditions(false)) return;
Yanfly.EvPrAc.Game_Event_checkEventTriggerAuto.call(this);
};
Yanfly.EvPrAc.Game_Event_updateParallel = Game_Event.prototype.updateParallel;
Game_Event.prototype.updateParallel = function() {
if (!this._interpreter) return;
if (!this.meetEventProximityConditions(true)) return;
Yanfly.EvPrAc.Game_Event_updateParallel.call(this);
};
Game_Event.prototype.meetEventProximityConditions = function(parallel) {
if (!parallel && $gameMap.isEventRunning()) return false;
if (!parallel && $gameMap.isAnyEventStarting()) return false;
if (!this._activationType || this._activationType === 'none') return true;
return $gamePlayer.meetPlayerProximityConditions(this);
};
//=============================================================================
// End of File
//=============================================================================