diff options
Diffstat (limited to 'src/game/base/collision.cc')
-rw-r--r-- | src/game/base/collision.cc | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/src/game/base/collision.cc b/src/game/base/collision.cc new file mode 100644 index 0000000..894ce95 --- /dev/null +++ b/src/game/base/collision.cc @@ -0,0 +1,71 @@ +/* + base/collision.cc + This file is part of the Osirion project and is distributed under + the terms of the GNU General Public License version 2. +*/ + +#include "base/collision.h" +#include "base/game.h" +#include "core/zone.h" +#include "math/functions.h" +#include "math/vector3f.h" + +namespace game { + +void Collision::distance_test(core::EntityControlable *first, core::Entity *second) +{ + if (!first->owner()) + return; + + if (first->eventstate() == core::Entity::Docked) + return; + + // FIXME - use distancesquared + const float d = math::distance(first->location(), second->location()); + const float r = first->radius() + second->radius(); + + if (second->type() == core::Entity::Globe) { + // collision with a star or a planet + + if ( (d-r) < 0.0f) { + // crash zone + if (first->owner()->last_warning() + 5.0f < core::application()->time()) { + first->owner()->send_warning("^RBOOM!^N"); + } + } else if (first->owner()->last_warning() + 5.0f < core::application()->time()) { + // warning zone: star corona or planet atmosphere + if ((second->moduletype() == star_enttype) && (d-r < 50.0f)) { + first->owner()->send_warning("^3Warning: entering star corona!^N"); + } else if ((second->moduletype() == planet_enttype) && (d-r < 15.0f)) { + first->owner()->send_warning("^3Warning: hard landing imminent!^N"); + } + } + } +} + +void Collision::frame_zone(core::Zone *zone) +{ + core::Zone::Content::iterator first; + core::Zone::Content::iterator second; + + for (first = zone->content().begin(); first != zone->content().end(); first ++) { + second = first; + for (second++; second != zone->content().end(); second++) { + if ( (*first)->type() == core::Entity::Controlable) { + distance_test(static_cast<core::EntityControlable *>((*first)), (*second)); + } else if ((*second)->type() == core::Entity::Controlable) { + distance_test(static_cast<core::EntityControlable *> ((*second)), (*first)); + } + } + } +} + +void Collision::frame(const float elapsed) +{ + for (core::Zone::Registry::iterator it = core::Zone::registry().begin(); it != core::Zone::registry().end(); it++) { + frame_zone((*it).second); + } +} + +} // namespace game + |