From 4cad4a27677b0490d3ba0018bc3404961f925ed5 Mon Sep 17 00:00:00 2001
From: Stijn Buys <ingar@osirion.org>
Date: Sat, 8 Nov 2008 10:17:37 +0000
Subject: docking, bumps network protocol version

---
 src/core/Makefile.am      |   6 +-
 src/core/application.cc   | 151 +++++++++++++++++++++++-----------------------
 src/core/application.h    |  30 +++++----
 src/core/commandbuffer.cc |   2 +-
 src/core/entity.cc        |   2 +-
 src/core/entity.h         |   4 +-
 src/core/net.h            |   2 +-
 src/core/parser.cc        |  15 +++++
 src/core/parser.h         |   3 +
 src/core/player.cc        |  18 +++++-
 src/core/player.h         |   8 +++
 src/core/zone.cc          |   8 ++-
 src/core/zone.h           |   9 ++-
 13 files changed, 161 insertions(+), 97 deletions(-)

(limited to 'src/core')

diff --git a/src/core/Makefile.am b/src/core/Makefile.am
index 18d8185..edd62e1 100644
--- a/src/core/Makefile.am
+++ b/src/core/Makefile.am
@@ -12,5 +12,7 @@ libcore_la_LIBADD = $(top_builddir)/src/model/libmodel.la \
 
 noinst_LTLIBRARIES = libcore.la
 noinst_HEADERS = application.h clientstate.h commandbuffer.h core.h cvar.h \
-	entity.h func.h gameconnection.h gameinterface.h gameserver.h message.h module.h net.h \
-	netclient.h netconnection.h netserver.h player.h range.h stats.h timer.h parser.h
+	entity.h func.h gameconnection.h gameinterface.h gameserver.h message.h module.h \
+	net.h netclient.h netconnection.h netserver.h player.h range.h stats.h \
+	timer.h parser.h
+
diff --git a/src/core/application.cc b/src/core/application.cc
index 09e900d..300aaa6 100644
--- a/src/core/application.cc
+++ b/src/core/application.cc
@@ -27,69 +27,7 @@
 namespace core
 {
 
-// --------------- engine functions  ------------------------------
-void func_help(std::string const &args)
-{
-	std::istringstream argstream(args);
-	std::string topic;
-	if (!(argstream >> topic))
-		topic.assign("help");
-
-	topic.append(".txt");
-	CommandBuffer::print_file("help/" + topic);
-}
-
-void func_quit(std::string const  &args)
-{
-	application()->shutdown();
-	application()->quit(0);
-}
-
-void func_connect(std::string const &args)
-{
-	std::istringstream argstream(args);
-	std::string host;
-	if (!(argstream >> host))
-		host.clear();
-
-	application()->connect(host);
-}
-
-void func_disconnect(std::string const  &args)
-{
-	application()->disconnect();
-}
-
-void func_say(std::string const &args)
-{
-	if (connection()) {
-		connection()->say(args);
-	} else if (server()) {
-		server()->say(localplayer(), args);
-	} else {
-		con_print << "Not connected." << std::endl;
-	}
-}
-
-void func_msg(std::string const &args)
-{
-	if (connection()) {
-		connection()->private_message(args);
-	} else if (server()) {
-		server()->private_message(localplayer(), args);
-	} else {
-		con_print << "Not connected." << std::endl;
-	}
-}
-
-void func_load(std::string const &args)
-{
-	std::string name(args);
-	aux::to_label(name);
-	application()->load(name);
-}
-
-// --------------- signal_handler -----------------------------------
+/* ---- signal handler --------------------------------------------- */
 
 #ifndef _WIN32
 extern "C" void signal_handler(int signum)
@@ -101,11 +39,11 @@ extern "C" void signal_handler(int signum)
 		case SIGTERM:
 			if (Application::instance()) {
 				con_warn << "Received signal " << signum << ", shutting down...\n";
-				application()->shutdown();
-				application()->quit(0);
+				Application::instance()->shutdown();
+				Application::instance()->quit(0);
 			} else {
 				std::cerr << "Received signal " << signum << ", terminated...\n";
-				application()->quit(1);
+				Application::instance()->quit(1);
 			}
 			break;
 #ifdef HAVE_CURSES
@@ -115,13 +53,13 @@ extern "C" void signal_handler(int signum)
 #endif
 		default:
 			std::cerr << "Received signal " << signum << ", terminated...\n";
-			application()->quit(1);
+			Application::instance()->quit(1);
 			break;
 	}
 }
 #endif 
 
