@rpg-engine/long-bow 0.4.2 → 0.4.4

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.
Files changed (163) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +181 -181
  3. package/dist/long-bow.cjs.development.js +1059 -1059
  4. package/dist/long-bow.cjs.development.js.map +1 -1
  5. package/dist/long-bow.cjs.production.min.js +1 -1
  6. package/dist/long-bow.cjs.production.min.js.map +1 -1
  7. package/dist/long-bow.esm.js +1065 -1065
  8. package/dist/long-bow.esm.js.map +1 -1
  9. package/package.json +100 -100
  10. package/src/components/Abstractions/ModalPortal.tsx +22 -22
  11. package/src/components/Abstractions/SlotsContainer.tsx +62 -62
  12. package/src/components/Arrow/SelectArrow.tsx +69 -69
  13. package/src/components/Arrow/img/arrow01-left-clicked.png +0 -0
  14. package/src/components/Arrow/img/arrow01-left.png +0 -0
  15. package/src/components/Arrow/img/arrow01-right-clicked.png +0 -0
  16. package/src/components/Arrow/img/arrow01-right.png +0 -0
  17. package/src/components/Arrow/img/arrow02-left-clicked.png +0 -0
  18. package/src/components/Arrow/img/arrow02-left.png +0 -0
  19. package/src/components/Arrow/img/arrow02-right-clicked.png +0 -0
  20. package/src/components/Arrow/img/arrow02-right.png +0 -0
  21. package/src/components/Button.tsx +40 -40
  22. package/src/components/Character/CharacterSelection.tsx +98 -98
  23. package/src/components/CharacterStatus/CharacterStatus.tsx +120 -120
  24. package/src/components/Chat/Chat.tsx +196 -196
  25. package/src/components/Chatdeprecated/ChatDeprecated.tsx +198 -198
  26. package/src/components/CheckButton.tsx +65 -65
  27. package/src/components/CircularController/CircularController.tsx +282 -282
  28. package/src/components/CraftBook/CraftBook.tsx +286 -286
  29. package/src/components/CraftBook/CraftingRecipe.tsx +161 -161
  30. package/src/components/CraftBook/MockItems.ts +101 -101
  31. package/src/components/DraggableContainer.tsx +181 -180
  32. package/src/components/DropdownSelectorContainer.tsx +42 -42
  33. package/src/components/Equipment/EquipmentSet.tsx +199 -199
  34. package/src/components/HistoryDialog.tsx +104 -104
  35. package/src/components/Input.tsx +15 -15
  36. package/src/components/InputRadio.tsx +41 -41
  37. package/src/components/Item/Cards/ItemInfo.tsx +298 -298
  38. package/src/components/Item/Cards/ItemInfoDisplay.tsx +135 -135
  39. package/src/components/Item/Cards/ItemInfoWrapper.tsx +62 -62
  40. package/src/components/Item/Cards/ItemTooltip.tsx +83 -83
  41. package/src/components/Item/Cards/MobileItemTooltip.tsx +149 -149
  42. package/src/components/Item/Inventory/ErrorBoundary.tsx +42 -42
  43. package/src/components/Item/Inventory/ItemContainer.tsx +231 -231
  44. package/src/components/Item/Inventory/ItemContainerTypes.ts +6 -6
  45. package/src/components/Item/Inventory/ItemQuantitySelector.tsx +138 -138
  46. package/src/components/Item/Inventory/ItemSlot.tsx +580 -580
  47. package/src/components/Item/Inventory/itemContainerHelper.ts +175 -175
  48. package/src/components/ListMenu.tsx +63 -63
  49. package/src/components/Marketplace/Marketplace.tsx +132 -132
  50. package/src/components/Marketplace/MarketplaceRows.tsx +171 -171
  51. package/src/components/Marketplace/__mocks__/index.tsx +65 -65
  52. package/src/components/Multitab/Tab.tsx +66 -66
  53. package/src/components/Multitab/TabBody.tsx +13 -13
  54. package/src/components/Multitab/TabsContainer.tsx +97 -97
  55. package/src/components/NPCDialog/NPCDialog.tsx +121 -121
  56. package/src/components/NPCDialog/NPCDialogText.tsx +113 -113
  57. package/src/components/NPCDialog/NPCMultiDialog.tsx +159 -159
  58. package/src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx +237 -237
  59. package/src/components/ProgressBar.tsx +95 -95
  60. package/src/components/PropertySelect/PropertySelect.tsx +106 -106
  61. package/src/components/QuestInfo/QuestInfo.tsx +233 -233
  62. package/src/components/QuestList.tsx +135 -135
  63. package/src/components/RPGUIContainer.tsx +47 -47
  64. package/src/components/RPGUIForceRenderStart.tsx +45 -45
  65. package/src/components/RPGUIRoot.tsx +14 -14
  66. package/src/components/RadioButton.tsx +53 -53
  67. package/src/components/RadioInput/RadioButton.tsx +96 -96
  68. package/src/components/RadioInput/RadioInput.tsx +102 -102
  69. package/src/components/RadioInput/instruments.ts +15 -15
  70. package/src/components/RangeSlider.tsx +78 -78
  71. package/src/components/RelativeListMenu.tsx +90 -90
  72. package/src/components/ScrollList.tsx +79 -79
  73. package/src/components/Shortcuts/Shortcuts.tsx +193 -193
  74. package/src/components/Shortcuts/ShortcutsSetter.tsx +139 -139
  75. package/src/components/Shortcuts/SingleShortcut.ts +82 -82
  76. package/src/components/Shortcuts/useShortcutCooldown.ts +23 -23
  77. package/src/components/SimpleProgressBar.tsx +62 -62
  78. package/src/components/SkillProgressBar.tsx +133 -133
  79. package/src/components/SkillsContainer.tsx +211 -211
  80. package/src/components/Spellbook/Spell.tsx +236 -236
  81. package/src/components/Spellbook/Spellbook.tsx +161 -161
  82. package/src/components/Spellbook/cards/MobileSpellTooltip.tsx +137 -137
  83. package/src/components/Spellbook/cards/SpellInfo.tsx +134 -134
  84. package/src/components/Spellbook/cards/SpellInfoDisplay.tsx +31 -31
  85. package/src/components/Spellbook/cards/SpellInfoWrapper.tsx +48 -48
  86. package/src/components/Spellbook/cards/SpellTooltip.tsx +70 -70
  87. package/src/components/Spellbook/constants.ts +7 -7
  88. package/src/components/Spellbook/mockSpells.ts +84 -84
  89. package/src/components/StaticBook/StaticBook.tsx +103 -103
  90. package/src/components/TextArea.tsx +11 -11
  91. package/src/components/TimeWidget/DayNightPeriod/DayNightPeriod.tsx +35 -35
  92. package/src/components/TimeWidget/TimeWidget.tsx +65 -65
  93. package/src/components/TradingMenu/TradingItemRow.tsx +199 -199
  94. package/src/components/TradingMenu/TradingMenu.tsx +219 -219
  95. package/src/components/TradingMenu/items.mock.ts +48 -48
  96. package/src/components/Truncate.tsx +25 -25
  97. package/src/components/itemSelector/ItemSelector.tsx +136 -136
  98. package/src/components/shared/Column.tsx +16 -16
  99. package/src/components/shared/Ellipsis.tsx +68 -68
  100. package/src/components/shared/SpriteFromAtlas.tsx +104 -104
  101. package/src/components/typography/DynamicText.tsx +49 -49
  102. package/src/constants/uiColors.ts +20 -20
  103. package/src/constants/uiDevices.ts +3 -3
  104. package/src/constants/uiFonts.ts +12 -12
  105. package/src/hooks/useEventListener.ts +21 -21
  106. package/src/hooks/useOutsideAlerter.ts +25 -25
  107. package/src/index.tsx +42 -42
  108. package/src/libs/CastingTypeHelper.ts +7 -7
  109. package/src/libs/StringHelpers.ts +3 -3
  110. package/src/libs/itemCounter.ts +21 -21
  111. package/src/mocks/atlas/entities/entities.json +20215 -20215
  112. package/src/mocks/atlas/icons/icons.json +735 -735
  113. package/src/mocks/atlas/items/items.json +12086 -12086
  114. package/src/mocks/equipmentSet.mocks.ts +391 -391
  115. package/src/mocks/itemContainer.mocks.ts +605 -605
  116. package/src/mocks/skills.mocks.ts +128 -128
  117. package/src/stories/Arrow.stories.tsx +26 -26
  118. package/src/stories/Button.stories.tsx +36 -36
  119. package/src/stories/CharacterSelection.stories.tsx +44 -44
  120. package/src/stories/CharacterStatus.stories.tsx +29 -29
  121. package/src/stories/Chat.stories.tsx +187 -187
  122. package/src/stories/ChatDeprecated.stories.tsx +170 -170
  123. package/src/stories/CheckButton.stories.tsx +48 -48
  124. package/src/stories/CircullarController.stories.tsx +37 -37
  125. package/src/stories/CraftBook.stories.tsx +42 -42
  126. package/src/stories/DayNightPeriod.stories.tsx +27 -27
  127. package/src/stories/DraggableContainer.stories.tsx +28 -28
  128. package/src/stories/Dropdown.stories.tsx +46 -46
  129. package/src/stories/DropdownSelectorContainer.stories.tsx +41 -41
  130. package/src/stories/EquipmentSet.stories.tsx +65 -65
  131. package/src/stories/HistoryDialog.stories.tsx +61 -61
  132. package/src/stories/ItemContainer.stories.tsx +201 -201
  133. package/src/stories/ItemInfoDisplay.stories.tsx +33 -33
  134. package/src/stories/ItemQuantitySelector.stories.tsx +26 -26
  135. package/src/stories/ItemSelector.stories.tsx +77 -77
  136. package/src/stories/ItemTradingComponent.stories.tsx +35 -35
  137. package/src/stories/ListMenu.stories.tsx +56 -56
  138. package/src/stories/Marketplace.stories.tsx +42 -42
  139. package/src/stories/MarketplaceRows.stories.tsx +28 -28
  140. package/src/stories/Multitab.stories.tsx +51 -51
  141. package/src/stories/NPCDialog.stories.tsx +130 -130
  142. package/src/stories/NPCMultiDialog.stories.tsx +71 -71
  143. package/src/stories/ProgressBar.stories.tsx +23 -23
  144. package/src/stories/PropertySelect.stories.tsx +40 -40
  145. package/src/stories/QuestInfo.stories.tsx +107 -107
  146. package/src/stories/QuestList.stories.tsx +82 -82
  147. package/src/stories/RPGUIContainers.stories.tsx +42 -42
  148. package/src/stories/RadioButton.stories.tsx +49 -49
  149. package/src/stories/RadioInput.stories.tsx +34 -34
  150. package/src/stories/RangeSlider.stories.tsx +64 -64
  151. package/src/stories/ScrollList.stories.tsx +85 -85
  152. package/src/stories/Shortcuts.stories.tsx +39 -39
  153. package/src/stories/SimpleProgressBar.stories.tsx +22 -22
  154. package/src/stories/SkillProgressBar.stories.tsx +34 -34
  155. package/src/stories/SkillsContainer.stories.tsx +35 -35
  156. package/src/stories/SpellInfoDisplay.stories.tsx +27 -27
  157. package/src/stories/Spellbook.stories.tsx +104 -104
  158. package/src/stories/StaticBook.stories.tsx +32 -32
  159. package/src/stories/Text.stories.tsx +42 -42
  160. package/src/stories/TimeWidget.stories.tsx +27 -27
  161. package/src/stories/TradingMenu.stories.tsx +47 -47
  162. package/src/types/eventTypes.ts +4 -4
  163. package/src/types/index.d.ts +2 -2
