@malib/gear 1.1.0 → 1.2.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.d.mts +1341 -13
- package/dist/index.mjs +80 -49
- package/package.json +4 -2
package/dist/index.mjs
CHANGED
|
@@ -392,6 +392,7 @@ let ErrorMessage = /* @__PURE__ */ function(ErrorMessage) {
|
|
|
392
392
|
ErrorMessage["Migrate_InvalidGearData"] = "입력 데이터가 유효하지 않습니다.";
|
|
393
393
|
ErrorMessage["Migrate_UnknownDataVersion"] = "입력 데이터의 버전이 잘못되었습니다.";
|
|
394
394
|
ErrorMessage["Migrate_DataVersionTooNew"] = "입력 데이터의 버전이 지원하는 버전보다 최신입니다.";
|
|
395
|
+
ErrorMessage["Migrate_RequiresIcon"] = "입력 데이터에 icon 속성이 필요합니다.";
|
|
395
396
|
ErrorMessage["Migrate_DataPropertyWillBeOverwritten"] = "입력 데이터의 속성이 덮어쓰여집니다. 제거하고 다시 실행해 주세요.";
|
|
396
397
|
return ErrorMessage;
|
|
397
398
|
}({});
|
|
@@ -1306,10 +1307,10 @@ function _getArmorSpellTrace(gear, type, rate) {
|
|
|
1306
1307
|
break;
|
|
1307
1308
|
}
|
|
1308
1309
|
}
|
|
1309
|
-
if (gear.scrollUpgradeCount === 3) if (gear.req.beginner()) {
|
|
1310
|
+
if (gear.scrollUpgradeCount === 3) if (gear.req.job.beginner()) {
|
|
1310
1311
|
option.attackPower = 1;
|
|
1311
1312
|
option.magicPower = 1;
|
|
1312
|
-
} else if (gear.req.magician()) option.magicPower = 1;
|
|
1313
|
+
} else if (gear.req.job.magician()) option.magicPower = 1;
|
|
1313
1314
|
else option.attackPower = 1;
|
|
1314
1315
|
return {
|
|
1315
1316
|
name: _createScrollName(rate, _getTypeName(type)),
|
|
@@ -1772,7 +1773,7 @@ function _weaponStarforce(gear) {
|
|
|
1772
1773
|
const optionTypes = _getJobOptionTypes(gear);
|
|
1773
1774
|
for (const type of statTypes) if (optionTypes.has(type)) _getStarforceOption(gear)[type] += stat;
|
|
1774
1775
|
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
|
+
const isMagic = gear.req.job.magician() || gear.upgradeOption.magicPower > 0;
|
|
1776
1777
|
if (gear.star > 15) {
|
|
1777
1778
|
_getStarforceOption(gear).attackPower += power;
|
|
1778
1779
|
if (isMagic) _getStarforceOption(gear).magicPower += power;
|
|
@@ -1798,10 +1799,10 @@ function _otherStarforce(gear) {
|
|
|
1798
1799
|
_getStarforceOption(gear).magicPower += power;
|
|
1799
1800
|
if (gear.type === GearType.glove && gear.req.level >= 130) {
|
|
1800
1801
|
const bonusPower = starforceGloveBonusPower[gear.star];
|
|
1801
|
-
if (gear.req.beginner()) {
|
|
1802
|
+
if (gear.req.job.beginner()) {
|
|
1802
1803
|
_getStarforceOption(gear).attackPower += bonusPower;
|
|
1803
1804
|
_getStarforceOption(gear).magicPower += bonusPower;
|
|
1804
|
-
} else if (gear.req.magician()) _getStarforceOption(gear).magicPower += bonusPower;
|
|
1805
|
+
} else if (gear.req.job.magician()) _getStarforceOption(gear).magicPower += bonusPower;
|
|
1805
1806
|
else _getStarforceOption(gear).attackPower += bonusPower;
|
|
1806
1807
|
}
|
|
1807
1808
|
if (gear.type !== GearType.machineHeart && !isSubWeapon(gear.type)) {
|
|
@@ -1819,13 +1820,13 @@ function _otherStarforce(gear) {
|
|
|
1819
1820
|
}
|
|
1820
1821
|
}
|
|
1821
1822
|
function _getJobOptionTypes(gear) {
|
|
1822
|
-
if (gear.req.beginner()) return new Set(statTypes);
|
|
1823
|
+
if (gear.req.job.beginner()) return new Set(statTypes);
|
|
1823
1824
|
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");
|
|
1825
|
+
if (gear.req.job.warrior()) stats.push("str", "dex");
|
|
1826
|
+
if (gear.req.job.magician()) stats.push("int", "luk");
|
|
1827
|
+
if (gear.req.job.bowman()) stats.push("dex", "str");
|
|
1828
|
+
if (gear.req.job.thief()) stats.push("luk", "dex");
|
|
1829
|
+
if (gear.req.job.pirate()) stats.push("str", "dex");
|
|
1829
1830
|
return new Set(stats);
|
|
1830
1831
|
}
|
|
1831
1832
|
function _getValue(data, gear) {
|
|
@@ -3484,22 +3485,11 @@ const migrators = {
|
|
|
3484
3485
|
1: migrateV1ToV2,
|
|
3485
3486
|
2: migrateV2ToV3
|
|
3486
3487
|
};
|
|
3487
|
-
/**
|
|
3488
|
-
* 입력 장비 정보를 목표 버전으로 마이그레이션합니다.
|
|
3489
|
-
* 이 함수가 성공한 이후에는 입력 장비 정보 객체를 사용할 수 없습니다.
|
|
3490
|
-
*
|
|
3491
|
-
* @param data 마이그레이션할 장비 정보.
|
|
3492
|
-
* @param version 목표 버전.
|
|
3493
|
-
* @returns 목표 버전으로 마이그레이션된 장비 정보.
|
|
3494
|
-
*
|
|
3495
|
-
* @throws {@link TypeError}
|
|
3496
|
-
* 입력 데이터가 유효하지 않은 경우.
|
|
3497
|
-
* 입력 데이터의 버전이 잘못되었거나 지원하는 버전보다 최신인 경우.
|
|
3498
|
-
*/
|
|
3499
3488
|
function migrate(data, version = 3) {
|
|
3500
|
-
|
|
3501
|
-
if (
|
|
3502
|
-
if (
|
|
3489
|
+
const dataVersion = getVersion(data);
|
|
3490
|
+
if (dataVersion === void 0) throw new TypeError(ErrorMessage.Migrate_InvalidGearData);
|
|
3491
|
+
if (dataVersion > version) throw new TypeError(ErrorMessage.Migrate_DataVersionTooNew);
|
|
3492
|
+
let currentVersion = dataVersion;
|
|
3503
3493
|
while (currentVersion < version) {
|
|
3504
3494
|
if (!(currentVersion in migrators)) throw new TypeError(ErrorMessage.Migrate_UnknownDataVersion);
|
|
3505
3495
|
data = migrators[currentVersion](data);
|
|
@@ -3509,22 +3499,32 @@ function migrate(data, version = 3) {
|
|
|
3509
3499
|
}
|
|
3510
3500
|
function migrateV1ToV2(data) {
|
|
3511
3501
|
if ("id" in data && data.id !== void 0 || "version" in data && data.version !== void 0) throw new TypeError(ErrorMessage.Migrate_DataPropertyWillBeOverwritten);
|
|
3512
|
-
|
|
3513
|
-
const { meta, ...rest } = data;
|
|
3502
|
+
const { meta, icon, ...rest } = data;
|
|
3514
3503
|
return {
|
|
3515
3504
|
...rest,
|
|
3516
3505
|
id: meta.id,
|
|
3517
|
-
version: 2
|
|
3506
|
+
version: 2,
|
|
3507
|
+
icon: icon ?? "(null)"
|
|
3518
3508
|
};
|
|
3519
3509
|
}
|
|
3520
3510
|
function migrateV2ToV3(data) {
|
|
3521
|
-
|
|
3522
|
-
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
|
|
3511
|
+
const { req, ...rest } = data;
|
|
3512
|
+
const { level, levelIncrease, job, class: classCode, gender } = req;
|
|
3513
|
+
let reqJob = void 0;
|
|
3514
|
+
if (job || classCode) reqJob = {
|
|
3515
|
+
class: job,
|
|
3516
|
+
jobs: classCode ? [classCode] : void 0
|
|
3517
|
+
};
|
|
3518
|
+
const newReq = {};
|
|
3519
|
+
if (level !== void 0) newReq.level = level;
|
|
3520
|
+
if (levelIncrease !== void 0) newReq.levelIncrease = levelIncrease;
|
|
3521
|
+
if (reqJob !== void 0) newReq.job = reqJob;
|
|
3522
|
+
if (gender !== void 0) newReq.gender = gender;
|
|
3523
|
+
return {
|
|
3524
|
+
...rest,
|
|
3525
|
+
version: 3,
|
|
3526
|
+
req: newReq
|
|
3527
|
+
};
|
|
3528
3528
|
}
|
|
3529
3529
|
//#endregion
|
|
3530
3530
|
//#region src/lib/GearAttribute.ts
|
|
@@ -3694,64 +3694,95 @@ var GearReq = class {
|
|
|
3694
3694
|
return this.data.levelIncrease ?? 0;
|
|
3695
3695
|
}
|
|
3696
3696
|
/**
|
|
3697
|
-
* 착용 가능 직업
|
|
3697
|
+
* 착용 가능 직업
|
|
3698
3698
|
*/
|
|
3699
3699
|
get job() {
|
|
3700
|
-
return this.data.job ??
|
|
3700
|
+
return new GearReqJob(this.data.job ?? {});
|
|
3701
|
+
}
|
|
3702
|
+
/**
|
|
3703
|
+
* 착용 가능 성별
|
|
3704
|
+
*/
|
|
3705
|
+
get gender() {
|
|
3706
|
+
return this.data.gender;
|
|
3707
|
+
}
|
|
3708
|
+
};
|
|
3709
|
+
/**
|
|
3710
|
+
* 장비 착용 제한 직업
|
|
3711
|
+
*/
|
|
3712
|
+
var GearReqJob = class {
|
|
3713
|
+
/**
|
|
3714
|
+
* 장비 착용 제한 직업 정보
|
|
3715
|
+
*/
|
|
3716
|
+
data;
|
|
3717
|
+
/**
|
|
3718
|
+
* 장비 착용 제한 직업 정보를 참조하는 장비 착용 제한 직업 인스턴스를 생성합니다.
|
|
3719
|
+
*/
|
|
3720
|
+
constructor(data) {
|
|
3721
|
+
this.data = data;
|
|
3722
|
+
}
|
|
3723
|
+
/**
|
|
3724
|
+
* 착용 가능 전직 계열 비트마스크 (전사, 마법사, 궁수, 도적, 해적)
|
|
3725
|
+
*/
|
|
3726
|
+
get class() {
|
|
3727
|
+
return this.data.class ?? 0;
|
|
3701
3728
|
}
|
|
3702
3729
|
/**
|
|
3703
3730
|
* 착용 가능 직업 코드 목록
|
|
3731
|
+
*
|
|
3732
|
+
* 차수 무관한 직업 코드 목록입니다.
|
|
3704
3733
|
*/
|
|
3705
|
-
get
|
|
3706
|
-
return this.data.
|
|
3734
|
+
get jobs() {
|
|
3735
|
+
return this.data.jobs ?? [];
|
|
3707
3736
|
}
|
|
3708
3737
|
/**
|
|
3709
|
-
* 착용 가능
|
|
3738
|
+
* 착용 가능 세부 직업 코드 목록
|
|
3739
|
+
*
|
|
3740
|
+
* 차수를 고려한 직업 코드 목록입니다.
|
|
3710
3741
|
*/
|
|
3711
|
-
get
|
|
3712
|
-
return this.data.
|
|
3742
|
+
get fullJobs() {
|
|
3743
|
+
return this.data.fullJobs ?? [];
|
|
3713
3744
|
}
|
|
3714
3745
|
/**
|
|
3715
3746
|
* 초보자 착용 가능 여부를 계산합니다.
|
|
3716
3747
|
* @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
|
|
3717
3748
|
*/
|
|
3718
3749
|
beginner() {
|
|
3719
|
-
return this.
|
|
3750
|
+
return this.class <= 0;
|
|
3720
3751
|
}
|
|
3721
3752
|
/**
|
|
3722
3753
|
* 전사 착용 가능 여부를 계산합니다.
|
|
3723
3754
|
* @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
|
|
3724
3755
|
*/
|
|
3725
3756
|
warrior() {
|
|
3726
|
-
return this.
|
|
3757
|
+
return this.class === 0 || (this.class & 1) != 0;
|
|
3727
3758
|
}
|
|
3728
3759
|
/**
|
|
3729
3760
|
* 마법사 착용 가능 여부를 계산합니다.
|
|
3730
3761
|
* @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
|
|
3731
3762
|
*/
|
|
3732
3763
|
magician() {
|
|
3733
|
-
return this.
|
|
3764
|
+
return this.class === 0 || (this.class & 2) != 0;
|
|
3734
3765
|
}
|
|
3735
3766
|
/**
|
|
3736
3767
|
* 궁수 착용 가능 여부를 계산합니다.
|
|
3737
3768
|
* @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
|
|
3738
3769
|
*/
|
|
3739
3770
|
bowman() {
|
|
3740
|
-
return this.
|
|
3771
|
+
return this.class === 0 || (this.class & 4) != 0;
|
|
3741
3772
|
}
|
|
3742
3773
|
/**
|
|
3743
3774
|
* 도적 착용 가능 여부를 계산합니다.
|
|
3744
3775
|
* @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
|
|
3745
3776
|
*/
|
|
3746
3777
|
thief() {
|
|
3747
|
-
return this.
|
|
3778
|
+
return this.class === 0 || (this.class & 8) != 0;
|
|
3748
3779
|
}
|
|
3749
3780
|
/**
|
|
3750
3781
|
* 해적 착용 가능 여부를 계산합니다.
|
|
3751
3782
|
* @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
|
|
3752
3783
|
*/
|
|
3753
3784
|
pirate() {
|
|
3754
|
-
return this.
|
|
3785
|
+
return this.class === 0 || (this.class & 16) != 0;
|
|
3755
3786
|
}
|
|
3756
3787
|
};
|
|
3757
3788
|
//#endregion
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@malib/gear",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "MapleStory gear logic simulator",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -14,9 +14,11 @@
|
|
|
14
14
|
"main": "dist/index.mjs",
|
|
15
15
|
"types": "dist/index.d.mts",
|
|
16
16
|
"devDependencies": {
|
|
17
|
+
"@malib/gearV1": "npm:@malib/gear@1.0.0-next.10",
|
|
18
|
+
"@malib/gearV2": "npm:@malib/gear@1.0.0-next.15",
|
|
17
19
|
"tsdown": "^0.21.0",
|
|
18
20
|
"typescript": "^5.9.3",
|
|
19
|
-
"vitest": "^
|
|
21
|
+
"vitest": "^4.0.18",
|
|
20
22
|
"@repo/typescript-config": "0.0.0"
|
|
21
23
|
},
|
|
22
24
|
"scripts": {
|