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')
-rw-r--r--src/game/base/game.cc23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/game/base/game.cc b/src/game/base/game.cc
index 18b5497..c171711 100644
--- a/src/game/base/game.cc
+++ b/src/game/base/game.cc
@@ -832,13 +832,26 @@ void Game::func_goto(core::Player *player, const std::string &args)
Ship *ship = static_cast<Ship *>(player->control());
if (dock) {
- if (dock->type() == core::Entity::Globe)
+ if (dock->type() == core::Entity::Globe) {
+ // target is a planet: keep a safe distance
ship->get_location().assign(dock->location() + (dock->axis().forward() *(planet_safe_distance + ship->radius() + dock->radius())));
- else
- ship->get_location().assign(dock->location() + (dock->axis().forward() *(ship->radius() + dock->radius())));
+ ship->get_axis().assign(dock->axis());
+ ship->get_axis().change_direction(180.0f);
- ship->get_axis().assign(dock->axis());
- ship->get_axis().change_direction(180.0f);
+ } if (dock->type() == core::Entity::Controlable) {
+ // target is a controlable: appear above it
+
+ // FIxME target might be docked -> requires ship docked_at awareness
+ // we might want to match the target's state() and speed()
+ ship->get_location().assign(dock->location() + (dock->axis().up() *(ship->radius() + dock->radius())));
+ ship->get_axis().assign(dock->axis());
+
+ } else {
+ // targe is something else, appear in front of it
+ ship->get_location().assign(dock->location() + (dock->axis().forward() *(ship->radius() + dock->radius())));
+ ship->get_axis().assign(dock->axis());
+ ship->get_axis().change_direction(180.0f);
+ }
ship->set_state(core::Entity::Normal);
ship->reset();