about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-01-12 12:08:26 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-01-12 12:08:26 +0000
commit1c1677f02300e5ab10bca9c74ce7f49d4605b9d6 (patch)
tree1601d291fd6c531d5b8dcb6f0ca95829c31b0c76 /src/engine
parent24e17b41a8a5d600e0f116bc059ba121ac21bad5 (diff)
downloadzcatch-1c1677f02300e5ab10bca9c74ce7f49d4605b9d6.tar.gz
zcatch-1c1677f02300e5ab10bca9c74ce7f49d4605b9d6.zip
merged 0.3.3 changes over to trunk
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/client/ec_client.c23
-rw-r--r--src/engine/client/ec_gfx.c34
-rw-r--r--src/engine/client/ec_inp.c71
-rw-r--r--src/engine/client/ec_snd.c27
-rw-r--r--src/engine/client/ec_srvbrowse.c6
-rw-r--r--src/engine/e_config_variables.h5
-rw-r--r--src/engine/e_interface.h21
-rw-r--r--src/engine/server/es_server.c14
8 files changed, 154 insertions, 47 deletions
diff --git a/src/engine/client/ec_client.c b/src/engine/client/ec_client.c
index d35121de..b07edf78 100644
--- a/src/engine/client/ec_client.c
+++ b/src/engine/client/ec_client.c
@@ -304,6 +304,24 @@ int client_connection_problems()
 	return netclient_gotproblems(net);
 }
 
