@rpg-engine/long-bow 0.8.196 → 0.8.198

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.
@@ -3,5 +3,6 @@ export interface IGroupedRowContainerProps {
3
3
  mainRow: React.ReactNode;
4
4
  subRows: React.ReactNode[];
5
5
  badgeLabel?: string;
6
+ metaRightInset?: number;
6
7
  }
7
8
  export declare const GroupedRowContainer: React.FC<IGroupedRowContainerProps>;
@@ -23,7 +23,7 @@ var lodash = require('lodash');
23
23
  var mobxReactLite = require('mobx-react-lite');
24
24
  var ai = require('react-icons/ai');
25
25
  var reactColorful = require('react-colorful');
26
- var Clock = require('pixelarticons/react/Clock');
26
+ var DateTime = require('pixelarticons/react/DateTime');
27
27
  var Settings2 = require('pixelarticons/react/Settings2');
28
28
  var ShoppingBag = require('pixelarticons/react/ShoppingBag');
29
29
  var ShoppingCart = require('pixelarticons/react/ShoppingCart');
@@ -35,10 +35,9 @@ var Search = require('pixelarticons/react/Search');
35
35
  var Delete = require('pixelarticons/react/Delete');
36
36
  require('rpgui/rpgui.css');
37
37
  require('rpgui/rpgui.min.js');
38
- var Coins = require('pixelarticons/react/Coins');
39
- var Box = require('pixelarticons/react/Box');
40
38
  var Crown = require('pixelarticons/react/Crown');
41
39
  var Gift = require('pixelarticons/react/Gift');
40
+ var Package = require('pixelarticons/react/Package');
42
41
  var capitalize = _interopDefault(require('lodash/capitalize'));
43
42
 
