Correctly saving Reverse Stereo setting; Added Demo playback help keys; aligned Demo recording to 20 frames per second to save lots of hard drive space

This commit is contained in:
zicodxx 2007-11-06 20:33:22 +00:00
parent e78bd38e32
commit 827f0d5fd1
6 changed files with 127 additions and 74 deletions

View file

@ -1,8 +1,12 @@
D1X-Rebirth Changelog
20071105
--------
arch/sdl/jukebox.c: Fixed crash on absent or invalid jukebox directory
20071106
--------
main/config.c, main/game.c, main/game.h, main/menu.c, main/newdemo.c: Correctly saving Reverse Stereo setting; Added Demo playback help keys; aligned Demo recording to 20 frames per second to save lots of hard drive space
20071105
--------
arch/sdl/jukebox.c: Fixed crash on absent or invalid jukebox directory
20071101
--------

View file

@ -35,6 +35,7 @@ char config_last_player[CALLSIGN_LEN+1] = "";
char config_last_mission[MISSION_NAME_LEN+1] = "";
static char *DigiVolumeStr="DigiVolume";
static char *MidiVolumeStr="MidiVolume";
static char *ReverseStereoStr="ReverseStereo";
static char *GammaLevelStr="GammaLevelStr";
static char *DetailLevelStr="DetailLevelStr";
static char *LastPlayerStr="LastPlayerStr";
@ -131,6 +132,8 @@ int ReadConfigFile()
Config_digi_volume = strtol(value, NULL, 10);
else if (!strcmp(token, MidiVolumeStr))
Config_midi_volume = strtol(value, NULL, 10);
else if (!strcmp(token, ReverseStereoStr))
Config_channels_reversed = strtol(value, NULL, 10);
else if (!strcmp(token, GammaLevelStr)) {
gamma = strtol(value, NULL, 10);
gr_palette_set_gamma( gamma );
@ -201,6 +204,8 @@ int WriteConfigFile()
fputs(str, infile);
sprintf (str, "%s=%d\n", MidiVolumeStr, Config_midi_volume);
fputs(str, infile);
sprintf (str, "%s=%d\n", ReverseStereoStr, Config_channels_reversed);
fputs(str, infile);
sprintf (str, "%s=%d\n", GammaLevelStr, gamma);
fputs(str, infile);
if (Detail_level == NUM_DETAIL_LEVELS-1)

View file

@ -1226,14 +1226,6 @@ void advance_sound()
void test_anim_states();
//put up the help message
void do_show_help()
{
show_help();
}
//--unused-- int save_newdemo_state;
extern int been_in_editor;
// ------------------------------------------------------------------------------------
@ -1524,7 +1516,7 @@ int do_game_pause()
break;
case KEY_F1:
clear_boxed_message();
do_show_help();
show_help();
show_boxed_message(TXT_PAUSE);
break;
case KEY_PAUSE:
@ -1570,6 +1562,22 @@ void show_help()
newmenu_dotiny( NULL, TXT_KEYS, mc, m, NULL );
}
void show_newdemo_help()
{
newmenu_item m[8];
int mc = 0;
m[mc].type = NM_TYPE_TEXT; m[mc].text = "UP\t PLAY"; mc++;
m[mc].type = NM_TYPE_TEXT; m[mc].text = "DOWN\t PAUSE"; mc++;
m[mc].type = NM_TYPE_TEXT; m[mc].text = "RIGHT\t ONE FRAME FORWARD"; mc++;
m[mc].type = NM_TYPE_TEXT; m[mc].text = "LEFT\t ONE FRAME BACKWARD"; mc++;
m[mc].type = NM_TYPE_TEXT; m[mc].text = "SHIFT-RIGHT\t FAST FORWARD"; mc++;
m[mc].type = NM_TYPE_TEXT; m[mc].text = "SHIFT-LEFT\t FAST BACKWARD"; mc++;
m[mc].type = NM_TYPE_TEXT; m[mc].text = "CTRL-RIGHT\t JUMP TO END"; mc++;
m[mc].type = NM_TYPE_TEXT; m[mc].text = "CTRL-LEFT\t JUMP TO START"; mc++;
newmenu_dotiny( NULL, "DEMO PLAYBACK CONTROLS", mc, m, NULL );
}
//temp function until Matt cleans up game sequencing
extern void temp_reset_stuff_on_level();
@ -1964,9 +1972,9 @@ void HandleDemoKey(int key)
}
break;
#endif
case KEY_F3: toggle_cockpit(); break;
case KEY_F2: Config_menu_flag = 1; break;
case KEY_F1: show_newdemo_help(); break;
case KEY_F3: toggle_cockpit(); break;
case KEY_F2: Config_menu_flag = 1; break;
case KEY_F7:
#ifdef NETWORK
Show_kill_list = (Show_kill_list+1) % ((Newdemo_game_mode & GM_TEAM) ? 4 : 3);
@ -2252,7 +2260,7 @@ void HandleGameKey(int key)
Function_mode = FMODE_MENU;
}
break;
case KEY_F1: do_show_help(); break;
case KEY_F1: show_help(); break;
case KEY_F2: Config_menu_flag = 1; break;
case KEY_F3: toggle_cockpit(); break;