+void client_direct_input(int *input, int size)
+{
+	int i;
+	msg_pack_start_system(NETMSG_INPUT, 0);
+	msg_pack_int(ack_game_tick);
+	msg_pack_int(current_predtick);
+	msg_pack_int(size);
+	
+	for(i = 0; i < size/4; i++)
+		msg_pack_int(input[i]);	
+		
+	msg_pack_end();
+	client_send_msg();
+	
+	dbg_msg("client", "sent direct input");
+}
+
+
 static void client_send_input()
 {
 	int64 now = time_get();	
@@ -312,7 +330,7 @@ static void client_send_input()
 	if(current_predtick <= 0)
 		return;
 	
-	/* fetch input */	
+	/* fetch input */
 	size = modc_snap_input(inputs[current_input].data);
 	
 	msg_pack_start_system(NETMSG_INPUT, 0);
@@ -1006,6 +1024,9 @@ static void client_run()
 		
 		/* update input */
 		inp_update();
+
+		/* update sound */		
+		snd_update();
 		
 		/* refocus */
 		if(!gfx_window_active())
diff --git a/src/engine/client/ec_gfx.c b/src/engine/client/ec_gfx.c
index 0562a24f..70712ded 100644
--- a/src/engine/client/ec_gfx.c
+++ b/src/engine/client/ec_gfx.c
@@ -489,20 +489,22 @@ int gfx_load_texture_raw(int w, int h, int format, const void *data, int store_f
 	gluBuild2DMipmaps(GL_TEXTURE_2D, store_oglformat, w, h, oglformat, GL_UNSIGNED_BYTE, texdata);
 	
 	/* calculate memory usage */
-	int pixel_size = 4;
-	if(store_format == IMG_RGB)
-		pixel_size = 3;
-	else if(store_format == IMG_ALPHA)
-		pixel_size = 1;
-
-	textures[tex].memsize = w*h*pixel_size;
-	if(mipmap)
 	{
-		while(w > 2 && h > 2)
+		int pixel_size = 4;
+		if(store_format == IMG_RGB)
+			pixel_size = 3;
+		else if(store_format == IMG_ALPHA)
+			pixel_size = 1;
+
+		textures[tex].memsize = w*h*pixel_size;
+		if(mipmap)
 		{
-			w>>=1;
-			h>>=1;
-			textures[tex].memsize += w*h*pixel_size;
+			while(w > 2 && h > 2)
+			{
+				w>>=1;
+				h>>=1;
+				textures[tex].memsize += w*h*pixel_size;
+			}
 		}
 	}
 	
@@ -544,7 +546,9 @@ int gfx_load_mip_texture_raw(int w, int h, int format, const void *data)
 int gfx_load_texture(const char *filename, int store_format)
 {
 	int l = strlen(filename);
+	int id;
 	IMAGE_INFO img;
+	
 	if(l < 3)
 		return 0;
 	if(gfx_load_png(&img, filename))
@@ -552,7 +556,7 @@ int gfx_load_texture(const char *filename, int store_format)
 		if (store_format == IMG_AUTO)
 			store_format = img.format;
 
-		int id = gfx_load_texture_raw(img.width, img.height, img.format, img.data, store_format);
+		id = gfx_load_texture_raw(img.width, img.height, img.format, img.data, store_format);
 		mem_free(img.data);
 		return id;
 	}
@@ -1101,7 +1105,7 @@ void gfx_pretty_text(float x, float y, float size, const char *text, int max_wid
 float gfx_pretty_text_width(float size, const char *text_, int length)
 {
     return gfx_text_width(gfx_font_set, size, text_, length);
-
+	/*
 	const float spacing = 0.05f;
 	float w = 0.0f;
 	const unsigned char *text = (unsigned char *)text_;
@@ -1126,7 +1130,7 @@ float gfx_pretty_text_width(float size, const char *text_, int length)
 		text++;
 	}
 
-	return w;
+	return w;*/
 }
 
 
diff --git a/src/engine/client/ec_inp.c b/src/engine/client/ec_inp.c
index 154342f4..cac69669 100644
--- a/src/engine/client/ec_inp.c
+++ b/src/engine/client/ec_inp.c
@@ -48,19 +48,56 @@ void inp_mouse_relative(int *x, int *y)
 	last_y = ny;
 }
 
-static char last_c = 0;
-static int last_k = 0;
+enum
+{
+	INPUT_BUFFER_SIZE=32
+};
+
+static INPUTEVENT input_events[INPUT_BUFFER_SIZE];
+static int num_events = 0;
+
+static void add_event(char c, int key)
+{
+	if(num_events != INPUT_BUFFER_SIZE)
+	{
+		input_events[num_events].ch = c;
+		input_events[num_events].key = key;
+		num_events++;
+	}
+}
+
+int inp_num_events()
+{
+	return num_events;
+}
+
+void inp_clear_events()
+{
+	num_events = 0;
+}
+
+INPUTEVENT inp_get_event(int index)
+{
+	if(index < 0 || index >= num_events)
+	{
+		INPUTEVENT e = {0,0};
+		return e;
+	}
+	
+	return input_events[index];
+}
+
 
 static void char_callback(int character, int action)
 {
 	if(action == GLFW_PRESS && character < 256)
-		last_c = (char)character;
+		add_event((char)character, 0);
 }
 
 static void key_callback(int key, int action)
 {
 	if(action == GLFW_PRESS)
-		last_k = key;
+		add_event(0, key);
 	
 	if(action == GLFW_PRESS)
 		input_count[input_current^1][key].presses++;
@@ -72,7 +109,7 @@ static void key_callback(int key, int action)
 static void mousebutton_callback(int button, int action)
 {
 	if(action == GLFW_PRESS)
-		last_k = KEY_MOUSE_FIRST+button;
+		add_event(0, KEY_MOUSE_FIRST+button);
 		
 	if(action == GLFW_PRESS)
 		input_count[input_current^1][KEY_MOUSE_FIRST+button].presses++;
@@ -99,7 +136,7 @@ static void mousewheel_callback(int pos)
 			input_count[input_current^1][KEY_MOUSE_WHEEL_UP].releases++;
 		}
 		
-		last_k = KEY_MOUSE_WHEEL_UP;
+		add_event(0, KEY_MOUSE_WHEEL_UP);
 	}
 	else if(pos < 0)
 	{
@@ -109,7 +146,7 @@ static void mousewheel_callback(int pos)
 			input_count[input_current^1][KEY_MOUSE_WHEEL_DOWN].releases++;
 		}	
 
-		last_k = KEY_MOUSE_WHEEL_DOWN;
+		add_event(0, KEY_MOUSE_WHEEL_DOWN);
 	}
 	glfwSetMouseWheel(0);
 }
@@ -124,22 +161,6 @@ void inp_init()
 	glfwSetMouseWheelCallback(mousewheel_callback);
 }
 
