载入中...
搜索中...
未找到
DialogueFlow.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Module.h"
6#include "common/Result.h"
14
15#include <squirrel.h>
16#include <cstdint>
17#include <memory>
18#include <optional>
19#include <span>
20#include <string>
21#include <unordered_map>
22#include <vector>
23
24namespace ssq {
25class Object;
26}
27
28namespace eve::dialogue {
29
30class ConversationDocument;
31class DialogueControl;
32
33} // namespace eve::dialogue
34
35namespace eve::i18n {
36class I18n;
37}
38
39namespace eve::dialogue {
40
43public:
56 std::string subject;
58 eve::IStateQuery* stateQuery = nullptr;
60 eve::IStateMutation* stateMutation = nullptr;
75 std::function<eve::Result<std::unique_ptr<eve::transaction::ITransactionParticipant>>(
76 const CommandRequest&)>;
84 std::function<eve::Result<std::string>(const std::string&)> contentReader;
85 };
86
89 ~DialogueFlow() override;
90
102 void configureIntegration(IntegrationConfig config);
108 void clearIntegration();
110 const DialogueStateContext& stateContext() const noexcept { return stateContext_; }
112 [[nodiscard]] eve::Result<eve::MutationReceipt> applyStateMutations(std::span<const eve::StateMutation> mutations,
113 const eve::MutationContext& context) const;
114
116 [[nodiscard]] eve::Result<int> loadDnutChecked(const std::string& source, const std::string& sourceId);
118 [[nodiscard]] eve::Result<int> reloadDnutChecked(const std::string& source, const std::string& sourceId);
120 [[nodiscard]] eve::Result<int> loadDnutFileChecked(const std::string& path);
121 [[nodiscard]] eve::Result<int> importYarnChecked(const std::string& source, const std::string& path);
122 [[nodiscard]] eve::Result<int> importTweeChecked(const std::string& source, const std::string& path);
123 [[nodiscard]] eve::Result<void> removeSourceChecked(const std::string& path);
124 [[nodiscard]] eve::Result<void> lintAllChecked();
125 [[nodiscard]] eve::Result<void> renameConversationChecked(const std::string& oldId, const std::string& newId);
126 [[nodiscard]] eve::Result<void> renameNodeChecked(const std::string& conversationId, const std::string& oldId,
127 const std::string& newId);
128 bool getLastLoadChanged() const { return lastLoadChanged_; }
129 void clear();
130 int getConversationCount() const;
131 std::string getConversationId(int index) const;
132 bool hasConversation(const std::string& id) const;
133 std::string exportLocalizationCsv() const;
135 [[nodiscard]] eve::Result<int> importLocalizationCsvChecked(const std::string& csv,
136 const std::string& defaultLocale);
137 std::string exportMissingLocalizationCsv(const std::string& locale) const;
138 std::string exportVoiceRecordingCsv(const std::string& locale) const;
151 [[nodiscard]] eve::Result<int> validateLocalization(const eve::i18n::I18n& localization,
152 const std::string& locale) const;
153 void setLocale(const std::string& locale) { locale_ = locale; }
154 std::string getLocale() const { return locale_; }
155 int getDiagnosticCount() const;
156 std::string getDiagnosticSeverity(int index) const;
157 std::string getDiagnosticPath(int index) const;
158 int getDiagnosticLine(int index) const;
160 int getDiagnosticColumn(int index) const;
162 std::string getDiagnosticCode(int index) const;
164 std::string getDiagnosticAssetPath(int index) const;
165 std::string getDiagnosticMessage(int index) const;
167 ConversationDocument* newDocument(const std::string& id) const;
169 ConversationDocument* getDocument(const std::string& id) const;
171 [[nodiscard]] eve::Result<void> applyDocumentChecked(ConversationDocument* document);
172
180 [[nodiscard]] eve::Result<void> startChecked(const std::string& id, ssq::Object bindings);
191 [[nodiscard]] eve::Result<void> startChecked(const std::string& id);
193 bool start(const std::string& id, ssq::Object bindings);
201 [[nodiscard]] eve::Result<void> advanceChecked();
210 [[nodiscard]] eve::Result<void> resumeCommandChecked(const std::string& requestId, eve::Value value);
212 std::string getPendingCommandRequestId() const { return runner_.pendingCommandRequestId(); }
219 [[nodiscard]] eve::Result<void> select(const std::string& routeId);
220 bool isActive() const { return runner_.isActive(); }
221 bool isBlocked() const { return runner_.isBlocked(); }
222 std::string getConversationId() const;
223 std::string getNodeId() const { return runner_.currentNodeId(); }
224 std::string getNodeKind() const;
225 std::string getSpeaker() const;
226 std::string getText();
227 std::string getPool() const;
228 std::string getI18nKey() const;
229 std::string getVoice() const;
230 std::string getVoiceStatus() const;
231 float getVoiceDuration() const;
232 int getRouteCount() const;
233 std::string getRouteId(int index) const;
235 std::string getRouteText(int index) const;
237 void setManualCommandMode(bool enabled);
238
241 [[nodiscard]] eve::Result<void> setExpressionEvaluatorChecked(ssq::Object fn);
242 void clearExpressionEvaluator();
243
244 [[nodiscard]] eve::Result<StateValue> captureStateChecked() const;
245 [[nodiscard]] eve::Result<void> restoreStateChecked(const StateValue& in);
246 [[nodiscard]] eve::Result<std::string> captureStateJsonChecked() const;
247 [[nodiscard]] eve::Result<void> restoreStateJsonChecked(const std::string& json);
248 [[nodiscard]] eve::Result<void> registerMigrationChecked(const std::string& assetId, int fromVersion,
249 const std::string& currentAssetId,
250 const std::string& nodeMap);
251 void clearMigrations() { migrations_.clear(); }
252 void addToneRule(const std::string& expression, const std::string& prefix, const std::string& suffix,
253 const std::string& find, const std::string& replacement);
254 void clearToneRules() { textRenderer_.clearToneRules(); }
255
268 [[nodiscard]] eve::Result<void> publishGameplay(const std::string& instanceId, const std::string& ownerId);
270 [[nodiscard]] eve::Result<void> unpublishGameplay(const std::string& instanceId);
272 void clearGameplayControls();
274 [[nodiscard]] int gameplayControlCount() const;
276 [[nodiscard]] std::vector<std::string> gameplayInstances() const;
277
278private:
279 int loadDnutImpl(const std::string& source, const std::string& sourceId);
280 int reloadDnutImpl(const std::string& source, const std::string& sourceId);
281 int loadDnutFileImpl(const std::string& path);
282 [[nodiscard]] eve::Result<int> mergeImported(std::vector<eve::dnut::SequenceAsset> imported);
283 const eve::dnut::SequenceAsset* find(const std::string& id) const;
284 [[nodiscard]] eve::Result<StateValue> evaluate(const std::string& expression, const StateValue& bindings,
285 const StateValue& locals);
286 CommandResponse dispatchCommand(const CommandRequest& request);
287 void updateRuntimeCommandDispatcher();
288 std::string nextTransactionId(const char* purpose);
289
290 std::vector<eve::dnut::SequenceAsset> assets_;
291 std::vector<ConversationDiagnostic> diagnostics_;
292 eve::dnut::StepKindRegistry stepRegistry_;
294 DialogueStateContext stateContext_;
295 std::function<eve::decision::ConditionResult(const eve::Value&)> configuredConditionEvaluator_;
296 std::optional<eve::decision::ConditionResult> lastConditionResult_;
297 CommandRequestHandler operationRequestHandler_;
298 CommandRequestHandler gameplayActionHandler_;
299 IntegrationConfig::CommandParticipantFactory commandParticipantFactory_;
300 std::function<eve::Result<std::string>(const std::string&)> contentReader_;
301 eve::IStateMutation* stateMutationProvider_ = nullptr;
302 DialoguePaymentAdapter paymentAdapter_;
303 std::uint64_t transactionSequence_ = 1;
304 std::string failureMessage_;
305 HSQUIRRELVM vm_ = nullptr;
306 HSQOBJECT evaluator_{};
307 bool hasEvaluator_ = false;
308 bool manualCommandMode_ = false;
309 std::unordered_map<std::string, std::string> sourceTexts_;
310 std::unordered_map<std::string, std::vector<std::string>> sourceAssets_;
311 std::unordered_map<std::string, std::string> assetSources_;
312 std::unordered_map<std::string, DataValue> sourcePools_;
313 bool lastLoadChanged_ = false;
314 ConversationLocalizationCatalog localization_;
315 std::string locale_;
316 ConversationSaveMigrations migrations_;
317 ConversationTextRenderer textRenderer_;
319 std::unique_ptr<DialogueControl> gameplay_;
320};
321
322} // namespace eve::dialogue
double value
struct SQVM * HSQUIRRELVM
Dialogue's state boundary, condition adapter, and command request protocol.
std::uint64_t sourceId
#define EVENGINE_API_ORCHESTRATION
Definition Export.h:111
const GltfImportRequest & request
std::string imported
std::vector< std::shared_ptr< DeviceBytes > > bindings
Definition OnnxGpgpu.cpp:38
std::string path
Definition PlayHost.cpp:110
Move-only, checked operation results for the common layer.
Cross-frame interpreter for compiled `.dnut` sequences.
Extensible step vocabulary, payload schema and dispatch.
uint32_t index
const UnitySourceAsset & source
const VegetationPresetContext & context
EVENGINE_API_FOUNDATION public API.
Definition Module.h:46
Move-only operation result carrying either a value or Status.
Definition Result.h:155
JSON-compatible state value tree used by state hot reload.
Definition StateValue.h:20
The canonical owning dynamic value used by data-facing protocols.
Definition Value.h:31
Explain one condition evaluation in a UI- and log-friendly form.
Definition Condition.h:129
Mutable, UI-neutral conversation document for custom editor composition.
Script-facing registry and runner for compiled .dnut conversations.
const DialogueStateContext & stateContext() const noexcept
Return the facade-owned state boundary; providers remain borrowed.
void setLocale(const std::string &locale)
std::string getI18nKey() const
std::string getSpeaker() const
std::string getLocale() const
bool start(const std::string &id, ssq::Object bindings)
Compatibility-only bool projection of startChecked.
std::string getNodeId() const
std::string getPendingCommandRequestId() const
Return the current pending command id, or an empty string when none is pending.
std::string getPool() const
Composes Dialogue accounts with StatePatch or Action participants.
Dialogue-owned facade for world reads, unified conditions, and mutations.
Caller-owned interpreter over a compiled sequence asset.
bool isActive() const
Whether a sequence is currently loaded.
bool isBlocked() const
Whether execution is suspended and awaiting host acknowledgement.
const std::string & pendingCommandRequestId() const noexcept
Stable id of the blocked command, or an empty string.
const std::string & currentNodeId() const
Canonical step vocabulary owner and runtime handler router.
Game localization (i18n) module.
Definition I18n.h:38
All-or-nothing mutation boundary owned by the consumer.
Read-only world-state boundary owned by consumers such as Dialogue.
Definition StateAccess.h:79
std::function< CommandResponse(const CommandRequest &)> CommandRequestHandler
Handler implemented by the owning operation or gameplay domain.
EVEngine ECS 集成层:底层实现使用 sunxfancy/ECS.hpp https://github.com/sunxfancy/ECS.hpp
Definition ECS.h:14
SettlementPipeline::Stage fn
bool enabled
Immutable request emitted by a command node.
Structured response to a request emitted by a command node.
Borrowed account bindings used by one DialogueFlow integration.
Borrowed world and cross-domain callbacks used by all conversations in this facade.
std::string subject
Stable world subject used by state-backed conditions.
std::function< eve::Result< std::string >(const std::string &)> contentReader
Injected UTF-8 content reader used by loadDnutFileChecked.
std::function< eve::Result< std::unique_ptr< eve::transaction::ITransactionParticipant > >(const CommandRequest &)> CommandParticipantFactory
Factory for transaction participants that stage an operation or Action.
CommandRequestHandler operationHandler
Handler for requests whose kind is Operation.
CommandParticipantFactory commandParticipantFactory
Optional factory used to stage an atomic operation or Action.
std::function< eve::decision::ConditionResult(const eve::Value &)> conditionEvaluator
Optional custom condition evaluator; empty uses the shared adapter.
DialogueAccountBindings accounts
Borrowed authoritative money/reputation account adapters.
CommandRequestHandler gameplayActionHandler
Handler for requests whose kind is GameplayAction.
Immutable, parameterized and versioned compiled sequence.
Correlation metadata shared by a mutation transaction.
Definition StateAccess.h:57