@rpg-engine/long-bow 0.1.79 → 0.1.82

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 (60) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +181 -181
  3. package/dist/components/Equipment/EquipmentSet.d.ts +2 -2
  4. package/dist/components/store/UI.store.d.ts +0 -3
  5. package/dist/long-bow.cjs.development.js +282 -272
  6. package/dist/long-bow.cjs.development.js.map +1 -1
  7. package/dist/long-bow.cjs.production.min.js +1 -1
  8. package/dist/long-bow.cjs.production.min.js.map +1 -1
  9. package/dist/long-bow.esm.js +282 -272
  10. package/dist/long-bow.esm.js.map +1 -1
  11. package/dist/mocks/equipmentSet.mocks.d.ts +2 -2
  12. package/package.json +96 -96
  13. package/src/components/Abstractions/SlotsContainer.tsx +42 -42
  14. package/src/components/Button.tsx +29 -29
  15. package/src/components/Chat/Chat.tsx +193 -193
  16. package/src/components/CheckButton.tsx +65 -65
  17. package/src/components/DraggableContainer.tsx +150 -150
  18. package/src/components/Dropdown.tsx +57 -57
  19. package/src/components/Equipment/EquipmentSet.tsx +179 -179
  20. package/src/components/Input.tsx +11 -11
  21. package/src/components/Item/Cards/ItemCard.tsx +36 -36
  22. package/src/components/Item/Inventory/ItemContainer.tsx +113 -113
  23. package/src/components/Item/Inventory/ItemSlot.tsx +158 -158
  24. package/src/components/Item/Inventory/itemContainerHelper.ts +81 -81
  25. package/src/components/ListMenu.tsx +65 -65
  26. package/src/components/Multitab/Tab.tsx +57 -57
  27. package/src/components/Multitab/TabBody.tsx +13 -13
  28. package/src/components/Multitab/TabsContainer.tsx +97 -97
  29. package/src/components/NPCDialog/NPCDialog.tsx +145 -145
  30. package/src/components/NPCDialog/NPCDialogText.tsx +53 -53
  31. package/src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx +242 -242
  32. package/src/components/ProgressBar.tsx +91 -91
  33. package/src/components/RPGUIContainer.tsx +47 -47
  34. package/src/components/RPGUIRoot.tsx +14 -14
  35. package/src/components/RadioButton.tsx +53 -53
  36. package/src/components/RangeSlider.tsx +68 -68
  37. package/src/components/ScrollList.tsx +77 -77
  38. package/src/components/SimpleProgressBar.tsx +62 -62
  39. package/src/components/SkillProgressBar.tsx +124 -124
  40. package/src/components/SkillsContainer.tsx +235 -235
  41. package/src/components/TextArea.tsx +11 -11
  42. package/src/components/Truncate.tsx +25 -25
  43. package/src/components/shared/Column.tsx +16 -16
  44. package/src/components/shared/SpriteFromAtlas.tsx +99 -99
  45. package/src/components/shared/SpriteIcon.tsx +67 -67
  46. package/src/components/store/UI.store.ts +192 -205
  47. package/src/components/typography/DynamicText.tsx +49 -49
  48. package/src/constants/uiColors.ts +10 -10
  49. package/src/hooks/useEventListener.ts +21 -21
  50. package/src/hooks/useOutsideAlerter.ts +25 -25
  51. package/src/index.tsx +25 -25
  52. package/src/libs/StringHelpers.ts +3 -3
  53. package/src/mocks/atlas/icons/icons.json +303 -303
  54. package/src/mocks/atlas/items/items.json +5215 -5195
  55. package/src/mocks/atlas/items/items.png +0 -0
  56. package/src/mocks/equipmentSet.mocks.ts +347 -347
  57. package/src/mocks/itemContainer.mocks.ts +249 -249
  58. package/src/mocks/skills.mocks.ts +122 -122
  59. package/src/types/eventTypes.ts +4 -4
  60. package/src/types/index.d.ts +2 -2
