载入中...
搜索中...
未找到
NpcAi.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Result.h"
7
8#include <cstdint>
9#include <deque>
10#include <functional>
11#include <map>
12#include <memory>
13#include <optional>
14#include <span>
15#include <string>
16#include <string_view>
17#include <variant>
18#include <vector>
19
20namespace eve::npc_ai {
21
22using BlackboardValue = std::variant<bool, std::int64_t, double, std::string>;
23
25enum class BlackboardType : std::uint8_t { Boolean, Integer, Number, String };
27enum class CompareOp : std::uint8_t { Exists, Equal, NotEqual, Less, LessEqual, Greater, GreaterEqual };
29enum class TaskStatus : std::uint8_t { Running, Succeeded, Failed };
46
49 std::string key;
51 bool required = false;
52 std::optional<BlackboardValue> defaultValue;
53};
54
57 std::string key;
59 std::optional<BlackboardValue> value;
60};
61
63struct TaskSpec {
64 std::string id;
65 std::string type;
66 std::string parametersJson = "{}";
67};
68
70struct Transition {
71 std::string targetState;
72 std::string signal;
73 std::vector<BlackboardPredicate> conditions;
74 std::uint32_t priority = 0;
75};
76
79 std::string id;
80 std::optional<std::string> parent;
81 std::vector<BlackboardPredicate> enterConditions;
82 std::vector<TaskSpec> tasks;
83 std::vector<Transition> transitions;
84};
85
88 std::string id;
89 std::uint32_t schemaVersion = 1;
90 std::string initialState;
91 std::vector<BlackboardKeySpec> blackboardSchema;
92 std::vector<StateDefinition> states;
93};
94
98
101 std::string subject;
102 std::string sense;
103 double confidence = 0.0;
104 std::uint64_t observedTick = 0;
105 std::uint64_t forgetAfterTicks = 1;
106 std::string payloadJson = "{}";
107};
108
111 std::uint64_t tick = 0;
114 std::string subject;
115 std::string detail;
116};
117
120 std::size_t traceCapacity = 2048;
121 std::size_t maxMemoriesPerAgent = 128;
122};
123
126 std::uint64_t simulationTick = 0;
127 double deltaSeconds = 0.0;
128 std::uint32_t maxAgents = 256;
129 std::uint32_t maxTransitionsPerAgent = 8;
130};
131
134 std::uint32_t agentsUpdated = 0;
135 std::uint32_t agentsDeferred = 0;
136 std::uint32_t transitionsApplied = 0;
137 std::uint32_t transitionBudgetsExhausted = 0;
138 std::uint32_t tasksTicked = 0;
139};
140
144 std::string behaviorId;
145 std::string activeState;
146 std::vector<std::string> activePath;
147 std::map<std::string, BlackboardValue> blackboard;
148 std::vector<PerceptionMemory> perception;
149 std::uint64_t lastTick = 0;
150};
151
154 std::string stateId;
155 std::string taskId;
156 bool completed = false;
157 std::string memoryJson = "{}";
158};
159
166 static constexpr std::string_view SchemaId = "evengine.npc-ai-agent";
167 static constexpr std::uint32_t SchemaVersion = 1;
168
169 std::string schemaId = std::string(SchemaId);
171 std::string behaviorId;
172 std::string activeState;
173 std::map<std::string, BlackboardValue> blackboard;
174 std::vector<std::string> pendingSignals;
175 std::vector<PerceptionMemory> perception;
176 std::vector<TaskArchive> tasks;
177 std::uint64_t lastTick = 0;
178};
179
183 std::string_view stateId;
184 std::uint64_t simulationTick = 0;
185 double deltaSeconds = 0.0;
186 const std::map<std::string, BlackboardValue>& blackboard;
187 std::span<const PerceptionMemory> perception;
188};
189
196public:
198 virtual ~ITaskService() = default;
200 [[nodiscard]] virtual Result<void> start(const TaskContext& context, const TaskSpec& spec,
201 std::string& inOutMemoryJson) = 0;
203 [[nodiscard]] virtual Result<TaskStatus> tick(const TaskContext& context, const TaskSpec& spec,
204 std::string& inOutMemoryJson) = 0;
206 virtual void stop(const TaskContext& context, const TaskSpec& spec, StopReason reason,
207 std::string_view memoryJson) noexcept = 0;
208};
209
217public:
219 explicit NpcAiWorld(NpcAiWorldConfig config = {});
220 NpcAiWorld(const NpcAiWorld&) = delete;
221 NpcAiWorld& operator=(const NpcAiWorld&) = delete;
222
224 [[nodiscard]] Result<void> registerBehavior(BehaviorDefinition definition);
226 [[nodiscard]] Result<void> registerTaskService(std::string type, std::unique_ptr<ITaskService> service);
228 [[nodiscard]] Result<AgentHandle> createAgent(std::string_view behaviorId);
230 [[nodiscard]] Result<void> destroyAgent(AgentHandle handle);
232 [[nodiscard]] Result<void> setBlackboard(AgentHandle handle, std::string key, BlackboardValue value);
234 [[nodiscard]] Result<void> signal(AgentHandle handle, std::string signalName);
236 [[nodiscard]] Result<void> remember(AgentHandle handle, PerceptionMemory memory);
238 [[nodiscard]] Result<void> forget(AgentHandle handle, std::string_view subject, std::string_view sense);
240 [[nodiscard]] Result<TickReport> tick(const TickContext& context);
242 [[nodiscard]] Result<AgentSnapshot> snapshot(AgentHandle handle) const;
244 [[nodiscard]] Result<AgentArchive> archive(AgentHandle handle) const;
246 [[nodiscard]] Result<AgentHandle> restoreAgent(const AgentArchive& archive);
248 [[nodiscard]] bool isStale(AgentHandle handle) const noexcept;
250 [[nodiscard]] Result<std::vector<TraceEvent>> trace(AgentHandle handle, std::uint64_t fromTick = 0) const;
252 [[nodiscard]] static Result<void> validate(const BehaviorDefinition& definition);
253
254private:
255 struct TaskRuntime {
256 bool started = false;
257 bool completed = false;
258 std::string memoryJson = "{}";
259 };
260 struct Agent {
261 std::string behaviorId;
262 std::string activeState;
263 std::map<std::string, BlackboardValue> blackboard;
264 std::vector<std::string> signals;
265 std::vector<PerceptionMemory> perception;
266 std::map<std::string, TaskRuntime> taskRuntime;
267 std::uint64_t lastTick = 0;
268 };
269 struct Slot {
270 std::uint32_t generation = 1;
271 std::optional<Agent> agent;
272 };
273
274 [[nodiscard]] Result<std::reference_wrapper<Agent>> resolve(AgentHandle handle);
275 [[nodiscard]] Result<std::reference_wrapper<const Agent>> resolve(AgentHandle handle) const;
276 [[nodiscard]] bool predicatesPass(std::span<const BlackboardPredicate> predicates, const Agent& agent) const;
277 [[nodiscard]] std::optional<std::reference_wrapper<const StateDefinition>> findState(
278 const BehaviorDefinition& behavior, std::string_view id) const;
279 [[nodiscard]] std::vector<std::reference_wrapper<const StateDefinition>> activePath(
280 const BehaviorDefinition& behavior, std::string_view leaf) const;
281 [[nodiscard]] static std::string taskRuntimeKey(std::string_view state, std::string_view task);
282 void stopStateTasks(AgentHandle handle, Agent& agent, const StateDefinition& state, StopReason reason) noexcept;
283 void pushTrace(TraceEvent event);
284
285 NpcAiWorldConfig config_;
286 std::map<std::string, BehaviorDefinition> behaviors_;
287 std::map<std::string, std::unique_ptr<ITaskService>> taskServices_;
288 std::vector<Slot> slots_;
289 std::vector<std::uint32_t> freeSlots_;
290 std::uint32_t scheduleCursor_ = 0;
291 std::deque<TraceEvent> trace_;
292};
293
294} // namespace eve::npc_ai
double value
Trace trace
Definition Agent.cpp:49
int subject
Definition AnimSmr.cpp:163
void * service
#define EVENGINE_API_PLATFORM
Definition Export.h:107
std::uint32_t key
vk::UniqueDeviceMemory memory
std::uint32_t generation
PrimitiveHandle handle
Move-only, checked operation results for the common layer.
Strong generation-qualified handles for non-ECS runtime registries.
LogicalId definition
SimulationTick tick
const VegetationPresetContext & context
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Owned extension point for navigation, animation, combat and gameplay tasks. @thread All calls are sim...
Definition NpcAi.h:195
virtual Result< TaskStatus > tick(const TaskContext &context, const TaskSpec &spec, std::string &inOutMemoryJson)=0
Tick.
virtual Result< void > start(const TaskContext &context, const TaskSpec &spec, std::string &inOutMemoryJson)=0
Starts .
virtual void stop(const TaskContext &context, const TaskSpec &spec, StopReason reason, std::string_view memoryJson) noexcept=0
Stops .
virtual ~ITaskService()=default
Releases ITaskService resources.
Authoritative owner and deterministic scheduler for NPC AI agents.
Definition NpcAi.h:216
NpcAiWorld & operator=(const NpcAiWorld &)=delete
NpcAiWorld(const NpcAiWorld &)=delete
TraceKind
TraceKind public API.
Definition NpcAi.h:33
TaskStatus
TaskStatus public API.
Definition NpcAi.h:29
std::variant< bool, std::int64_t, double, std::string > BlackboardValue
Definition NpcAi.h:22
BlackboardType
BlackboardType public API.
Definition NpcAi.h:25
StopReason
StopReason public API.
Definition NpcAi.h:31
CompareOp
CompareOp public API.
Definition NpcAi.h:27
Versioned, owning NPC state used for save/load and hot-reload handoff.
Definition NpcAi.h:165
std::map< std::string, BlackboardValue > blackboard
Definition NpcAi.h:173
std::string behaviorId
Definition NpcAi.h:171
static constexpr std::uint32_t SchemaVersion
Definition NpcAi.h:167
std::string activeState
Definition NpcAi.h:172
static constexpr std::string_view SchemaId
Definition NpcAi.h:166
std::vector< TaskArchive > tasks
Definition NpcAi.h:176
std::vector< std::string > pendingSignals
Definition NpcAi.h:174
std::vector< PerceptionMemory > perception
Definition NpcAi.h:175
std::string schemaId
Definition NpcAi.h:169
std::uint32_t schemaVersion
Definition NpcAi.h:170
std::uint64_t lastTick
Definition NpcAi.h:177
AgentHandleTag public API.
Definition NpcAi.h:96
AgentSnapshot public API.
Definition NpcAi.h:142
std::map< std::string, BlackboardValue > blackboard
Definition NpcAi.h:147
std::uint64_t lastTick
Definition NpcAi.h:149
std::string behaviorId
Definition NpcAi.h:144
std::vector< PerceptionMemory > perception
Definition NpcAi.h:148
std::string activeState
Definition NpcAi.h:145
std::vector< std::string > activePath
Definition NpcAi.h:146
Immutable, validated source data for one hierarchical NPC state tree.
Definition NpcAi.h:87
std::vector< StateDefinition > states
Definition NpcAi.h:92
std::uint32_t schemaVersion
Definition NpcAi.h:89
std::vector< BlackboardKeySpec > blackboardSchema
Definition NpcAi.h:91
BlackboardKeySpec public API.
Definition NpcAi.h:48
std::optional< BlackboardValue > defaultValue
Definition NpcAi.h:52
BlackboardPredicate public API.
Definition NpcAi.h:56
std::optional< BlackboardValue > value
Definition NpcAi.h:59
NpcAiWorldConfig public API.
Definition NpcAi.h:119
std::size_t maxMemoriesPerAgent
Definition NpcAi.h:121
One bounded, expiring item of NPC perception memory.
Definition NpcAi.h:100
std::uint64_t forgetAfterTicks
Definition NpcAi.h:105
std::uint64_t observedTick
Definition NpcAi.h:104
StateDefinition public API.
Definition NpcAi.h:78
std::optional< std::string > parent
Definition NpcAi.h:80
std::vector< TaskSpec > tasks
Definition NpcAi.h:82
std::vector< Transition > transitions
Definition NpcAi.h:83
std::vector< BlackboardPredicate > enterConditions
Definition NpcAi.h:81
Portable task state stored inside an NPC archive.
Definition NpcAi.h:153
std::string taskId
Definition NpcAi.h:155
std::string stateId
Definition NpcAi.h:154
std::string memoryJson
Definition NpcAi.h:157
TaskContext public API.
Definition NpcAi.h:181
std::span< const PerceptionMemory > perception
Definition NpcAi.h:187
std::uint64_t simulationTick
Definition NpcAi.h:184
AgentHandle agent
Definition NpcAi.h:182
const std::map< std::string, BlackboardValue > & blackboard
Definition NpcAi.h:186
std::string_view stateId
Definition NpcAi.h:183
TaskSpec public API.
Definition NpcAi.h:63
std::string type
Definition NpcAi.h:65
std::string parametersJson
Definition NpcAi.h:66
std::string id
Definition NpcAi.h:64
Input time and work limits for one deterministic simulation update.
Definition NpcAi.h:125
std::uint32_t maxAgents
Definition NpcAi.h:128
std::uint32_t maxTransitionsPerAgent
Definition NpcAi.h:129
std::uint64_t simulationTick
Definition NpcAi.h:126
TickReport public API.
Definition NpcAi.h:133
std::uint32_t transitionsApplied
Definition NpcAi.h:136
std::uint32_t agentsUpdated
Definition NpcAi.h:134
std::uint32_t transitionBudgetsExhausted
Definition NpcAi.h:137
std::uint32_t tasksTicked
Definition NpcAi.h:138
std::uint32_t agentsDeferred
Definition NpcAi.h:135
TraceEvent public API.
Definition NpcAi.h:110
std::uint64_t tick
Definition NpcAi.h:111
AgentHandle agent
Definition NpcAi.h:112
std::string detail
Definition NpcAi.h:115
std::string subject
Definition NpcAi.h:114
Transition public API.
Definition NpcAi.h:70
std::vector< BlackboardPredicate > conditions
Definition NpcAi.h:73
std::string targetState
Definition NpcAi.h:71
std::uint32_t priority
Definition NpcAi.h:74
std::string signal
Definition NpcAi.h:72
bool started
Definition Graphics.cpp:183