-// --------------- Application -----------------------------
+/* ---- class Application ------------------------------------------ */
 
 Application *Application::application_instance = 0;
 
@@ -229,25 +167,25 @@ void Application::init(int count, char **arguments)
 	// register our engine functions
 	Func *func = 0;
 
-	func = Func::add("help", func_help);
+	func = Func::add("help", Application::func_help);
 	func->set_info("help function");
 
-	func = Func::add("quit", func_quit);
+	func = Func::add("quit", Application::func_quit);
 	func->set_info("exit the application");
 	
-	func = Func::add("load", func_load);
+	func = Func::add("load", Application::func_load);
 	func->set_info("[str] load a game module");
 
-	func = Func::add("connect", func_connect);
+	func = Func::add("connect", Application::func_connect);
 	func->set_info("[ip] without ip, create a game");
 
-	func = Func::add("disconnect", func_disconnect);
+	func = Func::add("disconnect", Application::func_disconnect);
 	func->set_info("leave the current game");
 
-	func = Func::add("say", func_say);
+	func = Func::add("say", Application::func_say);
 	func->set_info("say [text] say something on the public chat");
 
-	func = Func::add("msg", func_msg);
+	func = Func::add("msg", Application::func_msg);
 	func->set_info("msg [player] [text] send a private message to another player");
 
 	func = 0;
@@ -552,4 +490,67 @@ void Application::notify_remove_sound(size_t source)
 	// Dedicated servers don't need sounds
 }
 
+/* -- static engine functions -------------------------------------- */
+
+void Application::func_help(std::string const &args)
+{
+	std::istringstream argstream(args);
+	std::string topic;
+	if (!(argstream >> topic))
+		topic.assign("help");
+
+	topic.append(".txt");
+	CommandBuffer::print_file("help/" + topic);
+}
+
+void Application::func_quit(std::string const  &args)
+{
+	Application::instance()->shutdown();
+	Application::instance()->quit(0);
+}
+
+void Application::func_connect(std::string const &args)
+{
+	std::istringstream argstream(args);
+	std::string host;
+	if (!(argstream >> host))
+		host.clear();
+
+	Application::instance()->connect(host);
+}
+
+void Application::func_disconnect(std::string const  &args)
+{
+	Application::instance()->disconnect();
+}
+
+void Application::func_say(std::string const &args)
+{
+	if (connection()) {
+		connection()->say(args);
+	} else if (server()) {
+		server()->say(localplayer(), args);
+	} else {
+		con_print << "Not connected." << std::endl;
+	}
+}
+
+void Application::func_msg(std::string const &args)
+{
+	if (connection()) {
+		connection()->private_message(args);
+	} else if (server()) {
+		server()->private_message(localplayer(), args);
+	} else {
+		con_print << "Not connected." << std::endl;
+	}
+}
+
+void Application::func_load(std::string const &args)
+{
+	std::string name(args);
+	aux::to_label(name);
+	Application::instance()->load(name);
+}
+
 }
diff --git a/src/core/application.h b/src/core/application.h
index f241aa3..bb76cfe 100644
--- a/src/core/application.h
+++ b/src/core/application.h
@@ -39,7 +39,7 @@ public:
 	/// true if the core is connected to a running game interface
 	inline bool connected() const { return (application_game && application_game->running()); }
 