@@ -1,113 +1,113 @@
1
- import { IItem, IItemContainer, ItemSocketEvents } from '@rpg-engine/shared';
2
- import { observer } from 'mobx-react';
3
- import React, { useState } from 'react';
4
- import styled from 'styled-components';
5
- import { IPosition } from '../../../types/eventTypes';
6
- import { SlotsContainer } from '../../Abstractions/SlotsContainer';
7
- import { ListMenu } from '../../ListMenu';
8
- import { uiStore } from '../../store/UI.store';
9
- import { ItemCard } from '../Cards/ItemCard';
10
- import { ItemSlot, SlotContainerType } from './ItemSlot';
11
-
12
- export interface IItemContainerProps {
13
- itemContainer: IItemContainer;
14
- onClose?: () => void;
15
- onMouseOver?: (e: any, slotIndex: number, item: IItem | null) => void;
16
- onActionSelected?: (payload: any) => void;
17
- initialPosition?: { x: number; y: number };
18
- }
19
-
20
- export const ItemContainer: React.FC<IItemContainerProps> = observer(
21
- ({
22
- itemContainer,
23
- onClose,
24
- onMouseOver,
25
- onActionSelected,
26
- initialPosition = { x: 0, y: 0 },
27
- }) => {
28
- // we use this draggable position to offset the menu position, after the container is dragged (otherwise, it bugs!)
29
- const [draggablePosition, setDraggablePosition] = useState<IPosition>(
30
- initialPosition
31
- );
32
-
33
- const handleOnMouseHover = (
34
- event: any,
35
- slotIndex: number,
36
- item: IItem | null,
37
- x: number,
38
- y: number
39
- ) => {
40
- uiStore.handleOnMouseHover(event, slotIndex, item, x, y, onMouseOver);
41
- };
42
-
43
- const onSelected = (selectedActionId: ItemSocketEvents | string): void => {
44
- uiStore.onSelected(selectedActionId, onActionSelected);
45
- };
46
-
47
- const onRenderSlots = () => {
48
- const slots = [];
49
-
50
- for (let i = 0; i < itemContainer.slotQty; i++) {
51
- slots.push(
52
- <ItemSlot
53
- key={i}
54
- slotIndex={i}
55
- item={itemContainer.slots?.[i] || null}
56
- slotContainerType={SlotContainerType.INVENTORY}
57
- onMouseOver={handleOnMouseHover}
58
- onClick={uiStore.handleOnItemClick}
59
- onMouseOut={() => {
60
- uiStore.clearItemHoverDetail();
61
- }}
62
- onCancelContextMenu={() => {
63
- uiStore.clearContextMenu();
64
- }}
65
- />
66
- );
67
- }
68
- return slots;
69
- };
70
-
71
- return (
72
- <SlotsContainer
73
- title={itemContainer.name || 'Container'}
74
- onPositionChange={({ x, y }) => {
75
- setDraggablePosition({ x, y });
76
- }}
77
- onOutsideClick={() => {
78
- uiStore.clearContextMenu();
79
- uiStore.clearItemHoverDetail();
80
- }}
81
- onClose={onClose}
82
- >
83
- <ItemsContainer className="item-container-body">
84
- {onRenderSlots()}
85
- </ItemsContainer>
86
-
87
- {uiStore.contextMenu?.visible ? (
88
- <ListMenu
89
- x={uiStore.contextMenu.posX - draggablePosition.x}
90
- y={uiStore.contextMenu.posY - draggablePosition.y}
91
- options={uiStore.contextMenu.contextActions}
92
- onSelected={onSelected}
93
- />
94
- ) : null}
95
-
96
- {uiStore.onHoverDetail?.visible ? (
97
- <ItemCard
98
- item={uiStore.onHoverDetail.item}
99
- x={uiStore.onHoverDetail.posX - draggablePosition.x}
100
- y={uiStore.onHoverDetail.posY - draggablePosition.y}
101
- />
102
- ) : null}
103
- </SlotsContainer>
104
- );
105
- }
106
- );
107
-
108
- const ItemsContainer = styled.div`
109
- max-width: 280px;
110
- display: flex;
111
- justify-content: center;
112
- flex-wrap: wrap;
113
- `;
1
+ import { IItem, IItemContainer, ItemSocketEvents } from '@rpg-engine/shared';
2
+ import { observer } from 'mobx-react';
3
+ import React, { useState } from 'react';
4
+ import styled from 'styled-components';
5
+ import { IPosition } from '../../../types/eventTypes';
6
+ import { SlotsContainer } from '../../Abstractions/SlotsContainer';
7
+ import { ListMenu } from '../../ListMenu';
8
+ import { uiStore } from '../../store/UI.store';
9
+ import { ItemCard } from '../Cards/ItemCard';
10
+ import { ItemSlot, SlotContainerType } from './ItemSlot';
11
+
12
+ export interface IItemContainerProps {
13
+ itemContainer: IItemContainer;
14
+ onClose?: () => void;
15
+ onMouseOver?: (e: any, slotIndex: number, item: IItem | null) => void;
16
+ onActionSelected?: (payload: any) => void;
17
+ initialPosition?: { x: number; y: number };
18
+ }
19
+
20
+ export const ItemContainer: React.FC<IItemContainerProps> = observer(
21
+ ({
22
+ itemContainer,
23
+ onClose,
24
+ onMouseOver,
25
+ onActionSelected,
26
+ initialPosition = { x: 0, y: 0 },
27
+ }) => {
28
+ // we use this draggable position to offset the menu position, after the container is dragged (otherwise, it bugs!)
29
+ const [draggablePosition, setDraggablePosition] = useState<IPosition>(
30
+ initialPosition
31
+ );
32
+
33
+ const handleOnMouseHover = (
34
+ event: any,
35
+ slotIndex: number,
36
+ item: IItem | null,
37
+ x: number,
38
+ y: number
39
+ ) => {
40
+ uiStore.handleOnMouseHover(event, slotIndex, item, x, y, onMouseOver);
41
+ };
42
+
43
+ const onSelected = (selectedActionId: ItemSocketEvents | string): void => {
44
+ uiStore.onSelected(selectedActionId, onActionSelected);
45
+ };
46
+
47
+ const onRenderSlots = () => {
48
+ const slots = [];
49
+
50
+ for (let i = 0; i < itemContainer.slotQty; i++) {
51
+ slots.push(
52
+ <ItemSlot
53
+ key={i}
54
+ slotIndex={i}
55
+ item={itemContainer.slots?.[i] || null}
56
+ slotContainerType={SlotContainerType.INVENTORY}
57
+ onMouseOver={handleOnMouseHover}
58
+ onClick={uiStore.handleOnItemClick}
59
+ onMouseOut={() => {
60
+ uiStore.clearItemHoverDetail();
61
+ }}
62
+ onCancelContextMenu={() => {
63
+ uiStore.clearContextMenu();
64
+ }}
65
+ />
66
+ );
67
+ }
68
+ return slots;
69
+ };
70
+
71
+ return (
72
+ <SlotsContainer
73
+ title={itemContainer.name || 'Container'}
74
+ onPositionChange={({ x, y }) => {
75
+ setDraggablePosition({ x, y });
76
+ }}
77
+ onOutsideClick={() => {
78
+ uiStore.clearContextMenu();
79
+ uiStore.clearItemHoverDetail();
80
+ }}
81
+ onClose={onClose}
82
+ >
83
+ <ItemsContainer className="item-container-body">
84
+ {onRenderSlots()}
85
+ </ItemsContainer>
86
+
87
+ {uiStore.contextMenu?.visible ? (
88
+ <ListMenu
89
+ x={uiStore.contextMenu.posX - draggablePosition.x}
90
+ y={uiStore.contextMenu.posY - draggablePosition.y}
91
+ options={uiStore.contextMenu.contextActions}
92
+ onSelected={onSelected}
93
+ />
94
+ ) : null}
95
+
96
+ {uiStore.onHoverDetail?.visible ? (
97
+ <ItemCard
98
+ item={uiStore.onHoverDetail.item}
99
+ x={uiStore.onHoverDetail.posX - draggablePosition.x}
100
+ y={uiStore.onHoverDetail.posY - draggablePosition.y}
101
+ />
102
+ ) : null}
103
+ </SlotsContainer>
104
+ );
105
+ }
106
+ );
107
+
108
+ const ItemsContainer = styled.div`
109
+ max-width: 280px;
110
+ display: flex;
111
+ justify-content: center;
112
+ flex-wrap: wrap;
113
+ `;
@@ -1,158 +1,158 @@
1
- import { IItem, IItemContainer, ItemSlotType } from '@rpg-engine/shared';
2
- import React from 'react';
3
- import styled from 'styled-components';
4
- import atlasJSON from '../../../mocks/atlas/items/items.json';
5
- import atlasIMG from '../../../mocks/atlas/items/items.png';
6
- import { SpriteFromAtlas } from '../../shared/SpriteFromAtlas';
7
-
8
- export enum SlotContainerType {
9
- INVENTORY = 'Inventory',
10
- EQUIPMENT_SET = 'EquipmentSet',
11
- }
12
-
13
- const EquipmentSlotSpriteByType: any = {
14
- Neck: 'accessories/corruption-necklace.png',
15
- LeftHand: 'swords/broad-sword.png',
16
- Ring: 'rings/iron-ring.png',
17
- Head: 'helmets/viking-helmet.png',
18
- Torso: 'armors/iron-armor.png',
19
- Legs: 'legs/studded-legs.png',
20
- Feet: 'boots/iron-boots.png',
21
- Inventory: 'containers/bag.png',
22
- RightHand: 'shields/plate-shield.png',
23
- Accessory: 'gloves/plate-gloves.png',
24
- };
25
-
26
- interface IProps {
27
- slotIndex: number;
28
- item: IItem | null;
29
- itemContainer?: IItemContainer | null;
30
- slotContainerType: SlotContainerType | null;
31
- slotSpriteMask?: ItemSlotType | null;
32
- onMouseOver: (
33
- event: any,
34
- slotIndex: number,
35
- item: IItem | null,
36
- x: number,
37
- y: number
38
- ) => void;
39
- onMouseOut: () => void;
40
- onClick: (
41
- item: IItem,
42
- posX: number,
43
- posY: number,
44
- slotContainerType: SlotContainerType | null
45
- ) => void;
46
- onCancelContextMenu: () => void;
47
- }
48
-
49
- export const ItemSlot: React.FC<IProps> = ({
50
- slotIndex,
51
- item,
52
- slotContainerType,
53
- slotSpriteMask,
54
- onMouseOver,
55
- onMouseOut,
56
- onClick,
57
- onCancelContextMenu,
58
- }) => {
59
- const getLeftPositionValue = (quantity: number) => {
60
- if (quantity > 0 && quantity < 10) return '2.5rem';
61
- else if (quantity > 9 && quantity < 100) return '2.0rem';
62
- else if (quantity > 99) return '1rem';
63
- return '2.5rem';
64
- };
65
-
66
- const renderItem = (itemToRender: IItem | null) => {
67
- const element = [];
68
- if (itemToRender?.texturePath) {
69
- element.push(
70
- <SpriteFromAtlas
71
- atlasIMG={atlasIMG}
72
- atlasJSON={atlasJSON}
73
- spriteKey={itemToRender.texturePath}
74
- imgScale={3}
75
- />
76
- );
77
- }
78
- if (itemToRender?.isStackable && itemToRender?.stackQty) {
79
- element.push(
80
- <ItemQty left={getLeftPositionValue(itemToRender.stackQty)}>
81
- {' '}
82
- {itemToRender.stackQty}{' '}
83
- </ItemQty>
84
- );
85
- }
86
- return element;
87
- };
88
-
89
- const renderEquipment = (itemToRender: IItem | null) => {
90
- if (
91
- itemToRender?.texturePath &&
92
- itemToRender.allowedEquipSlotType?.includes(slotSpriteMask!)
93
- ) {
94
- return (
95
- <SpriteFromAtlas
96
- atlasIMG={atlasIMG}
97
- atlasJSON={atlasJSON}
98
- spriteKey={itemToRender.texturePath}
99
- imgScale={3}
100
- />
101
- );
102
- } else {
103
- return (
104
- <SpriteFromAtlas
105
- atlasIMG={atlasIMG}
106
- atlasJSON={atlasJSON}
107
- spriteKey={EquipmentSlotSpriteByType[slotSpriteMask!]}
108
- imgScale={3}
109
- grayScale={true}
110
- opacity={0.4}
111
- />
112
- );
113
- }
114
- };
115
-
116
- const onRenderSlot = (itemToRender: IItem | null) => {
117
- if (slotContainerType === SlotContainerType.EQUIPMENT_SET)
118
- return renderEquipment(itemToRender);
119
- return renderItem(itemToRender);
120
- };
121
-
122
- return (
123
- <Container
124
- className="rpgui-icon empty-slot"
125
- onMouseOver={event =>
126
- onMouseOver(event, slotIndex, item, event.clientX, event.clientY)
127
- }
128
- onMouseOut={() => onMouseOut()}
129
- onClick={e => {
130
- if (item) {
131
- onClick(item, e.clientX, e.clientY, slotContainerType);
132
- } else {
133
- onCancelContextMenu();
134
- }
135
- }}
136
- >
137
- {onRenderSlot(item)}
138
- </Container>
139
- );
140
- };
141
-
142
- const Container = styled.div`
143
- margin: 0.1rem;
144
- .sprite-from-atlas-img {
145
- position: relative;
146
- top: 1.5rem;
147
- left: 1.5rem;
148
- }
149
- `;
150
-
151
- interface IItemQtyProps {
152
- left: string;
153
- }
154
- const ItemQty = styled.span<IItemQtyProps>`
155
- position: relative;
156
- top: 1.5rem;
157
- left: ${props => props.left};
158
- `;
1
+ import { IItem, IItemContainer, ItemSlotType } from '@rpg-engine/shared';
2
+ import React from 'react';
3
+ import styled from 'styled-components';
4
+ import atlasJSON from '../../../mocks/atlas/items/items.json';
5
+ import atlasIMG from '../../../mocks/atlas/items/items.png';
6
+ import { SpriteFromAtlas } from '../../shared/SpriteFromAtlas';
7
+
8
+ export enum SlotContainerType {
9
+ INVENTORY = 'Inventory',
10
+ EQUIPMENT_SET = 'EquipmentSet',
11
+ }
12
+
13
+ const EquipmentSlotSpriteByType: any = {
14
+ Neck: 'accessories/corruption-necklace.png',
15
+ LeftHand: 'swords/broad-sword.png',
16
+ Ring: 'rings/iron-ring.png',
17
+ Head: 'helmets/viking-helmet.png',
18
+ Torso: 'armors/iron-armor.png',
19
+ Legs: 'legs/studded-legs.png',
20
+ Feet: 'boots/iron-boots.png',
21
+ Inventory: 'containers/bag.png',
22
+ RightHand: 'shields/plate-shield.png',
23
+ Accessory: 'gloves/plate-gloves.png',
24
+ };
25
+
26
+ interface IProps {
27
+ slotIndex: number;
28
+ item: IItem | null;
29
+ itemContainer?: IItemContainer | null;
30
+ slotContainerType: SlotContainerType | null;
31
+ slotSpriteMask?: ItemSlotType | null;
32
+ onMouseOver: (
33
+ event: any,
34
+ slotIndex: number,
35
+ item: IItem | null,
36
+ x: number,
37
+ y: number
38
+ ) => void;
39
+ onMouseOut: () => void;
40
+ onClick: (
41
+ item: IItem,
42
+ posX: number,
43
+ posY: number,
44
+ slotContainerType: SlotContainerType | null
45
+ ) => void;
46
+ onCancelContextMenu: () => void;
47
+ }
48
+
49
+ export const ItemSlot: React.FC<IProps> = ({
50
+ slotIndex,
51
+ item,
52
+ slotContainerType,
53
+ slotSpriteMask,
54
+ onMouseOver,
55
+ onMouseOut,
56
+ onClick,
57
+ onCancelContextMenu,
58
+ }) => {
59
+ const getLeftPositionValue = (quantity: number) => {
60
+ if (quantity > 0 && quantity < 10) return '2.5rem';
61
+ else if (quantity > 9 && quantity < 100) return '2.0rem';
62
+ else if (quantity > 99) return '1rem';
63
+ return '2.5rem';
64
+ };
65
+
66
+ const renderItem = (itemToRender: IItem | null) => {
67
+ const element = [];
68
+ if (itemToRender?.texturePath) {
69
+ element.push(
70
+ <SpriteFromAtlas
71
+ atlasIMG={atlasIMG}
72
+ atlasJSON={atlasJSON}
73
+ spriteKey={itemToRender.texturePath}
74
+ imgScale={3}
75
+ />
76
+ );
77
+ }
78
+ if (itemToRender?.isStackable && itemToRender?.stackQty) {
79
+ element.push(
80
+ <ItemQty left={getLeftPositionValue(itemToRender.stackQty)}>
81
+ {' '}
82
+ {itemToRender.stackQty}{' '}
83
+ </ItemQty>
84
+ );
85
+ }
86
+ return element;
87
+ };
88
+
89
+ const renderEquipment = (itemToRender: IItem | null) => {
90
+ if (
91
+ itemToRender?.texturePath &&
92
+ itemToRender.allowedEquipSlotType?.includes(slotSpriteMask!)
93
+ ) {
94
+ return (
95
+ <SpriteFromAtlas
96
+ atlasIMG={atlasIMG}
97
+ atlasJSON={atlasJSON}
98
+ spriteKey={itemToRender.texturePath}
99
+ imgScale={3}
100
+ />
101
+ );
102
+ } else {
103
+ return (
104
+ <SpriteFromAtlas
105
+ atlasIMG={atlasIMG}
106
+ atlasJSON={atlasJSON}
107
+ spriteKey={EquipmentSlotSpriteByType[slotSpriteMask!]}
108
+ imgScale={3}
109
+ grayScale={true}
110
+ opacity={0.4}
111
+ />
112
+ );
113
+ }
114
+ };
115
+
116
+ const onRenderSlot = (itemToRender: IItem | null) => {
117
+ if (slotContainerType === SlotContainerType.EQUIPMENT_SET)
118
+ return renderEquipment(itemToRender);
119
+ return renderItem(itemToRender);
120
+ };
121
+
122
+ return (
123
+ <Container
124
+ className="rpgui-icon empty-slot"
125
+ onMouseOver={event =>
126
+ onMouseOver(event, slotIndex, item, event.clientX, event.clientY)
127
+ }
128
+ onMouseOut={() => onMouseOut()}
129
+ onClick={e => {
130
+ if (item) {
131
+ onClick(item, e.clientX, e.clientY, slotContainerType);
132
+ } else {
133
+ onCancelContextMenu();
134
+ }
135
+ }}
136
+ >
137
+ {onRenderSlot(item)}
138
+ </Container>
139
+ );
140
+ };
141
+
142
+ const Container = styled.div`
143
+ margin: 0.1rem;
144
+ .sprite-from-atlas-img {
145
+ position: relative;
146
+ top: 1.5rem;
147
+ left: 1.5rem;
148
+ }
149
+ `;
150
+
151
+ interface IItemQtyProps {
152
+ left: string;
153
+ }
154
+ const ItemQty = styled.span<IItemQtyProps>`
155
+ position: relative;
156
+ top: 1.5rem;
157
+ left: ${props => props.left};
158
+ `;