@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.
Files changed (33) hide show
  1. package/dist/components/InformationCenter/InformationCenter.d.ts +5 -15
  2. package/dist/components/InformationCenter/sections/bestiary/InformationCenterBestiarySection.d.ts +3 -1
  3. package/dist/components/InformationCenter/sections/bestiary/InformationCenterNPCDetails.d.ts +4 -1
  4. package/dist/components/InformationCenter/sections/bestiary/InformationCenterNPCTooltip.d.ts +1 -1
  5. package/dist/components/InformationCenter/sections/faq/InformationCenterFaqSection.d.ts +1 -1
  6. package/dist/components/InformationCenter/sections/items/InformationCenterItemDetails.d.ts +1 -1
  7. package/dist/components/InformationCenter/sections/items/InformationCenterItemTooltip.d.ts +1 -1
  8. package/dist/components/InformationCenter/sections/items/InformationCenterItemsSection.d.ts +2 -1
  9. package/dist/components/InformationCenter/sections/tutorials/InformationCenterTutorialsSection.d.ts +1 -1
  10. package/dist/long-bow.cjs.development.js +793 -660
  11. package/dist/long-bow.cjs.development.js.map +1 -1
  12. package/dist/long-bow.cjs.production.min.js +1 -1
  13. package/dist/long-bow.cjs.production.min.js.map +1 -1
  14. package/dist/long-bow.esm.js +794 -661
  15. package/dist/long-bow.esm.js.map +1 -1
  16. package/dist/mocks/informationCenter.mocks.d.ts +1 -2
  17. package/package.json +2 -2
  18. package/src/components/CraftBook/CraftBook.tsx +1 -1
  19. package/src/components/Dropdown.tsx +25 -3
  20. package/src/components/InformationCenter/InformationCenter.tsx +11 -18
  21. package/src/components/InformationCenter/sections/bestiary/InformationCenterBestiarySection.tsx +58 -7
  22. package/src/components/InformationCenter/sections/bestiary/InformationCenterNPCDetails.tsx +63 -15
  23. package/src/components/InformationCenter/sections/bestiary/InformationCenterNPCTooltip.tsx +7 -6
  24. package/src/components/InformationCenter/sections/faq/InformationCenterFaqSection.tsx +1 -1
  25. package/src/components/InformationCenter/sections/items/InformationCenterItemDetails.tsx +8 -6
  26. package/src/components/InformationCenter/sections/items/InformationCenterItemTooltip.tsx +1 -1
  27. package/src/components/InformationCenter/sections/items/InformationCenterItemsSection.tsx +36 -10
  28. package/src/components/InformationCenter/sections/tutorials/InformationCenterTutorialsSection.tsx +133 -34
  29. package/src/components/shared/PaginatedContent/PaginatedContent.tsx +1 -1
  30. package/src/mocks/informationCenter.mocks.ts +175 -55
  31. package/src/stories/UI/info/InformationCenter.stories.tsx +6 -1
  32. package/dist/components/InformationCenter/InformationCenterTypes.d.ts +0 -79
  33. package/src/components/InformationCenter/InformationCenterTypes.ts +0 -87
@@ -1,9 +1,15 @@
1
- import React, { useState } from 'react';
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
- import { IVideoGuide } from '../../InformationCenter';
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
- { id: 1, value: 'Combat', option: 'Combat' },
25
- { id: 2, value: 'Crafting', option: 'Crafting' },
26
- { id: 3, value: 'Exploration', option: 'Exploration' },
27
- { id: 4, value: 'General', option: 'General' },
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.thumbnailUrl || '/placeholder-thumbnail.png'}
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
- <GuideCategory>{guide.category}</GuideCategory>
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 = videoGuides.filter(
47
- guide =>
48
- (selectedCategory === 'all' || guide.category === selectedCategory) &&
49
- (guide.title.toLowerCase().includes(searchQuery.toLowerCase()) ||
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: setSearchQuery,
128
+ onChange: handleSearchChange,
61
129
  placeholder: 'Search guides...',
62
130
  }}