-	/// return the game interface, returns 0 if the pplication is not connected to a game
+	/// return the game interface, returns 0 if the application is not connected to a game
 	inline GameInterface *game() { return application_game; }
 
 /*-----  mutators ------------------------------------------------- */	
@@ -84,8 +84,6 @@ public:
 	/// remove sound source notification
 	virtual void notify_remove_sound(size_t source);
 
-/*-----  static --------------------------------------------------- */
-
 	/// a pointer to the current application instance
 	static inline Application *instance() { return application_instance; }
 
@@ -108,23 +106,31 @@ protected:
 private:
 	/// time the core has been running
 	unsigned long		application_timestamp;
+
 	GameInterface		*application_game;
+	Module			*module_interactive;
+
 	static Application	*application_instance;
 
-	/// last loaded interactive module
-	Module			*module_interactive;
+	/*-- engine functions --*/
+
+	static void func_help(std::string const &args);
+	static void func_quit(std::string const  &args);
+	static void func_connect(std::string const &args);
+	static void func_disconnect(std::string const  &args);
+	static void func_say(std::string const &args);
+	static void func_msg(std::string const &args);
+	static void func_load(std::string const &args);
 };
 
-/// pointer to the current Application
+/// pointer to the application
 inline Application *application() { return Application::instance(); }
 
-/// pointer to the current GameInterface
-inline GameInterface *game() { return Application::instance()->game(); }
-
 /// pointer to the console
-inline sys::ConsoleInterface *console() { return sys::ConsoleInterface::instance(); };
+inline sys::ConsoleInterface *console() { return sys::ConsoleInterface::instance(); }
 
-} // namespace core
+/// pointer to the game interface
+inline GameInterface *game() { return Application::instance()->game(); }
+}
 
 #endif // __INCLUDED_CORE_APPLICATION_H__
-
diff --git a/src/core/commandbuffer.cc b/src/core/commandbuffer.cc
index d3cb4f2..71ad37f 100644
--- a/src/core/commandbuffer.cc
+++ b/src/core/commandbuffer.cc
@@ -240,7 +240,7 @@ void  CommandBuffer::exec(std::string const &cmdline)
 					// target function
 					unsigned int id = 0;
 					if ((cmdstream >> id)) {
-						con_debug << "target function " << command << " " << id << std::endl;
+						//con_debug << "target function " << command << " " << id << std::endl;
 						Entity *entity = Entity::find(id);
 						if (entity)
 							f->exec(game()->localplayer(), entity);
diff --git a/src/core/entity.cc b/src/core/entity.cc
index 539c8d5..9bc3f3c 100644
--- a/src/core/entity.cc
+++ b/src/core/entity.cc
@@ -83,7 +83,7 @@ void Entity::list()
 	con_print << entity_registry.size() << " registered entities" << std::endl;
 }
 
-/*----- class Entity ----------------------------------------------- */
+/* ---- class Entity ----------------------------------------------- */
 
 Entity::Entity(unsigned int flags) :
 	entity_location(0.0f, 0.0f, 0.0f),
