about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2007-07-14 13:09:42 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2007-07-14 13:09:42 +0000
commit568b9f1f4a4f6cd269f026c10117d76329b44dd8 (patch)
treefe18d2ceb622c3b4c1f631b6736102c89927a330 /src/engine
parent7acef9eb864344b26cb78f22da369851cc31aa76 (diff)
downloadzcatch-568b9f1f4a4f6cd269f026c10117d76329b44dd8.tar.gz
zcatch-568b9f1f4a4f6cd269f026c10117d76329b44dd8.zip
added chat, better damage indicators
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/client.cpp242
-rw-r--r--src/engine/client/gfx.cpp2
-rw-r--r--src/engine/interface.h10
-rw-r--r--src/engine/msg.cpp19
-rw-r--r--src/engine/server/server.cpp90
5 files changed, 204 insertions, 159 deletions
diff --git a/src/engine/client/client.cpp b/src/engine/client/client.cpp
index 4fb869cd..04c25bba 100644
--- a/src/engine/client/client.cpp
+++ b/src/engine/client/client.cpp
@@ -194,7 +194,7 @@ public:
 	{
 		recived_snapshots = 0;
 
-		msg_pack_start(NETMSG_INFO, MSGFLAG_VITAL);
+		msg_pack_start_system(NETMSG_INFO, MSGFLAG_VITAL);
 		msg_pack_string(config.player_name, 128);
 		msg_pack_string(config.clan_name, 128);
 		msg_pack_string(config.password, 128);
@@ -205,7 +205,7 @@ public:
 
 	void send_entergame()
 	{
-		msg_pack_start(NETMSG_ENTERGAME, MSGFLAG_VITAL);
+		msg_pack_start_system(NETMSG_ENTERGAME, MSGFLAG_VITAL);
 		msg_pack_end();
 		client_send_msg();
 	}
@@ -226,7 +226,7 @@ public:
 
 	void send_input()
 	{
-		msg_pack_start(NETMSG_INPUT, 0);
+		msg_pack_start_system(NETMSG_INPUT, 0);
 		msg_pack_int(input_data_size);
 		for(int i = 0; i < input_data_size/4; i++)
 			msg_pack_int(input_data[i]);
@@ -462,135 +462,145 @@ public:
 
 	void process_packet(NETPACKET *packet)
 	{
-		int msg = msg_unpack_start(packet->data, packet->data_size);
-		if(msg == NETMSG_MAP)
+		int sys;
+		int msg = msg_unpack_start(packet->data, packet->data_size, &sys);
+		if(sys)
 		{
-			const char *map = msg_unpack_string();
-			dbg_msg("client/network", "connection accepted, map=%s", map);
-			set_state(STATE_LOADING);
-			
-			if(map_load(map))
-			{
-				modc_entergame();
-				send_entergame();
-				dbg_msg("client/network", "loading done");
-				// now we will wait for two snapshots
-				// to finish the connection
-			}
-			else
-			{
-				error("failure to load map");
-			}
-		}
-		else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPSMALL || msg == NETMSG_SNAPEMPTY)
-		{
-			//dbg_msg("client/network", "got snapshot");
-			int game_tick = msg_unpack_int();
-			int delta_tick = game_tick-msg_unpack_int();
-			int num_parts = 1;
-			int part = 0;
-			int part_size = 0;
-			
-			if(msg == NETMSG_SNAP)
+			// system message
+			if(msg == NETMSG_MAP)
 			{
-				num_parts = msg_unpack_int();
-				part = msg_unpack_int();
+				const char *map = msg_unpack_string();
+				dbg_msg("client/network", "connection accepted, map=%s", map);
+				set_state(STATE_LOADING);
+				
+				if(map_load(map))
+				{
+					modc_entergame();
+					send_entergame();
+					dbg_msg("client/network", "loading done");
+					// now we will wait for two snapshots
+					// to finish the connection
+				}
+				else
+				{
+					error("failure to load map");
+				}
 			}
-			
-			if(msg != NETMSG_SNAPEMPTY)
-				part_size = msg_unpack_int();
-			
-			if(snapshot_part == part)
+			else if(msg == NETMSG_SNAP || msg == NETMSG_SNAPSMALL || msg == NETMSG_SNAPEMPTY)
 			{
-				// TODO: clean this up abit
-				const char *d = (const char *)msg_unpack_raw(part_size);
-				mem_copy((char*)snapshots[SNAP_INCOMMING] + part*MAX_SNAPSHOT_PACKSIZE, d, part_size);
-				snapshot_part++;
-			
-				if(snapshot_part == num_parts)
+				//dbg_msg("client/network", "got snapshot");
+				int game_tick = msg_unpack_int();
+				int delta_tick = game_tick-msg_unpack_int();
+				int num_parts = 1;
+				int part = 0;
+				int part_size = 0;
+				
+				if(msg == NETMSG_SNAP)
+				{
+					num_parts = msg_unpack_int();
+					part = msg_unpack_int();
+				}
+				
+				if(msg != NETMSG_SNAPEMPTY)
+					part_size = msg_unpack_int();
+				
+				if(snapshot_part == part)
 				{
-					snapshot *tmp = snapshots[SNAP_PREV];
-					snapshots[SNAP_PREV] = snapshots[SNAP_CURRENT];
-					snapshots[SNAP_CURRENT] = tmp;
-					current_tick = game_tick;
-
-					// decompress snapshot
-					void *deltadata = snapshot_empty_delta();
-					int deltasize = sizeof(int)*3;
-
-					unsigned char tmpbuffer[MAX_SNAPSHOT_SIZE];
-					unsigned char tmpbuffer2[MAX_SNAPSHOT_SIZE];
-					if(part_size)
+					// TODO: clean this up abit
+					const char *d = (const char *)msg_unpack_raw(part_size);
+					mem_copy((char*)snapshots[SNAP_INCOMMING] + part*MAX_SNAPSHOT_PACKSIZE, d, part_size);
+					snapshot_part++;
+				
+					if(snapshot_part == num_parts)
 					{
-						//int snapsize = lzw_decompress(snapshots[SNAP_INCOMMING], snapshots[SNAP_CURRENT]);
-						int compsize = zerobit_decompress(snapshots[SNAP_INCOMMING], part_size, tmpbuffer);
-						//int compsize = lzw_decompress(snapshots[SNAP_INCOMMING],tmpbuffer);
-						int intsize = intpack_decompress(tmpbuffer, compsize, tmpbuffer2);
-						deltadata = tmpbuffer2;
-						deltasize = intsize;
-					}
+						snapshot *tmp = snapshots[SNAP_PREV];
+						snapshots[SNAP_PREV] = snapshots[SNAP_CURRENT];
+						snapshots[SNAP_CURRENT] = tmp;
+						current_tick = game_tick;
+
+						// decompress snapshot
+						void *deltadata = snapshot_empty_delta();
+						int deltasize = sizeof(int)*3;
+
+						unsigned char tmpbuffer[MAX_SNAPSHOT_SIZE];
+						unsigned char tmpbuffer2[MAX_SNAPSHOT_SIZE];
+						if(part_size)
+						{
+							//int snapsize = lzw_decompress(snapshots[SNAP_INCOMMING], snapshots[SNAP_CURRENT]);
+							int compsize = zerobit_decompress(snapshots[SNAP_INCOMMING], part_size, tmpbuffer);
+							//int compsize = lzw_decompress(snapshots[SNAP_INCOMMING],tmpbuffer);
+							int intsize = intpack_decompress(tmpbuffer, compsize, tmpbuffer2);
+							deltadata = tmpbuffer2;
+							deltasize = intsize;
+						}
 
-					// find snapshot that we should use as delta 
-					static snapshot emptysnap;
-					emptysnap.data_size = 0;
-					emptysnap.num_items = 0;
-					
-					snapshot *deltashot = &emptysnap;
-					int deltashot_size;
+						// find snapshot that we should use as delta 
+						static snapshot emptysnap;
+						emptysnap.data_size = 0;
+						emptysnap.num_items = 0;
+						
+						snapshot *deltashot = &emptysnap;
+						int deltashot_size;
 
-					if(delta_tick >= 0)
-					{
-						void *delta_data;
-						deltashot_size = snapshots_new.get(delta_tick, &delta_data);
-						if(deltashot_size >= 0)
+						if(delta_tick >= 0)
 						{
-							deltashot = (snapshot *)delta_data;
+							void *delta_data;
+							deltashot_size = snapshots_new.get(delta_tick, &delta_data);
+							if(deltashot_size >= 0)
+							{
+								deltashot = (snapshot *)delta_data;
+							}
+							else
+							{
+								// TODO: handle this
+								dbg_msg("client", "error, couldn't find the delta snapshot");
+							}
 						}
-						else
+
+						int snapsize = snapshot_unpack_delta(deltashot, (snapshot*)snapshots[SNAP_CURRENT], deltadata, deltasize);
+						//snapshot *shot = (snapshot *)snapshots[SNAP_CURRENT];
+
+						// purge old snapshots					
+						snapshots_new.purge_until(delta_tick);
+						snapshots_new.purge_until(game_tick-50); // TODO: change this to server tickrate
+						
+						// add new
+						snapshots_new.add(game_tick, snapsize, snapshots[SNAP_CURRENT]);
+						
+						// apply snapshot, cycle pointers
+						recived_snapshots++;
+						snapshot_start_time = time_get();
+						
+						// we got two snapshots until we see us self as connected
+						if(recived_snapshots == 2)
 						{
-							// TODO: handle this
-							dbg_msg("client", "error, couldn't find the delta snapshot");
+							local_start_time = time_get();
+							set_state(STATE_ONLINE);
 						}
+						
+						if(recived_snapshots > 2)
+							modc_newsnapshot();
+						
+						snapshot_part = 0;
+						
+						// ack snapshot
+						msg_pack_start_system(NETMSG_SNAPACK, 0);
+						msg_pack_int(game_tick);
+						msg_pack_end();
+						client_send_msg();
 					}
-
-					int snapsize = snapshot_unpack_delta(deltashot, (snapshot*)snapshots[SNAP_CURRENT], deltadata, deltasize);
-					//snapshot *shot = (snapshot *)snapshots[SNAP_CURRENT];
-
-					// purge old snapshots					
-					snapshots_new.purge_until(delta_tick);
-					snapshots_new.purge_until(game_tick-50); // TODO: change this to server tickrate
-					
-					// add new
-					snapshots_new.add(game_tick, snapsize, snapshots[SNAP_CURRENT]);
-					
-					// apply snapshot, cycle pointers
-					recived_snapshots++;
-					snapshot_start_time = time_get();
-					
-					// we got two snapshots until we see us self as connected
-					if(recived_snapshots == 2)
-					{
-						local_start_time = time_get();
-						set_state(STATE_ONLINE);
-					}
-					
-					if(recived_snapshots > 2)
-						modc_newsnapshot();
-					
+				}
+				else
+				{
+					dbg_msg("client", "snapshot reset!");
 					snapshot_part = 0;
-					
-					// ack snapshot
-					msg_pack_start(NETMSG_SNAPACK, 0);
-					msg_pack_int(game_tick);
-					msg_pack_end();
-					client_send_msg();
 				}
 			}
-			else
-			{
-				dbg_msg("client", "snapshot reset!");
-				snapshot_part = 0;
-			}
+		}
+		else
+		{
+			// game message
+			modc_message(msg);
 		}
 	}
 	
diff --git a/src/engine/client/gfx.cpp b/src/engine/client/gfx.cpp
index ba908c68..c30ad0f1 100644
--- a/src/engine/client/gfx.cpp
+++ b/src/engine/client/gfx.cpp
@@ -617,7 +617,7 @@ pretty_font *current_font = &default_font;
 void gfx_pretty_text(float x, float y, float size, const char *text)
 {
 	const float spacing = 0.05f;
-	
+	gfx_texture_set(current_font->font_texture);
 	gfx_quads_begin();
 	
 	while (*text)
diff --git a/src/engine/interface.h b/src/engine/interface.h
index 27f73e17..a3bb2e15 100644
--- a/src/engine/interface.h
+++ b/src/engine/interface.h
@@ -705,6 +705,7 @@ enum
 	MSGFLAG_VITAL=1,
 };
 
+void msg_pack_start_system(int msg, int flags);
 void msg_pack_start(int msg, int flags);
 void msg_pack_int(int i);
 void msg_pack_string(const char *p, int limit);
@@ -722,20 +723,23 @@ struct msg_info
 const msg_info *msg_get_info();
 
 // message unpacking
-int msg_unpack_start(const void *data, int data_size);
+int msg_unpack_start(const void *data, int data_size, int *system);
 int msg_unpack_int();
 const char *msg_unpack_string();
 const unsigned char *msg_unpack_raw(int size);
 
 // message sending
-int server_send_msg(int client_id);
+int server_send_msg(int client_id); // client_id == -1 == broadcast
 int client_send_msg();
 
 int client_tick();
 float client_intratick();
 
+void gfx_pretty_text(float x, float y, float size, const char *text);
+float gfx_pretty_text_width(float size, const char *text);
 
-int modc_message();
+void mods_message(int msg, int client_id);
+void modc_message(int msg);
 
 #define MASTER_SERVER_ADDRESS "master.teewars.com"
 #define MASTER_SERVER_PORT 8300
diff --git a/src/engine/msg.cpp b/src/engine/msg.cpp
index 024bab2c..fa2dab34 100644
--- a/src/engine/msg.cpp
+++ b/src/engine/msg.cpp
@@ -10,13 +10,22 @@ void msg_pack_int(int i) { packer.add_int(i); }
 void msg_pack_string(const char *p, int limit) { packer.add_string(p, limit); }
 void msg_pack_raw(const void *data, int size) { packer.add_raw((const unsigned char *)data, size); }
 
+void msg_pack_start_system(int msg, int flags)
+{
+	packer.reset();
+	pack_info.msg = (msg<<1)|1;
+	pack_info.flags = flags;
+	
+	msg_pack_int(pack_info.msg);
+}
+
 void msg_pack_start(int msg, int flags)
 {
 	packer.reset();
-	pack_info.msg = msg;
+	pack_info.msg = msg<<1;
 	pack_info.flags = flags;
 	
-	msg_pack_int(msg);
+	msg_pack_int(pack_info.msg);
 }
 
 void msg_pack_end()
@@ -32,10 +41,12 @@ const msg_info *msg_get_info()
 
 // message unpacking
 static data_unpacker unpacker;
-int msg_unpack_start(const void *data, int data_size)
+int msg_unpack_start(const void *data, int data_size, int *system)
 {
 	unpacker.reset((const unsigned char *)data, data_size);
-	return msg_unpack_int();
+	int msg = msg_unpack_int();
+	*system = msg&1;
+	return msg>>1;
 }
 
 int msg_unpack_int() { return unpacker.get_int(); }
diff --git a/src/engine/server/server.cpp b/src/engine/server/server.cpp
index 5632689e..6fe84ade 100644
--- a/src/engine/server/server.cpp
+++ b/src/engine/server/server.cpp
@@ -107,8 +107,19 @@ int server_send_msg(int client_id)
 
 	if(info->flags&MSGFLAG_VITAL)	
 		packet.flags = PACKETFLAG_VITAL;
-	
-	net.send(&packet);
+			
+	if(client_id == -1)
+	{
+		// broadcast
+		for(int i = 0; i < MAX_CLIENTS; i++)
+			if(clients[i].is_ingame())
+			{
+				packet.client_id = i;
+				net.send(&packet);
+			}
+	}
+	else
+		net.send(&packet);
 	return 0;
 }
 	
