diff options
author | Stijn Buys <ingar@osirion.org> | 2008-09-28 15:05:13 +0000 |
---|---|---|
committer | Stijn Buys <ingar@osirion.org> | 2008-09-28 15:05:13 +0000 |
commit | fd778219e40c5fbb4d0af1839cbc313caaf10d9d (patch) | |
tree | b6e413f4c1a5ba4091503ba97c784278485d3933 /src/game/ship.cc | |
parent | bedcff956d253621ec00aa7d2919c22a4c88b0b2 (diff) |
move base game module to new subdirectory
Diffstat (limited to 'src/game/ship.cc')
-rw-r--r-- | src/game/ship.cc | 464 |
1 files changed, 0 insertions, 464 deletions
diff --git a/src/game/ship.cc b/src/game/ship.cc deleted file mode 100644 index 1828172..0000000 --- a/src/game/ship.cc +++ /dev/null @@ -1,464 +0,0 @@ -/* - game/ship.cc - This file is part of the Osirion project and is distributed under - the terms and conditions of the GNU General Public License version 2 -*/ - -#include <cmath> -#include <iostream> - -#include "auxiliary/functions.h" -#include "core/gameserver.h" -#include "core/entity.h" -#include "game/game.h" -#include "game/ship.h" -#include "math/functions.h" - - - -using math::degrees360f; -using math::degrees180f; - -namespace game { - -const float MIN_DELTA = 0.000001f; - -Ship::Ship(core::Player *owner, ShipModel *shipmodel) : - core::EntityControlable(owner, ship_enttype) -{ - entity_modelname = "ships/" + shipmodel->modelname(); - entity_name = shipmodel->name() + ": <^B" + owner->name() + "^N>"; - entity_label = shipmodel->label(); - - entity_moduletypeid = ship_enttype; - - entity_color = owner->color(); - entity_color_second = owner->color_second(); - - ship_shipmodel = shipmodel; - ship_jumpdrive = shipmodel->shipmodel_jumpdrive; - - ship_impulsedrive_timer = 0; - ship_jumpdrive_timer = 0; - - reset(); -} - -Ship::~Ship() -{ - -} - -void Ship::reset() -{ - current_target_direction = 0.0f; - current_target_pitch = 0.0f;; - current_target_roll = 0.0f; - current_target_strafe = 0.0f; - current_target_afterburner = 0.0f; -} -void Ship::impulse() -{ - if (entity_eventstate == core::Entity::Jump) { - return; - - } else if ((entity_eventstate == core::Entity::Impulse) || (entity_eventstate == core::Entity::ImpulseInitiate)) { - entity_eventstate = core::Entity::Normal; - - } else { - - if (entity_eventstate == core::Entity::JumpInitiate) { - ship_jumpdrive_timer = 0; - entity_timer = 0; - } - - entity_eventstate = core::Entity::ImpulseInitiate; - if (Game::instance()->g_devel->value()) { - entity_timer = 0; - } else { - entity_timer = 3; - } - ship_impulsedrive_timer = core::server()->time(); - entity_dirty = true; - } - - entity_dirty = true; -} - -void Ship::jump(std::string const &args) -{ - // devel mode provides instant jump access to arbitrary systems - if (Game::instance()->g_devel->value() && (args.size())) { - - core::Zone *jumptargetzone = 0; - std::string target; - std::istringstream is(args); - if (!(is >> target)) { - std::string helpstr; - for (core::Zone::Registry::iterator it = core::Zone::registry().begin(); it != core::Zone::registry().end(); it++) { - core::Zone *zone = (*it).second; - if (helpstr.size()) - helpstr.append("^N|^B"); - helpstr.append(zone->label()); - } - - core::server()->send(owner(), "Usage: jump [^B" + helpstr + "^N]"); - return; - } - - aux::to_lowercase(target); - jumptargetzone = core::Zone::find_zone(target); - if (!jumptargetzone) { - core::server()->send(owner(), "Unknown system '" + target + '\''); - return; - } - - if (jumptargetzone == zone()) { - core::server()->send(owner(), "Already in the " + jumptargetzone->name() + '.'); - return; - } - - core::server()->send(owner(), "Jumping to the " + jumptargetzone->name()); - set_zone(jumptargetzone); - if (owner()->control() == (EntityControlable*) this) - owner()->set_zone(jumptargetzone); - - ship_jumpdrive_timer = 0; - entity_timer = 0; - entity_eventstate = core::Entity::Jump; - entity_dirty = true; - return; - - } else { - if (!jumpdrive() && !Game::instance()->g_devel->value()) { - core::server()->send(owner(), "This ship is not equiped with a hyperspace drive!"); - return; - - } else if (entity_eventstate == core::Entity::Jump) { - return; - - } else if (entity_eventstate == core::Entity::JumpInitiate) { - core::server()->send(owner(), "Jump aborted, hyperspace drive deactivated."); - ship_jumpdrive_timer = 0; - entity_timer = 0; - entity_eventstate = core::Entity::Normal; - return; - } - - if (!find_closest_jumppoint()) { - return; - } - - entity_eventstate = core::Entity::JumpInitiate; - if (Game::instance()->g_devel->value()) { - entity_timer = 0; - } else { - entity_timer = 8; - } - - ship_jumpdrive_timer = core::server()->time(); - entity_dirty = true; - } -} - -JumpPoint * Ship::find_closest_jumppoint() -{ - // find closest jumppoint - float d = -1; - JumpPoint *jumppoint = 0; - for (core::Zone::Content::iterator it = zone()->content().begin(); it != zone()->content().end(); it++) { - core::Entity *entity = (*it); - if (entity->moduletype() == jumppoint_enttype) { - JumpPoint *te = static_cast<JumpPoint *>(entity); - float d1 = math::distance(location(), te->location()); - if ((d < 0) || (d1 < d)) { - d = d1; - jumppoint = te; - } - } - } - - if (jumppoint && jumppoint->target()) { - if (Game::instance()->g_jumppointrange->value() < d) { - core::server()->send(owner(), "Jumppoint out of range!"); - return 0; - } else { - core::server()->send(owner(), "Jumping to the " + jumppoint->target()->zone()->name()); - return jumppoint; - } - } else { - core::server()->send(owner(), "No jumppoints found!"); - return 0; - } - - return 0; -} - -void Ship::frame(float seconds) -{ - const float direction_change_speed = 2; - float cosangle; // cosine of an angle - float angle; // angle in radians - math::Vector3f n; // normal of a plane - - float actual_maxspeed = ship_shipmodel->maxspeed(); - float actual_turnspeed = ship_shipmodel->turnspeed(); - float actual_acceleration = ship_shipmodel->acceleration(); - - entity_movement = 0; - - // speed might get set to 0 on this update - if (entity_speed != 0.0f) - entity_dirty = true; - - // jumpdrive - // target axis - math::Axis target_axis(entity_axis); - - if (entity_eventstate == core::Entity::JumpInitiate) { - - if (ship_jumpdrive_timer + 1.0f <= core::server()->time()) { - entity_timer -= 1.0f; - - if (entity_timer <= 0) { - JumpPoint *jumppoint = find_closest_jumppoint(); - - if (jumppoint) { - set_zone(jumppoint->target()->zone()); - if (owner()->control() == (EntityControlable*) this) - owner()->set_zone(jumppoint->target()->zone()); - entity_eventstate = core::Entity::Jump; - entity_location.assign(jumppoint->target()->location() + location() - jumppoint->location()); - } else { - entity_eventstate = core::Entity::Normal; - } - ship_jumpdrive_timer = 0; - entity_timer = 0; - - entity_dirty = true; - return; - } else { - ship_jumpdrive_timer = core::server()->time(); - entity_dirty = true; - } - } - - // control is disabled while the jumpdrive is activated - target_thrust = 0; - target_pitch = 0; - target_roll = 0; - target_direction = 0; - target_afterburner = 0.0f; - target_thrust = 0; - - } else if (entity_eventstate == core::Entity::Jump) { - // control is disabled while the jumpdrive is activated - target_thrust = 0; - target_pitch = 0; - target_roll = 0; - target_direction = 0; - target_afterburner = 0.0f; - target_thrust = 0; - - // FIXME jump location and axis - math::Axis default_axis; - entity_axis.assign(default_axis); - entity_dirty = true; - - // FIXME 5 second cooldown - entity_eventstate = core::Entity::Normal; - - } else if (entity_eventstate == core::Entity::ImpulseInitiate) { - - if (ship_impulsedrive_timer + 1.0f <= core::server()->time()) { - entity_timer -= 1.0f; - - if (entity_timer <= 0) { - actual_maxspeed = Game::instance()->g_impulsespeed->value(); - actual_acceleration = Game::instance()->g_impulseacceleration->value(); - entity_eventstate = core::Entity::Impulse; - entity_timer = 0; - entity_dirty = true; - } else { - ship_impulsedrive_timer = core::server()->time(); - entity_dirty = true; - } - } - - // clamp input values - target_thrust = 0.0f; - math::clamp(target_pitch, -1.0f, 1.0f); - math::clamp(target_roll, -1.0f, 1.0f); - math::clamp(target_direction, -1.0f, 1.0f); - math::clamp(target_afterburner, -1.0f, 1.0f); - actual_turnspeed *= 0.5; - - } else if (entity_eventstate == core::Entity::Impulse) { - - // clamp input values - target_thrust = 0.0f; - math::clamp(target_pitch, -1.0f, 1.0f); - math::clamp(target_roll, -1.0f, 1.0f); - math::clamp(target_direction, -1.0f, 1.0f); - target_afterburner = 0.0f; - actual_maxspeed = Game::instance()->g_impulsespeed->value(); - actual_acceleration = Game::instance()->g_impulseacceleration->value(); - actual_turnspeed *= 0.5; - - } else if (entity_eventstate == core::Entity::Normal) { - - // clamp input values - math::clamp(target_thrust, 0.0f, 1.0f); - math::clamp(target_pitch, -1.0f, 1.0f); - math::clamp(target_roll, -1.0f, 1.0f); - math::clamp(target_direction, -1.0f, 1.0f); - math::clamp(target_afterburner, -1.0f, 1.0f); - - if (speed() > actual_maxspeed * 1.15f) { - actual_acceleration = Game::instance()->g_impulseacceleration->value(); - actual_turnspeed *= 0.5; - } - - } - - // update roll - if (current_target_roll < target_roll) { - current_target_roll += direction_change_speed * seconds; - if (current_target_roll > target_roll) - current_target_roll = target_roll; - } else if (current_target_roll > target_roll) { - current_target_roll -= direction_change_speed * seconds; - if (current_target_roll < target_roll) - current_target_roll = target_roll; - } - math::clamp(current_target_roll, -1.0f, 1.0f); - - if (fabs(current_target_roll) > MIN_DELTA) { - float roll_offset = seconds * current_target_roll; - entity_axis.change_roll(actual_turnspeed * roll_offset); - } else { - current_target_roll = 0.0f; - } - - // update target_axis direction - if (current_target_direction < target_direction) { - current_target_direction += direction_change_speed * seconds; - if (current_target_direction > target_direction) { - current_target_direction = target_direction; - } - } else if (current_target_direction > target_direction) { - current_target_direction -= direction_change_speed * seconds; - if (current_target_direction < target_direction) { - current_target_direction = target_direction; - } - } - - if (fabs(current_target_direction) > MIN_DELTA ) { - math::clamp(current_target_direction, -1.0f, 1.0f); - target_axis.change_direction(actual_turnspeed * current_target_direction); - } else { - current_target_direction = 0.0f; - } - - if (current_target_pitch < target_pitch) { - current_target_pitch += direction_change_speed * seconds; - if (current_target_pitch > target_pitch) - current_target_pitch = target_pitch; - } else if (current_target_pitch > target_pitch) { - current_target_pitch -= direction_change_speed * seconds; - if (current_target_pitch < target_pitch) - current_target_pitch = target_pitch; - } - - if (fabs(current_target_pitch) > MIN_DELTA) { - math::clamp(current_target_pitch, -1.0f, 1.0f); - target_axis.change_pitch(actual_turnspeed * current_target_pitch); - } else { - current_target_pitch = 0.0f; - } - - n.assign(math::crossproduct(entity_axis.forward(), target_axis.forward())); - if (!(n.length() < MIN_DELTA)) { - n.normalize(); - cosangle = math::dotproduct(entity_axis.forward(), target_axis.forward()); - angle = acos(cosangle) * seconds; // * 180.0f / M_PI; - if (angle > MIN_DELTA) - entity_axis.rotate(n, -angle); - } - - // update afterburner - if (current_target_afterburner < target_afterburner) { - current_target_afterburner += 2.0f * seconds; - if (current_target_afterburner > target_afterburner) - current_target_afterburner = target_afterburner; - } else if (current_target_afterburner > target_afterburner) { - current_target_afterburner -= 2.0f * seconds; - if (current_target_afterburner < target_afterburner) - current_target_afterburner = target_afterburner; - } - - // update thrust - if (current_target_afterburner < 0.0f) { - target_thrust = 0; - } - - if (entity_thrust < target_thrust) { - entity_thrust += seconds * 0.5f; - if (entity_thrust > target_thrust) - entity_thrust = target_thrust; - } else if (entity_thrust > target_thrust) { - entity_thrust -= seconds * 0.5f; - if (entity_thrust < target_thrust) - entity_thrust = target_thrust; - } - math::clamp(entity_thrust, 0.0f, 1.0f); - float actual_thrust = entity_thrust + current_target_afterburner * 0.15f; - - if ((entity_eventstate == core::Entity::ImpulseInitiate) || (entity_eventstate == core::Entity::Impulse)) { - actual_thrust = 1.0f; - } - - // update speed - if (entity_speed < actual_thrust * actual_maxspeed) { - entity_speed += actual_acceleration * seconds; - if (entity_speed > actual_thrust * actual_maxspeed) { - entity_speed = actual_thrust * actual_maxspeed; - } - } else if(entity_speed > actual_thrust * actual_maxspeed) { - entity_speed -= actual_acceleration * seconds; - if (entity_speed < actual_thrust * actual_maxspeed) { - entity_speed = actual_thrust * actual_maxspeed; - } - } - - // update strafe - if (current_target_strafe < target_strafe) { - current_target_strafe += 2.0f * seconds; - if (current_target_strafe > target_strafe) - current_target_strafe = target_strafe; - } else if (current_target_strafe > target_strafe) { - current_target_strafe -= 2.0f * seconds; - if (current_target_strafe < target_strafe) - current_target_strafe = target_strafe; - } - - if (fabs(current_target_strafe) > MIN_DELTA) { - entity_location += entity_axis.left() * (current_target_strafe * Game::instance()->g_strafespeed->value()); - } - - entity_movement = target_thrust; - entity_movement = math::max(entity_movement, fabs(current_target_pitch)); - entity_movement = math::max(entity_movement, fabs(current_target_direction)); - entity_movement = math::max(entity_movement, fabs(current_target_roll)); - entity_movement = math::max(entity_movement, fabs(current_target_afterburner)); - entity_movement = math::max(entity_movement, fabs(current_target_strafe)); - - if (entity_speed) { - entity_location += entity_axis.forward() * entity_speed * seconds; - entity_dirty = true; - } else if (entity_movement > 0.0f) { - entity_dirty = true; - } -} - -} // namespace game |