diff --git a/src/core/entity.h b/src/core/entity.h
index 149419b..09b52a1 100644
--- a/src/core/entity.h
+++ b/src/core/entity.h
@@ -35,7 +35,7 @@ class Entity
 {
 public:
 	/// Entity flags
-	enum Flags {Static=1, Solid=2, Bright=4, Dock=8};
+	enum Flags {Static=1, Solid=2, Bright=4, Dockable=8};
 
 	/// Entity type constants
 	enum Type {Default=0, Dynamic=1, Controlable=2, Globe=3};
@@ -44,7 +44,7 @@ public:
 	enum Shape {Diamond=0, Sphere=1, Cube=2, Axis=3};
 
 	/// EntityDynamic event state classes
-	enum Event {Normal=0, NoPower=1, ImpulseInitiate=2, Impulse=3, JumpInitiate=4, Jump=5};
+	enum Event {Normal=0, NoPower=1, ImpulseInitiate=2, Impulse=3, JumpInitiate=4, Jump=5, Docked=6};
 
 	/// create a new entity and add it to the registry
 	Entity(unsigned int flags = 0);
diff --git a/src/core/net.h b/src/core/net.h
index 92a17c5..fe264e8 100644
--- a/src/core/net.h
+++ b/src/core/net.h
@@ -11,7 +11,7 @@ namespace core
 {
 
 /// network protocol version
-const unsigned int PROTOCOLVERSION = 12;
+const unsigned int PROTOCOLVERSION = 13;
 
 /// maximum lenght of a (compressed) network message block
 const unsigned int FRAMESIZE = 1152;
diff --git a/src/core/parser.cc b/src/core/parser.cc
index 39eb073..6af3903 100644
--- a/src/core/parser.cc
+++ b/src/core/parser.cc
@@ -10,6 +10,21 @@
 
 namespace core {
 
+bool Parser::read_entity_menu(core::Entity *entity, const std::string &menufilename)
+{
+	filesystem::IniFile inifile;
+	inifile.open(menufilename);
+
+	if (!inifile.is_open()) {
+		return false;
+	}
+
+	con_debug << "  " << inifile.name() << std::endl;
+
+	inifile.close();
+	return true;
+}
+
 bool Parser::got_entity_key(filesystem::IniFile &inifile, core::Entity *entity)
 {
 	std::string shapename;
diff --git a/src/core/parser.h b/src/core/parser.h
index 78a1087..fec27c4 100644
--- a/src/core/parser.h
+++ b/src/core/parser.h
@@ -18,6 +18,9 @@ class Parser {
 public:
 	/// read default entity keys from an ini file
 	static bool got_entity_key(filesystem::IniFile &inifile, core::Entity *entity);
+
+	/// read entity menus
+	static bool read_entity_menu(core::Entity *entity, const std::string &menufilename);
 };
 
 }
diff --git a/src/core/player.cc b/src/core/player.cc
index 26ea070..f5f28bd 100644
--- a/src/core/player.cc
+++ b/src/core/player.cc
@@ -35,6 +35,7 @@ void Player::clear()
 	player_rcon = false;
 	player_mute = false;
 	player_mission_target = 0;
+	player_view = 0;
 
 	clear_assets();
 	player_control = 0;
@@ -46,6 +47,7 @@ void Player::set_control(EntityControlable *entitycontrolable)
 
 	if (entitycontrolable) {
 		set_zone(entitycontrolable->zone());
+		player_view = 0;
 	}
 	player_dirty = true;
 }
@@ -58,6 +60,15 @@ void Player::set_zone(Zone *zone)
 	}
 }
 
