Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/interfaces/StarLoungingEntities.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/game/interfaces/StarLoungingEntities.cpp')
-rw-r--r--source/game/interfaces/StarLoungingEntities.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/source/game/interfaces/StarLoungingEntities.cpp b/source/game/interfaces/StarLoungingEntities.cpp
new file mode 100644
index 0000000..6b2910d
--- /dev/null
+++ b/source/game/interfaces/StarLoungingEntities.cpp
@@ -0,0 +1,63 @@
+#include "StarLoungingEntities.hpp"
+#include "StarWorld.hpp"
+
+namespace Star {
+
+EnumMap<LoungeOrientation> const LoungeOrientationNames{{LoungeOrientation::None, "none"},
+ {LoungeOrientation::Sit, "sit"},
+ {LoungeOrientation::Lay, "lay"},
+ {LoungeOrientation::Stand, "stand"}};
+
+EnumMap<LoungeControl> const LoungeControlNames{{LoungeControl::Left, "Left"},
+ {LoungeControl::Right, "Right"},
+ {LoungeControl::Down, "Down"},
+ {LoungeControl::Up, "Up"},
+ {LoungeControl::Jump, "Jump"},
+ {LoungeControl::PrimaryFire, "PrimaryFire"},
+ {LoungeControl::AltFire, "AltFire"},
+ {LoungeControl::Special1, "Special1"},
+ {LoungeControl::Special2, "Special2"},
+ {LoungeControl::Special3, "Special3"}};
+
+EntityAnchorConstPtr LoungeableEntity::anchor(size_t anchorPositionIndex) const {
+ return loungeAnchor(anchorPositionIndex);
+}
+
+void LoungeableEntity::loungeControl(size_t, LoungeControl) {}
+
+void LoungeableEntity::loungeAim(size_t, Vec2F const&) {}
+
+Set<EntityId> LoungeableEntity::entitiesLoungingIn(size_t positionIndex) const {
+ Set<EntityId> loungingInEntities;
+ for (auto const& p : entitiesLounging()) {
+ if (p.second == positionIndex)
+ loungingInEntities.add(p.first);
+ }
+ return loungingInEntities;
+}
+
+Set<pair<EntityId, size_t>> LoungeableEntity::entitiesLounging() const {
+ Set<pair<EntityId, size_t>> loungingInEntities;
+ world()->forEachEntity(metaBoundBox().translated(position()),
+ [&](EntityPtr const& entity) {
+ if (auto lounger = as<LoungingEntity>(entity)) {
+ if (auto anchorStatus = lounger->loungingIn()) {
+ if (anchorStatus->entityId == entityId())
+ loungingInEntities.add({entity->entityId(), anchorStatus->positionIndex});
+ }
+ }
+ });
+ return loungingInEntities;
+}
+
+bool LoungingEntity::inConflictingLoungeAnchor() const {
+ if (auto loungeAnchorState = loungingIn()) {
+ if (auto loungeableEntity = world()->get<LoungeableEntity>(loungeAnchorState->entityId)) {
+ auto entitiesLoungingIn = loungeableEntity->entitiesLoungingIn(loungeAnchorState->positionIndex);
+ return entitiesLoungingIn.size() > 1 || !entitiesLoungingIn.contains(entityId());
+ }
+ }
+ return false;
+}
+
+}