Difference for main/newdemo.c from version 1.1 to 1.2


version 1.1 version 1.2
Line 19
 
Line 19
  * Code to make a complete demo playback system.   * Code to make a complete demo playback system.
  *    *
  * $Log$   * $Log$
  * Revision 1.1  1999/06/14 22:10:14  donut   * Revision 1.2  2003/03/09 06:41:01  donut
  * Initial revision   * change byte typedef to sbyte to avoid conflict with win32 byte which is unsigned
    *
    * Revision 1.1.1.1  1999/06/14 22:10:14  donut
    * Import of d1x 1.37 source.
  *   *
  * Revision 2.7  1995/05/26  16:16:06  john   * Revision 2.7  1995/05/26  16:16:06  john
  * Split SATURN into define's for requiring cd, using cd, etc.   * Split SATURN into define's for requiring cd, using cd, etc.
Line 848
 
Line 851
 int Newdemo_num_written;  int Newdemo_num_written;
 int Newdemo_game_mode;  int Newdemo_game_mode;
 int Newdemo_old_cockpit;  int Newdemo_old_cockpit;
 byte Newdemo_no_space;  sbyte Newdemo_no_space;
 byte Newdemo_at_eof;  sbyte Newdemo_at_eof;
 byte Newdemo_do_interpolate = 1;  sbyte Newdemo_do_interpolate = 1;
 byte Newdemo_players_cloaked;  sbyte Newdemo_players_cloaked;
 byte Newdemo_warning_given = 0;  sbyte Newdemo_warning_given = 0;
 byte Newdemo_cntrlcen_destroyed = 0;  sbyte Newdemo_cntrlcen_destroyed = 0;
 static byte nd_bad_read;  static sbyte nd_bad_read;
 int NewdemoFrameCount;  int NewdemoFrameCount;
 short frame_bytes_written = 0;  short frame_bytes_written = 0;
 fix nd_playback_total;  fix nd_playback_total;
 fix nd_recorded_total;  fix nd_recorded_total;
 fix nd_recorded_time;  fix nd_recorded_time;
 byte playback_style;  sbyte playback_style;
   
 FILE *infile;  FILE *infile;
 FILE *outfile;  FILE *outfile;
Line 880
 
Line 883
 void my_extract_shortpos(object *objp, shortpos *spp)  void my_extract_shortpos(object *objp, shortpos *spp)
 {  {
  int segnum;   int segnum;
  byte *sp;   sbyte *sp;
   
  sp = spp->bytemat;   sp = spp->bytemat;
  objp->orient.rvec.x = *sp++ << MATRIX_PRECISION;   objp->orient.rvec.x = *sp++ << MATRIX_PRECISION;
Line 952
 
Line 955
  *  just a gamesave   *  just a gamesave
 */  */
   
 static void nd_write_byte(byte b)  static void nd_write_byte(sbyte b)
 {  {
  newdemo_write(&b, 1, 1);   newdemo_write(&b, 1, 1);
 }  }
Line 1027
 
Line 1030
  nd_write_short(sp.velz);   nd_write_short(sp.velz);
 }  }
   
 static void nd_read_byte(byte *b)  static void nd_read_byte(sbyte *b)
 {  {
  newdemo_read(b, 1, 1);   newdemo_read(b, 1, 1);
 }  }
Line 1044
 
