48 [[nodiscard]] std::vector<uint8_t>
serialize()
const {
49 capnp::MallocMessageBuilder message;
52 auto inputsBuilder = builder.initInputs(
static_cast<unsigned int>(
inputs.size()));
54 for (
size_t i = 0; i <
inputs.size(); ++i) {
55 auto snapshotBuilder = inputsBuilder[i];
56 snapshotBuilder.setSequenceId(
inputs[i].sequenceId);
59 snapshotBuilder.initActions(
static_cast<unsigned int>(
inputs[i].actions.size()));
60 for (
size_t j = 0; j <
inputs[i].actions.size(); ++j) {
61 actionsBuilder.set(
static_cast<unsigned int>(j),
66 auto bytes = capnp::messageToFlatArray(message);
67 auto byteArray = bytes.asBytes();
68 return std::vector<uint8_t>(byteArray.begin(), byteArray.end());
75 KJ_REQUIRE(data.size() %
sizeof(capnp::word) == 0,
76 "Serialized data size must be a multiple of capnp::word");
77 auto aligned = kj::heapArray<uint8_t>(data.size());
78 memcpy(aligned.begin(), data.data(), data.size());
79 kj::ArrayPtr<const capnp::word> words(
reinterpret_cast<const capnp::word *
>(aligned.begin()),
80 data.size() /
sizeof(capnp::word));
82 capnp::FlatArrayMessageReader message(words);
86 auto inputsReader = reader.getInputs();
88 static constexpr size_t MAX_INPUTS_PER_PACKET = 64;
89 if (inputsReader.size() > MAX_INPUTS_PER_PACKET) {
90 throw std::runtime_error(
"Too many inputs in PlayerInput message");
93 result.inputs.reserve(inputsReader.size());
95 for (
auto snapshotReader : inputsReader) {
97 snapshot.
sequenceId = snapshotReader.getSequenceId();
99 auto actionsReader = snapshotReader.getActions();
100 snapshot.
actions.reserve(actionsReader.size());
102 for (
auto action : actionsReader) {
105 result.inputs.push_back(snapshot);