From b31d7a677481b4a09168c43d203bfd6d7badf577 Mon Sep 17 00:00:00 2001 From: Loek Le Blansch Date: Fri, 25 Oct 2024 17:26:20 +0200 Subject: implement mementos snapshots --- Museum.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 43 insertions(+), 6 deletions(-) (limited to 'Museum.cpp') diff --git a/Museum.cpp b/Museum.cpp index 4a12038..d389602 100644 --- a/Museum.cpp +++ b/Museum.cpp @@ -20,22 +20,39 @@ void Museum::update() { this->canvas.update(); this->collision.update(); this->tick++; + + unsigned long long next_snapshot = this->snapshot_ticks; + if (!this->history.empty()) next_snapshot += this->history.top().tick; + if (next_snapshot > this->tick) return; + this->history.push(this->save_snapshot()); + printf("saved snapshot at tick %llu\n", this->tick); } void Museum::skip_forward() { - this->jump += this->snapshot_ticks; + this->jump++; } - void Museum::skip_backward() { - + this->jump--; } void Museum::work() { while (this->working) { - // immediately process forward jumps, even if paused + // immediately process jumps, even if paused if (this->jump > 0) { - for (; this->jump != 0; this->jump--) - this->update(); + // forward jump + for (; this->jump != 0; this->jump--) { + printf("jumping forward %u ticks\n", this->snapshot_ticks); + for (size_t i = 0; i < this->snapshot_ticks; i++) + this->update(); + } + } else if (this->jump < 0) { + // backward jump + for (; this->jump != 0; this->jump++) { + if (this->history.empty()) continue; + printf("restoring snapshot from tick %llu\n", this->history.top().tick); + this->restore_snapshot(this->history.top()); + this->history.pop(); + } } // wait with regular update if paused @@ -48,3 +65,23 @@ void Museum::work() { } } +static void memories_concat(Memories & a, Memories b) { + a.insert(a.end(), make_move_iterator(b.begin()), make_move_iterator(b.end())); +} + +Museum::Snapshot Museum::save_snapshot() { + Snapshot snapshot = { + .tick = this->tick, + .memories = {}, + }; + memories_concat(snapshot.memories, this->canvas.save()); + memories_concat(snapshot.memories, this->people.save()); + return snapshot; +} + +void Museum::restore_snapshot(const Snapshot & snapshot) { + this->tick = snapshot.tick; + this->canvas.restore(snapshot.memories); + this->people.restore(snapshot.memories); +} + -- cgit v1.2.3