Line 1047
   
 static void nd_read_string(char *str)  static void nd_read_string(char *str)
 {  {
  byte len;   sbyte len;
   
  nd_read_byte(&len);   nd_read_byte(&len);
  newdemo_read(str, len, 1);   newdemo_read(str, len, 1);
Line 1180
 
Line 1183
 #ifndef SHAREWARE  #ifndef SHAREWARE
  if (obj->type == OBJ_ROBOT) {   if (obj->type == OBJ_ROBOT) {
  if (Robot_info[obj->id].boss_flag) {   if (Robot_info[obj->id].boss_flag) {
  byte cloaked;   sbyte cloaked;
   
  nd_read_byte(&cloaked);   nd_read_byte(&cloaked);
  obj->ctype.ai_info.CLOAKED = cloaked;   obj->ctype.ai_info.CLOAKED = cloaked;
Line 1498
 
Line 1501
 #ifndef SHAREWARE  #ifndef SHAREWARE
   
  if (Game_mode & GM_MULTI) {   if (Game_mode & GM_MULTI) {
  nd_write_byte((byte)N_players);   nd_write_byte((sbyte)N_players);
  for (i = 0; i < N_players; i++) {   for (i = 0; i < N_players; i++) {
  nd_write_string(Players[i].callsign);   nd_write_string(Players[i].callsign);
  nd_write_byte(Players[i].connected);   nd_write_byte(Players[i].connected);
Line 1519
 
Line 1522
  for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)   for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
  nd_write_short((short)Players[Player_num].secondary_ammo[i]);   nd_write_short((short)Players[Player_num].secondary_ammo[i]);
   
  nd_write_byte((byte)Players[Player_num].laser_level);   nd_write_byte((sbyte)Players[Player_num].laser_level);
   
 //  Support for missions added here  //  Support for missions added here
   
Line 1527
 
Line 1530
   
 #endif  #endif
   
  nd_write_byte((byte)(f2ir(Players[Player_num].energy)));   nd_write_byte((sbyte)(f2ir(Players[Player_num].energy)));
  nd_write_byte((byte)(f2ir(Players[Player_num].shields)));   nd_write_byte((sbyte)(f2ir(Players[Player_num].shields)));
  nd_write_int(Players[Player_num].flags); // be sure players flags are set   nd_write_int(Players[Player_num].flags); // be sure players flags are set
  nd_write_byte((byte)Primary_weapon);   nd_write_byte((sbyte)Primary_weapon);
  nd_write_byte((byte)Secondary_weapon);   nd_write_byte((sbyte)Secondary_weapon);
  Newdemo_start_frame = FrameCount;   Newdemo_start_frame = FrameCount;
  newdemo_set_new_level(Current_level_num);   newdemo_set_new_level(Current_level_num);
  start_time();   start_time();
Line 1695
 
Line 1698
  stop_time();   stop_time();
  nd_write_byte( ND_EVENT_PLAYER_ENERGY );   nd_write_byte( ND_EVENT_PLAYER_ENERGY );
 #ifndef SHAREWARE  #ifndef SHAREWARE
  nd_write_byte((byte) old_energy);   nd_write_byte((sbyte) old_energy);
 #endif  #endif
  nd_write_byte((byte) energy);   nd_write_byte((sbyte) energy);
  start_time();   start_time();
 }  }
   
Line 1710
 
Line 1713
  stop_time();   stop_time();
  nd_write_byte( ND_EVENT_PLAYER_SHIELD );   nd_write_byte( ND_EVENT_PLAYER_SHIELD );
 #ifndef SHAREWARE  #ifndef SHAREWARE
  nd_write_byte((byte)old_shield);   nd_write_byte((sbyte)old_shield);
 #endif  #endif
  nd_write_byte((byte)shield);   nd_write_byte((sbyte)shield);
  start_time();   start_time();
 }  }
   
Line 1728
 
Line 1731
 {  {
  stop_time();   stop_time();
  nd_write_byte( ND_EVENT_PLAYER_WEAPON );   nd_write_byte( ND_EVENT_PLAYER_WEAPON );
  nd_write_byte((byte)weapon_type);   nd_write_byte((sbyte)weapon_type);
  nd_write_byte((byte)weapon_num);   nd_write_byte((sbyte)weapon_num);
 #ifndef SHAREWARE  #ifndef SHAREWARE
  if (weapon_type)   if (weapon_type)
  nd_write_byte((byte)Secondary_weapon);   nd_write_byte((sbyte)Secondary_weapon);
  else   else
  nd_write_byte((byte)Primary_weapon);   nd_write_byte((sbyte)Primary_weapon);
 #endif  #endif
  start_time();   start_time();
 }  }
Line 1744
 
Line 1747
  stop_time();   stop_time();
  nd_write_byte (ND_EVENT_EFFECT_BLOWUP);   nd_write_byte (ND_EVENT_EFFECT_BLOWUP);
  nd_write_short(segment);   nd_write_short(segment);
  nd_write_byte((byte)side);   nd_write_byte((sbyte)side);
  nd_write_vector(pnt);   nd_write_vector(pnt);
  start_time();   start_time();
 }  }
Line 1813
 
Line 1816
 {  {
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_MULTI_CLOAK);   nd_write_byte(ND_EVENT_MULTI_CLOAK);
  nd_write_byte((byte)pnum);   nd_write_byte((sbyte)pnum);
  start_time();   start_time();
 }  }
   
Line 1821
 
Line 1824
 {  {
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_MULTI_DECLOAK);   nd_write_byte(ND_EVENT_MULTI_DECLOAK);
  nd_write_byte((byte)pnum);   nd_write_byte((sbyte)pnum);
  start_time();   start_time();
 }  }
   
Line 1831
 
Line 1834
 {  {
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_MULTI_DEATH);   nd_write_byte(ND_EVENT_MULTI_DEATH);
  nd_write_byte((byte)pnum);   nd_write_byte((sbyte)pnum);
  start_time();   start_time();
 }  }
   
 void newdemo_record_multi_kill(int pnum, byte kill)  void newdemo_record_multi_kill(int pnum, sbyte kill)
 {  {
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_MULTI_KILL);   nd_write_byte(ND_EVENT_MULTI_KILL);
  nd_write_byte((byte)pnum);   nd_write_byte((sbyte)pnum);
  nd_write_byte(kill);   nd_write_byte(kill);
  start_time();   start_time();
 }  }