-char inp_last_char()
-{
-	return last_c;
-}
-
-int inp_last_key()
-{
-	return last_k;
-}
-
-void inp_clear()
-{
-	last_k = 0;
-	last_c = 0;
-}
-
 void inp_mouse_mode_absolute()
 {
 	glfwEnable(GLFW_MOUSE_CURSOR);
@@ -147,8 +168,8 @@ void inp_mouse_mode_absolute()
 
 void inp_mouse_mode_relative()
 {
-	//if (!config.gfx_debug_resizable)
-	//glfwDisable(GLFW_MOUSE_CURSOR);
+	/*if (!config.gfx_debug_resizable)*/
+	glfwDisable(GLFW_MOUSE_CURSOR);
 }
 
 int inp_mouse_doubleclick()
diff --git a/src/engine/client/ec_snd.c b/src/engine/client/ec_snd.c
index 152eac53..49f050c9 100644
--- a/src/engine/client/ec_snd.c
+++ b/src/engine/client/ec_snd.c
@@ -55,6 +55,7 @@ static int center_x = 0;
 static int center_y = 0;
 
 static int mixing_rate = 48000;
+static volatile int sound_volume = 100;
 
 void snd_set_channel(int cid, float vol, float pan)
 {
@@ -135,10 +136,13 @@ static void mix(short *final_out, unsigned frames)
 {
 	int mix_buffer[MAX_FRAMES*2] = {0};
 	int i, s;
+	int master_vol;
 
 	/* aquire lock while we are mixing */
 	lock_wait(sound_lock);
 	
+	master_vol = sound_volume;
+	
 	for(i = 0; i < NUM_VOICES; i++)
 	{
 		if(voices[i].snd)
@@ -208,12 +212,12 @@ static void mix(short *final_out, unsigned frames)
 			
 		}
 	}
+	
+	
 	/* release the lock */
 	lock_release(sound_lock);
 
 	{
-		int master_vol = config.snd_volume;
-		
 		/* clamp accumulated values */
 		/* TODO: this seams slow */
 		for(i = 0; i < frames; i++)
@@ -283,6 +287,25 @@ int snd_init()
 	err = Pa_StartStream(stream);
 
 	sound_enabled = 1;
+	snd_update(); /* update the volume */
+	return 0;
+}
+
+int snd_update()
+{
+	/* update volume */
+	int wanted_volume = config.snd_volume;
+	
+	if(!gfx_window_active() && config.snd_nonactive_mute)
+		wanted_volume = 0;
+	
+	if(wanted_volume != sound_volume)
+	{
+		lock_wait(sound_lock);
+		sound_volume = wanted_volume;
+		lock_release(sound_lock);
+	}
+	
 	return 0;
 }
 
diff --git a/src/engine/client/ec_srvbrowse.c b/src/engine/client/ec_srvbrowse.c
index d9b3f4ff..3a07d86a 100644
--- a/src/engine/client/ec_srvbrowse.c
+++ b/src/engine/client/ec_srvbrowse.c
@@ -149,6 +149,10 @@ static void client_serverbrowse_filter()
 			filtered = 1;
 		else if(config.b_filter_pw && serverlist[i]->info.flags&1)
 			filtered = 1;
+		else if(config.b_filter_ping < serverlist[i]->info.latency)
+			filtered = 1;
+		else if(!(config.b_filter_gametype&(1<<serverlist[i]->info.game_type)))
+			filtered = 1;
 		else if(config.b_filter_string[0] != 0)
 		{
 			if(strstr(serverlist[i]->info.name, config.b_filter_string) == 0)
@@ -167,6 +171,8 @@ static int client_serverbrowse_sorthash()
 	i |= config.b_filter_full<<5;
 	i |= config.b_filter_pw<<6;
 	i |= config.b_sort_order<<7;
+	i |= config.b_filter_gametype<<8;
+	i |= config.b_filter_ping<<16;
 	return i;
 }
 
diff --git a/src/engine/e_config_variables.h b/src/engine/e_config_variables.h
index 99c10c4b..c3bbc524 100644
--- a/src/engine/e_config_variables.h
+++ b/src/engine/e_config_variables.h
@@ -16,6 +16,9 @@ MACRO_CONFIG_STR(b_filter_string, 64, "")
 MACRO_CONFIG_INT(b_filter_full, 0, 0, 1)
 MACRO_CONFIG_INT(b_filter_empty, 0, 0, 1)
 MACRO_CONFIG_INT(b_filter_pw, 0, 0, 1)
+MACRO_CONFIG_INT(b_filter_ping, 999, 0, 999)
+MACRO_CONFIG_INT(b_filter_gametype, 0xf, 0, 0xf)
+
 MACRO_CONFIG_INT(b_sort, 0, 0, 256)
 MACRO_CONFIG_INT(b_sort_order, 0, 0, 1)
 MACRO_CONFIG_INT(b_max_requests, 10, 0, 1000)
@@ -25,6 +28,8 @@ MACRO_CONFIG_INT(snd_enable, 1, 0, 1)
 MACRO_CONFIG_INT(snd_volume, 100, 0, 100)
 MACRO_CONFIG_INT(snd_device, -1, 0, 0)
 
+MACRO_CONFIG_INT(snd_nonactive_mute, 0, 0, 1)
+
 MACRO_CONFIG_INT(gfx_screen_width, 800, 0, 0)
 MACRO_CONFIG_INT(gfx_screen_height, 600, 0, 0)
 MACRO_CONFIG_INT(gfx_fullscreen, 1, 0, 1)
diff --git a/src/engine/e_interface.h b/src/engine/e_interface.h
index 3f14745c..666d15e5 100644
--- a/src/engine/e_interface.h
+++ b/src/engine/e_interface.h
@@ -396,6 +396,7 @@ void gfx_quads_text(float x, float y, float size, const char *text);
 
 /* sound (client) */
 int snd_init();
+int snd_update();
 
 void snd_set_channel(int cid, float vol, float pan);
 
@@ -758,6 +759,9 @@ const char *mods_version();
 /* server */
 int server_getclientinfo(int client_id, CLIENT_INFO *info);
 const char *server_clientname(int client_id);
+
+/* grabs the latest input for the client. not withholding anything */
+int *server_latestinput(int client_id, int *size);
 void server_setclientname(int client_id, const char *name);
 void server_setclientscore(int client_id, int score);
 
@@ -770,9 +774,19 @@ int server_tickspeed();
 /* input */
 int inp_key_was_pressed(int key);
 int inp_key_down(int key);
-char inp_last_char();
-int inp_last_key();
-void inp_clear();
+
+
+
+typedef struct
+{
+	char ch;
+	int key;
+} INPUTEVENT;
+
+int inp_num_events();
+INPUTEVENT inp_get_event(int index);
+void inp_clear_events();
+
 void inp_update();
 void inp_init();
 void inp_mouse_mode_absolute();
@@ -831,6 +845,7 @@ float client_intrapredtick();
 int client_tickspeed();
 float client_frametime();
 float client_localtime();
+void client_direct_input(int *input, int size);
 
 int client_state();
 const char *client_error_string();
diff --git a/src/engine/server/es_server.c b/src/engine/server/es_server.c
index 7cdaa0dc..fda4b5d5 100644
--- a/src/engine/server/es_server.c
+++ b/src/engine/server/es_server.c
@@ -89,6 +89,7 @@ typedef struct
 	int last_acked_snapshot;
 	SNAPSTORAGE snapshots;
 	
+	CLIENT_INPUT latestinput;
 	CLIENT_INPUT inputs[200]; /* TODO: handle input better */
 	int current_input;
 	
@@ -184,6 +185,13 @@ void snap_free_id(int id)
 	}
 }
 
