Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-11-09 21:45:18 +0000
committerStijn Buys <ingar@osirion.org>2008-11-09 21:45:18 +0000
commita1eb1b4dc4d81df724ee43fc4e895dd22e81760f (patch)
tree5d53a557540147e1e981c5cd3c6be8ccc8448381 /src/game
parent568e868ef43cc79ad277ec5ab2c3e08647725131 (diff)
working jumpgates
Diffstat (limited to 'src/game')
-rw-r--r--src/game/base/Makefile.am4
-rw-r--r--src/game/base/game.cc (renamed from src/game/base/base.cc)210
-rw-r--r--src/game/base/game.h (renamed from src/game/base/base.h)11
-rw-r--r--src/game/base/jumppoint.cc84
-rw-r--r--src/game/base/jumppoint.h30
-rw-r--r--src/game/base/navpoint.cc4
-rw-r--r--src/game/base/navpoint.h2
-rw-r--r--src/game/base/planet.cc4
-rw-r--r--src/game/base/planet.h2
-rw-r--r--src/game/base/racetrack.cc4
-rw-r--r--src/game/base/racetrack.h2
-rw-r--r--src/game/base/ship.cc101
-rw-r--r--src/game/base/ship.h22
-rw-r--r--src/game/base/shipmodel.cc2
-rw-r--r--src/game/base/shipmodel.h2
-rw-r--r--src/game/base/star.cc4
-rw-r--r--src/game/base/star.h2
-rw-r--r--src/game/game.cc16
-rw-r--r--src/game/game.h5
19 files changed, 318 insertions, 193 deletions
diff --git a/src/game/base/Makefile.am b/src/game/base/Makefile.am
index a8258b2..1b80e72 100644
--- a/src/game/base/Makefile.am
+++ b/src/game/base/Makefile.am
@@ -2,7 +2,7 @@ INCLUDES = -I$(top_srcdir)/src -I$(top_srcdir)/src/game
METASOURCES = AUTO
libbase_la_LDFLAGS = -avoid-version
noinst_LTLIBRARIES = libbase.la
-libbase_la_SOURCES = base.cc jumppoint.cc navpoint.cc planet.cc racetrack.cc \
+libbase_la_SOURCES = game.cc jumppoint.cc navpoint.cc planet.cc racetrack.cc \
ship.cc shipmodel.cc star.cc
-noinst_HEADERS = base.h jumppoint.h navpoint.h planet.h racetrack.h ship.h \
+noinst_HEADERS = game.h jumppoint.h navpoint.h planet.h racetrack.h ship.h \
shipmodel.h star.h
diff --git a/src/game/base/base.cc b/src/game/base/game.cc
index 58b89a2..d20dd8c 100644
--- a/src/game/base/base.cc
+++ b/src/game/base/game.cc
@@ -1,5 +1,5 @@
/*
- base/base.cc
+ base/game.cc
This file is part of the Osirion project and is distributed under
the terms of the GNU General Public License version 2
*/
@@ -14,7 +14,7 @@
#include "core/descriptions.h"
#include "filesystem/filesystem.h"
#include "filesystem/inifile.h"
-#include "base/base.h"
+#include "base/game.h"
#include "base/navpoint.h"
#include "base/jumppoint.h"
#include "base/planet.h"
@@ -24,34 +24,34 @@
#include "math/mathlib.h"
#include "sys/sys.h"
-namespace base
+namespace game
{
/* -- class Base static members ----------------------------------- */
// game variables
-core::Cvar *Base::g_impulsespeed = 0;
-core::Cvar *Base::g_impulseacceleration = 0;
-core::Cvar *Base::g_strafespeed = 0;
-core::Cvar *Base::g_jumppointrange = 0;
-core::Cvar *Base::g_devel = 0;
+core::Cvar *Game::g_impulsespeed = 0;
+core::Cvar *Game::g_impulseacceleration = 0;
+core::Cvar *Game::g_strafespeed = 0;
+core::Cvar *Game::g_jumppointrange = 0;
+core::Cvar *Game::g_devel = 0;
-core::Zone *Base::default_zone = 0;
-ShipModel *Base::default_shipmodel = 0;
+core::Zone *Game::default_zone = 0;
+ShipModel *Game::default_shipmodel = 0;
// list the ship model registry
-void Base::func_list_ship(std::string const &args)
+void Game::func_list_ship(std::string const &args)
{
ShipModel::list();
}
// a player joins the game
-void Base::func_join(core::Player *player, std::string const &args)
+void Game::func_join(core::Player *player, std::string const &args)
{
if (player->control())
return;
- Ship *ship = new Ship(player, Base::default_shipmodel);
+ Ship *ship = new Ship(player, Game::default_shipmodel);
ship->set_zone(player->zone());
player->set_control(ship);
@@ -68,14 +68,14 @@ void Base::func_join(core::Player *player, std::string const &args)
message.append("^B joins the game.");
core::server()->broadcast(message);
- player->send("^BYou received " + aux::article(Base::default_shipmodel->name()));
+ player->send("^BYou received " + aux::article(Game::default_shipmodel->name()));
player->sound("game/buy-ship");
player->player_dirty = true;
}
// a player joins the spectators
-void Base::func_spectate(core::Player *player, std::string const &args)
+void Game::func_spectate(core::Player *player, std::string const &args)
{
if (!player->control())
return;
@@ -90,13 +90,13 @@ void Base::func_spectate(core::Player *player, std::string const &args)
}
if (!player->zone())
- player->set_zone(Base::default_zone);
+ player->set_zone(Game::default_zone);
player->set_view(0);
}
// a player buys a ship
-void Base::func_buy(core::Player *player, std::string const &args)
+void Game::func_buy(core::Player *player, std::string const &args)
{
if (!g_devel->value() && !player->view()) {
player->send("Cheats disabled.");
@@ -151,10 +151,10 @@ void Base::func_buy(core::Player *player, std::string const &args)
}
// a player sends standard hails
-void Base::func_hail(core::Player *player, std::string const &args)
+void Game::func_hail(core::Player *player, std::string const &args)
{
if (player->mute()) {
- player->send("You have been muted.");
+ player->send("^WYou have been muted");
return;
}
@@ -167,41 +167,41 @@ void Base::func_hail(core::Player *player, std::string const &args)
core::Player *targetplayer = core::server()->find_player(target);
if (!targetplayer) {
- player->send("Player " + target + "^N not found.");
+ player->send("Player " + target + "^N not found");
return;
}
- player->send("^BYou hail " + targetplayer->name() + "^B.");
+ player->send("^BYou hail " + targetplayer->name());
player->sound("com/hail");
- targetplayer->send("^B" + player->name() + "^B hails you!");
+ targetplayer->send("^B" + player->name() + "^B hails you");
targetplayer->sound("com/hail");
}
// a player actives the hyperspace jump drive on his ship
-void Base::func_jump(core::Player *player, std::string const &args)
+void Game::func_jump(core::Player *player, std::string const &args)
{
if (!player->control())
return;
if (!player->control()->moduletype() == ship_enttype)
return;
Ship * ship = static_cast<Ship *>(player->control());
- ship->jump(args);
+ ship->func_jump(args);
}
// a player actives the kinetic impulse drive on his ship
-void Base::func_impulse(core::Player *player, std::string const &args)
+void Game::func_impulse(core::Player *player, std::string const &args)
{
if (!player->control())
return;
if (!player->control()->moduletype() == ship_enttype)
return;
Ship * ship = static_cast<Ship *>(player->control());
- ship->impulse();
+ ship->func_impulse();
}
// a player sends a docking request
-void Base::func_dock(core::Player *player,core::Entity *entity)
+void Game::func_dock(core::Player *player,core::Entity *entity)
{
if (!player->control())
return;
@@ -215,19 +215,39 @@ void Base::func_dock(core::Player *player,core::Entity *entity)
if (player->control()->eventstate() == core::Entity::Docked)
return;
- if (math::distance(entity->location(), player->control()->location()) > 2.0f * (entity->radius() + player->control()->radius())) {
- player->send("Target out of range!");
+ if (math::distance(entity->location(), player->control()->location()) > 2.0f * (entity->radius()+player->control()->radius())) {
+ player->send("Target out of range");
return;
}
- player->control()->location().assign(entity->location());
- player->control()->set_eventstate(core::Entity::Docked);
- player->set_view(entity);
- player->send("^BDocking at " + entity->name() + "^B...");
+ if (entity->moduletype() == jumpgate_enttype) {
+ JumpGate *jumpgate = static_cast<JumpGate *>(entity);
+ if (jumpgate->target()) {
+ if (jumpgate->activated()) {
+ player->send("Jumpgate in use");
+ return;
+ }
+ player->set_view(jumpgate);
+ Ship * ship = static_cast<Ship *>(player->control());
+ ship->initiate_jump(jumpgate);
+ jumpgate->activate();
+ if (jumpgate->target()->moduletype() == jumpgate_enttype) {
+ static_cast<JumpGate *>(jumpgate->target())->activate();
+ }
+ } else {
+ player->send("Jumpgate inactive.");
+ }
+ } else {
+
+ player->control()->location().assign(entity->location());
+ player->control()->set_eventstate(core::Entity::Docked);
+ player->set_view(entity);
+ player->send("^BDocking at " + entity->name());
+ }
}
// launch request
-void Base::func_launch(core::Player *player, std::string const &args)
+void Game::func_launch(core::Player *player, std::string const &args)
{
if (!player->control())
return;
@@ -245,55 +265,62 @@ void Base::func_launch(core::Player *player, std::string const &args)
player->control()->entity_axis.assign(dock->axis());
player->control()->set_eventstate(core::Entity::Normal);
player->set_view(0);
+
+ player->send("^BLaunching from " + dock->name());
}
// instantaniously goto a specified entity within the zone
-void Base::func_goto(core::Player *player, const std::string &args)
+void Game::func_goto(core::Player *player, const std::string &args)
{
if (!args.size())
return;
if (!g_devel->value()) {
- player->send("Cheats disabled.");
+ player->send("Cheats disabled");
return;
}
if (!player->control())
return;
+ core::Entity *dock = 0;
std::string label(args);
aux::to_label(label);
core::Zone *zone = player->control()->zone();
for (core::Zone::Content::iterator it = zone->content().begin(); it != zone->content().end(); it ++) {
- core::Entity *dock = (*it);
- std::string str(dock->label());
+ std::string str((*it)->label());
aux::to_label(str);
if (str.find(label) != std::string::npos) {
- player->control()->entity_location.assign(dock->location() + (dock->axis().forward() * (player->control()->radius()+dock->radius())*2.0f));
- player->control()->entity_axis.assign(dock->axis());
- player->control()->entity_axis.change_direction(180.0f);
- player->control()->set_eventstate(core::Entity::Normal);
- player->set_view(0);
- return;
+ dock = (*it);
}
}
- player->send("Entity '" + args + "' not found.");
+
+ if (dock) {
+ player->control()->entity_location.assign(dock->location() + (dock->axis().forward() * (player->control()->radius()+dock->radius())*2.0f));
+ player->control()->entity_axis.assign(dock->axis());
+ player->control()->entity_axis.change_direction(180.0f);
+ player->control()->set_eventstate(core::Entity::Normal);
+ player->set_view(0);
+ player->send("Going to " + dock->name());
+ } else {
+ player->send("Entity '" + args + "' not found");
+ }
}
/* -- class Base -------------------------------------------------- */
-Base::Base() : core::Module("base", "Project::OSiRiON", true)
+Game::Game() : core::Module("base", "Project::OSiRiON", true)
{
default_shipmodel = 0;
default_zone = 0;
}
-Base::~Base()
+Game::~Game()
{
}
-void Base::init()
+void Game::init()
{
ShipModel::clear();
@@ -310,34 +337,34 @@ void Base::init()
// add engine functions
core::Func *func = 0;
- func = core::Func::add("list_ship", Base::func_list_ship);
+ func = core::Func::add("list_ship", Game::func_list_ship);
func->set_info("list ship statistics");
- func = core::Func::add("join", Base::func_join);
+ func = core::Func::add("join", Game::func_join);
func->set_info("join the game");
- func = core::Func::add("hail", Base::func_hail);
+ func = core::Func::add("hail", Game::func_hail);
func->set_info("send a standard hail");
- func = core::Func::add("spectate", Base::func_spectate);
+ func = core::Func::add("spectate", Game::func_spectate);
func->set_info("leave the game and spectate");
- func = core::Func::add("buy", Base::func_buy);
+ func = core::Func::add("buy", Game::func_buy);
func->set_info("buy a ship");
- func = core::Func::add("jump", Base::func_jump);
+ func = core::Func::add("jump", Game::func_jump);
func->set_info("[string] activate or deactivate hyperspace jump drive");
- func = core::Func::add("impulse", Base::func_impulse);
+ func = core::Func::add("impulse", Game::func_impulse);
func->set_info("activate are deactive kinetic impulse drive");
- func = core::Func::add("launch", Base::func_launch);
+ func = core::Func::add("launch", Game::func_launch);
func->set_info("launch to space when docked");
- func = core::Func::add("goto", Base::func_goto);
+ func = core::Func::add("goto", Game::func_goto);
func->set_info("[string] goto to an entity within the zone");
- func = core::Func::add("@dock", Base::func_dock);
+ func = core::Func::add("@dock", Game::func_dock);
func->set_info("dock with target object");
// add engine variables
@@ -357,7 +384,7 @@ void Base::init()
g_devel->set_info("[bool] enable or disable developer mode");
}
-void Base::shutdown()
+void Game::shutdown()
{
g_impulsespeed = 0;
// game functions are automaticly removed
@@ -368,7 +395,7 @@ void Base::shutdown()
ShipModel::clear();
}
-bool Base::load_world()
+bool Game::load_world()
{
std::string inifilename("world");
@@ -439,7 +466,7 @@ bool Base::load_world()
return true;
}
-bool Base::load_zone(core::Zone *zone)
+bool Game::load_zone(core::Zone *zone)
{
using math::Vector3f;
using math::Color;
@@ -490,6 +517,11 @@ bool Base::load_zone(core::Zone *zone)
navpoint->set_zone(zone);
count ++;
+ } else if (zoneini.got_section("jumpgate")) {
+ jumppoint = new JumpGate();
+ jumppoint->set_zone(zone);
+ count ++;
+
} else if (zoneini.got_section("jumppoint")) {
jumppoint = new JumpPoint();
jumppoint->set_zone(zone);
@@ -553,10 +585,11 @@ bool Base::load_zone(core::Zone *zone)
zoneini.unkown_key();
}
- } else if (zoneini.in_section("jumppoint")) {
+ } else if (zoneini.in_section("jumppoint") || zoneini.in_section("jumpgate")) {
if (core::Parser::got_entity_key(zoneini, jumppoint)) {
continue;
- } else if (zoneini.got_key_string("target", jumppoint->jumppoint_targetlabel)) {
+ } else if (zoneini.got_key_string("target", strval)) {
+ jumppoint->set_targetlabel(strval);
continue;
} else {
zoneini.unkown_key();
@@ -628,49 +661,20 @@ bool Base::load_zone(core::Zone *zone)
return true;
}
-bool Base::validate_zone(core::Zone *zone)
+bool Game::validate_zone(core::Zone *zone)
{
con_debug << " validating " << zone->name() << std::endl;
for (core::Zone::Content::iterator it = zone->content().begin(); it != zone->content().end(); it++) {
core::Entity *entity = (*it);
-
if (entity->entity_moduletypeid == jumppoint_enttype) {
+ // validate jump points
JumpPoint *jumppoint = static_cast<JumpPoint *>(entity);
-
- if (jumppoint->targetlabel().size() < 3) {
- con_warn << " Jumppoint with invalid target label '" << jumppoint->targetlabel() << "'\n";
- continue;
- }
- size_t pos = jumppoint->targetlabel().find(':');
- if ((pos < 1 ) || (pos >= (jumppoint->targetlabel().size()-1))) {
- con_warn << " Jumppoint with invalid target label '" << jumppoint->targetlabel() << "'\n";
- continue;
- }
-
- std::string zonelabel(jumppoint->targetlabel().substr(0, pos));
- std::string entitylabel(jumppoint->targetlabel().substr(pos+1, jumppoint->targetlabel().size()-pos));
-
- core::Zone *targetzone = core::Zone::find(zonelabel);
- if (!targetzone) {
- con_warn << " Jumppoint with invalid target zone '" << zonelabel << "'\n";
- continue;
- }
-
- core::Entity *targetentity = targetzone->find_entity(entitylabel);
- if (!targetentity) {
- con_warn << " Could not find target jumppoint '" << entitylabel << "'\n";
- continue;
- }
-
- if (targetentity->moduletype() != jumppoint_enttype) {
- con_warn << " Jumppoint with invalid target jumppoint '" << entitylabel << "'\n";
- continue;
- }
-
- jumppoint->jumppoint_target = static_cast<JumpPoint *>(targetentity);
-
- //con_debug << " Jumppoint " << zone->label() << ":" << jumppoint->label() << " with target " << jumppoint->targetlabel() << std::endl;
+ jumppoint->validate();
+ } else if (entity->entity_moduletypeid == jumpgate_enttype) {
+ // validate jump gate
+ JumpGate *jumpgate = static_cast<JumpGate *>(entity);
+ jumpgate->validate();
}
}
@@ -678,7 +682,7 @@ bool Base::validate_zone(core::Zone *zone)
}
// read ship model specifications
-bool Base::load_ships()
+bool Game::load_ships()
{
using math::Vector3f;
using math::Color;
@@ -746,13 +750,13 @@ bool Base::load_ships()
return true;
}
-void Base::frame(float seconds)
+void Game::frame(float seconds)
{
if (!running())
return;
}
-void Base::player_connect(core::Player *player)
+void Game::player_connect(core::Player *player)
{
std::string args;
player->set_zone(default_zone);
@@ -761,7 +765,7 @@ void Base::player_connect(core::Player *player)
func_spectate(player, args);
}
-void Base::player_disconnect(core::Player *player)
+void Game::player_disconnect(core::Player *player)
{
player->remove_asset(player->control());
}
diff --git a/src/game/base/base.h b/src/game/base/game.h
index 926060c..bc9d1f7 100644
--- a/src/game/base/base.h
+++ b/src/game/base/game.h
@@ -1,5 +1,5 @@
/*
- base/base.h
+ base/game.h
This file is part of the Osirion project and is distributed under
the terms of the GNU General Public License version 2
*/
@@ -20,7 +20,7 @@
/// the base game module
/** the base game module contains the game-specific code for Project::OSiRiON
*/
-namespace base
+namespace game
{
// entity type constants
@@ -30,12 +30,13 @@ const unsigned int planet_enttype = 258;
const unsigned int navpoint_enttype = 259;
const unsigned int jumppoint_enttype = 260;
const unsigned int jumpgate_enttype = 261;
+const unsigned int station_enttype = 262;
/// the base Project::OSiRiON game model
-class Base : public core::Module {
+class Game : public core::Module {
public:
- Base();
- ~Base();
+ Game();
+ ~Game();
/// run one time frame
void frame(float seconds);
diff --git a/src/game/base/jumppoint.cc b/src/game/base/jumppoint.cc
index da221cf..fcf20d6 100644
--- a/src/game/base/jumppoint.cc
+++ b/src/game/base/jumppoint.cc
@@ -4,13 +4,15 @@
the terms and conditions of the GNU General Public License version 2
*/
-#include "base/base.h"
+#include "base/game.h"
#include "base/jumppoint.h"
-namespace base
+namespace game
{
-JumpPoint::JumpPoint() : core::Entity(core::Entity::Static | core::Entity::Bright)
+/* ---- class JumpPoint -------------------------------------------- */
+
+JumpPoint::JumpPoint() : core::EntityDynamic(core::Entity::Static | core::Entity::Bright)
{
entity_shape = core::Entity::Diamond;
entity_color.assign(0.0f, 0.8f, 0.8f, 1.0f);
@@ -26,4 +28,80 @@ JumpPoint::~JumpPoint()
{
}
+void JumpPoint::set_targetlabel(const std::string &label)
+{
+ jumppoint_targetlabel.assign(label);
+}
+
+void JumpPoint::validate()
+{
+ jumppoint_target = 0;
+
+ if (targetlabel().size() < 3) {
+ con_warn << " Jumppoint with invalid target label '" << targetlabel() << "'\n";
+ return;
+ }
+ size_t pos = targetlabel().find(':');
+ if ((pos < 1 ) || (pos >= (targetlabel().size()-1))) {
+ con_warn << " Jumppoint with invalid target label '" << targetlabel() << "'\n";
+ return;
+ }
+
+ std::string zonelabel(targetlabel().substr(0, pos));
+ std::string entitylabel(targetlabel().substr(pos+1, targetlabel().size()-pos));
+
+ core::Zone *targetzone = core::Zone::find(zonelabel);
+ if (!targetzone) {
+ con_warn << " Jumppoint with invalid target zone '" << zonelabel << "'\n";
+ return;
+ }
+
+ core::Entity *targetentity = targetzone->find_entity(entitylabel);
+ if (!targetentity) {
+ con_warn << " Could not find target jumppoint '" << entitylabel << "'\n";
+ return;
+ }
+
+ if ((targetentity->moduletype() != jumppoint_enttype) && (targetentity->moduletype() != jumpgate_enttype)) {
+ con_warn << " Jumppoint with invalid target jumppoint '" << entitylabel << "'\n";
+ return;
+ }
+
+ jumppoint_target = static_cast<JumpPoint *>(targetentity);
+
+ //con_debug << " Jumppoint " << zone->label() << ":" << label() << " with target " << targetlabel() << std::endl;
+}
+
+/* ---- class JumpGate --------------------------------------------- */
+
+JumpGate::JumpGate() : JumpPoint()
+{
+ unset_flag(core::Entity::Bright);
+ entity_radius = 1.0f;
+ entity_moduletypeid = jumpgate_enttype;
+ set_flag(core::Entity::Dockable);
+
+ entity_eventstate = core::Entity::NoPower;
+}
+
+JumpGate::~JumpGate()
+{
+}
+
+void JumpGate::activate()
+{
+ jumpgate_timer = 10.0f;
+ entity_eventstate = core::Entity::Normal;
+}
+
+void JumpGate::frame(float elapsed)
+{
+ if (jumpgate_timer > 0)
+ jumpgate_timer -= elapsed;
+
+ if (jumpgate_timer < 0) {
+ entity_eventstate = core::Entity::NoPower;
+ }
+}
+
}
diff --git a/src/game/base/jumppoint.h b/src/game/base/jumppoint.h
index 4680832..626a4ad 100644
--- a/src/game/base/jumppoint.h
+++ b/src/game/base/jumppoint.h
@@ -12,28 +12,50 @@
#include <string>
-namespace base {
+namespace game {
-/// a jump point
+/// a jumppoint
/**
* jumppoints are used to define hyperspace routes between systems
* when a ship actives the jump drive, a jump point will be opened
* between the current system and the target of the nearest jumppoint.
*
*/
-class JumpPoint : public core::Entity {
+class JumpPoint : public core::EntityDynamic {
public:
JumpPoint();
~JumpPoint();
inline std::string const & targetlabel() { return jumppoint_targetlabel; }
+
inline JumpPoint *target() { return jumppoint_target; }
- std::string jumppoint_targetlabel;
+ /// set trget label
+ void set_targetlabel(const std::string &label);
+
+ /// validate the targetlabel and set target()
+ void validate();
+private:
+ std::string jumppoint_targetlabel;
JumpPoint *jumppoint_target;
};
+/// a jumpgate
+class JumpGate : public JumpPoint {
+public:
+ JumpGate();
+ virtual ~JumpGate();
+
+ inline bool activated() const { return (jumpgate_timer > 0); }
+
+ void activate();
+
+ virtual void frame(float elapsed);
+private:
+ float jumpgate_timer;
+};
+
}
#endif // __INCLUDED_BASE_JUMPPOINT_H__
diff --git a/src/game/base/navpoint.cc b/src/game/base/navpoint.cc
index 560962c..a8e44dc 100644
--- a/src/game/base/navpoint.cc
+++ b/src/game/base/navpoint.cc
@@ -5,9 +5,9 @@
*/
#include "base/navpoint.h"
-#include "base/base.h"
+#include "base/game.h"
-namespace base
+namespace game
{
NavPoint::NavPoint() : core::Entity(core::Entity::Static | core::Entity::Bright)
diff --git a/src/game/base/navpoint.h b/src/game/base/navpoint.h
index 7ea505d..c2fb1d6 100644
--- a/src/game/base/navpoint.h
+++ b/src/game/base/navpoint.h
@@ -12,7 +12,7 @@
#include <string>
-namespace base {
+namespace game {
/// a navigation point
class NavPoint : public core::Entity {
diff --git a/src/game/base/planet.cc b/src/game/base/planet.cc
index 83f3d65..26ba20f 100644
--- a/src/game/base/planet.cc
+++ b/src/game/base/planet.cc
@@ -4,11 +4,11 @@
the terms of the GNU General Public License version 2.
*/
-#include "base/base.h"
+#include "base/game.h"
#include "base/planet.h"
-namespace base {
+namespace game {
Planet::Planet() : core::EntityGlobe(core::Entity::Static | core::Entity::Solid)
{
diff --git a/src/game/base/planet.h b/src/game/base/planet.h
index 005157d..89b4387 100644
--- a/src/game/base/planet.h
+++ b/src/game/base/planet.h
@@ -12,7 +12,7 @@
#include <string>
-namespace base {
+namespace game {
/// a planet
class Planet : public core::EntityGlobe {
diff --git a/src/game/base/racetrack.cc b/src/game/base/racetrack.cc
index ee2ecc7..46a7c86 100644
--- a/src/game/base/racetrack.cc
+++ b/src/game/base/racetrack.cc
@@ -10,7 +10,7 @@
#include "base/racetrack.h"
#include "core/gameserver.h"
-namespace base {
+namespace game {
/* ---- class CheckPoint ------------------------------------------- */
@@ -35,7 +35,7 @@ CheckPoint::~CheckPoint()
/* ---- class RaceTrack -------------------------------------------- */
-RaceTrack::RaceTrack()
+RaceTrack::RaceTrack() : EntityDynamic()
{
track_player = 0;
track_racestart = 0;
diff --git a/src/game/base/racetrack.h b/src/game/base/racetrack.h
index b5b5dad..1f93bdc 100644
--- a/src/game/base/racetrack.h
+++ b/src/game/base/racetrack.h
@@ -13,7 +13,7 @@
#include <string>
-namespace base {
+namespace game {
class CheckPoint;
diff --git a/src/game/base/ship.cc b/src/game/base/ship.cc
index c7a5eda..3e4db42 100644
--- a/src/game/base/ship.cc
+++ b/src/game/base/ship.cc
@@ -10,7 +10,7 @@
#include "auxiliary/functions.h"
#include "core/gameserver.h"
#include "core/entity.h"
-#include "base/base.h"
+#include "base/game.h"
#include "base/ship.h"
#include "math/functions.h"
@@ -19,7 +19,7 @@
using math::degrees360f;
using math::degrees180f;
-namespace base {
+namespace game {
const float MIN_DELTA = 0.000001f;
@@ -40,6 +40,7 @@ Ship::Ship(core::Player *owner, ShipModel *shipmodel) :
ship_impulsedrive_timer = 0;
ship_jumpdrive_timer = 0;
+ ship_jumpdepart = 0;
reset();
}
@@ -57,7 +58,7 @@ void Ship::reset()
current_target_strafe = 0.0f;
current_target_afterburner = 0.0f;
}
-void Ship::impulse()
+void Ship::func_impulse()
{
if ((entity_eventstate == core::Entity::Impulse) || (entity_eventstate == core::Entity::ImpulseInitiate)) {
entity_eventstate = core::Entity::Normal;
@@ -72,7 +73,7 @@ void Ship::impulse()
}
entity_eventstate = core::Entity::ImpulseInitiate;
- if (Base::g_devel->value()) {
+ if (Game::g_devel->value()) {
entity_timer = 0;
} else {
entity_timer = 3;
@@ -84,14 +85,37 @@ void Ship::impulse()
entity_dirty = true;
}
-void Ship::jump(std::string const &args)
+void Ship::initiate_jump(JumpPoint *depart)
+{
+ ship_jumpdepart = 0;
+
+ if (!depart)
+ return;
+
+ if (!depart->target())
+ return;
+
+ ship_jumpdepart = depart;
+ entity_eventstate = core::Entity::JumpInitiate;
+
+ if (Game::g_devel->value()) {
+ entity_timer = 0;
+ } else {
+ entity_timer = 8;
+ }
+
+ ship_jumpdrive_timer = core::server()->time();
+ entity_dirty = true;
+}
+
+void Ship::func_jump(std::string const &args)
{
if (entity_eventstate == core::Entity::Docked) {
return;
}
// devel mode provides instant jump access to arbitrary systems
- if (Base::g_devel->value() && (args.size())) {
+ if (Game::g_devel->value() && (args.size())) {
core::Zone *jumptargetzone = 0;
std::string target;
@@ -117,7 +141,7 @@ void Ship::jump(std::string const &args)
}
if (jumptargetzone == zone()) {
- owner()->send("Already in the " + jumptargetzone->name() + '.');
+ owner()->send("Already in the " + jumptargetzone->name());
return;
}
@@ -133,7 +157,7 @@ void Ship::jump(std::string const &args)
return;
} else {
- if (!jumpdrive() && !Base::g_devel->value()) {
+ if (!jumpdrive() && !Game::g_devel->value()) {
owner()->send("This ship is not equiped with a hyperspace drive!");
return;
@@ -141,26 +165,14 @@ void Ship::jump(std::string const &args)
return;
} else if (entity_eventstate == core::Entity::JumpInitiate) {
- owner()->send("Jump aborted, hyperspace drive deactivated.");
+ owner()->send("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 (Base::g_devel->value()) {
- entity_timer = 0;
- } else {
- entity_timer = 8;
- }
-
- ship_jumpdrive_timer = core::server()->time();
- entity_dirty = true;
+ initiate_jump(find_closest_jumppoint());
}
}
@@ -182,7 +194,7 @@ JumpPoint * Ship::find_closest_jumppoint()
}
if (jumppoint && jumppoint->target()) {
- if (Base::g_jumppointrange->value() < d) {
+ if (Game::g_jumppointrange->value() < d) {
owner()->send("Jumppoint out of range!");
return 0;
} else {
@@ -236,14 +248,20 @@ void Ship::frame(float seconds)
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());
+ if (ship_jumpdepart && ship_jumpdepart->target()) {
entity_eventstate = core::Entity::Jump;
- entity_location.assign(jumppoint->target()->location() + location() - jumppoint->location());
+ set_zone(ship_jumpdepart->target()->zone());
+ if (owner() && owner()->control() == (EntityControlable*) this)
+ owner()->set_zone(ship_jumpdepart->target()->zone());
+
+ if (ship_jumpdepart->moduletype() == jumpgate_enttype) {
+ entity_axis.assign(ship_jumpdepart->target()->axis());
+ entity_location.assign(ship_jumpdepart->target()->location());
+ //entity_location += entity_axis.forward() * radius();
+ } else {
+ entity_location.assign(ship_jumpdepart->target()->location() + location() - ship_jumpdepart->location());
+ }
+ owner()->send("^BJumping to the " + ship_jumpdepart->target()->zone()->name());
} else {
entity_eventstate = core::Entity::Normal;
}
@@ -264,7 +282,7 @@ void Ship::frame(float seconds)
target_roll = 0;
target_direction = 0;
target_afterburner = 0.0f;
- target_thrust = 0;
+ target_thrust = 0.1;
} else if (entity_eventstate == core::Entity::Jump) {
// control is disabled while the jumpdrive is activated
@@ -276,22 +294,25 @@ void Ship::frame(float seconds)
target_thrust = 0;
// FIXME jump location and axis
- math::Axis default_axis;
- entity_axis.assign(default_axis);
+ //math::Axis default_axis;
+ //entity_axis.assign(default_axis);
entity_dirty = true;
// FIXME 5 second cooldown
- entity_speed = Base::g_impulsespeed->value();
+ entity_speed = Game::g_impulsespeed->value();
entity_eventstate = core::Entity::Normal;
+ if (owner() && owner()->view() && owner()->control() == (EntityControlable*) this)
+ owner()->set_view(0);
+
} 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 = Base::g_impulsespeed->value();
- actual_acceleration = Base::g_impulseacceleration->value();
+ actual_maxspeed = Game::g_impulsespeed->value();
+ actual_acceleration = Game::g_impulseacceleration->value();
entity_eventstate = core::Entity::Impulse;
entity_timer = 0;
entity_dirty = true;
@@ -317,8 +338,8 @@ void Ship::frame(float seconds)
math::clamp(target_roll, -1.0f, 1.0f);
math::clamp(target_direction, -1.0f, 1.0f);
target_afterburner = 0.0f;
- actual_maxspeed = Base::g_impulsespeed->value();
- actual_acceleration = Base::g_impulseacceleration->value();
+ actual_maxspeed = Game::g_impulsespeed->value();
+ actual_acceleration = Game::g_impulseacceleration->value();
actual_turnspeed *= 0.5;
} else if (entity_eventstate == core::Entity::Normal) {
@@ -331,7 +352,7 @@ void Ship::frame(float seconds)
math::clamp(target_afterburner, -1.0f, 1.0f);
if (speed() > actual_maxspeed * 1.15f) {
- actual_acceleration = Base::g_impulseacceleration->value();
+ actual_acceleration = Game::g_impulseacceleration->value();
actual_turnspeed *= 0.5;
}
@@ -459,7 +480,7 @@ void Ship::frame(float seconds)
}
if (fabs(current_target_strafe) > MIN_DELTA) {
- entity_location += entity_axis.left() * (current_target_strafe * Base::g_strafespeed->value());
+ entity_location += entity_axis.left() * (current_target_strafe * Game::g_strafespeed->value());
}
entity_movement = target_thrust;
diff --git a/src/game/base/ship.h b/src/game/base/ship.h
index d3c8bbf..bed3d1e 100644
--- a/src/game/base/ship.h
+++ b/src/game/base/ship.h
@@ -13,7 +13,7 @@
#include "base/jumppoint.h"
#include "math/vector3f.h"
-namespace base {
+namespace game {
/// A ship in the game, controled by a player
class Ship : public core::EntityControlable
@@ -28,16 +28,23 @@ public:
/// true if the ship is equiped with a jumpdrive
inline bool jumpdrive() const { return ship_jumpdrive; }
- /// toggle jump drive activation
- void jump(std::string const & args);
-
- /// toggle impulse drive activation
- void impulse();
+ /// Initiate jump, departing from a jump point
+ /** Initiates a jump even if the ship has no jumpdrive
+ */
+ void initiate_jump(JumpPoint *depart);
/// void reset drive controls
void reset();
+ /// toggle impulse drive activation
+ void func_impulse();
+
+ /// toggle jump drive activation
+ void func_jump(std::string const & args);
+
private:
+ JumpPoint *find_closest_jumppoint();
+
ShipModel *ship_shipmodel;
float current_target_direction;
@@ -51,7 +58,8 @@ private:
float ship_impulsedrive_timer;
- JumpPoint * find_closest_jumppoint();
+
+ JumpPoint *ship_jumpdepart;
};
}
diff --git a/src/game/base/shipmodel.cc b/src/game/base/shipmodel.cc
index 6018414..66e752e 100644
--- a/src/game/base/shipmodel.cc
+++ b/src/game/base/shipmodel.cc
@@ -7,7 +7,7 @@
#include "sys/sys.h"
#include "base/shipmodel.h"
-namespace base {
+namespace game {
// the ship model registry
std::map<std::string, ShipModel *> ShipModel::registry;
diff --git a/src/game/base/shipmodel.h b/src/game/base/shipmodel.h
index d92b840..277eccd 100644
--- a/src/game/base/shipmodel.h
+++ b/src/game/base/shipmodel.h
@@ -10,7 +10,7 @@
#include <map>
#include <string>
-namespace base {
+namespace game {
/// ship model specifications
class ShipModel
diff --git a/src/game/base/star.cc b/src/game/base/star.cc
index cacd542..ecf403e 100644
--- a/src/game/base/star.cc
+++ b/src/game/base/star.cc
@@ -4,11 +4,11 @@
the terms of the GNU General Public License version 2.
*/
-#include "base/base.h"
+#include "base/game.h"
#include "base/star.h"
-namespace base {
+namespace game {
Star::Star() : core::EntityGlobe(core::Entity::Static | core::Entity::Solid | core::Entity::Bright)
{
diff --git a/src/game/base/star.h b/src/game/base/star.h
index 5a78fc8..5283894 100644
--- a/src/game/base/star.h
+++ b/src/game/base/star.h
@@ -14,7 +14,7 @@
// C++ headers
#include <string>
-namespace base {
+namespace game {
/// a star, that shines so bright
class Star : public core::EntityGlobe {
diff --git a/src/game/game.cc b/src/game/game.cc
index 01a2574..a125eb7 100644
--- a/src/game/game.cc
+++ b/src/game/game.cc
@@ -4,25 +4,21 @@
the terms of the GNU General Public License version 2
*/
-#include "game/game.h"
-
-#include "base/base.h"
-#include "example/example.h"
-#include "intro/intro.h"
#include "core/core.h"
+#include "game/game.h"
+#include "game/base/game.h"
+#include "game/example/example.h"
+#include "game/intro/intro.h"
#include "sys/sys.h"
-namespace game
-{
-
/// register game modules
void register_modules(bool register_noninteractive_modules)
{
con_print << "^BRegistering game modules..." << std::endl;
// non-interactive modules
- core::Module::add(new base::Base());
+ core::Module::add(new game::Game());
core::Module::add(new example::Example());
// interactive modules
@@ -30,5 +26,3 @@ void register_modules(bool register_noninteractive_modules)
core::Module::add(new intro::Intro());
}
}
-
-}
diff --git a/src/game/game.h b/src/game/game.h
index 236299b..027a125 100644
--- a/src/game/game.h
+++ b/src/game/game.h
@@ -7,10 +7,7 @@
#ifndef __INCLUDED_GAME_H__
#define __INCLUDED_GAME_H__
-namespace game {
-
- void register_modules(bool register_noninteractive_modules=false);
-}
+void register_modules(bool register_noninteractive_modules=false);
#endif // __INCLUDED_GAME_H__