载入中...
搜索中...
未找到
CombatCharacter.cpp
浏览该文件的文档.
12bool finite3(CombatVector3 value) { return std::isfinite(value.x) && std::isfinite(value.y) && std::isfinite(value.z); }
22CombatVector3 scaleXZ(CombatVector3 value, double scale) { return {value.x * scale, 0.0, value.z * scale}; }
32 !std::isfinite(acceleration) || acceleration <= 0.0 || !std::isfinite(jumpSpeed) || jumpSpeed < 0.0 ||
34 !std::isfinite(dodgeDuration) || dodgeDuration <= 0.0 || !std::isfinite(capsuleRadius) || capsuleRadius <= 0.0)
36 Diagnostic::error(DiagnosticCode::InvalidArgument, "character movement limits are invalid", "movement"));
70 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
78 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
82Result<void> CombatCharacterRuntime::setMoveIntent(SubjectRef subject, CombatVector3 direction, double speedFraction) {
86 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
87 if (found->second.mode == CombatCharacterMode::Dead || found->second.mode == CombatCharacterMode::Stunned)
89 if (!finite2(direction.x, direction.z) || !std::isfinite(speedFraction) || speedFraction < 0.0 ||
103 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
114 if (state.mode == CombatCharacterMode::Airborne || state.mode == CombatCharacterMode::Attacking) {
115 if (state.airJumpsUsed >= state.maxAirJumps) return Result<void>::success(Status::success(StatusCode::NoOp));
124Result<void> CombatCharacterRuntime::dodge(SubjectRef subject, std::optional<CombatVector3> direction) {
128 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
154 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
174 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
175 if (found->second.mode == CombatCharacterMode::Dead || found->second.mode == CombatCharacterMode::Stunned ||
187 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
190 found->second.mode = found->second.position.y > 0.0 ? CombatCharacterMode::Airborne : CombatCharacterMode::Grounded;
199 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
217 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
230Result<void> CombatCharacterRuntime::applyDamageReaction(SubjectRef subject, HitReaction reaction,
233 if (reaction == HitReaction::Flinch || reaction == HitReaction::Stagger || reaction == HitReaction::Knockdown) {
246 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
256Result<void> CombatCharacterRuntime::setRootMotionDelta(SubjectRef subject, CombatVector3 delta) {
260 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
271 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
285 Diagnostic::error(DiagnosticCode::NotFound, "character subject was not found", subject.format()));
293 Diagnostic::error(DiagnosticCode::InvalidArgument, "character tick must be non-decreasing", "tick"));
328 state.mode = state.position.y > ground ? CombatCharacterMode::Airborne : CombatCharacterMode::Grounded;
337 unconstrained = {state.position.x + state.rootMotionDelta->x, state.position.y + state.rootMotionDelta->y,
345 CombatVector3 desired = {state.moveDirection.x * targetSpeed, 0.0, state.moveDirection.z * targetSpeed};
373 if (state.mode == CombatCharacterMode::Airborne || state.mode == CombatCharacterMode::Attacking ||
403 return Result<CombatCharacterAdvance>::success(std::move(advance), Status::success(StatusCode::Applied));
3D action-combat character controller.
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
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
bool isValid() const noexcept
Return whether this reference is valid and non-nil.
Definition SubjectRef.h:38
Result< void > applyStun(SubjectRef subject, Duration duration)
Apply a stun that blocks jump/dodge/attack for the supplied duration.
Definition CombatCharacter.cpp:195
Result< void > applyDamageReaction(SubjectRef subject, HitReaction reaction, Duration stunDuration, Impulse3 knockback)
Apply death/stun and knockback from one damage outcome.
Definition CombatCharacter.cpp:230
Result< void > setFacing(SubjectRef subject, CombatVector3 facing)
Replace planar facing from a finite XZ vector; Y is ignored.
Definition CombatCharacter.cpp:267
Result< void > setTimeFrozen(SubjectRef subject, bool frozen)
Pause integration for hitstop while retaining the committed pose.
Definition CombatCharacter.cpp:281
Result< void > kill(SubjectRef subject)
Mark the character dead; further locomotion intents become NoOp.
Definition CombatCharacter.cpp:242
Result< void > setRootMotionDelta(SubjectRef subject, CombatVector3 delta)
Queue one frame of authored root-motion delta consumed by the next advance.
Definition CombatCharacter.cpp:256
Result< CombatCharacterAdvance > advance(const SimulationStep &step)
Atomically advance every character using only the supplied deterministic step.
Definition CombatCharacter.cpp:290
std::vector< CombatCharacterState > states() const
Return owning states in stable subject-id order.
Definition CombatCharacter.cpp:406
Result< void > endAttack(SubjectRef subject)
Leave attacking mode when recover completes.
Definition CombatCharacter.cpp:183
Result< CombatCharacterState > state(SubjectRef subject) const
Return an owning state snapshot, or NotFound for a stale subject.
Definition CombatCharacter.cpp:74
Result< void > setMoveIntent(SubjectRef subject, CombatVector3 direction, double speedFraction)
Set normalized planar movement intent.
Definition CombatCharacter.cpp:82
Result< void > beginAttack(SubjectRef subject)
Enter attacking mode; root motion may replace horizontal intent.
Definition CombatCharacter.cpp:170
Result< void > dodge(SubjectRef subject, std::optional< CombatVector3 > direction=std::nullopt)
Begin a dodge that grants invulnerability for dodgeDuration.
Definition CombatCharacter.cpp:124
Result< void > unregisterSubject(SubjectRef subject)
Remove one character; missing subjects are rejected.
Definition CombatCharacter.cpp:65
Result< void > registerSubject(CombatCharacterDefinition definition)
Register one unique character from validated owning definition data.
Definition CombatCharacter.cpp:40
Result< void > applyImpulse(SubjectRef subject, CombatVector3 impulse)
Add an instantaneous velocity impulse (knockback / launch).
Definition CombatCharacter.cpp:213
Result< void > jump(SubjectRef subject)
Request a jump or air jump when the current mode allows it.
Definition CombatCharacter.cpp:99
Result< void > dodgeRelative(SubjectRef subject, CombatVector3 lockTarget, CombatDodgeRelative relative)
Dodge relative to a lock-on target on the XZ plane.
Definition CombatCharacter.cpp:149
virtual Result< double > sampleHeight(double x, double z) const =0
Return finite ground height at the supplied world XZ.
virtual Result< CombatVector3 > resolve(const CombatVector3 &from, const CombatVector3 &to, double radius) const =0
Resolve a candidate translation for one capsule.
constexpr std::uint64_t value() const noexcept
Returns the underlying value at an explicit protocol boundary.
Definition StrongUint64.h:26
Definition ActionDamageSink.cpp:9
CombatCharacterMode
High-level locomotion mode owned by the character controller.
Definition CombatCharacter.h:27
@ Attacking
@ ModeChanged
@ Flinch
@ Stagger
@ Knockdown
@ InvalidArgument
@ NotFound
@ AlreadyExists
@ NoOp
@ Applied
Complete owning result of one character advance.
Definition CombatCharacter.h:88
Immutable registration for one action-combat character.
Definition CombatCharacter.h:33
double dodgeDuration
Definition CombatCharacter.h:42
double capsuleRadius
Definition CombatCharacter.h:44
CombatVector3 initialPosition
Definition CombatCharacter.h:36
double maximumSpeed
Definition CombatCharacter.h:37
Result< void > validate() const
Validate identity and finite positive movement limits.
Definition CombatCharacter.cpp:26
double acceleration
Definition CombatCharacter.h:38
Owning read-only projection of one character.
Definition CombatCharacter.h:51
Renderer/physics-neutral knockback impulse authored in world units.
Definition Damage.h:19