Skip to content

Commit

Permalink
Serialize unique ids instead of Creature* in Dancing to avoid danglin…
Browse files Browse the repository at this point in the history
…g pointers.
  • Loading branch information
miki151 committed Sep 16, 2021
1 parent 1e631a2 commit 769d190
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 9 deletions.
31 changes: 24 additions & 7 deletions dancing.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,24 @@
#include "content_factory.h"
#include "creature.h"

SERIALIZE_DEF(Dancing, positions, currentDanceInfo, assignments, lastSeen, area)

template <class Archive>
void Dancing::serialize(Archive& ar, const unsigned int version) {
ar(positions, currentDanceInfo);
if (version < 1) {
vector<Creature*> SERIAL(assignments);
map<Creature*, LocalTime> SERIAL(lastSeen);
ar(assignments, lastSeen);
for (auto c : assignments)
this->assignments.push_back(c->getUniqueId());
for (auto& elem : lastSeen)
this->lastSeen.set(elem.first, elem.second);
} else
ar(assignments, lastSeen);
ar(area);
}

SERIALIZABLE(Dancing)

SERIALIZATION_CONSTRUCTOR_IMPL(Dancing)

Expand Down Expand Up @@ -31,7 +48,7 @@ void Dancing::initializeCurrentDance(LocalTime startTime) {
origin,
startTime
};
assignments = vector<Creature*>(candidatePositions.coord[0].size(), nullptr);
assignments = vector<UniqueEntity<Creature>::Id>(candidatePositions.coord[0].size(), 0);
return;
}
}
Expand All @@ -51,11 +68,11 @@ void Dancing::setArea(PositionSet p, LocalTime time) {

optional<int> Dancing::assignCreatureIndex(Creature* creature, LocalTime time) {
for (int i : All(assignments))
if (assignments[i] == creature)
if (assignments[i] == creature->getUniqueId())
return i;
for (int i : All(assignments))
if (!assignments[i] || time - lastSeen.at(assignments[i]) > 20_visible) {
assignments[i] = creature;
if (!assignments[i].getGenericId() || time - lastSeen.getOrFail(assignments[i]) > 20_visible) {
assignments[i] = creature->getUniqueId();
return i;
}
return none;
Expand All @@ -64,7 +81,7 @@ optional<int> Dancing::assignCreatureIndex(Creature* creature, LocalTime time) {
int Dancing::getNumActive(LocalTime time) {
int res = 0;
for (auto& elem : assignments)
if (elem && time - lastSeen.at(elem) < 20_visible)
if (!!elem.getGenericId() && time - lastSeen.getOrFail(elem) < 20_visible)
++res;
return res;
}
Expand All @@ -81,7 +98,7 @@ optional<Position> Dancing::getTarget(Creature* creature) {
}
auto danceIndex = currentDanceInfo->index;
auto& curPos = positions[danceIndex];
lastSeen[creature] = time;
lastSeen.set(creature->getUniqueId(), time);
int numIterations = curPos.type == Positions::Type::FULL ? curPos.coord.size() : curPos.coord[0].size() * curPos.coord.size();
int iteration = (time - currentDanceInfo->startTime).getVisibleInt() % numIterations;
auto creatureIndex = assignCreatureIndex(creature, time);
Expand Down
8 changes: 6 additions & 2 deletions dancing.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
#include "util.h"
#include "game_time.h"
#include "position.h"
#include "unique_entity.h"
#include "entity_map.h"

RICH_ENUM(DancingPositionsType, CYCLE, FULL);

Expand Down Expand Up @@ -36,7 +38,9 @@ class Dancing {
void initializeCurrentDance(LocalTime);
optional<int> assignCreatureIndex(Creature*, LocalTime);
int getNumActive(LocalTime);
vector<Creature*> SERIAL(assignments);
map<Creature*, LocalTime> SERIAL(lastSeen);
vector<UniqueEntity<Creature>::Id> SERIAL(assignments);
EntityMap<Creature, LocalTime> SERIAL(lastSeen);
PositionSet SERIAL(area);
};

CEREAL_CLASS_VERSION(Dancing, 1);

0 comments on commit 769d190

Please sign in to comment.