about summary refs log tree commit diff
path: root/src/engine
diff options
context:
space:
mode:
authorMagnus Auvinen <magnus.auvinen@gmail.com>2008-12-19 12:00:05 +0000
committerMagnus Auvinen <magnus.auvinen@gmail.com>2008-12-19 12:00:05 +0000
commit8ec0bdc509fa218edc4cc9a08659a18f04ce6227 (patch)
treeac279058e84bc45182ec329a759951d082c84efe /src/engine
parentcc576906a318007e789f6dec9fb9b1a75c3ce62e (diff)
downloadzcatch-8ec0bdc509fa218edc4cc9a08659a18f04ce6227.tar.gz
zcatch-8ec0bdc509fa218edc4cc9a08659a18f04ce6227.zip
improved the demo players scrubbing capabilities
Diffstat (limited to 'src/engine')
-rw-r--r--src/engine/e_demorec.c28
-rw-r--r--src/engine/e_demorec.h2
-rw-r--r--src/engine/e_network_conn.c1
3 files changed, 27 insertions, 4 deletions
diff --git a/src/engine/e_demorec.c b/src/engine/e_demorec.c
index f19dac22..cf3939dc 100644
--- a/src/engine/e_demorec.c
+++ b/src/engine/e_demorec.c
@@ -368,7 +368,7 @@ static void do_tick()
 		{
 			/* stop on error or eof */
 			dbg_msg("demorec", "end of file");
-			demorec_playback_stop();
+			demorec_playback_pause();
 			break;
 		}
 		
@@ -529,19 +529,40 @@ int demorec_playback_play()
 	return 0;
 }
 
-int demorec_playback_set(int keyframe)
+int demorec_playback_set(float percent)
 {
+	int keyframe;
+	int wanted_tick;
 	if(!play_file)
 		return -1;
+	
+	/* -5 because we have to have a current tick and previous tick when we do the playback */
+	wanted_tick = playbackinfo.first_tick + (int)((playbackinfo.last_tick-playbackinfo.first_tick)*percent) - 5;
+	
+	keyframe = (int)(playbackinfo.seekable_points*percent);
+
 	if(keyframe < 0 || keyframe >= playbackinfo.seekable_points)
 		return -1;
 	
+	/* get correct key frame */
+	if(keyframes[keyframe].tick < wanted_tick)
+		while(keyframe < playbackinfo.seekable_points-1 && keyframes[keyframe].tick < wanted_tick)
+			keyframe++;
+
+	while(keyframe && keyframes[keyframe].tick > wanted_tick)
+		keyframe--;
+	
+	/* seek to the correct keyframe */
 	io_seek(play_file, keyframes[keyframe].filepos, IOSEEK_START);
 
 	/*playbackinfo.start_tick = -1;*/
 	playbackinfo.next_tick = -1;
 	playbackinfo.current_tick = -1;
 	playbackinfo.previous_tick = -1;
+
+	/* playback everything until we hit our tick */
+	while(playbackinfo.previous_tick < wanted_tick)
+		do_tick();
 	
 	demorec_playback_play();
 	
@@ -581,6 +602,9 @@ int demorec_playback_update()
 			
 			/* do one more tick */
 			do_tick();
+			
+			if(playbackinfo.paused)
+				return 0;
 		}
 
 		/* update intratick */
diff --git a/src/engine/e_demorec.h b/src/engine/e_demorec.h
index 3c4f3a41..482debb4 100644
--- a/src/engine/e_demorec.h
+++ b/src/engine/e_demorec.h
@@ -64,7 +64,7 @@ int demorec_playback_play();
 void demorec_playback_pause();
 void demorec_playback_unpause();
 void demorec_playback_setspeed(float speed);
-int demorec_playback_set(int keyframe);
+int demorec_playback_set(float precent);
 int demorec_playback_update();
 const DEMOREC_PLAYBACKINFO *demorec_playback_info();
 int demorec_isplaying();
diff --git a/src/engine/e_network_conn.c b/src/engine/e_network_conn.c
index 319a5286..a8ef588f 100644
--- a/src/engine/e_network_conn.c
+++ b/src/engine/e_network_conn.c
@@ -15,7 +15,6 @@ static void conn_reset(NETCONNECTION *conn)
 	conn->remote_closed = 0;
 	
 	conn->state = NET_CONNSTATE_OFFLINE;
-	conn->state = NET_CONNSTATE_OFFLINE;
 	conn->last_send_time = 0;
 	conn->last_recv_time = 0;
 	conn->last_update_time = 0;