Line 1848
 
Line 1851
 {  {
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_MULTI_CONNECT);   nd_write_byte(ND_EVENT_MULTI_CONNECT);
  nd_write_byte((byte)pnum);   nd_write_byte((sbyte)pnum);
  nd_write_byte((byte)new_player);   nd_write_byte((sbyte)new_player);
  if (!new_player) {   if (!new_player) {
  nd_write_string(Players[pnum].callsign);   nd_write_string(Players[pnum].callsign);
  nd_write_int(Players[pnum].net_killed_total);   nd_write_int(Players[pnum].net_killed_total);
Line 1863
 
Line 1866
 {  {
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_MULTI_RECONNECT);   nd_write_byte(ND_EVENT_MULTI_RECONNECT);
  nd_write_byte((byte)pnum);   nd_write_byte((sbyte)pnum);
  start_time();   start_time();
 }  }
   
Line 1871
 
Line 1874
 {  {
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_MULTI_DISCONNECT);   nd_write_byte(ND_EVENT_MULTI_DISCONNECT);
  nd_write_byte((byte)pnum);   nd_write_byte((sbyte)pnum);
  start_time();   start_time();
 }  }
   
Line 1887
 
Line 1890
 {  {
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_MULTI_SCORE);   nd_write_byte(ND_EVENT_MULTI_SCORE);
  nd_write_byte((byte)pnum);   nd_write_byte((sbyte)pnum);
  nd_write_int(score - Players[pnum].score); // called before score is changed!!!!   nd_write_int(score - Players[pnum].score); // called before score is changed!!!!
  start_time();   start_time();
 }  }
Line 1921
 
