version 1.1 | | version 1.2 |
---|
| | |
* 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. |
| | |
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; |
| | |
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; |
| | |
* 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); |
} | | } |
| | |
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); |
} | | } |
| | |
| | |
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); |
| | |
#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; |
| | |
#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); |
| | |
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 |
| | |
| | |
| | |
#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(); |
| | |
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(); |
} | | } |
| | |
| | |
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(); |
} | | } |
| | |
| | |
{ | | { |
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(); |
} | | } |
| | |
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(); |
} | | } |
| | |
{ | | { |
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(); |
} | | } |
| | |
| | |
{ | | { |
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(); |
} | | } |
| | |
| | |
{ | | { |
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(); |
} | | } |
| | |
{ | | { |
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); |
| | |
{ | | { |
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(); |
} | | } |
| | |
| | |
{ | | { |
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(); |
} | | } |
| | |
| | |
{ | | { |
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(); |
} | | } |
| | |
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); |
| | |
{ | | { |
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); |
| | |
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; |
| | |
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 |
| | |
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; |
| | |
| | |
| | |
#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); |
| | |
} | | } |
#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); |
| | |
| | |
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); |
| | |
} | | } |
| | |
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)) { |
| | |
} | | } |
| | |
case ND_EVENT_MULTI_DECLOAK: { | | case ND_EVENT_MULTI_DECLOAK: { |
byte pnum; | | sbyte pnum; |
| | |
nd_read_byte(&pnum); | | nd_read_byte(&pnum); |
| | |
| | |
| | |
#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)) |
| | |
| | |
#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); |
| | |
} | | } |
| | |
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]; |
| | |
| | |
} | | } |
| | |
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)) |
| | |
} | | } |
| | |
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)) |
| | |
| | |
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); |
| | |
| | |
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); |
| | |
} | | } |
| | |
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); |
| | |
#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); |
| | |
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); |
| | |
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; |
| | |
| | |
} | | } |
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++) |
| | |
} | | } |
| | |
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)); |
| | |
#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++) |
| | |
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); |