44
43
  function _arrayLikeToArray(r, a) {
@@ -638,7 +637,9 @@ var ButtonContainer = /*#__PURE__*/styled__default.button.withConfig({
638
637
  })(["height:45px;font-size:", ";"], uiFonts.size.small);
639
638
 
640
639
  var NO_IMAGE_SPRITE_KEY = 'others/no-image.png';
640
+ var atlasSpriteAliases = /*#__PURE__*/new Map([['mysticstaff', 'staffs/mystic-lightning-staff.png'], ['silverarrow', 'ranged-weapons/silvermoon-arrow.png']]);
641
641
  var atlasBaseNameLookupCache = /*#__PURE__*/new WeakMap();
642
+ var atlasNormalizedNameLookupCache = /*#__PURE__*/new WeakMap();
642
643
  var getBaseName = function getBaseName(spriteKey) {
643
644
  var normalizedKey = spriteKey.trim();
644
645
  if (!normalizedKey) {
@@ -650,6 +651,13 @@ var getBaseName = function getBaseName(spriteKey) {
650
651
  }
651
652
  return fileName.replace(/\.png$/, '');
652
653
  };
654
+ var normalizeBaseName = function normalizeBaseName(spriteKey) {
655
+ var baseName = getBaseName(spriteKey);
656
+ if (!baseName) {
657
+ return null;
658
+ }
659
+ return baseName.replace(/([a-z0-9])([A-Z])/g, '$1-$2').replace(/[^a-zA-Z0-9]+/g, '').toLowerCase();
660
+ };
653
661
  var getAtlasBaseNameLookup = function getAtlasBaseNameLookup(atlasJSON) {
654
662
  var _atlasJSON$frames;
655
663
  if (!atlasJSON || typeof atlasJSON !== 'object') {
@@ -670,8 +678,28 @@ var getAtlasBaseNameLookup = function getAtlasBaseNameLookup(atlasJSON) {
670
678
  atlasBaseNameLookupCache.set(atlasJSON, lookup);
671
679
  return lookup;
672
680
  };
681
+ var getAtlasNormalizedNameLookup = function getAtlasNormalizedNameLookup(atlasJSON) {
682
+ var _atlasJSON$frames2;
683
+ if (!atlasJSON || typeof atlasJSON !== 'object') {
684
+ return new Map();
685
+ }
686
+ var cachedLookup = atlasNormalizedNameLookupCache.get(atlasJSON);
687
+ if (cachedLookup) {
688
+ return cachedLookup;
689
+ }
690
+ var frames = (_atlasJSON$frames2 = atlasJSON == null ? void 0 : atlasJSON.frames) != null ? _atlasJSON$frames2 : {};
691
+ var lookup = new Map();
692
+ Object.keys(frames).forEach(function (frameKey) {
693
+ var normalizedBaseName = normalizeBaseName(frameKey);
694
+ if (normalizedBaseName && !lookup.has(normalizedBaseName)) {
695
+ lookup.set(normalizedBaseName, frameKey);
696
+ }
697
+ });
698
+ atlasNormalizedNameLookupCache.set(atlasJSON, lookup);
699
+ return lookup;
700
+ };
673
701
  var resolveAtlasSpriteKey = function resolveAtlasSpriteKey(atlasJSON, spriteKey) {
674
- var _getAtlasBaseNameLook;
702
+ var _getAtlasNormalizedNa;
675
703
  if (!spriteKey) {
676
704
  return null;
677
705
  }
@@ -694,7 +722,19 @@ var resolveAtlasSpriteKey = function resolveAtlasSpriteKey(atlasJSON, spriteKey)
694
722
  if (!baseName) {
695
723
  return null;
696
724
  }
697
- return (_getAtlasBaseNameLook = getAtlasBaseNameLookup(atlasJSON).get(baseName)) != null ? _getAtlasBaseNameLook : null;
725
+ var directBaseMatch = getAtlasBaseNameLookup(atlasJSON).get(baseName);
726
+ if (directBaseMatch) {
727
+ return directBaseMatch;
728
+ }
729
+ var normalizedBaseName = normalizeBaseName(normalizedKey);
730
+ if (!normalizedBaseName) {
731
+ return null;
732
+ }
733
+ var aliasedSpriteKey = atlasSpriteAliases.get(normalizedBaseName);
734
+ if (aliasedSpriteKey && frames[aliasedSpriteKey]) {
735
+ return aliasedSpriteKey;
736
+ }
737
+ return (_getAtlasNormalizedNa = getAtlasNormalizedNameLookup(atlasJSON).get(normalizedBaseName)) != null ? _getAtlasNormalizedNa : null;
698
738
  };
699
739
 
700
740
  var toUppercaseHexColor = function toUppercaseHexColor(color) {
@@ -45129,7 +45169,9 @@ var GroupedRowContainer = function GroupedRowContainer(_ref) {
45129
45169
  var mainRow = _ref.mainRow,
45130
45170
  subRows = _ref.subRows,
45131
45171
  _ref$badgeLabel = _ref.badgeLabel,
45132
- badgeLabel = _ref$badgeLabel === void 0 ? 'offers' : _ref$badgeLabel;
45172
+ badgeLabel = _ref$badgeLabel === void 0 ? 'offers' : _ref$badgeLabel,
45173
+ _ref$metaRightInset = _ref.metaRightInset,
45174
+ metaRightInset = _ref$metaRightInset === void 0 ? 120 : _ref$metaRightInset;
45133
45175
  var _useState = React.useState(false),
45134
45176
  expanded = _useState[0],
45135
45177
  setExpanded = _useState[1];
@@ -45142,7 +45184,9 @@ var GroupedRowContainer = function GroupedRowContainer(_ref) {
45142
45184
  return !e;
45143
45185
  });
45144
45186
  } : undefined
45145
- }, mainRow, hasMultiple && React__default.createElement(GroupMeta, null, React__default.createElement(OfferBadge, null, totalCount, " ", badgeLabel), React__default.createElement(Chevron, {
45187
+ }, mainRow, hasMultiple && React__default.createElement(GroupMeta, {
45188
+ "$rightInset": metaRightInset
45189
+ }, React__default.createElement(OfferBadge, null, totalCount, " ", badgeLabel), React__default.createElement(Chevron, {
45146
45190
  "$expanded": expanded
45147
45191
  }, "\u25B8"))), expanded && React__default.createElement(SubRows, null, subRows));
45148
45192
  };
@@ -45160,7 +45204,10 @@ var GroupHeader = /*#__PURE__*/styled__default.div.withConfig({
45160
45204
  var GroupMeta = /*#__PURE__*/styled__default.div.withConfig({
45161
45205
  displayName: "GroupedRowContainer__GroupMeta",
45162
45206
  componentId: "sc-12q03tq-2"
45163
- })(["position:absolute;right:100px;top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:6px;pointer-events:none;"]);
45207
+ })(["position:absolute;right:", ";top:50%;transform:translateY(-50%);display:flex;align-items:center;gap:4px;padding-left:10px;background:linear-gradient(to left,rgba(25,23,23,0.85),rgba(25,23,23,0));pointer-events:none;z-index:1;"], function (_ref3) {
45208
+ var $rightInset = _ref3.$rightInset;
45209
+ return $rightInset + "px";
45210
+ });
45164
45211
  var OfferBadge = /*#__PURE__*/styled__default.span.withConfig({
45165
45212
  displayName: "GroupedRowContainer__OfferBadge",
45166
45213
  componentId: "sc-12q03tq-3"
@@ -45168,8 +45215,8 @@ var OfferBadge = /*#__PURE__*/styled__default.span.withConfig({
45168
45215
  var Chevron = /*#__PURE__*/styled__default.span.withConfig({
45169
45216
  displayName: "GroupedRowContainer__Chevron",
45170
45217
  componentId: "sc-12q03tq-4"
45171
- })(["display:inline-block;font-size:0.7rem;color:rgba(255,255,255,0.4);transition:transform 0.2s ease;transform:rotate(", ");"], function (_ref3) {
45172
- var $expanded = _ref3.$expanded;
45218
+ })(["display:inline-block;font-size:0.7rem;color:rgba(255,255,255,0.4);transition:transform 0.2s ease;transform:rotate(", ");"], function (_ref4) {
45219
+ var $expanded = _ref4.$expanded;
45173
45220
  return $expanded ? '90deg' : '0deg';
45174
45221
  });
45175
45222
  var SubRows = /*#__PURE__*/styled__default.div.withConfig({
@@ -45494,7 +45541,8 @@ var GroupedBuyOrderRow = function GroupedBuyOrderRow(_ref2) {
45494
45541
  return React__default.createElement(GroupedRowContainer, {
45495
45542
  mainRow: makeRow(bestOrder),
45496
45543
  subRows: otherOrders.map(makeRow),
45497
- badgeLabel: "requests"
45544
+ badgeLabel: "requests",
45545
+ metaRightInset: 156
45498
45546
  });
45499
45547
  };
45500
45548
  // ── Styled components matching MarketplaceRows layout ──
@@ -45960,7 +46008,7 @@ var MarketplaceRows = function MarketplaceRows(_ref) {
45960
46008
  spriteKey: "others/definya-coin.png",
45961
46009
  imgScale: 1
45962
46010
  }))), React__default.createElement(DCPrice, null, shared.formatDCAmount(dcEquivalentPrice)))))), React__default.createElement(ActionSection$1, null, React__default.createElement(CTAButton, {
45963
- icon: onMarketPlaceItemBuy ? React__default.createElement(Coins.Coins, {
46011
+ icon: onMarketPlaceItemBuy ? React__default.createElement(Wallet.Wallet, {
45964
46012
  width: 18,
45965
46013
  height: 18
45966
46014
  }) : React__default.createElement(Delete.Delete, {
@@ -46012,7 +46060,8 @@ var GroupedMarketplaceRow = function GroupedMarketplaceRow(_ref2) {
46012
46060
  return React__default.createElement(GroupedRowContainer, {
46013
46061
  mainRow: makeRow(bestListing),
46014
46062
  subRows: otherListings.map(makeRow),
46015
- badgeLabel: "offers"
46063
+ badgeLabel: "offers",
46064
+ metaRightInset: 132
46016
46065
  });
46017
46066
  };
46018
46067
  var ItemSection$1 = /*#__PURE__*/styled__default.div.withConfig({
@@ -46553,7 +46602,7 @@ var WrapperContainer$1 = /*#__PURE__*/styled__default.div.withConfig({
46553
46602
  var ItemComponentScrollWrapper$1 = /*#__PURE__*/styled__default.div.withConfig({
46554
46603
  displayName: "BuyPanel__ItemComponentScrollWrapper",
46555
46604
  componentId: "sc-1si8t7i-7"
46556
- })(["overflow-y:scroll;overflow-x:hidden;height:390px;width:95%;margin:1rem auto 0 auto;background:rgba(0,0,0,0.2);border:1px solid rgba(255,255,255,0.05);border-radius:4px;@media (max-width:950px){height:250px;}"]);
46605
+ })(["display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden;max-height:390px;min-height:120px;width:95%;margin:1rem auto 0 auto;background:rgba(0,0,0,0.2);border:1px solid rgba(255,255,255,0.05);border-radius:4px;@media (max-width:950px){max-height:250px;}"]);
46557
46606
  var MarketSection = /*#__PURE__*/styled__default.div.withConfig({
46558
46607
  displayName: "BuyPanel__MarketSection",
46559
46608
  componentId: "sc-1si8t7i-8"
@@ -46977,7 +47026,7 @@ var ManagmentPanel = function ManagmentPanel(_ref) {
46977
47026
  })), React__default.createElement(BalanceAmount$1, {
46978
47027
  "$disabled": false
46979
47028
  }, dcBalance), React__default.createElement(BalanceCurrencyLabel, null, "DC")), React__default.createElement(SmallCTAButton, {
46980
- icon: React__default.createElement(Coins.Coins, {
47029
+ icon: React__default.createElement(Wallet.Wallet, {
46981
47030
  width: 18,
46982
47031
  height: 18
46983
47032
  }),
@@ -48192,7 +48241,7 @@ var Marketplace = function Marketplace(props) {
48192
48241
  }, {
48193
48242
  id: 'history',
48194
48243
  label: 'History',
48195
- icon: React__default.createElement(Clock.Clock, {
48244
+ icon: React__default.createElement(DateTime.DateTime, {
48196
48245
  width: 18,
48197
48246
  height: 18
48198
48247
  })
@@ -48371,7 +48420,7 @@ var CharacterMarketplaceRows = function CharacterMarketplaceRows(_ref) {
48371
48420
  spriteKey: "others/definya-coin.png",
48372
48421
  imgScale: 1
48373
48422
  })), React__default.createElement(DCPrice$2, null, shared.formatDCAmount(price))), isBeingBought && React__default.createElement(PendingBadge$1, null, "Sale Pending"))), React__default.createElement(ActionSection$2, null, React__default.createElement(CTAButton, {
48374
- icon: onCharacterBuy ? React__default.createElement(Coins.Coins, {
48423
+ icon: onCharacterBuy ? React__default.createElement(Wallet.Wallet, {
48375
48424
  width: 18,
48376
48425
  height: 18
48377
48426
  }) : undefined,
@@ -49834,146 +49883,150 @@ var COMBAT_COLOR = '#C5283D';
49834
49883
  var CRAFTING_COLOR = '#597DCE';
49835
49884
  var ATTRIBUTE_COLOR = '#6833A3';
49836
49885
  var LEVEL_COLOR = '#0E79B2';
49886
+ // Keep this copy aligned with ../rpg-api:
49887
+ // SkillIncrease.ts, BattleDamageCalculator.ts, BattleEvent.ts,
49888
+ // ResourceRequirementConstants.ts, PlantHarvest.ts,
49889
+ // ItemCraftableQueue.ts, ItemMinLevelCalculator.ts, NPCExperience.ts.
49837
49890
  var SKILL_INFO_DATA = {
49838
49891
  first: {
49839
49892
  name: 'Fist',
49840
49893
  color: COMBAT_COLOR,
49841
- description: 'Governs your effectiveness when fighting unarmed or with punch-type weapons. Your level directly scales unarmed attack damage and attack speed.',
49842
- howToTrain: 'Deal damage to enemies while fighting with no weapon equipped or while wearing leather gloves.',
49843
- notes: 'No equipment is required to train this skill useful for new players. Berserker class receives a strong affinity bonus.'
49894
+ description: 'Used for unarmed attacks. Higher Fist improves your chance to hit and the damage you deal while fighting empty-handed.',
49895
+ howToTrain: 'Land non-spell hits with no weapon equipped.',
49896
+ notes: 'Some gloves require Fist, but you train it by fighting unarmed. Berserkers learn it especially well.'
49844
49897
  },
49845
49898
  club: {
49846
49899
  name: 'Club',
49847
49900
  color: COMBAT_COLOR,
49848
- description: 'Determines your proficiency with mace-type weapons such as clubs and hammers. Higher level increases damage dealt and reduces attack interval.',
49849
- howToTrain: 'Deal damage to enemies while wielding any mace-type weapon.',
49850
- notes: 'Mace weapons deal more consistent damage than swords but have slower attack speed. Useful against heavily armored enemies.'
49901
+ description: 'Used for maces and clubs. Higher Club improves your chance to hit and the damage you deal with those weapons.',
49902
+ howToTrain: 'Land non-spell hits with a mace or club weapon equipped.',
49903
+ notes: 'Some mace-type weapons require Club to equip. Warriors and Berserkers learn it faster than most classes.'
49851
49904
  },
49852
49905
  sword: {
49853
49906
  name: 'Sword',
49854
49907
  color: COMBAT_COLOR,
49855
- description: 'Governs your mastery of one-handed and two-handed swords. Level scales both the damage bonus and effective swing speed of sword attacks.',
49856
- howToTrain: 'Deal damage to enemies while wielding any sword-type weapon.',
49857
- notes: 'Swords are the most balanced combat skill — moderate damage, moderate speed. Knight class has an affinity bonus to sword progression.'
49908
+ description: 'Used for swords. Higher Sword improves your chance to hit and the damage you deal with sword attacks.',
49909
+ howToTrain: 'Land non-spell hits with a sword equipped.',
49910
+ notes: 'Some swords require Sword to equip. Warriors and Berserkers are the natural Sword classes.'
49858
49911
  },
49859
49912
  axe: {
49860
49913
  name: 'Axe',
49861
49914
  color: COMBAT_COLOR,
49862
- description: 'Controls your skill with axe-type weapons. High axe level gives the biggest per-hit damage increase of any melee weapon type.',
49863
- howToTrain: 'Deal damage to enemies while wielding any axe-type weapon.',
49864
- notes: 'Axes have the highest damage ceiling of melee weapons but the slowest base attack speed. Best for burst damage on single targets.'
49915
+ description: 'Used for axes. Higher Axe improves your chance to hit and the damage you deal with axe attacks.',
49916
+ howToTrain: 'Land non-spell hits with an axe equipped.',
49917
+ notes: 'Some axes require Axe to equip. Berserkers are the natural Axe class, with Warriors close behind.'
49865
49918
  },
49866
49919
  distance: {
49867
49920
  name: 'Distance',
49868
49921
  color: COMBAT_COLOR,
49869
- description: 'Measures your accuracy and damage with ranged weapons such as bows, crossbows, and spears. Level reduces miss chance and increases projectile damage.',
49870
- howToTrain: 'Deal damage to enemies using any ranged weapon.',
49871
- notes: 'Allows attacking from a safe range. Archer class receives a notable affinity bonus. Vigor level affects the delay between ranged shots.'
49922
+ description: 'Used for ranged weapons and spears. Higher Distance improves your accuracy and damage, especially for Hunters.',
49923
+ howToTrain: 'Land non-spell hits with a ranged weapon or spear.',
49924
+ notes: 'Some ranged weapons and abilities also require Distance. Hunters rely on it the most for bows and spears.'
49872
49925
  },
49873
49926
  shielding: {
49874
49927
  name: 'Shielding',
49875
49928
  color: COMBAT_COLOR,
49876
- description: 'Represents your skill at blocking with shields. Higher level increases the percentage of incoming damage blocked per successful shield block and lowers block failure chance.',
49877
- howToTrain: 'Receive attacks from enemies while a shield is equipped in your off-hand slot.',
49878
- notes: 'Purely defensive trains only when you are being hit, not when you attack. Any shield enables training. Paladin and Knight classes have affinity bonuses.'
49929
+ description: 'Used when reducing incoming damage with a shield. With a shield equipped, Shielding boosts your defense and lets the shield absorb part of each hit.',
49930
+ howToTrain: 'Take hits or blocks while a shield is equipped.',
49931
+ notes: 'Shielding gains use a hard cooldown, so extra hits do not spam progress. Warriors benefit from it the most, with Berserkers also training it well.'
49879
49932
  },
49880
49933
  dagger: {
49881
49934
  name: 'Dagger',
49882
49935
  color: COMBAT_COLOR,
49883
- description: 'Governs your technique with daggers and short blades. Daggers are fast but deal less per-hit damage; high level compensates with additional attack speed and critical hit probability.',
49884
- howToTrain: 'Deal damage to enemies while wielding any dagger-type weapon.',
49885
- notes: 'Daggers have the fastest attack speed of any melee weapon type. Rogue class has a strong affinity bonus to dagger progression.'
49936
+ description: 'Used for daggers. Higher Dagger improves your chance to hit and the damage you deal with dagger attacks.',
49937
+ howToTrain: 'Land non-spell hits with a dagger equipped.',
49938
+ notes: 'Some daggers require Dagger to equip. Rogues are the main Dagger class, and Hunters also train it well.'
49886
49939
  },
49887
49940
  fishing: {
49888
49941
  name: 'Fishing',
49889
49942
  color: CRAFTING_COLOR,
49890
- description: 'Determines your success rate and yield when fishing. Higher levels unlock catches of rarer fish species and reduce waiting time between bites.',
49891
- howToTrain: 'Use a fishing rod near any water body with a fish resource. Each successful catch grants Skill Points.',
49892
- notes: 'A fishing rod must be equipped. Caught fish can be cooked with the Cooking skill. Druid class has a 10% bonus.'
49943
+ description: 'Governs fishing rewards and access to higher-tier catches. Higher Fishing lets you catch better fish and shell rewards.',
49944
+ howToTrain: 'Successfully fish reward items such as fish or shell resources.',
49945
+ notes: 'Higher-tier catches also depend on the rod you are using.'
49893
49946
  },
49894
49947
  farming: {
49895
49948
  name: 'Farming',
49896
49949
  color: CRAFTING_COLOR,
49897
- description: 'Controls your efficiency when cultivating crops. Level affects harvest quantity, double-harvest chance, and which rare crop varieties you can grow.',
49898
- howToTrain: 'Plant seeds in farming spots using a watering can, then harvest mature crops. Each harvest grants Skill Points.',
49899
- notes: 'Requires seeds (purchasable from farming NPCs) and a watering can. Crops must be watered at least once before harvest. Druid class has a 20% affinity bonus.'
49950
+ description: 'Governs plant harvesting. Higher Farming increases crop yield and improves harvest rarity when plants are collected.',
49951
+ howToTrain: 'Plant and harvest crops. Harvesting plants grants Farming SP.',
49952
+ notes: 'Some seeds require Farming before you can plant them.'
49900
49953
  },
49901
49954
  mining: {
49902
49955
  name: 'Mining',
49903
49956
  color: CRAFTING_COLOR,
49904
- description: 'Governs your ability to extract ore and stone from rock nodes. Level determines which ore types you can mine and how many resources you yield per swing.',
49905
- howToTrain: 'Mine rock or ore nodes with a pickaxe. Each successful resource extraction grants Skill Points.',
49906
- notes: 'A pickaxe must be equipped. Higher mining levels unlock rarer ores found in deeper zones. Dwarf race has a 20% bonus.'
49957
+ description: 'Governs mining rewards and unlocks higher-tier ore, stone, and gem drops.',
49958
+ howToTrain: 'Mine resource nodes and successfully receive mining rewards.',
49959
+ notes: 'Better mining rewards depend on both your Mining level and your pickaxe.'
49907
49960
  },
49908
49961
  lumberjacking: {
49909
49962
  name: 'Lumberjacking',
49910
49963
  color: CRAFTING_COLOR,
49911
- description: 'Controls your skill at chopping trees for wood. Level determines which tree types you can cut and the number of logs obtained per swing.',
49912
- howToTrain: 'Chop tree resource nodes with an axe equipped. Each log obtained grants Skill Points.',
49913
- notes: 'Any axe-type weapon doubles as a lumberjacking tool there is no separate lumberjacking tool. Rarer wood types require higher skill and appear in higher-level zones.'
49964
+ description: 'Governs woodcutting rewards and unlocks higher-tier wood drops.',
49965
+ howToTrain: 'Chop resource nodes and successfully receive wood rewards.',
49966
+ notes: 'Better wood tiers depend on both your Lumberjacking level and the tool you are using.'
49914
49967
  },
49915
49968
  blacksmithing: {
49916
49969
  name: 'Blacksmithing',
49917
49970
  color: CRAFTING_COLOR,
49918
- description: 'Determines your ability to craft metal equipment such as weapons and armor at forge stations. Higher level unlocks stronger recipes and improves crafted item quality.',
49919
- howToTrain: "Craft metal items at a blacksmith's forge using ingots and other materials. Each successful craft grants Skill Points.",
49920
- notes: 'Requires materials obtained from mining. Blacksmithing produces tradeable equipment items. Higher level recipes require rare ingots. Rogue class has a 10% bonus.'
49971
+ description: 'Governs blacksmithing recipes and ingot processing. Higher Blacksmithing improves craft success and unlocks stronger smithing recipes.',
49972
+ howToTrain: 'Successfully smelt bars or craft gear with Blacksmithing recipes.',
49973
+ notes: 'You only gain SP from successful crafts.'
49921
49974
  },
49922
49975
  cooking: {
49923
49976
  name: 'Cooking',
49924
49977
  color: CRAFTING_COLOR,
49925
- description: 'Governs your ability to prepare food from raw ingredients. Cooked food restores HP or provides temporary stat buffs. Higher level produces more potent food.',
49926
- howToTrain: 'Cook raw food items at a cooking station or campfire. Each successful cook grants Skill Points.',
49927
- notes: 'Raw ingredients come from fishing, farming, and monster drops. Cooked meals restore more HP than potions at equivalent cost and can provide additional buffs.'
49978
+ description: 'Governs cooking recipes. Higher Cooking improves craft success and unlocks recipes with higher cooking requirements.',
49979
+ howToTrain: 'Successfully cook food with Cooking recipes.',
49980
+ notes: 'You only gain SP from successful crafts.'
49928
49981
  },
49929
49982
  alchemy: {
49930
49983
  name: 'Alchemy',
49931
49984
  color: CRAFTING_COLOR,
49932
- description: 'Controls your skill at brewing potions and elixirs. Higher levels unlock stronger potion recipes, reduce failure chance, and increase the potency of brewed potions.',
49933
- howToTrain: 'Brew potions at an alchemy station using herbs, reagents, and vials. Each successful brew grants Skill Points.',
49934
- notes: 'Herb reagents are gathered from nature nodes across the world. High-level alchemy produces Greater and Superior potions that substantially outperform shop-bought equivalents. Druid has a 20% bonus.'
49985
+ description: 'Governs alchemy recipes. Higher Alchemy improves craft success and unlocks recipes with higher alchemy requirements.',
49986
+ howToTrain: 'Successfully brew potions or craft reagents with Alchemy recipes.',
49987
+ notes: 'You only gain SP from successful crafts.'
49935
49988
  },
49936
49989
  magic: {
49937
49990
  name: 'Magic',
49938
49991
  color: ATTRIBUTE_COLOR,
49939
- description: 'Governs the power and efficiency of spells and magic-type weapons. Higher Magic level increases spell damage, spell range, and reduces mana consumption.',
49940
- howToTrain: 'Deal damage to enemies using spells from your spellbook, or fight while wielding a magic staff or wand.',
49941
- notes: 'Magic starts at level 0 and is one of the slower attributes to train since it requires active spell use. Sorcerer and Mage classes receive strong affinity bonuses. Also increases maximum mana.'
49992
+ description: 'Used for spell power, rune scaling, staff or magic-weapon attacks, gear used by mage classes, and some carry-weight calculations.',
49993
+ howToTrain: 'Cast spells or land non-spell hits with magic or staff weapons.',
49994
+ notes: 'Sorcerers and Druids are the mage classes, and both lean on Magic and staves. They also use Magic instead of Strength for max carry weight.'
49942
49995
  },
49943
49996
  magicResistance: {
49944
49997
  name: 'Magic Resistance',
49945
49998
  color: ATTRIBUTE_COLOR,
49946
- description: 'Reduces the damage taken from incoming magical attacks and spells. Each level of magic resistance reduces a percentage of spell damage received.',
49947
- howToTrain: 'Receive magic damage from enemies (spells, magical attacks, staff hits aimed at you).',
49948
- notes: 'Purely defensive trains only when you are the target of magical attacks. Cannot be trained offensively. Essential for characters that frequently face casters or magic creatures.'
49999
+ description: 'Used when reducing incoming magic damage. Higher Magic Resistance improves your defense against spells and other magical attacks.',
50000
+ howToTrain: 'Take damage from spells, magic weapons, runes, or other magical attacks.',
50001
+ notes: 'This only trains on incoming magic damage, not on casting. Sorcerers and Druids improve it faster than other classes.'
49949
50002
  },
49950
50003
  strength: {
49951
50004
  name: 'Strength',
49952
50005
  color: ATTRIBUTE_COLOR,
49953
- description: 'Directly increases melee attack damage for all physical weapon types. Also increases how much weight your character can carry.',
49954
- howToTrain: 'Deal melee damage to enemies using any physical weapon or unarmed combat.',
49955
- notes: 'Applies to all physical weapon types regardless of which combat skill you use. Warrior and Berserker classes gain Strength faster due to class affinity.'
50006
+ description: 'Used for physical damage, carry weight for non-mages, item requirements, and many strength-scaling abilities.',
50007
+ howToTrain: 'Land non-spell hits with physical weapons or while fighting unarmed.',
50008
+ notes: 'When you attack with magic or staff weapons, Strength is not trained. Warriors and Berserkers get the most out of it.'
49956
50009
  },
49957
50010
  resistance: {
49958
50011
  name: 'Resistance',
49959
50012
  color: ATTRIBUTE_COLOR,
49960
- description: 'Reduces incoming physical damage from melee and ranged attacks. Higher resistance provides a percentage reduction to the physical damage you receive per hit.',
49961
- howToTrain: 'Receive physical damage from enemies (melee hits, arrows, projectiles).',
49962
- notes: 'Passive defense trains only when you take physical damage. Tank-oriented classes (Paladin, Knight) receive faster resistance growth. Stacks with Shielding for substantial physical damage reduction.'
50013
+ description: 'Used in physical defense and damage reduction. Higher Resistance lowers the damage you take from non-magic attacks.',
50014
+ howToTrain: 'Take non-magic damage from melee, ranged, or other physical attacks.',
50015
+ notes: 'Shield users stack Resistance with Shielding for better mitigation. Warriors are strongest here, with Berserkers and Druids also holding up well.'
49963
50016
  },
49964
50017
  dexterity: {
49965
50018
  name: 'Dexterity',
49966
50019
  color: ATTRIBUTE_COLOR,
49967
- description: 'Increases your attack speed (reduces attack interval) and improves your chance to dodge incoming attacks. Also slightly improves accuracy with ranged weapons.',
49968
- howToTrain: 'Deal physical damage to enemies or successfully dodge incoming attacks.',
49969
- notes: 'Attack speed compounds with damage more attacks per second means proportionally more total damage. One of the most impactful combat attributes. Archer and Rogue classes have strong dexterity affinity.'
50020
+ description: 'Dexterity affects accuracy and blocking, and Hunters also rely on it heavily for ranged damage. Some Rogue and Hunter abilities scale from it.',
50021
+ howToTrain: 'Make incoming attacks miss you. Each miss grants Dexterity SP.',
50022
+ notes: 'Some accessories require Dexterity. Hunters and Rogues lean on it the most.'
49970
50023
  },
49971
50024
  level: {
49972
50025
  name: 'Character Level',
49973
50026
  color: LEVEL_COLOR,
49974
- description: 'Your overall character level, derived from total Experience Points (XP) accumulated. It summarizes your overall progress and may unlock access to certain areas or content.',
49975
- howToTrain: 'XP is gained by killing monsters, completing quests, and reaching skill level milestones. Unlike skill SP, all XP accumulates into a single shared pool that determines your character level.',
49976
- notes: 'Uses a cubic progression formula (level³ × 3 XP per level), so higher levels require exponentially more XP. Character level itself does not directly affect combat — individual skill levels handle that.'
50027
+ description: 'Your overall character level. It affects attack, defense, damage, movement speed, health, mana, spell unlocks, and other progression systems.',
50028
+ howToTrain: 'Gain XP from defeated enemies and other experience rewards.',
50029
+ notes: 'Level-ups refresh derived stats such as max health and max mana and can unlock new spells.'
49977
50030
  }
49978
50031
  };
49979
50032
 
@@ -49987,9 +50040,7 @@ var SkillInfoModal = function SkillInfoModal(_ref) {
49987
50040
  onPointerDown: onClose
49988
50041
  }), React__default.createElement(ModalContainer$7, null, React__default.createElement(ModalContent$7, {
49989
50042
  onPointerDown: stopPropagation
49990
- }, React__default.createElement(Header$d, null, React__default.createElement(ColorBar, {
49991
- "$color": info.color
49992
- }), React__default.createElement(Title$i, {
50043
+ }, React__default.createElement(Header$d, null, React__default.createElement(Title$i, {
49993
50044
  "$color": info.color
49994
50045
  }, info.name), React__default.createElement(CloseButton$f, {
49995
50046
  onPointerDown: onClose
@@ -50011,35 +50062,28 @@ var Header$d = /*#__PURE__*/styled__default.div.withConfig({
50011
50062
  displayName: "SkillInfoModal__Header",
50012
50063
  componentId: "sc-pqkzdj-3"
50013
50064
  })(["display:flex;align-items:center;gap:8px;"]);
50014
- var ColorBar = /*#__PURE__*/styled__default.div.withConfig({
50015
- displayName: "SkillInfoModal__ColorBar",
50016
- componentId: "sc-pqkzdj-4"
50017
- })(["width:3px;height:1rem;background:", ";border-radius:2px;flex-shrink:0;"], function (_ref2) {
50018
- var $color = _ref2.$color;
50019
- return $color;
50020
- });
50021
50065
  var Title$i = /*#__PURE__*/styled__default.h3.withConfig({
50022
50066
  displayName: "SkillInfoModal__Title",
50023
- componentId: "sc-pqkzdj-5"
50024
- })(["margin:0;flex:1;font-family:'Press Start 2P',cursive;font-size:0.65rem;color:", ";"], function (_ref3) {
50025
- var $color = _ref3.$color;
50067
+ componentId: "sc-pqkzdj-4"
50068
+ })(["margin:0;flex:1;font-family:'Press Start 2P',cursive;font-size:0.65rem;color:", ";"], function (_ref2) {
50069
+ var $color = _ref2.$color;
50026
50070
  return $color;
50027
50071
  });
50028
50072
  var CloseButton$f = /*#__PURE__*/styled__default.button.withConfig({
50029
50073
  displayName: "SkillInfoModal__CloseButton",
50030
- componentId: "sc-pqkzdj-6"
50074
+ componentId: "sc-pqkzdj-5"
50031
50075
  })(["background:none;border:none;color:rgba(255,255,255,0.6);cursor:pointer;font-size:1rem;padding:4px;display:flex;align-items:center;pointer-events:auto;&:hover{color:#ffffff;}"]);
50032
50076
  var Section$4 = /*#__PURE__*/styled__default.div.withConfig({
50033
50077
  displayName: "SkillInfoModal__Section",
50034
- componentId: "sc-pqkzdj-7"
50078
+ componentId: "sc-pqkzdj-6"
50035
50079
  })(["display:flex;flex-direction:column;gap:6px;"]);
50036
50080
  var Label$7 = /*#__PURE__*/styled__default.span.withConfig({
50037
50081
  displayName: "SkillInfoModal__Label",
50038
- componentId: "sc-pqkzdj-8"
50082
+ componentId: "sc-pqkzdj-7"
50039
50083
  })(["font-size:0.5rem;font-weight:bold;text-transform:uppercase;letter-spacing:0.05em;color:rgba(255,255,255,0.45);"]);
50040
50084
  var Text$1 = /*#__PURE__*/styled__default.p.withConfig({
50041
50085
  displayName: "SkillInfoModal__Text",
50042
- componentId: "sc-pqkzdj-9"
50086
+ componentId: "sc-pqkzdj-8"
50043
50087
  })(["font-size:0.55rem;line-height:1.6;color:rgba(255,255,255,0.85);margin:0;"]);
50044
50088
 
50045
50089
  var skillProps = {
@@ -73494,7 +73538,7 @@ var Store = function Store(_ref) {
73494
73538
  items: {
73495
73539
  id: 'items',
73496
73540
  title: 'Items',
73497
- icon: React__default.createElement(Box.Box, {
73541
+ icon: React__default.createElement(Package.Package, {
73498
73542
  width: 18,
73499
73543
  height: 18
73500
73544
  }),