@@ -337,9 +348,9 @@ public:
 						left -= chunk;
 
 						if(numpackets == 1)
-							msg_pack_start(NETMSG_SNAPSMALL, 0);
+							msg_pack_start_system(NETMSG_SNAPSMALL, 0);
 						else
-							msg_pack_start(NETMSG_SNAP, 0);
+							msg_pack_start_system(NETMSG_SNAP, 0);
 						msg_pack_int(current_tick);
 						msg_pack_int(current_tick-delta_tick); // compressed with
 						msg_pack_int(chunk);
@@ -352,7 +363,7 @@ public:
 				}
 				else
 				{
-					msg_pack_start(NETMSG_SNAPEMPTY, 0);
+					msg_pack_start_system(NETMSG_SNAPEMPTY, 0);
 					msg_pack_int(current_tick);
 					msg_pack_int(current_tick-delta_tick); // compressed with
 					msg_pack_end();
@@ -366,7 +377,7 @@ public:
 
 	void send_map(int cid)
 	{
-		msg_pack_start(NETMSG_MAP, MSGFLAG_VITAL);
+		msg_pack_start_system(NETMSG_MAP, MSGFLAG_VITAL);
 		msg_pack_string(map_name, 0);
 		msg_pack_end();
 		server_send_msg(cid);
@@ -385,40 +396,49 @@ public:
 	void process_client_packet(NETPACKET *packet)
 	{
 		int cid = packet->client_id;
-		int msg = msg_unpack_start(packet->data, packet->data_size);
-		if(msg == NETMSG_INFO)
-		{
-			strncpy(clients[cid].name, msg_unpack_string(), MAX_NAME_LENGTH);
-			strncpy(clients[cid].clan, msg_unpack_string(), MAX_CLANNAME_LENGTH);
-			const char *password = msg_unpack_string();
-			const char *skin = msg_unpack_string();
-			(void)password; // ignore these variables
-			(void)skin;
-			send_map(cid);
-		}
-		else if(msg == NETMSG_ENTERGAME)
-		{
-			dbg_msg("game", "player as entered the game. cid=%x", cid);
-			clients[cid].state = client::STATE_INGAME;
-			mods_client_enter(cid);
-		}
-		else if(msg == NETMSG_INPUT)
-		{
-			int input[MAX_INPUT_SIZE];
-			int size = msg_unpack_int();
-			for(int i = 0; i < size/4; i++)
-				input[i] = msg_unpack_int();
-			mods_client_input(cid, input);
-		}
-		else if(msg == NETMSG_SNAPACK)
+		int sys;
+		int msg = msg_unpack_start(packet->data, packet->data_size, &sys);
+		if(sys)
 		{
-			clients[cid].last_acked_snapshot = msg_unpack_int();
+			// system message
+			if(msg == NETMSG_INFO)
+			{
+				strncpy(clients[cid].name, msg_unpack_string(), MAX_NAME_LENGTH);
+				strncpy(clients[cid].clan, msg_unpack_string(), MAX_CLANNAME_LENGTH);
+				const char *password = msg_unpack_string();
+				const char *skin = msg_unpack_string();
+				(void)password; // ignore these variables
+				(void)skin;
+				send_map(cid);
+			}
+			else if(msg == NETMSG_ENTERGAME)
+			{
+				dbg_msg("game", "player as entered the game. cid=%x", cid);
+				clients[cid].state = client::STATE_INGAME;
+				mods_client_enter(cid);
+			}
+			else if(msg == NETMSG_INPUT)
+			{
+				int input[MAX_INPUT_SIZE];
+				int size = msg_unpack_int();
+				for(int i = 0; i < size/4; i++)
+					input[i] = msg_unpack_int();
+				mods_client_input(cid, input);
+			}
+			else if(msg == NETMSG_SNAPACK)
+			{
+				clients[cid].last_acked_snapshot = msg_unpack_int();
+			}
+			else
+			{
+				dbg_msg("server", "strange message cid=%d msg=%d data_size=%d", cid, msg, packet->data_size);
+			}
 		}
 		else
 		{
-			dbg_msg("server", "strange message cid=%d msg=%d data_size=%d", cid, msg, packet->data_size);
+			// game message
+			mods_message(msg, cid);
 		}
-		
 	}
 
 	void process_packet(NETPACKET *packet)