Line 1924
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_DOOR_OPENING);   nd_write_byte(ND_EVENT_DOOR_OPENING);
  nd_write_short((short)segnum);   nd_write_short((short)segnum);
  nd_write_byte((byte)side);   nd_write_byte((sbyte)side);
  start_time();   start_time();
 }  }
   
 #endif  #endif
   
 void newdemo_record_laser_level(byte old_level, byte new_level)  void newdemo_record_laser_level(sbyte old_level, sbyte new_level)
 {  {
         stop_time();          stop_time();
         nd_write_byte(ND_EVENT_LASER_LEVEL);          nd_write_byte(ND_EVENT_LASER_LEVEL);
Line 1941
 
Line 1944
 {  {
  stop_time();   stop_time();
  nd_write_byte(ND_EVENT_NEW_LEVEL);   nd_write_byte(ND_EVENT_NEW_LEVEL);
  nd_write_byte((byte)level_num);   nd_write_byte((sbyte)level_num);
  nd_write_byte((byte)Current_level_num);   nd_write_byte((sbyte)Current_level_num);
  start_time();   start_time();
 }  }
   
 int newdemo_read_demo_start(int rnd_demo)  int newdemo_read_demo_start(int rnd_demo)
 {  {
         byte version, game_type;          sbyte version, game_type;
  char c, energy, shield;   char c, energy, shield;
         char text[128];          char text[128];
         byte i, laser_level;          sbyte i, laser_level;
         char current_mission[9];          char current_mission[9];
   
  nd_read_byte(&c);   nd_read_byte(&c);
Line 2018
 
Line 2021
  if (Newdemo_game_mode & GM_MULTI) {   if (Newdemo_game_mode & GM_MULTI) {
   
  multi_new_game();   multi_new_game();
  nd_read_byte((byte *)&N_players);   nd_read_byte((sbyte *)&N_players);
  for (i = 0 ; i < N_players; i++) {   for (i = 0 ; i < N_players; i++) {
  Players[i].cloak_time = 0;   Players[i].cloak_time = 0;
  Players[i].invulnerable_time = 0;   Players[i].invulnerable_time = 0;
Line 2085
 
Line 2088
  if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE)   if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE)
  Players[Player_num].invulnerable_time = GameTime - (INVULNERABLE_TIME_MAX / 2);   Players[Player_num].invulnerable_time = GameTime - (INVULNERABLE_TIME_MAX / 2);
   
  nd_read_byte((byte *)&Primary_weapon);   nd_read_byte((sbyte *)&Primary_weapon);
  nd_read_byte((byte *)&Secondary_weapon);   nd_read_byte((sbyte *)&Secondary_weapon);
   
 // Next bit of code to fix problem that I introduced between 1.0 and 1.1  // 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  // check the next byte -- it _will_ be a load_new_level event.  If it is
Line 2146
 
Line 2149
  int done, segnum, side, objnum, soundno, angle, volume, i;   int done, segnum, side, objnum, soundno, angle, volume, i;
  object *obj;   object *obj;
  ubyte c;   ubyte c;
  static byte saved_letter_cockpit;   static sbyte saved_letter_cockpit;
  static byte saved_rearview_cockpit;   static sbyte saved_rearview_cockpit;
   
  done = 0;   done = 0;
   
Line 2464
 
Line 2467
   
 #ifdef SHAREWARE  #ifdef SHAREWARE
  case ND_EVENT_PLAYER_WEAPON: {   case ND_EVENT_PLAYER_WEAPON: {
  byte weapon_type, weapon_num;   sbyte weapon_type, weapon_num;
   
  nd_read_byte(&weapon_type);   nd_read_byte(&weapon_type);
  nd_read_byte(&weapon_num);   nd_read_byte(&weapon_num);
Line 2478
 
Line 2481
  }   }
 #else  #else
  case ND_EVENT_PLAYER_WEAPON: {   case ND_EVENT_PLAYER_WEAPON: {
  byte weapon_type, weapon_num;   sbyte weapon_type, weapon_num;
  byte old_weapon;   sbyte old_weapon;
   
  nd_read_byte(&weapon_type);   nd_read_byte(&weapon_type);
  nd_read_byte(&weapon_num);   nd_read_byte(&weapon_num);
Line 2502
 
Line 2505
   
  case ND_EVENT_EFFECT_BLOWUP: {   case ND_EVENT_EFFECT_BLOWUP: {
  short segnum;   short segnum;
  byte side;   sbyte side;
  vms_vector pnt;   vms_vector pnt;
   
  nd_read_short(&segnum);   nd_read_short(&segnum);
Line 2598
 
Line 2601
  }   }
   
  case ND_EVENT_MULTI_CLOAK: {   case ND_EVENT_MULTI_CLOAK: {
  byte pnum;   sbyte pnum;
   
  nd_read_byte(&pnum);   nd_read_byte(&pnum);
  if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD)) {   if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD)) {
Line 2614
 
Line 2617
  }   }
   
  case ND_EVENT_MULTI_DECLOAK: {   case ND_EVENT_MULTI_DECLOAK: {
  byte pnum;   sbyte pnum;
   
  nd_read_byte(&pnum);   nd_read_byte(&pnum);
   
Line 2632
 
Line 2635
   
 #ifndef SHAREWARE  #ifndef SHAREWARE
  case ND_EVENT_MULTI_DEATH: {   case ND_EVENT_MULTI_DEATH: {
  byte pnum;   sbyte pnum;
   
  nd_read_byte(&pnum);   nd_read_byte(&pnum);
  if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))   if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Line 2644
 
Line 2647
   
  #ifdef NETWORK    #ifdef NETWORK
  case ND_EVENT_MULTI_KILL: {   case ND_EVENT_MULTI_KILL: {
  byte pnum, kill;   sbyte pnum, kill;
   
  nd_read_byte(&pnum);   nd_read_byte(&pnum);
  nd_read_byte(&kill);   nd_read_byte(&kill);
Line 2664
 
Line 2667
  }   }
    
  case ND_EVENT_MULTI_CONNECT: {   case ND_EVENT_MULTI_CONNECT: {
  byte pnum, new_player;   sbyte pnum, new_player;
  int killed_total, kills_total;   int killed_total, kills_total;
  char new_callsign[CALLSIGN_LEN+1], old_callsign[CALLSIGN_LEN+1];   char new_callsign[CALLSIGN_LEN+1], old_callsign[CALLSIGN_LEN+1];
   
Line 2697
 
Line 2700
  }   }
   
  case ND_EVENT_MULTI_RECONNECT: {   case ND_EVENT_MULTI_RECONNECT: {
  byte pnum;   sbyte pnum;
   
  nd_read_byte(&pnum);   nd_read_byte(&pnum);
  if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))   if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Line 2708
 
Line 2711
  }   }
   
  case ND_EVENT_MULTI_DISCONNECT: {   case ND_EVENT_MULTI_DISCONNECT: {
  byte pnum;   sbyte pnum;
   
  nd_read_byte(&pnum);   nd_read_byte(&pnum);
  if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))   if ((Newdemo_vcr_state == ND_STATE_REWINDING) || (Newdemo_vcr_state == ND_STATE_ONEFRAMEBACKWARD))
Line 2720
 
Line 2723
   
  case ND_EVENT_MULTI_SCORE: {   case ND_EVENT_MULTI_SCORE: {
  int score;   int score;
  byte pnum;   sbyte pnum;
   
  nd_read_byte(&pnum);   nd_read_byte(&pnum);
  nd_read_int(&score);   nd_read_int(&score);
Line 2775
 
Line 2778
   
  case ND_EVENT_DOOR_OPENING: {   case ND_EVENT_DOOR_OPENING: {
  short segnum;   short segnum;
  byte side;   sbyte side;
   
  nd_read_short(&segnum);   nd_read_short(&segnum);
  nd_read_byte(&side);   nd_read_byte(&side);
Line 2799
 
Line 2802
  }   }
   
  case ND_EVENT_LASER_LEVEL: {   case ND_EVENT_LASER_LEVEL: {
  byte old_level, new_level;   sbyte old_level, new_level;
   
  nd_read_byte(&old_level);   nd_read_byte(&old_level);
  nd_read_byte(&new_level);   nd_read_byte(&new_level);
Line 2816
 
Line 2819
 #endif  #endif
   
  case ND_EVENT_NEW_LEVEL: {   case ND_EVENT_NEW_LEVEL: {
  byte new_level, old_level, loaded_level;   sbyte new_level, old_level, loaded_level;
    
  nd_read_byte (&new_level);   nd_read_byte (&new_level);
  nd_read_byte (&old_level);   nd_read_byte (&old_level);
Line 2921
 
Line 2924
 void newdemo_goto_end()  void newdemo_goto_end()
 {  {
  short frame_length;   short frame_length;
  byte level;   sbyte level;
  int i;   int i;
   
  fseek(infile, -2, SEEK_END);   fseek(infile, -2, SEEK_END);
Line 2963
 
Line 2966
 void newdemo_goto_end()  void newdemo_goto_end()
 {  {
  short frame_length, byte_count, bshort;   short frame_length, byte_count, bshort;
  byte level, bbyte, laser_level;   sbyte level, bbyte, laser_level;
  ubyte energy, shield;   ubyte energy, shield;
  int i, loc, bint;   int i, loc, bint;
   
Line 3009
 
Line 3012
  }   }
  if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE)   if (Players[Player_num].flags & PLAYER_FLAGS_INVULNERABLE)
  Players[Player_num].invulnerable_time = GameTime - (INVULNERABLE_TIME_MAX / 2);   Players[Player_num].invulnerable_time = GameTime - (INVULNERABLE_TIME_MAX / 2);
  nd_read_byte((byte *)&Primary_weapon);   nd_read_byte((sbyte *)&Primary_weapon);
  nd_read_byte((byte *)&Secondary_weapon);   nd_read_byte((sbyte *)&Secondary_weapon);
  for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)   for (i = 0; i < MAX_PRIMARY_WEAPONS; i++)
  nd_read_short((short *)&(Players[Player_num].primary_ammo[i]));    nd_read_short((short *)&(Players[Player_num].primary_ammo[i]));
  for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)   for (i = 0; i < MAX_SECONDARY_WEAPONS; i++)
Line 3022
 
Line 3025
  }   }
   
  if (Newdemo_game_mode & GM_MULTI) {   if (Newdemo_game_mode & GM_MULTI) {
  nd_read_byte((byte *)&N_players);   nd_read_byte((sbyte *)&N_players);
  for (i = 0; i < N_players; i++) {   for (i = 0; i < N_players; i++) {
  nd_read_string(Players[i].callsign);   nd_read_string(Players[i].callsign);
  nd_read_byte(&(Players[i].connected));   nd_read_byte(&(Players[i].connected));
Line 3457
 
Line 3460
 #ifndef SHAREWARE  #ifndef SHAREWARE
  byte_count += 10; // from frame_bytes_written   byte_count += 10; // from frame_bytes_written
    
  nd_write_byte((byte)(f2ir(Players[Player_num].energy)));   nd_write_byte((sbyte)(f2ir(Players[Player_num].energy)));
  nd_write_byte((byte)(f2ir(Players[Player_num].shields)));   nd_write_byte((sbyte)(f2ir(Players[Player_num].shields)));
  nd_write_int(Players[Player_num].flags); // be sure players flags are set   nd_write_int(Players[Player_num].flags); // be sure players flags are set
  nd_write_byte((byte)Primary_weapon);   nd_write_byte((sbyte)Primary_weapon);
  nd_write_byte((byte)Secondary_weapon);   nd_write_byte((sbyte)Secondary_weapon);
  byte_count += 8;   byte_count += 8;
   
  for (l = 0; l < MAX_PRIMARY_WEAPONS; l++)   for (l = 0; l < MAX_PRIMARY_WEAPONS; l++)
Line 3475
 
Line 3478
  byte_count++;   byte_count++;
   
  if (Game_mode & GM_MULTI) {   if (Game_mode & GM_MULTI) {
  nd_write_byte((byte)N_players);   nd_write_byte((sbyte)N_players);
  byte_count++;   byte_count++;
  for (l = 0; l < N_players; l++) {   for (l = 0; l < N_players; l++) {
  nd_write_string(Players[l].callsign);   nd_write_string(Players[l].callsign);

Legend:
line(s) removed in v.1.1 
line(s) changed
 line(s) added in v.1.2