-
Notifications
You must be signed in to change notification settings - Fork 1
/
KRD_StateGroup.js
146 lines (106 loc) · 4.36 KB
/
KRD_StateGroup.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
/*:
* @target MV
* @plugindesc ステートグループ(防具スキル)
* @url https://twitter.com/kuroudo119/
* @url https://github.com/kuroudo119/RPGMV-Plugin
* @author kuroudo119 (くろうど)
*
* @help
# KRD_StateGroup.js
ステートグループ(防具スキル)
## 権利表記
(c) 2023 kuroudo119 (くろうど)
## 利用規約
このプラグインはMITライセンスです。
https://github.com/kuroudo119/RPGMV-Plugin/blob/master/LICENSE
## 機能概要
アクターが装備している
防具に設定されたグループ&取得ポイントの組合せを合算し、
対応するステートのグループの発動ポイント以上の取得ポイントを持つ
ステートを付与します。
## 使い方
### 防具側
メモ欄に以下のように記述します。
<TagPoint:{"グループA":4, "グループC":3}>
TagPoint: 任意のタグ名です。
グループA 任意のグループ名です。
4 取得ポイント(任意の値)です。
{"グループ名":99} ひとつのグループの書式です。
{"グループ名":99, "グループ名":99} 複数の場合はカンマ区切りです。
詳しくは json の書式を確認してください。
### ステート側
メモ欄に以下のように記述します。
<TagState:{"グループB":8}>
TagState: 任意のタグ名です。
グループB 任意のグループ名です。
8 発動ポイント(任意の値)です。
{"グループ名":99} ひとつのグループの書式です。
ひとつのステートにひとつのグループのみ設定可能です。
詳しくは json の書式を確認してください。
## プラグインコマンド
### addAllStateGroupParty
プラグインコマンド欄に以下のように記述します。
addAllStateGroupParty TagPoint TagState
TagPoint 防具側に記述した任意のタグです。
TagState ステート側に記述した任意のタグです。
## 更新履歴
- ver.0.0.1 (2023/10/06) 作成開始
- ver.0.1.0 (2023/10/07) 関数版完成
- ver.1.0.0 (2023/10/07) 公開
- ver.1.1.0 (2023/10/07) 発動ポイント最大のステート付与に修正
*
*
*/
(() => {
"use strict";
const TAG_POINT = "TagPoint";
const TAG_STATE = "TagState";
//--------------------------------------
// プラグインコマンド
const KRD_Game_Interpreter_pluginCommand = Game_Interpreter.prototype.pluginCommand;
Game_Interpreter.prototype.pluginCommand = function(command, args) {
KRD_Game_Interpreter_pluginCommand.apply(this, arguments);
switch(command) {
case "addAllStateGroupParty":
$gameParty.addAllStateGroup(args[0], args[1]);
break;
}
};
//--------------------------------------
Game_Actor.prototype.armorPointList = function(tag = TAG_POINT) {
return this.armors().filter(armor => armor.meta[tag]).map(armor => JSON.parse(armor.meta[tag]));
};
Game_Actor.prototype.armorStateList = function(armorPointList) {
const set = new Set();
let list = [];
armorPointList.forEach(armorPoint => list = list.concat(Object.keys(armorPoint)));
list.forEach(data => set.add(data));
return set;
};
Game_Actor.prototype.armorPoint = function(groupName, armorPointList) {
return armorPointList.reduce((r, point) => r + (point[groupName] || 0), 0);
};
Game_Temp.prototype.stateGroupData = function(tag = TAG_STATE) {
return $dataStates.filter(state => state && state.meta[tag]).map(state => state && {"id":state.id, "tag":JSON.parse(state.meta[tag])});
};
Game_Actor.prototype.addAllStateGroup = function(tagPoint = TAG_POINT, tagState = TAG_STATE) {
const armorPointList = this.armorPointList(tagPoint);
const armorStateList = this.armorStateList(armorPointList);
const stateGroupData = $gameTemp.stateGroupData(tagState);
armorStateList.forEach(groupName => {
const armorPoint = this.armorPoint(groupName, armorPointList);
this.addStateGroup(groupName, armorPoint, stateGroupData);
}, this);
};
Game_Actor.prototype.addStateGroup = function(groupName, armorPoint, stateGroupData) {
const filtered = stateGroupData.filter(data => data.tag[groupName] <= armorPoint);
filtered.sort((a, b) => b.tag[groupName] - a.tag[groupName]);
if (filtered.length > 0) {
this.addState(filtered[0].id);
}
};
Game_Party.prototype.addAllStateGroup = function(tagPoint = TAG_POINT, tagState = TAG_STATE) {
this.members().forEach(actor => actor.addAllStateGroup(tagPoint, tagState));
};
//--------------------------------------
})();