Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/base/collision.cc')
-rw-r--r--src/game/base/collision.cc71
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
+