@malib/gear 1.0.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.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
- 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);
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,21 +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
- 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;
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
- 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;
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
+ };
3527
3528
  }
3528
3529
  //#endregion
3529
3530
  //#region src/lib/GearAttribute.ts
@@ -3693,16 +3694,10 @@ var GearReq = class {
3693
3694
  return this.data.levelIncrease ?? 0;
3694
3695
  }
3695
3696
  /**
3696
- * 착용 가능 직업 분류
3697
- * */
3698
- get job() {
3699
- return this.data.job ?? 0;
3700
- }
3701
- /**
3702
3697
  * 착용 가능 직업
3703
3698
  */
3704
- get class() {
3705
- return this.data.class ?? [];
3699
+ get job() {
3700
+ return new GearReqJob(this.data.job ?? {});
3706
3701
  }
3707
3702
  /**
3708
3703
  * 착용 가능 성별
@@ -3710,47 +3705,84 @@ var GearReq = class {
3710
3705
  get gender() {
3711
3706
  return this.data.gender;
3712
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;
3728
+ }
3729
+ /**
3730
+ * 착용 가능 직업 코드 목록
3731
+ *
3732
+ * 차수 무관한 직업 코드 목록입니다.
3733
+ */
3734
+ get jobs() {
3735
+ return this.data.jobs ?? [];
3736
+ }
3737
+ /**
3738
+ * 착용 가능 세부 직업 코드 목록
3739
+ *
3740
+ * 차수를 고려한 직업 코드 목록입니다.
3741
+ */
3742
+ get fullJobs() {
3743
+ return this.data.fullJobs ?? [];
3744
+ }
3713
3745
  /**
3714
- * 초보자 및 전 직업 착용 가능 여부를 계산합니다.
3746
+ * 초보자 착용 가능 여부를 계산합니다.
3715
3747
  * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3716
3748
  */
3717
3749
  beginner() {
3718
- return this.job === 0;
3750
+ return this.class <= 0;
3719
3751
  }
3720
3752
  /**
3721
3753
  * 전사 착용 가능 여부를 계산합니다.
3722
3754
  * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3723
3755
  */
3724
3756
  warrior() {
3725
- return this.job === 0 || (this.job & 1) != 0;
3757
+ return this.class === 0 || (this.class & 1) != 0;
3726
3758
  }
3727
3759
  /**
3728
3760
  * 마법사 착용 가능 여부를 계산합니다.
3729
3761
  * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3730
3762
  */
3731
3763
  magician() {
3732
- return this.job === 0 || (this.job & 2) != 0;
3764
+ return this.class === 0 || (this.class & 2) != 0;
3733
3765
  }
3734
3766
  /**
3735
3767
  * 궁수 착용 가능 여부를 계산합니다.
3736
3768
  * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3737
3769
  */
3738
3770
  bowman() {
3739
- return this.job === 0 || (this.job & 4) != 0;
3771
+ return this.class === 0 || (this.class & 4) != 0;
3740
3772
  }
3741
3773
  /**
3742
3774
  * 도적 착용 가능 여부를 계산합니다.
3743
3775
  * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3744
3776
  */
3745
3777
  thief() {
3746
- return this.job === 0 || (this.job & 8) != 0;
3778
+ return this.class === 0 || (this.class & 8) != 0;
3747
3779
  }
3748
3780
  /**
3749
3781
  * 해적 착용 가능 여부를 계산합니다.
3750
3782
  * @returns 착용할 수 있을 경우 `true`; 아닐 경우 `false`.
3751
3783
  */
3752
3784
  pirate() {
3753
- return this.job === 0 || (this.job & 16) != 0;
3785
+ return this.class === 0 || (this.class & 16) != 0;
3754
3786
  }
3755
3787
  };
3756
3788
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@malib/gear",
3
- "version": "1.0.0",
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": "^3.2.4",
21
+ "vitest": "^4.0.18",
20
22
  "@repo/typescript-config": "0.0.0"
21
23
  },
22
24
  "scripts": {