载入中...
搜索中...
未找到
RTSFormationBindings.cpp
浏览该文件的文档.
1#include <simplesquirrel/simplesquirrel.hpp>
3#include "rts/RTS.h"
5
7namespace {
8Result<std::vector<SubjectRef>> readSubjectArray(ssq::Array array) {
9 try {
10 std::vector<std::string> texts;
11 texts.reserve(array.size());
12 for (size_t index = 0; index < array.size(); ++index) texts.push_back(array.get<std::string>(index));
13 return parseScriptSubjects(texts);
14 } catch (const std::exception& error) {
15 return Result<std::vector<SubjectRef>>::failure(
17 }
18}
19Result<FormationSpec> parseFormation(const std::string& kind, float spacing, int columns, float rotation) {
20 FormationSpec spec;
21 if (kind == "line")
23 else if (kind == "grid")
25 else if (kind == "wedge")
27 else if (kind == "column")
29 else if (kind == "dispersed")
31 else
33 Diagnostic::error(DiagnosticCode::InvalidArgument, "Unknown formation layout", "formation.kind"));
34 spec.spacing = spacing;
35 spec.columns = columns;
37 auto valid = spec.validate();
38 if (!valid) return Result<FormationSpec>::failure(valid.status());
40}
41} // namespace
42
43void exposeFormationBindings(ssq::Class& cls) {
44 const auto vm = cls.getHandle();
45 cls.addFunc("moveGroupUnits",
46 [vm](RTS* self, ssq::Array texts, float x, float y, const std::string& kind, float spacing, int columns,
47 float rotation, float leadDistance) -> ssq::Table {
48 auto subjects = readSubjectArray(texts);
49 if (!subjects) return script::projectStatusResult(vm, subjects.status());
50 auto formation = parseFormation(kind, spacing, columns, rotation);
51 if (!formation) return script::projectStatusResult(vm, formation.status());
53 batch.units = std::move(subjects).takeValue();
54 batch.target = {x, y};
55 batch.formation = std::move(formation).takeValue();
56 batch.leadDistance = leadDistance;
58 });
59 cls.addFunc("queueScriptGroupMove",
60 [vm](RTS* self, std::int64_t tick, ssq::Array texts, float x, float y, const std::string& kind,
61 float spacing, int columns, float rotation, float leadDistance) -> ssq::Table {
62 if (tick < 0)
65 "RTS replay tick must be non-negative", "tick")));
66 auto subjects = readSubjectArray(texts);
67 if (!subjects) return script::projectStatusResult(vm, subjects.status());
68 auto formation = parseFormation(kind, spacing, columns, rotation);
69 if (!formation) return script::projectStatusResult(vm, formation.status());
70 RTSReplayCommand command;
72 command.tick = SimulationTick{static_cast<std::uint64_t>(tick)};
73 command.units = std::move(subjects).takeValue();
74 command.command.target = {x, y};
75 command.formation = std::move(formation).takeValue();
76 command.groupLeadDistance = leadDistance;
77 return script::projectResult(vm, self->queueScriptCommand(std::move(command)));
78 });
79 cls.addFunc("moveUnits",
80 [vm](RTS* self, ssq::Array subjectTexts, float x, float y, bool append, float spacing) -> ssq::Table {
81 auto subjects = readSubjectArray(subjectTexts);
82 if (!subjects) return script::projectStatusResult(vm, subjects.status());
83 CommandSpec command;
84 command.kind = OrderKind::Move;
85 command.target = {x, y};
86 command.append = append;
87 FormationSpec formation;
88 formation.kind = FormationKind::Grid;
89 formation.spacing = spacing;
91 vm, self->commandUnits(std::move(subjects).takeValue(), command, formation), fanOutValue);
92 });
93 cls.addFunc("attackMoveUnits",
94 [vm](RTS* self, ssq::Array subjectTexts, float x, float y, bool append, float spacing) -> ssq::Table {
95 auto subjects = readSubjectArray(subjectTexts);
96 if (!subjects) return script::projectStatusResult(vm, subjects.status());
97 CommandSpec command;
99 command.target = {x, y};
100 command.append = append;
101 FormationSpec formation;
102 formation.kind = FormationKind::Grid;
103 formation.spacing = spacing;
105 vm, self->commandUnits(std::move(subjects).takeValue(), command, formation), fanOutValue);
106 });
107
108 cls.addFunc("moveFormationUnits",
109 [vm](RTS* self, ssq::Array texts, float x, float y, bool append, const std::string& kind, float spacing,
110 int columns, float rotation) -> ssq::Table {
111 auto subjects = readSubjectArray(texts);
112 if (!subjects) return script::projectStatusResult(vm, subjects.status());
113 auto formation = parseFormation(kind, spacing, columns, rotation);
114 if (!formation) return script::projectStatusResult(vm, formation.status());
115 CommandSpec command;
116 command.kind = OrderKind::Move;
117 command.target = {x, y};
118 command.append = append;
120 vm, self->commandUnits(std::move(subjects).takeValue(), command, formation.value()),
122 });
123 cls.addFunc("queueScriptFormationMove",
124 [vm](RTS* self, std::int64_t tick, ssq::Array texts, float x, float y, bool append,
125 const std::string& kind, float spacing, int columns, float rotation) -> ssq::Table {
126 if (tick < 0)
129 "RTS replay tick must be non-negative", "tick")));
130 auto subjects = readSubjectArray(texts);
131 if (!subjects) return script::projectStatusResult(vm, subjects.status());
132 auto formation = parseFormation(kind, spacing, columns, rotation);
133 if (!formation) return script::projectStatusResult(vm, formation.status());
134 RTSReplayCommand command;
135 command.tick = SimulationTick{static_cast<std::uint64_t>(tick)};
136 command.units = std::move(subjects).takeValue();
137 command.command.kind = OrderKind::Move;
138 command.command.target = {x, y};
139 command.command.append = append;
140 command.formation = std::move(formation).takeValue();
141 return script::projectResult(vm, self->queueScriptCommand(std::move(command)));
142 });
143}
144} // namespace eve::rts::script_internal
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
HSQUIRRELVM vm
Definition ECS.cpp:20
HSQOBJECT cls
Definition ECS.cpp:21
TokenKind kind
std::array< float, 4 > rotation
bool valid
std::string error
Definition Package.cpp:60
RTS module owner and phase-one composition profile entry point.
The single Squirrel projection for common Result, Status and Value.
SimulationTick tick
int spacing
int columns
uint32_t index
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
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
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
Owns RTS root entities and coordinates the phase-one systems.
Definition RTS.h:63
Result< void > queueScriptCommand(RTSReplayCommand command)
Queue one stable-identity command on the script profile's deterministic tick timeline.
Definition RTS.cpp:3175
Result< FanOutReceipt > commandUnits(std::span< const SubjectRef > subjects, const CommandSpec &command, const FormationSpec &formation={}) const
Resolve stable unit identities and fan out one generic command.
Result< FanOutReceipt > submitMovementGroup(const MovementGroupBatch &batch)
Commit a caller-built immediate Move group with coordinated pacing.
Value fanOutValue(FanOutReceipt receipt)
Result< std::vector< SubjectRef > > parseScriptSubjects(const std::vector< std::string > &texts)
Parse script UUID strings into stable subjects. @cost Linear in subject count; allocates one output v...
void exposeFormationBindings(ssq::Class &cls)
ssq::Table projectStatusResult(HSQUIRRELVM vm, const Status &status)
Project a checked native status that carries no payload.
ssq::Table projectResult(HSQUIRRELVM vm, Result< void > &&result)
Consume and project a void native Result using the common schema.
One domain-neutral command submitted to a unit's generic order queue.
Definition RTSTypes.h:101
WorldPosition target
Definition RTSTypes.h:103
Input to the pure formation planner.
Definition RTSSystems.h:34
EVENGINE_API_DOMAINS Result< void > validate() const
Validate layout kind, spacing, grid columns and finite rotation.
float rotationRadians
Counterclockwise rotation around the anchor; zero preserves legacy layouts.
Definition RTSSystems.h:38
Caller-built admission batch for an immediate coordinated Move command. @cost Linear in unit count; c...
Definition RTSSystems.h:48
float leadDistance
Positive world-space allowance before leaders slow for lagging members.
Definition RTSSystems.h:52
std::vector< SubjectRef > units
Owned stable identities; no entity pointers are retained.
Definition RTSSystems.h:49
One process-independent command using stable subjects instead of ECS handles.
Definition RTSReplay.h:39
std::vector< SubjectRef > units
Definition RTSReplay.h:42
RTSReplayOperation operation
Definition RTSReplay.h:41
FormationSpec formation
Definition RTSReplay.h:45