Move */main/newdemo.c -> similar/main/newdemo.c

This commit is contained in:
Kp 2013-03-03 01:03:33 +00:00
parent aa9127e3c1
commit d447d02a1d
3 changed files with 321 additions and 3568 deletions

View file

@ -778,6 +778,7 @@ class DXXProgram(DXXCommon):
'main/morph.c',
'main/multi.c',
'main/multibot.c',
'main/newdemo.c',
'main/newmenu.c',
'main/object.c',
'main/paging.c',
@ -1031,7 +1032,6 @@ class D1XProgram(DXXProgram):
'main/gamemine.c',
'main/gameseq.c',
'main/laser.c',
'main/newdemo.c',
'main/piggy.c',
'main/playsave.c',
'main/powerup.c',
@ -1099,7 +1099,6 @@ class D2XProgram(DXXProgram):
'main/gameseq.c',
'main/laser.c',
'main/movie.c',
'main/newdemo.c',
'main/piggy.c',
'main/playsave.c',
'main/powerup.c',

File diff suppressed because it is too large Load diff

View file

@ -131,6 +131,11 @@ extern void init_seismic_disturbances(void);
#define ND_EVENT_PRIMARY_AMMO 39 // with old/new ammo count
#define ND_EVENT_SECONDARY_AMMO 40 // with old/new ammo count
#define ND_EVENT_DOOR_OPENING 41 // with segment/side
#if defined(DXX_BUILD_DESCENT_I)
#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
#elif defined(DXX_BUILD_DESCENT_II)
#define ND_EVENT_LASER_LEVEL 42 // no data
#define ND_EVENT_PLAYER_AFTERBURNER 43 // followed by byte old ab, current ab
#define ND_EVENT_CLOAKING_WALL 44 // info changing while wall cloaking
@ -140,15 +145,22 @@ extern void init_seismic_disturbances(void);
#define ND_EVENT_SECRET_THINGY 48 // 0/1 = secret exit functional/non-functional
#define ND_EVENT_LINK_SOUND_TO_OBJ 49 // record digi_link_sound_to_object3
#define ND_EVENT_KILL_SOUND_TO_OBJ 50 // record digi_kill_sound_linked_to_object
#endif
#define NORMAL_PLAYBACK 0
#define SKIP_PLAYBACK 1
#define INTERPOLATE_PLAYBACK 2
#define INTERPOL_FACTOR (F1_0 + (F1_0/5))
#if defined(DXX_BUILD_DESCENT_I)
#define DEMO_VERSION_SHAREWARE 5
#define DEMO_VERSION 13
#define DEMO_GAME_TYPE_SHAREWARE 1
#define DEMO_GAME_TYPE 2
#elif defined(DXX_BUILD_DESCENT_II)
#define DEMO_VERSION 15 // last D1 version was 13
#define DEMO_GAME_TYPE 3 // 1 was shareware, 2 registered
#endif
#define DEMO_FILENAME DEMO_DIR "tmpdemo.dem"
@ -165,9 +177,11 @@ int Newdemo_vcr_state = 0;
int Newdemo_show_percentage=1;
sbyte Newdemo_do_interpolate = 1;
int Newdemo_num_written;
#if defined(DXX_BUILD_DESCENT_II)
ubyte DemoDoRight=0,DemoDoLeft=0;
object DemoRightExtra,DemoLeftExtra;
extern ubyte RenderingType;
#endif
// local var used for swapping endian demos
static int swap_endian = 0;
@ -182,8 +196,10 @@ static int nd_playback_v_framecount;
static fix nd_playback_total, nd_recorded_total, nd_recorded_time;
static sbyte nd_playback_v_style;
static ubyte nd_playback_v_dead = 0, nd_playback_v_rear = 0;
#if defined(DXX_BUILD_DESCENT_II)
static ubyte nd_playback_v_guided = 0;
int nd_playback_v_juststarted=0;
#endif
// record variables
#define REC_DELAY F1_0/20
@ -193,11 +209,13 @@ static short nd_record_v_framebytes_written = 0;
static int nd_record_v_recordframe = 1;
static fix64 nd_record_v_recordframe_last_time = 0;
static sbyte nd_record_v_no_space;
#if defined(DXX_BUILD_DESCENT_II)
static int nd_record_v_juststarted = 0;
static sbyte nd_record_v_objs[MAX_OBJECTS];
static sbyte nd_record_v_viewobjs[MAX_OBJECTS];
static sbyte nd_record_v_rendering[32];
static fix nd_record_v_player_afterburner = -1;
#endif
static int nd_record_v_player_energy = -1;
static int nd_record_v_player_shields = -1;
static uint nd_record_v_player_flags = -1;
@ -208,7 +226,11 @@ static int nd_record_v_primary_ammo = -1;
static int nd_record_v_secondary_ammo = -1;
static void newdemo_record_oneframeevent_update(int wallupdate);
#if defined(DXX_BUILD_DESCENT_I)
static int shareware = 0; // reading shareware demo?
#elif defined(DXX_BUILD_DESCENT_II)
static const int shareware = 0;
#endif
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 );
extern window *game_setup(void);
@ -481,8 +503,10 @@ void nd_read_object(object *obj)
obj->signature = shortsig; // It's OKAY! We made sure, obj->signature is never has a value which short cannot handle!!! We cannot do this otherwise, without breaking the demo format!
nd_read_shortpos(obj);
#if defined(DXX_BUILD_DESCENT_II)
if ((obj->type == OBJ_ROBOT) && (obj->id == SPECIAL_REACTOR_ROBOT))
Int3();
#endif
obj->attached_obj = -1;
@ -498,9 +522,11 @@ void nd_read_object(object *obj)
obj->control_type = CT_AI;
// (MarkA and MikeK said we should not do the crazy last secret stuff with multiple reactors...
// This necessary code is our vindication. --MK, 2/15/96)
#if defined(DXX_BUILD_DESCENT_II)
if (obj->id == SPECIAL_REACTOR_ROBOT)
obj->movement_type = MT_NONE;
else
#endif
obj->movement_type = MT_PHYSICS;
obj->size = Polygon_models[Robot_info[obj->id].model_num].rad;
obj->rtype.pobj_info.model_num = Robot_info[obj->id].model_num;
@ -694,8 +720,10 @@ void nd_write_object(object *obj)
int life;
short shortsig = 0;
#if defined(DXX_BUILD_DESCENT_II)
if ((obj->type == OBJ_ROBOT) && (obj->id == SPECIAL_REACTOR_ROBOT))
Int3();
#endif
/*
* Do render_type first so on read, we can make determination of
@ -909,10 +937,16 @@ void newdemo_record_start_demo()
nd_write_byte((sbyte)Primary_weapon);
nd_write_byte((sbyte)Secondary_weapon);
nd_record_v_start_frame = nd_record_v_frame_number = 0;
#if defined(DXX_BUILD_DESCENT_II)
nd_record_v_player_afterburner = 0;
nd_record_v_juststarted=1;
#endif
newdemo_set_new_level(Current_level_num);
#if defined(DXX_BUILD_DESCENT_I)
newdemo_record_oneframeevent_update(1);
#elif defined(DXX_BUILD_DESCENT_II)
newdemo_record_oneframeevent_update(0);
#endif
start_time();
}
@ -939,6 +973,7 @@ void newdemo_record_start_frame(fix frame_time )
nd_record_v_recordframe=1;
stop_time();
#if defined(DXX_BUILD_DESCENT_II)
for (int i=0;i<MAX_OBJECTS;i++)
{
@ -948,6 +983,7 @@ void newdemo_record_start_frame(fix frame_time )
for (int i=0;i<32;i++)
nd_record_v_rendering[i]=0;
#endif
nd_record_v_frame_number -= nd_record_v_start_frame;
nd_write_byte(ND_EVENT_START_FRAME);
@ -969,12 +1005,14 @@ void newdemo_record_render_object(object * obj)
{
if (!nd_record_v_recordframe)
return;
#if defined(DXX_BUILD_DESCENT_II)
if (nd_record_v_objs[obj-Objects])
return;
if (nd_record_v_viewobjs[obj-Objects])
return;
nd_record_v_objs[obj-Objects] = 1;
#endif
stop_time();
nd_write_byte(ND_EVENT_RENDER_OBJECT);
nd_write_object(obj);
@ -985,16 +1023,20 @@ void newdemo_record_viewer_object(object * obj)
{
if (!nd_record_v_recordframe)
return;
#if defined(DXX_BUILD_DESCENT_II)
if (nd_record_v_viewobjs[obj-Objects] && (nd_record_v_viewobjs[obj-Objects]-1)==RenderingType)
return;
if (nd_record_v_rendering[RenderingType])
return;
#endif
stop_time();
nd_write_byte(ND_EVENT_VIEWER_OBJECT);
#if defined(DXX_BUILD_DESCENT_II)
nd_record_v_viewobjs[obj-Objects]=RenderingType+1;
nd_record_v_rendering[RenderingType]=1;
nd_write_byte(RenderingType);
#endif
nd_write_object(obj);
start_time();
}
@ -1061,6 +1103,7 @@ void newdemo_record_wall_hit_process( int segnum, int side, int damage, int play
start_time();
}
#if defined(DXX_BUILD_DESCENT_II)
void newdemo_record_guided_start ()
{
nd_write_byte (ND_EVENT_START_GUIDED);
@ -1089,6 +1132,7 @@ void newdemo_record_trigger( int segnum, int side, int objnum,int shot )
nd_write_int(shot);
start_time();
}
#endif
void newdemo_record_hostage_rescued( int hostage_number )
{
@ -1159,6 +1203,7 @@ void newdemo_record_player_energy(int energy)
start_time();
}
#if defined(DXX_BUILD_DESCENT_II)
void newdemo_record_player_afterburner(fix afterburner)
{
if ((nd_record_v_player_afterburner>>9) == (afterburner>>9))
@ -1170,6 +1215,7 @@ void newdemo_record_player_afterburner(fix afterburner)
nd_record_v_player_afterburner = afterburner;
start_time();
}
#endif
void newdemo_record_player_shields(int shield)
{
@ -1413,6 +1459,7 @@ void newdemo_record_laser_level(sbyte old_level, sbyte new_level)
start_time();
}
#if defined(DXX_BUILD_DESCENT_II)
void newdemo_record_cloaking_wall(int front_wall_num, int back_wall_num, ubyte type, ubyte state, fix cloak_value, fix l0, fix l1, fix l2, fix l3)
{
Assert(front_wall_num <= 255 && back_wall_num <= 255);
@ -1430,6 +1477,7 @@ void newdemo_record_cloaking_wall(int front_wall_num, int back_wall_num, ubyte t
nd_write_short(l3>>8);
start_time();
}
#endif
void newdemo_set_new_level(int level_num)
{
@ -1437,7 +1485,7 @@ void newdemo_set_new_level(int level_num)
nd_write_byte(ND_EVENT_NEW_LEVEL);
nd_write_byte((sbyte)level_num);
nd_write_byte((sbyte)Current_level_num);
#if defined(DXX_BUILD_DESCENT_II)
if (nd_record_v_juststarted==1)
{
nd_write_int(Num_walls);
@ -1454,7 +1502,7 @@ void newdemo_set_new_level(int level_num)
nd_record_v_juststarted=0;
}
}
#endif
start_time();
}
@ -1476,11 +1524,31 @@ static void newdemo_record_oneframeevent_update(int wallupdate)
else
newdemo_record_restore_rearview();
#if defined(DXX_BUILD_DESCENT_I)
// This will record tmaps for all walls and properly show doors which were opened before demo recording started.
if (wallupdate)
{
for (int i = 0; i < Num_walls; i++)
{
int side;
segment *seg;
seg = &Segments[Walls[i].segnum];
side = Walls[i].sidenum;
// actually this is kinda stupid: when playing ther same tmap will be put on front and back side of the wall ... for doors this is stupid so just record the front side which will do for doors just fine ...
if (seg->sides[side].tmap_num != 0)
newdemo_record_wall_set_tmap_num1(Walls[i].segnum,side,Walls[i].segnum,side,seg->sides[side].tmap_num);
if (seg->sides[side].tmap_num2 != 0)
newdemo_record_wall_set_tmap_num2(Walls[i].segnum,side,Walls[i].segnum,side,seg->sides[side].tmap_num2);
}
}
#elif defined(DXX_BUILD_DESCENT_II)
(void)wallupdate;
if (Viewer == Guided_missile[Player_num])
newdemo_record_guided_start();
else
newdemo_record_guided_end();
#endif
}
enum purpose_type
@ -1498,6 +1566,9 @@ int newdemo_read_demo_start(enum purpose_type purpose)
fix nd_GameTime32 = 0;
Rear_view=0;
#if defined(DXX_BUILD_DESCENT_I)
shareware = 0;
#endif
nd_read_byte(&c);
if (purpose == PURPOSE_REWRITE)
@ -1509,9 +1580,28 @@ int newdemo_read_demo_start(enum purpose_type purpose)
nd_read_byte(&version);
if (purpose == PURPOSE_REWRITE)
nd_write_byte(version);
#if defined(DXX_BUILD_DESCENT_I)
if (version == DEMO_VERSION_SHAREWARE)
shareware = 1;
else if (version < DEMO_VERSION) {
if (purpose == PURPOSE_CHOSE_PLAY) {
nm_messagebox( NULL, 1, TXT_OK, "%s %s", TXT_CANT_PLAYBACK, TXT_DEMO_OLD );
}
return 1;
}
#endif
nd_read_byte(&game_type);
if (purpose == PURPOSE_REWRITE)
nd_write_byte(game_type);
#if defined(DXX_BUILD_DESCENT_I)
if ((game_type == DEMO_GAME_TYPE_SHAREWARE) && shareware)
shareware = shareware; // all good
else if (game_type != DEMO_GAME_TYPE) {
nm_messagebox( NULL, 1, TXT_OK, "%s %s", TXT_CANT_PLAYBACK, TXT_DEMO_OLD );
return 1;
}
#elif defined(DXX_BUILD_DESCENT_II)
if (game_type < DEMO_GAME_TYPE) {
nm_messagebox( NULL, 1, TXT_OK, "%s %s\n%s", TXT_CANT_PLAYBACK, TXT_RECORDED, " In Descent: First Strike" );
return 1;
@ -1526,9 +1616,11 @@ int newdemo_read_demo_start(enum purpose_type purpose)
}
return 1;
}
#endif
nd_read_fix(&nd_GameTime32); // NOTE: Demos write GameTime in fix.
GameTime64 = nd_GameTime32;
nd_read_int(&Newdemo_game_mode);
#if defined(DXX_BUILD_DESCENT_II)
if (purpose == PURPOSE_REWRITE)
{
nd_write_fix(nd_GameTime32);
@ -1536,70 +1628,93 @@ int newdemo_read_demo_start(enum purpose_type purpose)
}
Boss_cloak_start_time=Boss_cloak_end_time=GameTime64;
#endif
change_playernum_to((Newdemo_game_mode >> 16) & 0x7);
if (shareware) {
if (shareware)
{
if (Newdemo_game_mode & GM_TEAM)
{
nd_read_byte((sbyte *)&(Netgame.team_vector));
if (purpose == PURPOSE_REWRITE)
nd_write_byte(Netgame.team_vector);
}
for (i =0 ; i < MAX_PLAYERS; i++) {
Players[i].cloak_time = 0;
Players[i].invulnerable_time = 0;
}
}
else
{
if (Newdemo_game_mode & GM_TEAM) {
nd_read_byte((sbyte *) &(Netgame.team_vector));
nd_read_string(Netgame.team_name[0]);
nd_read_string(Netgame.team_name[1]);
if (purpose == PURPOSE_REWRITE)
{
nd_write_byte(Netgame.team_vector);
nd_write_string(Netgame.team_name[0]);
nd_write_string(Netgame.team_name[1]);
}
}
if (Newdemo_game_mode & GM_MULTI) {
if (purpose != PURPOSE_REWRITE)
multi_new_game();
nd_read_byte(&c);
N_players = (int)c;
// changed this to above two lines -- breaks on the mac because of
// endian issues
// nd_read_byte((sbyte *)&N_players);
if (purpose == PURPOSE_REWRITE)
nd_write_byte(N_players);
for (i = 0 ; i < N_players; i++) {
Players[i].cloak_time = 0;
Players[i].invulnerable_time = 0;
nd_read_string(Players[i].callsign);
nd_read_byte(&(Players[i].connected));
if (Newdemo_game_mode & GM_TEAM) {
nd_read_byte((sbyte *) &(Netgame.team_vector));
nd_read_string(Netgame.team_name[0]);
nd_read_string(Netgame.team_name[1]);
if (purpose == PURPOSE_REWRITE)
{
nd_write_string(Players[i].callsign);
nd_write_byte(Players[i].connected);
}
if (Newdemo_game_mode & GM_MULTI_COOP) {
nd_read_int(&(Players[i].score));
if (purpose == PURPOSE_REWRITE)
nd_write_int(Players[i].score);
} else {
nd_read_short((short *)&(Players[i].net_killed_total));
nd_read_short((short *)&(Players[i].net_kills_total));
if (purpose == PURPOSE_REWRITE)
{
nd_write_short(Players[i].net_killed_total);
nd_write_short(Players[i].net_kills_total);
}
nd_write_byte(Netgame.team_vector);
nd_write_string(Netgame.team_name[0]);
nd_write_string(Netgame.team_name[1]);
}
}
Game_mode = Newdemo_game_mode;
if (purpose != PURPOSE_REWRITE)
multi_sort_kill_list();
Game_mode = GM_NORMAL;
} else
if (Newdemo_game_mode & GM_MULTI) {
if (purpose != PURPOSE_REWRITE)
multi_new_game();
nd_read_byte(&c);
N_players = (int)c;
// changed this to above two lines -- breaks on the mac because of
// endian issues
// nd_read_byte((sbyte *)&N_players);
if (purpose == PURPOSE_REWRITE)
nd_write_byte(N_players);
for (i = 0 ; i < N_players; i++) {
Players[i].cloak_time = 0;
Players[i].invulnerable_time = 0;
nd_read_string(Players[i].callsign);
nd_read_byte(&(Players[i].connected));
if (purpose == PURPOSE_REWRITE)
{
nd_write_string(Players[i].callsign);
nd_write_byte(Players[i].connected);
}
if (Newdemo_game_mode & GM_MULTI_COOP) {
nd_read_int(&(Players[i].score));
if (purpose == PURPOSE_REWRITE)
nd_write_int(Players[i].score);
} else {
nd_read_short((short *)&(Players[i].net_killed_total));
nd_read_short((short *)&(Players[i].net_kills_total));
if (purpose == PURPOSE_REWRITE)
{
nd_write_short(Players[i].net_killed_total);
nd_write_short(Players[i].net_kills_total);
}
}
}
Game_mode = Newdemo_game_mode;
if (purpose != PURPOSE_REWRITE)
multi_sort_kill_list();
Game_mode = GM_NORMAL;
} else
{
#if defined(DXX_BUILD_DESCENT_II)
nd_read_int(&(Players[Player_num].score)); // Note link to above if!
if (purpose == PURPOSE_REWRITE)
nd_write_int(Players[Player_num].score);
#endif
}
}
#if defined(DXX_BUILD_DESCENT_I)
if (!(Newdemo_game_mode & GM_MULTI))
{
nd_read_int(&(Players[Player_num].score)); // Note link to above if!
if (purpose == PURPOSE_REWRITE)
nd_write_int(Players[Player_num].score);
}
}
#endif
for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
{
@ -1628,12 +1743,24 @@ int newdemo_read_demo_start(enum purpose_type purpose)
nd_read_string(current_mission);
if (purpose == PURPOSE_REWRITE)
nd_write_string(current_mission);
#if defined(DXX_BUILD_DESCENT_I)
if (!shareware)
{
if ((purpose != PURPOSE_REWRITE) && !load_mission_by_name(current_mission)) {
if (purpose == PURPOSE_CHOSE_PLAY) {
nm_messagebox( NULL, 1, TXT_OK, TXT_NOMISSION4DEMO, current_mission );
}
return 1;
}
}
#elif defined(DXX_BUILD_DESCENT_II)
if (!load_mission_by_name(current_mission)) {
if (purpose != PURPOSE_RANDOM_PLAY) {
nm_messagebox( NULL, 1, TXT_OK, TXT_NOMISSION4DEMO, current_mission );
}
return 1;
}
#endif
nd_recorded_total = 0;
nd_playback_total = 0;
@ -1662,7 +1789,32 @@ int newdemo_read_demo_start(enum purpose_type purpose)
nd_write_byte(Secondary_weapon);
}
// Next bit of code to fix problem that I introduced between 1.0 and 1.1
// check the next byte -- it _will_ be a load_new_level event. If it is
// not, then we must shift all bytes up by one.
if (shareware)
{
unsigned char c;
nd_read_byte((sbyte *)&c);
if (c != ND_EVENT_NEW_LEVEL) {
int flags;
flags = Players[Player_num].flags;
energy = shield;
shield = (unsigned char)flags;
flags = (flags >> 8) & 0x00ffffff;
flags |= (Primary_weapon << 24);
Primary_weapon = Secondary_weapon;
Secondary_weapon = c;
} else
PHYSFS_seek(infile, PHYSFS_tell(infile) - 1);
}
#if defined(DXX_BUILD_DESCENT_II)
nd_playback_v_juststarted=1;
#endif
Players[Player_num].energy = i2f(energy);
Players[Player_num].shields = i2f(shield);
return 0;
@ -1741,6 +1893,7 @@ int newdemo_read_frame_information(int rewrite)
case ND_EVENT_VIEWER_OBJECT: // Followed by an object structure
{
#if defined(DXX_BUILD_DESCENT_II)
sbyte WhichWindow;
object extraobj;
nd_read_byte (&WhichWindow);
@ -1764,29 +1917,28 @@ int newdemo_read_frame_information(int rewrite)
nd_render_extras (WhichWindow,&extraobj);
}
else
#endif
{
//Viewer=&Objects[0];
nd_read_object(Viewer);
if (nd_playback_v_bad_read) { done = -1; break; }
if (rewrite)
{
nd_write_object(Viewer);
break;
}
nd_read_object(Viewer);
if (nd_playback_v_bad_read) { done = -1; break; }
if (rewrite)
{
nd_write_object(Viewer);
break;
}
if (Newdemo_vcr_state != ND_STATE_PAUSED) {
segnum = Viewer->segnum;
Viewer->next = Viewer->prev = Viewer->segnum = -1;
if (Newdemo_vcr_state != ND_STATE_PAUSED) {
segnum = Viewer->segnum;
Viewer->next = Viewer->prev = Viewer->segnum = -1;
// HACK HACK HACK -- since we have multiple level recording, it can be the case
// HACK HACK HACK -- that when rewinding the demo, the viewer is in a segment
// HACK HACK HACK -- that is greater than the highest index of segments. Bash
// HACK HACK HACK -- the viewer to segment 0 for bogus view.
// HACK HACK HACK -- since we have multiple level recording, it can be the case
// HACK HACK HACK -- that when rewinding the demo, the viewer is in a segment
// HACK HACK HACK -- that is greater than the highest index of segments. Bash
// HACK HACK HACK -- the viewer to segment 0 for bogus view.
if (segnum > Highest_segment_index)
segnum = 0;
obj_link(Viewer-Objects,segnum);
}
if (segnum > Highest_segment_index)
segnum = 0;
obj_link(Viewer-Objects,segnum);
}
}
}
break;
@ -1950,17 +2102,26 @@ int newdemo_read_frame_information(int rewrite)
nd_read_int(&side);
nd_read_int(&objnum);
int shot;
#if defined(DXX_BUILD_DESCENT_I)
shot = 0;
#elif defined(DXX_BUILD_DESCENT_II)
nd_read_int(&shot);
#endif
if (nd_playback_v_bad_read) { done = -1; break; }
if (rewrite)
{
nd_write_int(segnum);
nd_write_int(side);
nd_write_int(objnum);
#if defined(DXX_BUILD_DESCENT_I)
break;
#elif defined(DXX_BUILD_DESCENT_II)
nd_write_int(shot);
#endif
}
if (Newdemo_vcr_state != ND_STATE_PAUSED)
{
#if defined(DXX_BUILD_DESCENT_II)
if (Triggers[Walls[Segments[segnum].sides[side].wall_num].trigger].type == TT_SECRET_EXIT) {
int truth;
@ -1976,6 +2137,7 @@ int newdemo_read_frame_information(int rewrite)
if (!truth)
check_trigger(&Segments[segnum], side, objnum,shot);
} else if (!rewrite)
#endif
check_trigger(&Segments[segnum], side, objnum,shot);
}
}
@ -2070,6 +2232,7 @@ int newdemo_read_frame_information(int rewrite)
HUD_init_message_literal( HM_DEFAULT, hud_msg );
break;
}
#if defined(DXX_BUILD_DESCENT_II)
case ND_EVENT_START_GUIDED:
if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD)) {
nd_playback_v_guided = 1;
@ -2084,6 +2247,7 @@ int newdemo_read_frame_information(int rewrite)
nd_playback_v_guided = 0;
}
break;
#endif
case ND_EVENT_PALETTE_EFFECT: {
short r, g, b;
@ -2132,6 +2296,7 @@ int newdemo_read_frame_information(int rewrite)
break;
}
#if defined(DXX_BUILD_DESCENT_II)
case ND_EVENT_PLAYER_AFTERBURNER: {
ubyte afterburner;
ubyte old_afterburner;
@ -2154,6 +2319,7 @@ int newdemo_read_frame_information(int rewrite)
}
break;
}
#endif
case ND_EVENT_PLAYER_SHIELD: {
ubyte shield;
@ -2226,10 +2392,27 @@ int newdemo_read_frame_information(int rewrite)
}
case ND_EVENT_PLAYER_WEAPON:
if (shareware)
if (shareware)
{
ubyte weapon_type, weapon_num;
nd_read_byte((sbyte *)&weapon_type);
nd_read_byte((sbyte *)&weapon_num);
if (rewrite)
{
nd_write_byte(weapon_type);
nd_write_byte(weapon_num);
break;
}
if (weapon_type == 0)
Primary_weapon = (int)weapon_num;
else
Secondary_weapon = (int)weapon_num;
break;
}
else
{
ubyte weapon_type, weapon_num;
ubyte old_weapon;
@ -2262,12 +2445,14 @@ int newdemo_read_frame_information(int rewrite)
short segnum;
sbyte side;
vms_vector pnt;
#if defined(DXX_BUILD_DESCENT_II)
object dummy;
//create a dummy object which will be the weapon that hits
//the monitor. the blowup code wants to know who the parent of the
//laser is, so create a laser whose parent is the player
dummy.ctype.laser_info.parent_type = OBJ_PLAYER;
#endif
nd_read_short(&segnum);
nd_read_byte(&side);
@ -2280,7 +2465,11 @@ int newdemo_read_frame_information(int rewrite)
break;
}
if (Newdemo_vcr_state != ND_STATE_PAUSED)
#if defined(DXX_BUILD_DESCENT_I)
check_effect_blowup(&(Segments[segnum]), side, &pnt, NULL, 0);
#elif defined(DXX_BUILD_DESCENT_II)
check_effect_blowup(&(Segments[segnum]), side, &pnt, &dummy, 0);
#endif
break;
}
@ -2304,6 +2493,7 @@ int newdemo_read_frame_information(int rewrite)
nd_playback_v_dead = 0;
break;
#if defined(DXX_BUILD_DESCENT_II)
case ND_EVENT_CHANGE_COCKPIT: {
int dummy;
nd_read_int (&dummy);
@ -2311,6 +2501,7 @@ int newdemo_read_frame_information(int rewrite)
nd_write_int(dummy);
break;
}
#endif
case ND_EVENT_REARVIEW:
if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD)) {
nd_playback_v_rear = 1;
@ -2535,10 +2726,17 @@ int newdemo_read_frame_information(int rewrite)
nd_write_byte(pnum);
break;
}
#if defined(DXX_BUILD_DESCENT_I)
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Players[pnum].connected = CONNECT_DISCONNECTED;
else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD))
Players[pnum].connected = CONNECT_PLAYING;
#elif defined(DXX_BUILD_DESCENT_II)
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Players[pnum].connected = CONNECT_PLAYING;
else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD))
Players[pnum].connected = CONNECT_DISCONNECTED;
#endif
break;
}
@ -2594,6 +2792,12 @@ int newdemo_read_frame_information(int rewrite)
}
// NOTE: Used (Primary_weapon==GAUSS_INDEX?VULCAN_INDEX:Primary_weapon) because game needs VULCAN_INDEX updated to show Gauss ammo
#if defined(DXX_BUILD_DESCENT_I)
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Players[Player_num].primary_ammo[Primary_weapon] = old_ammo;
else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD))
Players[Player_num].primary_ammo[Primary_weapon] = new_ammo;
#elif defined(DXX_BUILD_DESCENT_II)
if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Players[Player_num].primary_ammo[(Primary_weapon==GAUSS_INDEX?VULCAN_INDEX:Primary_weapon)] = old_ammo;
else if ((Newdemo_vcr_state == ND_STATE_PLAYBACK) || (Newdemo_vcr_state == ND_STATE_FASTFORWARD) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEFORWARD))
@ -2601,6 +2805,7 @@ int newdemo_read_frame_information(int rewrite)
if (Primary_weapon == OMEGA_INDEX) // If Omega cannon, we need to update Omega_charge - not stored in primary_ammo
Omega_charge = (Players[Player_num].primary_ammo[Primary_weapon]<=0?f1_0:Players[Player_num].primary_ammo[Primary_weapon]);
#endif
break;
}
@ -2675,6 +2880,7 @@ int newdemo_read_frame_information(int rewrite)
break;
}
#if defined(DXX_BUILD_DESCENT_II)
case ND_EVENT_CLOAKING_WALL: {
sbyte type,state,cloak_value;
ubyte back_wall_num,front_wall_num;
@ -2727,6 +2933,7 @@ int newdemo_read_frame_information(int rewrite)
break;
}
#endif
case ND_EVENT_NEW_LEVEL: {
sbyte new_level, old_level, loaded_level;
@ -2737,7 +2944,11 @@ int newdemo_read_frame_information(int rewrite)
{
nd_write_byte (new_level);
nd_write_byte (old_level);
#if defined(DXX_BUILD_DESCENT_I)
break;
#elif defined(DXX_BUILD_DESCENT_II)
load_level_robots(new_level); // for correct robot info reading (specifically boss flag)
#endif
}
else
{
@ -2764,6 +2975,7 @@ int newdemo_read_frame_information(int rewrite)
nd_playback_v_cntrlcen_destroyed = 0;
}
#if defined(DXX_BUILD_DESCENT_II)
if (nd_playback_v_juststarted)
{
nd_read_int (&Num_walls);
@ -2814,9 +3026,14 @@ int newdemo_read_frame_information(int rewrite)
if (rewrite)
break;
#endif
reset_palette_add(); // get palette back to normal
#if defined(DXX_BUILD_DESCENT_I)
palette_save(); // initialise for palette_restore()
#elif defined(DXX_BUILD_DESCENT_II)
full_palette_save(); // initialise for palette_restore()
#endif
start_time();
break;
@ -2842,6 +3059,7 @@ int newdemo_read_frame_information(int rewrite)
if (PlayerCfg.CockpitMode[1] != CM_LETTERBOX)
select_cockpit(CM_LETTERBOX);
}
#if defined(DXX_BUILD_DESCENT_II)
else if (nd_playback_v_guided)
{
Rear_view = 0;
@ -2850,6 +3068,7 @@ int newdemo_read_frame_information(int rewrite)
select_cockpit((PlayerCfg.CockpitMode[0] == CM_FULL_SCREEN)?CM_FULL_SCREEN:CM_STATUS_BAR);
}
}
#endif
else if (nd_playback_v_rear)
{
Rear_view = nd_playback_v_rear;
@ -2908,14 +3127,34 @@ void newdemo_goto_end(int to_rewrite)
if (level != Current_level_num)
LoadLevel(level,1);
}
else if (level != Current_level_num)
else
#if defined(DXX_BUILD_DESCENT_II)
if (level != Current_level_num)
#endif
{
#if defined(DXX_BUILD_DESCENT_II)
load_level_robots(level); // for correct robot info reading (specifically boss flag)
#endif
Current_level_num = level;
}
if (shareware)
{
if (Newdemo_game_mode & GM_MULTI) {
PHYSFSX_fseek(infile, -10, SEEK_END);
nd_read_byte(&cloaked);
for (i = 0; i < MAX_PLAYERS; i++) {
if ((1 << i) & cloaked)
Players[i].flags |= PLAYER_FLAGS_CLOAKED;
Players[i].cloak_time = GameTime64 - (CLOAK_TIME_MAX / 2);
}
}
if (to_rewrite)
return;
PHYSFSX_fseek(infile, -12, SEEK_END);
nd_read_short(&frame_length);
}
else
{
@ -3584,10 +3823,12 @@ void newdemo_start_playback(const char * filename)
nd_playback_v_at_eof = 0;
nd_playback_v_framecount = 0;
nd_playback_v_style = NORMAL_PLAYBACK;
#if defined(DXX_BUILD_DESCENT_II)
init_seismic_disturbances();
PlayerCfg.Cockpit3DView[0] = PlayerCfg.Cockpit3DView[1] = CV_NONE; //turn off 3d views on cockpit
DemoDoLeft = DemoDoRight = 0;
nd_playback_v_guided = 0;
#endif
nd_playback_v_dead = nd_playback_v_rear = 0;
HUD_clear_messages();
if (!Game_wind)
@ -3606,7 +3847,9 @@ void newdemo_stop_playback()
strncpy(Players[Player_num].callsign, nd_playback_v_save_callsign, CALLSIGN_LEN);
Rear_view=0;
nd_playback_v_dead = nd_playback_v_rear = 0;
#if defined(DXX_BUILD_DESCENT_II)
nd_playback_v_guided = 0;
#endif
Newdemo_game_mode = Game_mode = GM_GAME_OVER;
// Required for the editor
@ -3746,6 +3989,7 @@ void newdemo_strip_frames(char *outname, int bytes_to_strip)
#endif
#if defined(DXX_BUILD_DESCENT_II)
void nd_render_extras (ubyte which,object *obj)
{
ubyte w=which>>4;
@ -3768,3 +4012,4 @@ void nd_render_extras (ubyte which,object *obj)
}
}
#endif