+void Player::set_view(Entity *view)
+{
+	player_view = view;
+	player_dirty = true;
+	if (player_view) {
+		set_zone(player_view->zone());
+	}
+}
+
 void Player::set_mission_target(Entity *new_mission_target)
 {
 	if (new_mission_target != player_mission_target) {
@@ -119,8 +130,9 @@ void Player::serialize_server_update(std::ostream & os) const
 	unsigned int zo = (zone() ? zone()->id() : 0);
 	unsigned int co = (player_control ?  player_control->id() : 0);
 	unsigned int mission = (player_mission_target ? player_mission_target->id() : 0);
+	unsigned int view = (player_view ? player_view->id() : 0);
 
-	os << player_id <<  " " << zo << " " << co << " " << mission << " " << player_color << " \"" << player_name << "\"";
+	os << player_id <<  " " << zo << " " << view << " " << co << " " << mission << " " << player_color << " \"" << player_name << "\"";
 }
 
 void Player::receive_server_update(std::istream &is)
@@ -131,6 +143,10 @@ void Player::receive_server_update(std::istream &is)
 	is >> zo;
 	set_zone(Zone::find(zo));
 
+	unsigned int view = 0;
+	is >> view;
+	set_view(Entity::find(view));
+
 	unsigned int co = 0;
 	is >> co;
 	if (co) { 
diff --git a/src/core/player.h b/src/core/player.h
index c527433..44ee923 100644
--- a/src/core/player.h
+++ b/src/core/player.h
@@ -70,6 +70,9 @@ public:
 	/// mission target
 	inline Entity *mission_target() { return player_mission_target; }
 
+	/// view
+	inline Entity *view() { return player_view; }
+
 /*----- mutators -------------------------------------------------- */
 
 	/// serialize player info to a stream
@@ -104,6 +107,8 @@ public:
 
 	void set_mission_target(Entity *new_mission_target);
 
+	void set_view(Entity *view);
+
 	inline void set_dirty() { player_dirty = true; }
 
 /* -- should actually not be public --*/
@@ -138,6 +143,9 @@ private:
 	// the entity the Player is currently controling
 	EntityControlable *player_control;
 
+	// the entity the PLayer is currently looking at
+	Entity *player_view;
+
 	Entity *player_mission_target;
 
 	// the zone the player is currently in
diff --git a/src/core/zone.cc b/src/core/zone.cc
index 2dfc5c2..5d9c48f 100644
--- a/src/core/zone.cc
+++ b/src/core/zone.cc
@@ -118,7 +118,7 @@ void Zone ::clear()
 	zone_registry.clear();
 
 }
-/* ---- The Zone class --------------------------------------------- */
+/* ---- class Zone ------------------------------------------------- */
 
 Zone::Zone(std::string const & label) :
 	zone_label(label)
@@ -127,6 +127,7 @@ Zone::Zone(std::string const & label) :
 	zone_name.clear();
 	zone_sky.clear();
 	zone_sky_texture = 0;
+	zone_defaultview = 0;
 }
 
 Zone::Zone(std::istream & is)
@@ -197,6 +198,7 @@ void Zone::serialize_server_update(std::ostream & os) const
 	os << zone_label << " ";
 	os << "\"" << zone_name << "\" ";
 	os << "\"" << zone_sky << "\" ";
+	os << (zone_defaultview ? zone_defaultview->id() : 0 );
 
 }
 
@@ -205,6 +207,7 @@ void Zone::receive_server_update(std::istream &is)
 	is >> zone_label;
 	
 	std::string n;
+	unsigned int id = 0;
 	char c;
 
 	while ( (is.get(c)) && (c != '"'));
@@ -218,6 +221,9 @@ void Zone::receive_server_update(std::istream &is)
 		n += c;	
 	zone_sky.assign(n);
 	n.clear();
+
+	is >> id;
+	zone_defaultview = Entity::find(id);
 }
 
 }
diff --git a/src/core/zone.h b/src/core/zone.h
index bb2074e..4b64ffb 100644
--- a/src/core/zone.h
+++ b/src/core/zone.h
@@ -71,7 +71,6 @@ public:
 	/// create a zone from stream data
 	Zone(std::istream & is);
 
-
 	/// delete a zone
 	~Zone();
 
@@ -92,6 +91,9 @@ public:
 	/// texture id for the sky
 	inline size_t sky_texture() const { return zone_sky_texture; }
 
+	/// default zone view
+	inline Entity *default_view() {return zone_defaultview; }
+
 	/// find an entity inside a zone
 	Entity *find_entity(Entity *entity);
 
@@ -115,6 +117,9 @@ public:
 	/// set the texture id for the sky
 	inline void set_sky_texture(size_t texture) { zone_sky_texture = texture; }
 
+	///set the default view
+	inline void set_default_view(Entity *entity) { zone_defaultview = entity; }
+
 	/* ---- serializers ---------------------------------------- */
 
 	/// serialize a server-to-client update on a stream
@@ -145,6 +150,8 @@ private:
 
 	Content			zone_content;
 	static Registry		zone_registry;
+
+	Entity			*zone_defaultview;
 };
 
 }
-- 
cgit v1.2.3