View file

@ -203,7 +203,7 @@ void reset_palette_add (void);
void palette_restore (void);
//put up the help message
void do_show_help ();
void show_help ();
//show a message in a nice little box
void show_boxed_message (char *msg);

View file

@ -322,10 +322,6 @@ void do_option ( int select)
RegisterPlayer(); //1 == allow escape out of menu
break;
case MENU_HELP:
do_show_help();
break;
#ifndef RELEASE
case MENU_PLAY_SONG: {

View file

@ -168,7 +168,7 @@ sbyte Newdemo_players_cloaked;
sbyte Newdemo_warning_given = 0;
sbyte Newdemo_cntrlcen_destroyed = 0;
static sbyte nd_bad_read;
int NewdemoFrameCount;
int NewdemoFrameCount, TotalFrames;
short frame_bytes_written = 0;
fix nd_playback_total;
fix nd_recorded_total;
@ -183,13 +183,7 @@ FILE *infile;
FILE *outfile;
int newdemo_get_percent_done() {
if ( Newdemo_state == ND_STATE_PLAYBACK ) {
return (ftell(infile)*100)/Newdemo_size;
}
if ( Newdemo_state == ND_STATE_RECORDING ) {
return ftell(outfile);
}
return 0;
return (NewdemoFrameCount*100)/TotalFrames;
}
#define VEL_PRECISION 12
@ -783,12 +777,18 @@ void nd_write_object(object *obj)
}
int RecordFrame=1;
static fix last_rec_time=0;
#define REC_DELAY F1_0/20
void newdemo_record_start_demo()
{
#ifndef SHAREWARE
int i;
#endif
last_rec_time=GameTime-REC_DELAY; // make sure first frame is recorded!
stop_time();
nd_write_byte(ND_EVENT_START_DEMO);
nd_write_byte(DEMO_VERSION);
@ -862,22 +862,42 @@ void newdemo_record_start_frame(int frame_number, fix frame_time )
return;
}
stop_time();
frame_number -= Newdemo_start_frame;
// Make demo recording waste a bit less space.
// First check if if at least REC_DELAY has passed since last recorded frame. If yes, record frame and set RecordFrame true.
// RecordFrame will be used for various other frame-by-frame events to drop some unnecessary bytes.
// frame_time must be modified to get the right playback speed.
if (last_rec_time > GameTime)
last_rec_time=GameTime-REC_DELAY;
Assert(frame_number >= 0 );
nd_write_byte(ND_EVENT_START_FRAME);
nd_write_short(frame_bytes_written - 1); // from previous frame
frame_bytes_written=3;
nd_write_int(frame_number);
nd_write_int(frame_time);
start_time();
if (last_rec_time + REC_DELAY <= GameTime || frame_time >= REC_DELAY)
{
last_rec_time = GameTime-(GameTime-(last_rec_time + REC_DELAY));
if (frame_time < REC_DELAY)
frame_time = REC_DELAY;
RecordFrame=1;
stop_time();
frame_number -= Newdemo_start_frame;
Assert(frame_number >= 0 );
nd_write_byte(ND_EVENT_START_FRAME);
nd_write_short(frame_bytes_written - 1); // from previous frame
frame_bytes_written=3;
nd_write_int(frame_number);
nd_write_int(frame_time);
start_time();
}
else
{
RecordFrame=0;
}
}
void newdemo_record_render_object(object * obj)
{
if (!RecordFrame)
return;
stop_time();
nd_write_byte(ND_EVENT_RENDER_OBJECT);
nd_write_object(obj);
@ -886,6 +906,8 @@ void newdemo_record_render_object(object * obj)
void newdemo_record_viewer_object(object * obj)
{
if (!RecordFrame)
return;
stop_time();
nd_write_byte(ND_EVENT_VIEWER_OBJECT);
nd_write_object(obj);
@ -967,14 +989,10 @@ void newdemo_record_hostage_rescued( int hostage_number ) {
}
void newdemo_record_morph_frame(morph_data *md) {
if (!RecordFrame)
return;
stop_time();
nd_write_byte( ND_EVENT_MORPH_FRAME );
#if 0
newdemo_write( md->morph_vecs, sizeof(md->morph_vecs), 1 );
newdemo_write( md->submodel_active, sizeof(md->submodel_active), 1 );
newdemo_write( md->submodel_startpoints, sizeof(md->submodel_startpoints), 1 );
#endif
nd_write_object( md->obj );
start_time();
}
@ -1005,6 +1023,8 @@ void newdemo_record_hud_message( char * message )
void newdemo_record_palette_effect(short r, short g, short b )
{
if (!RecordFrame)
return;
stop_time();
nd_write_byte( ND_EVENT_PALETTE_EFFECT );
nd_write_short( r );
@ -1221,6 +1241,8 @@ void newdemo_record_multi_score(int pnum, int score)
void newdemo_record_primary_ammo(int old_ammo, int new_ammo)
{
if (!RecordFrame)
return;
stop_time();
nd_write_byte(ND_EVENT_PRIMARY_AMMO);
if (old_ammo < 0)
@ -1233,6 +1255,8 @@ void newdemo_record_primary_ammo(int old_ammo, int new_ammo)
void newdemo_record_secondary_ammo(int old_ammo, int new_ammo)
{
if (!RecordFrame)
return;
stop_time();
nd_write_byte(ND_EVENT_SECONDARY_AMMO);
if (old_ammo < 0)
@ -2247,7 +2271,7 @@ void newdemo_goto_beginning()
}
#ifdef SHAREWARE
void newdemo_goto_end()
void newdemo_goto_end(int FrameCountOnly)
{
short frame_length;
sbyte level;
@ -2255,17 +2279,20 @@ void newdemo_goto_end()
fseek(infile, -2, SEEK_END);
nd_read_byte(&level);
if ((level < Last_secret_level) || (level > Last_level)) {
newmenu_item m[3];
m[ 0].type = NM_TYPE_TEXT; m[ 0].text = TXT_CANT_PLAYBACK;
m[ 1].type = NM_TYPE_TEXT; m[ 1].text = TXT_LEVEL_CANT_LOAD;
m[ 2].type = NM_TYPE_TEXT; m[ 2].text = TXT_DEMO_OLD_CORRUPT;
newmenu_do( NULL, NULL, sizeof(m)/sizeof(*m), m, NULL );
newdemo_stop_playback();
return;
}
if (level != Current_level_num) {
if (!FrameCountOnly)
if ((level < Last_secret_level) || (level > Last_level)) {
newmenu_item m[3];
m[ 0].type = NM_TYPE_TEXT; m[ 0].text = TXT_CANT_PLAYBACK;
m[ 1].type = NM_TYPE_TEXT; m[ 1].text = TXT_LEVEL_CANT_LOAD;
m[ 2].type = NM_TYPE_TEXT; m[ 2].text = TXT_DEMO_OLD_CORRUPT;
newmenu_do( NULL, NULL, sizeof(m)/sizeof(*m), m, NULL );
newdemo_stop_playback();
return;
}
if (level != Current_level_num && !FrameCountOnly) {
LoadLevel(level);
piggy_load_level_data();
}
@ -2289,7 +2316,7 @@ void newdemo_goto_end()
return;
}
#else
void newdemo_goto_end()
void newdemo_goto_end(int FrameCountOnly)
{
short frame_length, byte_count, bshort;
sbyte level, bbyte, laser_level;
@ -2299,17 +2326,19 @@ void newdemo_goto_end()
fseek(infile, -2, SEEK_END);
nd_read_byte(&level);
if ((level < Last_secret_level) || (level > Last_level)) {
newmenu_item m[3];
if (!FrameCountOnly)
if ((level < Last_secret_level) || (level > Last_level)) {
newmenu_item m[3];
m[ 0].type = NM_TYPE_TEXT; m[ 0].text = TXT_CANT_PLAYBACK;
m[ 1].type = NM_TYPE_TEXT; m[ 1].text = TXT_LEVEL_CANT_LOAD;
m[ 2].type = NM_TYPE_TEXT; m[ 2].text = TXT_DEMO_OLD_CORRUPT;
newmenu_do( NULL, NULL, sizeof(m)/sizeof(*m), m, NULL );
newdemo_stop_playback();
return;
}
m[ 0].type = NM_TYPE_TEXT; m[ 0].text = TXT_CANT_PLAYBACK;
m[ 1].type = NM_TYPE_TEXT; m[ 1].text = TXT_LEVEL_CANT_LOAD;
m[ 2].type = NM_TYPE_TEXT; m[ 2].text = TXT_DEMO_OLD_CORRUPT;
newmenu_do( NULL, NULL, sizeof(m)/sizeof(*m), m, NULL );
newdemo_stop_playback();
return;
}
if (level != Current_level_num) {
if (level != Current_level_num && !FrameCountOnly) {
LoadLevel(level);
piggy_load_level_data();
}
@ -2607,18 +2636,25 @@ void newdemo_playback_one_frame()
nd_playback_total = nd_recorded_total; // baseline total playback time
else
nd_playback_total += FrameTime;
if ((playback_style == NORMAL_PLAYBACK) && (NewdemoFrameCount > 10))
if (playback_style == NORMAL_PLAYBACK)
{
if (nd_playback_total > nd_recorded_total)
playback_style = SKIP_PLAYBACK;
if ((nd_playback_total * INTERPOL_FACTOR) < nd_recorded_total) {
playback_style = INTERPOLATE_PLAYBACK;
nd_playback_total = nd_recorded_total + FrameTime; // baseline playback time
base_interpol_time = nd_recorded_total;
d_recorded = nd_recorded_time; // baseline delta recorded
}
if ((playback_style == NORMAL_PLAYBACK) && (NewdemoFrameCount > 10))
if (nd_playback_total > nd_recorded_total)
playback_style = SKIP_PLAYBACK;
else
{
if (NewdemoFrameCount > 0 && NewdemoFrameCount < 10)
newdemo_back_frames(1);
}
}
if ((playback_style == INTERPOLATE_PLAYBACK) && Newdemo_do_interpolate) {
fix d_play = 0;
@ -2916,6 +2952,10 @@ void newdemo_start_playback(char * filename)
return;
}
newdemo_goto_end(1);
TotalFrames=NewdemoFrameCount;
fseek(infile, 0, SEEK_SET);
nd_bad_read = 0;
#ifdef NETWORK
change_playernum_to(0); // force playernum to 0
@ -2994,7 +3034,7 @@ void newdemo_strip_frames(char *outname, int bytes_to_strip)
newdemo_stop_playback();
return;
}
newdemo_goto_end();
newdemo_goto_end(0);
trailer_start = ftell(infile);
fseek(infile, 11, SEEK_CUR);
bytes_back = 0;