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:
parent
e78bd38e32
commit
827f0d5fd1
|
@ -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
|
||||
--------
|
||||
|
|
|
@ -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)
|
||||
|
|
34
main/game.c
34
main/game.c
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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: {
|
||||
|
|
144
main/newdemo.c
144
main/newdemo.c
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue