diff options
Diffstat (limited to 'source/game/interfaces/StarLoungingEntities.cpp')
-rw-r--r-- | source/game/interfaces/StarLoungingEntities.cpp | 63 |
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; +} + +} |