-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathTMShooting.js
2193 lines (1996 loc) · 70.9 KB
/
TMShooting.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
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
//=============================================================================
// TMPlugin - シューティング
// バージョン: 1.3.9
// 最終更新日: 2019/07/26
// 配布元 : https://hikimoki.sakura.ne.jp/
//-----------------------------------------------------------------------------
// Copyright (c) 2016 tomoaky
// Released under the MIT license.
// http://opensource.org/licenses/mit-license.php
//=============================================================================
/*:
* @plugindesc プレイヤーとイベントに弾を発射する機能を追加します。
*
* @author tomoaky (https://hikimoki.sakura.ne.jp/)
*
* @param shot
* @type struct<InputSetting>
* @default {"text":"ショット","mandatory":"true","keys":"AGHJ","padButton":"6"}
*
* @param hold
* @type struct<InputSetting>
* @default {"text":"ホールド","mandatory":"false","keys":"D","padButton":"-1"}
*
* @param holdType
* @type select
* @option SWITCH
* @option HOLD
* @desc 向き固定方式。SWITCH なら向き固定キーを押すたびに切り替え、
* HOLD なら押している間だけ切り替え。
* @default SWITCH
*
* @param deadSwitch
* @type string
* @desc イベントが戦闘不能になったときにオンになるセルフスイッチ
* 初期値: A
* @default A
*
* @param resetDeadSwitch
* @type boolean
* @desc マップ移動時に deadSwitch をオフにする
* 初期値: ON ( true = ON 有効 / false = OFF 無効 )
* @default true
*
* @param bulletBlockTag
* @type number
* @min -1
* @desc 弾が通行できない地形タグ番号
* 初期値: -1 ( 0 ~ 7 = 該当タグ通行不可 / -1 = 無効 )
* @default -1
*
* @param bulletBlockRegion
* @type number
* @min -1
* @desc 弾が通行できないリージョン番号
* 初期値: -1 ( 0 ~ 255 = 該当リージョン通行不可 / -1 = 無効 )
* @default -1
*
* @param leaderShotSe
* @desc プレイヤー弾発射効果音のファイル名。
* 初期値: Shot1
* @default Shot1
* @require 1
* @dir audio/se/
* @type file
*
* @param leaderShotSeParam
* @type struct<SeParam>
* @desc プレイヤー弾発射効果音のパラメータ。
* @default {"volume":"70", "pitch":"150", "pan":"0"}
*
* @param defaultDeadAnimeId
* @desc 戦闘不能時に表示するアニメーション番号の初期値
* 初期値: 67
* @default 67
* @require 1
* @type animation
*
* @param levelUpAnimeId
* @desc レベルアップ時に表示するアニメーション番号
* 初期値: 52
* @default 52
* @require 1
* @type animation
*
* @param playerDeadEventId
* @type common_event
* @desc 先頭のアクターが戦闘不能時に実行するコモンイベント番号
* 初期値: 0 ( 0 = 無効 / 1以上 = 該当するコモンイベント起動 )
* @default 0
*
* @param invincibleFollower
* @type boolean
* @desc フォロワーを無敵にする。
* 初期値: OFF ( true = ON 無敵 / false = OFF 通常 )
* @default false
*
* @param useGameover
* @type boolean
* @desc 全滅時にゲームオーバーシーンへ移行するかどうか
* 初期値: ON ( true = ON 移行する / false = OFF 移行しない )
* @default true
*
* @param maxPlayerBullet
* @type number
* @desc 同時に存在できるプレイヤー弾の最大数
* 初期値: 128
* @default 128
*
* @param maxEnemyBullet
* @type number
* @desc 同時に存在できるエネミー弾の最大数
* 初期値: 128
* @default 128
*
* @param bulletSizeTable
* @type string
* @desc 弾の当たり判定の大きさ(ドット数)
* 初期値: 6,6,6,6,6,6,6,6
* @default 6,6,6,6,6,6,6,6
*
* @param bulletBlendTable
* @type string
* @desc 弾のブレンドモード
* 初期値: 0,0,0,0,0,0,0,0
* @default 0,0,0,0,0,0,0,0
*
* @param equipDummyX
* @type number
* @min -9999
* @desc 装備シーンに表示するダミーのX座標
* 初期値: 408
* @default 408
*
* @param equipDummyY
* @type number
* @min -9999
* @desc 装備シーンに表示するダミーのY座標
* 初期値: 312
* @default 312
*
* @param useLevelUpMessage
* @type boolean
* @desc レベルアップメッセージを表示するか
* 初期値: true ( false = OFF 表示しない / true = ON 表示する )
* @default true
*
* @noteParam shotSeName
* @noteRequire 1
* @noteDir audio/se/
* @noteType file
* @noteData weapons
*
* @requiredAssets img/system/shootingBullet1
* @requiredAssets img/system/shootingBullet2
* @requiredAssets img/system/shootingBullet3
* @requiredAssets img/system/shootingBullet4
* @requiredAssets img/system/shootingBullet5
* @requiredAssets img/system/shootingBullet6
* @requiredAssets img/system/shootingBullet7
* @requiredAssets img/system/shootingBullet8
*
* @help
* TMPlugin - シューティング ver1.3.9
*
* 使い方:
*
* このプラグインを動作させるには、プレイヤーやイベントが発射する弾の画像
* が必要になります。
*
* 弾画像は shootingBullet1.png というファイル名で img/system フォルダに
* 入れてください。ひとつのファイルには、横に8つ、縦に任意の数の弾画像を
* 入れることができます。
* ファイル名の数字部分を変えて複数のファイルを使用することもできます、
* サイズが違う弾、当たり判定が違う弾を作る場合など、必要に応じてファイル
* を増やしてください。
* shootingBullet8.png まで、最大 8 つのファイルを利用できます。
*
* 準備ができたらデータベースで武器のメモ欄に以下のタグを挿入します。
* <shotWay:1>
* <shotCount:45>
* <shotSpeed:0.1>
* <shotInterval:15>
* <shotType:1>
* <shotIndex:8>
*
* この武器をアクターに装備させて、Aキーを押せば弾が発射されます。
* 弾が当たる敵イベントのメモ欄には <enemy:3> のようなタグを挿入します。
* これでこのイベントに 3 番の敵キャラのパラメータが適用され、弾を当てて
* HPが 0 になるとセルフスイッチ A がオンになります。
*
* このプラグインは RPGツクールMV Version 1.6.1 で動作確認をしています。
*
* このプラグインはMITライセンスのもとに配布しています、商用利用、
* 改造、再配布など、自由にお使いいただけます。
*
*
* プラグインパラメータ補足:
*
* bulletSizeTable
* 弾画像ファイルごとに当たり判定を設定します、初期設定の 6,6,6,6,6,6,6,6
* は shootingBullet1.png ~ shootingBullet8.png までのすべての弾が、弾の
* 中心から半径6ドットの当たり判定をもつという設定になります。
*
* bulletBlendTable
* 弾画像の合成方法を設定します、値と合成方法の対応は下記のとおりです。
* ( 0 = 通常 / 1 = 加算 / 2 = 乗算 / 3 = スクリーン )
* bulletSizeTable と同様に弾画像ファイルの数だけ設定する必要があります。
*
* useLevelUpMessage
* 弾による敵イベントの撃破で経験値を獲得した際に、アクターのレベルアップ
* をメッセージウィンドウで表示するかどうかを設定します。
* アクション要素が強いゲームでは非表示にすることをおすすめします。
*
*
* プラグインコマンド:
*
* startAutoShot
* このコマンドが実行されるとプレイヤーキャラクターが自動的に弾を撃つよう
* になります。この変更はパーティメンバーにも適用されます。
*
* stopAutoShot
* このコマンドが実行されるとプレイヤーキャラクターの自動射撃が止まります、
* この変更はパーティメンバーにも適用されます。
*
* nwayShot 3 0.4 0 0.1 60 1 3 1
* このコマンドを実行したイベントが弾を発射します、コマンド名に続く数値は
* 左から 弾数、間隔、角度、速度、寿命、タイプ、インデックス、スキル番号
* となります。
* タイプが 1 で、インデックスが 3 なら、弾画像として shootingBullet1.png
* の最上段、左から4つ目を使用します。(インデックスは 0 が先頭です)
*
* nwayAim 3 0.4 0 0.1 60 1 3 1
* このコマンドを実行したイベントが自機狙いの弾を発射します。
* 角度が 0 以外の場合は、自機がいる方向にその値を加算した角度で発射され
* ます。
*
* nallShot 8 0 0.1 60 1 3 1
* このコマンドを実行したイベントが全方位に弾を発射します、コマンド名に
* 続く数値は左から 弾数、角度、速度、寿命、タイプ、インデックス、
* スキル番号 となります。
* 弾の間隔は全方位に発射されるように自動で調整されます。
*
* nallAim 8 0 0.1 60 1 3 1
* nallShotの自機狙い版です。
*
* stopPlayerShot
* プレイヤー(パーティメンバー含む)の弾発射を手動、自動問わず禁止します。
*
* startPlayerShot
* プレイヤー(パーティメンバー含む)の弾発射禁止状態を解除します。
*
* stopPlayerShot message
* イベントコマンド『文章の表示』実行中のみプレイヤー(パーティメンバー含む)
* の発射弾を手動、自動問わず禁止します。
*
* startPlayerShot message
* stopPlayerShot message の効果を解除します。
*
* stopEnemyShot
* イベントの弾発射を禁止します、並列イベントで弾を発射している場合は
* 弾発射のコマンドのみが無効化され、そのほかのコマンドは実行されます。
*
* startEnemyShot
* イベントの弾発射禁止状態を解除します。
*
* stopEnemyShot message
* イベントコマンド『文章の表示』実行中のみイベントの弾発射を禁止します。
*
* startEnemyShot message
* stopEnemyShot message の効果を解除します。
*
* deletePlayerBullets
* プレイヤー(パーティメンバー含む)が発射したすべての弾を消去します。
*
* deleteEnemyBullets
* イベントが発射したすべての弾を消去します。
*
* forceShot 0
* プレイヤーのショット操作を強制実行します。このコマンドはディレイを
* 無視して弾を発射します。数値はパーティの先頭を 0 とした並び順です、
* 0 が指定されていれば先頭のキャラクターのみが弾を発射します。
* 数値を省略した場合はパーティ全員が弾を発射します。
*
* bulletPause
* すべての弾を一時的に停止させます。
* bulletPause off
* で一時停止が解除されます。
*
* setCollision 1 0.375 0.75
* イベント 1 番の当たり判定の横幅を 0.375、高さを 0.75 に設定します。
* このコマンドの効果はイベントページが切り替わるタイミングで消失します。
*
* setShiftFiringY 1 -24
* イベント 1 番の弾発射位置を上に 24 ドットずらします。
* このコマンドの効果はイベントページが切り替わるタイミングで消失します。
*
*
* メモ欄タグ(アクター、装備、ステート):
*
* <shotWay:3>
* 一度に発射される弾の数を設定します。
*
* <shotSpace:0.4>
* 一度に発射される弾同士の間隔(角度)を設定します。
*
* <shotSpeed:0.1>
* 弾の移動速度を設定します。
*
* <shotCount:60>
* 弾が消えるまでの時間をフレーム数で設定します。
*
* <shotInterval:20>
* 再発射までの発射不可時間をフレーム数で設定します。
*
* <shotInvincible:60>
* 被弾により発生する無敵時間をフレーム数で設定します。
*
*
* メモ欄タグ(装備、ステート):
*
* <shotIntervalRate:1.4>
* 再発射までの発射不可時間を倍率で設定します。
* shotInterval による加算補正よりも後に計算されます。
*
* メモ欄タグ(武器、ステート):
*
* <shotType:1>
* 弾のグラフィックとして使う画像ファイルを設定します。値が 1 なら
* shootingBullet1.png を使用します。
* 武器とステートの両方にこのタグがある場合、ステートのものを優先します。
*
* <shotIndex:3>
* shotTypeタグで選択した画像ファイルの何番目の弾を使用するか設定します。
* 武器とステートの両方にこのタグがある場合、ステートのものを優先します。
*
* <shotSkill:1>
* 弾が相手に当たったときのダメージ計算に使うスキルを設定します。
* 武器とステートの両方にこのタグがある場合、ステートのものを優先します。
*
*
* メモ欄タグ(武器):
*
* <shotSeName:Shot1>
* <shotSeVolume:70>
* <shotSePitch:150>
* このタグがついている武器を装備している間だけ、弾の発射音を変更します。
* それぞれ、ファイル名、音量、ピッチを設定することができます。
*
*
* メモ欄タグ(スキル):
*
* <mapThrough>
* マップの通行不可タイルと接触しても弾が消えなくなります。
*
* <penetrate>
* キャラクターと接触しても弾は消えずに貫通します。キャラクターが同じ弾に
* 複数回ダメージを受けることはありません。
*
* <bulletAnime:1>
* 弾がキャラクターにヒットした際に、指定した番号のアニメーションを
* 被弾したキャラクターに表示します。
*
* <timeBomb:6 0 0.2 45 1 0 1>
* 弾が時間切れで削除される際、その場所から新しい弾を発射します。
* パラメータはプラグインコマンド nallShot と同じです。
*
*
* メモ欄タグ(イベント):
*
* <enemy:1>
* イベントのパラメータとして利用する敵キャラ番号を設定します。
*
* <cw:0.375>
* イベントと弾の当たり判定サイズ(横幅)をイベントの中心から左(右)端
* までの長さで設定します。値は 1.0 でマップのタイル1マス分になります。
* このタグがない場合は初期値として 0.375 を使用します。
*
* <ch:0.75>
* イベントと弾の当たり判定サイズ(高さ)をイベントの足元から上端までの
* 長さで設定します。値は 1.0 でマップのタイル1マス分になります。
* このタグがない場合は初期値として 0.75 を使用します。
*
* <shiftFiringY:0>
* イベントの弾発射位置(Y座標)を指定したドット数だけずらします。
* 値が正なら下、負なら上方向へずらします。
* 通常は当たり判定の矩形の中心から弾が発射されますが、不都合がある場合は
* このタグで調整してください。
*
*
* メモ欄タグ(アクター):
*
* <cw:0.375>
* イベント用のものと同じです。
*
* <ch:0.75>
* イベント用のものと同じです。
*
* <shiftFiringY:0>
* イベント用のものと同じです。
*
* <deadCharacter:!Flame,5>
* このアクターが戦闘不能になったとき、歩行グラフィックを変更します。
* この例では !Flame.png の下段、左から2番目のグラフィックが採用されます。
*
*
* メモ欄タグ(アクター、敵キャラ):
*
* <deadAnime:67>
* 戦闘不能ステートが付加されたときに表示するアニメーションを設定します。
*
*
* 併用可能(動作確認済み)プラグイン:
*
* SAN_AnalogMove.js ver1.4.3
* SAN_AnalogMove.js ver3.0.3
* SAN_AnalogStick.js ver1.0.0
* SAN_MapGenerator.js ver1.1.8
* 作者: サンシロさん(http://rev2nym.blog.fc2.com/)
*
* CharacterPopupDamage.js Version 1.5.0
* 作者: トリアコンタンさん(http://triacontane.blogspot.jp/)
*
* CommonPopupCore.js ver1.05
* GetInformation.js ver1.15
* 作者: Yanaさん(https://twitter.com/yanatsuki_)
*
* Mano_InputConfig.js ver0.9.0
* 作者: しぐれんさん (https://twitter.com/Sigureya/)
*
* 導入する際は TMShooting.js よりも上(プラグイン管理の表示順)へ
* 挿入してください。順番が違うと正常に動作しない場合があります。
* 上記プラグインを併用したことによる不具合の報告は、併用プラグインの
* 作者様ではなく、必ずtomoakyへお願いします。
*
*
* その他注意点など:
*
* shotWay や shotSpace などのメモ欄タグは、アクター、装備、ステートの
* 合計値が採用されます。shotWay が 0 の場合、または shotCount が 0 の
* 場合は弾が発射されないか、発射後すぐに消滅してしまいます、素手の状態
* でも弾を撃ちたい場合はアクターにも shotWay と shotCount タグを設定する
* 必要があります。
*
* nwayShot などのコマンドに味方対象のスキルを設定した場合、イベント同士
* での攻撃が表現できますが、スキルの設定によっては命中判定が正しく機能
* しません。
* 弾が当たらない場合はスキルの使用効果にステート付加 0 %などの無意味な
* 効果を設定することでこの問題を回避することができます。
*
* パッドボタン配置は save フォルダ内の config.rpgsave に保存されます、
* このファイルが削除されるまでは初期配置の設定を変更しても適用されません。
*/
/*~struct~SeParam:
*
* @param volume
* @type number
* @max 100
* @desc 音量
* 初期値: 70 ( 0 ~ 100 )
* @default 70
*
* @param pitch
* @type number
* @min 50
* @max 150
* @desc ピッチ
* 初期値: 100 ( 50 ~ 150 )
* @default 100
*
* @param pan
* @type number
* @min -100
* @max 100
* @desc 位相
* 初期値: 0 ( -100 ~ 100 )
* @default 0
*/
/*~struct~InputSetting:
*
* @param text
* @desc コマンド名称です
* Mano_InputConfigで参照するために使います
*
* @param mandatory
* @desc Mano_InputConfigの方で必須指定されたものとして扱います。
* @type boolean
* @default false
*
* @param keys
* @desc キーボードの割り当てです
* @type string
*
* @param padButton
* @desc ゲームパッドの割り当てです
* カッコ内はツクールのデフォルトでの割り当てです
* @type select
* @default -1
* @option non(割り当てなし)
* @value -1
* @type select
* @option button6
* @value 6
* @option button7
* @value 7
* @option button8
* @value 8
* @option button9
* @value 9
* @option button10
* @value 10
* @option button11
* @value 11
* @option button0(ok/決定)
* @value 0
* @option button1(cancel/キャンセル)
* @value 1
* @option button2(shift/ダッシュ)
* @value 2
* @option button3(menu/メニュー)
* @value 3
* @option button4(pageup)
* @value 4
* @option button5(pagedown)
* @value 5
*/
var Imported = Imported || {};
Imported.TMShooting = true;
var TMPlugin = TMPlugin || {};
TMPlugin.Shooting = {};
TMPlugin.Shooting.Parameters = PluginManager.parameters('TMShooting');
TMPlugin.Shooting.HoldType = TMPlugin.Shooting.Parameters['holdType'] || 'SWITCH';
TMPlugin.Shooting.DeadSwitch = TMPlugin.Shooting.Parameters['deadSwitch'] || 'A';
TMPlugin.Shooting.ResetDeadSwitch = TMPlugin.Shooting.Parameters['resetDeadSwitch'] === '1';
TMPlugin.Shooting.BulletBlockTag = +(TMPlugin.Shooting.Parameters['bulletBlockTag'] || -1);
TMPlugin.Shooting.BulletBlockRegion = +(TMPlugin.Shooting.Parameters['bulletBlockRegion'] || -1);
TMPlugin.Shooting.DefaultDeadAnimeId = +(TMPlugin.Shooting.Parameters['defaultDeadAnimeId'] || 67);
TMPlugin.Shooting.LevelUpAnimeId = +(TMPlugin.Shooting.Parameters['levelUpAnimeId'] || 52);
TMPlugin.Shooting.LeaderShotSe = JSON.parse(TMPlugin.Shooting.Parameters['leaderShotSeParam'] || '{}');
TMPlugin.Shooting.LeaderShotSe.name = TMPlugin.Shooting.Parameters['leaderShotSe'] || '';
TMPlugin.Shooting.PlayerDeadEventId = +(TMPlugin.Shooting.Parameters['playerDeadEventId'] || 0);
TMPlugin.Shooting.InvincibleFollower = JSON.parse(TMPlugin.Shooting.Parameters['invincibleFollower']);
TMPlugin.Shooting.UseGameover = JSON.parse(TMPlugin.Shooting.Parameters['useGameover']);
TMPlugin.Shooting.MaxPlayerBullet = +(TMPlugin.Shooting.Parameters['maxPlayerBullet'] || 128 );
TMPlugin.Shooting.MaxEnemyBullet = +(TMPlugin.Shooting.Parameters['maxEnemyBullet'] || 128 );
TMPlugin.Shooting.EquipDummyX = +(TMPlugin.Shooting.Parameters['equipDummyX'] || 408);
TMPlugin.Shooting.EquipDummyY = +(TMPlugin.Shooting.Parameters['equipDummyY'] || 312);
TMPlugin.Shooting.UseLevelUpMessage = JSON.parse(TMPlugin.Shooting.Parameters['useLevelUpMessage']);
/**
* 変更点
* プラグインパラメータのshotKey,holdkeyを削除
* より詳細設定された、shot,holdに変更
*
* オプション関連の機能の削除
*
*/
//しぐれん:ここから追加分です
var MA_InputSymbols =MA_InputSymbols||[];
(function(){
'use strict';
function addInputSetting (param,symbol){
var data = JSON.parse(param);
Input.keyMapper[ ( data.keys.charCodeAt() )] =symbol;
Input.gamepadMapper[data.padButton]=symbol;
MA_InputSymbols.push({
symbol:symbol,
text:data.text,
mandatory:data.mandatory,
});
}
addInputSetting(TMPlugin.Shooting.Parameters.shot,'shot');
addInputSetting(TMPlugin.Shooting.Parameters.hold,'hold');
})();
//ここまで
TMPlugin.Shooting.BulletSizeTable = [0];
TMPlugin.Shooting.Parameters['bulletSizeTable'].split(',').forEach(function(size) {
TMPlugin.Shooting.BulletSizeTable.push(+size / 48);
});
TMPlugin.Shooting.BulletBlendTable = [0];
TMPlugin.Shooting.Parameters['bulletBlendTable'].split(',').forEach(function(blendMode) {
TMPlugin.Shooting.BulletBlendTable.push(+blendMode);
});
function Game_Bullet() {
this.initialize.apply(this, arguments);
}
function Game_PlayerBullet() {
this.initialize.apply(this, arguments);
}
function Game_EnemyBullet() {
this.initialize.apply(this, arguments);
}
(function() {
//-----------------------------------------------------------------------------
// Game_System
//
var _Game_System_initialize = Game_System.prototype.initialize;
Game_System.prototype.initialize = function() {
_Game_System_initialize.call(this);
this._playerShotEnabled = true;
this._playerShotEnabledMessage = true;
this._enemyShotEnabled = true;
this._enemyShotEnabledMessage = true;
this._bulletPause = false;
};
Game_System.prototype.isPlayerShotEnabled = function() {
if (!this._playerShotEnabledMessage && $gameMessage.isBusy()) return false;
return this._playerShotEnabled;
};
Game_System.prototype.setPlayerShotEnabled = function(value, flag) {
if (flag === 'message') {
this._playerShotEnabledMessage = value;
} else {
this._playerShotEnabled = value;
}
};
Game_System.prototype.isEnemyShotEnabled = function() {
if (!this._enemyShotEnabledMessage && $gameMessage.isBusy()) return false;
return this._enemyShotEnabled;
};
Game_System.prototype.setEnemyShotEnabled = function(value, flag) {
if (flag === 'message') {
this._enemyShotEnabledMessage = value;
} else {
this._enemyShotEnabled = value;
}
};
Game_System.prototype.isBulletPause = function() {
if (this._bulletPause == null) this.bulletPause = false;
return this._bulletPause;
};
Game_System.prototype.setBulletPause = function(flag) {
this._bulletPause = flag;
};
//-----------------------------------------------------------------------------
// Game_Action
//
var _Game_Action_setSubject = Game_Action.prototype.setSubject;
Game_Action.prototype.setSubject = function(subject) {
_Game_Action_setSubject.call(this, subject);
if (this._subjectActorId === 0 && this._subjectEnemyIndex < 0) {
this._subjectEnemyIndex = subject.screenX();
}
};
var _Game_Action_subject = Game_Action.prototype.subject;
Game_Action.prototype.subject = function() {
if (this._subjectActorId === 0 && this._subjectEnemyIndex < 0) {
return $gameMap.bulletEvent(-this._subjectEnemyIndex).battler();
} else {
return _Game_Action_subject.call(this);
}
};
//-----------------------------------------------------------------------------
// Game_Actor
//
var _Game_Actor_changeExp = Game_Actor.prototype.changeExp;
Game_Actor.prototype.changeExp = function(exp, show) {
var lastLevel = this._level;
_Game_Actor_changeExp.call(this, exp, show);
if (TMPlugin.Shooting.LevelUpAnimeId && this._level > lastLevel) {
var members = $gameParty.battleMembers();
for (var i = 0; i < members.length; i++) {
if (members[i].actorId() === this.actorId()) {
if (i === 0) {
$gamePlayer.requestAnimation(TMPlugin.Shooting.LevelUpAnimeId);
} else {
$gamePlayer.followers().follower(i - 1).requestAnimation(TMPlugin.Shooting.LevelUpAnimeId);
}
}
}
}
};
var _Game_Actor_shouldDisplayLevelUp = Game_Actor.prototype.shouldDisplayLevelUp;
Game_Actor.prototype.shouldDisplayLevelUp = function() {
if (!TMPlugin.Shooting.UseLevelUpMessage) return false;
return _Game_Actor_shouldDisplayLevelUp.call(this);
};
var _Game_Actor_refresh = Game_Actor.prototype.refresh;
Game_Actor.prototype.refresh = function() {
_Game_Actor_refresh.call(this);
this.refreshShotParam();
this.refreshDeadCharacter();
};
Game_Actor.prototype.refreshDeadCharacter = function() {
var actor = this.actor();
var deadCharacter = actor.meta.deadCharacter;
if (deadCharacter) {
deadCharacter = deadCharacter.split(',');
this._deadCharacterName = deadCharacter[0];
this._deadCharacterIndex = +deadCharacter[1];
} else {
this._deadCharacterName = null;
this._deadCharacterIndex = null;
}
};
Game_Actor.prototype.refreshShotParam = function() {
this._shotParams = {};
var data = this.actor();
this._shotParams.way = +(data.meta.shotWay || 0);
this._shotParams.space = +(data.meta.shotSpace || 0);
this._shotParams.speed = +(data.meta.shotSpeed || 0);
this._shotParams.count = +(data.meta.shotCount || 0);
this._shotParams.interval = +(data.meta.shotInterval || 0);
this._shotParams.invincible = +(data.meta.shotInvincible || 0);
var items = this.equips().concat(this.states());
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (item) {
this._shotParams.way += +(item.meta.shotWay || 0);
this._shotParams.space += +(item.meta.shotSpace || 0);
this._shotParams.speed += +(item.meta.shotSpeed || 0);
this._shotParams.count += +(item.meta.shotCount || 0);
this._shotParams.interval += +(item.meta.shotInterval || 0);
this._shotParams.invincible += +(item.meta.shotInvincible || 0);
}
}
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (item) {
this._shotParams.interval *= +(item.meta.shotIntervalRate || 1);
}
}
var weapon = this.weapons()[0];
if (weapon) {
this._shotParams.type = +(weapon.meta.shotType || 1);
this._shotParams.index = +(weapon.meta.shotIndex || 0);
this._shotParams.skillId = +(weapon.meta.shotSkill || this.attackSkillId());
this._shotParams.seName = weapon.meta.shotSeName;
this._shotParams.seVolume = +(weapon.meta.shotSeVolume || 90);
this._shotParams.sePitch = +(weapon.meta.shotSePitch || 100);
} else {
this._shotParams.type = 1;
this._shotParams.index = 0;
this._shotParams.skillId = this.attackSkillId();
this._shotParams.seName = null;
}
var items = this.states();
for (var i = 0; i < items.length; i++) {
var item = items[i];
if (item) {
if (item.meta.shotType) this._shotParams.type = +item.meta.shotType;
if (item.meta.shotIndex) this._shotParams.index = +item.meta.shotIndex;
if (item.meta.shotSkill) this._shotParams.skillId = +item.meta.shotSkill;
}
}
};
Game_Actor.prototype.shotParams = function() {
return this._shotParams;
};
Game_Actor.prototype.deadCharacterName = function() {
return this._deadCharacterName;
};
Game_Actor.prototype.deadCharacterIndex = function() {
return this._deadCharacterIndex;
};
//-----------------------------------------------------------------------------
// Game_MapGenerator
//
if (Imported.SAN_MapGenerator) {
// 非地面タイルを通路タイルに変換
var _Game_MapGenerator_notGroundToPass = Game_MapGenerator.prototype.notGroundToPass;
Game_MapGenerator.prototype.notGroundToPass = function(x, y) {
_Game_MapGenerator_notGroundToPass.call(this, x, y);
$gameMap.setBulletPassageTableXy(x, y, true);
};
// 指定したタイルを空白タイルに変換
var _Game_MapGenerator_anyToSpace = Game_MapGenerator.prototype.anyToSpace;
Game_MapGenerator.prototype.anyToSpace = function(x, y) {
_Game_MapGenerator_anyToSpace.call(this, x, y);
$gameMap.setBulletPassageTableXy(x, y, false);
};
// 大部屋
var _Game_MapGenerator_bigRoom = Game_MapGenerator.prototype.bigRoom;
Game_MapGenerator.prototype.bigRoom = function() {
_Game_MapGenerator_bigRoom.call(this);
$gameMap.createBulletPassageTable();
};
}
//-----------------------------------------------------------------------------
// Game_Map
//
// セットアップ
var _Game_Map_setup = Game_Map.prototype.setup;
Game_Map.prototype.setup = function(mapId) {
_Game_Map_setup.call(this, mapId);
this.setupBullets();
this.createBulletPassageTable();
if (TMPlugin.Shooting.ResetDeadSwitch) {
this.events().forEach(function(event) {
var key = [mapId, event.eventId(), TMPlugin.Shooting.DeadSwitch];
$gameSelfSwitches.setValue(key, false);
});
}
};
// イベントのセットアップ
var _Game_Map_setupEvents = Game_Map.prototype.setupEvents;
Game_Map.prototype.setupEvents = function() {
this._eventIdCount = 0;
_Game_Map_setupEvents.call(this);
};
Game_Map.prototype.issueEventIdCount = function() {
this._eventIdCount++;
return this._eventIdCount;
};
Game_Map.prototype.bulletEvent = function(ownerId) {
for (var i = 1; i < this._events.length; i++) {
if (this._events[i] && this._events[i].ownerId() === ownerId) {
return this._events[i];
}
}
return null;
};
// 弾のセットアップ
Game_Map.prototype.setupBullets = function() {
this._playerBullets = [];
this._alivePlayerBullets = [];
this._blankPlayerBullets = [];
for (var i = 0; i < TMPlugin.Shooting.MaxPlayerBullet; i++) {
this._playerBullets.push(new Game_PlayerBullet());
this._blankPlayerBullets.push(i);
}
this._enemyBullets = [];
this._aliveEnemyBullets = [];
this._blankEnemyBullets = [];
for (var i = 0; i < TMPlugin.Shooting.MaxEnemyBullet; i++) {
this._enemyBullets.push(new Game_EnemyBullet());
this._blankEnemyBullets.push(i);
}
};
Game_Map.prototype.playerBullets = function() {
return this._playerBullets;
};
Game_Map.prototype.enemyBullets = function() {
return this._enemyBullets;
};
// 弾の通行チェックに利用するテーブルを作成する
Game_Map.prototype.createBulletPassageTable = function() {
var flags = this.tilesetFlags();
this._bulletPassageTable = [];
for (var x = 0; x < $dataMap.width; x++) {
this._bulletPassageTable.push([]);
for (var y = 0; y < $dataMap.height; y++) {
if (this.regionId(x, y) === TMPlugin.Shooting.BulletBlockRegion) {
this._bulletPassageTable[x][y] = false;
continue;
}
var passage = false;
var tiles = this.layeredTiles(x, y);
for (var i = 0; i < tiles.length; i++) {
var flag = flags[tiles[i]];
if (flag >> 12 === TMPlugin.Shooting.BulletBlockTag) {
passage = false;
break;
};
if ((flag & 0x10) !== 0) continue;
if ((flag & 0x0f) !== 0x0f) {
passage = true;
break;
}
if ((flag & 0x0f) !== 0) break;
}
this._bulletPassageTable[x][y] = passage;
}
}
};
Game_Map.prototype.setBulletPassageTableXy = function(x, y, flag) {
this._bulletPassageTable[x][y] = flag;
};
// 弾の通行チェック
Game_Map.prototype.checkPassageBullet = function(x, y) {
return this.isValid(x, y) && this._bulletPassageTable[x][y];
};
// フレーム更新
var _Game_Map_update = Game_Map.prototype.update;
Game_Map.prototype.update = function(sceneActive) {
_Game_Map_update.call(this, sceneActive);
this.updateBullets();
};
// 弾の更新
Game_Map.prototype.updateBullets = function() {
if ($gameSystem.isBulletPause()) return;
for (var i = this._alivePlayerBullets.length - 1; i >= 0; i--) {
var index = this._alivePlayerBullets[i];
if (!this._playerBullets[index].update()) {
this._alivePlayerBullets.splice(i, 1);
this._blankPlayerBullets.push(index);
}
}
for (var i = this._aliveEnemyBullets.length - 1; i >= 0; i--) {
var index = this._aliveEnemyBullets[i];
if (!this._enemyBullets[index].update()) {
this._aliveEnemyBullets.splice(i, 1);
this._blankEnemyBullets.push(index);
}
}
};
// 弾の追加
Game_Map.prototype.addBullet = function(x, y, z, vx, vy, angle, count, type, index, skillId, ownerId) {
if (ownerId < 0) {
if (this._blankPlayerBullets.length > 0) {
var bulletIndex = this._blankPlayerBullets.shift();
this._playerBullets[bulletIndex].setup(x, y, z, vx, vy, angle, count, type, index, skillId, ownerId);
this._alivePlayerBullets.push(bulletIndex);
}
} else {
if (this._blankEnemyBullets.length > 0) {
var bulletIndex = this._blankEnemyBullets.shift();
this._enemyBullets[bulletIndex].setup(x, y, z, vx, vy, angle, count, type, index, skillId, ownerId);
this._aliveEnemyBullets.push(bulletIndex);
}
}
};
// プレイヤー弾の全削除
Game_Map.prototype.clearPlayerBullets = function() {
this._alivePlayerBullets.forEach(function(index) {
this._playerBullets[index].erase();
this._blankPlayerBullets.push(index);
}, this);
this._alivePlayerBullets.length = 0;
};
// エネミー弾の全削除
Game_Map.prototype.clearEnemyBullets = function() {
this._aliveEnemyBullets.forEach(function(index) {
this._enemyBullets[index].erase();
this._blankEnemyBullets.push(index);
}, this);
this._aliveEnemyBullets.length = 0;
};
// すべての弾を削除
Game_Map.prototype.clearAllBullets = function() {
this.clearPlayerBullets();
this.clearEnemyBullets();
};
// SAN_MapGenerator.js に対応
if (Imported.SAN_MapGenerator) {
var _Game_Map_generateMap = Game_Map.prototype.generateMap;
Game_Map.prototype.generateMap = function(mapType) {
_Game_Map_generateMap.call(this, mapType);
this.createBulletPassageTable();
};
}
//-----------------------------------------------------------------------------
// Game_Bullet
//