forked from triacontane/RPGMakerMV
-
Notifications
You must be signed in to change notification settings - Fork 0
/
AutoRaise.js
264 lines (239 loc) · 10.6 KB
/
AutoRaise.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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
//=============================================================================
// AutoRaise.js
// ----------------------------------------------------------------------------
// (C)2017 Triacontane
// This software is released under the MIT License.
// http://opensource.org/licenses/mit-license.php
// ----------------------------------------------------------------------------
// Version
// 1.2.0 2022/02/15 自動蘇生の発動確率を設定できる機能を追加
// 1.1.1 2020/02/12 蘇生時のHP割合をステートに記述している場合に値が取得できない問題を修正
// 1.1.0 2020/02/11 蘇生が発動したとき発動アイテムをロストする機能を追加
// 戦闘中にスキルなどで一時的に自働蘇生を付与できる機能を追加
// 1.0.0 2017/04/02 初版
// ----------------------------------------------------------------------------
// [Blog] : https://triacontane.blogspot.jp/
// [Twitter]: https://twitter.com/triacontane/
// [GitHub] : https://github.com/triacontane/
//=============================================================================
/*:
* @plugindesc AutoRaisePlugin
* @author triacontane
*
* @param RaiseAnimationId
* @desc 自働蘇生時に表示されるアニメーションのID
* @default 49
*
* @param RaiseIconId
* @desc 自働蘇生が可能な場合に表示されるアイコンのID
* @default 72
*
* @help 戦闘時に、決められた回数分だけ自働蘇生できます。
* 回数の決定は戦闘開始直後に1回だけ行われます。戦闘中は再計算されません。
* 特徴を有するメモ欄のプラグインに以下の通り入力してください。
*
* <AR_自働蘇生:3> # 戦闘不能時に3回まで自働蘇生します。
* <AR_AutoRaise:3> # 同上
* <AR_蘇生HPレート:50> # 自働蘇生時にHPが50%まで回復します。
* <AR_RaiseHpRate:50> # 同上
* <AR_ロスト> # 自動蘇生が発動したとき対象の装備品を失います。
* <AR_Lost> # 同上
*
* スキルなどを使って戦闘中に付与したい場合はステートに
* 以下のメモ欄を設定してください。
* <AR_一時自動蘇生> # 戦闘不能時に自働蘇生します。
* <AR_TempAutoRaise> # 同上
*
* このプラグインにはプラグインコマンドはありません。
*
* This plugin is released under the MIT License.
*/
/*:ja
* @plugindesc 自働蘇生プラグイン
* @author トリアコンタン
*
* @param 蘇生アニメID
* @desc 自働蘇生時に表示されるアニメーションのID
* @default 49
*
* @param 蘇生アイコンID
* @desc 自働蘇生が可能な場合に表示されるアイコンのID
* @default 72
*
* @help 戦闘時に、決められた回数分だけ自働蘇生できます。
* 回数の決定は戦闘開始直後に1回だけ行われます。戦闘中は再計算されません。
* 特徴を有するメモ欄のプラグインに以下の通り入力してください。
*
* <AR_自働蘇生:3> # 戦闘不能時に3回まで自働蘇生します。
* <AR_AutoRaise:3> # 同上
* <AR_蘇生HPレート:50> # 自働蘇生時にHPが50%まで回復します。
* <AR_RaiseHpRate:50> # 同上
* <AR_ロスト> # 自動蘇生が発動したとき対象の装備品を失います。
* <AR_Lost> # 同上
* <AR_蘇生確率:50> # 蘇生の発動率が50%になります。
* <AR_RaiseProb:50> # 同上
*
* スキルなどを使って戦闘中に付与したい場合はステートに
* 以下のメモ欄を設定してください。
* <AR_一時自動蘇生> # 戦闘不能時に自働蘇生します。
* <AR_TempAutoRaise> # 同上
*
* このプラグインにはプラグインコマンドはありません。
*
* 利用規約:
* 作者に無断で改変、再配布が可能で、利用形態(商用、18禁利用等)
* についても制限はありません。
* このプラグインはもうあなたのものです。
*/
(function() {
'use strict';
var pluginName = 'AutoRaise';
var metaTagPrefix = 'AR_';
//=============================================================================
// ローカル関数
// プラグインパラメータやプラグインコマンドパラメータの整形やチェックをします
//=============================================================================
var getParamString = function(paramNames) {
if (!Array.isArray(paramNames)) paramNames = [paramNames];
for (var i = 0; i < paramNames.length; i++) {
var name = PluginManager.parameters(pluginName)[paramNames[i]];
if (name) return name;
}
return '';
};
var getParamNumber = function(paramNames, min, max) {
var value = getParamString(paramNames);
if (arguments.length < 2) min = -Infinity;
if (arguments.length < 3) max = Infinity;
return (parseInt(value) || 0).clamp(min, max);
};
var getArgNumber = function(arg, min, max) {
if (arguments.length < 2) min = -Infinity;
if (arguments.length < 3) max = Infinity;
return (parseInt(arg) || 0).clamp(min, max);
};
var getMetaValue = function(object, name) {
var metaTagName = metaTagPrefix + name;
return object.meta.hasOwnProperty(metaTagName) ? convertEscapeCharacters(object.meta[metaTagName]) : undefined;
};
var getMetaValues = function(object, names) {
for (var i = 0, n = names.length; i < n; i++) {
var value = getMetaValue(object, names[i]);
if (value !== undefined) return value;
}
return undefined;
};
var convertEscapeCharacters = function(text) {
if (isNotAString(text)) text = '';
var windowLayer = SceneManager._scene._windowLayer;
return windowLayer ? windowLayer.children[0].convertEscapeCharacters(text) : text;
};
var isNotAString = function(args) {
return String(args) !== args;
};
//=============================================================================
// パラメータの取得と整形
//=============================================================================
var param = {};
param.raiseAnimationId = getParamNumber(['RaiseAnimationId', '蘇生アニメID']);
param.raiseIconId = getParamNumber(['RaiseIconId', '蘇生アイコンID']);
//=============================================================================
// BattleManager
// 戦闘不能時に自働復活します。
//=============================================================================
var _BattleManager_setup = BattleManager.setup;
BattleManager.setup = function(troopId, canEscape, canLose) {
_BattleManager_setup.apply(this, arguments);
this.allBattleMembers().forEach(function(member) {
member.initAutoRaiseCount();
});
};
//=============================================================================
// Game_BattlerBase
// 戦闘不能時に自働復活します。
//=============================================================================
var _Game_BattlerBase_allIcons = Game_BattlerBase.prototype.allIcons;
Game_BattlerBase.prototype.allIcons = function() {
return _Game_BattlerBase_allIcons.apply(this, arguments).concat(this.getAutoRaiseIcon());
};
Game_BattlerBase.prototype.getAutoRaiseIcon = function() {
return (this.canRaise() && param.raiseIconId > 0) ? [param.raiseIconId] : [];
};
Game_BattlerBase.prototype.initAutoRaiseCount = function() {
this._autoRaiseCount = this.getAutoRaiseCount();
};
Game_BattlerBase.prototype.getAutoRaiseCount = function() {
var raiseCount = 0;
this.traitObjects().forEach(function(state) {
var metaValue = getMetaValues(state, ['自働蘇生', 'AutoRaise']);
if (metaValue) {
raiseCount += (metaValue === true ? 1 : getArgNumber(metaValue, 1));
}
});
return raiseCount;
};
Game_BattlerBase.prototype.getRaiseHpRate = function() {
if (!this.canRaise() || !this.isValidRaiseProbability()) {
return 0;
}
var hpRate = 1;
this.traitObjects().forEach(function(state) {
var metaValue = getMetaValues(state, ['蘇生HPレート', 'RaiseHpRate']);
if (metaValue) {
var newRate = (metaValue === true ? 1 : getArgNumber(metaValue, 1, 100));
hpRate = Math.max(hpRate, newRate);
}
});
return hpRate;
};
Game_BattlerBase.prototype.isValidRaiseProbability = function() {
var probability = 0;
this.traitObjects().forEach(state => {
var metaValue = getMetaValues(state, ['蘇生確率', 'RaiseProb']);
if (metaValue) {
probability = Math.max(probability, metaValue / 100);
}
});
return !probability || Math.random() < probability;
};
Game_BattlerBase.prototype.canRaise = function() {
return (this.hasTempRaise() || this._autoRaiseCount > 0) && $gameParty.inBattle()
};
Game_BattlerBase.prototype.hasTempRaise = function() {
return this.traitObjects().some(function(obj) {
return getMetaValues(obj, ['一時自動蘇生', 'TempAutoRaise']) !== undefined;
});
};
Game_BattlerBase.prototype.executeAutoRaise = function(rate) {
BattleManager.processAutoRaise(this);
this.revive();
var hp = Math.max(Math.floor(this.mhp * rate / 100), 1);
this.setHp(hp);
};
var _Game_BattlerBase_die = Game_BattlerBase.prototype.die;
Game_BattlerBase.prototype.die = function() {
var rate = this.getRaiseHpRate();
if (rate > 0 && !this.hasTempRaise()) {
this._autoRaiseCount--;
this.lostRaiseEquips();
}
_Game_BattlerBase_die.apply(this, arguments);
if (rate) {
this.executeAutoRaise(rate);
}
};
Game_BattlerBase.prototype.lostRaiseEquips = function() { };
Game_Actor.prototype.lostRaiseEquips = function() {
this.equips().some(function(equip, slotId) {
if (equip && getMetaValues(equip, ['ロスト', 'Lost']) !== undefined) {
this.changeEquip(slotId, null);
$gameParty.loseItem(equip, 1, false);
}
}, this);
};
BattleManager.processAutoRaise = function(target) {
if (param.raiseAnimationId > 0) {
this._logWindow.push('showNormalAnimation', [target], param.raiseAnimationId);
}
};
})();