diff -ur ../osrc/d1x-rebirth_v0.58.1-src/main/collide.c d1x-rebirth_v0.58.1-src/main/collide.c --- ../osrc/d1x-rebirth_v0.58.1-src/main/collide.c 2013-04-22 12:04:48.000000000 +0200 +++ d1x-rebirth_v0.58.1-src/main/collide.c 2018-12-22 13:03:23.727351500 +0100 @@ -864,6 +864,8 @@ Players[Player_num].num_kills_level++; Players[Player_num].num_kills_total++; + if (Newdemo_state == ND_STATE_RECORDING) + newdemo_record_num_kills(Players[Player_num].num_kills_level, Players[Player_num].num_kills_total); if (Robot_info[robot->id].boss_flag) { start_boss_death_sequence(robot); //do_controlcen_destroyed_stuff(NULL); diff -ur ../osrc/d1x-rebirth_v0.58.1-src/main/gamerend.c d1x-rebirth_v0.58.1-src/main/gamerend.c --- ../osrc/d1x-rebirth_v0.58.1-src/main/gamerend.c 2013-06-27 11:28:34.000000000 +0200 +++ d1x-rebirth_v0.58.1-src/main/gamerend.c 2018-12-18 19:43:59.494332000 +0100 @@ -76,15 +76,8 @@ } #endif -void show_framerate() -{ - static int fps_count = 0, fps_rate = 0; +static int lower_text_y_pos() { int y = GHEIGHT; - static fix64 fps_time = 0; - - gr_set_curfont(GAME_FONT); - gr_set_fontcolor(BM_XRGB(0,31,0),-1); - if (PlayerCfg.CockpitMode[1] == CM_FULL_SCREEN) { if ((Game_mode & GM_MULTI) || (Newdemo_state == ND_STATE_PLAYBACK && Newdemo_game_mode & GM_MULTI)) y -= LINE_SPACING * 10; @@ -101,6 +94,16 @@ else y -= LINE_SPACING * 2; } + return y; +} + +void show_framerate() +{ + static int fps_count = 0, fps_rate = 0; + static fix64 fps_time = 0; + + gr_set_curfont(GAME_FONT); + gr_set_fontcolor(BM_XRGB(0,31,0),-1); fps_count++; if (timer_query() >= fps_time + F1_0) @@ -109,7 +112,18 @@ fps_count = 0; fps_time = timer_query(); } - gr_printf(SWIDTH-(GameArg.SysMaxFPS>999?FSPACX(43):FSPACX(37)),y,"FPS: %i",fps_rate); + gr_printf(SWIDTH-(GameArg.SysMaxFPS>999?FSPACX(43):FSPACX(37)),lower_text_y_pos(),"FPS: %i",fps_rate); +} + +void show_robot_kills() +{ + if ( ((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP)) ) + return; + + gr_set_curfont(GAME_FONT); + gr_set_fontcolor(BM_XRGB(0,31,0),-1); + + gr_printf(FSPACX(1),lower_text_y_pos(),"Kills: %i",Players[Player_num].num_kills_level); } #ifdef NETWORK @@ -331,6 +345,8 @@ if (GameCfg.FPSIndicator && PlayerCfg.CockpitMode[1] != CM_REAR_VIEW) show_framerate(); + show_robot_kills(); + if (Newdemo_state == ND_STATE_PLAYBACK) Game_mode = Newdemo_game_mode; diff -ur ../osrc/d1x-rebirth_v0.58.1-src/main/gameseq.c d1x-rebirth_v0.58.1-src/main/gameseq.c --- ../osrc/d1x-rebirth_v0.58.1-src/main/gameseq.c 2013-06-27 11:28:34.000000000 +0200 +++ d1x-rebirth_v0.58.1-src/main/gameseq.c 2018-12-22 13:13:04.256016300 +0100 @@ -306,6 +306,9 @@ Players[Player_num].killer_objnum = -1; Players[Player_num].num_kills_level = 0; + if (Newdemo_state == ND_STATE_RECORDING) + newdemo_record_num_kills(Players[Player_num].num_kills_level, Players[Player_num].num_kills_total); + Players[Player_num].num_robots_level = count_number_of_robots(); Players[Player_num].num_robots_total += Players[Player_num].num_robots_level; diff -ur ../osrc/d1x-rebirth_v0.58.1-src/main/gauges.c d1x-rebirth_v0.58.1-src/main/gauges.c --- ../osrc/d1x-rebirth_v0.58.1-src/main/gauges.c 2013-06-27 11:28:34.000000000 +0200 +++ d1x-rebirth_v0.58.1-src/main/gauges.c 2018-12-18 19:37:23.999712200 +0100 @@ -725,6 +725,13 @@ gr_set_fontcolor(Color_0_31_0, -1); gr_string(grd_curcanv->cv_bitmap.bm_w-w-FSPACX(1), FSPACY(1), score_str); + + /* + if ( !((Game_mode & GM_MULTI) && !(Game_mode & GM_MULTI_COOP)) ) { + sprintf(score_str, "%s: %5d", "Kills", Players[Player_num].num_kills_level); + gr_string(grd_curcanv->cv_bitmap.bm_w-w-FSPACX(1), FSPACY(9), score_str); + } + */ } void hud_show_timer_count() diff -ur ../osrc/d1x-rebirth_v0.58.1-src/main/newdemo.c d1x-rebirth_v0.58.1-src/main/newdemo.c --- ../osrc/d1x-rebirth_v0.58.1-src/main/newdemo.c 2013-06-30 20:41:07.000000000 +0200 +++ d1x-rebirth_v0.58.1-src/main/newdemo.c 2018-12-22 17:06:45.420454400 +0100 @@ -130,6 +130,7 @@ #define ND_EVENT_LASER_LEVEL 42 // with old/new level #define ND_EVENT_LINK_SOUND_TO_OBJ 43 // record digi_link_sound_to_object3 #define ND_EVENT_KILL_SOUND_TO_OBJ 44 // record digi_kill_sound_linked_to_object +#define ND_EVENT_NUM_KILLS 45 // sized, with old level, old total, new level, new total #define NORMAL_PLAYBACK 0 #define SKIP_PLAYBACK 1 @@ -145,6 +146,7 @@ #define DEMO_GAME_TYPE_SHAREWARE 1 #define DEMO_GAME_TYPE 2 +#define DEMO_HAS_SIZED 4 // added to game-type to indicate sized extensions // In- and Out-files PHYSFS_file *infile; @@ -188,6 +190,8 @@ static fix nd_record_v_homing_distance = -1; static int nd_record_v_primary_ammo = -1; static int nd_record_v_secondary_ammo = -1; +static int nd_record_v_num_kills_level = -1; +static int nd_record_v_num_kills_total = -1; void newdemo_record_oneframeevent_update(int wallupdate); extern int digi_link_sound_to_object3( int org_soundnum, short objnum, int forever, fix max_volume, fix max_distance, int loop_start, int loop_end ); @@ -821,7 +825,7 @@ stop_time(); nd_write_byte(ND_EVENT_START_DEMO); nd_write_byte(DEMO_VERSION); - nd_write_byte(DEMO_GAME_TYPE); + nd_write_byte(DEMO_GAME_TYPE | DEMO_HAS_SIZED); nd_write_fix(0); // NOTE: This is supposed to write GameTime (in fix). Since our GameTime64 is fix64 and the demos do not NEED this time actually, just write 0. #ifdef NETWORK @@ -862,6 +866,8 @@ nd_record_v_homing_distance = -1; nd_record_v_primary_ammo = -1; nd_record_v_secondary_ammo = -1; + nd_record_v_num_kills_level = -1; + nd_record_v_num_kills_total = -1; for (i = 0; i < MAX_PRIMARY_WEAPONS; i++) nd_write_short((short)Players[Player_num].primary_ammo[i]); @@ -884,6 +890,7 @@ nd_write_byte((sbyte)Primary_weapon); nd_write_byte((sbyte)Secondary_weapon); nd_record_v_start_frame = nd_record_v_frame_number = 0; + newdemo_record_num_kills(Players[Player_num].num_kills_level, Players[Player_num].num_kills_total); newdemo_set_new_level(Current_level_num); newdemo_record_oneframeevent_update(1); start_time(); @@ -1322,6 +1329,20 @@ start_time(); } +void newdemo_record_num_kills(int num_kills_level, int num_kills_total) +{ + stop_time(); + nd_write_byte(ND_EVENT_NUM_KILLS); + nd_write_short(4 * 4); + nd_write_int(nd_record_v_num_kills_level < 0 ? num_kills_level : nd_record_v_num_kills_level); + nd_write_int(nd_record_v_num_kills_total < 0 ? num_kills_total : nd_record_v_num_kills_total); + nd_write_int(num_kills_level); + nd_write_int(num_kills_total); + nd_record_v_num_kills_level = num_kills_level; + nd_record_v_num_kills_total = num_kills_total; + start_time(); +} + void newdemo_set_new_level(int level_num) { @@ -1407,6 +1428,7 @@ return 1; } nd_read_byte(&game_type); + game_type &= ~DEMO_HAS_SIZED; if (purpose == PURPOSE_REWRITE) nd_write_byte(game_type); if ((game_type == DEMO_GAME_TYPE_SHAREWARE) && shareware) @@ -2540,6 +2562,34 @@ break; } + case ND_EVENT_NUM_KILLS: { + int old_level, old_total, new_level, new_total; + short size; + + nd_read_short(&size); + nd_read_int(&old_level); + nd_read_int(&old_total); + nd_read_int(&new_level); + nd_read_int(&new_total); + if (rewrite) + { + nd_write_short(size); + nd_write_int(old_level); + nd_write_int(old_total); + nd_write_int(new_level); + nd_write_int(new_total); + break; + } + if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD)) { + Players[Player_num].num_kills_level = old_level; + Players[Player_num].num_kills_total = old_total; + } else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD)) { + Players[Player_num].num_kills_level = new_level; + Players[Player_num].num_kills_total = new_total; + } + break; + } + case ND_EVENT_NEW_LEVEL: { sbyte new_level, old_level, loaded_level; @@ -2595,9 +2645,15 @@ break; } - default: + default: { + short size; + sbyte x; + nd_read_short(&size); + while (size--) + nd_read_byte(&x); Int3(); } + } } // Now set up cockpit and views according to what we read out. Note that the demo itself cannot determinate the right views since it does not use a good portion of the real game code. diff -ur ../osrc/d1x-rebirth_v0.58.1-src/main/newdemo.h d1x-rebirth_v0.58.1-src/main/newdemo.h --- ../osrc/d1x-rebirth_v0.58.1-src/main/newdemo.h 2013-06-30 20:41:07.000000000 +0200 +++ d1x-rebirth_v0.58.1-src/main/newdemo.h 2018-12-22 13:03:30.865974000 +0100 @@ -91,6 +91,7 @@ extern void newdemo_record_secondary_ammo(int new_ammo); extern void newdemo_record_door_opening(int segnum, int side); extern void newdemo_record_laser_level(sbyte old_level, sbyte new_level); +extern void newdemo_record_num_kills(int num_kills_level, int num_kills_total); // Functions called during playback process... extern void newdemo_object_move_all();