CnC_Remastered_Collection

Command and Conquer: Red Alert
Log | Files | Refs | README | LICENSE

SESSION.H (28925B)


      1 //
      2 // Copyright 2020 Electronic Arts Inc.
      3 //
      4 // TiberianDawn.DLL and RedAlert.dll and corresponding source code is free 
      5 // software: you can redistribute it and/or modify it under the terms of 
      6 // the GNU General Public License as published by the Free Software Foundation, 
      7 // either version 3 of the License, or (at your option) any later version.
      8 
      9 // TiberianDawn.DLL and RedAlert.dll and corresponding source code is distributed 
     10 // in the hope that it will be useful, but with permitted additional restrictions 
     11 // under Section 7 of the GPL. See the GNU General Public License in LICENSE.TXT 
     12 // distributed with this program. You should have received a copy of the 
     13 // GNU General Public License along with permitted additional restrictions 
     14 // with this program. If not, see https://github.com/electronicarts/CnC_Remastered_Collection
     15 
     16 /* $Header: /counterstrike/SESSION.H 4     3/10/97 6:23p Steve_tall $ */
     17 /***************************************************************************
     18  ***              C O N F I D E N T I A L  ---  W E S T W O O D  S T U D I O S               ***
     19  *                                                                         *
     20  *                 Project Name : Command & Conquer                        *
     21  *                                                                         *
     22  *                    File Name : SESSION.H                                *
     23  *                                                                         *
     24  *                   Programmer : Bill R. Randolph                         *
     25  *                                                                         *
     26  *                   Start Date : 11/30/95                                 *
     27  *                                                                         *
     28  *                  Last Update : November 30, 1995 [BRR]                  *
     29  *                                                                         *
     30  * The purpose of this class is to contain those variables & routines		*
     31  * specifically related to a multiplayer game.										*
     32  *                                                                         *
     33  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
     34 #ifndef SESSION_H
     35 #define SESSION_H
     36 
     37 #include "ipxaddr.h"
     38 #include "msglist.h"
     39 #include "connect.h"
     40 
     41 //---------------------------------------------------------------------------
     42 // Forward declarations
     43 //---------------------------------------------------------------------------
     44 class AircraftClass;
     45 class AnimClass;
     46 class BuildingClass;
     47 class BulletClass;
     48 class InfantryClass;
     49 class UnitClass;
     50 class PhoneEntryClass;
     51 class CellClass;
     52 
     53 //---------------------------------------------------------------------------
     54 // Defines
     55 //---------------------------------------------------------------------------
     56 //...........................................................................
     57 // Various limiting values
     58 //...........................................................................
     59 #define	MPLAYER_BUILD_LEVEL_MAX		10		// max build level in multiplay
     60 #define	MAX_MPLAYER_COLORS			8		// max # of colors
     61 
     62 //...........................................................................
     63 // Max sizes of packets we want to send
     64 // The IPX packet's size is IPX's max size (546), rounded down to accommodate
     65 // the max number of events possible.
     66 //...........................................................................
     67 #define	MAX_IPX_PACKET_SIZE			(((546 - sizeof(CommHeaderType)) / \
     68 												sizeof(EventClass) ) * sizeof(EventClass))
     69 #define	MAX_SERIAL_PACKET_SIZE		256
     70 
     71 //...........................................................................
     72 // Max length of player names fields; attempt to use the constant for the
     73 // HouseClass, if it's been defined; otherwise, define it myself.
     74 //...........................................................................
     75 #ifdef HOUSE_NAME_MAX
     76 #define	MPLAYER_NAME_MAX				HOUSE_NAME_MAX
     77 #else
     78 #define	MPLAYER_NAME_MAX				12		// max length of a player's name
     79 #endif
     80 
     81 //...........................................................................
     82 // Values to control the multiplayer score screen
     83 //...........................................................................
     84 #define	MAX_MULTI_NAMES	8		// max # names (rows) on the score screen
     85 #define	MAX_MULTI_GAMES	4		// max # games (columns) on the score screen
     86 
     87 //...........................................................................
     88 // Min value for MaxAhead, for both net & modem; only applies for
     89 // COMM_PROTOCOL_MULTI_E_COMP.
     90 //...........................................................................
     91 #define MODEM_MIN_MAX_AHEAD			5
     92 #define NETWORK_MIN_MAX_AHEAD			2
     93 
     94 //...........................................................................
     95 // Send period (in frames) for COMM_PROTOCOL_MULTI_E_COMP and above
     96 //...........................................................................
     97 #define DEFAULT_FRAME_SEND_RATE		3
     98 
     99 //...........................................................................
    100 // Modem-specific constants
    101 //...........................................................................
    102 #define	PORTBUF_MAX						64		// dialog field sizes
    103 #define	IRQBUF_MAX						3
    104 #define	BAUDBUF_MAX						7
    105 #define	INITSTRBUF_MAX					41
    106 #define	CWAITSTRBUF_MAX				16
    107 #define	CREDITSBUF_MAX					5
    108 #define	PACKET_TIMING_TIMEOUT		40		// ticks b/w sending a timing packet
    109 #define	MODEM_NAME_MAX					PORTBUF_MAX - 1	// Max length of modem name in list box
    110 
    111 //---------------------------------------------------------------------------
    112 // Enums
    113 //---------------------------------------------------------------------------
    114 //...........................................................................
    115 // Types of games; used to tell which protocol we're using
    116 //...........................................................................
    117 typedef enum GameEnum {
    118 	GAME_NORMAL,									// not multiplayer
    119 	GAME_MODEM,										// modem game
    120 	GAME_NULL_MODEM,								// NULL-modem
    121 	GAME_IPX,										// IPX Network game
    122 	GAME_INTERNET,									// Internet H2H
    123 	GAME_SKIRMISH,									// 1 plr vs. AI's
    124 	GAME_TEN,										// TEN Network game
    125 	GAME_MPATH,										// MPath Network game
    126 	GAME_GLYPHX_MULTIPLAYER						// Multiplayer game controlled by the GLYPHX engine. ST - 5/14/2019 11:41AM
    127 } GameType;
    128 
    129 //...........................................................................
    130 // Various Modem-specific enums
    131 //...........................................................................
    132 typedef enum DetectPortType {
    133 	PORT_VALID = 0,
    134 	PORT_INVALID,
    135 	PORT_IRQ_INUSE
    136 } DetectPortType;
    137 
    138 typedef enum DialStatusType {
    139 	DIAL_CONNECTED			= 0,
    140 	DIAL_NO_CARRIER,
    141 	DIAL_BUSY,
    142 	DIAL_ERROR,
    143 	DIAL_NO_DIAL_TONE,
    144 	DIAL_CANCELED
    145 } DialStatusType;
    146 
    147 typedef enum DialMethodType {
    148 	DIAL_TOUCH_TONE = 0,
    149 	DIAL_PULSE,
    150 	DIAL_METHODS
    151 } DialMethodType;
    152 
    153 typedef enum CallWaitStringType {
    154 	CALL_WAIT_TONE_1 = 0,
    155 	CALL_WAIT_TONE_2,
    156 	CALL_WAIT_PULSE,
    157 	CALL_WAIT_CUSTOM,
    158 	CALL_WAIT_STRINGS_NUM
    159 } CallWaitStringType;
    160 
    161 typedef enum ModemGameType {
    162 	MODEM_NULL_HOST = 0,
    163 	MODEM_NULL_JOIN,
    164 	MODEM_DIALER,
    165 	MODEM_ANSWERER
    166 } ModemGameType;
    167 
    168 //...........................................................................
    169 // Commands sent over the serial Global Channel
    170 //...........................................................................
    171 typedef enum SerialCommandType {
    172 	SERIAL_CONNECT			= 100,	// Are you there?  Hello?  McFly?
    173 	SERIAL_GAME_OPTIONS	= 101,	// Hey, dudes, here's some new game options
    174 	SERIAL_SIGN_OFF		= 102,	// Bogus, dudes, my boss is coming; I'm outta here!
    175 	SERIAL_GO				= 103,	// OK, dudes, jump into the game loop!
    176 	SERIAL_MESSAGE			= 104,	// Here's a message
    177 	SERIAL_TIMING			= 105,	// timimg packet
    178 	SERIAL_SCORE_SCREEN	= 106,	// player at score screen
    179 	SERIAL_LOADGAME		= 107,	// Start the game, loading a saved game first
    180 	SERIAL_LAST_COMMAND,				// last command
    181 	SERIAL_REQ_SCENARIO	= 1000,	// Reqest that host sends the scenario file to the other players.
    182 	SERIAL_FILE_INFO		= 1001,	// Info about the file that is going to be transferred
    183 	SERIAL_FILE_CHUNK		= 1002,	// A chunk of scenario
    184 	SERIAL_READY_TO_GO	= 1003,	// Sent in response to a 'GO' command
    185 	SERIAL_NO_SCENARIO	= 1004	// Scenario isnt available on remote machine so we cant play
    186 } SerialCommandType;
    187 
    188 //...........................................................................
    189 // Commands sent over the network Global Channel
    190 //...........................................................................
    191 typedef enum NetCommandType {
    192 	NET_QUERY_GAME,			// Hey, what games are out there?
    193 	NET_ANSWER_GAME,			// Yo, Here's my game's name!
    194 	NET_QUERY_PLAYER,			// Hey, what players are in this game?
    195 	NET_ANSWER_PLAYER,		// Yo, I'm in that game!
    196 	NET_CHAT_ANNOUNCE,		// I'm at the chat screen
    197 	NET_CHAT_REQUEST,			// Respond with a CHAT_ANNOUNCE, please.
    198 	NET_QUERY_JOIN,			// Hey guys, can I play too?
    199 	NET_CONFIRM_JOIN,			// Well, OK, if you really want to.
    200 	NET_REJECT_JOIN,			// No, you can't join; sorry, dude.
    201 	NET_GAME_OPTIONS,			// Hey, dudes, here's some new game options
    202 	NET_SIGN_OFF,				// Bogus, dudes, my boss is coming; I'm outta here!
    203 	NET_GO,						// OK, jump into the game loop!
    204 	NET_MESSAGE,				// Here's a message
    205 	NET_PING,					// I'm pinging you to take a time measurement
    206 	NET_LOADGAME,				// start a game by loading a saved game
    207 	NET_REQ_SCENARIO  =1000,// Reqest that host sends the scenario file to the other players.
    208 	NET_FILE_INFO		=1001,// Info about the file that is going to be transferred
    209 	NET_FILE_CHUNK		=1002,// A chunk of scenario
    210 	NET_READY_TO_GO	=1003,// Sent in response to a 'GO' command
    211 	NET_NO_SCENARIO	=1004	// Scenario isnt available on remote machine so we cant play
    212 } NetCommandType;
    213 
    214 //---------------------------------------------------------------------------
    215 // Structures
    216 //---------------------------------------------------------------------------
    217 //...........................................................................
    218 // An entry on the score screen is defined by this structure
    219 //...........................................................................
    220 typedef struct {
    221 	char Name[MPLAYER_NAME_MAX];
    222 	int Wins;
    223 	int Kills[MAX_MULTI_GAMES];
    224 	PlayerColorType Color;
    225 } MPlayerScoreType;
    226 
    227 //...........................................................................
    228 // Settings for the serial port
    229 //...........................................................................
    230 typedef struct {
    231 	int Port;
    232 	int IRQ;
    233 	int Baud;
    234 	DialMethodType DialMethod;
    235 	int InitStringIndex;
    236 	int CallWaitStringIndex;
    237 	char CallWaitString[ CWAITSTRBUF_MAX ];
    238 	bool Compression;
    239 	bool ErrorCorrection;
    240 	bool HardwareFlowControl;
    241 	char ModemName [ MODEM_NAME_MAX ];
    242 } SerialSettingsType;
    243 
    244 //...........................................................................
    245 //	This is a "node", used for the lists of available games & players.  The
    246 //	'Game' structure is used for games; the 'Player' structure for players.
    247 //...........................................................................
    248 typedef struct NodeNameTag {
    249 	char Name[MPLAYER_NAME_MAX];		// player or game name
    250 		IPXAddressClass Address;
    251 #if(TEN)
    252 		int TenAddress;
    253 #endif
    254 #if(MPATH)
    255 		int MPathAddress;
    256 #endif
    257 	union {
    258 		struct {
    259 			unsigned char IsOpen;		// is the game open?
    260 			unsigned long LastTime;		// last time we heard from this guy
    261 		} Game;
    262 		struct {
    263 			HousesType House;				// "ActLike" House of this player
    264 			PlayerColorType Color;		// Color of this player
    265 			HousesType ID;					// Actual House of this player
    266 			int ProcessTime;				// Length of time to process players main loop
    267 		} Player;
    268 		struct {
    269 			unsigned long LastTime;		// last time we heard from this guy
    270 			unsigned char LastChance;	// we're about to remove him from the list
    271 			PlayerColorType Color;		// chat player's color
    272 		} Chat;
    273 	};
    274 } NodeNameType;
    275 
    276 
    277 //...........................................................................
    278 // Packet sent over the serial Global Channel
    279 //...........................................................................
    280 typedef struct {
    281 	SerialCommandType Command;					// One of the enum's defined above
    282 	char Name[MPLAYER_NAME_MAX];				// Player or Game Name
    283 	unsigned char ID;								// unique ID of sender of message
    284 	union {
    285 		struct {
    286 			HousesType House;								// player's House
    287 			PlayerColorType Color;						// player's color or SIGNOFF ID
    288 			unsigned long MinVersion;					// min version this game supports
    289 			unsigned long MaxVersion;					// max version this game supports
    290 			char Scenario[DESCRIP_MAX];				// Scenario name
    291 			unsigned int Credits;						// player's credits
    292 			unsigned int IsBases		: 1;				// 1 = bases are allowed
    293 			unsigned int IsTiberium	: 1;				// 1 = tiberium is allowed
    294 			unsigned int IsGoodies	: 1;				// 1 = goodies are allowed
    295 			unsigned int IsGhosties	: 1;				// 1 = ghosts are allowed
    296 			unsigned int OfficialScenario : 1;		//	Is this scenario an official Westwood one?
    297 			int CheatCheck;								// Unique ID of "rules.ini" file.
    298 			unsigned char BuildLevel;					// buildable level
    299 			unsigned char UnitCount;					// max # units
    300 			unsigned char AIPlayers;					// # of AI players allowed
    301 			int Seed;										// random number seed
    302 			SpecialClass Special;						// command-line options
    303 			unsigned int GameSpeed;						// Game Speed
    304 			unsigned long ResponseTime;				// packet response time
    305 			unsigned int FileLength;					// Length of scenario file to expect from host.
    306 #ifdef WOLAPI_INTEGRATION
    307 			char ShortFileName[13];						// Name of scenario file to expect from host
    308 #else
    309 			char ShortFileName[12];						// Name of scenario file to expect from host
    310 #endif
    311 			unsigned char FileDigest[32];				// Digest of scenario file to expect from host
    312 														//	ajw - This is not necessarily null-terminated.
    313 		} ScenarioInfo;
    314 		struct {
    315 			char Message[MAX_MESSAGE_LENGTH];		// inter-player message
    316 			PlayerColorType Color;						// player's color or SIGNOFF ID
    317 		} Message;
    318 		struct {
    319 			PlayerColorType Color;						// player's color or SIGNOFF ID
    320 		} Chat;
    321 	};
    322 } SerialPacketType;
    323 
    324 //...........................................................................
    325 // Other packet sent over the serial global channel (for file transfers)
    326 //...........................................................................
    327 #define MAX_SEND_FILE_PACKET_SIZE MAX_SERIAL_PACKET_SIZE - 64
    328 typedef struct {
    329 	SerialCommandType	Command;					// Enum defined above. Should be a file transfer enum.
    330 	unsigned short 	BlockNumber;			// Index position of this file chunk in the file
    331 	unsigned short		BlockLength;			// Length of data in the RawData buffer
    332 	unsigned char 		RawData	[MAX_SEND_FILE_PACKET_SIZE];
    333 } RemoteFileTransferType;
    334 
    335 
    336 //...........................................................................
    337 // Packet sent over the network Global Channel
    338 //...........................................................................
    339 typedef struct GlobalPacketType {
    340 	NetCommandType Command;						// One of the enum's defined above
    341 	char Name[MPLAYER_NAME_MAX];				// Player or Game Name
    342 	union {
    343 		struct {
    344 			unsigned int IsOpen		: 1;		// 1 = game is open for joining
    345 		} GameInfo;
    346 		struct {
    347 			HousesType House;						// player's House
    348 			PlayerColorType Color;				// player's color
    349 			unsigned long NameCRC;				// CRC of player's game's name
    350 			unsigned long MinVersion;			// game's min supported version
    351 			unsigned long MaxVersion;			// game's max supported version
    352 			int CheatCheck;						// Unique ID of "rules.ini" file.
    353 		} PlayerInfo;
    354 		struct {
    355 			char Scenario[DESCRIP_MAX];		// Scenario Name
    356 			unsigned int Credits;				// player's credits
    357 			unsigned int IsBases		: 1;		// 1 = bases are allowed
    358 			unsigned int IsTiberium	: 1;		// 1 = tiberium is allowed
    359 			unsigned int IsGoodies	: 1;		// 1 = goodies are allowed
    360 			unsigned int IsGhosties	: 1;		// 1 = ghosts are allowed
    361 			unsigned int OfficialScenario :1;// Is this scenario an official Westwood one?
    362 			unsigned char BuildLevel;			// buildable level
    363 			unsigned char UnitCount;			// max # units
    364 			unsigned char AIPlayers;			// # of AI players allowed
    365 			int Seed;								// random number seed
    366 			SpecialClass Special;				// command-line options
    367 			unsigned int GameSpeed;				// Game Speed
    368 			unsigned long Version;				// version # common to all players
    369 			unsigned int FileLength;			// Length of scenario file to expect from host.
    370 #ifdef WOLAPI_INTEGRATION
    371 			char ShortFileName[13];				// Name of scenario file to expect from host
    372 #else
    373 			char ShortFileName[12];				// Name of scenario file to expect from host
    374 #endif
    375 			unsigned char FileDigest[32];		// Digest of scenario file to expect from host
    376 												//	ajw - This is not necessarily null-terminated.
    377 		} ScenarioInfo;
    378 		struct {
    379 			char Buf[MAX_MESSAGE_LENGTH];		// inter-user message
    380 			PlayerColorType Color;					// color of sender of message
    381 			unsigned long NameCRC;				// CRC of sender's Game Name
    382 		} Message;
    383 		struct {
    384 			int OneWay;								// one-way response time
    385 		} ResponseTime;
    386 		struct {
    387 			int Why;									// why were we rejected from the game?
    388 		} Reject;
    389 		struct {
    390 			unsigned long ID;						// unique ID for this chat node
    391 			PlayerColorType Color;				// my color
    392 		} Chat;
    393 	};
    394 } GlobalPacketType;
    395 
    396 
    397 //...........................................................................
    398 // For finding sync bugs; filled in by the engine when certain conditions
    399 // are met; the pointers allow examination of objects in the debugger.
    400 //...........................................................................
    401 typedef struct {
    402 	union {
    403 		AircraftClass *Aircraft;
    404 		AnimClass *Anim;
    405 		BuildingClass *Building;
    406 		BulletClass *Bullet;
    407 		InfantryClass *Infantry;
    408 		UnitClass *Unit;
    409 		void *All;
    410 	} Ptr;
    411 } TrapObjectType;
    412 
    413 /*
    414 **	This is the identifier for a multiplayer mission. This can be used to
    415 **	identify the filename of the mission as well as display the mission in a
    416 **	mission selection list.
    417 */
    418 class MultiMission
    419 {
    420 	public:
    421 		MultiMission(char const * filename = NULL, char const * description = NULL, char const *digest = NULL, bool official = true, bool expansion = false);
    422 
    423 		void Set_Description(char const * description);
    424 		void Set_Filename(char const * filename);
    425 		void Set_Digest(char const * digest);
    426 		void Set_Official(bool official);
    427 		void Set_Expansion(bool expansion);
    428 		void Draw_It(int index, int x, int y, int width, int height, bool selected, TextPrintType flags) const;
    429 		char const * Description(void) const {return(ScenarioDescription);}
    430 		char const * Get_Filename(void) const {return(Filename);}
    431 		char const * Get_Digest(void) const {return(Digest);}
    432 		bool Get_Official(void) { return (IsOfficial); }
    433 		bool Get_Expansion(void) { return (IsExpansion); }	//	Implied "IsCounterstrike". No longer used. -ajw
    434 
    435 	private:
    436 		char ScenarioDescription[DESCRIP_MAX];
    437 		char Filename[_MAX_FNAME+_MAX_EXT];
    438 		char Digest[32];
    439 		bool IsOfficial;
    440 		bool IsExpansion;
    441 };
    442 
    443 
    444 typedef struct {
    445 	int 	ScenarioIndex;		//Used on host machine only as index into scenario list
    446 	int 	Bases;
    447 	int 	Credits;
    448 	int 	Tiberium;
    449 	int 	Goodies;
    450 	int 	Ghosts;
    451 	int 	UnitCount;
    452 	int 	AIPlayers;			// # of AI players allowed to be built
    453 	char	ScenarioDescription [DESCRIP_MAX];	//Used on client machines only
    454 } GameOptionsType;
    455 
    456 //---------------------------------------------------------------------------
    457 // Class Definition
    458 //---------------------------------------------------------------------------
    459 class SessionClass
    460 {
    461 	//------------------------------------------------------------------------
    462 	// Public interface
    463 	//------------------------------------------------------------------------
    464 	public:
    465 		//.....................................................................
    466 		// Constructor/Destructor
    467 		//.....................................................................
    468 		SessionClass(void);
    469 		~SessionClass(void);
    470 
    471 		//.....................................................................
    472 		// Initialization
    473 		//.....................................................................
    474 		void One_Time(void);
    475 		void Init(void);
    476 
    477 		//.....................................................................
    478 		// Reads/writes to the INI file
    479 		//.....................................................................
    480 		void Read_MultiPlayer_Settings (void);
    481 		void Write_MultiPlayer_Settings (void);
    482 		void Read_Scenario_Descriptions (void);
    483 		void Free_Scenario_Descriptions(void);
    484 
    485 		//.....................................................................
    486 		// Utility functions
    487 		//.....................................................................
    488 		int Create_Connections(void);
    489 		bool Am_I_Master(void);
    490 		unsigned long Compute_Unique_ID(void);
    491 
    492 #if(TEN)
    493 		int Create_TEN_Connections(void);
    494 #endif	// TEN
    495 
    496 #if(MPATH)
    497 		int Create_MPATH_Connections(void);
    498 #endif	// MPATH
    499 
    500 		//.....................................................................
    501 		// File I/O
    502 		//.....................................................................
    503 		int Save(Pipe & file) const;
    504 		int Load(Straw & file);
    505 		int Save(CCFileClass & file);
    506 		int Load(CCFileClass & file);
    507 
    508 		//.....................................................................
    509 		// Debugging / Sync Bugs
    510 		//.....................................................................
    511 		void Trap_Object(void);
    512 
    513 		//---------------------------------------------------------------------
    514 		// Public Data
    515 		//---------------------------------------------------------------------
    516 		//.....................................................................
    517 		// The type of session being played
    518 		//.....................................................................
    519 		GameType Type;
    520 
    521 		//.....................................................................
    522 		// The current communications protocol
    523 		//.....................................................................
    524 		CommProtocolType CommProtocol;
    525 
    526 		//.....................................................................
    527 		// Game options
    528 		//.....................................................................
    529 		GameOptionsType Options;
    530 
    531 		//.....................................................................
    532 		// Unique workstation ID, for detecting my own packets
    533 		//.....................................................................
    534 		unsigned long UniqueID;
    535 
    536 		//.....................................................................
    537 		// Player's local options
    538 		//.....................................................................
    539 		char Handle[MPLAYER_NAME_MAX];		// player name
    540 		PlayerColorType PrefColor;				// preferred color index
    541 		PlayerColorType ColorIdx;				// actual color index
    542 		HousesType House;							// GDI / NOD
    543 		int ObiWan;									// 1 = player can see all
    544 		int Solo;									// 1 = player can play alone
    545 
    546 		//.....................................................................
    547 		// Max allowable # of players & actual # of (human) players
    548 		//.....................................................................
    549 		int MaxPlayers;
    550 		int NumPlayers;
    551 
    552 		//.....................................................................
    553 		// Frame-sync'ing timing variables
    554 		// 'MaxAhead' is the number of frames ahead of this one to execute
    555 		// a given packet.  It's set by the RESPONSE_TIME event.
    556 		// 'FrameSendRate' is the # frames between data packets
    557 		//.....................................................................
    558 		unsigned long MaxAhead;
    559 		unsigned long FrameSendRate;
    560 
    561 		int			DesiredFrameRate;
    562 
    563 		int			ProcessTimer;
    564 		int			ProcessTicks;
    565 		int			ProcessFrames;
    566 
    567 		//.....................................................................
    568 		// This flag is set when we've loaded a multiplayer game.
    569 		//.....................................................................
    570 		int LoadGame;
    571 
    572 		//.....................................................................
    573 		// This flag is set when the modem game saves the game due to a lost
    574 		// connection.
    575 		//.....................................................................
    576 		int EmergencySave;
    577 
    578 		//.....................................................................
    579 		// List of scenarios & their file numbers
    580 		//.....................................................................
    581 		DynamicVectorClass<MultiMission *> Scenarios;
    582 //		DynamicVectorClass <char *> Scenarios;
    583 //		DynamicVectorClass <int> Filenum;
    584 
    585 		char ScenarioFileName[_MAX_FNAME+_MAX_EXT+1];	//File name of scenario to load
    586 
    587 		char ScenarioDigest [32];								//Digest of scenario to load
    588 		unsigned int ScenarioFileLength;
    589 		bool ScenarioIsOfficial;
    590 
    591 		char ScenarioRequests[20];		//Which players requested scenario files
    592 		int  RequestCount;
    593 		IPXAddressClass	HostAddress;
    594 
    595 		//.....................................................................
    596 		// This is the multiplayer messaging system
    597 		//.....................................................................
    598 		MessageListClass Messages;
    599 		IPXAddressClass MessageAddress;
    600 		char LastMessage[MAX_MESSAGE_LENGTH];
    601 		unsigned WWChat		: 1;	// 1 = go into special WW Chat mode
    602 
    603 		//.....................................................................
    604 		// This is the multiplayer scorekeeping system
    605 		//.....................................................................
    606 		MPlayerScoreType Score[MAX_MULTI_NAMES];
    607 		int GamesPlayed;		// # games played this run
    608 		int NumScores;			// # active entries in MPlayerScore
    609 		int Winner;				// index of winner of last game
    610 		int CurGame;			// index of current game being played
    611 
    612 		//.....................................................................
    613 		// Static arrays
    614 		//.....................................................................
    615 		static char Descriptions[100][40];
    616 		static int CountMin[2];
    617 		static int CountMax[2];
    618 		static char * GlobalPacketNames[];
    619 		static char * SerialPacketNames[];
    620 
    621 		//.....................................................................
    622 		// For Recording & Playing back a file
    623 		//.....................................................................
    624 		CCFileClass RecordFile;
    625 		unsigned Record				: 1;
    626 		unsigned Play				 	: 1;
    627 		unsigned Attract			 	: 1;
    628 
    629 		//.....................................................................
    630 		// IPX-specific variables
    631 		//.....................................................................
    632 		int IsBridge;								// 1 = we're crossing a bridge
    633 		IPXAddressClass BridgeNet;				// address of bridge
    634 		bool NetStealth;							// makes us invisible
    635 		bool NetProtect;							// keeps others from messaging us
    636 		bool NetOpen;								// 1 = game is open for joining
    637 		char GameName[MPLAYER_NAME_MAX];		// game's name
    638 		GlobalPacketType GPacket;				// global packet
    639 		int GPacketlen;							// global packet length
    640 		IPXAddressClass GAddress;				// address of sender
    641 		unsigned short GProductID;				// product ID of sender
    642 		char MetaPacket[MAX_IPX_PACKET_SIZE]; // packet building buffer
    643 		int MetaSize;								// size of MetaPacket
    644 		DynamicVectorClass <NodeNameType *> Games;	// list of games
    645 		DynamicVectorClass <NodeNameType *> Players;	// list of players
    646 		DynamicVectorClass <NodeNameType *> Chat;		// list of chat nodes
    647 
    648 		//.....................................................................
    649 		// Modem-specific variables
    650 		//.....................................................................
    651 		unsigned ModemService		: 1;				// 1 = service modem in Call_Back
    652 		int CurPhoneIdx;							// phone listing index
    653 		SerialSettingsType SerialDefaults;	// default serial settings
    654 		ModemGameType ModemType;				// caller or answerer?
    655 
    656 		DynamicVectorClass<PhoneEntryClass *> PhoneBook;
    657 		DynamicVectorClass <char *> InitStrings;
    658 		static char * DialMethodCheck[ DIAL_METHODS ];
    659 		static char * CallWaitStrings[ CALL_WAIT_STRINGS_NUM ];
    660 
    661 		//.....................................................................
    662 		// For finding Sync Bugs
    663 		//.....................................................................
    664 		long TrapFrame;				// frame # to start trapping 'TrapObject'
    665 		RTTIType TrapObjType;		// type of object to trap
    666 		TrapObjectType TrapObject;	// ptr to object to trap (watch)
    667 		COORDINATE TrapCoord;		// coord of object, 0 = ignore
    668 		TARGET TrapTarget;			// Target # of object, 0 = ignore
    669 		CellClass * TrapCell;		// Ptr to cell to trap (watch)
    670 		int TrapCheckHeap;			// true = check the heap as of TrapFrame
    671 		long TrapPrintCRC;			// Frame # to print CRC state file
    672 
    673 #if(TEN)
    674 		//
    675 		// TEN-specific variables
    676 		//
    677 		char *TenPacket;
    678 		int TenSize;
    679 		int TenMessageAddress;
    680 		int TenAddress;
    681 		int TenPlayerID;
    682 		char OptionsFile[256];
    683 		int AllowSolo;
    684 		int NetResponseTime;
    685 #endif	// TEN
    686 
    687 #if(MPATH)
    688 		//
    689 		// MPATH-specific variables
    690 		//
    691 		char *MPathPacket;
    692 		int MPathSize;
    693 		int MPathMessageAddress;
    694 		int MPathAddress;
    695 		char OptionsFile[256];
    696 		int AllowSolo;
    697 		int NetResponseTime;
    698 #endif	// MPATH
    699 };
    700 
    701 #endif		// SESSION_H
    702 
    703 /*************************** end of session.h ******************************/