about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2007-12-11 23:00:48 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2007-12-11 23:00:48 +0000
commit7cf32e6f972ca4f7cd0bdb1e8a85930a16244747 (patch)
treefabae9492360747dc4444e22e44b9acd01541fc7 /src
parente9560899a388c2ba31fb7e9e6d43c152644f603f (diff)
downloadzcatch-7cf32e6f972ca4f7cd0bdb1e8a85930a16244747.tar.gz
zcatch-7cf32e6f972ca4f7cd0bdb1e8a85930a16244747.zip
fixed scoreboard stuff
Diffstat (limited to 'src')
-rw-r--r--src/engine/client/client.c24
-rw-r--r--src/engine/client/gfx.c1
-rw-r--r--src/game/client/game_client.cpp43
3 files changed, 63 insertions, 5 deletions
diff --git a/src/engine/client/client.c b/src/engine/client/client.c
index 6e1e88d6..7a545988 100644
--- a/src/engine/client/client.c
+++ b/src/engine/client/client.c
@@ -48,6 +48,8 @@ static int64 local_start_time;
 
 static int debug_font;
 static float frametime = 0.0001f;
+static float frametime_low = 1.0f;
+static float frametime_high = 0.0f;
 static int frames = 0;
 static NETADDR4 server_address;
 static int window_must_refocus = 0;
@@ -875,6 +877,7 @@ static void client_update()
 	{
 		int repredict = 0;
 		int64 now = st_get(&game_time, time_get());
+		int64 pred_now = st_get(&predicted_time, time_get());
 
 		while(1)
 		{
@@ -909,10 +912,10 @@ static void client_update()
 		{
 			int64 curtick_start = (snapshots[SNAP_CURRENT]->tick)*time_freq()/50;
 			int64 prevtick_start = (snapshots[SNAP_PREV]->tick)*time_freq()/50;
-			int64 pred_now = st_get(&predicted_time, time_get());
 			/*tg_add(&predicted_time_graph, pred_now, 0); */
 			int prev_pred_tick = (int)(pred_now*50/time_freq());
 			int new_pred_tick = prev_pred_tick+1;
+			static float last_intrapred = 0;
 
 			intratick = (now - prevtick_start) / (float)(curtick_start-prevtick_start);
 
@@ -922,14 +925,20 @@ static void client_update()
 			prevtick_start = prev_pred_tick*time_freq()/50;
 			intrapredtick = (pred_now - prevtick_start) / (float)(curtick_start-prevtick_start);
 			
+			
 			if(new_pred_tick > current_predtick)
 			{
+				last_intrapred = intrapredtick;
 				current_predtick = new_pred_tick;
 				repredict = 1;
 				
 				/* send input */
 				client_send_input();
 			}
+			
+			if(intrapredtick < last_intrapred)
+				dbg_msg("client", "prediction time goes backwards, that can't be good");
+			last_intrapred = intrapredtick;
 		}
 
 		/* only do sane predictions */
@@ -1091,15 +1100,24 @@ static void client_run()
 		{
 			if(config.debug)
 			{
-				dbg_msg("client/report", "fps=%.02f netstate=%d",
-					frames/(float)(reportinterval/time_freq()), netclient_state(net));
+				dbg_msg("client/report", "fps=%.02f (%.02f %.02f) netstate=%d",
+					frames/(float)(reportinterval/time_freq()),
+					1.0f/frametime_high,
+					1.0f/frametime_low,
+					netclient_state(net));
 			}
+			frametime_low = 1;
+			frametime_high = 0;
 			frames = 0;
 			reporttime += reportinterval;
 		}
 		
 		/* update frametime */
 		frametime = (time_get()-frame_start_time)/(float)time_freq();
+		if(frametime < frametime_low)
+			frametime_low = frametime;
+		if(frametime > frametime_high)
+			frametime_high = frametime;
 	}
 	
 	modc_shutdown();
diff --git a/src/engine/client/gfx.c b/src/engine/client/gfx.c
index 5d7ca4d8..31483224 100644
--- a/src/engine/client/gfx.c
+++ b/src/engine/client/gfx.c
@@ -628,6 +628,7 @@ void gfx_swap()
 	}
 	
 	glfwSwapBuffers();
+	glFinish();
 	glfwPollEvents();
 }
 
diff --git a/src/game/client/game_client.cpp b/src/game/client/game_client.cpp
index 75899ae5..c910014c 100644
--- a/src/game/client/game_client.cpp
+++ b/src/game/client/game_client.cpp
@@ -753,10 +753,15 @@ static void process_events(int s)
 
 static player_core predicted_prev_player;
 static player_core predicted_player;
+static int predicted_tick = 0;
 static int last_new_predicted_tick = -1;
 
 extern "C" void modc_predict()
 {
+	player_core before_prev_player = predicted_prev_player;
+	player_core before_player = predicted_player;
+
+
 	// repredict player
 	world_core world;
 	int local_cid = -1;
@@ -849,6 +854,27 @@ extern "C" void modc_predict()
 		if(tick == client_predtick() && world.players[local_cid])
 			predicted_player = *world.players[local_cid];
 	}
+	
+	if(config.debug && predicted_tick == client_predtick())
+	{
+		if(predicted_player.pos.x != before_player.pos.x ||
+			predicted_player.pos.y != before_player.pos.y)
+		{
+			dbg_msg("client", "prediction error, (%d %d) (%d %d)", 
+				(int)before_player.pos.x, (int)before_player.pos.y,
+				(int)predicted_player.pos.x, (int)predicted_player.pos.y);
+		}
+
+		if(predicted_prev_player.pos.x != before_prev_player.pos.x ||
+			predicted_prev_player.pos.y != before_prev_player.pos.y)
+		{
+			dbg_msg("client", "prediction error, prev (%d %d) (%d %d)", 
+				(int)before_prev_player.pos.x, (int)before_prev_player.pos.y,
+				(int)predicted_prev_player.pos.x, (int)predicted_prev_player.pos.y);
+		}
+	}
+	
+	predicted_tick = client_predtick();
 }
 
 static void clear_object_pointers()
@@ -2441,7 +2467,7 @@ void render_game()
 		gfx_quads_end();
 	}
 
-	if(local_character && !spectate)
+	if(local_character && !spectate && !(gameobj && gameobj->game_over))
 	{
 		gfx_texture_set(data->images[IMAGE_GAME].id);
 		gfx_quads_begin();
@@ -2668,7 +2694,7 @@ void render_game()
 		}
 
 		// render small score hud
-		if(gametype == GAMETYPE_TDM || gametype == GAMETYPE_CTF)
+		if(!(gameobj && gameobj->game_over) && (gametype == GAMETYPE_TDM || gametype == GAMETYPE_CTF))
 		{
 			for(int t = 0; t < 2; t++)
 			{
@@ -2792,6 +2818,19 @@ void render_game()
 		}
 		else
 		{
+				
+			if(gameobj && gameobj->game_over)
+			{
+				const char *text = "DRAW!";
+				if(gameobj->teamscore[0] > gameobj->teamscore[1])
+					text = "Red Team Wins!";
+				else if(gameobj->teamscore[1] > gameobj->teamscore[0])
+					text = "Blue Team Wins!";
+					
+				float w = gfx_pretty_text_width(92.0f, text, -1);
+				gfx_pretty_text(width/2-w/2, 45, 92.0f, text, -1);
+			}
+			
 			render_scoreboard(width/2-w-20, 150.0f, w, 0, "Red Team");
 			render_scoreboard(width/2 + 20, 150.0f, w, 1, "Blue Team");
 		}