forked from triacontane/RPGMakerMV
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAutoSelfSwitch.js
139 lines (130 loc) · 4.89 KB
/
AutoSelfSwitch.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*=============================================================================
AutoSelfSwitch.js
----------------------------------------------------------------------------
(C)2021 Triacontane
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
----------------------------------------------------------------------------
Version
1.0.0 2021/06/25 初版
----------------------------------------------------------------------------
[Blog] : https://triacontane.blogspot.jp/
[Twitter]: https://twitter.com/triacontane/
[GitHub] : https://github.com/triacontane/
=============================================================================*/
/*:
* @plugindesc オートセルフスイッチプラグイン
* @target MZ
* @url https://github.com/triacontane/RPGMakerMV/tree/mz_master/AutoSelfSwitch.js
* @base PluginCommonBase
* @orderAfter PluginCommonBase
* @author トリアコンタン
*
* @param list
* @text 条件リスト
* @desc セルフスイッチを変動させる条件のリストです。
* @default []
* @type struct<Condition>[]
*
* @help AutoSelfSwitch.js
*
* マップイベントを監視しセルフスイッチを自動でON/OFFします。
* パラメータから条件を指定します。
* 現在指定できる条件は「プレイヤーとの距離」だけです。
*
* このプラグインの利用にはベースプラグイン『PluginCommonBase.js』が必要です。
* 『PluginCommonBase.js』は、RPGツクールMZのインストールフォルダ配下の
* 以下のフォルダに格納されています。
* dlc/BasicResources/plugins/official
*
* 利用規約:
* 作者に無断で改変、再配布が可能で、利用形態(商用、18禁利用等)
* についても制限はありません。
* このプラグインはもうあなたのものです。
*/
/*~struct~Condition:
* @param noteTag
* @text メモタグ
* @desc 識別子です。この名前のメモ欄をイベントに指定します。例:<selfSwitch>
* @default selfSwitch
*
* @param playerDistance
* @text プレイヤーとの距離
* @desc プレイヤーとの距離が指定値以内のときに条件を満たします。
* @default 0
* @type number
*
* @param type
* @text セルフスイッチ種別
* @desc 条件を満たしたときにONにするセルフスイッチです。
* @default A
* @type select
* @option A
* @option B
* @option C
* @option D
*
* @param turnOff
* @text OFFにする
* @desc 条件を満たさなくなったときにセルフスイッチをOFFにします。
* @default false
* @type boolean
*
* @param reverse
* @text 反転
* @desc 条件を満たしたときに逆にセルフスイッチをOFFにします。
* @default false
* @type boolean
*
* @param switchId
* @text 有効スイッチ
* @desc 指定した場合、このスイッチがONのときのみセルフスイッチが変動します。
* @default 0
* @type switch
*/
(() => {
'use strict';
const script = document.currentScript;
const param = PluginManagerEx.createParameter(script);
if (!param.list || !Array.isArray(param.list)) {
return;
}
const _Game_Event_initialize = Game_Event.prototype.initialize;
Game_Event.prototype.initialize = function() {
_Game_Event_initialize.apply(this, arguments);
const dataList = param.list.filter(item => PluginManagerEx.findMetaValue(this.event(), item.noteTag));
this._autoSelfSwitchIndexList = dataList.map(data => param.list.indexOf(data));
};
const _Game_Event_update = Game_Event.prototype.update;
Game_Event.prototype.update = function() {
_Game_Event_update.apply(this, arguments);
this.updateAutoSelfSwitchList();
};
Game_Event.prototype.findAutoSelfSwitchList = function() {
return this._autoSelfSwitchIndexList.map(index => param.list[index]);
};
Game_Event.prototype.updateAutoSelfSwitchList = function() {
this.findAutoSelfSwitchList().forEach(data => {
if (data.switchId && !$gameSwitches.value(data.switchId)) {
return;
}
if (this.isValidAutoSelfSwitchList(data)) {
this.controlSelfSwitch(data.type, !data.reverse);
} else if (data.turnOff) {
this.controlSelfSwitch(data.type, data.reverse);
}
});
};
Game_Event.prototype.controlSelfSwitch = function(type, value) {
const key = [$gameMap.mapId(), this.eventId(), type];
const prevValue = $gameSelfSwitches.value(key);
if (prevValue !== value) {
$gameSelfSwitches.setValue(key, value);
}
};
Game_Event.prototype.isValidAutoSelfSwitchList = function(data) {
const sx = Math.abs(this.deltaXFrom($gamePlayer.x));
const sy = Math.abs(this.deltaYFrom($gamePlayer.y));
return sx + sy <= data.playerDistance;
};
})();