+int *server_latestinput(int client_id, int *size)
+{
+	if(client_id < 0 || client_id > MAX_CLIENTS || clients[client_id].state < SRVCLIENT_STATE_READY)
+		return 0;
+	return clients[client_id].latestinput.data;
+}
+
 const char *server_clientname(int client_id)
 {
 	if(client_id < 0 || client_id > MAX_CLIENTS || clients[client_id].state < SRVCLIENT_STATE_READY)
@@ -489,6 +497,8 @@ static int new_client_callback(int cid, void *user)
 	}
 	clients[cid].current_input = 0;
 	
+	mem_zero(&clients[cid].latestinput, sizeof(clients[cid].latestinput));
+	
 	snapstorage_purge_all(&clients[cid].snapshots);
 	clients[cid].last_acked_snapshot = -1;
 	clients[cid].snap_rate = SRVCLIENT_SNAPRATE_INIT;
@@ -624,7 +634,9 @@ static void server_process_client_packet(NETPACKET *packet)
 			
 			for(i = 0; i < size/4; i++)
 				input->data[i] = msg_unpack_int();
-				
+			
+			mem_copy(clients[cid].latestinput.data, input->data, MAX_INPUT_SIZE*sizeof(int));
+			
 			clients[cid].current_input++;
 			clients[cid].current_input %= 200;
 		}