63
131
  filterOptions={{
64
132
  options: categoryOptions,
65
133
  selectedOption: selectedCategory,
66
- onOptionChange: setSelectedCategory,
134
+ onOptionChange: handleCategoryChange,
67
135
  }}
68
136
  dependencies={[selectedCategory]}
69
137
  tabId={tabId}
70
138
  layout="grid"
71
- gridColumns={3}
72
- itemsPerPage={3}
73
- itemHeight="400px"
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: 8px;
187
+ margin-bottom: 5px;
117
188
  `;
118
189
 
119
190
  const GuideDescription = styled.p`
120
191
  margin: 0;
121
- font-size: 0.55rem;
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.span`
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
- background: rgba(255, 255, 255, 0.1);
133
- padding: 4px 8px;
134
- border-radius: 4px;
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
  `;
@@ -30,7 +30,7 @@ interface IPaginatedContentProps<T> {
30
30
 
31
31
  export const PaginatedContent = <T extends unknown>({
32
32
  items,
33
- itemsPerPage = 5,
33
+ itemsPerPage = 8,
34
34
  renderItem,
35
35
  emptyMessage = 'No items found',
36
36
  className,
@@ -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
- import {
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: 'ThunderStorm',
48
+ spellKey: 'VampiricStorm',
49
+ texturePath: 'spell-icons/vampiric-storm.png',
48
50
  probability: 35,
49
51
  power: 'UltraHigh',
50
52
  },
51
53
  {
52
- spellKey: 'LightningBreath',
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: 'DragonScale',
62
+ itemBlueprintKey: 'maces/dragonscale-cleaver-club.png',
60
63
  chance: LootProbability.Uncommon,
61
64
  },
62
65
  {
63
- itemBlueprintKey: 'ThunderStaff',
66
+ itemBlueprintKey: 'staffs/thunder-bolt-staff.png',
64
67
  chance: LootProbability.Rare,
65
68
  },
66
69
  {
67
- itemBlueprintKey: 'DragonEssence',
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: 'OrcishAxe',
105
+ itemBlueprintKey: 'crafting-resources/leather.png',
101
106
  chance: LootProbability.Uncommon,
102
107
  },
103
108
  {
104
- itemBlueprintKey: 'HealingHerb',
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: 'FrostBite',
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
- 'Learn the basics of character creation, movement, and basic combat.',
480
- thumbnailUrl: '/tutorials/getting-started.jpg',
481
- videoUrl: 'https://youtube.com/watch?v=getting-started',
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
- 'Master the art of combat with advanced combos and spell casting.',
489
- thumbnailUrl: '/tutorials/advanced-combat.jpg',
490
- videoUrl: 'https://youtube.com/watch?v=advanced-combat',
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
- 'Everything you need to know about crafting weapons and items.',
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: 'Crafting',
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
- thumbnailUrl: '/tutorials/exploration.jpg',
623
+ localImage: 'https://youtube.com/watch?v=exploration',
507
624
  videoUrl: 'https://youtube.com/watch?v=exploration',
508
- category: 'Exploration',
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
- 'Learn effective strategies to defeat challenging boss encounters.',
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: 'Combat',
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
- 'Efficient methods for gathering crafting materials and resources.',
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: 'Crafting',
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
- 'Essential tips for surviving and navigating dangerous dungeons.',
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: 'Exploration',
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
- thumbnailUrl: '/tutorials/character-builds.jpg',
659
+ localImage: 'https://youtube.com/watch?v=character-builds',
542
660
  videoUrl: 'https://youtube.com/watch?v=character-builds',
543
- category: 'General',
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
- thumbnailUrl: '/tutorials/pvp-combat.jpg',
668
+ localImage: 'https://youtube.com/watch?v=pvp-combat',
550
669
  videoUrl: 'https://youtube.com/watch?v=pvp-combat',
551
- category: 'Combat',
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
- 'Special recipes and techniques for crafting rare and legendary items.',
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: 'Crafting',
679
+ category: VideoGuideCategory.Crafting,
680
+ language: VideoGuideLanguage.Portuguese,
561
681
  },
562
682
  ];