diff options
| -rw-r--r-- | src/core/gameserver.cc | 24 | ||||
| -rw-r--r-- | src/game/base/Makefile.am | 4 | ||||
| -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.cc | 84 | ||||
| -rw-r--r-- | src/game/base/jumppoint.h | 30 | ||||
| -rw-r--r-- | src/game/base/navpoint.cc | 4 | ||||
| -rw-r--r-- | src/game/base/navpoint.h | 2 | ||||
| -rw-r--r-- | src/game/base/planet.cc | 4 | ||||
| -rw-r--r-- | src/game/base/planet.h | 2 | ||||
| -rw-r--r-- | src/game/base/racetrack.cc | 4 | ||||
| -rw-r--r-- | src/game/base/racetrack.h | 2 | ||||
| -rw-r--r-- | src/game/base/ship.cc | 101 | ||||
| -rw-r--r-- | src/game/base/ship.h | 22 | ||||
| -rw-r--r-- | src/game/base/shipmodel.cc | 2 | ||||
| -rw-r--r-- | src/game/base/shipmodel.h | 2 | ||||
| -rw-r--r-- | src/game/base/star.cc | 4 | ||||
| -rw-r--r-- | src/game/base/star.h | 2 | ||||
| -rw-r--r-- | src/game/game.cc | 16 | ||||
| -rw-r--r-- | src/game/game.h | 5 | ||||
| -rw-r--r-- | src/osirion.cc | 2 | ||||
| -rw-r--r-- | src/osiriond.cc | 2 | 
22 files changed, 332 insertions, 207 deletions
| diff --git a/src/core/gameserver.cc b/src/core/gameserver.cc index bbe32dd..47f5715 100644 --- a/src/core/gameserver.cc +++ b/src/core/gameserver.cc @@ -23,7 +23,7 @@ Player *console_find_player(std::string const & target)  {  	Player *targetplayer = server()->find_player(target);  	if (!targetplayer) { -		con_print << "^BPlayer " + target + "^B not found."; +		con_print << "^BPlayer " + target + "^B not found";  	}  	return targetplayer;  } @@ -56,13 +56,13 @@ void func_mute(std::string const &args)  		return;  	if (targetplayer->mute()) { -		con_print << "^BPlayer " + targetplayer->name() + "^B has already been muted."; +		con_print << "^BPlayer " + targetplayer->name() + "^B has already been muted";  		return;  	}  	targetplayer->player_mute = true; -	server()->broadcast("^B" + targetplayer->name() + "^B has been muted.", targetplayer); -	targetplayer->send("^BYou have been muted."); +	server()->broadcast("^B" + targetplayer->name() + "^B has been muted", targetplayer); +	targetplayer->send("^WYou have been muted");  }  void func_unmute(std::string const &args) @@ -72,13 +72,13 @@ void func_unmute(std::string const &args)  		return;  	if (!targetplayer->mute()) { -		con_print << "^BPlayer " + targetplayer->name() + "^B has not been muted."; +		con_print << "^BPlayer " + targetplayer->name() + "^B has not been muted";  		return;  	}  	targetplayer->player_mute = false; -	server()->broadcast("^B" +targetplayer->name() + "^B has been unmuted.", targetplayer); -	targetplayer->send("^BYou have been unmuted."); +	server()->broadcast("^B" +targetplayer->name() + "^B has been unmuted", targetplayer); +	targetplayer->send("^WYou have been unmuted");  }  void func_kick(std::string const &args) @@ -267,7 +267,7 @@ void GameServer::say(Player *player, std::string const &message)  		return;  	if (player->mute()) { -		player->send("^BYou have been muted."); +		player->send("^WYou have been muted");  		return;  	} @@ -285,7 +285,7 @@ void GameServer::private_message(Player *player, std::string const &args)  		return;  	if (player->mute()) { -		player->send("^BYou have been muted."); +		player->send("^WYou have been muted");  		return;  	} @@ -297,7 +297,7 @@ void GameServer::private_message(Player *player, std::string const &args)  	core::Player *targetplayer = core::server()->find_player(target);  	if (!targetplayer) { -		player->send("^BPlayer " + target + "^B not found."); +		player->send("^BPlayer " + target + "^B not found");  		return;  	} @@ -311,7 +311,7 @@ void GameServer::private_message(Player *player, std::string const &args)  void GameServer::kick(Player *player, std::string const &reason)  {  	if (!server_network) { -		con_print << "Not running a networked server." << std::endl; +		con_print << "Not running a networked server" << std::endl;  		return;  	} @@ -321,7 +321,7 @@ void GameServer::kick(Player *player, std::string const &reason)  		player->send("^WYou have been kicked: " + reason);  		server_network->send_disconnect(client);  	} else { -		con_print << "Network client not found." << std::endl; +		con_print << "Network client not found" << std::endl;  	}  } 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__ diff --git a/src/osirion.cc b/src/osirion.cc index cccbd2d..04218be 100644 --- a/src/osirion.cc +++ b/src/osirion.cc @@ -10,7 +10,7 @@  int main(int count, char **arguments)  {  	// load the game modules -	game::register_modules(true); +	register_modules(true);  	client::run(count, arguments); diff --git a/src/osiriond.cc b/src/osiriond.cc index f38d553..8d941ca 100644 --- a/src/osiriond.cc +++ b/src/osiriond.cc @@ -10,7 +10,7 @@  int main(int count, char **arguments)  {  	// preload the game module -	game::register_modules(false); +	register_modules(false);  	dedicated::run(count, arguments); | 
