@malib/gear 1.0.0-next.8 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,4472 @@
1
+ //#region src/lib/data/AddOptionData.ts
2
+ /**
3
+ * 추가 옵션 종류
4
+ */
5
+ let AddOptionType = /* @__PURE__ */ function(AddOptionType) {
6
+ /** STR */
7
+ AddOptionType["str"] = "str";
8
+ /** DEX */
9
+ AddOptionType["dex"] = "dex";
10
+ /** INT */
11
+ AddOptionType["int"] = "int";
12
+ /** LUK */
13
+ AddOptionType["luk"] = "luk";
14
+ /** STR, DEX */
15
+ AddOptionType["str_dex"] = "str,dex";
16
+ /** STR, INT */
17
+ AddOptionType["str_int"] = "str,int";
18
+ /** STR, LUK */
19
+ AddOptionType["str_luk"] = "str,luk";
20
+ /** DEX, INT */
21
+ AddOptionType["dex_int"] = "dex,int";
22
+ /** DEX, LUK */
23
+ AddOptionType["dex_luk"] = "dex,luk";
24
+ /** INT, LUK */
25
+ AddOptionType["int_luk"] = "int,luk";
26
+ /** 최대 HP */
27
+ AddOptionType["maxHp"] = "maxHp";
28
+ /** 최대 MP */
29
+ AddOptionType["maxMp"] = "maxMp";
30
+ /** 공격력 */
31
+ AddOptionType["attackPower"] = "attackPower";
32
+ /** 마력 */
33
+ AddOptionType["magicPower"] = "magicPower";
34
+ /** 방어력 */
35
+ AddOptionType["armor"] = "armor";
36
+ /** 이동속도 */
37
+ AddOptionType["speed"] = "speed";
38
+ /** 점프력 */
39
+ AddOptionType["jump"] = "jump";
40
+ /** 보스 공격 시 데미지 증가(%) */
41
+ AddOptionType["bossDamage"] = "bossDamage";
42
+ /** 데미지(%) */
43
+ AddOptionType["damage"] = "damage";
44
+ /** 올스탯(%) */
45
+ AddOptionType["allStat"] = "allStat";
46
+ /** 착용 레벨 감소 */
47
+ AddOptionType["reqLevelDecrease"] = "reqLevelDecrease";
48
+ return AddOptionType;
49
+ }({});
50
+ //#endregion
51
+ //#region src/lib/data/GearAttributeData.ts
52
+ let GearTrade = /* @__PURE__ */ function(GearTrade) {
53
+ /** 교환 가능 */
54
+ GearTrade[GearTrade["Tradeable"] = 0] = "Tradeable";
55
+ /** 교환 불가 */
56
+ GearTrade[GearTrade["TradeBlock"] = 1] = "TradeBlock";
57
+ /** 장착 시 교환 불가 */
58
+ GearTrade[GearTrade["EquipTradeBlock"] = 2] = "EquipTradeBlock";
59
+ /** 1회 교환 가능 */
60
+ GearTrade[GearTrade["TradeOnce"] = 3] = "TradeOnce";
61
+ return GearTrade;
62
+ }({});
63
+ let GearShare = /* @__PURE__ */ function(GearShare) {
64
+ /** 없음 */
65
+ GearShare[GearShare["None"] = 0] = "None";
66
+ /** 월드 내 나의 캐릭터 간 이동 가능 */
67
+ GearShare[GearShare["AccountSharable"] = 1] = "AccountSharable";
68
+ /** 월드 내 나의 캐릭터 간 1회 이동 가능 (이동 후 교환불가) */
69
+ GearShare[GearShare["AccountSharableOnce"] = 2] = "AccountSharableOnce";
70
+ return GearShare;
71
+ }({});
72
+ let GearCapability = /* @__PURE__ */ function(GearCapability) {
73
+ /** 설정 불가 */
74
+ GearCapability[GearCapability["Cannot"] = 0] = "Cannot";
75
+ /** 설정 가능 */
76
+ GearCapability[GearCapability["Can"] = 1] = "Can";
77
+ /** 재설정 불가 */
78
+ GearCapability[GearCapability["Fixed"] = 2] = "Fixed";
79
+ return GearCapability;
80
+ }({});
81
+ let GearCuttable = /* @__PURE__ */ function(GearCuttable) {
82
+ /** 없음 */
83
+ GearCuttable[GearCuttable["None"] = 0] = "None";
84
+ /** 카르마의 가위 또는 실버 카르마의 가위를 사용하면 1회 교환이 가능하게 할 수 있습니다. */
85
+ GearCuttable[GearCuttable["Silver"] = 1] = "Silver";
86
+ /** 플래티넘 카르마의 가위를 사용하면 1회 교환이 가능하게 할 수 있습니다. */
87
+ GearCuttable[GearCuttable["Platinum"] = 2] = "Platinum";
88
+ return GearCuttable;
89
+ }({});
90
+ //#endregion
91
+ //#region src/lib/data/GearData.ts
92
+ /**
93
+ * 착용 가능 성별
94
+ */
95
+ let GearGender = /* @__PURE__ */ function(GearGender) {
96
+ /** 남 */
97
+ GearGender[GearGender["Male"] = 0] = "Male";
98
+ /** 여 */
99
+ GearGender[GearGender["Female"] = 1] = "Female";
100
+ return GearGender;
101
+ }({});
102
+ //#endregion
103
+ //#region src/lib/data/GearType.ts
104
+ let GearType = /* @__PURE__ */ function(GearType) {
105
+ /** 모자 */
106
+ GearType[GearType["cap"] = 100] = "cap";
107
+ /** 얼굴장식 */
108
+ GearType[GearType["faceAccessory"] = 101] = "faceAccessory";
109
+ /** 눈장식 */
110
+ GearType[GearType["eyeAccessory"] = 102] = "eyeAccessory";
111
+ /** 귀고리 */
112
+ GearType[GearType["earrings"] = 103] = "earrings";
113
+ /** 상의 */
114
+ GearType[GearType["coat"] = 104] = "coat";
115
+ /** 한벌옷 */
116
+ GearType[GearType["longcoat"] = 105] = "longcoat";
117
+ /** 하의 */
118
+ GearType[GearType["pants"] = 106] = "pants";
119
+ /** 신발 */
120
+ GearType[GearType["shoes"] = 107] = "shoes";
121
+ /** 장갑 */
122
+ GearType[GearType["glove"] = 108] = "glove";
123
+ /** 망토 */
124
+ GearType[GearType["cape"] = 110] = "cape";
125
+ /** 반지 */
126
+ GearType[GearType["ring"] = 111] = "ring";
127
+ /** 펜던트 */
128
+ GearType[GearType["pendant"] = 112] = "pendant";
129
+ /** 벨트 */
130
+ GearType[GearType["belt"] = 113] = "belt";
131
+ /** 훈장 */
132
+ GearType[GearType["medal"] = 114] = "medal";
133
+ /** 어깨장식 */
134
+ GearType[GearType["shoulder"] = 115] = "shoulder";
135
+ /** 포켓 아이템 */
136
+ GearType[GearType["pocket"] = 116] = "pocket";
137
+ /** 뱃지 */
138
+ GearType[GearType["badge"] = 118] = "badge";
139
+ /** 안드로이드 */
140
+ GearType[GearType["android"] = 166] = "android";
141
+ /** 기계 심장 */
142
+ GearType[GearType["machineHeart"] = 167] = "machineHeart";
143
+ /** 방패 */
144
+ GearType[GearType["shield"] = 109] = "shield";
145
+ /** 엠블렘 */
146
+ GearType[GearType["emblem"] = 119] = "emblem";
147
+ /** 파워소스 */
148
+ GearType[GearType["powerSource"] = 119020] = "powerSource";
149
+ /** 샤이닝 로드 */
150
+ GearType[GearType["shiningRod"] = 1212] = "shiningRod";
151
+ /** 튜너 */
152
+ GearType[GearType["tuner"] = 1213] = "tuner";
153
+ /** 브레스 슈터 */
154
+ GearType[GearType["breathShooter"] = 1214] = "breathShooter";
155
+ /** 장검 */
156
+ GearType[GearType["longSword2"] = 1215] = "longSword2";
157
+ /** 소울 슈터 */
158
+ GearType[GearType["soulShooter"] = 122] = "soulShooter";
159
+ /** 데스페라도 */
160
+ GearType[GearType["desperado"] = 123] = "desperado";
161
+ /** 에너지소드 */
162
+ GearType[GearType["energySword"] = 124] = "energySword";
163
+ /** ESP 리미터 */
164
+ GearType[GearType["espLimiter"] = 126] = "espLimiter";
165
+ /** 체인 (카데나) */
166
+ GearType[GearType["chain"] = 127] = "chain";
167
+ /** 매직 건틀렛 */
168
+ GearType[GearType["magicGauntlet"] = 128] = "magicGauntlet";
169
+ /** 부채 (호영) */
170
+ GearType[GearType["ritualFan"] = 129] = "ritualFan";
171
+ /** 한손검 */
172
+ GearType[GearType["ohSword"] = 130] = "ohSword";
173
+ /** 한손도끼 */
174
+ GearType[GearType["ohAxe"] = 131] = "ohAxe";
175
+ /** 한손둔기 */
176
+ GearType[GearType["ohBlunt"] = 132] = "ohBlunt";
177
+ /** 단검 */
178
+ GearType[GearType["dagger"] = 133] = "dagger";
179
+ /** 블레이드 */
180
+ GearType[GearType["katara"] = 134] = "katara";
181
+ /** 케인 */
182
+ GearType[GearType["cane"] = 136] = "cane";
183
+ /** 완드 */
184
+ GearType[GearType["wand"] = 137] = "wand";
185
+ /** 스태프 */
186
+ GearType[GearType["staff"] = 138] = "staff";
187
+ /** 두손검 */
188
+ GearType[GearType["thSword"] = 140] = "thSword";
189
+ /** 차크람 */
190
+ GearType[GearType["chakram"] = 1404] = "chakram";
191
+ /** 두손도끼 */
192
+ GearType[GearType["thAxe"] = 141] = "thAxe";
193
+ /** 두손둔기 */
194
+ GearType[GearType["thBlunt"] = 142] = "thBlunt";
195
+ /** 창 */
196
+ GearType[GearType["spear"] = 143] = "spear";
197
+ /** 폴암 */
198
+ GearType[GearType["polearm"] = 144] = "polearm";
199
+ /** 활 */
200
+ GearType[GearType["bow"] = 145] = "bow";
201
+ /** 석궁 */
202
+ GearType[GearType["crossbow"] = 146] = "crossbow";
203
+ /** 아대 */
204
+ GearType[GearType["claw"] = 147] = "claw";
205
+ /** 너클 */
206
+ GearType[GearType["knuckle"] = 148] = "knuckle";
207
+ /** 건 */
208
+ GearType[GearType["gun"] = 149] = "gun";
209
+ /** 삽 */
210
+ GearType[GearType["shovel"] = 150] = "shovel";
211
+ /** 곡괭이 */
212
+ GearType[GearType["pickaxe"] = 151] = "pickaxe";
213
+ /** 듀얼 보우건 */
214
+ GearType[GearType["dualBowguns"] = 152] = "dualBowguns";
215
+ /** 핸드캐논 */
216
+ GearType[GearType["handCannon"] = 153] = "handCannon";
217
+ /** 대검 */
218
+ GearType[GearType["heavySword"] = 156] = "heavySword";
219
+ /** 태도 */
220
+ GearType[GearType["longSword"] = 157] = "longSword";
221
+ /** 건틀렛 리볼버 */
222
+ GearType[GearType["gauntletRevolver"] = 158] = "gauntletRevolver";
223
+ /** 에인션트 보우 */
224
+ GearType[GearType["ancientBow"] = 159] = "ancientBow";
225
+ /** 소울실드 */
226
+ GearType[GearType["soulShield"] = 1098] = "soulShield";
227
+ /** 포스실드 */
228
+ GearType[GearType["demonShield"] = 1099] = "demonShield";
229
+ /** 마법화살 */
230
+ GearType[GearType["magicArrow"] = 135200] = "magicArrow";
231
+ /** 카드 */
232
+ GearType[GearType["card"] = 135210] = "card";
233
+ /** 메달 */
234
+ GearType[GearType["medallion"] = 135220] = "medallion";
235
+ /** 로자리오 */
236
+ GearType[GearType["rosary"] = 135221] = "rosary";
237
+ /** 쇠사슬 */
238
+ GearType[GearType["ironChain"] = 135222] = "ironChain";
239
+ /** 마도서 (불,독) */
240
+ GearType[GearType["magicBook1"] = 135223] = "magicBook1";
241
+ /** 마도서 (얼음,번개) */
242
+ GearType[GearType["magicBook2"] = 135224] = "magicBook2";
243
+ /** 마도서 (비숍) */
244
+ GearType[GearType["magicBook3"] = 135225] = "magicBook3";
245
+ /** 화살깃 */
246
+ GearType[GearType["arrowFletching"] = 135226] = "arrowFletching";
247
+ /** 활골무 */
248
+ GearType[GearType["bowThimble"] = 135227] = "bowThimble";
249
+ /** 단검용 검집 */
250
+ GearType[GearType["daggerScabbard"] = 135228] = "daggerScabbard";
251
+ /** 부적 */
252
+ GearType[GearType["charm"] = 135229] = "charm";
253
+ /** 오브 */
254
+ GearType[GearType["orb"] = 135240] = "orb";
255
+ /** 용의 정수 */
256
+ GearType[GearType["dragonEssence"] = 135250] = "dragonEssence";
257
+ /** 소울링 */
258
+ GearType[GearType["soulRing"] = 135260] = "soulRing";
259
+ /** 매그넘 */
260
+ GearType[GearType["magnum"] = 135270] = "magnum";
261
+ /** 리스트밴드 */
262
+ GearType[GearType["wristBand"] = 135290] = "wristBand";
263
+ /** 조준기 */
264
+ GearType[GearType["farSight"] = 135291] = "farSight";
265
+ /** 화약통 */
266
+ GearType[GearType["powderKeg"] = 135292] = "powderKeg";
267
+ /** 무게추 */
268
+ GearType[GearType["mass"] = 135293] = "mass";
269
+ /** 문서 */
270
+ GearType[GearType["document"] = 135294] = "document";
271
+ /** 마법구슬 */
272
+ GearType[GearType["magicMarble"] = 135295] = "magicMarble";
273
+ /** 화살촉 */
274
+ GearType[GearType["arrowhead"] = 135296] = "arrowhead";
275
+ /** 보석 (시그너스) */
276
+ GearType[GearType["jewel"] = 135297] = "jewel";
277
+ /** 화약통 2 */
278
+ GearType[GearType["powderKeg2"] = 135298] = "powderKeg2";
279
+ /** 컨트롤러 */
280
+ GearType[GearType["controller"] = 135300] = "controller";
281
+ /** 여우구슬 */
282
+ GearType[GearType["foxMarble"] = 135310] = "foxMarble";
283
+ /** 체스피스 */
284
+ GearType[GearType["chessPiece"] = 135320] = "chessPiece";
285
+ /** 무기 전송장치 */
286
+ GearType[GearType["transmitter"] = 135330] = "transmitter";
287
+ /** 장약 */
288
+ GearType[GearType["charge"] = 135340] = "charge";
289
+ /** 매직윙 */
290
+ GearType[GearType["magicWing"] = 135350] = "magicWing";
291
+ /** 패스 오브 어비스 */
292
+ GearType[GearType["pathOfAbyss"] = 135360] = "pathOfAbyss";
293
+ /** 렐릭 */
294
+ GearType[GearType["relic"] = 135370] = "relic";
295
+ /** 선추 */
296
+ GearType[GearType["fanTassel"] = 135380] = "fanTassel";
297
+ /** 브레이슬릿 */
298
+ GearType[GearType["bracelet"] = 135400] = "bracelet";
299
+ /** 웨폰 벨트 */
300
+ GearType[GearType["weaponBelt"] = 135401] = "weaponBelt";
301
+ /** 노리개 */
302
+ GearType[GearType["ornament"] = 135402] = "ornament";
303
+ /** 헥스시커 */
304
+ GearType[GearType["hexSeeker"] = 135403] = "hexSeeker";
305
+ /** 여의보주 */
306
+ GearType[GearType["sacredJewel"] = 135404] = "sacredJewel";
307
+ /** 펫장비 */
308
+ GearType[GearType["petEquip"] = 180] = "petEquip";
309
+ /** 메카닉 엔진 */
310
+ GearType[GearType["machineEngine"] = 161] = "machineEngine";
311
+ /** 메카닉 암 */
312
+ GearType[GearType["machineArms"] = 162] = "machineArms";
313
+ /** 메카닉 레그 */
314
+ GearType[GearType["machineLegs"] = 163] = "machineLegs";
315
+ /** 메카닉 프레임 */
316
+ GearType[GearType["machineBody"] = 164] = "machineBody";
317
+ /** 메카닉 트렌지스터 */
318
+ GearType[GearType["machineTransistors"] = 165] = "machineTransistors";
319
+ /** 모래시계 */
320
+ GearType[GearType["hourGlass"] = 17237] = "hourGlass";
321
+ /** 드래곤 모자 */
322
+ GearType[GearType["dragonMask"] = 194] = "dragonMask";
323
+ /** 드래곤 펜던트 */
324
+ GearType[GearType["dragonPendant"] = 195] = "dragonPendant";
325
+ /** 드래곤 날개장식 */
326
+ GearType[GearType["dragonWings"] = 196] = "dragonWings";
327
+ /** 드래곤 꼬리장식 */
328
+ GearType[GearType["dragonTail"] = 197] = "dragonTail";
329
+ return GearType;
330
+ }({});
331
+ //#endregion
332
+ //#region src/lib/data/PotentialGrade.ts
333
+ let PotentialGrade = /* @__PURE__ */ function(PotentialGrade) {
334
+ PotentialGrade[PotentialGrade["Normal"] = 0] = "Normal";
335
+ PotentialGrade[PotentialGrade["Rare"] = 1] = "Rare";
336
+ PotentialGrade[PotentialGrade["Epic"] = 2] = "Epic";
337
+ PotentialGrade[PotentialGrade["Unique"] = 3] = "Unique";
338
+ PotentialGrade[PotentialGrade["Legendary"] = 4] = "Legendary";
339
+ return PotentialGrade;
340
+ }({});
341
+ //#endregion
342
+ //#region src/lib/errors.ts
343
+ var GearError = class extends Error {
344
+ gearId;
345
+ gearName;
346
+ status;
347
+ constructor(message, gear, status) {
348
+ super(message);
349
+ this.name = "GearError";
350
+ this.gearId = gear.id;
351
+ this.gearName = gear.name;
352
+ this.status = status;
353
+ }
354
+ };
355
+ let ErrorMessage = /* @__PURE__ */ function(ErrorMessage) {
356
+ ErrorMessage["Shape_InvalidShapeChangeGear"] = "외형을 변경할 수 없는 장비입니다.";
357
+ ErrorMessage["AddOption_InvalidApplyGear"] = "추가 옵션을 적용할 수 없는 상태의 장비입니다.";
358
+ ErrorMessage["AddOption_InvalidResetGear"] = "추가 옵션을 초기화할 수 없는 상태의 장비입니다.";
359
+ ErrorMessage["AddOption_InvalidAttackPowerGear"] = "공격력/마력 추가 옵션은 착용 가능 레벨 60 이상의 무기 장비에만 부여할 수 있습니다.";
360
+ ErrorMessage["AddOption_UnknownLongSwordGear"] = "공격력/마력 추가 옵션을 부여할 수 없는 태도 장비입니다. (Please submit issue with the gear info)";
361
+ ErrorMessage["AddOption_InvalidSpeedGear"] = "이동속도 추가 옵션은 무기가 아닌 장비에만 부여할 수 있습니다.";
362
+ ErrorMessage["AddOption_InvalidJumpGear"] = "점프력 추가 옵션은 무기가 아닌 장비에만 부여할 수 있습니다.";
363
+ ErrorMessage["AddOption_InvalidDamageGear"] = "데미지(%) 추가 옵션은 무기 장비에만 부여할 수 있습니다.";
364
+ ErrorMessage["AddOption_InvalidBossDamageGear"] = "보스 공격 시 데미지 증가(%) 추가 옵션은 착용 가능 레벨 90 이상의 무기 장비에만 부여할 수 있습니다.";
365
+ ErrorMessage["AddOption_InvalidAllStatGear"] = "올스탯(%) 추가 옵션은 착용 가능 레벨 70 이상 또는 무기 장비에만 부여할 수 있습니다.";
366
+ ErrorMessage["AddOption_InvalidReqLevelDecreaseGear"] = "착용 레벨 감소 옵션은 착용 가능 레벨 1 이상의 장비에만 부여할 수 있습니다.";
367
+ ErrorMessage["Upgrade_InvalidGoldenHammerGear"] = "황금 망치를 적용할 수 없는 상태의 장비입니다.";
368
+ ErrorMessage["Upgrade_InvalidFailScrollGear"] = "주문서 실패를 적용할 수 없는 상태의 장비입니다.";
369
+ ErrorMessage["Upgrade_InvalidResileScrollGear"] = "업그레이드 가능 횟수를 복구할 수 없는 상태의 장비입니다.";
370
+ ErrorMessage["Upgrade_InvalidResetScrollGear"] = "주문서 강화를 초기화할 수 없는 장비입니다.";
371
+ ErrorMessage["Upgrade_InvalidApplyScrollGear"] = "주문서를 적용할 수 없는 상태의 장비입니다.";
372
+ ErrorMessage["SpellTrace_InvalidSpellTrace"] = "주문의 흔적을 장비에 적용할 수 없습니다.";
373
+ ErrorMessage["SpellTrace_InvalidGearType"] = "주문의 흔적을 적용할 수 없는 장비 분류입니다.";
374
+ ErrorMessage["Starforce_InvalidStarforceGear"] = "스타포스 강화를 적용할 수 없는 상태의 장비입니다.";
375
+ ErrorMessage["Starforce_InvalidReqLevelGear"] = "장비의 착용 가능 레벨은 0 이상이어야 합니다.";
376
+ ErrorMessage["StarScroll_InvalidStarScrollGear"] = "놀라운 장비 강화 주문서를 적용할 수 없는 상태의 장비입니다.";
377
+ ErrorMessage["Starforce_InvalidResetGear"] = "스타포스 강화를 초기화할 수 없는 장비입니다.";
378
+ ErrorMessage["Starforce_InvalidRecalculateGear"] = "스타포스 강화 옵션을 다시 계산할 수 없는 장비입니다.";
379
+ ErrorMessage["Potential_InvalidPotentialGear"] = "잠재능력을 적용할 수 없는 상태의 장비입니다.";
380
+ ErrorMessage["Potential_InvalidPotentialOptions"] = "잠재옵션 개수는 1개에서 3개 사이여야 합니다.";
381
+ ErrorMessage["Potential_InvalidPotentialGrade"] = "잠재능력 등급을 Normal로 설정할 수 없습니다. (잠재능력을 초기화하려면 resetPotential을 사용하세요.)";
382
+ ErrorMessage["Potential_InvalidAdditionalPotentialGear"] = "에디셔널 잠재능력을 적용할 수 없는 상태의 장비입니다.";
383
+ ErrorMessage["Potential_InvalidAdditionalPotentialOptions"] = "에디셔널 잠재옵션 개수는 1개에서 3개 사이여야 합니다.";
384
+ ErrorMessage["Potential_InvalidAdditionalPotentialGrade"] = "에디셔널 잠재능력 등급을 Normal로 설정할 수 없습니다. (에디셔널 잠재능력을 초기화하려면 resetAdditionalPotential을 사용하세요.)";
385
+ ErrorMessage["Soul_SetSoulUnenchanted"] = "소울웨폰 상태의 장비에만 소울을 장착할 수 있습니다.";
386
+ ErrorMessage["Soul_SetChargeUnenchanted"] = "소울웨폰 상태의 장비만 소울 충전량을 변경할 수 있습니다.";
387
+ ErrorMessage["Soul_InvalidSoulCharge"] = "소울 충전량은 0 이상 1000 이하의 값으로만 변경할 수 있습니다.";
388
+ ErrorMessage["Soul_AlreadyEnchanted"] = "소울웨폰은 중복해서 적용할 수 없습니다.";
389
+ ErrorMessage["Exceptional_InvalidEnhanceGear"] = "익셉셔널 강화를 적용할 수 없는 상태의 장비입니다.";
390
+ ErrorMessage["Exceptional_InvalidResetGear"] = "익셉셔널 강화를 초기화할 수 없는 장비입니다.";
391
+ ErrorMessage["Constructor_InvalidVersion"] = "지원하지 않는 장비 정보 버전입니다. migrate 후 생성해야 합니다.";
392
+ ErrorMessage["Migrate_InvalidGearData"] = "입력 데이터가 유효하지 않습니다.";
393
+ ErrorMessage["Migrate_UnknownDataVersion"] = "입력 데이터의 버전이 잘못되었습니다.";
394
+ ErrorMessage["Migrate_DataVersionTooNew"] = "입력 데이터의 버전이 지원하는 버전보다 최신입니다.";
395
+ ErrorMessage["Migrate_DataPropertyWillBeOverwritten"] = "입력 데이터의 속성이 덮어쓰여집니다. 제거하고 다시 실행해 주세요.";
396
+ return ErrorMessage;
397
+ }({});
398
+ //#endregion
399
+ //#region src/lib/gearOption.ts
400
+ const PROXY_KEY = "__GearOption_s87Ns2aQ";
401
+ /**
402
+ * 장비 옵션의 설정되지 않은 속성(`undefined`)을 `0`으로 처리하는 프록시 객체를 생성합니다.
403
+ *
404
+ * 프록시 객체를 반복할 때 값이 `0`인 속성은 열거하지 않습니다.
405
+ * @param option 장비 옵션.
406
+ * @returns 장비 옵션 프록시.
407
+ */
408
+ function toGearOption(option) {
409
+ if (PROXY_KEY in option) return option;
410
+ return new Proxy(option, {
411
+ get(target, p) {
412
+ if (p === PROXY_KEY) return true;
413
+ if (p in defaultGearOption) return target[p] ?? defaultGearOption[p];
414
+ },
415
+ set(target, p, newValue) {
416
+ if (p in defaultGearOption) {
417
+ target[p] = newValue;
418
+ return true;
419
+ }
420
+ return false;
421
+ },
422
+ ownKeys(target) {
423
+ return Object.entries(target).filter(([, value]) => value != 0).map(([key]) => key);
424
+ }
425
+ });
426
+ }
427
+ function addOptions(option, ...options) {
428
+ const sum = option;
429
+ for (const option of options) for (const [stat, value] of Object.entries(option)) if (stat in sum) sum[stat] += value;
430
+ else sum[stat] = value;
431
+ }
432
+ function sumOptions(...options) {
433
+ const sum = {};
434
+ addOptions(sum, ...options);
435
+ return sum;
436
+ }
437
+ const defaultGearOption = {
438
+ str: 0,
439
+ dex: 0,
440
+ int: 0,
441
+ luk: 0,
442
+ strRate: 0,
443
+ dexRate: 0,
444
+ intRate: 0,
445
+ lukRate: 0,
446
+ maxHp: 0,
447
+ maxMp: 0,
448
+ maxHpRate: 0,
449
+ maxMpRate: 0,
450
+ maxDemonForce: 0,
451
+ attackPower: 0,
452
+ magicPower: 0,
453
+ attackPowerRate: 0,
454
+ magicPowerRate: 0,
455
+ armor: 0,
456
+ armorRate: 0,
457
+ speed: 0,
458
+ jump: 0,
459
+ bossDamage: 0,
460
+ normalDamage: 0,
461
+ ignoreMonsterArmor: 0,
462
+ allStat: 0,
463
+ damage: 0,
464
+ reqLevelDecrease: 0,
465
+ criticalRate: 0,
466
+ criticalDamage: 0,
467
+ cooltimeReduce: 0,
468
+ strLv: 0,
469
+ dexLv: 0,
470
+ intLv: 0,
471
+ lukLv: 0
472
+ };
473
+ //#endregion
474
+ //#region src/lib/gearType.ts
475
+ /**
476
+ * 장비 분류가 주무기인지 여부를 확인합니다. 블레이드(`katara`)는 포함되지 않습니다.
477
+ * @param type 장비 분류.
478
+ * @returns 주무기일 경우 `true`; 아닐 경우 `false`.
479
+ */
480
+ function isWeapon(type) {
481
+ return isLeftWeapon(type) || isDoubleHandWeapon(type);
482
+ }
483
+ /**
484
+ * 장비 분류가 한손무기인지 여부를 확인합니다. 블레이드(`katara`)는 포함되지 않습니다.
485
+ * @param type 장비 분류.
486
+ * @returns 한손무기일 경우 `true`; 아닐 경우 `false`.
487
+ */
488
+ function isLeftWeapon(type) {
489
+ return 121 <= type && type <= 139 && type !== GearType.katara || Math.floor(type / 10) === 121 || Math.floor(type / 10) === 125;
490
+ }
491
+ /**
492
+ * 장비 분류가 두손무기인지 여부를 확인합니다.
493
+ * @param type 장비 분류.
494
+ * @returns 두손무기일 경우 `true`; 아닐 경우 `false`.
495
+ */
496
+ function isDoubleHandWeapon(type) {
497
+ return type >= 140 && type <= 149 || type >= 152 && type <= 159 || type === GearType.chakram;
498
+ }
499
+ /**
500
+ * 장비 분류가 보조무기인지 여부를 확인합니다. 블레이드(`katara`), 방패류가 포함됩니다.
501
+ * @param type 장비 분류.
502
+ * @returns 보조무기일 경우 `true`; 아닐 경우 `false`.
503
+ */
504
+ function isSubWeapon(type) {
505
+ if (isShield(type)) return true;
506
+ switch (type) {
507
+ case GearType.katara:
508
+ case GearType.hourGlass: return true;
509
+ default:
510
+ if (Math.floor(type / 1e3) === 135) return true;
511
+ return false;
512
+ }
513
+ }
514
+ /**
515
+ * 장비 분류가 방패인지 여부를 확인합니다.
516
+ * @param type 장비 분류.
517
+ * @returns 방패일 경우 `true`; 아닐 경우 `false`.
518
+ */
519
+ function isShield(type) {
520
+ switch (type) {
521
+ case GearType.shield:
522
+ case GearType.demonShield:
523
+ case GearType.soulShield: return true;
524
+ default: return false;
525
+ }
526
+ }
527
+ /**
528
+ * 장비 분류가 방어구인지 여부를 확인합니다. 어깨장식이 포함되지 않고 방패가 포함됩니다.
529
+ * @param type 장비 분류.
530
+ * @returns 방어구일 경우 `true`; 아닐 경우 `false`.
531
+ */
532
+ function isArmor(type) {
533
+ return type === 100 || type >= 104 && type <= 110 || type === GearType.soulShield || type === GearType.demonShield;
534
+ }
535
+ /**
536
+ * 장비 분류가 장신구인지 여부를 확인합니다. 어깨장식이 포함됩니다.
537
+ * @param type 장비 분류.
538
+ * @returns 장신구일 경우 `true`; 아닐 경우 `false`.
539
+ */
540
+ function isAccessory(type) {
541
+ return type >= 101 && type <= 103 || type >= 111 && type <= 113 || type === 115;
542
+ }
543
+ /**
544
+ * 장비 분류가 메카닉 장비인지 여부를 확인합니다.
545
+ * @param type 장비 분류.
546
+ * @returns 메카닉 장비일 경우 `true`; 아닐 경우 `false`.
547
+ */
548
+ function isMechanicGear(type) {
549
+ return type >= 161 && type <= 165;
550
+ }
551
+ /**
552
+ * 장비 분류가 에반 드래곤 장비인지 여부를 확인합니다.
553
+ * @param type 장비 분류.
554
+ * @returns 에반 드래곤 장비일 경우 `true`; 아닐 경우 `false`.
555
+ */
556
+ function isDragonGear(type) {
557
+ return type >= 194 && type <= 197;
558
+ }
559
+ //#endregion
560
+ //#region src/lib/enhance/addOption.ts
561
+ const MAX_ADDOPTION = 4;
562
+ /**
563
+ * 장비가 추가 옵션을 지원하는지 확인합니다.
564
+ * @param gear 확인할 장비.
565
+ * @returns 적용할 수 있을 경우 `true`; 아닐 경우 `false`.
566
+ */
567
+ function supportsAddOption(gear) {
568
+ return gear.attributes.canAddOption === GearCapability.Can;
569
+ }
570
+ /**
571
+ * 장비에 추가 옵션을 적용할 수 있는 상태인지 여부를 확인합니다.
572
+ * @param gear 확인할 장비.
573
+ * @returns 적용할 수 있을 경우 `true`; 아닐 경우 `false`.
574
+ */
575
+ function canApplyAddOption(gear) {
576
+ if (!supportsAddOption(gear)) return false;
577
+ if (gear.addOptions.length === MAX_ADDOPTION) return false;
578
+ return true;
579
+ }
580
+ /**
581
+ * 장비에 추가 옵션을 적용합니다.
582
+ * @param gear 적용할 장비.
583
+ * @param type 추가 옵션 종류.
584
+ * @param grade 추가 옵션 단계.
585
+ *
586
+ * @throws {@link GearError}
587
+ * 추가 옵션을 적용할 수 없는 상태의 장비일 경우.
588
+ *
589
+ * @throws {@link GearError}
590
+ * 장비에 부여할 수 없는 추가 옵션을 지정했을 경우.
591
+ */
592
+ function applyAddOption(gear, type, grade) {
593
+ if (!canApplyAddOption(gear)) throw new GearError(ErrorMessage.AddOption_InvalidApplyGear, gear, {
594
+ "attributes.canAddOption": gear.attributes.canAddOption,
595
+ "addOptions.length": gear.addOptions.length
596
+ });
597
+ gear.data.addOption ??= {};
598
+ const option = getAddOption(gear, type, grade);
599
+ addOptions(gear.data.addOption, option);
600
+ gear.data.addOptions ??= [];
601
+ const value = getAddOptionValue(gear, type, grade);
602
+ gear.data.addOptions.push({
603
+ type,
604
+ grade,
605
+ value
606
+ });
607
+ }
608
+ /**
609
+ * 추가 옵션을 초기화할 수 있는지 여부를 확인합니다.
610
+ * @param gear 확인할 장비.
611
+ * @returns 초기화할 수 있을 경우 `true`; 아닐 경우 `false`.
612
+ */
613
+ function canResetAddOption(gear) {
614
+ if (!supportsAddOption(gear)) return false;
615
+ return true;
616
+ }
617
+ /**
618
+ * 장비의 추가 옵션을 초기화합니다.
619
+ * @param gear 초기화할 장비.
620
+ *
621
+ * @throws {@link GearError}
622
+ * 추가 옵션을 초기화할 수 없는 상태의 장비일 경우.
623
+ */
624
+ function resetAddOption(gear) {
625
+ if (!canResetAddOption(gear)) throw new GearError(ErrorMessage.AddOption_InvalidResetGear, gear, { "attributes.canAddOption": gear.attributes.canAddOption });
626
+ gear.data.addOption = void 0;
627
+ gear.data.addOptions = void 0;
628
+ }
629
+ /**
630
+ * 장비에 적용되는 추가 옵션을 계산합니다.
631
+ * @param gear 추가옵션을 계산할 장비.
632
+ * @param type 추가 옵션 종류.
633
+ * @param grade 추가 옵션 단계.
634
+ * @returns 추가 옵션 종류 및 단계에 해당하는 옵션.
635
+ *
636
+ * @throws {@link GearError}
637
+ * 장비에 부여할 수 없는 추가 옵션을 지정했을 경우.
638
+ */
639
+ function getAddOption(gear, type, grade) {
640
+ const keys = _getAddOptionKeys(type);
641
+ const value = getAddOptionValue(gear, type, grade);
642
+ const entries = keys.map((key) => [key, value]);
643
+ return Object.fromEntries(entries);
644
+ }
645
+ /**
646
+ * 장비에 적용되는 추가 옵션 종류에 따른 값을 계산합니다.
647
+ * @param gear 추가옵션을 계산할 장비.
648
+ * @param type 추가 옵션 종류.
649
+ * @param grade 추가 옵션 단계.
650
+ * @returns 추가 옵션 값.
651
+ *
652
+ * @throws {@link GearError}
653
+ * 장비에 부여할 수 없는 추가 옵션을 지정했을 경우.
654
+ */
655
+ function getAddOptionValue(gear, type, grade) {
656
+ const ctx = {
657
+ type,
658
+ reqLevel: gear.req.level + gear.req.levelIncrease,
659
+ gearType: gear.type,
660
+ bossReward: gear.attributes.bossReward,
661
+ attackPower: gear.baseOption.attackPower,
662
+ magicPower: gear.baseOption.magicPower
663
+ };
664
+ try {
665
+ switch (type) {
666
+ case AddOptionType.str:
667
+ case AddOptionType.dex:
668
+ case AddOptionType.int:
669
+ case AddOptionType.luk: return _getSingleStatValue(grade, ctx);
670
+ case AddOptionType.str_dex:
671
+ case AddOptionType.str_int:
672
+ case AddOptionType.str_luk:
673
+ case AddOptionType.dex_int:
674
+ case AddOptionType.dex_luk:
675
+ case AddOptionType.int_luk: return _getDoubleStatValue(grade, ctx);
676
+ case AddOptionType.armor: return _getSingleStatValue(grade, ctx);
677
+ case AddOptionType.attackPower:
678
+ case AddOptionType.magicPower: return _getPowerValue(grade, ctx);
679
+ case AddOptionType.maxHp:
680
+ case AddOptionType.maxMp: return _getHpMpValue(grade, ctx);
681
+ case AddOptionType.speed: return _getSpeedValue(grade, ctx);
682
+ case AddOptionType.jump: return _getJumpValue(grade, ctx);
683
+ case AddOptionType.damage: return _getDamageValue(grade, ctx);
684
+ case AddOptionType.bossDamage: return _getBossDamageValue(grade, ctx);
685
+ case AddOptionType.allStat: return _getAllStatValue(grade, ctx);
686
+ case AddOptionType.reqLevelDecrease: return _getReqLevelDecreaseValue(grade, ctx);
687
+ }
688
+ } catch (error) {
689
+ if (error instanceof _DeferredGearError) throw error.gear(gear);
690
+ throw error;
691
+ }
692
+ }
693
+ function _getSingleStatValue(grade, { reqLevel }) {
694
+ if (reqLevel >= 250) return Math.floor(reqLevel / 20) * grade;
695
+ return (Math.floor(reqLevel / 20) + 1) * grade;
696
+ }
697
+ function _getDoubleStatValue(grade, { reqLevel }) {
698
+ return (Math.floor(reqLevel / 40) + 1) * grade;
699
+ }
700
+ function _getPowerValue(grade, ctx) {
701
+ const { reqLevel, gearType } = ctx;
702
+ if (isWeapon(gearType)) return _getWeaponPowerValue(grade, ctx);
703
+ else if (reqLevel >= 60) return grade;
704
+ else throw new _DeferredGearError(ErrorMessage.AddOption_InvalidAttackPowerGear, {
705
+ "req.level": reqLevel,
706
+ "gear.type": gearType
707
+ });
708
+ }
709
+ function _getWeaponPowerValue(grade, ctx) {
710
+ const { reqLevel, type, gearType, bossReward, attackPower, magicPower } = ctx;
711
+ const data = bossReward ? [
712
+ 0,
713
+ 0,
714
+ 1,
715
+ 1.4666,
716
+ 2.0166,
717
+ 2.663,
718
+ 3.4166
719
+ ] : [
720
+ 1,
721
+ 2.222,
722
+ 3.63,
723
+ 5.325,
724
+ 7.32,
725
+ 8.777,
726
+ 10.25
727
+ ];
728
+ if (gearType === GearType.heavySword || gearType === GearType.longSword) {
729
+ const power = _getZeroWeaponAttackPower(gearType, ctx);
730
+ const value = reqLevel > 180 ? 6 : reqLevel > 160 ? 5 : reqLevel > 110 ? 4 : 3;
731
+ return Math.ceil(power * data[grade - 1] * value / 100);
732
+ } else {
733
+ const power = type === AddOptionType.magicPower && magicPower > attackPower ? magicPower : attackPower;
734
+ if (bossReward) {
735
+ const value = reqLevel > 160 ? 6 : reqLevel > 150 ? 5 : reqLevel > 110 ? 4 : 3;
736
+ return Math.ceil(power * data[grade - 1] * value * 3 / 100);
737
+ } else {
738
+ const value = reqLevel > 110 ? 4 : 3;
739
+ return Math.ceil(power * data[grade - 1] * value / 100);
740
+ }
741
+ }
742
+ }
743
+ function _getZeroWeaponAttackPower(gearType, { attackPower }) {
744
+ if (gearType === GearType.heavySword) return attackPower;
745
+ const mappedAttackPower = new Map([
746
+ [100, 102],
747
+ [103, 105],
748
+ [105, 107],
749
+ [112, 114],
750
+ [117, 121],
751
+ [135, 139],
752
+ [169, 173],
753
+ [203, 207],
754
+ [293, 297],
755
+ [337, 342]
756
+ ]).get(attackPower);
757
+ if (mappedAttackPower === void 0) throw new _DeferredGearError(ErrorMessage.AddOption_UnknownLongSwordGear, {
758
+ "gear.type": gearType,
759
+ "gear.baseOption.attackPower": attackPower
760
+ });
761
+ return mappedAttackPower;
762
+ }
763
+ function _getHpMpValue(grade, { reqLevel }) {
764
+ if (reqLevel < 10) return 3 * grade;
765
+ if (reqLevel >= 250) return 700 * grade;
766
+ return Math.floor(reqLevel / 10) * 30 * grade;
767
+ }
768
+ function _getSpeedValue(grade, { gearType }) {
769
+ if (isWeapon(gearType)) throw new _DeferredGearError(ErrorMessage.AddOption_InvalidSpeedGear, { "gear.type": gearType });
770
+ return grade;
771
+ }
772
+ function _getJumpValue(grade, { gearType }) {
773
+ if (isWeapon(gearType)) throw new _DeferredGearError(ErrorMessage.AddOption_InvalidJumpGear, { "gear.type": gearType });
774
+ return grade;
775
+ }
776
+ function _getDamageValue(grade, { gearType }) {
777
+ if (!isWeapon(gearType)) throw new _DeferredGearError(ErrorMessage.AddOption_InvalidDamageGear, { "gear.type": gearType });
778
+ return grade;
779
+ }
780
+ function _getBossDamageValue(grade, { reqLevel, gearType }) {
781
+ if (reqLevel < 90 || !isWeapon(gearType)) throw new _DeferredGearError(ErrorMessage.AddOption_InvalidBossDamageGear, {
782
+ "req.level": reqLevel,
783
+ "gear.type": gearType
784
+ });
785
+ return 2 * grade;
786
+ }
787
+ function _getAllStatValue(grade, { reqLevel, gearType }) {
788
+ if (reqLevel < 70 && !isWeapon(gearType)) throw new _DeferredGearError(ErrorMessage.AddOption_InvalidAllStatGear, {
789
+ "req.level": reqLevel,
790
+ "gear.type": gearType
791
+ });
792
+ return grade;
793
+ }
794
+ function _getReqLevelDecreaseValue(grade, { reqLevel }) {
795
+ if (reqLevel <= 0) throw new _DeferredGearError(ErrorMessage.AddOption_InvalidReqLevelDecreaseGear, { "req.level": reqLevel });
796
+ return Math.min(reqLevel, 5 * grade);
797
+ }
798
+ function _getAddOptionKeys(type) {
799
+ return type.split(",");
800
+ }
801
+ var _DeferredGearError = class extends Error {
802
+ status;
803
+ constructor(message, status) {
804
+ super(message);
805
+ this.status = status;
806
+ }
807
+ gear(gear) {
808
+ return new GearError(this.message, gear, this.status);
809
+ }
810
+ };
811
+ //#endregion
812
+ //#region src/lib/enhance/exceptional.ts
813
+ /**
814
+ * 장비가 익셉셔널 강화를 지원하는지 여부를 확인합니다.
815
+ * @param gear 확인할 장비.
816
+ * @returns 지원할 경우 `true`; 아닐 경우 `false`.
817
+ */
818
+ function supportsExceptional(gear) {
819
+ return gear.exceptionalTotalUpgradeableCount > 0;
820
+ }
821
+ /**
822
+ * 장비에 익셉셔널 강화를 적용할 수 있는 상태인지 여부를 확인합니다.
823
+ * @param gear 확인할 장비.
824
+ * @returns 적용할 수 있을 경우 `true`; 아닐 경우 `false`.
825
+ */
826
+ function canApplyExceptional(gear) {
827
+ return supportsExceptional(gear) && gear.exceptionalUpgradeableCount > 0;
828
+ }
829
+ /**
830
+ * 장비에 익셉셔널 강화를 적용합니다.
831
+ * @param gear 적용할 장비.
832
+ * @param exceptionalHammer 적용할 익셉셔널 해머.
833
+ *
834
+ * @throws {@link GearError}
835
+ * 익셉셔널 강화를 적용할 수 없는 상태의 장비일 경우.
836
+ */
837
+ function applyExceptional(gear, exceptionalHammer) {
838
+ if (!canApplyExceptional(gear)) throw new GearError(ErrorMessage.Exceptional_InvalidEnhanceGear, gear, {
839
+ exceptionalTotalUpgradeableCount: gear.exceptionalTotalUpgradeableCount,
840
+ exceptionalUpgradeableCount: gear.exceptionalUpgradeableCount
841
+ });
842
+ gear.data.exceptionalOption ??= {};
843
+ addOptions(gear.data.exceptionalOption, exceptionalHammer.option);
844
+ gear.data.exceptionalUpgradeableCount = gear.exceptionalUpgradeableCount - 1;
845
+ gear.data.exceptionalUpgradeCount = gear.exceptionalUpgradeCount + 1;
846
+ }
847
+ /**
848
+ * 장비의 익셉셔널 강화를 초기화할 수 있는지 여부를 확인합니다.
849
+ * @param gear 확인할 장비.
850
+ * @returns 초기화할 수 있을 경우 `true`; 아닐 경우 `false`.
851
+ */
852
+ function canResetExceptional(gear) {
853
+ return supportsExceptional(gear);
854
+ }
855
+ /**
856
+ * 장비의 익셉셔널 강화를 초기화합니다.
857
+ * @param gear 초기화할 장비.
858
+ *
859
+ * @throws {@link GearError}
860
+ * 익셉셔널 강화를 초기화할 수 없는 장비일 경우.
861
+ */
862
+ function resetExceptional(gear) {
863
+ if (!canResetExceptional(gear)) throw new GearError(ErrorMessage.Exceptional_InvalidResetGear, gear, { exceptionalTotalUpgradeableCount: gear.exceptionalTotalUpgradeableCount });
864
+ gear.data.exceptionalOption = {};
865
+ gear.data.exceptionalUpgradeableCount = gear.exceptionalTotalUpgradeableCount;
866
+ gear.data.exceptionalUpgradeCount = void 0;
867
+ }
868
+ //#endregion
869
+ //#region src/lib/enhance/potential.ts
870
+ /**
871
+ * 장비가 잠재능력을 지원하는지 여부를 확인합니다.
872
+ * @param gear 확인할 장비.
873
+ * @returns 지원할 경우 `true`; 아닐 경우 `false`.
874
+ */
875
+ function supportsPotential(gear) {
876
+ return gear.attributes.canPotential === GearCapability.Can;
877
+ }
878
+ /**
879
+ * 장비의 잠재능력을 설정할 수 있는지 여부를 확인합니다.
880
+ * @param gear 확인할 장비.
881
+ * @returns 설정할 수 있을 경우 `true`; 아닐 경우 `false`.
882
+ */
883
+ function canSetPotential(gear) {
884
+ return gear.attributes.canPotential === GearCapability.Can;
885
+ }
886
+ /**
887
+ * 장비의 잠재능력을 설정합니다.
888
+ * @param gear 설정할 장비.
889
+ * @param grade 잠재능력 등급.
890
+ * @param options 잠재옵션 목록.
891
+ *
892
+ * @throws {@link GearError}
893
+ * 잠재능력을 설정할 수 없는 장비일 경우.
894
+ *
895
+ * @throws {@link RangeError}
896
+ * 설정하려는 잠재능력 등급이 Normal일 경우.
897
+ *
898
+ * @throws {@link TypeError}
899
+ * 잘못된 잠재옵션 목록을 지정했을 경우.
900
+ */
901
+ function setPotential(gear, grade, options) {
902
+ if (!canSetPotential(gear)) throw new GearError(ErrorMessage.Potential_InvalidPotentialGear, gear, { "attributes.canPotential": gear.attributes.canPotential });
903
+ if (grade === PotentialGrade.Normal) throw new RangeError(ErrorMessage.Potential_InvalidPotentialGrade);
904
+ if (options.length < 1 || options.length > 3) throw new TypeError(ErrorMessage.Potential_InvalidPotentialOptions);
905
+ gear.data.potentialGrade = grade;
906
+ gear.data.potentials = options;
907
+ }
908
+ /**
909
+ * 장비의 잠재능력을 초기화합니다.
910
+ *
911
+ * 에디셔널 잠재능력은 변경되지 않습니다.
912
+ * @param gear 초기화할 장비.
913
+ *
914
+ * @throws {@link GearError}
915
+ * 잠재능력을 초기화할 수 없는 장비일 경우.
916
+ */
917
+ function resetPotential(gear) {
918
+ if (!canSetPotential(gear)) throw new GearError(ErrorMessage.Potential_InvalidPotentialGear, gear, { "attributes.canPotential": gear.attributes.canPotential });
919
+ gear.data.potentialGrade = PotentialGrade.Normal;
920
+ gear.data.potentials = void 0;
921
+ }
922
+ /**
923
+ * 장비가 에디셔널 잠재능력을 지원하는지 여부를 확인합니다.
924
+ * @param gear 확인할 장비.
925
+ * @returns 지원할 경우 `true`; 아닐 경우 `false`.
926
+ */
927
+ function supportsAdditionalPotential(gear) {
928
+ return gear.attributes.canAdditionalPotential === GearCapability.Can;
929
+ }
930
+ /**
931
+ * 장비의 에디셔널 잠재능력을 설정할 수 있는지 여부를 확인합니다.
932
+ * @param gear 확인할 장비.
933
+ * @returns 설정할 수 있을 경우 `true`; 아닐 경우 `false`.
934
+ */
935
+ function canSetAdditionalPotential(gear) {
936
+ return gear.attributes.canAdditionalPotential === GearCapability.Can;
937
+ }
938
+ /**
939
+ * 장비의 에디셔널 잠재능력을 설정합니다.
940
+ * @param gear 설정할 장비.
941
+ * @param grade 에디셔널 잠재능력 등급.
942
+ * @param options 에디셔널 잠재옵션 목록.
943
+ *
944
+ * @throws {@link GearError}
945
+ * 에디셔널 잠재능력을 설정할 수 없는 장비일 경우.
946
+ *
947
+ * @throws {@link RangeError}
948
+ * 설정하려는 에디셔널 잠재능력 등급이 Normal일 경우.
949
+ *
950
+ * @throws {@link GearError}
951
+ * 잘못된 에디셔널 잠재옵션 목록을 지정했을 경우.
952
+ */
953
+ function setAdditionalPotential(gear, grade, options) {
954
+ if (!canSetAdditionalPotential(gear)) throw new GearError(ErrorMessage.Potential_InvalidAdditionalPotentialGear, gear, { "attributes.canAdditionalPotential": gear.attributes.canAdditionalPotential });
955
+ if (grade === PotentialGrade.Normal) throw new RangeError(ErrorMessage.Potential_InvalidAdditionalPotentialGrade);
956
+ if (options.length < 1 || options.length > 3) throw new GearError(ErrorMessage.Potential_InvalidAdditionalPotentialOptions, gear, { "options.length": options.length });
957
+ gear.data.additionalPotentialGrade = grade;
958
+ gear.data.additionalPotentials = options;
959
+ }
960
+ /**
961
+ * 장비의 에디셔널 잠재능력을 초기화합니다.
962
+ * @param gear 초기화할 장비.
963
+ *
964
+ * @throws {@link GearError}
965
+ * 에디셔널 잠재능력을 초기화할 수 없는 장비일 경우.
966
+ */
967
+ function resetAdditionalPotential(gear) {
968
+ if (!canSetAdditionalPotential(gear)) throw new GearError(ErrorMessage.Potential_InvalidAdditionalPotentialGear, gear, { "attributes.canAdditionalPotential": gear.attributes.canAdditionalPotential });
969
+ gear.data.additionalPotentialGrade = PotentialGrade.Normal;
970
+ gear.data.additionalPotentials = void 0;
971
+ }
972
+ //#endregion
973
+ //#region src/lib/enhance/soulSlot.ts
974
+ /**
975
+ * 장비가 소울웨폰을 지원하는지 여부를 확인합니다.
976
+ * @param gear 확인할 장비.
977
+ * @returns 지원할 경우 `true`; 아닐 경우 `false`.
978
+ */
979
+ function supportsSoul(gear) {
980
+ return isWeapon(gear.type);
981
+ }
982
+ /**
983
+ * 장비에 소울 인챈터를 적용할 수 있는 상태인지 여부를 확인합니다.
984
+ * @param gear 확인할 장비.
985
+ * @returns 적용할 수 있을 경우 `true`; 아닐 경우 `false`.
986
+ */
987
+ function canApplySoulEnchant(gear) {
988
+ return supportsSoul(gear) && !gear.soulEnchanted;
989
+ }
990
+ /**
991
+ * 장비에 소울 인챈터를 적용합니다.
992
+ * @param gear 적용할 장비.
993
+ *
994
+ * @throws {@link GearError}
995
+ * 소울 인챈터를 적용할 수 없는 경우.
996
+ */
997
+ function applySoulEnchant(gear) {
998
+ if (!canApplySoulEnchant(gear)) throw new GearError(ErrorMessage.Soul_AlreadyEnchanted, gear, {
999
+ type: gear.type,
1000
+ soulEnchanted: gear.soulEnchanted
1001
+ });
1002
+ gear.data.soulSlot = {};
1003
+ }
1004
+ /**
1005
+ * 장비에 소울을 장착할 수 있는지 여부를 확인합니다.
1006
+ * @param gear 확인할 장비.
1007
+ * @returns 장착할 수 있을 경우 `true`; 아닐 경우 `false`.
1008
+ */
1009
+ function canSetSoul(gear) {
1010
+ return gear.soulEnchanted;
1011
+ }
1012
+ /**
1013
+ * 장비에 소울을 장착합니다.
1014
+ * @param gear 대상 장비.
1015
+ * @param soul 장착할 소울 아이템.
1016
+ *
1017
+ * @throws {@link GearError}
1018
+ * 소울을 장착할 수 없는 경우.
1019
+ */
1020
+ function setSoul(gear, soul) {
1021
+ if (!canSetSoul(gear)) throw new GearError(ErrorMessage.Soul_SetSoulUnenchanted, gear, {
1022
+ type: gear.type,
1023
+ soulEnchanted: gear.soulEnchanted
1024
+ });
1025
+ gear.data.soulSlot.soul = soul;
1026
+ _updateChargeOption(gear);
1027
+ }
1028
+ /**
1029
+ * 장비의 소울 충전량을 설정할 수 있는지 여부를 확인합니다.
1030
+ * @param gear 확인할 장비.
1031
+ * @returns 설정할 수 있을 경우 `true`; 아닐 경우 `false`.
1032
+ */
1033
+ function canSetSoulCharge(gear) {
1034
+ return gear.soulEnchanted;
1035
+ }
1036
+ /**
1037
+ * 장비의 소울 충전량을 설정합니다.
1038
+ * @param gear 대상 장비.
1039
+ * @param charge 소울 충전량.
1040
+ *
1041
+ * @throws {@link GearError}
1042
+ * 소울 충전량을 설정할 수 없는 경우.
1043
+ *
1044
+ * @throws {@link RangeError}
1045
+ * 소울 충전량이 0 미만 또는 1000 초과인 경우.
1046
+ */
1047
+ function setSoulCharge(gear, charge) {
1048
+ if (!canSetSoulCharge(gear)) throw new GearError(ErrorMessage.Soul_SetChargeUnenchanted, gear, {
1049
+ type: gear.type,
1050
+ soulEnchanted: gear.soulEnchanted
1051
+ });
1052
+ if (charge < 0 || charge > 1e3) throw new RangeError(ErrorMessage.Soul_InvalidSoulCharge);
1053
+ gear.data.soulSlot.charge = charge;
1054
+ _updateChargeOption(gear);
1055
+ }
1056
+ /**
1057
+ * 장비의 소울웨폰을 초기화합니다.
1058
+ * @param gear 초기화할 장비.
1059
+ */
1060
+ function resetSoulEnchant(gear) {
1061
+ gear.data.soulSlot = void 0;
1062
+ }
1063
+ function _updateChargeOption(gear) {
1064
+ let option;
1065
+ if (gear.soulCharge === 0) option = {};
1066
+ else {
1067
+ const type = gear.baseOption.attackPower >= gear.baseOption.magicPower ? "attackPower" : "magicPower";
1068
+ const base = Math.min(5, Math.ceil(gear.soulCharge / 100) - 1);
1069
+ if (gear.soul) option = { [type]: 10 + base * (gear.soul.chargeFactor ?? 1) };
1070
+ else option = { [type]: 5 + base };
1071
+ }
1072
+ gear.data.soulSlot.chargeOption = option;
1073
+ }
1074
+ //#endregion
1075
+ //#region src/lib/enhance/upgrade.ts
1076
+ /**
1077
+ * 장비가 주문서 강화를 지원하는지 여부를 확인합니다.
1078
+ * @param gear 확인할 장비.
1079
+ * @returns 지원할 경우 `true`; 아닐 경우 `false`.
1080
+ */
1081
+ function supportsUpgrade(gear) {
1082
+ return gear.attributes.canScroll === GearCapability.Can;
1083
+ }
1084
+ /**
1085
+ * 장비에 주문서 실패를 적용할 수 있는 상태인지 여부를 확인합니다.
1086
+ * @param gear 확인할 장비.
1087
+ * @returns 적용할 수 있을 경우 `true`; 아닐 경우 `false`.
1088
+ */
1089
+ function canFailScroll(gear) {
1090
+ return supportsUpgrade(gear) && gear.scrollUpgradeableCount > 0;
1091
+ }
1092
+ /**
1093
+ * 장비에 주문서 실패를 적용합니다.
1094
+ * @param gear 적용할 장비.
1095
+ *
1096
+ * @throws {@link GearError}
1097
+ * 주문서 실패를 적용할 수 없는 상태의 장비일 경우.
1098
+ */
1099
+ function failScroll(gear) {
1100
+ if (!canFailScroll(gear)) throw new GearError(ErrorMessage.Upgrade_InvalidFailScrollGear, gear, {
1101
+ "attributes.canScroll": gear.attributes.canScroll,
1102
+ scrollUpgradeableCount: gear.scrollUpgradeableCount
1103
+ });
1104
+ gear.data.scrollUpgradeableCount = gear.scrollUpgradeableCount - 1;
1105
+ gear.data.scrollResilienceCount = gear.scrollResilienceCount + 1;
1106
+ }
1107
+ /**
1108
+ * 장비가 주문서 실패로 차감된 업그레이드 가능 횟수를 복구할 수 있는 상태인지 여부를 확인합니다.
1109
+ * @param gear 확인할 장비.
1110
+ * @returns 복구할 수 있을 경우 `true`; 아닐 경우 `false`.
1111
+ */
1112
+ function canResileScroll(gear) {
1113
+ return supportsUpgrade(gear) && gear.scrollResilienceCount > 0;
1114
+ }
1115
+ /**
1116
+ * 장비의 주문서 실패로 차감된 업그레이드 가능 횟수를 1회 복구합니다.
1117
+ * @param gear 복구할 장비.
1118
+ *
1119
+ * @throws {@link GearError}
1120
+ * 업그레이드 가능 횟수를 복구할 수 없는 상태의 장비일 경우.
1121
+ */
1122
+ function resileScroll(gear) {
1123
+ if (!canResileScroll(gear)) throw new GearError(ErrorMessage.Upgrade_InvalidResileScrollGear, gear, {
1124
+ "attributes.canScroll": gear.attributes.canScroll,
1125
+ scrollResilienceCount: gear.scrollResilienceCount
1126
+ });
1127
+ gear.data.scrollResilienceCount = gear.scrollResilienceCount - 1;
1128
+ gear.data.scrollUpgradeableCount = gear.scrollUpgradeableCount + 1;
1129
+ }
1130
+ /**
1131
+ * 장비의 주문서 강화를 초기화할 수 있는지 여부를 확인합니다.
1132
+ * @param gear 확인할 장비.
1133
+ * @returns 초기화할 수 있을 경우 `true`; 아닐 경우 `false`.
1134
+ */
1135
+ function canResetUpgrade(gear) {
1136
+ return supportsUpgrade(gear);
1137
+ }
1138
+ /**
1139
+ * 장비의 주문서 강화를 초기화합니다.
1140
+ * @param gear 초기화할 장비.
1141
+ *
1142
+ * @throws {@link GearError}
1143
+ * 주문서 강화를 초기화할 수 없는 장비일 경우.
1144
+ */
1145
+ function resetUpgrade(gear) {
1146
+ if (!canResetUpgrade(gear)) throw new GearError(ErrorMessage.Upgrade_InvalidResetScrollGear, gear, { "attributes.canScroll": gear.attributes.canScroll });
1147
+ gear.data.upgradeOption = {};
1148
+ gear.data.scrollUpgradeableCount = gear.scrollTotalUpgradeableCount;
1149
+ gear.data.scrollUpgradeCount = void 0;
1150
+ gear.data.scrollResilienceCount = void 0;
1151
+ }
1152
+ /**
1153
+ * 장비에 주문서를 적용할 수 있는 상태인지 여부를 확인합니다.
1154
+ * @param gear 확인할 장비.
1155
+ * @returns 적용할 수 있을 경우 `true`; 아닐 경우 `false`.
1156
+ */
1157
+ function canApplyScroll(gear) {
1158
+ return supportsUpgrade(gear) && gear.scrollUpgradeableCount > 0;
1159
+ }
1160
+ /**
1161
+ * 장비에 주문서를 적용합니다.
1162
+ * @param gear 적용할 장비.
1163
+ * @param scroll 적용할 주문서.
1164
+ *
1165
+ * @throws {@link GearError}
1166
+ * 주문서를 적용할 수 없는 상태의 장비일 경우.
1167
+ */
1168
+ function applyScroll(gear, scroll) {
1169
+ if (!canApplyScroll(gear)) throw new GearError(ErrorMessage.Upgrade_InvalidApplyScrollGear, gear, {
1170
+ "attributes.canScroll": gear.attributes.canScroll,
1171
+ scrollUpgradeableCount: gear.scrollUpgradeableCount
1172
+ });
1173
+ gear.data.upgradeOption ??= {};
1174
+ addOptions(gear.data.upgradeOption, scroll.option);
1175
+ gear.data.scrollUpgradeableCount = gear.scrollUpgradeableCount - 1;
1176
+ gear.data.scrollUpgradeCount = gear.scrollUpgradeCount + 1;
1177
+ }
1178
+ //#endregion
1179
+ //#region src/lib/enhance/spellTrace.ts
1180
+ /**
1181
+ * 주문의 흔적 종류
1182
+ */
1183
+ let SpellTraceType = /* @__PURE__ */ function(SpellTraceType) {
1184
+ /** STR */
1185
+ SpellTraceType["str"] = "str";
1186
+ /** DEX */
1187
+ SpellTraceType["dex"] = "dex";
1188
+ /** INT */
1189
+ SpellTraceType["int"] = "int";
1190
+ /** LUK */
1191
+ SpellTraceType["luk"] = "luk";
1192
+ /** 최대 HP */
1193
+ SpellTraceType["maxHp"] = "maxHp";
1194
+ /** 올스탯 */
1195
+ SpellTraceType["allStat"] = "allStat";
1196
+ return SpellTraceType;
1197
+ }({});
1198
+ /**
1199
+ * 장비에 주문의 흔적 강화를 적용합니다.
1200
+ * @param gear 적용할 장비.
1201
+ * @param type 주문의 흔적 종류.
1202
+ * @param rate 주문의 흔적 성공 확률.
1203
+ *
1204
+ * @throws {@link GearError}
1205
+ * 주문서를 적용할 수 없는 상태의 장비일 경우.
1206
+ *
1207
+ * @throws {@link GearError}
1208
+ * 장비에 적용할 수 없는 주문의 흔적을 지정했을 경우.
1209
+ */
1210
+ function applySpellTrace(gear, type, rate) {
1211
+ applyScroll(gear, getSpellTraceScroll(gear, type, rate));
1212
+ }
1213
+ /**
1214
+ * 주문의 흔적 주문서를 생성합니다.
1215
+ * @param gear 대상 장비.
1216
+ * @param type 주문의 흔적 종류.
1217
+ * @param rate 주문의 흔적 성공 확률.
1218
+ * @returns 주문의 흔적 주문서.
1219
+ *
1220
+ * @throws {@link GearError}
1221
+ * 주문의 흔적을 장비에 적용할 수 없는 경우.
1222
+ */
1223
+ function getSpellTraceScroll(gear, type, rate) {
1224
+ if (isWeapon(gear.type) || gear.type === GearType.katara) return _getWeaponSpellTrace(gear, type, rate);
1225
+ if (gear.type === GearType.glove) return _getGloveSpellTrace(gear, type, rate);
1226
+ if (isArmor(gear.type) || gear.type === GearType.shoulder) return _getArmorSpellTrace(gear, type, rate);
1227
+ if (isAccessory(gear.type)) return _getAccSpellTrace(gear, type, rate);
1228
+ if (gear.type === GearType.machineHeart) return _getHeartSpellTrace(gear, type, rate);
1229
+ throw new GearError(ErrorMessage.SpellTrace_InvalidGearType, gear, { type: gear.type });
1230
+ }
1231
+ function _getWeaponSpellTrace(gear, type, rate) {
1232
+ if (type === SpellTraceType.allStat) throw new GearError(ErrorMessage.SpellTrace_InvalidSpellTrace, gear, {
1233
+ type: gear.type,
1234
+ input_type: type,
1235
+ input_rate: rate
1236
+ });
1237
+ const tier = _getTier(gear);
1238
+ let [power, stat] = weaponPowerStat[rate][tier];
1239
+ if (type === SpellTraceType.maxHp) stat *= 50;
1240
+ const powerType = _getPowerType(type);
1241
+ let name, option;
1242
+ if (stat === 0) {
1243
+ name = _createScrollName(rate, _getTypeName(powerType));
1244
+ option = { [powerType]: power };
1245
+ } else {
1246
+ name = _createScrollName(rate, _getTypeName(powerType), _getTypeName(type));
1247
+ option = {
1248
+ [powerType]: power,
1249
+ [type]: stat
1250
+ };
1251
+ }
1252
+ return {
1253
+ name,
1254
+ option,
1255
+ type,
1256
+ rate
1257
+ };
1258
+ }
1259
+ function _getGloveSpellTrace(gear, type, rate) {
1260
+ const tier = _getTier(gear);
1261
+ const power = glovePower[rate][tier];
1262
+ let name, option;
1263
+ if (power === 0) {
1264
+ name = _createScrollName(rate, "방어력");
1265
+ option = { armor: 3 };
1266
+ } else {
1267
+ const powerType = _getPowerType(type);
1268
+ name = _createScrollName(rate, _getTypeName(powerType));
1269
+ option = { [powerType]: power };
1270
+ }
1271
+ return {
1272
+ name,
1273
+ option,
1274
+ rate,
1275
+ type
1276
+ };
1277
+ }
1278
+ function _getArmorSpellTrace(gear, type, rate) {
1279
+ const tier = _getTier(gear);
1280
+ const [stat, maxHp, armor] = armorStatMaxHpArmor[rate][tier];
1281
+ const option = {
1282
+ maxHp,
1283
+ armor
1284
+ };
1285
+ switch (type) {
1286
+ case SpellTraceType.str:
1287
+ case SpellTraceType.dex:
1288
+ case SpellTraceType.int:
1289
+ case SpellTraceType.luk:
1290
+ option[type] = stat;
1291
+ break;
1292
+ case SpellTraceType.maxHp:
1293
+ option.maxHp += stat * 50;
1294
+ break;
1295
+ case SpellTraceType.allStat: {
1296
+ if (!(rate in armorAllStat)) throw new GearError(ErrorMessage.SpellTrace_InvalidSpellTrace, gear, {
1297
+ type: gear.type,
1298
+ input_type: type,
1299
+ input_rate: rate
1300
+ });
1301
+ const allStat = armorAllStat[rate][tier];
1302
+ option.str = allStat;
1303
+ option.dex = allStat;
1304
+ option.int = allStat;
1305
+ option.luk = allStat;
1306
+ break;
1307
+ }
1308
+ }
1309
+ if (gear.scrollUpgradeCount === 3) if (gear.req.beginner()) {
1310
+ option.attackPower = 1;
1311
+ option.magicPower = 1;
1312
+ } else if (gear.req.magician()) option.magicPower = 1;
1313
+ else option.attackPower = 1;
1314
+ return {
1315
+ name: _createScrollName(rate, _getTypeName(type)),
1316
+ option,
1317
+ type,
1318
+ rate
1319
+ };
1320
+ }
1321
+ function _getAccSpellTrace(gear, type, rate) {
1322
+ if (!(rate in accStat)) throw new GearError(ErrorMessage.SpellTrace_InvalidSpellTrace, gear, {
1323
+ type: gear.type,
1324
+ input_type: type,
1325
+ input_rate: rate
1326
+ });
1327
+ const tier = _getTier(gear);
1328
+ const stat = accStat[rate][tier];
1329
+ const option = {};
1330
+ switch (type) {
1331
+ case SpellTraceType.str:
1332
+ case SpellTraceType.dex:
1333
+ case SpellTraceType.int:
1334
+ case SpellTraceType.luk:
1335
+ option[type] = stat;
1336
+ break;
1337
+ case SpellTraceType.maxHp:
1338
+ option.maxHp = stat * 50;
1339
+ break;
1340
+ case SpellTraceType.allStat: {
1341
+ if (!(rate in accAllStat)) throw new GearError(ErrorMessage.SpellTrace_InvalidSpellTrace, gear, {
1342
+ type: gear.type,
1343
+ input_type: type,
1344
+ input_rate: rate
1345
+ });
1346
+ const allStat = accAllStat[rate][tier];
1347
+ option.str = allStat;
1348
+ option.dex = allStat;
1349
+ option.int = allStat;
1350
+ option.luk = allStat;
1351
+ break;
1352
+ }
1353
+ }
1354
+ return {
1355
+ name: _createScrollName(rate, _getTypeName(type)),
1356
+ option,
1357
+ type,
1358
+ rate
1359
+ };
1360
+ }
1361
+ function _getHeartSpellTrace(gear, type, rate) {
1362
+ if (!(rate in accStat)) throw new GearError(ErrorMessage.SpellTrace_InvalidSpellTrace, gear, {
1363
+ type: gear.type,
1364
+ input_type: type,
1365
+ input_rate: rate
1366
+ });
1367
+ const tier = _getTier(gear);
1368
+ const power = heartPower[rate][tier];
1369
+ const powerType = _getPowerType(type);
1370
+ return {
1371
+ name: _createScrollName(rate, _getTypeName(powerType)),
1372
+ option: { [powerType]: power },
1373
+ type,
1374
+ rate
1375
+ };
1376
+ }
1377
+ function _createScrollName(rate, typeName, subTypeName) {
1378
+ if (subTypeName) return `${rate.toString()}% ${typeName}(${subTypeName}) 주문서`;
1379
+ else return `${rate.toString()}% ${typeName} 주문서`;
1380
+ }
1381
+ function _getTypeName(type) {
1382
+ switch (type) {
1383
+ case "str": return "힘";
1384
+ case "dex": return "민첩";
1385
+ case "int": return "지력";
1386
+ case "luk": return "운";
1387
+ case "maxHp": return "체력";
1388
+ case "allStat": return "올스탯";
1389
+ case "attackPower": return "공격력";
1390
+ case "magicPower": return "마력";
1391
+ }
1392
+ }
1393
+ function _getTier(gear) {
1394
+ const reqLevel = gear.req.level + gear.req.levelIncrease;
1395
+ return reqLevel > 110 ? 2 : reqLevel > 70 ? 1 : 0;
1396
+ }
1397
+ function _getPowerType(type) {
1398
+ return type === SpellTraceType.int ? "magicPower" : "attackPower";
1399
+ }
1400
+ const weaponPowerStat = {
1401
+ 100: [
1402
+ [1, 0],
1403
+ [2, 0],
1404
+ [3, 1]
1405
+ ],
1406
+ 70: [
1407
+ [2, 0],
1408
+ [3, 1],
1409
+ [5, 2]
1410
+ ],
1411
+ 30: [
1412
+ [3, 1],
1413
+ [5, 2],
1414
+ [7, 3]
1415
+ ],
1416
+ 15: [
1417
+ [5, 2],
1418
+ [7, 3],
1419
+ [9, 4]
1420
+ ]
1421
+ };
1422
+ const armorStatMaxHpArmor = {
1423
+ 100: [
1424
+ [
1425
+ 1,
1426
+ 5,
1427
+ 1
1428
+ ],
1429
+ [
1430
+ 2,
1431
+ 20,
1432
+ 2
1433
+ ],
1434
+ [
1435
+ 3,
1436
+ 30,
1437
+ 3
1438
+ ]
1439
+ ],
1440
+ 70: [
1441
+ [
1442
+ 2,
1443
+ 15,
1444
+ 2
1445
+ ],
1446
+ [
1447
+ 3,
1448
+ 40,
1449
+ 4
1450
+ ],
1451
+ [
1452
+ 4,
1453
+ 70,
1454
+ 5
1455
+ ]
1456
+ ],
1457
+ 30: [
1458
+ [
1459
+ 3,
1460
+ 30,
1461
+ 4
1462
+ ],
1463
+ [
1464
+ 5,
1465
+ 70,
1466
+ 7
1467
+ ],
1468
+ [
1469
+ 7,
1470
+ 120,
1471
+ 10
1472
+ ]
1473
+ ],
1474
+ 15: [
1475
+ [
1476
+ 4,
1477
+ 45,
1478
+ 6
1479
+ ],
1480
+ [
1481
+ 7,
1482
+ 110,
1483
+ 10
1484
+ ],
1485
+ [
1486
+ 10,
1487
+ 170,
1488
+ 15
1489
+ ]
1490
+ ]
1491
+ };
1492
+ const armorAllStat = {
1493
+ 30: [
1494
+ 1,
1495
+ 2,
1496
+ 3
1497
+ ],
1498
+ 15: [
1499
+ 2,
1500
+ 3,
1501
+ 4
1502
+ ]
1503
+ };
1504
+ const glovePower = {
1505
+ 100: [
1506
+ 0,
1507
+ 1,
1508
+ 1
1509
+ ],
1510
+ 70: [
1511
+ 1,
1512
+ 2,
1513
+ 2
1514
+ ],
1515
+ 30: [
1516
+ 2,
1517
+ 3,
1518
+ 3
1519
+ ],
1520
+ 15: [
1521
+ 3,
1522
+ 4,
1523
+ 4
1524
+ ]
1525
+ };
1526
+ const accStat = {
1527
+ 100: [
1528
+ 1,
1529
+ 1,
1530
+ 2
1531
+ ],
1532
+ 70: [
1533
+ 2,
1534
+ 2,
1535
+ 3
1536
+ ],
1537
+ 30: [
1538
+ 3,
1539
+ 4,
1540
+ 5
1541
+ ]
1542
+ };
1543
+ const accAllStat = { 30: [
1544
+ 1,
1545
+ 2,
1546
+ 3
1547
+ ] };
1548
+ const heartPower = {
1549
+ 100: [
1550
+ 1,
1551
+ 2,
1552
+ 3
1553
+ ],
1554
+ 70: [
1555
+ 2,
1556
+ 3,
1557
+ 5
1558
+ ],
1559
+ 30: [
1560
+ 3,
1561
+ 5,
1562
+ 7
1563
+ ]
1564
+ };
1565
+ /**
1566
+ * 장비가 스타포스 강화를 지원하는지 여부를 확인합니다.
1567
+ * @param gear 확인할 장비.
1568
+ * @returns 지원할 경우 `true`; 아닐 경우 `false`.
1569
+ */
1570
+ function supportsStarforce(gear) {
1571
+ return gear.attributes.canStarforce === GearCapability.Can;
1572
+ }
1573
+ /**
1574
+ * 장비에 스타포스 강화를 적용할 수 있는 상태인지 여부를 확인합니다.
1575
+ *
1576
+ * 업그레이드가 완료되지 않은 장비, 놀라운 장비강화 주문서가 적용된 장비에도 적용할 수 있습니다.
1577
+ * @param gear 확인할 장비.
1578
+ * @param exceedMaxStar 장비의 최대 강화 단계를 초과하여 강화할 지 여부.
1579
+ * @returns 적용할 수 있을 경우 `true`; 아닐 경우 `false`.
1580
+ */
1581
+ function canStarforce(gear, exceedMaxStar = false) {
1582
+ if (!supportsStarforce(gear)) return false;
1583
+ if (gear.attributes.superior) return gear.star < Math.min(15, gear.maxStar);
1584
+ if (exceedMaxStar) {
1585
+ if (gear.star >= _getBaseMaxStarWithToadsHammer(gear)) return false;
1586
+ } else if (gear.star >= gear.maxStar) return false;
1587
+ const limit = gear.starScroll ? 15 : 30;
1588
+ return gear.star < limit;
1589
+ }
1590
+ /**
1591
+ * 장비에 스타포스 강화를 1회 적용합니다.
1592
+ *
1593
+ * 업그레이드가 완료되지 않은 장비, 놀라운 장비강화 주문서가 적용된 장비에도 적용할 수 있습니다.
1594
+ * @param gear 적용할 장비.
1595
+ * @param exceedMaxStar 장비의 최대 강화 단계를 초과하여 강화할 지 여부.
1596
+ *
1597
+ * @throws {@link GearError}
1598
+ * 스타포스 강화를 적용할 수 없는 경우.
1599
+ */
1600
+ function starforce(gear, exceedMaxStar = false) {
1601
+ if (!canStarforce(gear, exceedMaxStar)) throw new GearError(ErrorMessage.Starforce_InvalidStarforceGear, gear, {
1602
+ "attributes.canStarforce": gear.attributes.canStarforce,
1603
+ "attributes.superior": gear.attributes.superior,
1604
+ "req.level": gear.req.level,
1605
+ "req.levelIncrease": gear.req.levelIncrease,
1606
+ star: gear.star,
1607
+ maxStar: gear.maxStar,
1608
+ starScroll: gear.starScroll,
1609
+ input_exceedMaxStar: exceedMaxStar
1610
+ });
1611
+ gear.data.star = gear.star + 1;
1612
+ if (gear.attributes.superior) _superiorStarforce(gear);
1613
+ else if (isWeapon(gear.type) || gear.type === GearType.katara) _weaponStarforce(gear);
1614
+ else _otherStarforce(gear);
1615
+ }
1616
+ /**
1617
+ * 장비에 놀라운 장비 강화 주문서를 적용할 수 있는 상태인지 여부를 확인합니다.
1618
+ *
1619
+ * 착용 가능 레벨 150 이하의 장비에만 적용할 수 있습니다.
1620
+ * 업그레이드가 완료되지 않은 장비, 놀라운 장비강화 주문서가 적용된 장비에도 적용할 수 있습니다.
1621
+ * 슈페리얼 장비에는 적용할 수 없습니다.
1622
+ * @param gear 확인할 장비.
1623
+ * @param exceedMaxStar 장비의 최대 강화 단계를 초과하여 강화할 지 여부.
1624
+ * @returns 적용할 수 있을 경우 `true`; 아닐 경우 `false`.
1625
+ */
1626
+ function canStarScroll(gear, exceedMaxStar = false) {
1627
+ if (!supportsStarforce(gear)) return false;
1628
+ if (gear.attributes.superior) return false;
1629
+ if (gear.req.level > 150) return false;
1630
+ if (!exceedMaxStar && gear.star >= gear.maxStar) return false;
1631
+ return gear.star < 15;
1632
+ }
1633
+ /**
1634
+ * 장비에 놀라운 장비 강화 주문서를 1회 적용합니다.
1635
+ *
1636
+ * 착용 가능 레벨 150 이하의 장비에만 적용할 수 있습니다.
1637
+ * 업그레이드가 완료되지 않은 장비, 스타포스 강화가 적용된 장비에도 적용할 수 있습니다.
1638
+ * 슈페리얼 장비에는 적용할 수 없습니다.
1639
+ *
1640
+ * 보너스 스탯은 장비 분류에 따라 결정됩니다.
1641
+ * - 방어구(방패 제외): 최대 HP +50
1642
+ * - 장신구: 올스탯 +1 ~ +2
1643
+ * - 무기/블레이드/방패: 공격력/마력 +1
1644
+ * @param gear 적용할 장비.
1645
+ * @param bonus 보너스 스탯 적용 여부.
1646
+ * @param exceedMaxStar 장비의 최대 강화 단계를 초과하여 강화할 지 여부.
1647
+ *
1648
+ * @throws {@link GearError}
1649
+ * 놀라운 장비 강화 주문서를 적용할 수 없는 경우.
1650
+ */
1651
+ function starScroll(gear, bonus = false, exceedMaxStar = false) {
1652
+ if (!canStarScroll(gear, exceedMaxStar)) throw new GearError(ErrorMessage.StarScroll_InvalidStarScrollGear, gear, {
1653
+ "attributes.canStarforce": gear.attributes.canStarforce,
1654
+ "attributes.superior": gear.attributes.superior,
1655
+ "req.level": gear.req.level,
1656
+ "req.levelIncrease": gear.req.levelIncrease,
1657
+ star: gear.star,
1658
+ maxStar: gear.maxStar,
1659
+ starScroll: gear.starScroll,
1660
+ input_exceedMaxStar: exceedMaxStar
1661
+ });
1662
+ gear.data.starScroll = true;
1663
+ gear.data.star = gear.star + 1;
1664
+ const stat = _getValue(starScrollStat, gear);
1665
+ const power = _getValue(starScrollPower, gear);
1666
+ const isWeaponStarScroll = isWeapon(gear.type) || gear.type === GearType.katara;
1667
+ for (const type of statTypes) if (_getStarScrollBaseValue(gear, type) > 0) {
1668
+ _getStarforceOption(gear)[type] += stat;
1669
+ if (bonus && isAccessory(gear.type)) _getStarforceOption(gear)[type] += gear.star > 5 ? 2 : 1;
1670
+ }
1671
+ for (const type of powerTypes) {
1672
+ const powerValue = _getStarScrollBaseValue(gear, type);
1673
+ if (powerValue > 0) {
1674
+ if (isWeaponStarScroll) _getStarforceOption(gear)[type] += Math.floor(powerValue / 50) + 1;
1675
+ _getStarforceOption(gear)[type] += power;
1676
+ if (bonus && (isWeaponStarScroll || gear.type === GearType.shield)) _getStarforceOption(gear)[type] += 1;
1677
+ }
1678
+ }
1679
+ if (bonus && isArmor(gear.type)) _getStarforceOption(gear).maxHp += 50;
1680
+ const armor = _getStarScrollBaseValue(gear, "armor");
1681
+ if (armor > 0) _getStarforceOption(gear).armor += Math.floor(armor / 20) + 1;
1682
+ }
1683
+ /**
1684
+ * 장비의 스타포스 강화를 초기화할 수 있는지 여부를 확인합니다.
1685
+ * @param gear 확인할 장비.
1686
+ * @returns 초기화할 수 있을 경우 `true`; 아닐 경우 `false`.
1687
+ */
1688
+ function canResetStarforce(gear) {
1689
+ if (!supportsStarforce(gear)) return false;
1690
+ return true;
1691
+ }
1692
+ /**
1693
+ * 장비의 스타포스 강화를 초기화합니다.
1694
+ * @param gear 초기화할 장비.
1695
+ *
1696
+ * @throws {@link GearError}
1697
+ * 스타포스 강화를 초기화할 수 없는 장비일 경우.
1698
+ */
1699
+ function resetStarforce(gear) {
1700
+ if (!canResetStarforce(gear)) throw new GearError(ErrorMessage.Starforce_InvalidResetGear, gear, { "attributes.canStarforce": gear.attributes.canStarforce });
1701
+ gear.data.starforceOption = {};
1702
+ gear.data.star = void 0;
1703
+ gear.data.starScroll = void 0;
1704
+ }
1705
+ /**
1706
+ * 장비의 최대 스타포스 강화를 계산합니다.
1707
+ *
1708
+ * 놀라운 장비 강화 주문서가 사용되었을 경우 최대 `15`입니다.
1709
+ * @param gear 계산할 장비.
1710
+ * @returns 장비의 최대 스타포스 강화.
1711
+ */
1712
+ function getMaxStar(gear) {
1713
+ if (gear.attributes.canStarforce === GearCapability.Cannot) return 0;
1714
+ const baseMaxStar = gear.attributes.fixedMaxStar ?? _getBaseMaxStar(gear);
1715
+ if (gear.starScroll) return Math.min(15, baseMaxStar);
1716
+ return baseMaxStar;
1717
+ }
1718
+ /**
1719
+ * exceedMaxStar가 true일 경우의 최대 스타포스 강화를 계산합니다.
1720
+ * 장비 강화 주문서 및 언리미티드 아이템을 토드하는 경우를 고려합니다.
1721
+ *
1722
+ * 놀라운 장비 강화 주문서가 사용되었을 경우 최대 `15`입니다.
1723
+ * @param gear 계산할 장비.
1724
+ * @returns exceedMaxStar가 true일 경우의 최대 스타포스 강화.
1725
+ */
1726
+ function getHardMaxStar(gear) {
1727
+ if (gear.attributes.canStarforce === GearCapability.Cannot) return 0;
1728
+ const baseMaxStar = gear.attributes.fixedMaxStar ?? _getBaseMaxStarWithToadsHammer(gear);
1729
+ if (gear.starScroll) return Math.min(15, baseMaxStar);
1730
+ return baseMaxStar;
1731
+ }
1732
+ /**
1733
+ * 장비의 스타포스 강화 옵션를 다시 계산할 수 있는 상태인지 여부를 확인합니다.
1734
+ * @param gear 확인할 장비.
1735
+ * @returns 다시 계산할 수 있을 경우 `true`; 아닐 경우 `false`.
1736
+ */
1737
+ function canRecalculateStarforce(gear) {
1738
+ if (gear.attributes.canStarforce === GearCapability.Cannot) return false;
1739
+ if (gear.starScroll) return false;
1740
+ return true;
1741
+ }
1742
+ /**
1743
+ * 장비의 스타포스 강화 옵션을 다시 계산합니다.
1744
+ * @param gear 계산할 장비.
1745
+ *
1746
+ * @throws {@link GearError}
1747
+ * 스타포스 강화 옵션을 다시 계산할 수 없는 경우.
1748
+ */
1749
+ function recalculateStarforce(gear) {
1750
+ if (!canRecalculateStarforce(gear)) throw new GearError(ErrorMessage.Starforce_InvalidRecalculateGear, gear, {
1751
+ "attributes.canStarforce": gear.attributes.canStarforce,
1752
+ starScroll: gear.starScroll
1753
+ });
1754
+ const canStarforce = gear.attributes.canStarforce;
1755
+ const star = gear.star;
1756
+ gear.data.attributes.canStarforce = GearCapability.Can;
1757
+ resetStarforce(gear);
1758
+ for (let i = 0; i < star; i++) starforce(gear, true);
1759
+ gear.data.attributes.canStarforce = canStarforce;
1760
+ }
1761
+ function _superiorStarforce(gear) {
1762
+ const stat = _getValue(superiorStat, gear);
1763
+ const power = _getValue(superiorPower, gear);
1764
+ for (const type of statTypes) if (gear.baseOption[type] > 0) _getStarforceOption(gear)[type] += stat;
1765
+ for (const type of powerTypes) if (gear.baseOption[type] > 0) _getStarforceOption(gear)[type] += power;
1766
+ const armor = _getStarforceBaseValue(gear, "armor");
1767
+ _getStarforceOption(gear).armor += Math.floor(armor / 20) + 1;
1768
+ }
1769
+ function _weaponStarforce(gear) {
1770
+ const stat = _getValue(starforceStat, gear);
1771
+ const power = _getValue(starforceWeaponPower, gear);
1772
+ const optionTypes = _getJobOptionTypes(gear);
1773
+ for (const type of statTypes) if (optionTypes.has(type)) _getStarforceOption(gear)[type] += stat;
1774
+ else if (gear.star > 15 && (gear.baseOption[type] > 0 || gear.upgradeOption[type] > 0)) _getStarforceOption(gear)[type] += stat;
1775
+ const isMagic = gear.req.magician() || gear.upgradeOption.magicPower > 0;
1776
+ if (gear.star > 15) {
1777
+ _getStarforceOption(gear).attackPower += power;
1778
+ if (isMagic) _getStarforceOption(gear).magicPower += power;
1779
+ } else {
1780
+ const attackPower = _getStarforceBaseValue(gear, "attackPower");
1781
+ _getStarforceOption(gear).attackPower += Math.floor(attackPower / 50) + 1;
1782
+ if (isMagic) {
1783
+ const magicPower = _getStarforceBaseValue(gear, "magicPower");
1784
+ _getStarforceOption(gear).magicPower += Math.floor(magicPower / 50) + 1;
1785
+ }
1786
+ }
1787
+ const maxHp = starforceMaxHpMp[gear.star];
1788
+ _getStarforceOption(gear).maxHp += maxHp;
1789
+ _getStarforceOption(gear).maxMp += maxHp;
1790
+ }
1791
+ function _otherStarforce(gear) {
1792
+ const stat = _getValue(starforceStat, gear);
1793
+ const power = _getValue(starforcePower, gear);
1794
+ const optionTypes = _getJobOptionTypes(gear);
1795
+ for (const type of statTypes) if (optionTypes.has(type)) _getStarforceOption(gear)[type] += stat;
1796
+ else if (gear.star > 15 && (gear.baseOption[type] > 0 || gear.upgradeOption[type] > 0)) _getStarforceOption(gear)[type] += stat;
1797
+ _getStarforceOption(gear).attackPower += power;
1798
+ _getStarforceOption(gear).magicPower += power;
1799
+ if (gear.type === GearType.glove && gear.req.level >= 130) {
1800
+ const bonusPower = starforceGloveBonusPower[gear.star];
1801
+ if (gear.req.beginner()) {
1802
+ _getStarforceOption(gear).attackPower += bonusPower;
1803
+ _getStarforceOption(gear).magicPower += bonusPower;
1804
+ } else if (gear.req.magician()) _getStarforceOption(gear).magicPower += bonusPower;
1805
+ else _getStarforceOption(gear).attackPower += bonusPower;
1806
+ }
1807
+ if (gear.type !== GearType.machineHeart && !isSubWeapon(gear.type)) {
1808
+ const armor = _getStarforceBaseValue(gear, "armor");
1809
+ _getStarforceOption(gear).armor += Math.floor(armor / 20) + 1;
1810
+ }
1811
+ if (maxHpTypes.has(gear.type)) {
1812
+ const maxHp = starforceMaxHpMp[gear.star];
1813
+ _getStarforceOption(gear).maxHp += maxHp;
1814
+ }
1815
+ if (gear.type === GearType.shoes) {
1816
+ const speedJump = starforceSpeedJump[gear.star];
1817
+ _getStarforceOption(gear).speed += speedJump;
1818
+ _getStarforceOption(gear).jump += speedJump;
1819
+ }
1820
+ }
1821
+ function _getJobOptionTypes(gear) {
1822
+ if (gear.req.beginner()) return new Set(statTypes);
1823
+ const stats = [];
1824
+ if (gear.req.warrior()) stats.push("str", "dex");
1825
+ if (gear.req.magician()) stats.push("int", "luk");
1826
+ if (gear.req.bowman()) stats.push("dex", "str");
1827
+ if (gear.req.thief()) stats.push("luk", "dex");
1828
+ if (gear.req.pirate()) stats.push("str", "dex");
1829
+ return new Set(stats);
1830
+ }
1831
+ function _getValue(data, gear) {
1832
+ const reqLevel = gear.req.level;
1833
+ for (let i = data.length - 1; i >= 0; i--) {
1834
+ const item = data[i];
1835
+ if (reqLevel >= item[0]) return item[gear.star];
1836
+ }
1837
+ throw new GearError(ErrorMessage.Starforce_InvalidReqLevelGear, gear, { "req.level": gear.req.level });
1838
+ }
1839
+ function _getStarforceOption(gear) {
1840
+ gear.data.starforceOption ??= {};
1841
+ return toGearOption(gear.data.starforceOption);
1842
+ }
1843
+ function _getStarforceBaseValue(gear, type) {
1844
+ return gear.baseOption[type] + gear.upgradeOption[type] + gear.starforceOption[type];
1845
+ }
1846
+ function _getStarScrollBaseValue(gear, type) {
1847
+ return gear.baseOption[type] + gear.addOption[type] + gear.upgradeOption[type] + gear.starforceOption[type];
1848
+ }
1849
+ function _getBaseMaxStar(gear) {
1850
+ const reqLevel = gear.req.level + gear.req.levelIncrease;
1851
+ let data = void 0;
1852
+ for (const item of maxStarData) if (reqLevel >= item[0]) data = item;
1853
+ else break;
1854
+ if (!data) return 0;
1855
+ return gear.attributes.superior ? data[2] : data[1];
1856
+ }
1857
+ function _getBaseMaxStarWithToadsHammer(gear) {
1858
+ const reqLevel = gear.req.level + gear.req.levelIncrease;
1859
+ let data = void 0;
1860
+ for (const item of maxStarDataWithToadsHammer) if (reqLevel >= item[0]) data = item;
1861
+ else break;
1862
+ if (!data) return 0;
1863
+ return data[1];
1864
+ }
1865
+ const maxStarData = [
1866
+ [
1867
+ 0,
1868
+ 5,
1869
+ 3
1870
+ ],
1871
+ [
1872
+ 95,
1873
+ 8,
1874
+ 5
1875
+ ],
1876
+ [
1877
+ 110,
1878
+ 10,
1879
+ 8
1880
+ ],
1881
+ [
1882
+ 120,
1883
+ 15,
1884
+ 10
1885
+ ],
1886
+ [
1887
+ 130,
1888
+ 20,
1889
+ 12
1890
+ ],
1891
+ [
1892
+ 140,
1893
+ 30,
1894
+ 15
1895
+ ]
1896
+ ];
1897
+ const maxStarDataWithToadsHammer = [
1898
+ [0, 15],
1899
+ [101, 19],
1900
+ [111, 29],
1901
+ [140, 30]
1902
+ ];
1903
+ const statTypes = [
1904
+ "str",
1905
+ "dex",
1906
+ "int",
1907
+ "luk"
1908
+ ];
1909
+ const powerTypes = ["attackPower", "magicPower"];
1910
+ const maxHpTypes = new Set([
1911
+ GearType.cap,
1912
+ GearType.coat,
1913
+ GearType.longcoat,
1914
+ GearType.pants,
1915
+ GearType.cape,
1916
+ GearType.ring,
1917
+ GearType.pendant,
1918
+ GearType.belt,
1919
+ GearType.shoulder,
1920
+ GearType.shield
1921
+ ]);
1922
+ const starforceStat = [
1923
+ [
1924
+ 0,
1925
+ 2,
1926
+ 2,
1927
+ 2,
1928
+ 2,
1929
+ 2,
1930
+ 3,
1931
+ 3,
1932
+ 3,
1933
+ 3,
1934
+ 3,
1935
+ 3,
1936
+ 3,
1937
+ 3,
1938
+ 3,
1939
+ 3,
1940
+ 2,
1941
+ 2,
1942
+ 2,
1943
+ 2,
1944
+ 2,
1945
+ 0,
1946
+ 0,
1947
+ 0,
1948
+ 0,
1949
+ 0
1950
+ ],
1951
+ [
1952
+ 108,
1953
+ 2,
1954
+ 2,
1955
+ 2,
1956
+ 2,
1957
+ 2,
1958
+ 3,
1959
+ 3,
1960
+ 3,
1961
+ 3,
1962
+ 3,
1963
+ 3,
1964
+ 3,
1965
+ 3,
1966
+ 3,
1967
+ 3,
1968
+ 3,
1969
+ 3,
1970
+ 3,
1971
+ 3,
1972
+ 3,
1973
+ 3,
1974
+ 3,
1975
+ 0,
1976
+ 0,
1977
+ 0,
1978
+ 0,
1979
+ 0,
1980
+ 0,
1981
+ 0,
1982
+ 0
1983
+ ],
1984
+ [
1985
+ 118,
1986
+ 2,
1987
+ 2,
1988
+ 2,
1989
+ 2,
1990
+ 2,
1991
+ 3,
1992
+ 3,
1993
+ 3,
1994
+ 3,
1995
+ 3,
1996
+ 3,
1997
+ 3,
1998
+ 3,
1999
+ 3,
2000
+ 3,
2001
+ 5,
2002
+ 5,
2003
+ 5,
2004
+ 5,
2005
+ 5,
2006
+ 5,
2007
+ 5,
2008
+ 0,
2009
+ 0,
2010
+ 0,
2011
+ 0,
2012
+ 0,
2013
+ 0,
2014
+ 0,
2015
+ 0
2016
+ ],
2017
+ [
2018
+ 128,
2019
+ 2,
2020
+ 2,
2021
+ 2,
2022
+ 2,
2023
+ 2,
2024
+ 3,
2025
+ 3,
2026
+ 3,
2027
+ 3,
2028
+ 3,
2029
+ 3,
2030
+ 3,
2031
+ 3,
2032
+ 3,
2033
+ 3,
2034
+ 7,
2035
+ 7,
2036
+ 7,
2037
+ 7,
2038
+ 7,
2039
+ 7,
2040
+ 7,
2041
+ 0,
2042
+ 0,
2043
+ 0,
2044
+ 0,
2045
+ 0,
2046
+ 0,
2047
+ 0,
2048
+ 0
2049
+ ],
2050
+ [
2051
+ 138,
2052
+ 2,
2053
+ 2,
2054
+ 2,
2055
+ 2,
2056
+ 2,
2057
+ 3,
2058
+ 3,
2059
+ 3,
2060
+ 3,
2061
+ 3,
2062
+ 3,
2063
+ 3,
2064
+ 3,
2065
+ 3,
2066
+ 3,
2067
+ 9,
2068
+ 9,
2069
+ 9,
2070
+ 9,
2071
+ 9,
2072
+ 9,
2073
+ 9,
2074
+ 0,
2075
+ 0,
2076
+ 0,
2077
+ 0,
2078
+ 0,
2079
+ 0,
2080
+ 0,
2081
+ 0
2082
+ ],
2083
+ [
2084
+ 148,
2085
+ 2,
2086
+ 2,
2087
+ 2,
2088
+ 2,
2089
+ 2,
2090
+ 3,
2091
+ 3,
2092
+ 3,
2093
+ 3,
2094
+ 3,
2095
+ 3,
2096
+ 3,
2097
+ 3,
2098
+ 3,
2099
+ 3,
2100
+ 11,
2101
+ 11,
2102
+ 11,
2103
+ 11,
2104
+ 11,
2105
+ 11,
2106
+ 11,
2107
+ 0,
2108
+ 0,
2109
+ 0,
2110
+ 0,
2111
+ 0,
2112
+ 0,
2113
+ 0,
2114
+ 0
2115
+ ],
2116
+ [
2117
+ 158,
2118
+ 2,
2119
+ 2,
2120
+ 2,
2121
+ 2,
2122
+ 2,
2123
+ 3,
2124
+ 3,
2125
+ 3,
2126
+ 3,
2127
+ 3,
2128
+ 3,
2129
+ 3,
2130
+ 3,
2131
+ 3,
2132
+ 3,
2133
+ 13,
2134
+ 13,
2135
+ 13,
2136
+ 13,
2137
+ 13,
2138
+ 13,
2139
+ 13,
2140
+ 0,
2141
+ 0,
2142
+ 0,
2143
+ 0,
2144
+ 0,
2145
+ 0,
2146
+ 0,
2147
+ 0
2148
+ ],
2149
+ [
2150
+ 198,
2151
+ 2,
2152
+ 2,
2153
+ 2,
2154
+ 2,
2155
+ 2,
2156
+ 3,
2157
+ 3,
2158
+ 3,
2159
+ 3,
2160
+ 3,
2161
+ 3,
2162
+ 3,
2163
+ 3,
2164
+ 3,
2165
+ 3,
2166
+ 15,
2167
+ 15,
2168
+ 15,
2169
+ 15,
2170
+ 15,
2171
+ 15,
2172
+ 15,
2173
+ 0,
2174
+ 0,
2175
+ 0,
2176
+ 0,
2177
+ 0,
2178
+ 0,
2179
+ 0,
2180
+ 0
2181
+ ],
2182
+ [
2183
+ 248,
2184
+ 2,
2185
+ 2,
2186
+ 2,
2187
+ 2,
2188
+ 2,
2189
+ 3,
2190
+ 3,
2191
+ 3,
2192
+ 3,
2193
+ 3,
2194
+ 3,
2195
+ 3,
2196
+ 3,
2197
+ 3,
2198
+ 3,
2199
+ 17,
2200
+ 17,
2201
+ 17,
2202
+ 17,
2203
+ 17,
2204
+ 17,
2205
+ 17,
2206
+ 0,
2207
+ 0,
2208
+ 0,
2209
+ 0,
2210
+ 0,
2211
+ 0,
2212
+ 0,
2213
+ 0
2214
+ ]
2215
+ ];
2216
+ const starforcePower = [
2217
+ [
2218
+ 0,
2219
+ 0,
2220
+ 0,
2221
+ 0,
2222
+ 0,
2223
+ 0,
2224
+ 0,
2225
+ 0,
2226
+ 0,
2227
+ 0,
2228
+ 0,
2229
+ 0,
2230
+ 0,
2231
+ 0,
2232
+ 0,
2233
+ 0,
2234
+ 4,
2235
+ 5,
2236
+ 6,
2237
+ 7,
2238
+ 8,
2239
+ 0,
2240
+ 0,
2241
+ 0,
2242
+ 0,
2243
+ 0
2244
+ ],
2245
+ [
2246
+ 108,
2247
+ 0,
2248
+ 0,
2249
+ 0,
2250
+ 0,
2251
+ 0,
2252
+ 0,
2253
+ 0,
2254
+ 0,
2255
+ 0,
2256
+ 0,
2257
+ 0,
2258
+ 0,
2259
+ 0,
2260
+ 0,
2261
+ 0,
2262
+ 5,
2263
+ 6,
2264
+ 7,
2265
+ 8,
2266
+ 9,
2267
+ 10,
2268
+ 12,
2269
+ 13,
2270
+ 15,
2271
+ 17,
2272
+ 18,
2273
+ 19,
2274
+ 20,
2275
+ 21,
2276
+ 22
2277
+ ],
2278
+ [
2279
+ 118,
2280
+ 0,
2281
+ 0,
2282
+ 0,
2283
+ 0,
2284
+ 0,
2285
+ 0,
2286
+ 0,
2287
+ 0,
2288
+ 0,
2289
+ 0,
2290
+ 0,
2291
+ 0,
2292
+ 0,
2293
+ 0,
2294
+ 0,
2295
+ 6,
2296
+ 7,
2297
+ 8,
2298
+ 9,
2299
+ 10,
2300
+ 11,
2301
+ 13,
2302
+ 14,
2303
+ 16,
2304
+ 18,
2305
+ 19,
2306
+ 20,
2307
+ 21,
2308
+ 22,
2309
+ 23
2310
+ ],
2311
+ [
2312
+ 128,
2313
+ 0,
2314
+ 0,
2315
+ 0,
2316
+ 0,
2317
+ 0,
2318
+ 0,
2319
+ 0,
2320
+ 0,
2321
+ 0,
2322
+ 0,
2323
+ 0,
2324
+ 0,
2325
+ 0,
2326
+ 0,
2327
+ 0,
2328
+ 7,
2329
+ 8,
2330
+ 9,
2331
+ 10,
2332
+ 11,
2333
+ 12,
2334
+ 14,
2335
+ 16,
2336
+ 18,
2337
+ 20,
2338
+ 21,
2339
+ 22,
2340
+ 23,
2341
+ 24,
2342
+ 25
2343
+ ],
2344
+ [
2345
+ 138,
2346
+ 0,
2347
+ 0,
2348
+ 0,
2349
+ 0,
2350
+ 0,
2351
+ 0,
2352
+ 0,
2353
+ 0,
2354
+ 0,
2355
+ 0,
2356
+ 0,
2357
+ 0,
2358
+ 0,
2359
+ 0,
2360
+ 0,
2361
+ 8,
2362
+ 9,
2363
+ 10,
2364
+ 11,
2365
+ 12,
2366
+ 13,
2367
+ 15,
2368
+ 17,
2369
+ 19,
2370
+ 21,
2371
+ 22,
2372
+ 23,
2373
+ 24,
2374
+ 25,
2375
+ 26
2376
+ ],
2377
+ [
2378
+ 148,
2379
+ 0,
2380
+ 0,
2381
+ 0,
2382
+ 0,
2383
+ 0,
2384
+ 0,
2385
+ 0,
2386
+ 0,
2387
+ 0,
2388
+ 0,
2389
+ 0,
2390
+ 0,
2391
+ 0,
2392
+ 0,
2393
+ 0,
2394
+ 9,
2395
+ 10,
2396
+ 11,
2397
+ 12,
2398
+ 13,
2399
+ 14,
2400
+ 16,
2401
+ 18,
2402
+ 20,
2403
+ 22,
2404
+ 23,
2405
+ 24,
2406
+ 25,
2407
+ 26,
2408
+ 27
2409
+ ],
2410
+ [
2411
+ 158,
2412
+ 0,
2413
+ 0,
2414
+ 0,
2415
+ 0,
2416
+ 0,
2417
+ 0,
2418
+ 0,
2419
+ 0,
2420
+ 0,
2421
+ 0,
2422
+ 0,
2423
+ 0,
2424
+ 0,
2425
+ 0,
2426
+ 0,
2427
+ 10,
2428
+ 11,
2429
+ 12,
2430
+ 13,
2431
+ 14,
2432
+ 15,
2433
+ 17,
2434
+ 19,
2435
+ 21,
2436
+ 23,
2437
+ 24,
2438
+ 25,
2439
+ 26,
2440
+ 27,
2441
+ 28
2442
+ ],
2443
+ [
2444
+ 198,
2445
+ 0,
2446
+ 0,
2447
+ 0,
2448
+ 0,
2449
+ 0,
2450
+ 0,
2451
+ 0,
2452
+ 0,
2453
+ 0,
2454
+ 0,
2455
+ 0,
2456
+ 0,
2457
+ 0,
2458
+ 0,
2459
+ 0,
2460
+ 12,
2461
+ 13,
2462
+ 14,
2463
+ 15,
2464
+ 16,
2465
+ 17,
2466
+ 19,
2467
+ 21,
2468
+ 23,
2469
+ 25,
2470
+ 26,
2471
+ 27,
2472
+ 28,
2473
+ 29,
2474
+ 30
2475
+ ],
2476
+ [
2477
+ 248,
2478
+ 0,
2479
+ 0,
2480
+ 0,
2481
+ 0,
2482
+ 0,
2483
+ 0,
2484
+ 0,
2485
+ 0,
2486
+ 0,
2487
+ 0,
2488
+ 0,
2489
+ 0,
2490
+ 0,
2491
+ 0,
2492
+ 0,
2493
+ 14,
2494
+ 15,
2495
+ 16,
2496
+ 17,
2497
+ 18,
2498
+ 19,
2499
+ 21,
2500
+ 23,
2501
+ 25,
2502
+ 27,
2503
+ 28,
2504
+ 29,
2505
+ 30,
2506
+ 31,
2507
+ 32
2508
+ ]
2509
+ ];
2510
+ const starforceWeaponPower = [
2511
+ [
2512
+ 0,
2513
+ 0,
2514
+ 0,
2515
+ 0,
2516
+ 0,
2517
+ 0,
2518
+ 0,
2519
+ 0,
2520
+ 0,
2521
+ 0,
2522
+ 0,
2523
+ 0,
2524
+ 0,
2525
+ 0,
2526
+ 0,
2527
+ 0,
2528
+ 3,
2529
+ 4,
2530
+ 5,
2531
+ 6,
2532
+ 7,
2533
+ 0,
2534
+ 0,
2535
+ 0,
2536
+ 0,
2537
+ 0
2538
+ ],
2539
+ [
2540
+ 108,
2541
+ 0,
2542
+ 0,
2543
+ 0,
2544
+ 0,
2545
+ 0,
2546
+ 0,
2547
+ 0,
2548
+ 0,
2549
+ 0,
2550
+ 0,
2551
+ 0,
2552
+ 0,
2553
+ 0,
2554
+ 0,
2555
+ 0,
2556
+ 4,
2557
+ 5,
2558
+ 5,
2559
+ 6,
2560
+ 7,
2561
+ 8,
2562
+ 9,
2563
+ 27,
2564
+ 28,
2565
+ 29
2566
+ ],
2567
+ [
2568
+ 118,
2569
+ 0,
2570
+ 0,
2571
+ 0,
2572
+ 0,
2573
+ 0,
2574
+ 0,
2575
+ 0,
2576
+ 0,
2577
+ 0,
2578
+ 0,
2579
+ 0,
2580
+ 0,
2581
+ 0,
2582
+ 0,
2583
+ 0,
2584
+ 5,
2585
+ 6,
2586
+ 6,
2587
+ 7,
2588
+ 8,
2589
+ 9,
2590
+ 10,
2591
+ 28,
2592
+ 29,
2593
+ 30
2594
+ ],
2595
+ [
2596
+ 128,
2597
+ 0,
2598
+ 0,
2599
+ 0,
2600
+ 0,
2601
+ 0,
2602
+ 0,
2603
+ 0,
2604
+ 0,
2605
+ 0,
2606
+ 0,
2607
+ 0,
2608
+ 0,
2609
+ 0,
2610
+ 0,
2611
+ 0,
2612
+ 6,
2613
+ 7,
2614
+ 7,
2615
+ 8,
2616
+ 9,
2617
+ 10,
2618
+ 11,
2619
+ 29,
2620
+ 30,
2621
+ 31
2622
+ ],
2623
+ [
2624
+ 138,
2625
+ 0,
2626
+ 0,
2627
+ 0,
2628
+ 0,
2629
+ 0,
2630
+ 0,
2631
+ 0,
2632
+ 0,
2633
+ 0,
2634
+ 0,
2635
+ 0,
2636
+ 0,
2637
+ 0,
2638
+ 0,
2639
+ 0,
2640
+ 7,
2641
+ 8,
2642
+ 8,
2643
+ 9,
2644
+ 10,
2645
+ 11,
2646
+ 12,
2647
+ 30,
2648
+ 31,
2649
+ 32,
2650
+ 33,
2651
+ 34,
2652
+ 35,
2653
+ 36,
2654
+ 37
2655
+ ],
2656
+ [
2657
+ 148,
2658
+ 0,
2659
+ 0,
2660
+ 0,
2661
+ 0,
2662
+ 0,
2663
+ 0,
2664
+ 0,
2665
+ 0,
2666
+ 0,
2667
+ 0,
2668
+ 0,
2669
+ 0,
2670
+ 0,
2671
+ 0,
2672
+ 0,
2673
+ 8,
2674
+ 9,
2675
+ 9,
2676
+ 10,
2677
+ 11,
2678
+ 12,
2679
+ 13,
2680
+ 31,
2681
+ 32,
2682
+ 33,
2683
+ 34,
2684
+ 35,
2685
+ 36,
2686
+ 37,
2687
+ 38
2688
+ ],
2689
+ [
2690
+ 158,
2691
+ 0,
2692
+ 0,
2693
+ 0,
2694
+ 0,
2695
+ 0,
2696
+ 0,
2697
+ 0,
2698
+ 0,
2699
+ 0,
2700
+ 0,
2701
+ 0,
2702
+ 0,
2703
+ 0,
2704
+ 0,
2705
+ 0,
2706
+ 9,
2707
+ 9,
2708
+ 10,
2709
+ 11,
2710
+ 12,
2711
+ 13,
2712
+ 14,
2713
+ 32,
2714
+ 33,
2715
+ 34,
2716
+ 35,
2717
+ 36,
2718
+ 37,
2719
+ 38,
2720
+ 39
2721
+ ],
2722
+ [
2723
+ 198,
2724
+ 0,
2725
+ 0,
2726
+ 0,
2727
+ 0,
2728
+ 0,
2729
+ 0,
2730
+ 0,
2731
+ 0,
2732
+ 0,
2733
+ 0,
2734
+ 0,
2735
+ 0,
2736
+ 0,
2737
+ 0,
2738
+ 0,
2739
+ 13,
2740
+ 13,
2741
+ 14,
2742
+ 14,
2743
+ 15,
2744
+ 16,
2745
+ 17,
2746
+ 34,
2747
+ 35,
2748
+ 36,
2749
+ 37,
2750
+ 38,
2751
+ 39,
2752
+ 40,
2753
+ 41
2754
+ ],
2755
+ [
2756
+ 248,
2757
+ 0,
2758
+ 0,
2759
+ 0,
2760
+ 0,
2761
+ 0,
2762
+ 0,
2763
+ 0,
2764
+ 0,
2765
+ 0,
2766
+ 0,
2767
+ 0,
2768
+ 0,
2769
+ 0,
2770
+ 0,
2771
+ 0,
2772
+ 15,
2773
+ 15,
2774
+ 16,
2775
+ 16,
2776
+ 17,
2777
+ 18,
2778
+ 19,
2779
+ 36,
2780
+ 37,
2781
+ 38,
2782
+ 39,
2783
+ 40,
2784
+ 41,
2785
+ 42,
2786
+ 43
2787
+ ]
2788
+ ];
2789
+ const superiorPower = [
2790
+ [
2791
+ 0,
2792
+ 0,
2793
+ 0,
2794
+ 0,
2795
+ 0,
2796
+ 0,
2797
+ 0,
2798
+ 0,
2799
+ 0,
2800
+ 0,
2801
+ 0,
2802
+ 0,
2803
+ 0,
2804
+ 0,
2805
+ 0,
2806
+ 0
2807
+ ],
2808
+ [
2809
+ 110,
2810
+ 0,
2811
+ 0,
2812
+ 0,
2813
+ 0,
2814
+ 0,
2815
+ 5,
2816
+ 6,
2817
+ 7,
2818
+ 0,
2819
+ 0,
2820
+ 0,
2821
+ 0,
2822
+ 0,
2823
+ 0,
2824
+ 0
2825
+ ],
2826
+ [
2827
+ 150,
2828
+ 0,
2829
+ 0,
2830
+ 0,
2831
+ 0,
2832
+ 0,
2833
+ 9,
2834
+ 10,
2835
+ 11,
2836
+ 12,
2837
+ 13,
2838
+ 15,
2839
+ 17,
2840
+ 19,
2841
+ 21,
2842
+ 23
2843
+ ]
2844
+ ];
2845
+ const superiorStat = [
2846
+ [
2847
+ 0,
2848
+ 1,
2849
+ 2,
2850
+ 4,
2851
+ 7,
2852
+ 11,
2853
+ 0,
2854
+ 0,
2855
+ 0,
2856
+ 0,
2857
+ 0,
2858
+ 0,
2859
+ 0,
2860
+ 0,
2861
+ 0,
2862
+ 0
2863
+ ],
2864
+ [
2865
+ 80,
2866
+ 2,
2867
+ 3,
2868
+ 5,
2869
+ 8,
2870
+ 12,
2871
+ 0,
2872
+ 0,
2873
+ 0,
2874
+ 0,
2875
+ 0,
2876
+ 0,
2877
+ 0,
2878
+ 0,
2879
+ 0,
2880
+ 0
2881
+ ],
2882
+ [
2883
+ 110,
2884
+ 9,
2885
+ 10,
2886
+ 12,
2887
+ 15,
2888
+ 19,
2889
+ 0,
2890
+ 0,
2891
+ 0,
2892
+ 0,
2893
+ 0,
2894
+ 0,
2895
+ 0,
2896
+ 0,
2897
+ 0,
2898
+ 0
2899
+ ],
2900
+ [
2901
+ 150,
2902
+ 19,
2903
+ 20,
2904
+ 22,
2905
+ 25,
2906
+ 29,
2907
+ 0,
2908
+ 0,
2909
+ 0,
2910
+ 0,
2911
+ 0,
2912
+ 0,
2913
+ 0,
2914
+ 0,
2915
+ 0,
2916
+ 0
2917
+ ]
2918
+ ];
2919
+ const starforceGloveBonusPower = [
2920
+ -1,
2921
+ 0,
2922
+ 0,
2923
+ 0,
2924
+ 0,
2925
+ 1,
2926
+ 0,
2927
+ 1,
2928
+ 0,
2929
+ 1,
2930
+ 0,
2931
+ 1,
2932
+ 0,
2933
+ 1,
2934
+ 1,
2935
+ 1,
2936
+ 0,
2937
+ 0,
2938
+ 0,
2939
+ 0,
2940
+ 0,
2941
+ 0,
2942
+ 0,
2943
+ 0,
2944
+ 0,
2945
+ 0,
2946
+ 0,
2947
+ 0,
2948
+ 0,
2949
+ 0,
2950
+ 0
2951
+ ];
2952
+ const starforceMaxHpMp = [
2953
+ -1,
2954
+ 5,
2955
+ 5,
2956
+ 5,
2957
+ 10,
2958
+ 10,
2959
+ 15,
2960
+ 15,
2961
+ 20,
2962
+ 20,
2963
+ 25,
2964
+ 25,
2965
+ 25,
2966
+ 25,
2967
+ 25,
2968
+ 25,
2969
+ 0,
2970
+ 0,
2971
+ 0,
2972
+ 0,
2973
+ 0,
2974
+ 0,
2975
+ 0,
2976
+ 0,
2977
+ 0,
2978
+ 0,
2979
+ 0,
2980
+ 0,
2981
+ 0,
2982
+ 0,
2983
+ 0
2984
+ ];
2985
+ const starforceSpeedJump = [
2986
+ -1,
2987
+ 0,
2988
+ 0,
2989
+ 1,
2990
+ 1,
2991
+ 1,
2992
+ 1,
2993
+ 1,
2994
+ 1,
2995
+ 1,
2996
+ 1,
2997
+ 2,
2998
+ 2,
2999
+ 2,
3000
+ 2,
3001
+ 2,
3002
+ 0,
3003
+ 0,
3004
+ 0,
3005
+ 0,
3006
+ 0,
3007
+ 0,
3008
+ 0,
3009
+ 0,
3010
+ 0,
3011
+ 0,
3012
+ 0,
3013
+ 0,
3014
+ 0,
3015
+ 0,
3016
+ 0
3017
+ ];
3018
+ const starScrollStat = [
3019
+ [
3020
+ 0,
3021
+ 1,
3022
+ 2,
3023
+ 4,
3024
+ 7,
3025
+ 11,
3026
+ 0,
3027
+ 0,
3028
+ 0,
3029
+ 0,
3030
+ 0,
3031
+ 0,
3032
+ 0,
3033
+ 0,
3034
+ 0,
3035
+ 0
3036
+ ],
3037
+ [
3038
+ 80,
3039
+ 2,
3040
+ 3,
3041
+ 5,
3042
+ 8,
3043
+ 12,
3044
+ 0,
3045
+ 0,
3046
+ 0,
3047
+ 0,
3048
+ 0,
3049
+ 0,
3050
+ 0,
3051
+ 0,
3052
+ 0,
3053
+ 0
3054
+ ],
3055
+ [
3056
+ 85,
3057
+ 3,
3058
+ 4,
3059
+ 6,
3060
+ 9,
3061
+ 13,
3062
+ 0,
3063
+ 0,
3064
+ 0,
3065
+ 0,
3066
+ 0,
3067
+ 0,
3068
+ 0,
3069
+ 0,
3070
+ 0,
3071
+ 0
3072
+ ],
3073
+ [
3074
+ 90,
3075
+ 4,
3076
+ 5,
3077
+ 7,
3078
+ 10,
3079
+ 14,
3080
+ 0,
3081
+ 0,
3082
+ 0,
3083
+ 0,
3084
+ 0,
3085
+ 0,
3086
+ 0,
3087
+ 0,
3088
+ 0,
3089
+ 0
3090
+ ],
3091
+ [
3092
+ 95,
3093
+ 5,
3094
+ 6,
3095
+ 8,
3096
+ 11,
3097
+ 15,
3098
+ 0,
3099
+ 0,
3100
+ 0,
3101
+ 0,
3102
+ 0,
3103
+ 0,
3104
+ 0,
3105
+ 0,
3106
+ 0,
3107
+ 0
3108
+ ],
3109
+ [
3110
+ 100,
3111
+ 7,
3112
+ 8,
3113
+ 10,
3114
+ 13,
3115
+ 17,
3116
+ 0,
3117
+ 0,
3118
+ 0,
3119
+ 0,
3120
+ 0,
3121
+ 0,
3122
+ 0,
3123
+ 0,
3124
+ 0,
3125
+ 0
3126
+ ],
3127
+ [
3128
+ 105,
3129
+ 8,
3130
+ 9,
3131
+ 11,
3132
+ 14,
3133
+ 18,
3134
+ 0,
3135
+ 0,
3136
+ 0,
3137
+ 0,
3138
+ 0,
3139
+ 0,
3140
+ 0,
3141
+ 0,
3142
+ 0,
3143
+ 0
3144
+ ],
3145
+ [
3146
+ 110,
3147
+ 9,
3148
+ 10,
3149
+ 12,
3150
+ 15,
3151
+ 19,
3152
+ 0,
3153
+ 0,
3154
+ 0,
3155
+ 0,
3156
+ 0,
3157
+ 0,
3158
+ 0,
3159
+ 0,
3160
+ 0,
3161
+ 0
3162
+ ],
3163
+ [
3164
+ 115,
3165
+ 10,
3166
+ 11,
3167
+ 13,
3168
+ 16,
3169
+ 20,
3170
+ 0,
3171
+ 0,
3172
+ 0,
3173
+ 0,
3174
+ 0,
3175
+ 0,
3176
+ 0,
3177
+ 0,
3178
+ 0,
3179
+ 0
3180
+ ],
3181
+ [
3182
+ 120,
3183
+ 12,
3184
+ 13,
3185
+ 15,
3186
+ 18,
3187
+ 22,
3188
+ 0,
3189
+ 0,
3190
+ 0,
3191
+ 0,
3192
+ 0,
3193
+ 0,
3194
+ 0,
3195
+ 0,
3196
+ 0,
3197
+ 0
3198
+ ],
3199
+ [
3200
+ 125,
3201
+ 13,
3202
+ 14,
3203
+ 16,
3204
+ 19,
3205
+ 23,
3206
+ 0,
3207
+ 0,
3208
+ 0,
3209
+ 0,
3210
+ 0,
3211
+ 0,
3212
+ 0,
3213
+ 0,
3214
+ 0,
3215
+ 0
3216
+ ],
3217
+ [
3218
+ 130,
3219
+ 14,
3220
+ 15,
3221
+ 17,
3222
+ 20,
3223
+ 24,
3224
+ 0,
3225
+ 0,
3226
+ 0,
3227
+ 0,
3228
+ 0,
3229
+ 0,
3230
+ 0,
3231
+ 0,
3232
+ 0,
3233
+ 0
3234
+ ],
3235
+ [
3236
+ 135,
3237
+ 15,
3238
+ 16,
3239
+ 18,
3240
+ 21,
3241
+ 25,
3242
+ 0,
3243
+ 0,
3244
+ 0,
3245
+ 0,
3246
+ 0,
3247
+ 0,
3248
+ 0,
3249
+ 0,
3250
+ 0,
3251
+ 0
3252
+ ],
3253
+ [
3254
+ 140,
3255
+ 17,
3256
+ 18,
3257
+ 20,
3258
+ 23,
3259
+ 27,
3260
+ 0,
3261
+ 0,
3262
+ 0,
3263
+ 0,
3264
+ 0,
3265
+ 0,
3266
+ 0,
3267
+ 0,
3268
+ 0,
3269
+ 0
3270
+ ],
3271
+ [
3272
+ 145,
3273
+ 18,
3274
+ 19,
3275
+ 21,
3276
+ 24,
3277
+ 28,
3278
+ 0,
3279
+ 0,
3280
+ 0,
3281
+ 0,
3282
+ 0,
3283
+ 0,
3284
+ 0,
3285
+ 0,
3286
+ 0,
3287
+ 0
3288
+ ],
3289
+ [
3290
+ 150,
3291
+ 19,
3292
+ 20,
3293
+ 22,
3294
+ 25,
3295
+ 29,
3296
+ 0,
3297
+ 0,
3298
+ 0,
3299
+ 0,
3300
+ 0,
3301
+ 0,
3302
+ 0,
3303
+ 0,
3304
+ 0,
3305
+ 0
3306
+ ]
3307
+ ];
3308
+ const starScrollPower = [
3309
+ [
3310
+ 0,
3311
+ 0,
3312
+ 0,
3313
+ 0,
3314
+ 0,
3315
+ 0,
3316
+ 1,
3317
+ 2,
3318
+ 3,
3319
+ 4,
3320
+ 5,
3321
+ 6,
3322
+ 8,
3323
+ 10,
3324
+ 12,
3325
+ 14
3326
+ ],
3327
+ [
3328
+ 80,
3329
+ 0,
3330
+ 0,
3331
+ 0,
3332
+ 0,
3333
+ 0,
3334
+ 2,
3335
+ 3,
3336
+ 4,
3337
+ 5,
3338
+ 6,
3339
+ 7,
3340
+ 9,
3341
+ 11,
3342
+ 13,
3343
+ 15
3344
+ ],
3345
+ [
3346
+ 90,
3347
+ 0,
3348
+ 0,
3349
+ 0,
3350
+ 0,
3351
+ 0,
3352
+ 3,
3353
+ 4,
3354
+ 5,
3355
+ 6,
3356
+ 7,
3357
+ 8,
3358
+ 10,
3359
+ 12,
3360
+ 14,
3361
+ 16
3362
+ ],
3363
+ [
3364
+ 100,
3365
+ 0,
3366
+ 0,
3367
+ 0,
3368
+ 0,
3369
+ 0,
3370
+ 4,
3371
+ 5,
3372
+ 6,
3373
+ 7,
3374
+ 8,
3375
+ 9,
3376
+ 11,
3377
+ 13,
3378
+ 15,
3379
+ 17
3380
+ ],
3381
+ [
3382
+ 110,
3383
+ 0,
3384
+ 0,
3385
+ 0,
3386
+ 0,
3387
+ 0,
3388
+ 5,
3389
+ 6,
3390
+ 7,
3391
+ 8,
3392
+ 9,
3393
+ 10,
3394
+ 12,
3395
+ 14,
3396
+ 16,
3397
+ 18
3398
+ ],
3399
+ [
3400
+ 120,
3401
+ 0,
3402
+ 0,
3403
+ 0,
3404
+ 0,
3405
+ 0,
3406
+ 6,
3407
+ 7,
3408
+ 8,
3409
+ 9,
3410
+ 10,
3411
+ 11,
3412
+ 13,
3413
+ 15,
3414
+ 17,
3415
+ 19
3416
+ ],
3417
+ [
3418
+ 130,
3419
+ 0,
3420
+ 0,
3421
+ 0,
3422
+ 0,
3423
+ 0,
3424
+ 7,
3425
+ 8,
3426
+ 9,
3427
+ 10,
3428
+ 11,
3429
+ 12,
3430
+ 14,
3431
+ 16,
3432
+ 18,
3433
+ 20
3434
+ ],
3435
+ [
3436
+ 140,
3437
+ 0,
3438
+ 0,
3439
+ 0,
3440
+ 0,
3441
+ 0,
3442
+ 8,
3443
+ 9,
3444
+ 10,
3445
+ 11,
3446
+ 12,
3447
+ 13,
3448
+ 15,
3449
+ 17,
3450
+ 19,
3451
+ 21
3452
+ ],
3453
+ [
3454
+ 150,
3455
+ 0,
3456
+ 0,
3457
+ 0,
3458
+ 0,
3459
+ 0,
3460
+ 9,
3461
+ 10,
3462
+ 11,
3463
+ 12,
3464
+ 13,
3465
+ 14,
3466
+ 16,
3467
+ 18,
3468
+ 20,
3469
+ 22
3470
+ ]
3471
+ ];
3472
+ //#endregion
3473
+ //#region src/lib/manage/version.ts
3474
+ function getVersion(data) {
3475
+ if ("meta" in data) {
3476
+ const meta = data.meta;
3477
+ if (typeof meta === "object" && meta !== null && "version" in meta && typeof meta.version === "number") return meta.version;
3478
+ }
3479
+ if ("version" in data && typeof data.version === "number") return data.version;
3480
+ }
3481
+ //#endregion
3482
+ //#region src/lib/manage/migrate.ts
3483
+ const migrators = {
3484
+ 1: migrateV1ToV2,
3485
+ 2: migrateV2ToV3
3486
+ };
3487
+ /**
3488
+ * 입력 장비 정보를 목표 버전으로 마이그레이션합니다.
3489
+ * 이 함수가 성공한 이후에는 입력 장비 정보 객체를 사용할 수 없습니다.
3490
+ *
3491
+ * @param data 마이그레이션할 장비 정보.
3492
+ * @param version 목표 버전.
3493
+ * @returns 목표 버전으로 마이그레이션된 장비 정보.
3494
+ *
3495
+ * @throws {@link TypeError}
3496
+ * 입력 데이터가 유효하지 않은 경우.
3497
+ * 입력 데이터의 버전이 잘못되었거나 지원하는 버전보다 최신인 경우.
3498
+ */
3499
+ function migrate(data, version = 3) {
3500
+ let currentVersion = getVersion(data);
3501
+ if (currentVersion === void 0) throw new TypeError(ErrorMessage.Migrate_InvalidGearData);
3502
+ if (currentVersion > version) throw new TypeError(ErrorMessage.Migrate_DataVersionTooNew);
3503
+ while (currentVersion < version) {
3504
+ if (!(currentVersion in migrators)) throw new TypeError(ErrorMessage.Migrate_UnknownDataVersion);
3505
+ data = migrators[currentVersion](data);
3506
+ currentVersion++;
3507
+ }
3508
+ return data;
3509
+ }
3510
+ function migrateV1ToV2(data) {
3511
+ if ("id" in data && data.id !== void 0 || "version" in data && data.version !== void 0) throw new TypeError(ErrorMessage.Migrate_DataPropertyWillBeOverwritten);
3512
+ if (!("meta" in data && typeof data.meta === "object" && data.meta !== null && "id" in data.meta && typeof data.meta.id === "number")) throw new TypeError("Assert: id should exist");
3513
+ const { meta, ...rest } = data;
3514
+ return {
3515
+ ...rest,
3516
+ id: meta.id,
3517
+ version: 2
3518
+ };
3519
+ }
3520
+ function migrateV2ToV3(data) {
3521
+ if ("req" in data && data.req !== void 0 && typeof data.req === "object" && data.req !== null && "class" in data.req && data.req.class !== void 0) {
3522
+ if (typeof data.req.class !== "number") throw new TypeError(ErrorMessage.Migrate_InvalidGearData);
3523
+ data.req.class = [data.req.class];
3524
+ }
3525
+ data.version = 3;
3526
+ return data;
3527
+ }
3528
+ //#endregion
3529
+ //#region src/lib/GearAttribute.ts
3530
+ var GearAttribute = class {
3531
+ /** 장비 속성 정보 */
3532
+ data;
3533
+ constructor(data) {
3534
+ this.data = data;
3535
+ }
3536
+ /** 고유 아이템 */
3537
+ get only() {
3538
+ return this.data.only ?? false;
3539
+ }
3540
+ /** 교환 가능 여부 */
3541
+ get trade() {
3542
+ return this.data.trade ?? 0;
3543
+ }
3544
+ set trade(value) {
3545
+ this.data.trade = value;
3546
+ }
3547
+ /** 고유장착 아이템 */
3548
+ get onlyEquip() {
3549
+ return this.data.onlyEquip ?? false;
3550
+ }
3551
+ /** 월드 내 나의 캐릭터 간 이동 가능 여부 */
3552
+ get share() {
3553
+ return this.data.share ?? 0;
3554
+ }
3555
+ /** 슈페리얼 */
3556
+ get superior() {
3557
+ return this.data.superior ?? false;
3558
+ }
3559
+ /** 공격 속도 */
3560
+ get attackSpeed() {
3561
+ return this.data.attackSpeed;
3562
+ }
3563
+ /** 주문서 강화 가능 여부 */
3564
+ get canScroll() {
3565
+ return this.data.canScroll ?? 0;
3566
+ }
3567
+ /** 스타포스 강화 가능 여부 */
3568
+ get canStarforce() {
3569
+ return this.data.canStarforce ?? 0;
3570
+ }
3571
+ /** 추가옵션 설정 가능 여부 */
3572
+ get canAddOption() {
3573
+ return this.data.canAddOption ?? 0;
3574
+ }
3575
+ /** 잠재능력 설정 가능 여부 */
3576
+ get canPotential() {
3577
+ return this.data.canPotential ?? 0;
3578
+ }
3579
+ /** 에디셔널 잠재능력 설정 가능 여부 */
3580
+ get canAdditionalPotential() {
3581
+ return this.data.canAdditionalPotential ?? 0;
3582
+ }
3583
+ /** 스페셜 아이템 여부 */
3584
+ get specialGrade() {
3585
+ return this.data.specialGrade ?? false;
3586
+ }
3587
+ /** 최대 스타포스 강화 단계 */
3588
+ get fixedMaxStar() {
3589
+ return this.data.fixedMaxStar;
3590
+ }
3591
+ /** 카르마의 가위 사용 가능 여부 */
3592
+ get cuttable() {
3593
+ return this.data.cuttable ?? 0;
3594
+ }
3595
+ /** 가위 사용 가능 횟수 */
3596
+ get cuttableCount() {
3597
+ return this.data.cuttableCount;
3598
+ }
3599
+ set cuttableCount(value) {
3600
+ this.data.cuttableCount = value;
3601
+ }
3602
+ /** 최대 가위 사용 가능 횟수 */
3603
+ get totalCuttableCount() {
3604
+ return this.data.totalCuttableCount;
3605
+ }
3606
+ /** 쉐어 네임 텍을 사용 가능 여부 */
3607
+ get accountShareTag() {
3608
+ return this.data.accountShareTag ?? false;
3609
+ }
3610
+ /** 훈장 신비의 모루 사용 불가 여부 */
3611
+ get noShapeChange() {
3612
+ return this.data.noShapeChange ?? false;
3613
+ }
3614
+ /** 세트 효과 ID */
3615
+ get setItemId() {
3616
+ return this.data.setItemId;
3617
+ }
3618
+ /** 럭키 아이템 */
3619
+ get lucky() {
3620
+ return this.data.lucky ?? false;
3621
+ }
3622
+ /** 장착 시 획득 경험치 */
3623
+ get incline() {
3624
+ return {
3625
+ charisma: 0,
3626
+ insight: 0,
3627
+ will: 0,
3628
+ craft: 0,
3629
+ sense: 0,
3630
+ charm: 0,
3631
+ ...this.data.incline
3632
+ };
3633
+ }
3634
+ set incline(value) {
3635
+ this.data.incline = value;
3636
+ }
3637
+ /** 보스 드롭 여부 */
3638
+ get bossReward() {
3639
+ return this.data.bossReward ?? false;
3640
+ }
3641
+ /** 사용 가능 스킬 */
3642
+ get skills() {
3643
+ return this.data.skills ?? [];
3644
+ }
3645
+ /** 성장 경험치 */
3646
+ get growthExp() {
3647
+ return this.data.growthExp;
3648
+ }
3649
+ set growthExp(value) {
3650
+ if (value === void 0 || 0 <= value && value <= 100) this.data.growthExp = value;
3651
+ }
3652
+ /** 성장 레벨 */
3653
+ get growthLevel() {
3654
+ return this.data.growthLevel;
3655
+ }
3656
+ set growthLevel(value) {
3657
+ this.data.growthLevel = value;
3658
+ }
3659
+ /** 장비 유효 기간(KST) */
3660
+ get dateExpire() {
3661
+ return this.data.dateExpire;
3662
+ }
3663
+ set dateExpire(value) {
3664
+ if (value === void 0 || !Number.isNaN(Date.parse(value))) this.data.dateExpire = value;
3665
+ }
3666
+ };
3667
+ //#endregion
3668
+ //#region src/lib/GearReq.ts
3669
+ /**
3670
+ * 장비 착용 제한
3671
+ */
3672
+ var GearReq = class {
3673
+ /**
3674
+ * 장비 착용 제한 정보
3675
+ */
3676
+ data;
3677
+ /**
3678
+ * 장비 착용 제한 정보를 참조하는 장비 착용 제한 인스턴스를 생성합니다.
3679
+ */
3680
+ constructor(data) {
3681
+ this.data = data;
3682
+ }
3683
+ /**
3684
+ * 기본 착용 가능 레벨
3685
+ */
3686
+ get level() {
3687
+ return this.data.level ?? 0;
3688
+ }
3689
+ /**
3690
+ * 착용 가능 레벨 증가
3691
+ */
3692
+ get levelIncrease() {
3693
+ return this.data.levelIncrease ?? 0;
3694
+ }
3695
+ /**
3696
+ * 착용 가능 직업 분류
3697
+ * */
3698
+ get job() {
3699
+ return this.data.job ?? 0;
3700
+ }
3701
+ /**
3702
+ * 착용 가능 직업
3703
+ */
3704
+ get class() {
3705
+ return this.data.class ?? [];
3706
+ }
3707
+ /**
3708
+ * 착용 가능 성별
3709
+ */
3710
+ get gender() {
3711
+ return this.data.gender;
3712
+ }
3713
+ /**
3714
+ * 초보자 및 전 직업 착용 가능 여부를 계산합니다.
3715
+ * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3716
+ */
3717
+ beginner() {
3718
+ return this.job === 0;
3719
+ }
3720
+ /**
3721
+ * 전사 착용 가능 여부를 계산합니다.
3722
+ * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3723
+ */
3724
+ warrior() {
3725
+ return this.job === 0 || (this.job & 1) != 0;
3726
+ }
3727
+ /**
3728
+ * 마법사 착용 가능 여부를 계산합니다.
3729
+ * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3730
+ */
3731
+ magician() {
3732
+ return this.job === 0 || (this.job & 2) != 0;
3733
+ }
3734
+ /**
3735
+ * 궁수 착용 가능 여부를 계산합니다.
3736
+ * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3737
+ */
3738
+ bowman() {
3739
+ return this.job === 0 || (this.job & 4) != 0;
3740
+ }
3741
+ /**
3742
+ * 도적 착용 가능 여부를 계산합니다.
3743
+ * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3744
+ */
3745
+ thief() {
3746
+ return this.job === 0 || (this.job & 8) != 0;
3747
+ }
3748
+ /**
3749
+ * 해적 착용 가능 여부를 계산합니다.
3750
+ * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3751
+ */
3752
+ pirate() {
3753
+ return this.job === 0 || (this.job & 16) != 0;
3754
+ }
3755
+ };
3756
+ //#endregion
3757
+ //#region src/lib/ReadonlyGear.ts
3758
+ /**
3759
+ * 장비 (읽기 전용)
3760
+ *
3761
+ * 생성자에 전달된 장비 정보와 `data` 속성 간에 엄격한 동등(`===`)을 보장합니다.
3762
+ *
3763
+ * 장비 정보의 모든 속성에 대해 읽기 전용 속성을 제공합니다.
3764
+ */
3765
+ var ReadonlyGear = class {
3766
+ /** 장비 정보 */
3767
+ _data;
3768
+ /**
3769
+ * 장비 정보를 참조하는 장비 인스턴스를 생성합니다.
3770
+ * @param data 장비 정보.
3771
+ *
3772
+ * @throws {@link GearError}
3773
+ * 지원하지 않는 장비 정보 버전일 경우.
3774
+ */
3775
+ constructor(data) {
3776
+ if (data.version !== 3) throw new GearError(ErrorMessage.Constructor_InvalidVersion, {
3777
+ id: data.id,
3778
+ name: data.name
3779
+ }, {
3780
+ expected: 3,
3781
+ actual: data.version
3782
+ });
3783
+ this._data = data;
3784
+ }
3785
+ /**
3786
+ * 장비 정보
3787
+ */
3788
+ get data() {
3789
+ return this._data;
3790
+ }
3791
+ /**
3792
+ * 장비 정보 버전
3793
+ */
3794
+ get version() {
3795
+ return this.data.version;
3796
+ }
3797
+ /**
3798
+ * 장비 ID
3799
+ */
3800
+ get id() {
3801
+ return this.data.id;
3802
+ }
3803
+ /**
3804
+ * 장비명
3805
+ */
3806
+ get name() {
3807
+ return this.data.name;
3808
+ }
3809
+ /**
3810
+ * 장비 아이콘
3811
+ */
3812
+ get icon() {
3813
+ return this.data.icon;
3814
+ }
3815
+ /**
3816
+ * 장비 설명
3817
+ */
3818
+ get desc() {
3819
+ return this.data.desc;
3820
+ }
3821
+ /**
3822
+ * 장비 외형
3823
+ */
3824
+ get shape() {
3825
+ return this.data.shape;
3826
+ }
3827
+ /**
3828
+ * 장비 외형 아이콘
3829
+ *
3830
+ * 장비 외형이 설정되었을 경우 장비 외형 아이콘, 그렇지 않을 경우 장비 아이콘.
3831
+ */
3832
+ get shapeIcon() {
3833
+ return this.shape?.icon ?? this.icon;
3834
+ }
3835
+ /**
3836
+ * 이름 새기기
3837
+ */
3838
+ get itemTag() {
3839
+ return this.data.itemTag;
3840
+ }
3841
+ /**
3842
+ * 장비 분류
3843
+ */
3844
+ get type() {
3845
+ return this.data.type;
3846
+ }
3847
+ /**
3848
+ * 장비 착용 제한
3849
+ */
3850
+ get req() {
3851
+ return new GearReq(this.data.req);
3852
+ }
3853
+ /**
3854
+ * 장비 속성
3855
+ */
3856
+ get attributes() {
3857
+ return new GearAttribute(this.data.attributes);
3858
+ }
3859
+ /**
3860
+ * 장비 최종 옵션
3861
+ *
3862
+ * 기본 옵션, 추가 옵션, 주문서 옵션, 스타포스 옵션의 합.
3863
+ *
3864
+ * 익셉셔널 옵션은 미포함.
3865
+ */
3866
+ get totalOption() {
3867
+ return toGearOption(sumOptions(this.baseOption, this.addOption, this.upgradeOption, this.starforceOption));
3868
+ }
3869
+ /**
3870
+ * 장비 순수 옵션
3871
+ */
3872
+ get baseOption() {
3873
+ return toGearOption(this.data.baseOption ?? {});
3874
+ }
3875
+ /**
3876
+ * 장비 추가 옵션
3877
+ */
3878
+ get addOption() {
3879
+ return toGearOption(this.data.addOption ?? {});
3880
+ }
3881
+ /**
3882
+ * 장비 주문서 강화 옵션
3883
+ */
3884
+ get upgradeOption() {
3885
+ return toGearOption(this.data.upgradeOption ?? {});
3886
+ }
3887
+ /**
3888
+ * 장비 스타포스 옵션
3889
+ */
3890
+ get starforceOption() {
3891
+ return toGearOption(this.data.starforceOption ?? {});
3892
+ }
3893
+ /**
3894
+ * 추가 옵션 목록
3895
+ */
3896
+ get addOptions() {
3897
+ return this.data.addOptions ?? [];
3898
+ }
3899
+ /**
3900
+ * 업그레이드 횟수
3901
+ */
3902
+ get scrollUpgradeCount() {
3903
+ return this.data.scrollUpgradeCount ?? 0;
3904
+ }
3905
+ /**
3906
+ * 복구 가능 횟수
3907
+ */
3908
+ get scrollResilienceCount() {
3909
+ return this.data.scrollResilienceCount ?? 0;
3910
+ }
3911
+ /**
3912
+ * 업그레이드 가능 횟수
3913
+ */
3914
+ get scrollUpgradeableCount() {
3915
+ return this.data.scrollUpgradeableCount ?? 0;
3916
+ }
3917
+ /**
3918
+ * 전체 업그레이드 가능 횟수
3919
+ *
3920
+ * 성공, 실패, 황금 망치 적용 여부를 무시한 장비의 기본 업그레이드 가능 횟수입니다.
3921
+ */
3922
+ get scrollTotalUpgradeableCount() {
3923
+ return this.scrollUpgradeCount + this.scrollUpgradeableCount + this.scrollResilienceCount;
3924
+ }
3925
+ /**
3926
+ * 스타포스 강화 단계
3927
+ */
3928
+ get star() {
3929
+ return this.data.star ?? 0;
3930
+ }
3931
+ /**
3932
+ * 최대 스타포스 강화 단계
3933
+ *
3934
+ * 놀라운 장비 강화 주문서가 사용되었을 경우 최대 `15`입니다.
3935
+ */
3936
+ get maxStar() {
3937
+ return getMaxStar(this);
3938
+ }
3939
+ /**
3940
+ * 놀라운 장비 강화 주문서 사용 여부
3941
+ */
3942
+ get starScroll() {
3943
+ return this.data.starScroll ?? false;
3944
+ }
3945
+ /**
3946
+ * 소울 인챈트 여부
3947
+ */
3948
+ get soulEnchanted() {
3949
+ return this.data.soulSlot !== void 0;
3950
+ }
3951
+ /**
3952
+ * 소울
3953
+ */
3954
+ get soul() {
3955
+ if (!this.data.soulSlot?.soul) return;
3956
+ return {
3957
+ ...this.data.soulSlot.soul,
3958
+ option: toGearOption(this.data.soulSlot.soul.option)
3959
+ };
3960
+ }
3961
+ /**
3962
+ * 소울 충전량
3963
+ */
3964
+ get soulCharge() {
3965
+ return this.data.soulSlot?.charge ?? 0;
3966
+ }
3967
+ /**
3968
+ * 소울 충전 옵션
3969
+ */
3970
+ get soulChargeOption() {
3971
+ return toGearOption(this.data.soulSlot?.chargeOption ?? {});
3972
+ }
3973
+ /**
3974
+ * 잠재능력 등급
3975
+ */
3976
+ get potentialGrade() {
3977
+ return this.data.potentialGrade ?? PotentialGrade.Normal;
3978
+ }
3979
+ /**
3980
+ * 잠재능력 목록
3981
+ */
3982
+ get potentials() {
3983
+ if (!this.data.potentials) return [];
3984
+ return this.data.potentials.map((potential) => ({
3985
+ ...potential,
3986
+ option: toGearOption(potential.option)
3987
+ }));
3988
+ }
3989
+ /**
3990
+ * 에디셔널 잠재능력 등급
3991
+ */
3992
+ get additionalPotentialGrade() {
3993
+ return this.data.additionalPotentialGrade ?? PotentialGrade.Normal;
3994
+ }
3995
+ /**
3996
+ * 에디셔널 잠재능력 목록
3997
+ */
3998
+ get additionalPotentials() {
3999
+ if (!this.data.additionalPotentials) return [];
4000
+ return this.data.additionalPotentials.map((potential) => ({
4001
+ ...potential,
4002
+ option: toGearOption(potential.option)
4003
+ }));
4004
+ }
4005
+ /**
4006
+ * 장비 익셉셔널 옵션
4007
+ */
4008
+ get exceptionalOption() {
4009
+ return toGearOption(this.data.exceptionalOption ?? {});
4010
+ }
4011
+ /**
4012
+ * 익셉셔널 강화 횟수
4013
+ */
4014
+ get exceptionalUpgradeCount() {
4015
+ return this.data.exceptionalUpgradeCount ?? 0;
4016
+ }
4017
+ /**
4018
+ * 익셉셔널 강화 가능 횟수
4019
+ */
4020
+ get exceptionalUpgradeableCount() {
4021
+ return this.data.exceptionalUpgradeableCount ?? 0;
4022
+ }
4023
+ /**
4024
+ * 전체 익셉셔널 강화 가능 횟수
4025
+ */
4026
+ get exceptionalTotalUpgradeableCount() {
4027
+ return this.exceptionalUpgradeCount + this.exceptionalUpgradeableCount;
4028
+ }
4029
+ };
4030
+ //#endregion
4031
+ //#region src/lib/Gear.ts
4032
+ /**
4033
+ * 장비
4034
+ *
4035
+ * 장비 정보를 KMS과 동일한 방식으로 변경하는 기능을 제공합니다.
4036
+ * - `supports...`: 장비가 특정 강화 방식을 지원하는지 여부입니다.
4037
+ * - `can...`: 장비에 특정 강화를 적용할 수 있는 상태인지 여부입니다.
4038
+ * - `apply...()`: 장비에 특정 강화를 적용합니다.
4039
+ * - `set...()`: 장비의 특정 속성을 설정합니다.
4040
+ * - `reset...()`: 장비의 특정 강화에 관련된 속성을 초기화합니다.
4041
+ *
4042
+ * 생성자에 전달된 장비 정보와 `data` 속성 간에 엄격한 동등(`===`)을 보장합니다.
4043
+ *
4044
+ * 장비 정보의 모든 속성에 대해 읽기 전용 속성을 제공합니다.
4045
+ * 일부 속성은 장비 객체 자체에 또는 반환 객체의 속성에 쓰기가 가능합니다.
4046
+ */
4047
+ var Gear = class extends ReadonlyGear {
4048
+ /**
4049
+ * 장비 정보
4050
+ */
4051
+ get data() {
4052
+ return this._data;
4053
+ }
4054
+ /**
4055
+ * 장비 외형
4056
+ */
4057
+ get shape() {
4058
+ return this.data.shape;
4059
+ }
4060
+ /**
4061
+ * 장비 외형 변경
4062
+ *
4063
+ * @param shape 변경할 장비 외형.
4064
+ *
4065
+ * @throws {@link GearError}
4066
+ * 외형을 변경할 수 없는 장비일 경우.
4067
+ */
4068
+ set shape(shape) {
4069
+ if (this.attributes.noShapeChange) throw new GearError(ErrorMessage.Shape_InvalidShapeChangeGear, this, { "attributes.noShapeChange": this.attributes.noShapeChange });
4070
+ this.data.shape = shape;
4071
+ }
4072
+ /**
4073
+ * 이름 새기기
4074
+ */
4075
+ get itemTag() {
4076
+ return this.data.itemTag;
4077
+ }
4078
+ /**
4079
+ * 이름 새기기 변경
4080
+ *
4081
+ * @param itemTag 적용할 이름.
4082
+ */
4083
+ set itemTag(itemTag) {
4084
+ this.data.itemTag = itemTag;
4085
+ }
4086
+ /**
4087
+ * 장비가 추가 옵션을 지원하는지 여부
4088
+ */
4089
+ get supportsAddOption() {
4090
+ return supportsAddOption(this);
4091
+ }
4092
+ /**
4093
+ * 장비에 추가 옵션을 적용할 수 있는 상태인지 여부
4094
+ */
4095
+ get canApplyAddOption() {
4096
+ return canApplyAddOption(this);
4097
+ }
4098
+ /**
4099
+ * 장비에 추가 옵션을 적용합니다.
4100
+ * @param type 추가 옵션 종류.
4101
+ * @param grade 추가 옵션 단계.
4102
+ *
4103
+ * @throws {@link GearError}
4104
+ * 추가 옵션을 적용할 수 없는 상태일 경우.
4105
+ *
4106
+ * @throws {@link GearError}
4107
+ * 부여할 수 없는 추가 옵션을 지정했을 경우.
4108
+ */
4109
+ applyAddOption(type, grade) {
4110
+ applyAddOption(this, type, grade);
4111
+ }
4112
+ /**
4113
+ * 장비의 추가 옵션을 초기화할 수 있는 상태인지 여부
4114
+ */
4115
+ get canResetAddOption() {
4116
+ return canResetAddOption(this);
4117
+ }
4118
+ /**
4119
+ * 장비의 추가 옵션을 초기화합니다.
4120
+ *
4121
+ * @throws {@link GearError}
4122
+ * 추가 옵션을 초기화할 수 없는 상태의 장비일 경우.
4123
+ */
4124
+ resetAddOption() {
4125
+ resetAddOption(this);
4126
+ }
4127
+ /**
4128
+ * 장비가 주문서 강화를 지원하는지 여부
4129
+ */
4130
+ get supportsUpgrade() {
4131
+ return supportsUpgrade(this);
4132
+ }
4133
+ /**
4134
+ * 장비에 주문서 실패를 적용할 수 있는 상태인지 여부
4135
+ */
4136
+ get canApplyScrollFail() {
4137
+ return canFailScroll(this);
4138
+ }
4139
+ /**
4140
+ * 장비에 주문서 실패를 1회 적용합니다.
4141
+ *
4142
+ * @throws {@link GearError}
4143
+ * 주문서 실패를 적용할 수 없는 상태일 경우.
4144
+ */
4145
+ applyScrollFail() {
4146
+ failScroll(this);
4147
+ }
4148
+ /**
4149
+ * 장비의 주문서 실패로 차감된 업그레이드 가능 횟수를 복구할 수 있는 상태인지 여부
4150
+ */
4151
+ get canApplyResileScroll() {
4152
+ return canResileScroll(this);
4153
+ }
4154
+ /**
4155
+ * 장비의 주문서 실패로 차감된 업그레이드 가능 횟수를 1회 복구합니다.
4156
+ *
4157
+ * @throws {@link GearError}
4158
+ * 업그레이드 가능 횟수를 복구할 수 없는 상태일 경우.
4159
+ */
4160
+ applyResileScroll() {
4161
+ resileScroll(this);
4162
+ }
4163
+ /**
4164
+ * 장비의 주문서 강화를 초기화할 수 있는 상태인지 여부
4165
+ */
4166
+ get canResetUpgrade() {
4167
+ return canResetUpgrade(this);
4168
+ }
4169
+ /**
4170
+ * 장비의 주문서 강화를 초기화합니다.
4171
+ *
4172
+ * @throws {@link GearError}
4173
+ * 주문서 강화를 초기화할 수 없는 장비일 경우.
4174
+ */
4175
+ resetUpgrade() {
4176
+ resetUpgrade(this);
4177
+ if (canRecalculateStarforce(this)) recalculateStarforce(this);
4178
+ }
4179
+ /**
4180
+ * 장비에 주문서를 적용할 수 있는 상태인지 여부
4181
+ */
4182
+ get canApplyScroll() {
4183
+ return canApplyScroll(this);
4184
+ }
4185
+ /**
4186
+ * 장비에 주문서를 1회 적용합니다.
4187
+ * @param scroll 적용할 주문서.
4188
+ *
4189
+ * @throws {@link GearError}
4190
+ * 주문서를 적용할 수 없는 상태일 경우.
4191
+ */
4192
+ applyScroll(scroll) {
4193
+ applyScroll(this, scroll);
4194
+ if (canRecalculateStarforce(this)) recalculateStarforce(this);
4195
+ }
4196
+ /**
4197
+ * 장비에 주문의 흔적 강화를 1회 적용합니다.
4198
+ * @param type 주문의 흔적 종류.
4199
+ * @param rate 주문의 흔적 성공 확률.
4200
+ *
4201
+ * @throws {@link GearError}
4202
+ * 주문서를 적용할 수 없는 상태일 경우.
4203
+ *
4204
+ * @throws {@link GearError}
4205
+ * 적용할 수 없는 주문의 흔적을 지정했을 경우.
4206
+ */
4207
+ applySpellTrace(type, rate) {
4208
+ applySpellTrace(this, type, rate);
4209
+ if (canRecalculateStarforce(this)) recalculateStarforce(this);
4210
+ }
4211
+ /**
4212
+ * 장비가 스타포스 강화를 지원하는지 여부
4213
+ */
4214
+ get supportsStarforce() {
4215
+ return supportsStarforce(this);
4216
+ }
4217
+ /**
4218
+ * 장비에 스타포스 강화를 적용할 수 있는 상태인지 여부
4219
+ */
4220
+ get canApplyStarforce() {
4221
+ return canStarforce(this);
4222
+ }
4223
+ /**
4224
+ * 장비에 스타포스 강화를 1회 적용합니다.
4225
+ *
4226
+ * @throws {@link GearError}
4227
+ * 스타포스 강화를 적용할 수 없는 경우.
4228
+ */
4229
+ applyStarforce() {
4230
+ starforce(this);
4231
+ }
4232
+ /**
4233
+ * 장비에 최대 강화 단계를 무시하고 스타포스 강화를 적용할 수 있는 상태인지 여부
4234
+ */
4235
+ get canApplyStarforceIgnoringMaxStar() {
4236
+ return canStarforce(this, true);
4237
+ }
4238
+ /**
4239
+ * 장비에 최대 강화 단계를 무시하고 스타포스 강화를 1회 적용합니다.
4240
+ *
4241
+ * @throws {@link GearError}
4242
+ * 스타포스 강화를 적용할 수 없는 경우.
4243
+ */
4244
+ applyStarforceIgnoringMaxStar() {
4245
+ starforce(this, true);
4246
+ }
4247
+ /**
4248
+ * 장비에 놀라운 장비 강화 주문서를 적용할 수 있는 상태인지 여부
4249
+ */
4250
+ get canApplyStarScroll() {
4251
+ return canStarScroll(this);
4252
+ }
4253
+ /**
4254
+ * 장비에 놀라운 장비 강화 주문서를 1회 적용합니다.
4255
+ * @param bonus 보너스 스탯 적용 여부.
4256
+ *
4257
+ * @throws {@link GearError}
4258
+ * 놀라운 장비 강화 주문서를 적용할 수 없는 경우.
4259
+ */
4260
+ applyStarScroll(bonus = false) {
4261
+ starScroll(this, bonus);
4262
+ }
4263
+ /**
4264
+ * 장비에 놀라운 장비 강화 주문서를 적용할 수 있는 상태인지 여부
4265
+ */
4266
+ get canApplyStarScrollIgnoringMaxStar() {
4267
+ return canStarScroll(this, true);
4268
+ }
4269
+ /**
4270
+ * 장비에 놀라운 장비 강화 주문서를 1회 적용합니다.
4271
+ * @param bonus 보너스 스탯 적용 여부.
4272
+ *
4273
+ * @throws {@link GearError}
4274
+ * 놀라운 장비 강화 주문서를 적용할 수 없는 경우.
4275
+ */
4276
+ applyStarScrollIgnoringMaxStar(bonus = false) {
4277
+ starScroll(this, bonus, true);
4278
+ }
4279
+ /**
4280
+ * 장비의 스타포스 강화를 초기화할 수 있는지 여부
4281
+ */
4282
+ get canResetStarforce() {
4283
+ return canResetStarforce(this);
4284
+ }
4285
+ /**
4286
+ * 장비의 스타포스 강화를 초기화합니다.
4287
+ */
4288
+ resetStarforce() {
4289
+ resetStarforce(this);
4290
+ }
4291
+ /**
4292
+ * 장비가 잠재능력을 지원하는지 여부
4293
+ */
4294
+ get supportsPotential() {
4295
+ return supportsPotential(this);
4296
+ }
4297
+ /**
4298
+ * 장비의 잠재능력을 설정할 수 있는지 여부
4299
+ */
4300
+ get canSetPotential() {
4301
+ return canSetPotential(this);
4302
+ }
4303
+ /**
4304
+ * 장비의 잠재능력을 설정합니다.
4305
+ *
4306
+ * `grade`는 `PotentialGrade.Normal`일 수 없습니다.
4307
+ *
4308
+ * `options`에 포함된 잠재옵션은 1개 이상 3개 이하여야 합니다.
4309
+ * @param grade 잠재능력 등급.
4310
+ * @param options 잠재옵션 목록.
4311
+ *
4312
+ * @throws {@link GearError}
4313
+ * 잠재능력을 설정할 수 없는 경우.
4314
+ *
4315
+ * @throws {@link RangeError}
4316
+ * 설정하려는 잠재능력 등급이 Normal일 경우.
4317
+ *
4318
+ * @throws {@link TypeError}
4319
+ * 잘못된 잠재옵션 목록을 지정했을 경우.
4320
+ */
4321
+ setPotential(grade, options) {
4322
+ setPotential(this, grade, options);
4323
+ }
4324
+ /**
4325
+ * 장비의 잠재능력을 초기화합니다.
4326
+ *
4327
+ * 에디셔널 잠재능력은 변경되지 않습니다.
4328
+ *
4329
+ * @throws {@link GearError}
4330
+ * 잠재능력을 초기화할 수 없는 경우.
4331
+ */
4332
+ resetPotential() {
4333
+ resetPotential(this);
4334
+ }
4335
+ /**
4336
+ * 장비가 에디셔널 잠재능력을 지원하는지 여부
4337
+ */
4338
+ get supportsAdditionalPotential() {
4339
+ return supportsAdditionalPotential(this);
4340
+ }
4341
+ /**
4342
+ * 장비의 에디셔널 잠재능력을 설정할 수 있는지 여부
4343
+ */
4344
+ get canSetAdditionalPotential() {
4345
+ return canSetAdditionalPotential(this);
4346
+ }
4347
+ /**
4348
+ * 장비의 에디셔널 잠재능력을 설정합니다.
4349
+ *
4350
+ * `grade`는 `PotentialGrade.Normal`일 수 없습니다.
4351
+ *
4352
+ * `options`에 포함된 에디셔널 잠재옵션은 1개 이상 3개 이하여야 합니다.
4353
+ * @param grade 에디셔널 잠재능력 등급.
4354
+ * @param options 에디셔널 잠재옵션 목록.
4355
+ *
4356
+ * @throws {@link GearError}
4357
+ * 에디셔널 잠재능력을 설정할 수 없는 경우.
4358
+ *
4359
+ * @throws {@link RangeError}
4360
+ * 설정하려는 에디셔널 잠재능력 등급이 Normal일 경우.
4361
+ *
4362
+ * @throws {@link TypeError}
4363
+ * 잘못된 에디셔널 잠재옵션 목록을 지정했을 경우.
4364
+ */
4365
+ setAdditionalPotential(grade, options) {
4366
+ setAdditionalPotential(this, grade, options);
4367
+ }
4368
+ /**
4369
+ * 장비의 에디셔널 잠재능력을 초기화합니다.
4370
+ *
4371
+ * @throws {@link GearError}
4372
+ * 에디셔널 잠재능력을 초기화할 수 없는 경우.
4373
+ */
4374
+ resetAdditionalPotential() {
4375
+ resetAdditionalPotential(this);
4376
+ }
4377
+ /**
4378
+ * 장비가 소울웨폰을 지원하는지 여부
4379
+ */
4380
+ get supportsSoul() {
4381
+ return supportsSoul(this);
4382
+ }
4383
+ /**
4384
+ * 장비에 소울 인챈터를 적용할 수 있는 상태인지 여부
4385
+ */
4386
+ get canApplySoulEnchant() {
4387
+ return canApplySoulEnchant(this);
4388
+ }
4389
+ /**
4390
+ * 장비에 소울 인챈터를 적용합니다.
4391
+ */
4392
+ applySoulEnchant() {
4393
+ applySoulEnchant(this);
4394
+ }
4395
+ /**
4396
+ * 장비에 소울을 장착할 수 있는지 여부
4397
+ */
4398
+ get canSetSoul() {
4399
+ return canSetSoul(this);
4400
+ }
4401
+ /**
4402
+ * 장비에 소울을 장착합니다.
4403
+ * @param soul 장착할 소울 아이템.
4404
+ *
4405
+ * @throws {@link GearError}
4406
+ * 소울을 장착할 수 없는 경우.
4407
+ */
4408
+ setSoul(soul) {
4409
+ setSoul(this, soul);
4410
+ }
4411
+ /**
4412
+ * 장비의 소울 충전량을 설정할 수 있는지 여부
4413
+ */
4414
+ get canSetSoulCharge() {
4415
+ return canSetSoulCharge(this);
4416
+ }
4417
+ /**
4418
+ * 장비의 소울 충전량을 설정합니다.
4419
+ * @param charge 소울 충전량.
4420
+ *
4421
+ * @throws {@link GearError}
4422
+ * 소울 충전량을 설정할 수 없는 경우.
4423
+ */
4424
+ setSoulCharge(charge) {
4425
+ setSoulCharge(this, charge);
4426
+ }
4427
+ /**
4428
+ * 장비의 소울웨폰을 초기화합니다.
4429
+ */
4430
+ resetSoulEnchant() {
4431
+ resetSoulEnchant(this);
4432
+ }
4433
+ /**
4434
+ * 장비가 익셉셔널 강화를 지원하는지 여부
4435
+ */
4436
+ get supportsExceptional() {
4437
+ return supportsExceptional(this);
4438
+ }
4439
+ /**
4440
+ * 장비에 익셉셔널 강화를 적용할 수 있는지 여부
4441
+ */
4442
+ get canApplyExceptional() {
4443
+ return canApplyExceptional(this);
4444
+ }
4445
+ /**
4446
+ * 장비에 익셉셔널 강화를 적용합니다.
4447
+ * @param exceptionalHammer 적용할 익셉셔널 해머.
4448
+ *
4449
+ * @throws {@link GearError}
4450
+ * 익셉셔널 강화를 적용할 수 없는 상태일 경우.
4451
+ */
4452
+ applyExceptional(exceptionalHammer) {
4453
+ applyExceptional(this, exceptionalHammer);
4454
+ }
4455
+ /**
4456
+ * 장비의 익셉셔널 강화를 초기화할 수 있는지 여부
4457
+ */
4458
+ get canResetExceptional() {
4459
+ return canResetExceptional(this);
4460
+ }
4461
+ /**
4462
+ * 장비의 익셉셔널 강화를 초기화합니다.
4463
+ *
4464
+ * @throws {@link GearError}
4465
+ * 익셉셔널 강화를 초기화할 수 없는 경우.
4466
+ */
4467
+ resetExceptional() {
4468
+ resetExceptional(this);
4469
+ }
4470
+ };
4471
+ //#endregion
4472
+ export { AddOptionType, Gear, GearAttribute, GearCapability, GearCuttable, GearGender, GearReq, GearShare, GearTrade, GearType, PotentialGrade, ReadonlyGear, SpellTraceType, applyAddOption, applyExceptional, applyScroll, applySoulEnchant, applySpellTrace, canApplyAddOption, canApplyExceptional, canApplyScroll, canApplySoulEnchant, canFailScroll, canResetAddOption, canResetExceptional, canResetStarforce, canResetUpgrade, canResileScroll, canSetAdditionalPotential, canSetPotential, canSetSoul, canSetSoulCharge, canStarScroll, canStarforce, failScroll, getAddOption, getAddOptionValue, getHardMaxStar, getMaxStar, getSpellTraceScroll, isAccessory, isArmor, isDoubleHandWeapon, isDragonGear, isLeftWeapon, isMechanicGear, isShield, isSubWeapon, isWeapon, migrate, resetAddOption, resetAdditionalPotential, resetExceptional, resetPotential, resetSoulEnchant, resetStarforce, resetUpgrade, resileScroll, setAdditionalPotential, setPotential, setSoul, setSoulCharge, starScroll, starforce, supportsAddOption, supportsAdditionalPotential, supportsExceptional, supportsPotential, supportsSoul, supportsStarforce, supportsUpgrade, toGearOption };