载入中...
搜索中...
未找到
Tactics.cpp
浏览该文件的文档.
75 DiagnosticCode::InvalidArgument, "objective cells JSON must be a non-empty array", "cellsJson"));
117 DiagnosticCode::InvalidArgument, "reaction candidates JSON must be an array", "candidatesJson"));
125 Diagnostic::error(DiagnosticCode::InvalidArgument, "reaction candidate must be an object", element));
132 if (reactorText == nullptr || !reactorText->isString() || actionText == nullptr || !actionText->isString())
134 DiagnosticCode::InvalidArgument, "reaction candidate requires string reactor and action", element));
173 Diagnostic::error(DiagnosticCode::InvalidArgument, "tactics battle proxy must not be null", "battle"));
177 Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle session handle is stale", "battle"));
193 return Value(Value::Object{{"layer", Value(cell.layer)}, {"x", Value(cell.x)}, {"y", Value(cell.y)}});
205 return Value(Value::Object{{"action", Value(intent.action.isValid() ? intent.action.format() : std::string{})},
228 cells.push_back(Value(Value::Object{{"cell", bindingCellValue(entry.cell)}, {"cost", Value(entry.cost)}}));
277 {"targetUnit", Value(command.targetUnit.isValid() ? command.targetUnit.format() : std::string{})},
297 Diagnostic::error(DiagnosticCode::InvalidArgument, "edge spec JSON must be an object", "edge"));
306 Diagnostic::error(DiagnosticCode::InvalidArgument, "edge passable must be a boolean", "edge.passable"));
316 Diagnostic::error(DiagnosticCode::InvalidArgument, "edge extraCost is out of range", "edge.extraCost"));
342 Diagnostic::error(DiagnosticCode::StaleHandle, "Tactics module is no longer loaded", "battle"));
346 return Result<std::string>::success(subject.value().format(), Status::success(StatusCode::Applied));
374 Diagnostic::error(DiagnosticCode::NotFound, "tactics side is not part of this script battle", "side"));
378 Diagnostic::error(DiagnosticCode::StaleHandle, "Tactics module is no longer loaded", "battle"));
379 auto created = module->newUnit(session.value()->battle, *side, subject.value(), definition.value(),
383 return Result<std::string>::success(subject.value().format(), Status::success(StatusCode::Applied));
393 Diagnostic::error(DiagnosticCode::StaleHandle, "Tactics module is no longer loaded", "battle"));
413 return Value(Value::Object{{"layer", Value(cell.layer)}, {"x", Value(cell.x)}, {"y", Value(cell.y)}});
442 if (found == object->end() || found->second.isNull()) return Result<std::string>::success(std::string{});
453 return static_cast<std::size_t>(std::count_if(handles.begin(), handles.end(), [](const auto& handle) {
461 if (auto* entity = dynamic_cast<T*>(ecs::try_get(handle)); entity != nullptr) entity->release();
504 if (battle != nullptr && battle->identity()->subject.isValid()) result.push_back(battle->identity()->subject);
507 [](const SubjectRef& left, const SubjectRef& right) { return left.format() < right.format(); });
516 Diagnostic::error(DiagnosticCode::NotFound, "tactics gameplay instance was not found", "instance"));
518 const bool ownsParticipant = std::any_of(battle->turn()->units.begin(), battle->turn()->units.end(),
525 DiagnosticCode::PreconditionViolation, "session controls no participant in this tactics battle",
567 Diagnostic::error(DiagnosticCode::NotFound, "tactics gameplay instance was not found", "instance"));
570 DiagnosticCode::PreconditionViolation, "session does not control the requested subject", "subject"));
579 Value moveSchema(Value::Object{{"layer", integerSchema}, {"x", integerSchema}, {"y", integerSchema}});
600Result<GameplayCommandReceipt> Tactics::submitGameplay(const GameplaySession& session, SubjectRef instance,
605 Diagnostic::error(DiagnosticCode::NotFound, "tactics gameplay instance was not found", "instance"));
608 Diagnostic::error(DiagnosticCode::InvalidArgument, "command id must not be empty", "command.id"));
611 DiagnosticCode::PreconditionViolation, "session does not control the command subject", "command.subject"));
615 DiagnosticCode::Conflict, "gameplay command was based on a stale observation", "command.expectedRevision"));
625 auto moved = BattleSystem::moveUnit(*battle, command.subject, {x.value(), y.value(), layer.value()},
634 auto faced = BattleSystem::faceUnit(*battle, command.subject, facing.value(), battle->turn()->tick);
671 Diagnostic::error(DiagnosticCode::Unsupported, "unsupported tactics gameplay action", "command.action"));
682 return Result<GameplayCommandReceipt>::success(std::move(receipt), Status::success(StatusCode::Applied));
685Result<GameplayObservation> Tactics::advanceGameplay(const GameplaySession& session, SubjectRef instance,
690 Diagnostic::error(DiagnosticCode::NotFound, "tactics gameplay instance was not found", "instance"));
697Result<std::vector<GameplayEvent>> Tactics::gameplayEvents(const GameplaySession& session, SubjectRef instance,
740 return Result<ecs::EntityHandle>::success(battle->identity()->self, Status::success(StatusCode::Applied));
750 Diagnostic::error(DiagnosticCode::InvalidArgument, "tactics side requires a valid SubjectRef", "subject"));
761 return Result<ecs::EntityHandle>::success(side->identity()->self, Status::success(StatusCode::Applied));
764Result<ecs::EntityHandle> Tactics::newUnit(ecs::EntityHandle battleHandle, ecs::EntityHandle sideHandle,
776 Diagnostic::error(DiagnosticCode::InvalidArgument, "tactics unit requires a valid SubjectRef", "subject"));
793 auto registered = BattleSystem::addUnit(*battle, unit->identity()->self, sideHandle, cellValue);
800 return Result<ecs::EntityHandle>::success(unit->identity()->self, Status::success(StatusCode::Applied));
806 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
808 return Result<void>::failure(Diagnostic::error(DiagnosticCode::PreconditionViolation, "tactics cells can only be added during setup", "battle.status"));
811 return Result<void>::failure(Diagnostic::error(DiagnosticCode::PreconditionViolation, "tactics battle revision is exhausted", "battle.revision"));
821 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
823 return Result<void>::failure(Diagnostic::error(DiagnosticCode::PreconditionViolation, "tactics topology can only change during setup", "battle.status"));
832 Diagnostic::error(DiagnosticCode::Conflict, "choose topology before declaring edges", "topology"));
835 return Result<void>::failure(Diagnostic::error(DiagnosticCode::PreconditionViolation, "tactics battle revision is exhausted", "battle.revision"));
844 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
848Result<BattlePhase> Tactics::advance(ecs::EntityHandle battleHandle, const SimulationStep& step) {
859 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
863Result<AbilityReceipt> Tactics::useAbility(ecs::EntityHandle battleHandle, SubjectRef actor, const LogicalId& action,
869 return BattleSystem::useAbility(*battle, actor, action, targetCell, targetUnit, std::move(payload));
882Result<MoveReceipt> Tactics::moveUnit(ecs::EntityHandle battleHandle, SubjectRef actor, Cell destination) {
893 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
900 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
907 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
911Result<std::size_t> Tactics::openReaction(ecs::EntityHandle battleHandle, std::uint64_t triggerSequence,
920Result<ReactionReceipt> Tactics::acceptReaction(ecs::EntityHandle battleHandle, SubjectRef reactor,
932 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
939 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
946 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
983Result<MoveReceipt> Tactics::previewMove(ecs::EntityHandle battleHandle, SubjectRef actor, Cell destination) {
991Result<void> Tactics::previewFace(ecs::EntityHandle battleHandle, SubjectRef actor, int facing) {
994 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1001 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1005Result<Reachability> Tactics::reachable(ecs::EntityHandle battleHandle, SubjectRef subject, int budget) {
1009 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1013Result<std::vector<Cell>> Tactics::cellsInRange(ecs::EntityHandle battleHandle, Cell origin, int minimum, int maximum,
1018 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1022Result<void> Tactics::addEdge(ecs::EntityHandle battleHandle, Cell from, Cell to, EdgeState state) {
1025 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1027 return Result<void>::failure(Diagnostic::error(DiagnosticCode::PreconditionViolation, "tactics edges can only be added during setup", "battle.status"));
1030 return Result<void>::failure(Diagnostic::error(DiagnosticCode::PreconditionViolation, "tactics battle revision is exhausted", "battle.revision"));
1041 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1055 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1059Result<TacticalUnit::TurnResources> Tactics::unitResources(ecs::EntityHandle battleHandle, SubjectRef unit) {
1063 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1067 Diagnostic::error(DiagnosticCode::NotFound, "tactics unit is not owned by this facade", "unit"));
1075 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1078 Diagnostic::error(DiagnosticCode::NotFound, "tactics battle has no active unit", "battle.activeUnit"));
1082 Diagnostic::error(DiagnosticCode::StaleHandle, "tactics active unit is stale", "battle.activeUnit"));
1091 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1095Result<void> Tactics::restore(ecs::EntityHandle battleHandle, const SnapshotEnvelope& snapshotValue,
1099 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1103Result<std::vector<BattleCommand>> Tactics::commandsFrom(ecs::EntityHandle battleHandle, Revision revision) {
1107 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1108 return Result<std::vector<BattleCommand>>::success(BattleReplay::commandsFrom(*battle, revision));
1111Result<void> Tactics::replay(ecs::EntityHandle battleHandle, std::span<const BattleCommand> commands) {
1114 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1122 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1133 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1142Result<std::string> Tactics::commandLogJson(ecs::EntityHandle battleHandle, Revision revision) {
1146 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1155 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1160 auto parsed = TacticsPersistence::parseCommandLog(parsedValue.value(), battle->turn()->revision);
1165std::string_view Tactics::snapshotHashAlgorithm() const noexcept { return activeSnapshotHashAlgorithm(); }
1167Result<std::vector<Cell>> Tactics::visibleCellsInRange(ecs::EntityHandle battleHandle, Cell origin, int minimum,
1172 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1176 const ILineOfSightPolicy& policy = registered != nullptr ? *registered : *gridLineOfSightPolicy();
1179 return eve::tactics::visibleCellsInRange(battle->board()->value, policy, origin, minimum, maximum, metric);
1182Result<InteractionContext> Tactics::interactionContext(ecs::EntityHandle battleHandle, SubjectRef controlledUnit) {
1186 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1189 DiagnosticCode::InvalidArgument, "interaction context requires a controlled unit", "controlledUnit"));
1193 Diagnostic::error(DiagnosticCode::NotFound, "controlled unit is not in this battle", "controlledUnit"));
1207 auto reachable = PathQuery::reachable(battle->board()->value, controlledUnit, unit->turn()->movePoints);
1209 for (const ReachableCell& entry : reachable.value().cells()) context.reachableCells.push_back(entry.cell);
1232Result<std::vector<PresentationCommand>> Tactics::presentationIntents(ecs::EntityHandle battleHandle,
1238 DiagnosticCode::StaleHandle, "tactics battle is stale or not owned by this facade", "battle"));
1250 Diagnostic::error(DiagnosticCode::StaleHandle, "tactics battle contains a stale unit", "battle.units"));
1298script::Borrowed<TacticsBattleSession> Tactics::resolve(TacticsBattleSessionRef reference) noexcept {
1306 return Result<void>::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "Tactics module is no longer loaded", "battle"));
1321 const auto found = std::find_if(battles_.begin(), battles_.end(), [&](const ecs::EntityHandle& handle) {
1328bool Tactics::owns(const std::vector<ecs::EntityHandle>& handles, const ecs::EntityHandle& handle) const noexcept {
1329 return std::any_of(handles.begin(), handles.end(), [&](const auto& value) { return sameHandle(value, handle); }) &&
1340 std::function<ScriptTacticsInteraction*()>([]() -> ScriptTacticsInteraction* { return nullptr; }), false);
1379 interaction.addFunc("armAbility", [vm](ScriptTacticsInteraction* value, const std::string& actionText,
1420 "TacticsBattle", std::function<ScriptTacticsBattle*()>([]() -> ScriptTacticsBattle* { return nullptr; }),
1432 vm, Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "tactics battle proxy must not be null", "battle")));
1435 battle.addFunc("addCell", [vm](ScriptTacticsBattle* value, int x, int y, int layer, int moveCost) {
1437 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1455 vm, Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "unknown tactics board topology", "topology")));
1457 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1470 scriptAddUnit(value, subject, side, definition, x, y, layer, actionPoints, movePoints, reactionPoints,
1474 battle.addFunc("addEliminateObjective", [vm](ScriptTacticsBattle* value, const std::string& idText,
1481 if (!beneficiary) return script::projectResult(vm, Result<void>::failure(beneficiary.status()));
1490 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1494 battle.addFunc("addSurviveObjective", [vm](ScriptTacticsBattle* value, const std::string& idText,
1500 if (!beneficiary) return script::projectResult(vm, Result<void>::failure(beneficiary.status()));
1503 vm, Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "required round must be positive", "requiredRound")));
1511 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1515 battle.addFunc("addOccupyObjectiveJson", [vm](ScriptTacticsBattle* value, const std::string& idText,
1522 if (!beneficiary) return script::projectResult(vm, Result<void>::failure(beneficiary.status()));
1531 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1546 vm, Result<void>::failure(Diagnostic::error(DiagnosticCode::InvalidArgument, "unknown tactics turn policy '" + policy + "'; registered: " + registered, "policy")));
1549 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1559 battle.addFunc("advance", [vm](ScriptTacticsBattle* value, std::int64_t tick, std::int64_t deltaNanoseconds) {
1564 Diagnostic::error(DiagnosticCode::InvalidArgument, "simulation tick must be non-negative", "tick")),
1568 withScriptBattle<Result<BattlePhase>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1575 battle.addFunc("move", [vm](ScriptTacticsBattle* value, const std::string& actor, int x, int y, int layer) {
1578 return script::projectResult(vm, Result<MoveReceipt>::failure(subject.status()), [](MoveReceipt receipt) {
1583 withScriptBattle<Result<MoveReceipt>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1588 battle.addFunc("face", [vm](ScriptTacticsBattle* value, const std::string& actor, int facing) {
1592 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1600 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1611 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1623 if (!subject) return script::projectResult(vm, Result<AbilityReceipt>::failure(subject.status()),
1626 if (!action) return script::projectResult(vm, Result<AbilityReceipt>::failure(action.status()),
1629 if (!target) return script::projectResult(vm, Result<AbilityReceipt>::failure(target.status()),
1633 withScriptBattle<Result<AbilityReceipt>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1645 if (!subject) return script::projectResult(vm, Result<AbilityReceipt>::failure(subject.status()),
1648 if (!action) return script::projectResult(vm, Result<AbilityReceipt>::failure(action.status()),
1651 if (!target) return script::projectResult(vm, Result<AbilityReceipt>::failure(target.status()),
1655 withScriptBattle<Result<AbilityReceipt>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1667 withScriptBattle<Result<std::string>>(value, [](Tactics& module, TacticsBattleSession& session) {
1676 Diagnostic::error(DiagnosticCode::InvalidArgument, "snapshot text must not be empty", "json")));
1678 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1691 withScriptBattle<Result<std::string>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1702 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1711 withScriptBattle<Result<std::string>>(value, [](Tactics& module, TacticsBattleSession& session) {
1720 battle.addFunc("visibleCellsInRange", [vm](ScriptTacticsBattle* value, int x, int y, int layer, int minimum,
1722 const auto projectCells = [](const std::vector<Cell>& cells) { return bindingCellArrayValue(cells); };
1738 withScriptBattle<Result<std::vector<Cell>>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1746 withScriptBattle<Result<std::string>>(value, [](Tactics& module, TacticsBattleSession& session) {
1755 battle.addFunc("newInteraction", [vm](ScriptTacticsBattle* value, const std::string& unitText) {
1763 vm, Status::failure(Diagnostic::error(DiagnosticCode::StaleHandle, "Tactics module is no longer loaded",
1779 battle.addFunc("presentationIntents", [vm](ScriptTacticsBattle* value, std::int64_t afterSequence,
1812 DiagnosticCode::InvalidArgument, "presentation window must be non-negative", "afterSequence")),
1833 battle.addFunc("addEdge", [vm](ScriptTacticsBattle* value, int fx, int fy, int fl, int tx, int ty, int tl,
1838 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1839 return module.addEdge(session.battle, {fx, fy, fl}, {tx, ty, tl}, std::move(spec).takeValue());
1842 battle.addFunc("edge", [vm](ScriptTacticsBattle* value, int fx, int fy, int fl, int tx, int ty, int tl) {
1845 withScriptBattle<Result<EdgeState>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1851 battle.addFunc("hasEdge", [vm](ScriptTacticsBattle* value, int fx, int fy, int fl, int tx, int ty, int tl) {
1862 withScriptBattle<Result<std::string>>(value, [](Tactics& module, TacticsBattleSession& session) {
1894 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1905 withScriptBattle<Result<std::uint64_t>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1914 const auto projectDepth = [](std::size_t depth) { return Value(static_cast<std::int64_t>(depth)); };
1923 return script::projectResult(vm, Result<std::size_t>::failure(candidates.status()), projectDepth);
1926 withScriptBattle<Result<std::size_t>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1934 battle.addFunc("acceptReaction", [vm](ScriptTacticsBattle* value, const std::string& reactorText,
1944 return script::projectResult(vm, Result<ReactionReceipt>::failure(reactor.status()), projectReceipt);
1947 return script::projectResult(vm, Result<ReactionReceipt>::failure(action.status()), projectReceipt);
1950 withScriptBattle<Result<ReactionReceipt>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1964 battle.addFunc("previewMove", [vm](ScriptTacticsBattle* value, const std::string& actor, int x, int y, int layer) {
1967 return script::projectResult(vm, Result<MoveReceipt>::failure(subject.status()), bindingMoveReceiptValue);
1970 withScriptBattle<Result<MoveReceipt>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1975 battle.addFunc("previewFace", [vm](ScriptTacticsBattle* value, const std::string& actor, int facing) {
1979 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1987 vm, withScriptBattle<Result<void>>(value, [&](Tactics& module, TacticsBattleSession& session) {
1992 battle.addFunc("reachable", [vm](ScriptTacticsBattle* value, const std::string& unit, int budget) {
1995 return script::projectResult(vm, Result<Reachability>::failure(subject.status()), bindingReachabilityValue);
2004 withScriptBattle<Result<Reachability>>(value, [&](Tactics& module, TacticsBattleSession& session) {
2009 battle.addFunc("cellsInRange", [vm](ScriptTacticsBattle* value, int x, int y, int layer, int minimum, int maximum,
2011 const auto projectCells = [](const std::vector<Cell>& cells) { return bindingCellArrayValue(cells); };
2027 withScriptBattle<Result<std::vector<Cell>>>(value, [&](Tactics& module, TacticsBattleSession& session) {
2039 return script::projectResult(vm, Result<TacticalUnit::TurnResources>::failure(subject.status()),
2051 vm, withScriptBattle<Result<BattleStatus>>(value, [](Tactics& module, TacticsBattleSession& session) {
2058 vm, withScriptBattle<Result<BattlePhase>>(value, [](Tactics& module, TacticsBattleSession& session) {
2065 vm, withScriptBattle<Result<SubjectRef>>(value, [](Tactics& module, TacticsBattleSession& session) {
2092 auto session = value ? Tactics::resolve(value->reference) : script::Borrowed<TacticsBattleSession>();
2093 auto* battleValue = session.isBound() ? dynamic_cast<Battle*>(ecs::try_get(session->battle)) : nullptr;
2094 if (!battleValue || battleValue->turn()->revision.value() > static_cast<std::uint64_t>(INT64_MAX)) return -1;
2098 auto session = value ? Tactics::resolve(value->reference) : script::Borrowed<TacticsBattleSession>();
2099 auto* battleValue = session.isBound() ? dynamic_cast<Battle*>(ecs::try_get(session->battle)) : nullptr;
2105 return script::projectResult(vm, Result<BattleEvent>::failure(session.status()), eventProjection);
2107 if (!battleValue || index < 0 || static_cast<std::size_t>(index) >= battleValue->events()->values.size())
2113 vm, Result<BattleEvent>::success(battleValue->events()->values[static_cast<std::size_t>(index)]),
2126 cls.addFunc("newBattle", [vm = cls.getHandle()](Tactics*, const std::string& subject, std::int64_t seed) {
2133 Diagnostic::error(DiagnosticCode::InvalidArgument, "battle seed must be non-negative", "seed")),
Injectable line-of-sight and cover policies over the tactical board.
Injectable content-digest provider for snapshots, with an honest default.
The single Squirrel projection for common Result, Status and Value.
Grid line of sight for sensing consumers, answered from a bound tactics board.
Tactics domain composition profile facade.
Pluggable deterministic turn-scheduling policies.
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
Human-readable, scoped identifier in the form namespace:name.
Definition Identity.h:411
const std::string & format() const noexcept
Returns the canonical namespace:name representation.
Definition Identity.h:436
static std::optional< LogicalId > parse(std::string_view text)
Parses a scoped logical name.
Definition Identity.cpp:36
void ignore(std::string_view reason={}) const noexcept
Explicitly discard this result after documenting the reason.
Definition Result.h:537
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Status failure(StatusCode code, Diagnostic diagnostic)
Construct a failed status with one diagnostic.
Definition Status.h:84
static Status success(StatusCode code=StatusCode::Ok)
Construct a successful status with an explicit non-error outcome.
Definition Status.h:81
static SubjectRef fromPersistentId(PersistentId id) noexcept
Wrap a persistent identity without changing its bytes.
Definition SubjectRef.h:32
bool isValid() const noexcept
Return whether this reference is valid and non-nil.
Definition SubjectRef.h:38
static Result< Value > fromJson(std::string_view json)
Parse one strict JSON value into an owning Value.
Definition Value.cpp:57
static std::optional< Id128 > parse(std::string_view text) noexcept
Parses canonical UUID text.
Definition Identity.h:151
Non-owning C++ observation with no implicit lifetime extension.
Definition RuntimeRegistry.h:42
static std::vector< BattleCommand > commandsFrom(Battle &battle, Revision fromRevision)
Return an owning copy of commands whose result is newer than fromRevision.
Definition TacticsReplay.cpp:45
static Result< void > replay(Battle &battle, std::span< const BattleCommand > commands)
Apply commands in sequence and verify revision/sequence agreement after every commit.
Definition TacticsReplay.cpp:52
static Result< AbilityReceipt > previewAbility(Battle &battle, SubjectRef actor, const LogicalId &action, Cell targetCell, SubjectRef targetUnit={}, std::string_view payload={})
Preview an ability declaration with the exact validator used by commit.
Definition TacticsBattle.cpp:395
static Result< void > endTurn(Battle &battle, SubjectRef actor)
End the currently acting unit's turn and enter TurnEnd.
Definition TacticsBattle.cpp:560
static Result< void > defeatUnit(Battle &battle, SubjectRef unit)
Apply a tactical defeat outcome and evaluate affected objectives atomically.
Definition TacticsBattle.cpp:935
static Result< std::size_t > openReaction(Battle &battle, std::uint64_t triggerSequence, std::vector< ReactionCandidate > candidates)
Open a sorted reaction window for an existing battle event sequence.
Definition TacticsBattle.cpp:764
static Result< AbilityReceipt > useAbility(Battle &battle, SubjectRef actor, const LogicalId &action, Cell targetCell, SubjectRef targetUnit={}, std::string payload={})
Declare an ability activation by the active unit.
Definition TacticsBattle.cpp:401
static Result< void > addObjective(Battle &battle, ObjectiveSpec objective)
Register a validated built-in objective during setup.
Definition TacticsBattle.cpp:896
static Result< std::uint64_t > roll(Battle &battle, const LogicalId &stream)
Consume one value from a battle-owned named deterministic stream.
Definition TacticsBattle.cpp:967
static Result< void > declineReaction(Battle &battle)
Decline and close the top reaction window without consuming resources.
Definition TacticsBattle.cpp:875
static Result< void > finish(Battle &battle)
End a running battle and enter BattleEnd.
Definition TacticsBattle.cpp:745
static Result< MoveReceipt > previewMove(Battle &battle, SubjectRef actor, Cell destination)
Preview movement with the exact validator used by commit, without mutation.
Definition TacticsBattle.cpp:718
static Result< void > addSide(Battle &battle, ecs::EntityHandle side)
Register a side during setup using a generation-checked handle.
Definition TacticsBattle.cpp:234
static Result< void > faceUnit(Battle &battle, SubjectRef actor, int facing)
Change the active unit's logical facing without consuming movement points.
Definition TacticsBattle.cpp:627
static Result< ReactionReceipt > acceptReaction(Battle &battle, SubjectRef reactor, const LogicalId &action)
Accept one eligible reaction, consume one reaction point and close the top window.
Definition TacticsBattle.cpp:820
static Result< void > previewFace(Battle &battle, SubjectRef actor, int facing)
Preview a facing action with the exact validator used by commit.
Definition TacticsBattle.cpp:656
static Result< BattlePhase > advance(Battle &battle, const SimulationStep &step)
Advance exactly one observable automatic phase transition.
Definition TacticsBattle.cpp:432
static Result< void > waitUnit(Battle &battle, SubjectRef actor)
Commit a wait action and enter TurnEnd for the active unit.
Definition TacticsBattle.cpp:678
static Result< MoveReceipt > moveUnit(Battle &battle, SubjectRef actor, Cell destination)
Validate and atomically commit movement for the active unit.
Definition TacticsBattle.cpp:585
static Result< void > addUnit(Battle &battle, ecs::EntityHandle unit, ecs::EntityHandle side, Cell cell)
Register and place a unit during setup atomically.
Definition TacticsBattle.cpp:257
static Result< void > previewWait(Battle &battle, SubjectRef actor)
Preview a wait action with the exact validator used by commit.
Definition TacticsBattle.cpp:706
static Result< void > start(Battle &battle, std::string policyId)
Start a configured battle and emit battle.started.
Definition TacticsBattle.cpp:296
Battle short-root and authoritative owner of board and turn state.
Definition TacticsTypes.h:444
Answers "can @p from see @p to" for one board.
Definition LineOfSight.h:61
virtual std::string_view id() const noexcept=0
Stable id of this implementation, for diagnostics and configuration.
static InteractionSession create(InteractionContext context)
Start a session from an immutable context.
Definition Interaction.cpp:61
static Result< std::vector< Cell > > cellsInRange(const BoardState &board, Cell origin, int minimum, int maximum, CellRangeMetric metric)
Enumerate existing cells whose logical distance is within an inclusive range.
Definition TacticsPath.cpp:178
static Result< Reachability > reachable(const BoardState &board, SubjectRef subject, int budget)
Compute all unoccupied reachable cells for a placed subject.
Definition TacticsPath.cpp:138
Projects authoritative events into bounded, revertible presentation intents.
Definition Presentation.h:163
Result< std::vector< PresentationCommand > > project(const BattleEvent &event, const BattleCommand *command, const PresentationFrame &frame) const
Project one authoritative event into presentation commands.
Definition Presentation.cpp:72
Result< void > bindBattle(ecs::EntityHandle battle)
Bind the battle this adapter answers for.
Definition TacticsLineOfSightAdapter.cpp:64
Result< void > unbindBattle(ecs::EntityHandle battle)
Release the binding when battle is the bound one; otherwise NoOp.
Definition TacticsLineOfSightAdapter.cpp:79
static Result< Battle::Commands > parseCommandLog(const Value &value, Revision snapshotRevision)
Parse a command log written by commandLogValue.
Definition TacticsPersistence.cpp:1280
static Result< void > restore(Battle &battle, const SnapshotEnvelope &snapshot, const SnapshotHashProvider &hashProvider)
Restore a verified compatible snapshot without partial mutation on failure.
Definition TacticsPersistence.cpp:1290
static Result< SnapshotEnvelope > snapshot(Battle &battle, const SnapshotHashProvider &hashProvider)
Capture a version-one, integrity-sealed battle snapshot.
Definition TacticsPersistence.cpp:1168
static Result< Value > commandLogValue(Battle &battle, Revision fromRevision)
Serialize the accepted command log after fromRevision in its persisted shape.
Definition TacticsPersistence.cpp:1266
Owns tactics short-root entities and coordinates checked battle setup.
Definition Tactics.h:52
std::size_t battleCount() const noexcept
Return the number of live facade-owned battles.
Definition Tactics.cpp:1283
Result< void > addEdge(ecs::EntityHandle battle, Cell from, Cell to, EdgeState state={})
Declare a directed edge between two adjacent cells during setup.
Definition Tactics.cpp:1022
std::size_t sideCount() const noexcept
Return the number of live facade-owned sides.
Definition Tactics.cpp:1285
Result< ecs::EntityHandle > newUnit(ecs::EntityHandle battle, ecs::EntityHandle side, SubjectRef subject, LogicalId definition, Cell cell, TurnResourceSpec resources={})
Create, register and place a tactical unit atomically.
Definition Tactics.cpp:764
Result< Reachability > reachable(ecs::EntityHandle battle, SubjectRef subject, int budget)
Return the cells a placed subject can reach within an explicit budget.
Definition Tactics.cpp:1005
Result< std::vector< GameplayEvent > > gameplayEvents(const GameplaySession &session, SubjectRef instance, std::uint64_t afterSequence) const override
Return events strictly newer than an instance-local sequence cursor.
Definition Tactics.cpp:697
Result< BattlePhase > phase(ecs::EntityHandle battle)
Return an owning snapshot of the current battle phase.
Definition Tactics.cpp:966
Result< GameplayCommandReceipt > submitGameplay(const GameplaySession &session, SubjectRef instance, const GameplayCommand &command) override
Validate authority and atomically submit one domain command.
Definition Tactics.cpp:600
Result< std::string > policyId(ecs::EntityHandle battle)
Return the stable id of the policy scheduling this battle.
Definition Tactics.cpp:1051
Result< std::uint64_t > roll(ecs::EntityHandle battle, const LogicalId &stream)
Consume one value from a named battle random stream.
Definition Tactics.cpp:950
Result< MoveReceipt > previewMove(ecs::EntityHandle battle, SubjectRef actor, Cell destination)
Validate a move with the exact validator used by commit, without mutating.
Definition Tactics.cpp:983
std::string_view gameplayDomain() const noexcept override
Stable provider domain used for discovery and routing.
Definition Tactics.cpp:497
Result< void > attachLineOfSightBoard(ecs::EntityHandle battle)
Bind one battle as the board that grid line-of-sight queries answer for.
Definition Tactics.cpp:1222
Result< GameplayObservation > advanceGameplay(const GameplaySession &session, SubjectRef instance, const SimulationStep &step) override
Advance one provider-owned instance using injected deterministic time.
Definition Tactics.cpp:685
std::vector< SubjectRef > gameplayInstances() const override
Instances currently served, in publication order.
Definition Tactics.cpp:499
Result< void > previewWait(ecs::EntityHandle battle, SubjectRef actor)
Validate a wait activation with the exact validator used by commit.
Definition Tactics.cpp:998
Result< EdgeState > edge(ecs::EntityHandle battle, Cell from, Cell to)
Return a declared directed edge, or NotFound when none is declared.
Definition Tactics.cpp:1037
static script::Borrowed< TacticsBattleSession > resolve(TacticsBattleSessionRef reference) noexcept
Resolve a live script battle session as a synchronous borrowed view.
Definition Tactics.cpp:1298
Result< void > replay(ecs::EntityHandle battle, std::span< const BattleCommand > commands)
Replay checked commands against a module-owned battle.
Definition Tactics.cpp:1111
Result< void > declineReaction(ecs::EntityHandle battle)
Decline the top reaction window.
Definition Tactics.cpp:929
std::size_t unitCount() const noexcept
Return the number of live facade-owned units.
Definition Tactics.cpp:1284
Result< std::vector< PresentationCommand > > presentationIntents(ecs::EntityHandle battle, std::uint64_t afterSequence, std::uint64_t transientTicks=20)
Project authoritative events after afterSequence into presentable intents.
Definition Tactics.cpp:1232
Result< void > previewFace(ecs::EntityHandle battle, SubjectRef actor, int facing)
Validate a facing change with the exact validator used by commit.
Definition Tactics.cpp:991
Result< AbilityReceipt > useAbility(ecs::EntityHandle battle, SubjectRef actor, const LogicalId &action, Cell targetCell, SubjectRef targetUnit={}, std::string payload={})
Declare an ability activation for the active unit.
Definition Tactics.cpp:863
Result< void > detachLineOfSightBoard(ecs::EntityHandle battle)
Release the line-of-sight binding when battle is the bound one; otherwise NoOp.
Definition Tactics.cpp:1228
Result< ecs::EntityHandle > newBattle(SubjectRef subject, std::uint64_t seed=0)
Create a battle root with a valid stable subject and explicit seed.
Definition Tactics.cpp:724
Result< std::size_t > openReaction(ecs::EntityHandle battle, std::uint64_t triggerSequence, std::vector< ReactionCandidate > candidates)
Open a deterministic reaction window.
Definition Tactics.cpp:911
Result< void > addObjective(ecs::EntityHandle battle, ObjectiveSpec objective)
Add one built-in objective during battle setup.
Definition Tactics.cpp:936
std::string_view lineOfSightAlgorithm() const noexcept
Id of the line-of-sight policy visibleCellsInRange currently uses.
Definition Tactics.cpp:1217
Result< TacticalUnit::TurnResources > unitResources(ecs::EntityHandle battle, SubjectRef unit)
Return an owning snapshot of a placed unit's per-turn resources.
Definition Tactics.cpp:1059
Result< InteractionContext > interactionContext(ecs::EntityHandle battle, SubjectRef controlledUnit)
Build the interaction projection for one controlled unit.
Definition Tactics.cpp:1182
Result< void > restoreJson(ecs::EntityHandle battle, std::string_view json)
Parse, verify and transactionally restore a snapshot from JSON text.
Definition Tactics.cpp:1130
Result< void > waitUnit(ecs::EntityHandle battle, SubjectRef actor)
End the active unit's activation through the wait resolver.
Definition Tactics.cpp:897
Result< MoveReceipt > moveUnit(ecs::EntityHandle battle, SubjectRef actor, Cell destination)
Validate and commit movement for the active unit.
Definition Tactics.cpp:882
Result< void > defeatUnit(ecs::EntityHandle battle, SubjectRef unit)
Apply a defeat outcome from an RPG/game settlement adapter.
Definition Tactics.cpp:943
std::optional< EdgeState > tryEdge(ecs::EntityHandle battle, Cell from, Cell to)
Return a declared directed edge, or empty when none is declared.
Definition Tactics.cpp:1045
Result< void > replayJson(ecs::EntityHandle battle, std::string_view json)
Replay a command log produced by commandLogJson.
Definition Tactics.cpp:1152
Result< GameplayObservation > observeGameplay(const GameplaySession &session, SubjectRef instance) const override
Observe one provider-owned gameplay instance without mutation.
Definition Tactics.cpp:511
static Result< void > release(TacticsBattleSessionRef reference)
Release a script battle session and its ECS aggregate.
Definition Tactics.cpp:1303
Result< std::vector< GameplayActionDescriptor > > availableGameplayActions(const GameplaySession &session, SubjectRef instance, SubjectRef subject) const override
Discover currently legal player-semantic actions for one subject.
Definition Tactics.cpp:562
Result< BattleStatus > status(ecs::EntityHandle battle)
Return an owning snapshot of the current battle status.
Definition Tactics.cpp:958
Result< void > setTopology(ecs::EntityHandle battle, BoardTopology topology)
Select square-four, square-eight, or axial-hex topology during setup.
Definition Tactics.cpp:818
Result< std::vector< Cell > > visibleCellsInRange(ecs::EntityHandle battle, Cell origin, int minimum, int maximum, CellRangeMetric metric)
Cells within a metric range of origin that actually see it.
Definition Tactics.cpp:1167
Result< ecs::EntityHandle > newSide(ecs::EntityHandle battle, SubjectRef subject)
Create and register a side with a module-owned setup battle.
Definition Tactics.cpp:743
Result< void > endTurn(ecs::EntityHandle battle, SubjectRef actor)
End the active actor turn.
Definition Tactics.cpp:856
Result< std::string > snapshotJson(ecs::EntityHandle battle)
Seal a snapshot and serialize it as one JSON string.
Definition Tactics.cpp:1118
Result< void > faceUnit(ecs::EntityHandle battle, SubjectRef actor, int facing)
Change the active unit's logical facing.
Definition Tactics.cpp:890
Result< void > addCell(ecs::EntityHandle battle, Cell cell, CellState state={})
Add one authoritative cell to a module-owned setup battle.
Definition Tactics.cpp:803
std::string_view snapshotHashAlgorithm() const noexcept
Id of the content-digest algorithm snapshots currently use.
Definition Tactics.cpp:1165
Result< ReactionReceipt > acceptReaction(ecs::EntityHandle battle, SubjectRef reactor, const LogicalId &action)
Accept one eligible reaction.
Definition Tactics.cpp:920
Result< std::string > commandLogJson(ecs::EntityHandle battle, Revision revision)
Serialize the accepted command log after revision in its persisted shape.
Definition Tactics.cpp:1142
Result< void > start(ecs::EntityHandle battle, std::string_view policyId)
Start a module-owned battle with a registered turn policy.
Definition Tactics.cpp:841
static bool isStale(TacticsBattleSessionRef reference) noexcept
Return whether a script battle-session reference is stale.
Definition Tactics.cpp:1310
static Result< TacticsBattleSessionRef > newSession(SubjectRef subject, std::uint64_t seed=0)
Allocate a script-owned battle session with generation/epoch stale detection.
Definition Tactics.cpp:1287
Result< BattlePhase > advance(ecs::EntityHandle battle, const SimulationStep &step)
Advance one automatic phase using injected deterministic time.
Definition Tactics.cpp:848
Result< AbilityReceipt > previewAbility(ecs::EntityHandle battle, SubjectRef actor, const LogicalId &action, Cell targetCell, SubjectRef targetUnit={}, std::string_view payload={})
Ask whether an ability declaration would be accepted, without declaring it.
Definition Tactics.cpp:872
Result< void > restore(ecs::EntityHandle battle, const SnapshotEnvelope &snapshot, const SnapshotHashProvider &hashProvider)
Transactionally restore a module-owned identity-compatible battle snapshot.
Definition Tactics.cpp:1095
Result< SnapshotEnvelope > snapshot(ecs::EntityHandle battle, const SnapshotHashProvider &hashProvider)
Capture a sealed complete snapshot of a module-owned battle.
Definition Tactics.cpp:1086
Result< std::vector< Cell > > cellsInRange(ecs::EntityHandle battle, Cell origin, int minimum, int maximum, CellRangeMetric metric)
Enumerate existing cells whose logical distance falls in an inclusive range. @cost Linear in the numb...
Definition Tactics.cpp:1013
Result< SubjectRef > activeUnit(ecs::EntityHandle battle)
Return an owning snapshot of the current active unit subject.
Definition Tactics.cpp:1071
Result< std::vector< BattleCommand > > commandsFrom(ecs::EntityHandle battle, Revision revision)
Return accepted commands newer than the supplied battle revision.
Definition Tactics.cpp:1103
static TurnPolicyRegistry & builtins()
Return the process-wide registry carrying the built-in policies.
Definition TurnPolicy.cpp:111
std::variant< std::monostate, std::int64_t, double, std::string, bool > Value
Definition Database.h:26
ssq::Table project(HSQUIRRELVM vm, const eve::Result< void > &result)
Project a completed editing result that has no payload.
Definition EditorScriptProjection.h:28
std::int32_t moveCost(const HexMap &map, HexCoordinates from, HexCoordinates to, HexDirection direction, const HexOccupancyQuery &occupied)
Cost of moving between two adjacent cells.
Definition HexSearch.cpp:131
const EditorValue * field(const EditorValue &value, const char *name)
Definition RoadNetworkEditTarget.cpp:15
@ Borrowed
ssq::Table projectStatusResult(HSQUIRRELVM vm, const Status &status)
Project a checked native status that carries no payload.
Definition SquirrelBinding.cpp:454
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
Definition SquirrelBinding.cpp:470
Definition Interaction.cpp:13
Result< std::vector< Cell > > visibleCellsInRange(const BoardState &board, const ILineOfSightPolicy &policy, Cell origin, int minimum, int maximum, CellRangeMetric metric)
Cells within a metric range of origin that policy can actually see.
Definition LineOfSight.cpp:192
std::string_view statusName(BattleStatus status) noexcept
Return the stable protocol spelling of a battle status.
Definition TacticsTypes.cpp:215
std::string_view interactionStateName(InteractionState state) noexcept
Human-readable stable spelling of an interaction state (protocol text).
Definition Interaction.cpp:22
std::string_view presentationRevertTriggerName(PresentationRevertTrigger trigger) noexcept
Human-readable stable spelling of a revert trigger (protocol text).
Definition Presentation.cpp:62
std::string_view unitVisualStateName(UnitVisualState state) noexcept
Human-readable stable spelling of a visual state (protocol text).
Definition Presentation.cpp:47
@ OccupyCells
@ SurviveRounds
@ EliminateSide
std::shared_ptr< ILineOfSightPolicy > gridLineOfSightPolicy()
The process-wide built-in line-of-sight policy.
Definition LineOfSight.cpp:182
std::string_view commandKindName(BattleCommandKind kind) noexcept
Return the stable protocol spelling of an accepted command kind.
Definition TacticsTypes.cpp:224
@ Manhattan
@ Chebyshev
std::string_view interactionIntentKindName(InteractionIntentKind kind) noexcept
Human-readable stable spelling of an intent kind (protocol text).
Definition Interaction.cpp:34
Result< void > registerTacticsLineOfSightProvider()
Claim the grid coordinate spaces for the tactics adapter.
Definition TacticsLineOfSightAdapter.cpp:113
script::RuntimeHandleRef< TacticsBattleSessionTag > TacticsBattleSessionRef
Generation- and module-epoch-qualified battle-session reference.
Definition Tactics.h:25
std::string_view phaseName(BattlePhase phase) noexcept
Return the stable protocol spelling of a battle phase.
Definition TacticsTypes.cpp:200
@ Square4
@ Square8
@ ExplicitGraph
@ HexAxial
TacticsLineOfSightAdapter & tacticsLineOfSightAdapter()
The process-wide adapter instance the capability answers with.
Definition TacticsLineOfSightAdapter.cpp:59
@ InvalidArgument
@ NotFound
@ PreconditionViolation
@ Unsupported
@ StaleHandle
@ Conflict
@ NoOp
@ Applied
@ Object
Result< SnapshotEnvelope > parseSnapshotEnvelope(std::string_view json, const SnapshotHashProvider &hashProvider)
Parse and verify an envelope from canonical or compatible JSON text.
Definition Snapshot.cpp:190
Result< std::string > serializeSnapshotEnvelope(const SnapshotEnvelope &snapshot)
Serialize an envelope as deterministic compact JSON.
Definition Snapshot.cpp:184
SnapshotHashProvider snapshotContentHashProvider()
A SnapshotHashProvider backed by the active hasher.
Definition SnapshotHash.cpp:92
@ PlayerEquivalent
std::string_view activeSnapshotHashAlgorithm() noexcept
Id of the algorithm snapshotContentHashProvider currently uses.
Definition SnapshotHash.cpp:97
std::function< Result< ContentId >(std::string_view canonicalInput)> SnapshotHashProvider
Injected content-digest implementation used by snapshots.
Definition Snapshot.h:36
Definition Container.h:602
Owning evidence that a gameplay authority accepted one command.
Definition GameplayControl.h:62
std::uint64_t resultingRevision
Definition GameplayControl.h:66
One player-semantic command submitted to a domain authority.
Definition GameplayControl.h:52
Owning event projection safe across frames and process boundaries.
Definition GameplayControl.h:71
Immutable owning observation of one authoritative gameplay instance.
Definition GameplayControl.h:43
Owning authorization context shared by player, script and automation adapters.
Definition GameplayControl.h:30
Stable outer format shared by persistence and cross-process snapshots.
Definition Snapshot.h:46
Handle plus owner-lifetime epoch for a non-ECS registry object.
Definition RuntimeRegistry.h:91
One declared ability activation and the resource state it left behind.
Definition TacticsBattle.h:29
int remainingActionPoints
Remaining action points after the activation was paid for.
Definition TacticsBattle.h:36
SubjectRef targetUnit
The targeted unit, or an invalid subject when the ability targets a cell only.
Definition TacticsBattle.h:33
One accepted replay command using only persistent identities and values.
Definition TacticsTypes.h:386
One deterministic battle lifecycle event owned by Battle.
Definition TacticsTypes.h:312
Owning persistent board record used by snapshots and replay inspection.
Definition TacticsTypes.h:125
Logical board coordinate independent of rendering projection.
Definition TacticsTypes.h:30
One authoritative directed edge fact between two adjacent cells.
Definition TacticsTypes.h:115
Immutable projection of everything the interaction machine is allowed to know.
Definition Interaction.h:98
Committed tactical movement and remaining resource state.
Definition TacticsBattle.h:16
Persistent objective definition using stable side identities.
Definition TacticsTypes.h:426
What the projector knows about the battle beyond the event itself.
Definition Presentation.h:148
std::uint64_t transientTicks
How long a transient state stays valid, in ticks.
Definition Presentation.h:154
std::map< std::string, UnitVisualState > restingState
Resting state of each subject, used as the revert target.
Definition Presentation.h:152
One reachable cell and its minimum fixed-point movement cost.
Definition TacticsPath.h:18
Initial and per-round tactical resource values for one unit.
Definition TacticsTypes.h:139