@nice2dev/game-engine 0.1.0 → 1.0.3
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/CHANGELOG.md +193 -1
- package/dist/cjs/ai/BehaviorTree.js +1215 -0
- package/dist/cjs/ai/BehaviorTree.js.map +1 -0
- package/dist/cjs/ai/StateMachine.js +783 -0
- package/dist/cjs/ai/StateMachine.js.map +1 -0
- package/dist/cjs/audio/AudioBridge.js +454 -0
- package/dist/cjs/audio/AudioBridge.js.map +1 -0
- package/dist/cjs/devtools/GameplayAnalytics.js +651 -0
- package/dist/cjs/devtools/GameplayAnalytics.js.map +1 -0
- package/dist/cjs/dialogue/DialogueSystem.js +1023 -0
- package/dist/cjs/dialogue/DialogueSystem.js.map +1 -0
- package/dist/cjs/editor/NiceGameEditor.js +569 -71
- package/dist/cjs/editor/NiceGameEditor.js.map +1 -1
- package/dist/cjs/editor/ShaderGraph.js +1616 -0
- package/dist/cjs/editor/ShaderGraph.js.map +1 -0
- package/dist/cjs/editor/TimelineEditor.js +819 -0
- package/dist/cjs/editor/TimelineEditor.js.map +1 -0
- package/dist/cjs/engine/SaveSystemV2.js +494 -0
- package/dist/cjs/engine/SaveSystemV2.js.map +1 -0
- package/dist/cjs/export/GodotExporter.js +1102 -0
- package/dist/cjs/export/GodotExporter.js.map +1 -0
- package/dist/cjs/export/PlatformExporter.js +236 -0
- package/dist/cjs/export/PlatformExporter.js.map +1 -0
- package/dist/cjs/export/ThreeJSExporter.js +1116 -0
- package/dist/cjs/export/ThreeJSExporter.js.map +1 -0
- package/dist/cjs/export/UnityExporter.js +1193 -0
- package/dist/cjs/export/UnityExporter.js.map +1 -0
- package/dist/cjs/export/WebExporter.js +1036 -0
- package/dist/cjs/export/WebExporter.js.map +1 -0
- package/dist/cjs/export/index.js +58 -0
- package/dist/cjs/export/index.js.map +1 -0
- package/dist/cjs/i18n/useTranslation.js +11 -11
- package/dist/cjs/import/AsepriteImporter.js +761 -0
- package/dist/cjs/import/AsepriteImporter.js.map +1 -0
- package/dist/cjs/import/DragonBonesImporter.js +499 -0
- package/dist/cjs/import/DragonBonesImporter.js.map +1 -0
- package/dist/cjs/import/GameMakerImporter.js +559 -0
- package/dist/cjs/import/GameMakerImporter.js.map +1 -0
- package/dist/cjs/import/GodotSceneImporter.js +824 -0
- package/dist/cjs/import/GodotSceneImporter.js.map +1 -0
- package/dist/cjs/import/LDtkImporter.js +481 -0
- package/dist/cjs/import/LDtkImporter.js.map +1 -0
- package/dist/cjs/import/Live2DImporter.js +553 -0
- package/dist/cjs/import/Live2DImporter.js.map +1 -0
- package/dist/cjs/import/NdgFormat.js +499 -0
- package/dist/cjs/import/NdgFormat.js.map +1 -0
- package/dist/cjs/import/OgmoImporter.js +529 -0
- package/dist/cjs/import/OgmoImporter.js.map +1 -0
- package/dist/cjs/import/RPGMakerImporter.js +520 -0
- package/dist/cjs/import/RPGMakerImporter.js.map +1 -0
- package/dist/cjs/import/SceneImporter.js +449 -0
- package/dist/cjs/import/SceneImporter.js.map +1 -0
- package/dist/cjs/import/SpineImporter.js +583 -0
- package/dist/cjs/import/SpineImporter.js.map +1 -0
- package/dist/cjs/import/SpriterImporter.js +652 -0
- package/dist/cjs/import/SpriterImporter.js.map +1 -0
- package/dist/cjs/import/TiledMapImporter.js +859 -0
- package/dist/cjs/import/TiledMapImporter.js.map +1 -0
- package/dist/cjs/import/UnitySceneImporter.js +732 -0
- package/dist/cjs/import/UnitySceneImporter.js.map +1 -0
- package/dist/cjs/import/index.js +305 -0
- package/dist/cjs/import/index.js.map +1 -0
- package/dist/cjs/index.js +291 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/input/GamepadNavigation.js +21 -21
- package/dist/cjs/input/useGamepads.js +6 -6
- package/dist/cjs/integration/IconSprite.js +281 -0
- package/dist/cjs/integration/IconSprite.js.map +1 -0
- package/dist/cjs/inventory/InventorySystem.js +930 -0
- package/dist/cjs/inventory/InventorySystem.js.map +1 -0
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
- package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
- package/dist/cjs/quest/QuestSystem.js +924 -0
- package/dist/cjs/quest/QuestSystem.js.map +1 -0
- package/dist/cjs/rendering/WebGPURenderPipeline.js +658 -0
- package/dist/cjs/rendering/WebGPURenderPipeline.js.map +1 -0
- package/dist/cjs/scripting/GraphToAST.js +567 -0
- package/dist/cjs/scripting/GraphToAST.js.map +1 -0
- package/dist/cjs/scripting/LanguageExporter.js +321 -0
- package/dist/cjs/scripting/LanguageExporter.js.map +1 -0
- package/dist/cjs/scripting/ScriptAST.js +67 -0
- package/dist/cjs/scripting/ScriptAST.js.map +1 -0
- package/dist/cjs/scripting/VisualScripting2.js +1140 -0
- package/dist/cjs/scripting/VisualScripting2.js.map +1 -0
- package/dist/cjs/scripting/exporters/CSharpExporter.js +503 -0
- package/dist/cjs/scripting/exporters/CSharpExporter.js.map +1 -0
- package/dist/cjs/scripting/exporters/GDScriptExporter.js +452 -0
- package/dist/cjs/scripting/exporters/GDScriptExporter.js.map +1 -0
- package/dist/cjs/scripting/exporters/LuaExporter.js +457 -0
- package/dist/cjs/scripting/exporters/LuaExporter.js.map +1 -0
- package/dist/cjs/scripting/exporters/PythonExporter.js +565 -0
- package/dist/cjs/scripting/exporters/PythonExporter.js.map +1 -0
- package/dist/cjs/scripting/exporters/RustExporter.js +525 -0
- package/dist/cjs/scripting/exporters/RustExporter.js.map +1 -0
- package/dist/cjs/scripting/exporters/TypeScriptExporter.js +570 -0
- package/dist/cjs/scripting/exporters/TypeScriptExporter.js.map +1 -0
- package/dist/cjs/systems/ParticleSystem2.js +1478 -0
- package/dist/cjs/systems/ParticleSystem2.js.map +1 -0
- package/dist/cjs/xr/ARVR.js.map +1 -1
- package/dist/esm/ai/BehaviorTree.js +1186 -0
- package/dist/esm/ai/BehaviorTree.js.map +1 -0
- package/dist/esm/ai/StateMachine.js +767 -0
- package/dist/esm/ai/StateMachine.js.map +1 -0
- package/dist/esm/audio/AudioBridge.js +446 -0
- package/dist/esm/audio/AudioBridge.js.map +1 -0
- package/dist/esm/devtools/GameplayAnalytics.js +639 -0
- package/dist/esm/devtools/GameplayAnalytics.js.map +1 -0
- package/dist/esm/dialogue/DialogueSystem.js +1008 -0
- package/dist/esm/dialogue/DialogueSystem.js.map +1 -0
- package/dist/esm/editor/NiceGameEditor.js +556 -58
- package/dist/esm/editor/NiceGameEditor.js.map +1 -1
- package/dist/esm/editor/ShaderGraph.js +1606 -0
- package/dist/esm/editor/ShaderGraph.js.map +1 -0
- package/dist/esm/editor/TimelineEditor.js +800 -0
- package/dist/esm/editor/TimelineEditor.js.map +1 -0
- package/dist/esm/engine/SaveSystemV2.js +487 -0
- package/dist/esm/engine/SaveSystemV2.js.map +1 -0
- package/dist/esm/export/GodotExporter.js +1100 -0
- package/dist/esm/export/GodotExporter.js.map +1 -0
- package/dist/esm/export/PlatformExporter.js +230 -0
- package/dist/esm/export/PlatformExporter.js.map +1 -0
- package/dist/esm/export/ThreeJSExporter.js +1114 -0
- package/dist/esm/export/ThreeJSExporter.js.map +1 -0
- package/dist/esm/export/UnityExporter.js +1191 -0
- package/dist/esm/export/UnityExporter.js.map +1 -0
- package/dist/esm/export/WebExporter.js +1033 -0
- package/dist/esm/export/WebExporter.js.map +1 -0
- package/dist/esm/export/index.js +44 -0
- package/dist/esm/export/index.js.map +1 -0
- package/dist/esm/import/AsepriteImporter.js +759 -0
- package/dist/esm/import/AsepriteImporter.js.map +1 -0
- package/dist/esm/import/DragonBonesImporter.js +496 -0
- package/dist/esm/import/DragonBonesImporter.js.map +1 -0
- package/dist/esm/import/GameMakerImporter.js +556 -0
- package/dist/esm/import/GameMakerImporter.js.map +1 -0
- package/dist/esm/import/GodotSceneImporter.js +822 -0
- package/dist/esm/import/GodotSceneImporter.js.map +1 -0
- package/dist/esm/import/LDtkImporter.js +479 -0
- package/dist/esm/import/LDtkImporter.js.map +1 -0
- package/dist/esm/import/Live2DImporter.js +550 -0
- package/dist/esm/import/Live2DImporter.js.map +1 -0
- package/dist/esm/import/NdgFormat.js +490 -0
- package/dist/esm/import/NdgFormat.js.map +1 -0
- package/dist/esm/import/OgmoImporter.js +526 -0
- package/dist/esm/import/OgmoImporter.js.map +1 -0
- package/dist/esm/import/RPGMakerImporter.js +517 -0
- package/dist/esm/import/RPGMakerImporter.js.map +1 -0
- package/dist/esm/import/SceneImporter.js +441 -0
- package/dist/esm/import/SceneImporter.js.map +1 -0
- package/dist/esm/import/SpineImporter.js +580 -0
- package/dist/esm/import/SpineImporter.js.map +1 -0
- package/dist/esm/import/SpriterImporter.js +649 -0
- package/dist/esm/import/SpriterImporter.js.map +1 -0
- package/dist/esm/import/TiledMapImporter.js +857 -0
- package/dist/esm/import/TiledMapImporter.js.map +1 -0
- package/dist/esm/import/UnitySceneImporter.js +730 -0
- package/dist/esm/import/UnitySceneImporter.js.map +1 -0
- package/dist/esm/import/index.js +279 -0
- package/dist/esm/import/index.js.map +1 -0
- package/dist/esm/index.js +47 -3
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/integration/IconSprite.js +266 -0
- package/dist/esm/integration/IconSprite.js.map +1 -0
- package/dist/esm/inventory/InventorySystem.js +924 -0
- package/dist/esm/inventory/InventorySystem.js.map +1 -0
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +1 -1
- package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +1 -1
- package/dist/esm/quest/QuestSystem.js +916 -0
- package/dist/esm/quest/QuestSystem.js.map +1 -0
- package/dist/esm/rendering/WebGPURenderPipeline.js +642 -0
- package/dist/esm/rendering/WebGPURenderPipeline.js.map +1 -0
- package/dist/esm/scripting/GraphToAST.js +564 -0
- package/dist/esm/scripting/GraphToAST.js.map +1 -0
- package/dist/esm/scripting/LanguageExporter.js +311 -0
- package/dist/esm/scripting/LanguageExporter.js.map +1 -0
- package/dist/esm/scripting/ScriptAST.js +52 -0
- package/dist/esm/scripting/ScriptAST.js.map +1 -0
- package/dist/esm/scripting/VisualScripting2.js +1130 -0
- package/dist/esm/scripting/VisualScripting2.js.map +1 -0
- package/dist/esm/scripting/exporters/CSharpExporter.js +501 -0
- package/dist/esm/scripting/exporters/CSharpExporter.js.map +1 -0
- package/dist/esm/scripting/exporters/GDScriptExporter.js +450 -0
- package/dist/esm/scripting/exporters/GDScriptExporter.js.map +1 -0
- package/dist/esm/scripting/exporters/LuaExporter.js +455 -0
- package/dist/esm/scripting/exporters/LuaExporter.js.map +1 -0
- package/dist/esm/scripting/exporters/PythonExporter.js +563 -0
- package/dist/esm/scripting/exporters/PythonExporter.js.map +1 -0
- package/dist/esm/scripting/exporters/RustExporter.js +523 -0
- package/dist/esm/scripting/exporters/RustExporter.js.map +1 -0
- package/dist/esm/scripting/exporters/TypeScriptExporter.js +568 -0
- package/dist/esm/scripting/exporters/TypeScriptExporter.js.map +1 -0
- package/dist/esm/systems/ParticleSystem2.js +1471 -0
- package/dist/esm/systems/ParticleSystem2.js.map +1 -0
- package/dist/esm/xr/ARVR.js.map +1 -1
- package/dist/types/__tests__/setup.d.ts +1 -1
- package/dist/types/ai/BehaviorTree.d.ts +375 -0
- package/dist/types/ai/StateMachine.d.ts +296 -0
- package/dist/types/audio/AudioBridge.d.ts +199 -0
- package/dist/types/devtools/GameplayAnalytics.d.ts +279 -0
- package/dist/types/dialogue/DialogueSystem.d.ts +326 -0
- package/dist/types/dialogue/index.d.ts +2 -0
- package/dist/types/editor/NiceGameEditor.d.ts +12 -1
- package/dist/types/editor/ShaderGraph.d.ts +207 -0
- package/dist/types/editor/TimelineEditor.d.ts +393 -0
- package/dist/types/engine/SaveSystemV2.d.ts +155 -0
- package/dist/types/export/GodotExporter.d.ts +56 -0
- package/dist/types/export/PlatformExporter.d.ts +201 -0
- package/dist/types/export/ThreeJSExporter.d.ts +40 -0
- package/dist/types/export/UnityExporter.d.ts +69 -0
- package/dist/types/export/WebExporter.d.ts +58 -0
- package/dist/types/export/index.d.ts +19 -0
- package/dist/types/import/AsepriteImporter.d.ts +46 -0
- package/dist/types/import/DragonBonesImporter.d.ts +331 -0
- package/dist/types/import/GameMakerImporter.d.ts +375 -0
- package/dist/types/import/GodotSceneImporter.d.ts +34 -0
- package/dist/types/import/LDtkImporter.d.ts +177 -0
- package/dist/types/import/Live2DImporter.d.ts +237 -0
- package/dist/types/import/NdgFormat.d.ts +387 -0
- package/dist/types/import/OgmoImporter.d.ts +237 -0
- package/dist/types/import/RPGMakerImporter.d.ts +186 -0
- package/dist/types/import/SceneImporter.d.ts +276 -0
- package/dist/types/import/SpineImporter.d.ts +372 -0
- package/dist/types/import/SpriterImporter.d.ts +230 -0
- package/dist/types/import/TiledMapImporter.d.ts +57 -0
- package/dist/types/import/UnitySceneImporter.d.ts +87 -0
- package/dist/types/import/index.d.ts +59 -0
- package/dist/types/index.d.ts +46 -18
- package/dist/types/integration/IconSprite.d.ts +196 -0
- package/dist/types/inventory/InventorySystem.d.ts +336 -0
- package/dist/types/performance/WebGPUCompute.d.ts +0 -10
- package/dist/types/quest/QuestSystem.d.ts +287 -0
- package/dist/types/rendering/WebGPURenderPipeline.d.ts +255 -0
- package/dist/types/scripting/GraphToAST.d.ts +55 -0
- package/dist/types/scripting/LanguageExporter.d.ts +136 -0
- package/dist/types/scripting/ScriptAST.d.ts +312 -0
- package/dist/types/scripting/VisualScripting2.d.ts +353 -0
- package/dist/types/scripting/exporters/CSharpExporter.d.ts +44 -0
- package/dist/types/scripting/exporters/GDScriptExporter.d.ts +46 -0
- package/dist/types/scripting/exporters/LuaExporter.d.ts +46 -0
- package/dist/types/scripting/exporters/PythonExporter.d.ts +49 -0
- package/dist/types/scripting/exporters/RustExporter.d.ts +46 -0
- package/dist/types/scripting/exporters/TypeScriptExporter.d.ts +48 -0
- package/dist/types/scripting/exporters/index.d.ts +8 -0
- package/dist/types/scripting/index.d.ts +11 -0
- package/dist/types/systems/ParticleSystem2.d.ts +646 -0
- package/package.json +7 -1
|
@@ -0,0 +1,336 @@
|
|
|
1
|
+
import type { EntityId } from '../core/types';
|
|
2
|
+
import { EventBus } from '../core/EventBus';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
/** Item rarity levels */
|
|
5
|
+
export type ItemRarity = 'common' | 'uncommon' | 'rare' | 'epic' | 'legendary' | 'mythic' | 'unique';
|
|
6
|
+
/** Item categories */
|
|
7
|
+
export type ItemCategory = 'weapon' | 'armor' | 'accessory' | 'consumable' | 'material' | 'currency' | 'quest' | 'key' | 'tool' | 'mount' | 'pet' | 'cosmetic' | 'container' | 'misc';
|
|
8
|
+
/** Equipment slot types */
|
|
9
|
+
export type EquipmentSlot = 'head' | 'chest' | 'legs' | 'feet' | 'hands' | 'shoulders' | 'back' | 'waist' | 'mainHand' | 'offHand' | 'twoHand' | 'ring1' | 'ring2' | 'neck' | 'trinket1' | 'trinket2';
|
|
10
|
+
/** Stat modifier types */
|
|
11
|
+
export type StatType = 'health' | 'mana' | 'stamina' | 'attack' | 'defense' | 'magic' | 'speed' | 'critRate' | 'critDamage' | 'dodge' | 'accuracy' | 'luck' | 'custom';
|
|
12
|
+
/** Container types */
|
|
13
|
+
export type ContainerType = 'player' | 'chest' | 'shop' | 'bank' | 'guild' | 'mail' | 'crafting' | 'loot';
|
|
14
|
+
export interface StatModifier {
|
|
15
|
+
stat: StatType;
|
|
16
|
+
/** Flat value added */
|
|
17
|
+
flat?: number;
|
|
18
|
+
/** Percentage modifier (0.1 = +10%) */
|
|
19
|
+
percent?: number;
|
|
20
|
+
/** Custom stat name if type is 'custom' */
|
|
21
|
+
customName?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ItemDefinition {
|
|
24
|
+
id: string;
|
|
25
|
+
name: string;
|
|
26
|
+
description: string;
|
|
27
|
+
category: ItemCategory;
|
|
28
|
+
rarity: ItemRarity;
|
|
29
|
+
/** Icon URL or icon key */
|
|
30
|
+
icon: string;
|
|
31
|
+
/** Maximum stack size (1 = not stackable) */
|
|
32
|
+
maxStack: number;
|
|
33
|
+
/** Item weight for capacity systems */
|
|
34
|
+
weight: number;
|
|
35
|
+
/** Base value in currency */
|
|
36
|
+
value: number;
|
|
37
|
+
/** Level requirement to use/equip */
|
|
38
|
+
levelRequirement?: number;
|
|
39
|
+
/** Class/role requirements */
|
|
40
|
+
classRequirement?: string[];
|
|
41
|
+
/** Stat requirements (e.g., min strength) */
|
|
42
|
+
statRequirements?: StatModifier[];
|
|
43
|
+
/** Whether item can be traded */
|
|
44
|
+
tradable: boolean;
|
|
45
|
+
/** Whether item can be sold */
|
|
46
|
+
sellable: boolean;
|
|
47
|
+
/** Whether item is destroyed on use */
|
|
48
|
+
consumeOnUse: boolean;
|
|
49
|
+
/** Equipment slot if equippable */
|
|
50
|
+
equipSlot?: EquipmentSlot;
|
|
51
|
+
/** Stat bonuses when equipped/active */
|
|
52
|
+
stats?: StatModifier[];
|
|
53
|
+
/** Max durability (undefined = indestructible) */
|
|
54
|
+
maxDurability?: number;
|
|
55
|
+
/** Set ID if part of a set */
|
|
56
|
+
setId?: string;
|
|
57
|
+
/** Soulbound type */
|
|
58
|
+
binding?: 'none' | 'onPickup' | 'onEquip' | 'account';
|
|
59
|
+
/** Cool-down in milliseconds for consumables */
|
|
60
|
+
cooldown?: number;
|
|
61
|
+
/** Effect ID when consumed */
|
|
62
|
+
effectId?: string;
|
|
63
|
+
/** Tags for filtering/searching */
|
|
64
|
+
tags?: string[];
|
|
65
|
+
/** Custom data */
|
|
66
|
+
customData?: Record<string, unknown>;
|
|
67
|
+
}
|
|
68
|
+
export interface ItemInstance {
|
|
69
|
+
/** Unique instance ID */
|
|
70
|
+
instanceId: string;
|
|
71
|
+
/** Reference to item definition */
|
|
72
|
+
itemId: string;
|
|
73
|
+
/** Current stack count */
|
|
74
|
+
count: number;
|
|
75
|
+
/** Current durability */
|
|
76
|
+
durability?: number;
|
|
77
|
+
/** Bound to player ID */
|
|
78
|
+
boundTo?: string;
|
|
79
|
+
/** Enchantments applied */
|
|
80
|
+
enchantments?: string[];
|
|
81
|
+
/** Socket gems */
|
|
82
|
+
sockets?: string[];
|
|
83
|
+
/** Custom display name override */
|
|
84
|
+
customName?: string;
|
|
85
|
+
/** Last used timestamp (for cooldown) */
|
|
86
|
+
lastUsed?: number;
|
|
87
|
+
/** Created timestamp */
|
|
88
|
+
createdAt: number;
|
|
89
|
+
/** Custom instance data */
|
|
90
|
+
customData?: Record<string, unknown>;
|
|
91
|
+
}
|
|
92
|
+
export interface InventorySlot {
|
|
93
|
+
/** Slot index */
|
|
94
|
+
index: number;
|
|
95
|
+
/** Item in this slot (null if empty) */
|
|
96
|
+
item: ItemInstance | null;
|
|
97
|
+
/** Whether slot is locked */
|
|
98
|
+
locked?: boolean;
|
|
99
|
+
}
|
|
100
|
+
export interface Container {
|
|
101
|
+
id: string;
|
|
102
|
+
type: ContainerType;
|
|
103
|
+
name: string;
|
|
104
|
+
/** Owner entity ID */
|
|
105
|
+
ownerId?: EntityId;
|
|
106
|
+
/** Maximum number of slots */
|
|
107
|
+
maxSlots: number;
|
|
108
|
+
/** Maximum weight capacity (undefined = unlimited) */
|
|
109
|
+
maxWeight?: number;
|
|
110
|
+
/** Slots array */
|
|
111
|
+
slots: InventorySlot[];
|
|
112
|
+
/** Currency stored in container */
|
|
113
|
+
currency?: Map<string, number>;
|
|
114
|
+
/** Whether container is sorted */
|
|
115
|
+
sorted?: boolean;
|
|
116
|
+
/** Filter for allowed item categories */
|
|
117
|
+
allowedCategories?: ItemCategory[];
|
|
118
|
+
/** Filter for disallowed item categories */
|
|
119
|
+
disallowedCategories?: ItemCategory[];
|
|
120
|
+
}
|
|
121
|
+
export interface EquipmentState {
|
|
122
|
+
ownerId: EntityId;
|
|
123
|
+
slots: Map<EquipmentSlot, ItemInstance | null>;
|
|
124
|
+
/** Calculated total stats from all equipped items */
|
|
125
|
+
totalStats: Map<StatType, number>;
|
|
126
|
+
}
|
|
127
|
+
export interface CraftingIngredient {
|
|
128
|
+
itemId: string;
|
|
129
|
+
count: number;
|
|
130
|
+
consumed: boolean;
|
|
131
|
+
}
|
|
132
|
+
export interface CraftingRecipe {
|
|
133
|
+
id: string;
|
|
134
|
+
name: string;
|
|
135
|
+
description: string;
|
|
136
|
+
/** Required ingredients */
|
|
137
|
+
ingredients: CraftingIngredient[];
|
|
138
|
+
/** Output item ID */
|
|
139
|
+
outputItemId: string;
|
|
140
|
+
/** Output quantity */
|
|
141
|
+
outputCount: number;
|
|
142
|
+
/** Crafting time in milliseconds */
|
|
143
|
+
craftTime: number;
|
|
144
|
+
/** Required skill/profession */
|
|
145
|
+
requiredSkill?: string;
|
|
146
|
+
/** Required skill level */
|
|
147
|
+
requiredSkillLevel?: number;
|
|
148
|
+
/** Whether recipe is learned or always available */
|
|
149
|
+
requiresLearning: boolean;
|
|
150
|
+
/** Success rate (0-1) */
|
|
151
|
+
successRate: number;
|
|
152
|
+
/** XP granted on success */
|
|
153
|
+
experienceGrant?: number;
|
|
154
|
+
}
|
|
155
|
+
export interface LootEntry {
|
|
156
|
+
itemId: string;
|
|
157
|
+
/** Drop weight (relative to other entries) */
|
|
158
|
+
weight: number;
|
|
159
|
+
/** Minimum quantity */
|
|
160
|
+
minCount: number;
|
|
161
|
+
/** Maximum quantity */
|
|
162
|
+
maxCount: number;
|
|
163
|
+
/** Per-item drop chance (0-1) after selection */
|
|
164
|
+
dropChance: number;
|
|
165
|
+
/** Conditions for this entry to be included */
|
|
166
|
+
conditions?: {
|
|
167
|
+
minLevel?: number;
|
|
168
|
+
maxLevel?: number;
|
|
169
|
+
requiredTags?: string[];
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
export interface LootTable {
|
|
173
|
+
id: string;
|
|
174
|
+
name: string;
|
|
175
|
+
/** Entries with drop weights */
|
|
176
|
+
entries: LootEntry[];
|
|
177
|
+
/** Number of rolls on this table */
|
|
178
|
+
rolls: number;
|
|
179
|
+
/** Guaranteed drops (always included) */
|
|
180
|
+
guaranteedDrops?: {
|
|
181
|
+
itemId: string;
|
|
182
|
+
count: number;
|
|
183
|
+
}[];
|
|
184
|
+
}
|
|
185
|
+
export interface ShopListing {
|
|
186
|
+
itemId: string;
|
|
187
|
+
/** Override price (uses item.value if undefined) */
|
|
188
|
+
price?: number;
|
|
189
|
+
/** Currency type for this listing */
|
|
190
|
+
currencyId: string;
|
|
191
|
+
/** Available stock (-1 = unlimited) */
|
|
192
|
+
stock: number;
|
|
193
|
+
/** Restock interval in milliseconds */
|
|
194
|
+
restockInterval?: number;
|
|
195
|
+
/** Requirements to see/buy */
|
|
196
|
+
requirements?: {
|
|
197
|
+
level?: number;
|
|
198
|
+
reputation?: {
|
|
199
|
+
factionId: string;
|
|
200
|
+
minLevel: number;
|
|
201
|
+
};
|
|
202
|
+
questCompleted?: string;
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
export interface Shop {
|
|
206
|
+
id: string;
|
|
207
|
+
name: string;
|
|
208
|
+
/** NPC or location ID owning this shop */
|
|
209
|
+
ownerId?: string;
|
|
210
|
+
/** Buy rate (percentage of item value) */
|
|
211
|
+
buyRate: number;
|
|
212
|
+
/** Sell rate (percentage of item value) */
|
|
213
|
+
sellRate: number;
|
|
214
|
+
/** Available listings */
|
|
215
|
+
listings: ShopListing[];
|
|
216
|
+
/** Currencies accepted */
|
|
217
|
+
acceptedCurrencies: string[];
|
|
218
|
+
}
|
|
219
|
+
export type InventoryEventType = 'item:added' | 'item:removed' | 'item:moved' | 'item:stacked' | 'item:split' | 'item:equipped' | 'item:unequipped' | 'item:used' | 'item:destroyed' | 'item:repaired' | 'item:enchanted' | 'craft:started' | 'craft:completed' | 'craft:failed' | 'shop:bought' | 'shop:sold' | 'loot:generated' | 'currency:changed' | 'container:created' | 'container:destroyed' | 'container:sorted';
|
|
220
|
+
export interface InventoryEvent {
|
|
221
|
+
type: InventoryEventType;
|
|
222
|
+
containerId?: string;
|
|
223
|
+
ownerId?: EntityId;
|
|
224
|
+
item?: ItemInstance;
|
|
225
|
+
itemId?: string;
|
|
226
|
+
slot?: number;
|
|
227
|
+
fromSlot?: number;
|
|
228
|
+
toSlot?: number;
|
|
229
|
+
count?: number;
|
|
230
|
+
currencyId?: string;
|
|
231
|
+
amount?: number;
|
|
232
|
+
recipeId?: string;
|
|
233
|
+
shopId?: string;
|
|
234
|
+
timestamp: number;
|
|
235
|
+
customData?: Record<string, unknown>;
|
|
236
|
+
}
|
|
237
|
+
export interface InventoryManagerConfig {
|
|
238
|
+
/** Default container size */
|
|
239
|
+
defaultSlots: number;
|
|
240
|
+
/** Enable weight system */
|
|
241
|
+
enableWeight: boolean;
|
|
242
|
+
/** Enable durability system */
|
|
243
|
+
enableDurability: boolean;
|
|
244
|
+
/** Auto-stack on pickup */
|
|
245
|
+
autoStack: boolean;
|
|
246
|
+
/** Auto-sort after changes */
|
|
247
|
+
autoSort: boolean;
|
|
248
|
+
/** Maximum containers per entity */
|
|
249
|
+
maxContainersPerEntity: number;
|
|
250
|
+
}
|
|
251
|
+
export declare class InventoryManager {
|
|
252
|
+
private config;
|
|
253
|
+
private eventBus;
|
|
254
|
+
private itemDefinitions;
|
|
255
|
+
private containers;
|
|
256
|
+
private equipment;
|
|
257
|
+
private recipes;
|
|
258
|
+
private lootTables;
|
|
259
|
+
private shops;
|
|
260
|
+
private learnedRecipes;
|
|
261
|
+
private cooldowns;
|
|
262
|
+
constructor(config?: Partial<InventoryManagerConfig>);
|
|
263
|
+
setEventBus(bus: EventBus): void;
|
|
264
|
+
private emit;
|
|
265
|
+
registerItem(definition: ItemDefinition): void;
|
|
266
|
+
registerItems(definitions: ItemDefinition[]): void;
|
|
267
|
+
getItemDefinition(itemId: string): ItemDefinition | undefined;
|
|
268
|
+
getAllItemDefinitions(): ItemDefinition[];
|
|
269
|
+
createContainer(type: ContainerType, ownerId?: EntityId, options?: Partial<Container>): Container;
|
|
270
|
+
getContainer(containerId: string): Container | undefined;
|
|
271
|
+
getContainersByOwner(ownerId: EntityId): Container[];
|
|
272
|
+
destroyContainer(containerId: string): boolean;
|
|
273
|
+
createItemInstance(itemId: string, count?: number, options?: Partial<ItemInstance>): ItemInstance | null;
|
|
274
|
+
addItem(containerId: string, itemId: string, count?: number, options?: Partial<ItemInstance>): ItemInstance | null;
|
|
275
|
+
removeItem(containerId: string, slotIndex: number, count?: number): ItemInstance | null;
|
|
276
|
+
moveItem(fromContainerId: string, fromSlot: number, toContainerId: string, toSlot: number): boolean;
|
|
277
|
+
splitStack(containerId: string, slotIndex: number, splitCount: number): boolean;
|
|
278
|
+
getContainerWeight(containerId: string): number;
|
|
279
|
+
getContainerFreeSlots(containerId: string): number;
|
|
280
|
+
initializeEquipment(ownerId: EntityId): EquipmentState;
|
|
281
|
+
getEquipment(ownerId: EntityId): EquipmentState | undefined;
|
|
282
|
+
equipItem(ownerId: EntityId, containerId: string, slotIndex: number): boolean;
|
|
283
|
+
unequipItem(ownerId: EntityId, equipSlot: EquipmentSlot, containerId: string): boolean;
|
|
284
|
+
private unequipToContainer;
|
|
285
|
+
private recalculateEquipmentStats;
|
|
286
|
+
damageDurability(instance: ItemInstance, damage: number): boolean;
|
|
287
|
+
repairItem(instance: ItemInstance, amount?: number): boolean;
|
|
288
|
+
useItem(containerId: string, slotIndex: number, targetEntityId?: EntityId): boolean;
|
|
289
|
+
registerRecipe(recipe: CraftingRecipe): void;
|
|
290
|
+
learnRecipe(entityId: EntityId, recipeId: string): boolean;
|
|
291
|
+
canCraft(entityId: EntityId, recipeId: string, containerId: string): boolean;
|
|
292
|
+
craft(entityId: EntityId, recipeId: string, containerId: string): ItemInstance | null;
|
|
293
|
+
registerLootTable(table: LootTable): void;
|
|
294
|
+
generateLoot(tableId: string, modifiers?: {
|
|
295
|
+
luckBonus?: number;
|
|
296
|
+
levelContext?: number;
|
|
297
|
+
}): ItemInstance[];
|
|
298
|
+
registerShop(shop: Shop): void;
|
|
299
|
+
getShop(shopId: string): Shop | undefined;
|
|
300
|
+
buyFromShop(shopId: string, listingIndex: number, quantity: number, buyerContainerId: string): boolean;
|
|
301
|
+
sellToShop(shopId: string, sellerContainerId: string, slotIndex: number, quantity: number): boolean;
|
|
302
|
+
addCurrency(containerId: string, currencyId: string, amount: number): boolean;
|
|
303
|
+
removeCurrency(containerId: string, currencyId: string, amount: number): boolean;
|
|
304
|
+
getCurrency(containerId: string, currencyId: string): number;
|
|
305
|
+
sortContainer(containerId: string, criteria?: 'category' | 'rarity' | 'name' | 'value'): void;
|
|
306
|
+
countItemsInContainer(containerId: string, itemId: string): number;
|
|
307
|
+
private removeItemsByIdFromContainer;
|
|
308
|
+
findItem(containerId: string, itemId: string): {
|
|
309
|
+
slot: InventorySlot;
|
|
310
|
+
instance: ItemInstance;
|
|
311
|
+
} | null;
|
|
312
|
+
serialize(): InventorySnapshot;
|
|
313
|
+
deserialize(snapshot: InventorySnapshot): void;
|
|
314
|
+
}
|
|
315
|
+
export interface InventorySnapshot {
|
|
316
|
+
containers: Array<Omit<Container, 'currency'> & {
|
|
317
|
+
currency: [string, number][];
|
|
318
|
+
}>;
|
|
319
|
+
equipment: Array<{
|
|
320
|
+
ownerId: EntityId;
|
|
321
|
+
slots: [EquipmentSlot, ItemInstance | null][];
|
|
322
|
+
totalStats: [StatType, number][];
|
|
323
|
+
}>;
|
|
324
|
+
learnedRecipes: Array<{
|
|
325
|
+
entityId: EntityId;
|
|
326
|
+
recipes: string[];
|
|
327
|
+
}>;
|
|
328
|
+
}
|
|
329
|
+
export declare const InventoryProvider: React.FC<{
|
|
330
|
+
manager: InventoryManager;
|
|
331
|
+
children: React.ReactNode;
|
|
332
|
+
}>;
|
|
333
|
+
export declare function useInventoryManager(): InventoryManager;
|
|
334
|
+
export declare function useContainer(containerId: string): Container | undefined;
|
|
335
|
+
export declare function useEquipment(ownerId: EntityId): EquipmentState | undefined;
|
|
336
|
+
export default InventoryManager;
|
|
@@ -72,16 +72,6 @@ declare global {
|
|
|
72
72
|
interface GPUDeviceLostInfo {
|
|
73
73
|
readonly message: string;
|
|
74
74
|
}
|
|
75
|
-
namespace GPUBufferUsage {
|
|
76
|
-
const STORAGE: number;
|
|
77
|
-
const COPY_SRC: number;
|
|
78
|
-
const COPY_DST: number;
|
|
79
|
-
const MAP_READ: number;
|
|
80
|
-
const UNIFORM: number;
|
|
81
|
-
}
|
|
82
|
-
namespace GPUMapMode {
|
|
83
|
-
const READ: number;
|
|
84
|
-
}
|
|
85
75
|
interface GPU {
|
|
86
76
|
requestAdapter(options?: {
|
|
87
77
|
powerPreference?: string;
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
import type { EntityId } from '../core/types';
|
|
2
|
+
import { EventBus } from '../core/EventBus';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
/** Quest categories */
|
|
5
|
+
export type QuestType = 'main' | 'side' | 'daily' | 'weekly' | 'achievement' | 'tutorial' | 'hidden';
|
|
6
|
+
/** Quest status */
|
|
7
|
+
export type QuestStatus = 'locked' | 'available' | 'active' | 'completed' | 'failed' | 'expired';
|
|
8
|
+
/** Objective types */
|
|
9
|
+
export type ObjectiveType = 'collect' | 'kill' | 'interact' | 'reach' | 'escort' | 'defend' | 'survive' | 'craft' | 'talk' | 'discover' | 'score' | 'custom';
|
|
10
|
+
/** Reward types */
|
|
11
|
+
export type RewardType = 'experience' | 'currency' | 'item' | 'skill' | 'reputation' | 'unlock' | 'achievement' | 'custom';
|
|
12
|
+
/** Difficulty levels */
|
|
13
|
+
export type QuestDifficulty = 'trivial' | 'easy' | 'normal' | 'hard' | 'legendary';
|
|
14
|
+
export interface QuestObjective {
|
|
15
|
+
id: string;
|
|
16
|
+
type: ObjectiveType;
|
|
17
|
+
description: string;
|
|
18
|
+
/** Current progress */
|
|
19
|
+
current: number;
|
|
20
|
+
/** Target value to complete */
|
|
21
|
+
target: number;
|
|
22
|
+
/** Whether this objective is optional */
|
|
23
|
+
optional?: boolean;
|
|
24
|
+
/** Whether this objective is hidden until progress is made */
|
|
25
|
+
hidden?: boolean;
|
|
26
|
+
/** Order for sequential objectives */
|
|
27
|
+
order?: number;
|
|
28
|
+
/** Custom data for objective tracking */
|
|
29
|
+
trackingData?: {
|
|
30
|
+
itemId?: string;
|
|
31
|
+
enemyType?: string;
|
|
32
|
+
entityId?: EntityId;
|
|
33
|
+
locationId?: string;
|
|
34
|
+
npcId?: string;
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
};
|
|
37
|
+
/** Completion status */
|
|
38
|
+
completed: boolean;
|
|
39
|
+
}
|
|
40
|
+
export interface QuestReward {
|
|
41
|
+
id: string;
|
|
42
|
+
type: RewardType;
|
|
43
|
+
/** Display name */
|
|
44
|
+
name: string;
|
|
45
|
+
/** Icon URL or icon key */
|
|
46
|
+
icon?: string;
|
|
47
|
+
/** Reward amount (for currency, experience) */
|
|
48
|
+
amount?: number;
|
|
49
|
+
/** Item ID (for item rewards) */
|
|
50
|
+
itemId?: string;
|
|
51
|
+
/** Quantity of items */
|
|
52
|
+
quantity?: number;
|
|
53
|
+
/** Skill ID (for skill unlocks) */
|
|
54
|
+
skillId?: string;
|
|
55
|
+
/** Reputation faction and amount */
|
|
56
|
+
reputation?: {
|
|
57
|
+
factionId: string;
|
|
58
|
+
amount: number;
|
|
59
|
+
};
|
|
60
|
+
/** What gets unlocked */
|
|
61
|
+
unlockId?: string;
|
|
62
|
+
/** Custom reward data */
|
|
63
|
+
customData?: Record<string, unknown>;
|
|
64
|
+
}
|
|
65
|
+
export interface QuestPrerequisite {
|
|
66
|
+
type: 'quest' | 'level' | 'item' | 'reputation' | 'skill' | 'time' | 'custom';
|
|
67
|
+
/** Quest ID that must be completed */
|
|
68
|
+
questId?: string;
|
|
69
|
+
/** Minimum level required */
|
|
70
|
+
level?: number;
|
|
71
|
+
/** Item that must be possessed */
|
|
72
|
+
itemId?: string;
|
|
73
|
+
/** Minimum reputation with faction */
|
|
74
|
+
reputation?: {
|
|
75
|
+
factionId: string;
|
|
76
|
+
amount: number;
|
|
77
|
+
};
|
|
78
|
+
/** Skill that must be unlocked */
|
|
79
|
+
skillId?: string;
|
|
80
|
+
/** Time window (for daily/weekly quests) */
|
|
81
|
+
timeWindow?: {
|
|
82
|
+
start: number;
|
|
83
|
+
end: number;
|
|
84
|
+
};
|
|
85
|
+
/** Custom condition key */
|
|
86
|
+
customKey?: string;
|
|
87
|
+
}
|
|
88
|
+
export interface Quest {
|
|
89
|
+
id: string;
|
|
90
|
+
/** Display name */
|
|
91
|
+
name: string;
|
|
92
|
+
/** Short description shown in quest list */
|
|
93
|
+
summary: string;
|
|
94
|
+
/** Full description with story/context */
|
|
95
|
+
description: string;
|
|
96
|
+
/** Quest category */
|
|
97
|
+
type: QuestType;
|
|
98
|
+
/** Difficulty rating */
|
|
99
|
+
difficulty: QuestDifficulty;
|
|
100
|
+
/** Quest icon */
|
|
101
|
+
icon?: string;
|
|
102
|
+
/** Quest giver NPC ID */
|
|
103
|
+
giverNpcId?: string;
|
|
104
|
+
/** Quest turn-in NPC ID */
|
|
105
|
+
turnInNpcId?: string;
|
|
106
|
+
/** Location hint */
|
|
107
|
+
locationHint?: string;
|
|
108
|
+
/** Level recommendation */
|
|
109
|
+
recommendedLevel?: number;
|
|
110
|
+
/** Objectives to complete */
|
|
111
|
+
objectives: QuestObjective[];
|
|
112
|
+
/** Rewards on completion */
|
|
113
|
+
rewards: QuestReward[];
|
|
114
|
+
/** Bonus rewards for optional objectives */
|
|
115
|
+
bonusRewards?: QuestReward[];
|
|
116
|
+
/** Prerequisites to unlock */
|
|
117
|
+
prerequisites: QuestPrerequisite[];
|
|
118
|
+
/** Quests that follow this one */
|
|
119
|
+
followUpQuests?: string[];
|
|
120
|
+
/** Tags for filtering */
|
|
121
|
+
tags?: string[];
|
|
122
|
+
/** Time limit in seconds (0 = no limit) */
|
|
123
|
+
timeLimit?: number;
|
|
124
|
+
/** Can quest be abandoned? */
|
|
125
|
+
canAbandon?: boolean;
|
|
126
|
+
/** Can quest be repeated? */
|
|
127
|
+
repeatable?: boolean;
|
|
128
|
+
/** Cooldown between repeats (ms) */
|
|
129
|
+
repeatCooldown?: number;
|
|
130
|
+
/** Custom quest data */
|
|
131
|
+
metadata?: Record<string, unknown>;
|
|
132
|
+
}
|
|
133
|
+
export interface QuestState {
|
|
134
|
+
questId: string;
|
|
135
|
+
status: QuestStatus;
|
|
136
|
+
objectives: QuestObjective[];
|
|
137
|
+
/** When quest was accepted */
|
|
138
|
+
startedAt?: number;
|
|
139
|
+
/** When quest was completed/failed */
|
|
140
|
+
endedAt?: number;
|
|
141
|
+
/** Time remaining (for timed quests) */
|
|
142
|
+
timeRemaining?: number;
|
|
143
|
+
/** Number of times completed (for repeatable) */
|
|
144
|
+
completionCount: number;
|
|
145
|
+
/** Last completion timestamp */
|
|
146
|
+
lastCompletedAt?: number;
|
|
147
|
+
}
|
|
148
|
+
export interface QuestJournal {
|
|
149
|
+
activeQuests: QuestState[];
|
|
150
|
+
completedQuests: QuestState[];
|
|
151
|
+
failedQuests: QuestState[];
|
|
152
|
+
trackedQuestId?: string;
|
|
153
|
+
}
|
|
154
|
+
export type QuestEventType = 'quest:unlocked' | 'quest:accepted' | 'quest:objective-progress' | 'quest:objective-completed' | 'quest:completed' | 'quest:failed' | 'quest:abandoned' | 'quest:reward-claimed' | 'quest:tracked';
|
|
155
|
+
export interface QuestEvent {
|
|
156
|
+
type: QuestEventType;
|
|
157
|
+
questId: string;
|
|
158
|
+
objectiveId?: string;
|
|
159
|
+
data?: unknown;
|
|
160
|
+
timestamp: number;
|
|
161
|
+
}
|
|
162
|
+
export declare class QuestManager {
|
|
163
|
+
private quests;
|
|
164
|
+
private journal;
|
|
165
|
+
private events;
|
|
166
|
+
private playerLevel;
|
|
167
|
+
private playerItems;
|
|
168
|
+
private playerSkills;
|
|
169
|
+
private reputation;
|
|
170
|
+
private customConditions;
|
|
171
|
+
constructor(events?: EventBus);
|
|
172
|
+
registerQuest(quest: Quest): void;
|
|
173
|
+
registerQuests(quests: Quest[]): void;
|
|
174
|
+
unregisterQuest(questId: string): void;
|
|
175
|
+
getQuest(questId: string): Quest | undefined;
|
|
176
|
+
getAllQuests(): Quest[];
|
|
177
|
+
setPlayerLevel(level: number): void;
|
|
178
|
+
addPlayerItem(itemId: string): void;
|
|
179
|
+
removePlayerItem(itemId: string): void;
|
|
180
|
+
addPlayerSkill(skillId: string): void;
|
|
181
|
+
setReputation(factionId: string, amount: number): void;
|
|
182
|
+
addReputation(factionId: string, amount: number): void;
|
|
183
|
+
registerCustomCondition(key: string, condition: () => boolean): void;
|
|
184
|
+
getQuestState(questId: string): QuestState | undefined;
|
|
185
|
+
getQuestStatus(questId: string): QuestStatus;
|
|
186
|
+
getActiveQuests(): QuestState[];
|
|
187
|
+
getCompletedQuests(): QuestState[];
|
|
188
|
+
getAvailableQuests(): Quest[];
|
|
189
|
+
getJournal(): QuestJournal;
|
|
190
|
+
canUnlockQuest(questId: string): boolean;
|
|
191
|
+
private checkPrerequisite;
|
|
192
|
+
acceptQuest(questId: string): boolean;
|
|
193
|
+
abandonQuest(questId: string): boolean;
|
|
194
|
+
updateObjectiveProgress(questId: string, objectiveId: string, amount: number): boolean;
|
|
195
|
+
setObjectiveProgress(questId: string, objectiveId: string, value: number): boolean;
|
|
196
|
+
completeObjective(questId: string, objectiveId: string): boolean;
|
|
197
|
+
private checkQuestCompletion;
|
|
198
|
+
completeQuest(questId: string): boolean;
|
|
199
|
+
failQuest(questId: string): boolean;
|
|
200
|
+
private checkQuestUnlocks;
|
|
201
|
+
private checkFollowUpQuests;
|
|
202
|
+
getQuestRewards(questId: string): {
|
|
203
|
+
main: QuestReward[];
|
|
204
|
+
bonus: QuestReward[];
|
|
205
|
+
} | null;
|
|
206
|
+
claimRewards(questId: string): QuestReward[] | null;
|
|
207
|
+
trackQuest(questId: string): void;
|
|
208
|
+
untrackQuest(): void;
|
|
209
|
+
getTrackedQuest(): QuestState | undefined;
|
|
210
|
+
update(deltaMs: number): void;
|
|
211
|
+
saveState(): QuestJournal;
|
|
212
|
+
loadState(journal: QuestJournal): void;
|
|
213
|
+
private emitEvent;
|
|
214
|
+
subscribe(eventType: QuestEventType, handler: (event: QuestEvent) => void): () => void;
|
|
215
|
+
}
|
|
216
|
+
export declare class QuestBuilder {
|
|
217
|
+
private quest;
|
|
218
|
+
private objectiveCounter;
|
|
219
|
+
private rewardCounter;
|
|
220
|
+
constructor(id: string, name: string);
|
|
221
|
+
summary(summary: string): this;
|
|
222
|
+
description(description: string): this;
|
|
223
|
+
type(type: QuestType): this;
|
|
224
|
+
difficulty(difficulty: QuestDifficulty): this;
|
|
225
|
+
icon(icon: string): this;
|
|
226
|
+
giver(npcId: string): this;
|
|
227
|
+
turnIn(npcId: string): this;
|
|
228
|
+
location(hint: string): this;
|
|
229
|
+
level(level: number): this;
|
|
230
|
+
timeLimit(seconds: number): this;
|
|
231
|
+
cannotAbandon(): this;
|
|
232
|
+
repeatable(cooldownMs?: number): this;
|
|
233
|
+
tags(tags: string[]): this;
|
|
234
|
+
followUp(questIds: string[]): this;
|
|
235
|
+
requireQuest(questId: string): this;
|
|
236
|
+
requireLevel(level: number): this;
|
|
237
|
+
requireItem(itemId: string): this;
|
|
238
|
+
requireReputation(factionId: string, amount: number): this;
|
|
239
|
+
requireSkill(skillId: string): this;
|
|
240
|
+
requireCustom(customKey: string): this;
|
|
241
|
+
private addObjective;
|
|
242
|
+
collect(itemId: string, amount: number, description: string, optional?: boolean): this;
|
|
243
|
+
kill(enemyType: string, amount: number, description: string, optional?: boolean): this;
|
|
244
|
+
interact(entityId: EntityId, description: string, optional?: boolean): this;
|
|
245
|
+
reach(locationId: string, description: string, optional?: boolean): this;
|
|
246
|
+
escort(npcId: string, locationId: string, description: string, optional?: boolean): this;
|
|
247
|
+
defend(seconds: number, description: string, optional?: boolean): this;
|
|
248
|
+
survive(seconds: number, description: string, optional?: boolean): this;
|
|
249
|
+
craft(itemId: string, amount: number, description: string, optional?: boolean): this;
|
|
250
|
+
talk(npcId: string, description: string, optional?: boolean): this;
|
|
251
|
+
discover(locationId: string, description: string, optional?: boolean): this;
|
|
252
|
+
score(threshold: number, description: string, optional?: boolean): this;
|
|
253
|
+
customObjective(type: string, target: number, description: string, data?: Record<string, unknown>, optional?: boolean): this;
|
|
254
|
+
private generateRewardId;
|
|
255
|
+
rewardXP(amount: number, name?: string): this;
|
|
256
|
+
rewardCurrency(amount: number, currencyName?: string): this;
|
|
257
|
+
rewardItem(itemId: string, name: string, quantity?: number, icon?: string): this;
|
|
258
|
+
rewardSkill(skillId: string, name: string, icon?: string): this;
|
|
259
|
+
rewardReputation(factionId: string, amount: number, factionName: string): this;
|
|
260
|
+
rewardUnlock(unlockId: string, name: string, icon?: string): this;
|
|
261
|
+
rewardAchievement(achievementId: string, name: string, icon?: string): this;
|
|
262
|
+
bonusXP(amount: number, name?: string): this;
|
|
263
|
+
bonusItem(itemId: string, name: string, quantity?: number, icon?: string): this;
|
|
264
|
+
build(): Quest;
|
|
265
|
+
}
|
|
266
|
+
export interface QuestListProps {
|
|
267
|
+
quests: QuestState[];
|
|
268
|
+
questDefinitions: Map<string, Quest>;
|
|
269
|
+
trackedId?: string;
|
|
270
|
+
onSelect?: (questId: string) => void;
|
|
271
|
+
onTrack?: (questId: string) => void;
|
|
272
|
+
filter?: QuestType[];
|
|
273
|
+
className?: string;
|
|
274
|
+
style?: React.CSSProperties;
|
|
275
|
+
}
|
|
276
|
+
export declare const QuestList: React.FC<QuestListProps>;
|
|
277
|
+
export interface QuestTrackerProps {
|
|
278
|
+
state: QuestState;
|
|
279
|
+
quest: Quest;
|
|
280
|
+
showOptional?: boolean;
|
|
281
|
+
className?: string;
|
|
282
|
+
style?: React.CSSProperties;
|
|
283
|
+
}
|
|
284
|
+
export declare const QuestTracker: React.FC<QuestTrackerProps>;
|
|
285
|
+
export declare function createEmptyQuest(id: string, name: string): Quest;
|
|
286
|
+
export declare const DIFFICULTY_COLORS: Record<QuestDifficulty, string>;
|
|
287
|
+
export declare const DIFFICULTY_XP_MULTIPLIERS: Record<QuestDifficulty, number>;
|