载入中...
搜索中...
未找到
CombatCarrier.cpp
浏览该文件的文档.
43 const double dot = std::clamp(current.x * desired.x + current.y * desired.y + current.z * desired.z, -1.0, 1.0);
45 if (angle <= maxRadians || angle <= 1e-12) return {desired.x * speed, desired.y * speed, desired.z * speed};
47 ProjectileVector blended{current.x + (desired.x - current.x) * alpha, current.y + (desired.y - current.y) * alpha,
66ProjectileVector rotateAroundAxis(ProjectileVector vector, ProjectileVector axis, double radians) {
98 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Volley count must be positive", "count"));
100 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Volley count must be <= 256", "count"));
103 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Fan volley spreadDegrees must be finite and non-negative", "spreadDegrees"));
114 Diagnostic::error(DiagnosticCode::InvalidArgument, "Volley base direction must be non-zero", "direction"));
129 const double radians = (2.0 * kPi * static_cast<double>(i)) / static_cast<double>(volley.count);
146 if (!id.isValid()) return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier recipe id must not be empty", "id"));
148 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier lifetime must be positive", "lifetime"));
150 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier speed must be finite and positive", "speed"));
152 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier recipe requires at least one motion op", "motionOps"));
161 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Homing turn rate must be finite and positive", path + ".maxTurnRateDegrees"));
165 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Body-avoid look-ahead must be finite and positive", path + ".avoidLookAhead"));
167 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Body-avoid strength must be finite and non-negative", path + ".avoidStrength"));
169 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Body-avoid radius padding must be finite and non-negative", path + ".avoidRadiusPadding"));
171 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Body-avoid turn rate must be finite and positive", path + ".maxTurnRateDegrees"));
175 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Gravity must be finite and non-negative", path + ".gravity"));
179 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Acceleration must be finite and non-negative", path + ".acceleration"));
184 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Curve amplitude must be finite and non-negative", path + ".curveAmplitude"));
186 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Curve frequency must be finite and positive", path + ".curveFrequencyHz"));
194 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier recipe must include IntegrateLinear so position advances", "motionOps"));
197 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier recipe requires at least one trigger", "triggers"));
205 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Fuse trigger requires positive fuse", path + ".fuse"));
209 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Interval trigger requires positive interval", path + ".interval"));
213 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Proximity trigger requires positive radius", path + ".proximityRadius"));
225 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Impact damage must be finite and non-negative", path + ".damage"));
227 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Splash radius must be finite and non-negative", path + ".splashRadius"));
229 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Bounce restitution must be finite and non-negative", path + ".restitution"));
231 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Pierce/bounce budgets must be non-negative", path));
233 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "SpawnChild requires childRecipeId", path + ".childRecipeId"));
235 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Splash impact requires positive splashRadius", path + ".splashRadius"));
240Result<CarrierRecipe> carrierRecipeFromProjectile(const ProjectileDefinition& definition, double damage) {
282 return Result<void>::failure(Diagnostic::error(DiagnosticCode::Conflict, "Carrier pool cannot be resized while active", {}));
284 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier pool capacity must be in 1..1048576", "capacity"));
289Result<CombatCarrierRuntime::LiveRecipe> CombatCarrierRuntime::prepareRecipe(const CarrierRecipe& recipe) {
338 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier transform must contain finite values", "request"));
340 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier direction must be non-zero", "direction"));
350 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Homing/proximity carrier requires a target handle", "target"));
376 state.motion.velocity = {dir.x * live.recipe.speed, dir.y * live.recipe.speed, dir.z * live.recipe.speed};
385Result<CarrierHandle> CombatCarrierRuntime::spawn(const LogicalId& recipeId, const CarrierSpawnRequest& request) {
393Result<CarrierHandle> CombatCarrierRuntime::spawn(const CarrierRecipe& recipe, const CarrierSpawnRequest& request) {
406 Diagnostic::error(DiagnosticCode::Conflict, "Carrier pool cannot fit the full volley", "capacity"));
440 Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier update delta must be >= 0", "delta"));
441 if (delta.isZero()) return Result<CarrierFrame>::success({}, Status::success(StatusCode::NoOp));
472 DiagnosticCode::Unsupported, "Homing/proximity carrier update requires a target provider", "targets"));
475 Diagnostic::error(DiagnosticCode::Unsupported, "OnHit carrier update requires a hit probe", "hits"));
614 Diagnostic::error(DiagnosticCode::Failed, "Carrier motion produced non-finite values", "motion"));
817 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "Carrier handle slot is out of range", "handle"));
820 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "Carrier handle is stale", "handle"));
851 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier snapshot capacity must be in 1..1048576", "slots"));
858 if (slot.state->handle.slot >= snapshot.slots.size() || slot.state->handle.generation != slot.generation)
859 return Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "Carrier snapshot state handle does not match slot metadata", "slots"));
861 return Result<void>::failure(Diagnostic::error(DiagnosticCode::NotFound, "Carrier snapshot references an unregistered recipe", "recipeId"));
Composable combat-carrier runtime: motion ops, triggers, and impacts.
Stable, structured diagnostics shared by engine modules.
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Result< Duration > tryAdd(Duration other) const
Add two durations with overflow validation.
Definition Time.cpp:30
double seconds() const noexcept
Return this duration as seconds for legacy/presentation APIs.
Definition Time.cpp:28
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
Result< void > configurePool(std::uint32_t capacity)
Resize the pool while empty; capacity must be in 1..1048576.
Definition CombatCarrier.cpp:280
Result< std::vector< CarrierHandle > > spawnVolley(const LogicalId &recipeId, const CarrierSpawnRequest &request, const CarrierVolleySpec &volley)
Spawn multiple carriers in deterministic Fan/Ring directions.
Definition CombatCarrier.cpp:399
std::optional< CarrierRecipe > findRecipe(const LogicalId &id) const
Look up a previously registered recipe by id.
Definition CombatCarrier.cpp:326
Result< CarrierFrame > update(Duration delta, const IProjectileTargetProvider *targets=nullptr, const ICarrierHitProbe *hits=nullptr, const ICarrierBodyDefenseProvider *bodies=nullptr)
Atomically advance all live carriers by supplied deterministic time.
Definition CombatCarrier.cpp:434
Result< CarrierHandle > spawn(const LogicalId &recipeId, const CarrierSpawnRequest &request)
Spawn one carrier from a registered recipe id.
Definition CombatCarrier.cpp:385
Result< void > registerRecipe(const CarrierRecipe &recipe)
Register or replace a recipe by id. @ownership Runtime copies the recipe; callers may discard their i...
Definition CombatCarrier.cpp:312
Optional body/shield boundary for SteerAvoidBody.
Definition CombatCarrier.h:263
virtual Result< std::vector< CarrierBodyDefenseSample > > sample(CarrierHandle handle, ecs::EntityHandle target, const CarrierMotion &motion) const =0
Sample body/shield volumes relevant to one carrier step.
Optional swept-hit boundary used only by OnHit triggers.
Definition CombatCarrier.h:222
virtual Result< std::vector< Contact > > query(CarrierHandle handle, const CarrierMotion &previous, const CarrierMotion ¤t) const =0
Query contacts for one candidate step.
Optional target-position boundary used only by homing projectiles.
Definition ProjectileRuntime.h:102
virtual Result< ProjectilePoint > position(ecs::EntityHandle target) const =0
Resolve one generation-checked target to an owning simulation-space position.
std::vector< double > forward(const Policy &p, const Observation &o)
Forward.
Definition Learning.h:65
WidgetDesc child(std::string id, std::vector< WidgetDesc > children, float width, float height)
Scrollable child region with an explicit size.
Definition Widget.cpp:635
载具模块入口(eve.Vehicle):定义注册 / 实体工厂 / RTS 命令 / 帧调度。 设计文档:docs/dev/通用载具系统设计.md
Definition RTSArchetype.h:10
@ SpawnChild
@ Ballistic
@ ApplyGravity
@ SteerHoming
@ CurveHelix
@ IntegrateLinear
@ CurveSway
@ Accelerate
@ SteerAvoidBody
Result< CarrierRecipe > carrierRecipeFromProjectile(const ProjectileDefinition &definition, double damage)
Build a default recipe matching a classic ProjectileDefinition mode.
Definition CombatCarrier.cpp:240
@ OnProximity
@ OnInterval
@ InvalidArgument
@ NotFound
@ Unsupported
@ Failed
@ StaleHandle
@ Conflict
@ NoOp
Generation-qualified reference to one pooled carrier slot.
Definition CombatCarrier.h:120
Data-driven composition recipe for one carrier family.
Definition CombatCarrier.h:107
std::vector< CarrierTrigger > triggers
Definition CombatCarrier.h:112
Result< void > validate() const
Validate finite parameters and composition constraints.
Definition CombatCarrier.cpp:145
std::vector< CarrierMotionOp > motionOps
Definition CombatCarrier.h:111
std::vector< CarrierImpact > impacts
Definition CombatCarrier.h:113
Complete deterministic carrier-pool state for rollback/save.
Definition CombatCarrier.h:211
std::vector< CarrierSlotSnapshot > slots
Definition CombatCarrier.h:212
Owning observable state for one live carrier.
Definition CombatCarrier.h:161
Deterministic multi-direction spawn descriptor.
Definition CombatCarrier.h:148
Data-driven trajectory and lifetime definition.
Definition ProjectileRuntime.h:51
Owning velocity or direction vector in projectile simulation space.
Definition ProjectileRuntime.h:32