@rpg-engine/long-bow 0.8.20 → 0.8.22
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/components/InformationCenter/InformationCenter.d.ts +5 -15
- package/dist/components/InformationCenter/sections/bestiary/InformationCenterBestiarySection.d.ts +3 -1
- package/dist/components/InformationCenter/sections/bestiary/InformationCenterNPCDetails.d.ts +4 -1
- package/dist/components/InformationCenter/sections/bestiary/InformationCenterNPCTooltip.d.ts +1 -1
- package/dist/components/InformationCenter/sections/faq/InformationCenterFaqSection.d.ts +1 -1
- package/dist/components/InformationCenter/sections/items/InformationCenterItemDetails.d.ts +1 -1
- package/dist/components/InformationCenter/sections/items/InformationCenterItemTooltip.d.ts +1 -1
- package/dist/components/InformationCenter/sections/items/InformationCenterItemsSection.d.ts +2 -1
- package/dist/components/InformationCenter/sections/tutorials/InformationCenterTutorialsSection.d.ts +1 -1
- package/dist/long-bow.cjs.development.js +793 -660
- package/dist/long-bow.cjs.development.js.map +1 -1
- package/dist/long-bow.cjs.production.min.js +1 -1
- package/dist/long-bow.cjs.production.min.js.map +1 -1
- package/dist/long-bow.esm.js +794 -661
- package/dist/long-bow.esm.js.map +1 -1
- package/dist/mocks/informationCenter.mocks.d.ts +1 -2
- package/package.json +2 -2
- package/src/components/CraftBook/CraftBook.tsx +1 -1
- package/src/components/Dropdown.tsx +25 -3
- package/src/components/InformationCenter/InformationCenter.tsx +11 -18
- package/src/components/InformationCenter/sections/bestiary/InformationCenterBestiarySection.tsx +58 -7
- package/src/components/InformationCenter/sections/bestiary/InformationCenterNPCDetails.tsx +63 -15
- package/src/components/InformationCenter/sections/bestiary/InformationCenterNPCTooltip.tsx +7 -6
- package/src/components/InformationCenter/sections/faq/InformationCenterFaqSection.tsx +1 -1
- package/src/components/InformationCenter/sections/items/InformationCenterItemDetails.tsx +8 -6
- package/src/components/InformationCenter/sections/items/InformationCenterItemTooltip.tsx +1 -1
- package/src/components/InformationCenter/sections/items/InformationCenterItemsSection.tsx +36 -10
- package/src/components/InformationCenter/sections/tutorials/InformationCenterTutorialsSection.tsx +133 -34
- package/src/components/shared/PaginatedContent/PaginatedContent.tsx +1 -1
- package/src/mocks/informationCenter.mocks.ts +175 -55
- package/src/stories/UI/info/InformationCenter.stories.tsx +6 -1
- package/dist/components/InformationCenter/InformationCenterTypes.d.ts +0 -79
- package/src/components/InformationCenter/InformationCenterTypes.ts +0 -87
package/src/components/InformationCenter/sections/tutorials/InformationCenterTutorialsSection.tsx
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
IVideoGuide,
|
|
3
|
+
VideoGuideCategory,
|
|
4
|
+
VideoGuideLanguage,
|
|
5
|
+
} from '@rpg-engine/shared';
|
|
6
|
+
import React, { useMemo, useState } from 'react';
|
|
2
7
|
import styled from 'styled-components';
|
|
3
8
|
import { uiColors } from '../../../../constants/uiColors';
|
|
4
9
|
import { IOptionsProps } from '../../../Dropdown';
|
|
5
10
|
import { PaginatedContent } from '../../../shared/PaginatedContent/PaginatedContent';
|
|
6
|
-
|
|
11
|
+
|
|
12
|
+
import { formatItemType } from '../items/InformationCenterItemsSection';
|
|
7
13
|
|
|
8
14
|
interface ITutorialsSectionProps {
|
|
9
15
|
videoGuides: IVideoGuide[];
|
|
@@ -11,6 +17,9 @@ interface ITutorialsSectionProps {
|
|
|
11
17
|
tabId: string;
|
|
12
18
|
}
|
|
13
19
|
|
|
20
|
+
const ITEMS_PER_PAGE = 3;
|
|
21
|
+
const GRID_COLUMNS = 3;
|
|
22
|
+
|
|
14
23
|
export const InformationCenterTutorialsSection: React.FC<ITutorialsSectionProps> = ({
|
|
15
24
|
videoGuides,
|
|
16
25
|
initialSearchQuery,
|
|
@@ -18,37 +27,96 @@ export const InformationCenterTutorialsSection: React.FC<ITutorialsSectionProps>
|
|
|
18
27
|
}) => {
|
|
19
28
|
const [searchQuery, setSearchQuery] = useState(initialSearchQuery);
|
|
20
29
|
const [selectedCategory, setSelectedCategory] = useState<string>('all');
|
|
30
|
+
const [, setCurrentPage] = useState(1);
|
|
21
31
|
|
|
32
|
+
const getYouTubeThumbnail = (videoUrl: string): string => {
|
|
33
|
+
const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
|
|
34
|
+
const match = videoUrl.match(regExp);
|
|
35
|
+
const videoId = match && match[2].length === 11 ? match[2] : null;
|
|
36
|
+
|
|
37
|
+
return videoId
|
|
38
|
+
? `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`
|
|
39
|
+
: '/placeholder-thumbnail.png';
|
|
40
|
+
};
|
|
22
41
|
const categoryOptions: IOptionsProps[] = [
|
|
23
|
-
{ id: 0, value: 'all', option: 'All' },
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
42
|
+
{ id: 0, value: 'all', option: 'All Categories' },
|
|
43
|
+
...(VideoGuideCategory
|
|
44
|
+
? Object.entries(VideoGuideCategory).map(([, value], index) => ({
|
|
45
|
+
id: index + 1,
|
|
46
|
+
value: value as string,
|
|
47
|
+
option: formatItemType(value),
|
|
48
|
+
}))
|
|
49
|
+
: []),
|
|
50
|
+
...(VideoGuideLanguage
|
|
51
|
+
? Object.entries(VideoGuideLanguage).map(([, value], index) => ({
|
|
52
|
+
id:
|
|
53
|
+
index +
|
|
54
|
+
(VideoGuideCategory
|
|
55
|
+
? Object.entries(VideoGuideCategory).length
|
|
56
|
+
: 0) +
|
|
57
|
+
1,
|
|
58
|
+
value: value as string,
|
|
59
|
+
option: formatItemType(value),
|
|
60
|
+
}))
|
|
61
|
+
: []),
|
|
28
62
|
];
|
|
29
63
|
|
|
64
|
+
const handleVideoClick = (videoUrl: string) => {
|
|
65
|
+
window.open(videoUrl, '_blank', 'noopener,noreferrer');
|
|
66
|
+
};
|
|
67
|
+
|
|
30
68
|
const renderItem = (guide: IVideoGuide) => (
|
|
31
|
-
<GuideItem key={guide.id}>
|
|
69
|
+
<GuideItem key={guide.id} onClick={() => handleVideoClick(guide.videoUrl)}>
|
|
32
70
|
<GuideThumbnail>
|
|
33
71
|
<img
|
|
34
|
-
src={guide.
|
|
72
|
+
src={guide.localImage || getYouTubeThumbnail(guide.videoUrl)}
|
|
35
73
|
alt={guide.title}
|
|
36
74
|
/>
|
|
37
75
|
</GuideThumbnail>
|
|
38
76
|
<GuideContent>
|
|
39
77
|
<GuideTitle>{guide.title}</GuideTitle>
|
|
40
78
|
<GuideDescription>{guide.description}</GuideDescription>
|
|
41
|
-
<
|
|
79
|
+
<GuideLabelsContainer>
|
|
80
|
+
<GuideCategory>{guide.category}</GuideCategory>
|
|
81
|
+
<GuideLanguage>{guide.language}</GuideLanguage>
|
|
82
|
+
</GuideLabelsContainer>
|
|
42
83
|
</GuideContent>
|
|
43
84
|
</GuideItem>
|
|
44
85
|
);
|
|
45
86
|
|
|
46
|
-
const filteredGuides =
|
|
47
|
-
guide =>
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
guide.description.toLowerCase().includes(searchQuery.toLowerCase())
|
|
51
|
-
|
|
87
|
+
const filteredGuides = useMemo(() => {
|
|
88
|
+
return videoGuides.filter(guide => {
|
|
89
|
+
const matchesSearch =
|
|
90
|
+
guide.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
|
|
91
|
+
guide.description.toLowerCase().includes(searchQuery.toLowerCase());
|
|
92
|
+
|
|
93
|
+
const matchesCategory =
|
|
94
|
+
selectedCategory === 'all' ||
|
|
95
|
+
(Object.values(VideoGuideCategory).includes(
|
|
96
|
+
selectedCategory as VideoGuideCategory
|
|
97
|
+
) &&
|
|
98
|
+
guide.category === selectedCategory) ||
|
|
99
|
+
(Object.values(VideoGuideLanguage).includes(
|
|
100
|
+
selectedCategory as VideoGuideLanguage
|
|
101
|
+
) &&
|
|
102
|
+
guide.language === selectedCategory);
|
|
103
|
+
|
|
104
|
+
return matchesSearch && matchesCategory;
|
|
105
|
+
});
|
|
106
|
+
}, [videoGuides, searchQuery, selectedCategory]);
|
|
107
|
+
|
|
108
|
+
const handleSearchChange = (newQuery: string) => {
|
|
109
|
+
setSearchQuery(newQuery);
|
|
110
|
+
setCurrentPage(1);
|
|
111
|
+
if (newQuery && selectedCategory !== 'all') {
|
|
112
|
+
setSelectedCategory('all');
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const handleCategoryChange = (category: string) => {
|
|
117
|
+
setSelectedCategory(category);
|
|
118
|
+
setCurrentPage(1);
|
|
119
|
+
};
|
|
52
120
|
|
|
53
121
|
return (
|
|
54
122
|
<PaginatedContent<IVideoGuide>
|
|
@@ -57,20 +125,20 @@ export const InformationCenterTutorialsSection: React.FC<ITutorialsSectionProps>
|
|
|
57
125
|
emptyMessage="No guides found"
|
|
58
126
|
searchOptions={{
|
|
59
127
|
value: searchQuery,
|
|
60
|
-
onChange:
|
|
128
|
+
onChange: handleSearchChange,
|
|
61
129
|
placeholder: 'Search guides...',
|
|
62
130
|
}}
|
|
63
131
|
filterOptions={{
|
|
64
132
|
options: categoryOptions,
|
|
65
133
|
selectedOption: selectedCategory,
|
|
66
|
-
onOptionChange:
|
|
134
|
+
onOptionChange: handleCategoryChange,
|
|
67
135
|
}}
|
|
68
136
|
dependencies={[selectedCategory]}
|
|
69
137
|
tabId={tabId}
|
|
70
138
|
layout="grid"
|
|
71
|
-
gridColumns={
|
|
72
|
-
itemsPerPage={
|
|
73
|
-
itemHeight="
|
|
139
|
+
gridColumns={GRID_COLUMNS}
|
|
140
|
+
itemsPerPage={ITEMS_PER_PAGE}
|
|
141
|
+
itemHeight="320px"
|
|
74
142
|
/>
|
|
75
143
|
);
|
|
76
144
|
};
|
|
@@ -82,7 +150,10 @@ const GuideItem = styled.div`
|
|
|
82
150
|
border: 1px solid ${uiColors.darkGray};
|
|
83
151
|
cursor: pointer;
|
|
84
152
|
transition: transform 0.2s ease;
|
|
153
|
+
display: flex;
|
|
154
|
+
flex-direction: column;
|
|
85
155
|
height: 100%;
|
|
156
|
+
padding: 0;
|
|
86
157
|
&:hover {
|
|
87
158
|
transform: translateY(-2px);
|
|
88
159
|
}
|
|
@@ -99,37 +170,65 @@ const GuideThumbnail = styled.div`
|
|
|
99
170
|
height: 100%;
|
|
100
171
|
object-fit: cover;
|
|
101
172
|
}
|
|
102
|
-
|
|
103
|
-
font-size: 0.8rem;
|
|
104
|
-
line-height: 1.8;
|
|
105
173
|
`;
|
|
106
174
|
|
|
107
175
|
const GuideContent = styled.div`
|
|
108
|
-
padding: 12px;
|
|
176
|
+
padding: 0 12px 12px;
|
|
177
|
+
flex: 1;
|
|
178
|
+
display: flex;
|
|
179
|
+
flex-direction: column;
|
|
109
180
|
`;
|
|
110
181
|
|
|
111
182
|
const GuideTitle = styled.h3`
|
|
112
183
|
margin: 0;
|
|
113
|
-
font-size: 0.6rem;
|
|
184
|
+
font-size: 0.6rem !important;
|
|
114
185
|
color: ${uiColors.yellow};
|
|
115
186
|
font-family: 'Press Start 2P', cursive;
|
|
116
|
-
margin-bottom:
|
|
187
|
+
margin-bottom: 5px;
|
|
117
188
|
`;
|
|
118
189
|
|
|
119
190
|
const GuideDescription = styled.p`
|
|
120
191
|
margin: 0;
|
|
121
|
-
font-size: 0.
|
|
192
|
+
font-size: 0.5rem !important;
|
|
122
193
|
color: ${uiColors.lightGray};
|
|
194
|
+
text-align: center;
|
|
123
195
|
font-family: 'Press Start 2P', cursive;
|
|
124
196
|
margin-bottom: 8px;
|
|
125
197
|
line-height: 1.4;
|
|
126
198
|
`;
|
|
127
199
|
|
|
128
|
-
const GuideCategory = styled.
|
|
129
|
-
font-size: 0.5rem;
|
|
130
|
-
color: ${uiColors.yellow};
|
|
200
|
+
const GuideCategory = styled.label`
|
|
201
|
+
font-size: 0.5rem !important;
|
|
131
202
|
font-family: 'Press Start 2P', cursive;
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
203
|
+
color: ${uiColors.yellow} !important;
|
|
204
|
+
line-height: 1.4;
|
|
205
|
+
|
|
206
|
+
&::before {
|
|
207
|
+
content: '🏷️';
|
|
208
|
+
padding-right: 6px;
|
|
209
|
+
font-size: 0.7rem;
|
|
210
|
+
transform: translateY(-2px);
|
|
211
|
+
display: inline-block;
|
|
212
|
+
}
|
|
213
|
+
`;
|
|
214
|
+
|
|
215
|
+
const GuideLanguage = styled.label`
|
|
216
|
+
font-size: 0.5rem !important;
|
|
217
|
+
font-family: 'Press Start 2P', cursive;
|
|
218
|
+
color: ${uiColors.blue} !important;
|
|
219
|
+
line-height: 1.4;
|
|
220
|
+
|
|
221
|
+
&::before {
|
|
222
|
+
content: '🌐';
|
|
223
|
+
padding-right: 6px;
|
|
224
|
+
font-size: 0.6rem;
|
|
225
|
+
transform: translateY(-2px);
|
|
226
|
+
display: inline-block;
|
|
227
|
+
}
|
|
228
|
+
`;
|
|
229
|
+
|
|
230
|
+
const GuideLabelsContainer = styled.div`
|
|
231
|
+
display: flex;
|
|
232
|
+
justify-content: space-between;
|
|
233
|
+
padding: 0 6px 6px;
|
|
135
234
|
`;
|
|
@@ -3,25 +3,25 @@ import {
|
|
|
3
3
|
CharacterBuffDurationType,
|
|
4
4
|
CharacterBuffType,
|
|
5
5
|
EntityAttackType,
|
|
6
|
+
EntityEffectBlueprint,
|
|
7
|
+
IFaqItem,
|
|
8
|
+
IInformationCenterItem,
|
|
9
|
+
IInformationCenterNPC,
|
|
6
10
|
ItemRarities,
|
|
7
11
|
ItemSlotType,
|
|
8
12
|
ItemSubType,
|
|
9
13
|
ItemType,
|
|
14
|
+
IVideoGuide,
|
|
15
|
+
LootProbability,
|
|
16
|
+
MovementSpeed,
|
|
10
17
|
NPCAlignment,
|
|
11
18
|
NPCSubtype,
|
|
12
19
|
RangeTypes,
|
|
20
|
+
SpellsBlueprint,
|
|
21
|
+
VideoGuideCategory,
|
|
22
|
+
VideoGuideLanguage
|
|
13
23
|
} from '@rpg-engine/shared';
|
|
14
|
-
|
|
15
|
-
IFaqItem,
|
|
16
|
-
IVideoGuide,
|
|
17
|
-
} from '../components/InformationCenter/InformationCenter';
|
|
18
|
-
import {
|
|
19
|
-
EntityEffectBlueprint,
|
|
20
|
-
IInformationCenterItem,
|
|
21
|
-
IInformationCenterNPC,
|
|
22
|
-
LootProbability,
|
|
23
|
-
MovementSpeed,
|
|
24
|
-
} from '../components/InformationCenter/InformationCenterTypes';
|
|
24
|
+
|
|
25
25
|
|
|
26
26
|
export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
27
27
|
{
|
|
@@ -34,6 +34,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
34
34
|
maxRangeAttack: RangeTypes.High,
|
|
35
35
|
speed: MovementSpeed.Standard,
|
|
36
36
|
baseHealth: 5000,
|
|
37
|
+
isBoss: true,
|
|
37
38
|
skills: {
|
|
38
39
|
level: 300,
|
|
39
40
|
strength: { level: 280 },
|
|
@@ -44,27 +45,29 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
44
45
|
entityEffects: [EntityEffectBlueprint.Burning],
|
|
45
46
|
areaSpells: [
|
|
46
47
|
{
|
|
47
|
-
spellKey: '
|
|
48
|
+
spellKey: 'VampiricStorm',
|
|
49
|
+
texturePath: 'spell-icons/vampiric-storm.png',
|
|
48
50
|
probability: 35,
|
|
49
51
|
power: 'UltraHigh',
|
|
50
52
|
},
|
|
51
53
|
{
|
|
52
|
-
spellKey: '
|
|
54
|
+
spellKey: 'ArrowCreationSpell',
|
|
55
|
+
texturePath: 'spell-icons/arrow-creation-spell.png',
|
|
53
56
|
probability: 45,
|
|
54
57
|
power: 'High',
|
|
55
58
|
},
|
|
56
59
|
],
|
|
57
60
|
loots: [
|
|
58
61
|
{
|
|
59
|
-
itemBlueprintKey: '
|
|
62
|
+
itemBlueprintKey: 'maces/dragonscale-cleaver-club.png',
|
|
60
63
|
chance: LootProbability.Uncommon,
|
|
61
64
|
},
|
|
62
65
|
{
|
|
63
|
-
itemBlueprintKey: '
|
|
66
|
+
itemBlueprintKey: 'staffs/thunder-bolt-staff.png',
|
|
64
67
|
chance: LootProbability.Rare,
|
|
65
68
|
},
|
|
66
69
|
{
|
|
67
|
-
itemBlueprintKey: '
|
|
70
|
+
itemBlueprintKey: 'crafting-resources/dragon-tooth.png',
|
|
68
71
|
chance: LootProbability.Uncommon,
|
|
69
72
|
quantityRange: [1, 3],
|
|
70
73
|
},
|
|
@@ -80,6 +83,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
80
83
|
maxRangeAttack: RangeTypes.High,
|
|
81
84
|
speed: MovementSpeed.Standard,
|
|
82
85
|
baseHealth: 800,
|
|
86
|
+
isBoss: false,
|
|
83
87
|
skills: {
|
|
84
88
|
level: 85,
|
|
85
89
|
strength: { level: 95 },
|
|
@@ -93,15 +97,16 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
93
97
|
spellKey: 'WarCry',
|
|
94
98
|
probability: 25,
|
|
95
99
|
power: 'Medium',
|
|
100
|
+
texturePath: ''
|
|
96
101
|
},
|
|
97
102
|
],
|
|
98
103
|
loots: [
|
|
99
104
|
{
|
|
100
|
-
itemBlueprintKey: '
|
|
105
|
+
itemBlueprintKey: 'crafting-resources/leather.png',
|
|
101
106
|
chance: LootProbability.Uncommon,
|
|
102
107
|
},
|
|
103
108
|
{
|
|
104
|
-
itemBlueprintKey: '
|
|
109
|
+
itemBlueprintKey: 'crafting-resources/herb.png',
|
|
105
110
|
chance: LootProbability.Common,
|
|
106
111
|
quantityRange: [1, 4],
|
|
107
112
|
},
|
|
@@ -117,6 +122,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
117
122
|
maxRangeAttack: RangeTypes.High,
|
|
118
123
|
speed: MovementSpeed.Standard,
|
|
119
124
|
baseHealth: 400,
|
|
125
|
+
isBoss: false,
|
|
120
126
|
skills: {
|
|
121
127
|
level: 45,
|
|
122
128
|
strength: { level: 50 },
|
|
@@ -133,6 +139,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
133
139
|
spellKey: 'BoneShards',
|
|
134
140
|
probability: 20,
|
|
135
141
|
power: 'Medium',
|
|
142
|
+
texturePath: ''
|
|
136
143
|
},
|
|
137
144
|
],
|
|
138
145
|
loots: [
|
|
@@ -157,6 +164,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
157
164
|
maxRangeAttack: RangeTypes.High,
|
|
158
165
|
speed: MovementSpeed.Fast,
|
|
159
166
|
baseHealth: 350,
|
|
167
|
+
isBoss: false,
|
|
160
168
|
skills: {
|
|
161
169
|
level: 40,
|
|
162
170
|
strength: { level: 45 },
|
|
@@ -191,6 +199,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
191
199
|
maxRangeAttack: RangeTypes.High,
|
|
192
200
|
speed: MovementSpeed.Fast,
|
|
193
201
|
baseHealth: 420,
|
|
202
|
+
isBoss: false,
|
|
194
203
|
skills: {
|
|
195
204
|
level: 50,
|
|
196
205
|
strength: { level: 55 },
|
|
@@ -204,7 +213,8 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
204
213
|
],
|
|
205
214
|
areaSpells: [
|
|
206
215
|
{
|
|
207
|
-
spellKey: '
|
|
216
|
+
spellKey: 'VampiricStorm',
|
|
217
|
+
texturePath: 'spell-icons/vampiric-storm.png',
|
|
208
218
|
probability: 15,
|
|
209
219
|
power: 'Medium',
|
|
210
220
|
},
|
|
@@ -231,6 +241,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
231
241
|
maxRangeAttack: RangeTypes.High,
|
|
232
242
|
speed: MovementSpeed.Standard,
|
|
233
243
|
baseHealth: 2200,
|
|
244
|
+
isBoss: false,
|
|
234
245
|
skills: {
|
|
235
246
|
level: 200,
|
|
236
247
|
strength: { level: 160 },
|
|
@@ -248,11 +259,13 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
248
259
|
spellKey: 'DeathNova',
|
|
249
260
|
probability: 30,
|
|
250
261
|
power: 'VeryHigh',
|
|
262
|
+
texturePath: ''
|
|
251
263
|
},
|
|
252
264
|
{
|
|
253
265
|
spellKey: 'SoulDrain',
|
|
254
266
|
probability: 25,
|
|
255
267
|
power: 'High',
|
|
268
|
+
texturePath: ''
|
|
256
269
|
},
|
|
257
270
|
],
|
|
258
271
|
loots: [
|
|
@@ -281,6 +294,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
281
294
|
maxRangeAttack: RangeTypes.High,
|
|
282
295
|
speed: MovementSpeed.Slow,
|
|
283
296
|
baseHealth: 1800,
|
|
297
|
+
isBoss: false,
|
|
284
298
|
skills: {
|
|
285
299
|
level: 150,
|
|
286
300
|
strength: { level: 180 },
|
|
@@ -297,6 +311,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
297
311
|
spellKey: 'BoulderThrow',
|
|
298
312
|
probability: 40,
|
|
299
313
|
power: 'High',
|
|
314
|
+
texturePath: ''
|
|
300
315
|
},
|
|
301
316
|
],
|
|
302
317
|
loots: [
|
|
@@ -325,6 +340,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
325
340
|
maxRangeAttack: RangeTypes.High,
|
|
326
341
|
speed: MovementSpeed.Standard,
|
|
327
342
|
baseHealth: 1200,
|
|
343
|
+
isBoss: false,
|
|
328
344
|
skills: {
|
|
329
345
|
level: 100,
|
|
330
346
|
strength: { level: 130 },
|
|
@@ -341,6 +357,7 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
341
357
|
spellKey: 'ToxicCloud',
|
|
342
358
|
probability: 20,
|
|
343
359
|
power: 'Medium',
|
|
360
|
+
texturePath: ''
|
|
344
361
|
},
|
|
345
362
|
],
|
|
346
363
|
loots: [
|
|
@@ -359,6 +376,108 @@ export const mockBestiaryItems: IInformationCenterNPC[] = [
|
|
|
359
376
|
},
|
|
360
377
|
],
|
|
361
378
|
},
|
|
379
|
+
{
|
|
380
|
+
id: '9',
|
|
381
|
+
name: "Red Deer",
|
|
382
|
+
subType: NPCSubtype.Animal,
|
|
383
|
+
key: 'red-deer/up/walking/2.png',
|
|
384
|
+
alignment: NPCAlignment.Neutral,
|
|
385
|
+
attackType: EntityAttackType.Melee,
|
|
386
|
+
maxRangeAttack: RangeTypes.High,
|
|
387
|
+
speed: MovementSpeed.Standard,
|
|
388
|
+
isBoss: false,
|
|
389
|
+
baseHealth: 30,
|
|
390
|
+
skills: {
|
|
391
|
+
level: 3,
|
|
392
|
+
strength: {
|
|
393
|
+
level: 3,
|
|
394
|
+
},
|
|
395
|
+
dexterity: {
|
|
396
|
+
level: 1,
|
|
397
|
+
},
|
|
398
|
+
resistance: {
|
|
399
|
+
level: 5,
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
loots: [
|
|
403
|
+
{
|
|
404
|
+
itemBlueprintKey: 'foods/red-meat.png',
|
|
405
|
+
chance: 30,
|
|
406
|
+
quantityRange: [1, 4],
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
itemBlueprintKey: 'crafting-resources/leather.png',
|
|
410
|
+
chance: 50,
|
|
411
|
+
quantityRange: [1, 3],
|
|
412
|
+
},
|
|
413
|
+
],
|
|
414
|
+
fleeOnLowHealth: false,
|
|
415
|
+
entityEffects: [],
|
|
416
|
+
areaSpells: []
|
|
417
|
+
},
|
|
418
|
+
{
|
|
419
|
+
id: '10',
|
|
420
|
+
name: 'Inferno Widow',
|
|
421
|
+
key: 'giant-spider/down/standing/0.png',
|
|
422
|
+
subType: NPCSubtype.Insect,
|
|
423
|
+
alignment: NPCAlignment.Hostile,
|
|
424
|
+
attackType: EntityAttackType.MeleeRanged,
|
|
425
|
+
speed: MovementSpeed.Standard,
|
|
426
|
+
maxRangeAttack: RangeTypes.High,
|
|
427
|
+
baseHealth: 60000,
|
|
428
|
+
isBoss: true,
|
|
429
|
+
skills: {
|
|
430
|
+
level: 298,
|
|
431
|
+
strength: {
|
|
432
|
+
level: 298,
|
|
433
|
+
},
|
|
434
|
+
dexterity: {
|
|
435
|
+
level: 298,
|
|
436
|
+
},
|
|
437
|
+
resistance: {
|
|
438
|
+
level: 298,
|
|
439
|
+
}
|
|
440
|
+
},
|
|
441
|
+
fleeOnLowHealth: true,
|
|
442
|
+
loots: [
|
|
443
|
+
{
|
|
444
|
+
itemBlueprintKey: 'accessories/gilded-necklace.png',
|
|
445
|
+
chance: LootProbability.Rare,
|
|
446
|
+
},
|
|
447
|
+
|
|
448
|
+
{
|
|
449
|
+
itemBlueprintKey: 'armors/golden-armor.png',
|
|
450
|
+
chance: LootProbability.SemiCommon,
|
|
451
|
+
}
|
|
452
|
+
],
|
|
453
|
+
entityEffects: [EntityEffectBlueprint.Poison],
|
|
454
|
+
areaSpells: [
|
|
455
|
+
{
|
|
456
|
+
spellKey: SpellsBlueprint.NaturesRevenge,
|
|
457
|
+
texturePath: 'spell-icons/natures-revenge.png',
|
|
458
|
+
probability: 10,
|
|
459
|
+
power: 'High',
|
|
460
|
+
},
|
|
461
|
+
{
|
|
462
|
+
spellKey: SpellsBlueprint.VampiricStorm,
|
|
463
|
+
texturePath: 'spell-icons/vampiric-storm.png',
|
|
464
|
+
probability: 50,
|
|
465
|
+
power: 'High',
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
spellKey: SpellsBlueprint.FireStorm,
|
|
469
|
+
texturePath: 'spell-icons/fire-storm.png',
|
|
470
|
+
probability: 90,
|
|
471
|
+
power: 'Medium',
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
spellKey: SpellsBlueprint.SelfHealingSpell,
|
|
475
|
+
texturePath: 'spell-icons/self-healing-spell.png',
|
|
476
|
+
probability: 90,
|
|
477
|
+
power: "Hidh",
|
|
478
|
+
},
|
|
479
|
+
],
|
|
480
|
+
}
|
|
362
481
|
];
|
|
363
482
|
|
|
364
483
|
export const mockItems: IInformationCenterItem[] = [
|
|
@@ -475,88 +594,89 @@ export const mockTutorials: IVideoGuide[] = [
|
|
|
475
594
|
{
|
|
476
595
|
id: '1',
|
|
477
596
|
title: 'Getting Started Guide',
|
|
478
|
-
description:
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
category: 'General',
|
|
597
|
+
description: 'Learn the basics of character creation, movement, and basic combat.',
|
|
598
|
+
videoUrl: 'https://youtu.be/_8d7e-otQoo',
|
|
599
|
+
category: VideoGuideCategory.General,
|
|
600
|
+
language: VideoGuideLanguage.English,
|
|
483
601
|
},
|
|
484
602
|
{
|
|
485
603
|
id: '2',
|
|
486
604
|
title: 'Advanced Combat Techniques',
|
|
487
|
-
description:
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
category: 'Combat',
|
|
605
|
+
description: 'Master the art of combat with advanced combos and spell casting.',
|
|
606
|
+
videoUrl: 'https://youtu.be/7LQlyy0Y720?si=wZ79VC4sCsI781Mn',
|
|
607
|
+
category: VideoGuideCategory.Combat,
|
|
608
|
+
language: VideoGuideLanguage.English,
|
|
492
609
|
},
|
|
493
610
|
{
|
|
494
611
|
id: '3',
|
|
495
612
|
title: 'Crafting System Tutorial',
|
|
496
|
-
description:
|
|
497
|
-
|
|
498
|
-
thumbnailUrl: '/tutorials/crafting.jpg',
|
|
613
|
+
description: 'Everything you need to know about crafting weapons and items.',
|
|
614
|
+
localImage: 'https://youtube.com/watch?v=crafting',
|
|
499
615
|
videoUrl: 'https://youtube.com/watch?v=crafting',
|
|
500
|
-
category:
|
|
616
|
+
category: VideoGuideCategory.Crafting,
|
|
617
|
+
language: VideoGuideLanguage.English,
|
|
501
618
|
},
|
|
502
619
|
{
|
|
503
620
|
id: '4',
|
|
504
621
|
title: 'Secret Areas Guide',
|
|
505
622
|
description: 'Discover hidden locations and treasures across the world.',
|
|
506
|
-
|
|
623
|
+
localImage: 'https://youtube.com/watch?v=exploration',
|
|
507
624
|
videoUrl: 'https://youtube.com/watch?v=exploration',
|
|
508
|
-
category:
|
|
625
|
+
category: VideoGuideCategory.Exploration,
|
|
626
|
+
language: VideoGuideLanguage.English,
|
|
509
627
|
},
|
|
510
628
|
{
|
|
511
629
|
id: '5',
|
|
512
630
|
title: 'Boss Battle Strategies',
|
|
513
|
-
description:
|
|
514
|
-
|
|
515
|
-
thumbnailUrl: '/tutorials/boss-battles.jpg',
|
|
631
|
+
description: 'Learn effective strategies to defeat challenging boss encounters.',
|
|
632
|
+
localImage: 'https://youtube.com/watch?v=boss-battles',
|
|
516
633
|
videoUrl: 'https://youtube.com/watch?v=boss-battles',
|
|
517
|
-
category:
|
|
634
|
+
category: VideoGuideCategory.Combat,
|
|
635
|
+
language: VideoGuideLanguage.English,
|
|
518
636
|
},
|
|
519
637
|
{
|
|
520
638
|
id: '6',
|
|
521
639
|
title: 'Resource Gathering Guide',
|
|
522
|
-
description:
|
|
523
|
-
|
|
524
|
-
thumbnailUrl: '/tutorials/resource-gathering.jpg',
|
|
640
|
+
description: 'Efficient methods for gathering crafting materials and resources.',
|
|
641
|
+
localImage: 'https://youtube.com/watch?v=resource-gathering',
|
|
525
642
|
videoUrl: 'https://youtube.com/watch?v=resource-gathering',
|
|
526
|
-
category:
|
|
643
|
+
category: VideoGuideCategory.Crafting,
|
|
644
|
+
language: VideoGuideLanguage.English,
|
|
527
645
|
},
|
|
528
646
|
{
|
|
529
647
|
id: '7',
|
|
530
648
|
title: 'Dungeon Exploration Tips',
|
|
531
|
-
description:
|
|
532
|
-
|
|
533
|
-
thumbnailUrl: '/tutorials/dungeon-tips.jpg',
|
|
649
|
+
description: 'Essential tips for surviving and navigating dangerous dungeons.',
|
|
650
|
+
localImage: 'https://youtube.com/watch?v=dungeon-tips',
|
|
534
651
|
videoUrl: 'https://youtube.com/watch?v=dungeon-tips',
|
|
535
|
-
category:
|
|
652
|
+
category: VideoGuideCategory.Exploration,
|
|
653
|
+
language: VideoGuideLanguage.English,
|
|
536
654
|
},
|
|
537
655
|
{
|
|
538
656
|
id: '8',
|
|
539
657
|
title: 'Character Build Guide',
|
|
540
658
|
description: 'Optimize your character builds for different playstyles.',
|
|
541
|
-
|
|
659
|
+
localImage: 'https://youtube.com/watch?v=character-builds',
|
|
542
660
|
videoUrl: 'https://youtube.com/watch?v=character-builds',
|
|
543
|
-
category:
|
|
661
|
+
category: VideoGuideCategory.General,
|
|
662
|
+
language: VideoGuideLanguage.Portuguese,
|
|
544
663
|
},
|
|
545
664
|
{
|
|
546
665
|
id: '9',
|
|
547
666
|
title: 'PvP Combat Guide',
|
|
548
667
|
description: 'Advanced tactics for player versus player combat scenarios.',
|
|
549
|
-
|
|
668
|
+
localImage: 'https://youtube.com/watch?v=pvp-combat',
|
|
550
669
|
videoUrl: 'https://youtube.com/watch?v=pvp-combat',
|
|
551
|
-
category:
|
|
670
|
+
category: VideoGuideCategory.Combat,
|
|
671
|
+
language: VideoGuideLanguage.Portuguese,
|
|
552
672
|
},
|
|
553
673
|
{
|
|
554
674
|
id: '10',
|
|
555
675
|
title: 'Rare Item Crafting',
|
|
556
|
-
description:
|
|
557
|
-
|
|
558
|
-
thumbnailUrl: '/tutorials/rare-crafting.jpg',
|
|
676
|
+
description: 'Special recipes and techniques for crafting rare and legendary items.',
|
|
677
|
+
localImage: 'https://youtube.com/watch?v=rare-crafting',
|
|
559
678
|
videoUrl: 'https://youtube.com/watch?v=rare-crafting',
|
|
560
|
-
category:
|
|
679
|
+
category: VideoGuideCategory.Crafting,
|
|
680
|
+
language: VideoGuideLanguage.Portuguese,
|
|
561
681
|
},
|
|
562
682
|
];
|