-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathTMFutureSight.js
437 lines (403 loc) · 13.7 KB
/
TMFutureSight.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
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
//=============================================================================
// TMPlugin - エネミー行動予測
// バージョン: 1.1.0
// 最終更新日: 2018/08/21
// 配布元 : http://hikimoki.sakura.ne.jp/
//-----------------------------------------------------------------------------
// Copyright (c) 2016 tomoaky
// Released under the MIT license.
// http://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @plugindesc 敵キャラの次の行動のヒントなどをテキストで表示します。
* より戦略的なターンバトルが実現できるかもしれません。
*
* @author tomoaky (http://hikimoki.sakura.ne.jp/)
*
* @param width
* @type number
* @desc 行動予測表示の横幅
* 初期値: 240
* @default 240
*
* @param maxLines
* @type number
* @desc 行動予測表示の最大行数
* 初期値: 3
* @default 3
*
* @param lineHeight
* @type number
* @desc 行動予測表示の 1 行の高さ
* 初期値: 36
* @default 36
*
* @param fontSize
* @type number
* @desc 行動予測表示のフォントサイズ
* 初期値: 28
* @default 28
*
* @param color
* @desc 行動予測表示の文字色
* 初期値: white
* @default white
*
* @param backColor
* @desc 行動予測表示の背景の色
* 初期値: black
* @default black
*
* @param backOpacity
* @type number
* @max 255
* @desc 行動予測表示の背景の不透明度
* 初期値: 128 ( 0 ~ 255 )
* @default 128
*
* @param textAlign
* @type select
* @option left
* @option center
* @option right
* @desc 行動予測表示の行揃え
* @default center
*
* @param showIcon
* @type boolean
* @desc スキル名の頭にアイコンも表示する
* 初期値: ON( ON = 表示 / OFF = 非表示 )
* @default true
*
* @param headerText
* @desc 行動予測表示のヘッダーテキスト
* 初期値: Next
* @default Next
*
* @param headerHeight
* @type number
* @desc 行動予測表示のヘッダーの高さ
* 初期値: 20
* @default 20
*
* @param headerFontSize
* @type number
* @desc 行動予測表示のヘッダーのフォントサイズ
* 初期値: 16
* @default 16
*
* @param headerColor
* @desc 行動予測表示のヘッダーの文字色
* 初期値: red
* @default red
*
* @param cornerRadius
* @type number
* @desc TMBitmapEx.js導入時の、角丸矩形の丸部分の半径
* 初期値: 6
* @default 6
*
* @help
* TMPlugin - エネミー行動予測 ver1.1.0
*
* 使い方:
*
* スキルのメモ欄に <fsText:予測テキスト> のようなタグで行動予測の設定を
* してください。
* 戦闘シーンでパーティのコマンドを入力している間、敵グラフィックに
* 重なるように予測テキストが表示されるようになります。
*
* このプラグインは RPGツクールMV Version 1.6.1 で動作確認をしています。
*
* このプラグインはMITライセンスのもとに配布しています、商用利用、
* 改造、再配布など、自由にお使いいただけます。
*
*
* メモ欄タグ(スキル):
*
* <fsText:予測テキスト>
* 敵がこのスキルを使用するターンのコマンド入力中に、予測テキストが
* 敵グラフィックに重なるように表示されます。
* このタグがない場合はスキル名を代わりに表示します。
*
* 予測テキストを途中で改行することで、行動予測の表示も複数行になります。
* ただしプラグインパラメータ maxLines で設定した行数を超えることは
* できません。
*
* <fsIcon:5>
* 予測テキストの頭に 5 番のアイコンを表示します。
* このタグがない場合はスキルアイコンを代わりに表示します。
*
* プラグインパラメータ showIcon がOFF(false)の場合は表示しません。
*
*
* メモ欄タグ(敵キャラ):
*
* <fsOffsetX:50>
* この敵の行動予測の表示位置を右に 50 ドットずらします。左にずらす場合は
* 負の値を設定してください。
*
* <fsOffsetY:80>
* この敵の行動予測の表示位置を下に 80 ドットずらします。上にずらす場合は
* 負の値を設定してください。
*
*
* プラグインコマンド:
*
* fsStop
* 行動予測機能を無効にします。ゲーム開始時は行動予測機能が有効に
* なっています。行動予測機能の状態はセーブデータに保存されます。
*
* fsStart
* 無効にした行動予測機能を有効にします。
*
*
* プラグインパラメータ補足:
*
* maxLines
* 行動予測表示の最大行数を設定します。行数が多いほど大きなビットマップが
* 生成されるため、必要以上に大きな値は設定しないでください。
*
* 1ターンに複数回の行動がある場合、行動回数分の行数が必要になります。
* 行動予測表示に改行を利用する場合はさらに必要な行数が増えます。
*
* color / backColor / headerColor
* このパラメータには、black や blue といったカラーネームと、
* #000000 や #0000ff のようなカラーコードを設定することができます。
*
* headerText
* 行動予測の左上に表示するヘッダーテキストです。何も入力しなければ
* ヘッダーテキストは非表示になります。
*
* cornerRadius
* TMBitmapEx.js をこのプラグインよりも上の位置に導入しつつ、
* このパラメータの値を 1 以上にすることで、行動予測の背景を
* 角丸の矩形にすることができます。
*/
var Imported = Imported || {};
Imported.TMFutureSight = true;
(function() {
var parameters = PluginManager.parameters('TMFutureSight');
var SightWidth = +(parameters['width'] || 240);
var SightMaxLines = +(parameters['maxLines'] || 3);
var SightLineHeight = +(parameters['lineHeight'] || 36);
var SightFontSize = +(parameters['fontSize'] || 28);
var SightColor = parameters['color'] || 'white';
var SightBackColor = parameters['backColor'] || 'black';
var SightBackOpacity = +(parameters['backOpacity'] || 128);
var SightCornerRadius = +(parameters['cornerRadius'] || 6);
var SightTextAlign = parameters['textAlign'] || 'center';
var SightShowIcon = JSON.parse(parameters['showIcon'] || 'true');
var SightHeaderText = parameters['headerText'];
var SightHeaderHeight = +(parameters['headerHeight'] || 20);
var SightHeaderFontSize = +(parameters['headerFontSize'] || 16);
var SightHeaderColor = parameters['headerColor'] || 'red';
//-----------------------------------------------------------------------------
// Game_System
//
Game_System.prototype.isFutureSightEnabled = function() {
if (this._futureSightEnabled == null) {
this._futureSightEnabled = true;
}
return this._futureSightEnabled;
};
Game_System.prototype.disableFutureSight = function() {
this._futureSightEnabled = false;
};
Game_System.prototype.enableFutureSight = function() {
this._futureSightEnabled = true;
};
//-----------------------------------------------------------------------------
// Game_Enemy
//
Game_Enemy.prototype.setFutureSightTexts = function() {
this._futureSightTexts = [];
this._futureSightIcons = [];
for (var i = 0; i < this._actions.length; i++) {
if (this._actions[i]) {
var skill = this._actions[i].item();
if (skill) {
if (skill.meta.fsText) {
this._futureSightTexts.push(skill.meta.fsText);
} else {
this._futureSightTexts.push(skill.name);
}
this._futureSightIcons.push(this.fsIconIndex(skill));
}
}
}
};
Game_Enemy.prototype.fsIconIndex = function(skill) {
if (!SightShowIcon) {
return 0;
}
if (skill.meta.fsIcon) {
return +skill.meta.fsIcon;
}
return skill.iconIndex;
};
Game_Enemy.prototype.resetFutureSightTexts = function() {
this._futureSightTexts = [];
};
Game_Enemy.prototype.futureSightTexts = function() {
return this._futureSightTexts || [];
};
Game_Enemy.prototype.futureSightIcons = function() {
return this._futureSightIcons || [];
};
//-----------------------------------------------------------------------------
// Game_Troop
//
var _Game_Troop_makeActions = Game_Troop.prototype.makeActions;
Game_Troop.prototype.makeActions = function() {
_Game_Troop_makeActions.call(this);
if ($gameSystem.isFutureSightEnabled() && !BattleManager._preemptive) {
this.members().forEach(function(member) {
member.setFutureSightTexts();
});
}
};
var _Game_Troop_increaseTurn = Game_Troop.prototype.increaseTurn;
Game_Troop.prototype.increaseTurn = function() {
_Game_Troop_increaseTurn.call(this);
this.members().forEach(function(member) {
member.resetFutureSightTexts();
});
};
//-----------------------------------------------------------------------------
// Game_Interpreter
//
var _Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
_Game_Interpreter_pluginCommand.call(this, command, args);
if (command === 'fsStart') {
$gameSystem.enableFutureSight();
} else if (command === 'fsStop') {
$gameSystem.disableFutureSight();
}
};
//-----------------------------------------------------------------------------
// Sprite_Enemy
//
var _Sprite_Enemy_update = Sprite_Enemy.prototype.update;
Sprite_Enemy.prototype.update = function() {
_Sprite_Enemy_update.call(this);
if (this._enemy) {
this.updateFutureSight();
}
};
Sprite_Enemy.prototype.updateFutureSight = function() {
if (!this._futureSightSprite && this.parent) {
this._futureSightSprite = new Sprite_FutureSight(this);
this.parent.addChild(this._futureSightSprite);
}
};
//-----------------------------------------------------------------------------
// Sprite_FutureSight
//
function Sprite_FutureSight() {
this.initialize.apply(this, arguments);
}
Sprite_FutureSight.prototype = Object.create(Sprite.prototype);
Sprite_FutureSight.prototype.constructor = Sprite_FutureSight;
Sprite_FutureSight.prototype.initialize = function(enemySprite) {
Sprite.prototype.initialize.call(this);
this._enemySprite = enemySprite;
var width = SightWidth;
var height = SightLineHeight * SightMaxLines + SightHeaderHeight;
this.bitmap = new Bitmap(width, height);
this.anchor.x = 0.5;
this.anchor.y = 1;
this.z = 10;
this._texts = [];
this._icons = [];
};
Sprite_FutureSight.prototype.refresh = function() {
this.bitmap.clear();
if (this._texts.length > 0) {
var lines = this._texts.reduce(function(r, text) {
return r + text.split('\n').length;
}, 0);
var y = SightHeaderHeight;
var width = this.bitmap.width;
var height = SightLineHeight * lines;
this.drawSightBack(0, y, width, height);
this.drawSightHeader(0, 0, width, SightHeaderHeight);
this.drawSightText(4, y, width - 8, SightLineHeight);
}
};
Sprite_FutureSight.prototype.drawSightBack = function(x, y, width, height) {
this.bitmap.paintOpacity = SightBackOpacity;
if (Imported.TMBitmapEx && SightCornerRadius) {
this.bitmap.fillRoundRect(x, y, width, height, SightCornerRadius, SightBackColor);
} else {
this.bitmap.fillRect(x, y, width, height, SightBackColor);
}
this.bitmap.paintOpacity = 255;
};
Sprite_FutureSight.prototype.drawSightHeader = function(x, y, width, height) {
if (SightHeaderText) {
this.bitmap.fontSize = SightHeaderFontSize;
this.bitmap.textColor = SightHeaderColor;
this.bitmap.drawText(SightHeaderText, x, y, width, height);
}
};
Sprite_FutureSight.prototype.drawSightText = function(x, y, width, height) {
this.bitmap.fontSize = SightFontSize;
this.bitmap.textColor = SightColor;
for (var i = 0; i < this._texts.length; i++) {
var text = this._texts[i];
var iconIndex = this._icons[i];
var dx = x;
var dw = width;
if (iconIndex > 0) {
var iconX = this.sightIconX(text, width);
if (iconX <= 0) {
iconX = 0;
dx += SightLineHeight;
dw -= SightLineHeight;
}
this.drawSightIcon(iconIndex, x + iconX, y);
}
var arr = text.split('\n');
for (var j = 0; j < arr.length; j++) {
this.bitmap.drawText(arr[j], dx, y, dw, height, SightTextAlign);
y += SightLineHeight;
}
}
};
Sprite_FutureSight.prototype.sightIconX = function(text, width) {
var textWidth = this.bitmap.measureTextWidth(text);
if (SightTextAlign === 'left') {
return 0;
} else if (SightTextAlign === 'center') {
return (width - textWidth) / 2 - SightLineHeight;
} else {
return width - textWidth - SightLineHeight;
}
};
Sprite_FutureSight.prototype.drawSightIcon = function(iconIndex, x, y) {
var bitmap = ImageManager.loadSystem('IconSet');
var pw = Window_Base._iconWidth;
var ph = Window_Base._iconHeight;
var sx = iconIndex % 16 * pw;
var sy = Math.floor(iconIndex / 16) * ph;
var dw = SightLineHeight - 4;
var dh = SightLineHeight - 4;
this.bitmap.blt(bitmap, sx, sy, pw, ph, x + 2, y + 2, dw, dh);
};
Sprite_FutureSight.prototype.update = function() {
Sprite.prototype.update.call(this);
var futureSightTexts = this._enemySprite._enemy.futureSightTexts().concat();
var futureSightIcons = this._enemySprite._enemy.futureSightIcons().concat();
if (this._texts.toString() !== futureSightTexts.toString() ||
this._icons.toString() !== futureSightIcons.toString()) {
this._texts = futureSightTexts;
this._icons = futureSightIcons;
this.refresh();
}
var enemy = this._enemySprite._enemy.enemy();
this.x = this._enemySprite.x + (+enemy.meta.fsOffsetX || 0);
this.y = this._enemySprite.y + (+enemy.meta.fsOffsetY || 0);
};
})();