@@ -1,193 +1,193 @@
1
- import {
2
- getItemTextureKeyPath,
3
- IItem,
4
- IItemContainer,
5
- IRawSpell,
6
- IShortcut,
7
- ShortcutType,
8
- } from '@rpg-engine/shared';
9
- import React, { useEffect, useRef } from 'react';
10
- import styled from 'styled-components';
11
- import { uiColors } from '../../constants/uiColors';
12
- import { countItemFromInventory } from '../../libs/itemCounter';
13
- import { SpriteFromAtlas } from '../shared/SpriteFromAtlas';
14
- import { SingleShortcut } from './SingleShortcut';
15
- import { useShortcutCooldown } from './useShortcutCooldown';
16
-
17
- export type ShortcutsProps = {
18
- shortcuts: IShortcut[];
19
- onShortcutCast: (index: number) => void;
20
- mana: number;
21
- isBlockedCastingByKeyboard?: boolean;
22
- inventory?: IItemContainer | null;
23
- atlasJSON: any;
24
- atlasIMG: any;
25
- spellCooldowns?: Record<string, number>;
26
- };
27
-
28
- export const Shortcuts: React.FC<ShortcutsProps> = ({
29
- shortcuts,
30
- onShortcutCast,
31
- mana,
32
- isBlockedCastingByKeyboard = false,
33
- atlasJSON,
34
- atlasIMG,
35
- inventory,
36
- spellCooldowns,
37
- }) => {
38
- const shortcutsRefs = useRef<HTMLButtonElement[]>([]);
39
-
40
- const { handleShortcutCast, shortcutCooldown } = useShortcutCooldown(
41
- onShortcutCast
42
- );
43
-
44
- useEffect(() => {
45
- const handleKeyDown = (e: KeyboardEvent) => {
46
- if (isBlockedCastingByKeyboard) return;
47
-
48
- const shortcutIndex = Number(e.key) - 1;
49
- if (shortcutIndex >= 0 && shortcutIndex <= 5) {
50
- handleShortcutCast(shortcutIndex);
51
- shortcutsRefs.current[shortcutIndex]?.classList.add('active');
52
- setTimeout(() => {
53
- shortcutsRefs.current[shortcutIndex]?.classList.remove('active');
54
- }, 150);
55
- }
56
- };
57
-
58
- window.addEventListener('keydown', handleKeyDown);
59
-
60
- return () => {
61
- window.removeEventListener('keydown', handleKeyDown);
62
- };
63
- }, [shortcuts, isBlockedCastingByKeyboard, shortcutCooldown]);
64
-
65
- return (
66
- <List>
67
- {Array.from({ length: 6 }).map((_, i) => {
68
- const buildClassName = (classBase: string, isOnCooldown: boolean) => {
69
- return `${classBase} ${isOnCooldown ? 'onCooldown' : ''}`;
70
- };
71
-
72
- const isOnShortcutCooldown = shortcutCooldown > 0;
73
-
74
- if (shortcuts && shortcuts[i]?.type === ShortcutType.Item) {
75
- const payload = shortcuts[i]?.payload as IItem | undefined;
76
-
77
- let itemsFromEquipment: (IItem | undefined | null)[] = [];
78
-
79
- if (inventory) {
80
- Object.keys(inventory.slots).forEach(i => {
81
- const index = parseInt(i);
82
-
83
- if (inventory.slots[index]?.key === payload?.key) {
84
- itemsFromEquipment.push(inventory.slots[index]);
85
- }
86
- });
87
- }
88
-
89
- const totalQty =
90
- payload && inventory
91
- ? countItemFromInventory(payload.key, inventory)
92
- : 0;
93
-
94
- return (
95
- <StyledShortcut
96
- key={i}
97
- onPointerDown={handleShortcutCast.bind(null, i)}
98
- disabled={false}
99
- ref={el => {
100
- if (el) shortcutsRefs.current[i] = el;
101
- }}
102
- >
103
- {isOnShortcutCooldown && (
104
- <span className="cooldown">{shortcutCooldown.toFixed(1)}</span>
105
- )}
106
- {payload && (
107
- <SpriteFromAtlas
108
- atlasIMG={atlasIMG}
109
- atlasJSON={atlasJSON}
110
- spriteKey={getItemTextureKeyPath(
111
- {
112
- key: payload.texturePath,
113
- texturePath: payload.texturePath,
114
- stackQty: payload.stackQty || 1,
115
- isStackable: payload.isStackable,
116
- },
117
- atlasJSON
118
- )}
119
- width={32}
120
- height={32}
121
- />
122
- )}
123
- <span className={buildClassName('qty', isOnShortcutCooldown)}>
124
- {totalQty}
125
- </span>
126
- <span
127
- className={buildClassName('keyboard', isOnShortcutCooldown)}
128
- >
129
- {i + 1}
130
- </span>
131
- </StyledShortcut>
132
- );
133
- }
134
-
135
- const payload =
136
- shortcuts && (shortcuts[i]?.payload as IRawSpell | undefined); //check if shortcuts exists before using the ? operator.
137
-
138
- const spellCooldown = !payload
139
- ? 0
140
- : spellCooldowns?.[payload.magicWords.replaceAll(' ', '_')] ??
141
- shortcutCooldown;
142
- const cooldown =
143
- spellCooldown > shortcutCooldown ? spellCooldown : shortcutCooldown;
144
- const isOnCooldown = cooldown > 0 && !!payload;
145
-
146
- return (
147
- <StyledShortcut
148
- key={i}
149
- onPointerDown={handleShortcutCast.bind(null, i)}
150
- disabled={mana < (payload?.manaCost ?? 0)}
151
- ref={el => {
152
- if (el) shortcutsRefs.current[i] = el;
153
- }}
154
- >
155
- {isOnCooldown && (
156
- <span className="cooldown">
157
- {cooldown.toFixed(cooldown < 10 ? 1 : 0)}
158
- </span>
159
- )}
160
- <span className={buildClassName('mana', isOnCooldown)}>
161
- {payload && payload.manaCost}
162
- </span>
163
- <span className="magicWords">
164
- {payload?.magicWords.split(' ').map(word => word[0])}
165
- </span>
166
- <span className={buildClassName('keyboard', isOnCooldown)}>
167
- {i + 1}
168
- </span>
169
- </StyledShortcut>
170
- );
171
- })}
172
- </List>
173
- );
174
- };
175
-
176
- const StyledShortcut = styled(SingleShortcut)`
177
- transition: all 0.15s;
178
-
179
- &.active {
180
- background-color: ${uiColors.gray};
181
- border-color: ${uiColors.yellow};
182
- }
183
- `;
184
-
185
- const List = styled.p`
186
- width: 100%;
187
- display: flex;
188
- align-items: center;
189
- justify-content: center;
190
- gap: 0.5rem;
191
- box-sizing: border-box;
192
- margin: 0 !important;
193
- `;
1
+ import {
2
+ getItemTextureKeyPath,
3
+ IItem,
4
+ IItemContainer,
5
+ IRawSpell,
6
+ IShortcut,
7
+ ShortcutType,
8
+ } from '@rpg-engine/shared';
9
+ import React, { useEffect, useRef } from 'react';
10
+ import styled from 'styled-components';
11
+ import { uiColors } from '../../constants/uiColors';
12
+ import { countItemFromInventory } from '../../libs/itemCounter';
13
+ import { SpriteFromAtlas } from '../shared/SpriteFromAtlas';
14
+ import { SingleShortcut } from './SingleShortcut';
15
+ import { useShortcutCooldown } from './useShortcutCooldown';
16
+
17
+ export type ShortcutsProps = {
18
+ shortcuts: IShortcut[];
19
+ onShortcutCast: (index: number) => void;
20
+ mana: number;
21
+ isBlockedCastingByKeyboard?: boolean;
22
+ inventory?: IItemContainer | null;
23
+ atlasJSON: any;
24
+ atlasIMG: any;
25
+ spellCooldowns?: Record<string, number>;
26
+ };
27
+
28
+ export const Shortcuts: React.FC<ShortcutsProps> = ({
29
+ shortcuts,
30
+ onShortcutCast,
31
+ mana,
32
+ isBlockedCastingByKeyboard = false,
33
+ atlasJSON,
34
+ atlasIMG,
35
+ inventory,
36
+ spellCooldowns,
37
+ }) => {
38
+ const shortcutsRefs = useRef<HTMLButtonElement[]>([]);
39
+
40
+ const { handleShortcutCast, shortcutCooldown } = useShortcutCooldown(
41
+ onShortcutCast
42
+ );
43
+
44
+ useEffect(() => {
45
+ const handleKeyDown = (e: KeyboardEvent) => {
46
+ if (isBlockedCastingByKeyboard) return;
47
+
48
+ const shortcutIndex = Number(e.key) - 1;
49
+ if (shortcutIndex >= 0 && shortcutIndex <= 5) {
50
+ handleShortcutCast(shortcutIndex);
51
+ shortcutsRefs.current[shortcutIndex]?.classList.add('active');
52
+ setTimeout(() => {
53
+ shortcutsRefs.current[shortcutIndex]?.classList.remove('active');
54
+ }, 150);
55
+ }
56
+ };
57
+
58
+ window.addEventListener('keydown', handleKeyDown);
59
+
60
+ return () => {
61
+ window.removeEventListener('keydown', handleKeyDown);
62
+ };
63
+ }, [shortcuts, isBlockedCastingByKeyboard, shortcutCooldown]);
64
+
65
+ return (
66
+ <List>
67
+ {Array.from({ length: 6 }).map((_, i) => {
68
+ const buildClassName = (classBase: string, isOnCooldown: boolean) => {
69
+ return `${classBase} ${isOnCooldown ? 'onCooldown' : ''}`;
70
+ };
71
+
72
+ const isOnShortcutCooldown = shortcutCooldown > 0;
73
+
74
+ if (shortcuts && shortcuts[i]?.type === ShortcutType.Item) {
75
+ const payload = shortcuts[i]?.payload as IItem | undefined;
76
+
77
+ let itemsFromEquipment: (IItem | undefined | null)[] = [];
78
+
79
+ if (inventory) {
80
+ Object.keys(inventory.slots).forEach(i => {
81
+ const index = parseInt(i);
82
+
83
+ if (inventory.slots[index]?.key === payload?.key) {
84
+ itemsFromEquipment.push(inventory.slots[index]);
85
+ }
86
+ });
87
+ }
88
+
89
+ const totalQty =
90
+ payload && inventory
91
+ ? countItemFromInventory(payload.key, inventory)
92
+ : 0;
93
+
94
+ return (
95
+ <StyledShortcut
96
+ key={i}
97
+ onPointerDown={handleShortcutCast.bind(null, i)}
98
+ disabled={false}
99
+ ref={el => {
100
+ if (el) shortcutsRefs.current[i] = el;
101
+ }}
102
+ >
103
+ {isOnShortcutCooldown && (
104
+ <span className="cooldown">{shortcutCooldown.toFixed(1)}</span>
105
+ )}
106
+ {payload && (
107
+ <SpriteFromAtlas
108
+ atlasIMG={atlasIMG}
109
+ atlasJSON={atlasJSON}
110
+ spriteKey={getItemTextureKeyPath(
111
+ {
112
+ key: payload.texturePath,
113
+ texturePath: payload.texturePath,
114
+ stackQty: payload.stackQty || 1,
115
+ isStackable: payload.isStackable,
116
+ },
117
+ atlasJSON
118
+ )}
119
+ width={32}
120
+ height={32}
121
+ />
122
+ )}
123
+ <span className={buildClassName('qty', isOnShortcutCooldown)}>
124
+ {totalQty}
125
+ </span>
126
+ <span
127
+ className={buildClassName('keyboard', isOnShortcutCooldown)}
128
+ >
129
+ {i + 1}
130
+ </span>
131
+ </StyledShortcut>
132
+ );
133
+ }
134
+
135
+ const payload =
136
+ shortcuts && (shortcuts[i]?.payload as IRawSpell | undefined); //check if shortcuts exists before using the ? operator.
137
+
138
+ const spellCooldown = !payload
139
+ ? 0
140
+ : spellCooldowns?.[payload.magicWords.replaceAll(' ', '_')] ??
141
+ shortcutCooldown;
142
+ const cooldown =
143
+ spellCooldown > shortcutCooldown ? spellCooldown : shortcutCooldown;
144
+ const isOnCooldown = cooldown > 0 && !!payload;
145
+
146
+ return (
147
+ <StyledShortcut
148
+ key={i}
149
+ onPointerDown={handleShortcutCast.bind(null, i)}
150
+ disabled={mana < (payload?.manaCost ?? 0)}
151
+ ref={el => {
152
+ if (el) shortcutsRefs.current[i] = el;
153
+ }}
154
+ >
155
+ {isOnCooldown && (
156
+ <span className="cooldown">
157
+ {cooldown.toFixed(cooldown < 10 ? 1 : 0)}
158
+ </span>
159
+ )}
160
+ <span className={buildClassName('mana', isOnCooldown)}>
161
+ {payload && payload.manaCost}
162
+ </span>
163
+ <span className="magicWords">
164
+ {payload?.magicWords.split(' ').map(word => word[0])}
165
+ </span>
166
+ <span className={buildClassName('keyboard', isOnCooldown)}>
167
+ {i + 1}
168
+ </span>
169
+ </StyledShortcut>
170
+ );
171
+ })}
172
+ </List>
173
+ );
174
+ };
175
+
176
+ const StyledShortcut = styled(SingleShortcut)`
177
+ transition: all 0.15s;
178
+
179
+ &.active {
180
+ background-color: ${uiColors.gray};
181
+ border-color: ${uiColors.yellow};
182
+ }
183
+ `;
184
+
185
+ const List = styled.p`
186
+ width: 100%;
187
+ display: flex;
188
+ align-items: center;
189
+ justify-content: center;
190
+ gap: 0.5rem;
191
+ box-sizing: border-box;
192
+ margin: 0 !important;
193
+ `;
@@ -1,139 +1,139 @@
1
- import {
2
- getItemTextureKeyPath,
3
- IItem,
4
- IRawSpell,
5
- IShortcut,
6
- ShortcutType,
7
- } from '@rpg-engine/shared';
8
- import React from 'react';
9
- import styled from 'styled-components';
10
- import { uiColors } from '../../constants/uiColors';
11
- import { SpriteFromAtlas } from '../shared/SpriteFromAtlas';
12
-
13
- type ShortcutsSetterProps = {
14
- setSettingShortcutIndex: (index: number) => void;
15
- settingShortcutIndex: number;
16
- shortcuts: IShortcut[];
17
- removeShortcut: (index: number) => void;
18
- atlasJSON: any;
19
- atlasIMG: any;
20
- };
21
-
22
- export const ShortcutsSetter: React.FC<ShortcutsSetterProps> = ({
23
- setSettingShortcutIndex,
24
- settingShortcutIndex,
25
- shortcuts,
26
- removeShortcut,
27
- atlasJSON,
28
- atlasIMG,
29
- }) => {
30
- const getContent = (index: number) => {
31
- if (shortcuts[index]?.type === ShortcutType.Item) {
32
- const payload = shortcuts[index]?.payload as IItem | undefined;
33
-
34
- if (!payload) return null;
35
-
36
- return (
37
- <SpriteFromAtlas
38
- atlasIMG={atlasIMG}
39
- atlasJSON={atlasJSON}
40
- spriteKey={getItemTextureKeyPath(
41
- {
42
- key: payload.texturePath,
43
- texturePath: payload.texturePath,
44
- stackQty: payload.stackQty || 1,
45
- isStackable: payload.isStackable,
46
- },
47
- atlasJSON
48
- )}
49
- width={32}
50
- height={32}
51
- imgScale={1.6}
52
- imgStyle={{ left: '5px' }}
53
- />
54
- );
55
- }
56
-
57
- const payload = shortcuts[index]?.payload as IRawSpell | undefined;
58
-
59
- return <span>{payload?.magicWords.split(' ').map(word => word[0])}</span>;
60
- };
61
-
62
- return (
63
- <Container>
64
- <p>Shortcuts:</p>
65
- <List id="shortcuts_list">
66
- {Array.from({ length: 6 }).map((_, i) => (
67
- <Shortcut
68
- key={i}
69
- onPointerDown={() => {
70
- if (settingShortcutIndex !== -1) setSettingShortcutIndex(-1);
71
-
72
- removeShortcut(i);
73
- if (
74
- settingShortcutIndex === -1 &&
75
- (!shortcuts[i] || shortcuts[i].type === ShortcutType.None)
76
- )
77
- setSettingShortcutIndex(i);
78
- }}
79
- disabled={settingShortcutIndex !== -1 && settingShortcutIndex !== i}
80
- isBeingSet={settingShortcutIndex === i}
81
- id={`shortcutSetter_${i}`}
82
- >
83
- {getContent(i)}
84
- </Shortcut>
85
- ))}
86
- </List>
87
- </Container>
88
- );
89
- };
90
-
91
- const Container = styled.div`
92
- p {
93
- margin: 0;
94
- margin-left: 0.5rem;
95
- }
96
- `;
97
-
98
- const Shortcut = styled.button<{ isBeingSet?: boolean }>`
99
- width: 2.6rem;
100
- height: 2.6rem;
101
- background-color: ${uiColors.lightGray};
102
- border: 2px solid
103
- ${({ isBeingSet }) => (isBeingSet ? uiColors.yellow : uiColors.darkGray)};
104
- border-radius: 50%;
105
- text-transform: uppercase;
106
- font-size: 0.7rem;
107
- font-weight: bold;
108
- display: flex;
109
- align-items: center;
110
- justify-content: center;
111
-
112
- span {
113
- margin-top: 4px;
114
- }
115
-
116
- &:hover,
117
- &:focus {
118
- background-color: ${uiColors.darkGray};
119
- }
120
-
121
- &:active {
122
- background-color: ${uiColors.gray};
123
- }
124
-
125
- &:disabled {
126
- opacity: 0.5;
127
- }
128
- `;
129
-
130
- const List = styled.div`
131
- width: 100%;
132
- display: flex;
133
- align-items: center;
134
- gap: 0.5rem;
135
- padding-bottom: 0.5rem;
136
- padding-left: 0.5rem;
137
- box-sizing: border-box;
138
- margin: 0 !important;
139
- `;
1
+ import {
2
+ getItemTextureKeyPath,
3
+ IItem,
4
+ IRawSpell,
5
+ IShortcut,
6
+ ShortcutType,
7
+ } from '@rpg-engine/shared';
8
+ import React from 'react';
9
+ import styled from 'styled-components';
10
+ import { uiColors } from '../../constants/uiColors';
11
+ import { SpriteFromAtlas } from '../shared/SpriteFromAtlas';
12
+
13
+ type ShortcutsSetterProps = {
14
+ setSettingShortcutIndex: (index: number) => void;
15
+ settingShortcutIndex: number;
16
+ shortcuts: IShortcut[];
17
+ removeShortcut: (index: number) => void;
18
+ atlasJSON: any;
19
+ atlasIMG: any;
20
+ };
21
+
22
+ export const ShortcutsSetter: React.FC<ShortcutsSetterProps> = ({
23
+ setSettingShortcutIndex,
24
+ settingShortcutIndex,
25
+ shortcuts,
26
+ removeShortcut,
27
+ atlasJSON,
28
+ atlasIMG,
29
+ }) => {
30
+ const getContent = (index: number) => {
31
+ if (shortcuts[index]?.type === ShortcutType.Item) {
32
+ const payload = shortcuts[index]?.payload as IItem | undefined;
33
+
34
+ if (!payload) return null;
35
+
36
+ return (
37
+ <SpriteFromAtlas
38
+ atlasIMG={atlasIMG}
39
+ atlasJSON={atlasJSON}
40
+ spriteKey={getItemTextureKeyPath(
41
+ {
42
+ key: payload.texturePath,
43
+ texturePath: payload.texturePath,
44
+ stackQty: payload.stackQty || 1,
45
+ isStackable: payload.isStackable,
46
+ },
47
+ atlasJSON
48
+ )}
49
+ width={32}
50
+ height={32}
51
+ imgScale={1.6}
52
+ imgStyle={{ left: '5px' }}
53
+ />
54
+ );
55
+ }
56
+
57
+ const payload = shortcuts[index]?.payload as IRawSpell | undefined;
58
+
59
+ return <span>{payload?.magicWords.split(' ').map(word => word[0])}</span>;
60
+ };
61
+
62
+ return (
63
+ <Container>
64
+ <p>Shortcuts:</p>
65
+ <List id="shortcuts_list">
66
+ {Array.from({ length: 6 }).map((_, i) => (
67
+ <Shortcut
68
+ key={i}
69
+ onPointerDown={() => {
70
+ if (settingShortcutIndex !== -1) setSettingShortcutIndex(-1);
71
+
72
+ removeShortcut(i);
73
+ if (
74
+ settingShortcutIndex === -1 &&
75
+ (!shortcuts[i] || shortcuts[i].type === ShortcutType.None)
76
+ )
77
+ setSettingShortcutIndex(i);
78
+ }}
79
+ disabled={settingShortcutIndex !== -1 && settingShortcutIndex !== i}
80
+ isBeingSet={settingShortcutIndex === i}
81
+ id={`shortcutSetter_${i}`}
82
+ >
83
+ {getContent(i)}
84
+ </Shortcut>
85
+ ))}
86
+ </List>
87
+ </Container>
88
+ );
89
+ };
90
+
91
+ const Container = styled.div`
92
+ p {
93
+ margin: 0;
94
+ margin-left: 0.5rem;
95
+ }
96
+ `;
97
+
98
+ const Shortcut = styled.button<{ isBeingSet?: boolean }>`
99
+ width: 2.6rem;
100
+ height: 2.6rem;
101
+ background-color: ${uiColors.lightGray};
102
+ border: 2px solid
103
+ ${({ isBeingSet }) => (isBeingSet ? uiColors.yellow : uiColors.darkGray)};
104
+ border-radius: 50%;
105
+ text-transform: uppercase;
106
+ font-size: 0.7rem;
107
+ font-weight: bold;
108
+ display: flex;
109
+ align-items: center;
110
+ justify-content: center;
111
+
112
+ span {
113
+ margin-top: 4px;
114
+ }
115
+
116
+ &:hover,
117
+ &:focus {
118
+ background-color: ${uiColors.darkGray};
119
+ }
120
+
121
+ &:active {
122
+ background-color: ${uiColors.gray};
123
+ }
124
+
125
+ &:disabled {
126
+ opacity: 0.5;
127
+ }
128
+ `;
129
+
130
+ const List = styled.div`
131
+ width: 100%;
132
+ display: flex;
133
+ align-items: center;
134
+ gap: 0.5rem;
135
+ padding-bottom: 0.5rem;
136
+ padding-left: 0.5rem;
137
+ box-sizing: border-box;
138
+ margin: 0 !important;
139
+ `;