1 /* Patrick 10/7/97------------------------------------------------------
2   Header for Multi-Player game support header
3   ----------------------------------------------------------------------*/
4 #ifndef pldnet_h_included
5 #define pldnet_h_included
6 #ifdef __cplusplus
7 extern "C" {
8 #endif
9 
10 #define EXTRAPOLATION_TEST 1
11 
12 /* Oh, for heaven's sake... */
13 #include "psnd.h"
14 #include "particle.h"
15 /* ---------------------------------------------------------------------
16   Some defines for multiplayer games
17   ----------------------------------------------------------------------*/
18 #define NET_MAXPLAYERS				(8)
19 #define NET_MAXPLAYEROBJECTS		(15)
20 #define NET_MAXPLAYERSCORE			(500)
21 #define NET_MAXGAMETIME				(255) /* minutes */
22 #define NET_MESSAGEBUFFERSIZE		(3072) /* an adequate number of bytes */
23 #define NET_PLAYERNAMELENGTH		(13)
24 #define NET_EULERSCALESHIFT			(4)
25 #define NET_MAXOBJECTID				(32767)
26 #define NET_MESSAGEITERATIONS		(5)
27 #define NET_MAXTEAMS				(4)
28 
29 #define NET_IDNOTINPLAYERLIST		(-1)
30 #define NET_NOEMPTYSLOTINPLAYERLIST	(-1)
31 
32 #define NET_STARTUPINTEGRITY 		(ONE_FIXED*2)
33 
34 #define NETGAMESPEED_70PERCENT 0
35 #define NETGAMESPEED_80PERCENT 1
36 #define NETGAMESPEED_90PERCENT 2
37 #define NETGAMESPEED_100PERCENT 3
38 
39 #define JOINNETGAME_WAITFORSTART 0
40 #define JOINNETGAME_WAITFORDESC 1
41 #define JOINNETGAME_WRONGAVPVERSION 2
42 #define JOINNETGAME_DONTHAVELEVEL 3
43 
44 /* ---------------------------------------------------------------------
45   Enum of message types
46   ----------------------------------------------------------------------*/
47 typedef enum netmessagetype
48 {
49 	NetMT_GameDescription,
50 	NetMT_PlayerDescription,
51 	NetMT_StartGame,
52 	NetMT_PlayerState,
53 	NetMT_PlayerState_Minimal,
54 	NetMT_PlayerState_Medium,
55 	NetMT_PlayerKilled,
56 	NetMT_PlayerLeaving,
57 	NetMT_AllGameScores,
58 	NetMT_PlayerScores,
59 	NetMT_LocalRicochet,
60 	NetMT_LocalObjectState,
61 	NetMT_LocalObjectDamaged,
62 	NetMT_LocalObjectDestroyed,
63 	NetMT_ObjectPickedUp,
64 	NetMT_InanimateObjectDamaged,
65 	NetMT_InanimateObjectDestroyed,
66 	NetMT_LOSRequestBinarySwitch,
67 	NetMT_PlatformLiftState,
68 	NetMT_RequestPlatformLiftActivate,
69 	NetMT_PlayerAutoGunState,
70 	NetMT_MakeDecal,
71 	NetMT_ChatBroadcast,
72 	NetMT_MakeExplosion,
73 	NetMT_MakeFlechetteExplosion,
74 	NetMT_MakePlasmaExplosion,
75 	NetMT_PredatorSights,
76 	NetMT_LocalObjectOnFire,
77 	NetMT_RestartNetworkGame,
78 	NetMT_FragmentalObjectsStatus,
79 	NetMT_AlienAIState,
80 	NetMT_AlienAISequenceChange,
81 	NetMT_AlienAIKilled,
82 	NetMT_GhostHierarchyDamaged,
83 	NetMT_SpotAlienSound,
84 	NetMT_LocalObjectDestroyed_Request,
85 	NetMT_LastManStanding_Restart,
86 	NetMT_LastManStanding_RestartInfo,
87 	NetMT_LastManStanding_RestartCountDown,
88 	NetMT_LastManStanding_LastMan,
89 	NetMT_PredatorTag_NewPredator,  //same message also used for alien tag
90 	NetMT_EndGame,
91 	NetMT_CreateWeapon,
92 	NetMT_RespawnPickups,
93 	NetMT_ScoreChange,
94 	NetMT_Gibbing,
95 	NetMT_CorpseDeathAnim,
96 	NetMT_StrategySynch,
97 	NetMT_FrameTimer,
98 	NetMT_SpeciesScores,
99 	NetMT_FarAlienPosition,
100 	NetMT_SpotOtherSound,
101 }NETMESSAGETYPE;
102 
103 /* ---------------------------------------------------------------------
104   Enums of game types, and local game states
105   ----------------------------------------------------------------------*/
106 typedef enum netgame_type
107 {
108 	NGT_Individual,
109 	NGT_CoopDeathmatch,
110 	NGT_LastManStanding,
111 	NGT_PredatorTag,
112 	NGT_Coop,
113 	NGT_AlienTag
114 }NETGAME_TYPE;
115 
116 typedef enum netgame_states
117 {
118 	NGS_StartUp,
119 	NGS_Joining,
120 	NGS_Playing,
121 	NGS_Leaving,
122 	NGS_EndGame,
123 	NGS_Error_GameFull,
124 	NGS_Error_GameStarted,
125 	NGS_Error_HostLost,
126 	NGS_EndGameScreen,
127 }NETGAME_STATES;
128 
129 
130 #define NUM_PC_TYPES 3
131 typedef enum netgame_charactertype
132 {
133 	NGCT_Marine,
134 	NGCT_Predator,
135 	NGCT_Alien,
136 	NGCT_AI_Alien,
137 	NGCT_AI_Predalien,
138 	NGCT_AI_Praetorian,
139 }NETGAME_CHARACTERTYPE;
140 
141 #define NUM_PC_SUBTYPES 9
142 typedef enum netgame_specialistcharactertype
143 {
144 	NGSCT_General,
145 	NGSCT_PulseRifle,
146 	NGSCT_Smartgun,
147 	NGSCT_Flamer,
148 	NGSCT_Sadar,
149 	NGSCT_GrenadeLauncher,
150 	NGSCT_Minigun,
151 	NGSCT_Frisbee,
152 	NGSCT_Pistols,
153 }NETGAME_SPECIALISTCHARACTERTYPE;
154 
155 typedef enum netgame_connectiontype
156 {
157 	CONN_TCPIP,
158 	CONN_IPX,
159 	CONN_Serial,
160 	CONN_Modem,
161 	CONN_Mplayer,
162 }NETGAME_CONNECTIONTYPE;
163 
164 /* ---------------------------------------------------------------------
165   Player data structure, and game description data structure
166   ----------------------------------------------------------------------*/
167 typedef struct netgame_playerdata
168 {
169 	DPID playerId;
170 
171 	char name[NET_PLAYERNAMELENGTH];
172 	NETGAME_CHARACTERTYPE characterType;
173 	NETGAME_SPECIALISTCHARACTERTYPE characterSubType;
174 	int playerFrags[NET_MAXPLAYERS];
175 	int aliensKilled[3];
176 	int deathsFromAI;
177 	int playerScore;
178 	int playerScoreAgainst; //points scored by killing this player
179 
180 	VECTORCH lastKnownPosition;
181 
182 	unsigned int timer; //used by extrapolation stuff (doesn't matter that it isn't initialised)
183 
184 	unsigned char startFlag;
185 	unsigned char playerAlive:1;
186 	unsigned char playerHasLives:1;
187 
188 
189 }NETGAME_PLAYERDATA;
190 
191 typedef struct netgame_gamedata
192 {
193 	NETGAME_STATES myGameState;
194 	NETGAME_CHARACTERTYPE myCharacterType;
195 	NETGAME_CHARACTERTYPE myNextCharacterType; //if player is currently dead and about to become a new character
196 	NETGAME_SPECIALISTCHARACTERTYPE myCharacterSubType;
197 	unsigned char myStartFlag;
198 	NETGAME_PLAYERDATA playerData[NET_MAXPLAYERS];
199 	int teamScores[3];
200 	NETGAME_TYPE gameType;
201 	int levelNumber;
202 	int scoreLimit;
203 	int timeLimit;
204 	int invulnerableTime;//in seconds after respawn
205 	int GameTimeElapsed;
206 
207 	//scoring system stuff
208 	int characterKillValues[3];
209 	int baseKillValue;
210 	BOOL useDynamicScoring;
211 	BOOL useCharacterKillValues;
212 
213 	int aiKillValues[3];
214 
215 	//for last man standing game
216 	int LMS_AlienIndex;
217 	int LMS_RestartTimer;
218 
219 	int stateCheckTimeDelay;
220 
221 	/*following timer used to prevent the game description from being sent every frame*/
222 	int gameDescriptionTimeDelay;
223 
224 	/*sendFrequencey - how often to send messages in fixed point seconds*/
225 	int sendFrequency;
226 	int sendTimer;
227 
228 	//player type limits
229 	int maxPredator;
230 	int maxAlien;
231 	int maxMarine;
232 
233 	int maxMarineGeneral;
234 	int maxMarinePulseRifle;
235 	int maxMarineSmartgun;
236 	int maxMarineFlamer;
237 	int maxMarineSadar;
238 	int maxMarineGrenade;
239 	int maxMarineMinigun;
240 	int maxMarineSmartDisc;
241 	int maxMarinePistols;
242 
243 	//weapons allowed
244 	BOOL allowSmartgun;
245 	BOOL allowFlamer;
246 	BOOL allowSadar;
247 	BOOL allowGrenadeLauncher;
248 	BOOL allowMinigun;
249 	BOOL allowDisc;
250 	BOOL allowPistol;
251 	BOOL allowPlasmaCaster;
252 	BOOL allowSpeargun;
253 	BOOL allowMedicomp;
254 	BOOL allowSmartDisc;
255 	BOOL allowPistols;
256 
257 	//lives
258 	int maxLives;
259 	BOOL useSharedLives;
260 	int numDeaths[3];	//deaths for each species
261 
262 	//object respawn
263 	int pointsForRespawn;
264 	int timeForRespawn; //seconds
265 
266 	int lastPointsBasedRespawn;
267 
268 
269 
270 	BOOL sendDecals;
271 	unsigned int needGameDescription :1;
272 
273 	BOOL skirmishMode; //for single player multiplayer games
274 
275 	int myLastScream;
276 
277 	int gameSpeed; //0 to 3 , for 70,80,90 or 100 percent speed
278 
279 	BOOL preDestroyLights;
280 	BOOL disableFriendlyFire; //stops people on the same team from hurting each other
281 	BOOL fallingDamage;
282 	BOOL pistolInfiniteAmmo;
283 	BOOL specialistPistols;
284 
285 	//don't bother tring to synch strategies if the checksum values are different
286 	int myStrategyCheckSum;
287 
288 	unsigned int tcpip_available :1;
289 	unsigned int ipx_available :1;
290 	unsigned int modem_available :1;
291 	unsigned int serial_available :1;
292 
293 	NETGAME_CONNECTIONTYPE connectionType;
294 
295 	unsigned int landingNoise:1;
296 
297 	int joiningGameStatus;
298 
299 	char customLevelName[40];
300 
301 }NETGAME_GAMEDATA;
302 
303 /* ---------------------------------------------------------------------
304   Individual message structures
305    ----------------------------------------------------------------------*/
306 
307 PACKED_PUSH
308 typedef struct netmessageheader
309 {
310 	unsigned char type;
311 } PACKED NETMESSAGEHEADER;
312 PACKED_POP
313 
314 PACKED_PUSH
315 typedef struct gamedescription_playerdata
316 {
317 	DPID playerId;
318 
319 	unsigned char characterType:2;
320 	unsigned char characterSubType:6;
321 	unsigned char startFlag;
322 } PACKED GAMEDESCRIPTION_PLAYERDATA;
323 PACKED_POP
324 
325 PACKED_PUSH
326 typedef struct netmessage_gamedescription
327 {
328 	GAMEDESCRIPTION_PLAYERDATA players[NET_MAXPLAYERS];
329 	unsigned char gameType;
330 	unsigned char levelNumber;
331 	int scoreLimit;
332 	unsigned char timeLimit;
333 	unsigned char invulnerableTime;
334 
335 	unsigned char maxLives;
336 	unsigned char numDeaths[3];
337 	unsigned char timeForRespawn;
338 	int pointsForRespawn;
339 
340 	short GameTimeElapsed;//in seconds
341 
342 	//scoring system stuff
343 	unsigned char characterKillValues[3];
344 	unsigned char baseKillValue;
345 	unsigned int useDynamicScoring:1;
346 	unsigned int useCharacterKillValues:1;
347 
348 	unsigned char aiKillValues[3];
349 
350 	unsigned int sendDecals :1;
351 	//weapons allowed
352 	unsigned int allowSmartgun:1;
353 	unsigned int allowFlamer:1;
354 	unsigned int allowSadar:1;
355 	unsigned int allowGrenadeLauncher:1;
356 	unsigned int allowMinigun:1;
357 	unsigned int allowDisc:1;
358 	unsigned int allowPistol:1;
359 	unsigned int allowPlasmaCaster:1;
360 	unsigned int allowSpeargun:1;
361 	unsigned int allowMedicomp:1;
362 	unsigned int allowSmartDisc:1;
363 	unsigned int allowPistols:1;
364 
365 	//player type limits
366 	unsigned int maxPredator:4;
367 	unsigned int maxAlien:4;
368 	unsigned int maxMarine:4;
369 
370 	unsigned int maxMarineGeneral:4;
371 	unsigned int maxMarinePulseRifle:4;
372 	unsigned int maxMarineSmartgun:4;
373 	unsigned int maxMarineFlamer:4;
374 	unsigned int maxMarineSadar:4;
375 	unsigned int maxMarineGrenade:4;
376 	unsigned int maxMarineMinigun:4;
377 	unsigned int maxMarineSmartDisc:4;
378 	unsigned int maxMarinePistols:4;
379 
380 	unsigned int useSharedLives:1;
381 
382 	unsigned int gameSpeed:2;
383 
384 	unsigned int endGame:1;
385 
386 	unsigned int preDestroyLights:1;
387 	unsigned int disableFriendlyFire:1;
388 	unsigned int fallingDamage:1;
389 	unsigned int pistolInfiniteAmmo:1;
390 	unsigned int specialistPistols:1;
391 
392 } PACKED NETMESSAGE_GAMEDESCRIPTION;
393 PACKED_POP
394 
395 PACKED_PUSH
396 typedef struct netmessage_playerdescription
397 {
398 	unsigned char characterType: 3;
399 	unsigned char characterSubType: 4;
400 	unsigned char startFlag: 1;
401 } PACKED NETMESSAGE_PLAYERDESCRIPTION;
402 PACKED_POP
403 
404 PACKED_PUSH
405 typedef struct netmessage_playerstate
406 {
407 	unsigned char characterType :2; //send character type each frame (in case it changes)
408 	unsigned char nextCharacterType :2; //if player is currently dead and about to become a new character
409 	unsigned char characterSubType :4;
410 	signed int xPos: 23;
411 	signed int xOrient: 9;
412 	signed int yPos: 23;
413 	signed int yOrient: 9;
414 	signed int zPos: 23;
415 	signed int zOrient: 9;
416 	unsigned char sequence;
417 	unsigned char currentWeapon;
418 	unsigned short CloakingEffectiveness;
419 
420 	unsigned int Elevation : 12;
421 	unsigned int IHaveAMuzzleFlash: 2;
422 	unsigned int IAmFiringPrimary: 1;
423 	unsigned int IAmFiringSecondary: 1;
424 	unsigned int IAmAlive: 1;
425 //	unsigned int IAmHost: 1;
426 	unsigned int IAmOnFire: 1;
427 	unsigned int IHaveADisk:	1;
428 	unsigned int IHaveLifeLeft:1;
429 	unsigned int IAmCrouched:1;
430 	unsigned int Special:1;
431 
432 	unsigned int scream:5;
433 
434 	unsigned int IAmInvulnerable:1;
435 
436 #if EXTRAPOLATION_TEST
437 	//this lot will need to be sent more efficiently
438 	int standard_gravity:1;
439 	int velocity_x :10; //in 10's of cm/second
440 	int velocity_y :10;	//in 10's of cm/second
441 	int velocity_z :10;	//in 10's of cm/second
442 #endif
443 	unsigned int landingNoise:1;
444 
445 } PACKED NETMESSAGE_PLAYERSTATE;
446 PACKED_POP
447 
448 PACKED_PUSH
449 typedef struct netmessage_playerstate_minimal
450 {
451 	unsigned short Elevation : 12;
452 	unsigned short IHaveAMuzzleFlash: 2;
453 	unsigned short IAmFiringPrimary: 1;
454 	unsigned short IAmFiringSecondary: 1;
455 	unsigned short IAmAlive: 1;
456 	unsigned char IAmOnFire: 1;
457 	unsigned char IHaveADisk:	1;
458 	unsigned char IHaveLifeLeft:1;
459 	unsigned char Special:1;
460 
461 	unsigned char CloakingEffectiveness;
462 } PACKED NETMESSAGE_PLAYERSTATE_MINIMAL;
463 PACKED_POP
464 
465 PACKED_PUSH
466 typedef struct netmessage_playerstate_medium
467 {
468 	NETMESSAGE_PLAYERSTATE_MINIMAL minimalMessage;
469 
470 	signed int xOrient: 9;
471 	signed int yOrient: 9;
472 	signed int zOrient: 9;
473 
474 } PACKED NETMESSAGE_PLAYERSTATE_MEDIUM;
475 PACKED_POP
476 
477 PACKED_PUSH
478 typedef struct netmessage_frametimer
479 {
480 	unsigned short frame_time;
481 } PACKED NETMESSAGE_FRAMETIMER;
482 PACKED_POP
483 
484 PACKED_PUSH
485 typedef struct netmessage_playerkilled
486 {
487 	int objectId;
488 	DPID killerId;
489 
490 	NETGAME_CHARACTERTYPE myType;  //take character types at time of death , in case they change
491 	NETGAME_CHARACTERTYPE killerType;
492 	char weaponIcon;
493 } PACKED NETMESSAGE_PLAYERKILLED;
494 PACKED_POP
495 
496 PACKED_PUSH
497 typedef struct netmessage_corpsedeathanim
498 {
499 	int objectId;
500 	int deathId;
501 } PACKED NETMESSAGE_CORPSEDEATHANIM;
502 PACKED_POP
503 
504 PACKED_PUSH
505 typedef struct netmessage_allgamescores
506 {
507 	int playerFrags[NET_MAXPLAYERS][NET_MAXPLAYERS];
508 	int playerScores[NET_MAXPLAYERS];
509 	int playerScoresAgainst[NET_MAXPLAYERS];
510 	int aliensKilled[NET_MAXPLAYERS][3];
511 	int deathsFromAI[NET_MAXPLAYERS];
512 
513 } PACKED NETMESSAGE_ALLGAMESCORES;
514 PACKED_POP
515 
516 PACKED_PUSH
517 typedef struct netmessage_speciesscores
518 {
519 	int teamScores[3];
520 } PACKED NETMESSAGE_SPECIESSCORES;
521 PACKED_POP
522 
523 PACKED_PUSH
524 typedef struct netmessage_playerscores
525 {
526 	unsigned char playerId;
527 	int playerFrags[NET_MAXPLAYERS];
528 	int playerScore;
529 	int playerScoreAgainst;
530 	int aliensKilled[3];
531 	int deathsFromAI;
532 } PACKED NETMESSAGE_PLAYERSCORES;
533 PACKED_POP
534 
535 PACKED_PUSH
536 typedef struct netmessage_scorechange
537 {
538 	unsigned char killerIndex;
539 	unsigned char victimIndex;
540 	int fragCount;
541 	int killerScoreFor;
542 	int victimScoreAgainst;
543 } PACKED NETMESSAGE_SCORECHANGE;
544 PACKED_POP
545 
546 PACKED_PUSH
547 typedef struct netmessage_localRicochet
548 {
549 	signed int xPos;
550 	signed int yPos;
551 	signed int zPos;
552 	signed int xDirn;
553 	signed int yDirn;
554 	signed int zDirn;
555 	unsigned char type;
556 } PACKED NETMESSAGE_LOCALRICOCHET;
557 PACKED_POP
558 
559 PACKED_PUSH
560 typedef struct netmessage_lobstate
561 {
562 	signed int xPos: 23;
563 	signed int xOrient: 9;
564 	signed int yPos: 23;
565 	signed int yOrient: 9;
566 	signed int zPos: 23;
567 	signed int zOrient: 9;
568 	signed int objectId;
569 	unsigned char type;
570 	unsigned char IOType;
571 	unsigned char subtype;
572 	unsigned char event_flag;
573 } PACKED NETMESSAGE_LOBSTATE;
574 PACKED_POP
575 
576 
577 //damage message is now split into multiple parts , to avoid sending
578 //stuff that isn't required
579 PACKED_PUSH
580 typedef struct netmessage_lobdamaged_header
581 {
582 	DPID playerId;
583 
584 	signed int objectId;
585 	short ammo_id:11;
586 
587 	short damageProfile:1;
588 	short multiple:1;
589 	short sectionID:1;
590 	short delta_seq:1;
591 	short direction:1;
592 } PACKED NETMESSAGE_LOBDAMAGED_HEADER;
593 PACKED_POP
594 
595 PACKED_PUSH
596 typedef struct netmessage_ghosthierarchydamaged_header
597 {
598 	signed int Guid;
599 	short ammo_id:11;
600 
601 	short damageProfile:1;
602 	short multiple:1;
603 	short sectionID:1;
604 	short direction:1;
605 } PACKED NETMESSAGE_GHOSTHIERARCHYDAMAGED_HEADER;
606 PACKED_POP
607 
608 PACKED_PUSH
609 typedef struct netmessage_inanimatedamaged_header
610 {
611 	char name[8];
612 	short ammo_id:11;
613 
614 	short damageProfile:1;
615 	short multiple:1;
616 } PACKED NETMESSAGE_INANIMATEDAMAGED_HEADER;
617 PACKED_POP
618 
619 PACKED_PUSH
620 typedef struct netmessage_damage_profile
621 {
622 	short Impact;		 /* nb I have copied these, as I don't think*/
623 	short Cutting;		 /* the structure will pack if I insert it directly */
624 	short Penetrative;
625 	short Fire;
626 	short Electrical;
627 	short Acid;
628 
629 	unsigned int ExplosivePower	:3;
630 	unsigned int Slicing		:2;
631 	unsigned int ProduceBlood	:1;
632 	unsigned int ForceBoom		:2;
633 	unsigned int BlowUpSections	:1;
634 	unsigned int Special		:1;
635 	unsigned int MakeExitWounds	:1;
636 } PACKED NETMESSAGE_DAMAGE_PROFILE;
637 PACKED_POP
638 
639 PACKED_PUSH
640 typedef struct netmessage_damage_multiple
641 {
642 	int multiple;
643 } PACKED NETMESSAGE_DAMAGE_MULTIPLE;
644 PACKED_POP
645 
646 PACKED_PUSH
647 typedef struct netmessage_damage_section
648 {
649 	short SectionID;
650 } PACKED NETMESSAGE_DAMAGE_SECTION;
651 PACKED_POP
652 
653 PACKED_PUSH
654 typedef struct netmessage_damage_delta
655 {
656 	char Delta_Sequence;
657 	char Delta_Sub_Sequence;
658 } PACKED NETMESSAGE_DAMAGE_DELTA;
659 PACKED_POP
660 
661 PACKED_PUSH
662 typedef struct netmessage_damage_direction
663 {
664 	int direction_x:10;
665 	int direction_y:10;
666 	int direction_z:10;
667 } PACKED NETMESSAGE_DAMAGE_DIRECTION;
668 PACKED_POP
669 //that was the last part of the local object damage stuff
670 
671 PACKED_PUSH
672 typedef struct netmessage_lobdestroyed_request
673 {
674 	DPID playerId;
675 
676 	signed int objectId;
677 } PACKED NETMESSAGE_LOBDESTROYED_REQUEST;
678 PACKED_POP
679 
680 PACKED_PUSH
681 typedef struct netmessage_lobdestroyed
682 {
683 	signed int objectId;
684 } PACKED NETMESSAGE_LOBDESTROYED;
685 PACKED_POP
686 
687 PACKED_PUSH
688 typedef struct netmessage_objectpickedup
689 {
690 	char name[8];
691 } PACKED NETMESSAGE_OBJECTPICKEDUP;
692 PACKED_POP
693 
694 PACKED_PUSH
695 typedef struct netmessage_inanimatedamaged
696 {
697 	char name[8];
698 	short Impact;		 /* nb I have copied these, as I don't think*/
699 	short Cutting;		 /* the structure will pack if I insert it directly */
700 	short Penetrative;
701 	short Fire;
702 	short Electrical;
703 	short Acid;
704 
705 	unsigned int ExplosivePower	:3;
706 	unsigned int Slicing		:2;
707 	unsigned int ProduceBlood	:1;
708 	unsigned int ForceBoom		:2;
709 	unsigned int BlowUpSections	:1;
710 	unsigned int Special		:1;
711 	unsigned int MakeExitWounds	:1;
712 
713 	enum AMMO_ID ammo_id;
714 
715 	int multiple;
716 
717 } PACKED NETMESSAGE_INANIMATEDAMAGED;
718 PACKED_POP
719 
720 PACKED_PUSH
721 typedef struct netmessage_inanimatedestroyed
722 {
723 	char name[8];
724 } PACKED NETMESSAGE_INANIMATEDESTROYED;
725 PACKED_POP
726 
727 PACKED_PUSH
728 typedef struct netmessage_losrequestbinaryswitch
729 {
730 	char name[8];
731 } PACKED NETMESSAGE_LOSREQUESTBINARYSWITCH;
732 PACKED_POP
733 
734 PACKED_PUSH
735 typedef struct netmessage_platformliftstate
736 {
737 	char name[8];
738 	char state;
739 } PACKED NETMESSAGE_PLATFORMLIFTSTATE;
740 PACKED_POP
741 
742 PACKED_PUSH
743 typedef struct netmessage_requestplatformliftactivate
744 {
745 	char name[8];
746 } PACKED NETMESSAGE_REQUESTPLATFORMLIFTACTIVATE;
747 PACKED_POP
748 
749 PACKED_PUSH
750 typedef struct netmessage_agunstate
751 {
752 	signed int xPos: 23;
753 	signed int xOrient: 9;
754 	signed int yPos: 23;
755 	signed int yOrient: 9;
756 	signed int zPos: 23;
757 	signed int zOrient: 9;
758 	signed int objectId;
759 	unsigned char IAmFiring: 1;
760 	unsigned char IAmEnabled: 1;
761 } PACKED NETMESSAGE_AGUNSTATE;
762 PACKED_POP
763 
764 /* KJL 17:45:21 20/01/98 - make decal message */
765 /* currently not optimised for space! */
766 #include "decal.h"
767 PACKED_PUSH
768 typedef struct netmessage_makedecal
769 {
770 	enum DECAL_ID DecalID;
771 	VECTORCH Position;
772 	VECTORCH Direction;
773 	int ModuleIndex;
774 } PACKED NETMESSAGE_MAKEDECAL;
775 PACKED_POP
776 
777 /* KJL 11:32:52 27/04/98 - explosions */
778 PACKED_PUSH
779 typedef struct netmessage_makeexplosion
780 {
781 	enum EXPLOSION_ID ExplosionID;
782 	VECTORCH Position;
783 } PACKED NETMESSAGE_MAKEEXPLOSION;
784 PACKED_POP
785 
786 PACKED_PUSH
787 typedef struct netmessage_makeflechetteexplosion
788 {
789 	VECTORCH Position;
790 	int Seed;
791 } PACKED NETMESSAGE_MAKEFLECHETTEEXPLOSION;
792 PACKED_POP
793 
794 PACKED_PUSH
795 typedef struct netmessage_makeplasmaexplosion
796 {
797 	enum EXPLOSION_ID ExplosionID;
798 	VECTORCH Position;
799 	VECTORCH FromPosition;
800 } PACKED NETMESSAGE_MAKEPLASMAEXPLOSION;
801 PACKED_POP
802 
803 /* KJL 11:13:59 20/05/98 - pred laser sights */
804 PACKED_PUSH
805 typedef struct netmessage_predatorsights
806 {
807 //	THREE_LASER_DOT_DESC Dots;
808 // was 85 bytes
809 
810 	signed int xPos: 23;
811 	signed int xOrient: 9;
812 	signed int yPos: 23;
813 	signed int yOrient: 9;
814 	signed int zPos: 23;
815 	signed int zOrient: 9;
816 
817 	DPID TargetID;
818 
819 	// 16 bytes (DPID 4 bytes?)
820 } PACKED NETMESSAGE_PREDATORSIGHTS;
821 PACKED_POP
822 
823 PACKED_PUSH
824 typedef struct netmessage_lobonfire
825 {
826 	DPID playerId;
827 
828 	signed int objectId;
829 } PACKED NETMESSAGE_LOBONFIRE;
830 PACKED_POP
831 
832 PACKED_PUSH
833 typedef struct netmessage_alienaistate
834 {
835 	signed int Guid;
836 
837 	signed int xPos: 23;
838 	signed int xOrient: 9;
839 	signed int yPos: 23;
840 	signed int yOrient: 9;
841 	signed int zPos: 23;
842 	signed int zOrient: 9;
843 
844 	unsigned char sequence_type;
845 	unsigned char sub_sequence;
846 	unsigned short sequence_length:13; //in 256ths of a second , up to ~32 seconds
847 
848 	#if 0
849 	unsigned int Elevation : 12;
850 	unsigned char IAmFiringPrimary: 1;
851 	unsigned char IAmFiringSecondary: 1;
852 	#endif
853 	unsigned short IAmOnFire: 1;
854 	unsigned short AlienType: 2;//alien/predalien/praetorian
855 
856 	#if EXTRAPOLATION_TEST
857 	unsigned short speed:15;
858 	unsigned short standard_gravity:1;
859 	#endif
860 
861 } PACKED NETMESSAGE_ALIENAISTATE;
862 PACKED_POP
863 
864 PACKED_PUSH
865 typedef struct netmessage_aliensequencechange
866 {
867 	signed int Guid;
868 
869 	unsigned char sequence_type;
870 	unsigned char sub_sequence;
871 	short sequence_length; //in 256ths of a second
872 	short tweening_time;
873 
874 } PACKED NETMESSAGE_ALIENSEQUENCECHANGE;
875 PACKED_POP
876 
877 PACKED_PUSH
878 typedef struct netmessage_alienaikilled
879 {
880 	signed int Guid;
881 
882 	int death_code;
883 	int death_time;
884 	int GibbFactor;
885 
886 	DPID killerId;
887 
888 	int killCount;
889 	unsigned char AlienType: 2;//alien/predalien/praetorian
890 
891 	char weaponIcon;
892 } PACKED NETMESSAGE_ALIENAIKILLED;
893 PACKED_POP
894 
895 PACKED_PUSH
896 typedef struct netmessage_faralienposition
897 {
898 	signed int Guid;
899 
900 	unsigned int targetModuleIndex:14;
901 	unsigned int index:15; //index is either module index , or an index in the aux locations list
902 	unsigned int indexIsModuleIndex:1;
903 	unsigned int alienType:2;
904 
905 } PACKED NETMESSAGE_FARALIENPOSITION;
906 PACKED_POP
907 
908 PACKED_PUSH
909 typedef struct netmessage_gibbing
910 {
911 	signed int Guid;
912 	int gibbFactor;
913 	int seed;
914 } PACKED NETMESSAGE_GIBBING;
915 PACKED_POP
916 
917 PACKED_PUSH
918 typedef struct netmessage_spotaliensound
919 {
920 	unsigned char soundCategory:6;
921 	unsigned char alienType:2;
922 	int pitch;
923 	int vx;
924 	int vy;
925 	int vz;
926 
927 } PACKED NETMESSAGE_SPOTALIENSOUND;
928 PACKED_POP
929 
930 PACKED_PUSH
931 typedef struct netmessage_createweapon
932 {
933 	char name[8];
934 	VECTORCH location;
935 	int type;
936 
937 } PACKED NETMESSAGE_CREATEWEAPON;
938 PACKED_POP
939 
940 #define NUMBER_OF_FRAGMENTAL_OBJECTS (64>>3)
941 PACKED_PUSH
942 typedef struct netmessage_fragmentalobjectsstatus
943 {
944 	unsigned char BatchNumber; //send object states over several frames
945 	unsigned char StatusBitfield[NUMBER_OF_FRAGMENTAL_OBJECTS];
946 
947 } PACKED NETMESSAGE_FRAGMENTALOBJECTSSTATUS;
948 PACKED_POP
949 
950 #define NUMBER_OF_STRATEGIES_TO_SYNCH 16
951 PACKED_PUSH
952 typedef struct netmessage_strategysynch
953 {
954 	unsigned char BatchNumber; //send object states over several frames
955 	int strategyCheckSum;
956 	unsigned char StatusBitfield[NUMBER_OF_STRATEGIES_TO_SYNCH>>2]; //2bits per strategy
957 
958 } PACKED NETMESSAGE_STRATEGYSYNCH;
959 PACKED_POP
960 
961 
962 //for messages that just require a player id
963 PACKED_PUSH
964 typedef struct netmessage_playerid
965 {
966 	DPID playerID;
967 } PACKED NETMESSAGE_PLAYERID;
968 PACKED_POP
969 
970 PACKED_PUSH
971 typedef struct netmessage_lms_restart
972 {
973 	DPID playerID;
974 
975 	int seed;
976 } PACKED NETMESSAGE_LMS_RESTART;
977 PACKED_POP
978 
979 PACKED_PUSH
980 typedef struct netmessage_restartgame
981 {
982 	int seed;
983 } PACKED NETMESSAGE_RESTARTGAME;
984 PACKED_POP
985 
986 //countdown to restart
987 PACKED_PUSH
988 typedef struct netmessage_lms_restarttimer
989 {
990 	unsigned char timer;
991 } PACKED NETMESSAGE_LMS_RESTARTTIMER;
992 PACKED_POP
993 
994 PACKED_PUSH
995 typedef struct netmessage_spotothersound
996 {
997 	enum soundindex SoundIndex;
998 	int vx;
999 	int vy;
1000 	int vz;
1001 	int explosion:1;
1002 
1003 } PACKED NETMESSAGE_SPOTOTHERSOUND;
1004 PACKED_POP
1005 
1006 PACKED_PUSH
1007 typedef struct multiplayer_start
1008 {
1009 	VECTORCH location;
1010 	EULER orientation;
1011 } PACKED MULTIPLAYER_START;
1012 PACKED_POP
1013 
1014 
1015 /* ---------------------------------------------------------------------
1016    Some prototypes
1017   ----------------------------------------------------------------------*/
1018 extern void InitAVPNetGame(void);
1019 extern void NetCollectMessages(void);
1020 extern void NetSendMessages(void);
1021 extern void EndAVPNetGame(void);
1022 extern int PlayerIdInPlayerList(DPID Id);
1023 //use assignnewsbname instead of addnetgameobjectid
1024 #define AddNetGameObjectID AssignNewSBName
1025 extern void AddNetGameObjectID(STRATEGYBLOCK *sbPtr);
1026 extern void RecordFinalNetGameScores(void);
1027 extern void DoNetScoresForHostDeath(NETGAME_CHARACTERTYPE myType,NETGAME_CHARACTERTYPE killerType);
1028 extern void RemovePlayerFromGame(DPID id);
1029 extern int EmptySlotInPlayerList(void);
1030 extern void TeleportNetPlayerToAStartingPosition(STRATEGYBLOCK *playerSbPtr, int startOfGame);
1031 extern int AddUpPlayerFrags(int playerId);
1032 
1033 extern void AddNetMsg_GameDescription(void);
1034 extern void AddNetMsg_PlayerDescription(void);
1035 extern void AddNetMsg_StartGame(void);
1036 extern void AddNetMsg_PlayerState(STRATEGYBLOCK *sbPtr);
1037 extern void AddNetMsg_PlayerState_Minimal(STRATEGYBLOCK *sbPtr,BOOL sendOrient);
1038 extern void AddNetMsg_FrameTimer();
1039 extern void AddNetMsg_PlayerKilled(int objectId,DAMAGE_PROFILE* damage);
1040 extern void AddNetMsg_PlayerDeathAnim(int deathId, int objectId);
1041 extern void AddNetMsg_PlayerLeaving(void);
1042 extern void AddNetMsg_AllGameScores(void);
1043 extern void AddNetMsg_PlayerScores(int playerId);
1044 extern void AddNetMsg_SpeciesScores();
1045 extern void AddNetMsg_LocalRicochet(AVP_BEHAVIOUR_TYPE behaviourType, VECTORCH *position, VECTORCH *direction);
1046 extern void AddNetMsg_LocalObjectState(STRATEGYBLOCK *sbPtr);
1047 extern void AddNetMsg_LocalObjectDamaged(STRATEGYBLOCK *sbPtr, DAMAGE_PROFILE *damage, int multiple, int sectionID,int delta_seq,int delta_sub_seq,VECTORCH* incoming);
1048 extern void AddNetMsg_LocalObjectDestroyed(STRATEGYBLOCK *sbPtr);
1049 extern void AddNetMsg_ObjectPickedUp(char *objectName);
1050 extern void AddNetMsg_InanimateObjectDamaged(STRATEGYBLOCK *sbPtr, DAMAGE_PROFILE *damage, int multiple);
1051 extern void AddNetMsg_InanimateObjectDestroyed(STRATEGYBLOCK *sbPtr);
1052 extern void AddNetMsg_LOSRequestBinarySwitch(STRATEGYBLOCK *sbPtr);
1053 extern void AddNetMsg_PlatformLiftState(STRATEGYBLOCK *sbPtr);
1054 extern void AddNetMsg_RequestPlatformLiftActivate(STRATEGYBLOCK *sbPtr);
1055 extern void AddNetMsg_RequestPlatformLiftReverse(STRATEGYBLOCK *sbPtr);
1056 extern void AddNetMsg_PlayerAutoGunState(STRATEGYBLOCK *sbPtr);
1057 extern void AddNetMsg_EndGame(void);
1058 extern void AddNetMsg_MakeDecal(enum DECAL_ID decalID, VECTORCH *normalPtr, VECTORCH *positionPtr, int moduleIndex);
1059 extern void AddNetMsg_ChatBroadcast(char *string,BOOL same_species_only);
1060 extern void AddNetMsg_MakeExplosion(VECTORCH *positionPtr, enum EXPLOSION_ID explosionID);
1061 extern void AddNetMsg_MakeFlechetteExplosion(VECTORCH *positionPtr, int seed);
1062 extern void AddNetMsg_MakePlasmaExplosion(VECTORCH *positionPtr, VECTORCH *fromPositionPtr, enum EXPLOSION_ID explosionID);
1063 extern void AddNetMsg_PredatorLaserSights(VECTORCH *positionPtr, VECTORCH *normalPtr, DISPLAYBLOCK *dispPtr);
1064 extern void AddNetMsg_LocalObjectOnFire(STRATEGYBLOCK *sbPtr);
1065 extern void AddNetMsg_RestartNetworkGame(int seed);
1066 extern void AddNetMsg_FragmentalObjectsStatus(void);
1067 extern void AddNetMsg_StrategySynch(void);
1068 extern void AddNetMsg_AlienAIState(STRATEGYBLOCK *sbPtr);
1069 extern void AddNetMsg_AlienAISeqChange(STRATEGYBLOCK *sbPtr,int sequence_type,int sub_sequence,int sequence_length,int tweening_time);
1070 extern void AddNetMsg_AlienAIKilled(STRATEGYBLOCK *sbPtr,int death_code,int death_time, int GibbFactor,DAMAGE_PROFILE* damage);
1071 extern void AddNetMsg_FarAlienPosition(STRATEGYBLOCK* sbPtr,int targetModuleIndex,int index,BOOL indexIsModuleIndex);
1072 extern void AddNetMsg_GhostHierarchyDamaged(STRATEGYBLOCK *sbPtr, DAMAGE_PROFILE *damage, int multiple, int sectionID,VECTORCH* incoming);
1073 extern void AddNetMsg_SpotAlienSound(int soundCategory,int alienType,int pitch,VECTORCH *position);
1074 extern void AddNetMsg_LocalObjectDestroyed_Request(STRATEGYBLOCK *sbPtr);
1075 extern void AddNetMsg_ScoreChange(int killerIndex,int victimIndex);
1076 
1077 extern void AddNetMsg_PlayerID(DPID playerID,unsigned char message);
1078 extern void AddNetMsg_LastManStanding_RestartTimer(char time);
1079 extern void AddNetMsg_LastManStanding_Restart(DPID alienID,int seed);
1080 
1081 extern void AddNetMsg_CreateWeapon(char* objectName,int type,VECTORCH* location);
1082 
1083 extern void AddNetMsg_RespawnPickups();
1084 
1085 extern void AddNetMsg_Gibbing(STRATEGYBLOCK* sbPtr,int gibbFactor,int seed);
1086 extern void AddNetMsg_SpotOtherSound(enum soundindex SoundIndex,VECTORCH *position,int explosion);
1087 
1088 extern void TransmitEndOfGameNetMsg(void);
1089 extern void TransmitPlayerLeavingNetMsg(void);
1090 extern void TransmitStartGameNetMsg(void);
1091 
1092 extern void RestartNetworkGame(int seed);
1093 
1094 extern void DeallocatePlayersMirrorImage();
1095 
1096 void InitNetLog(void);
1097 void LogNetInfo(char *msg);
1098 
1099 extern BOOL AreThereAnyLivesLeft();
1100 
1101 extern void DoMultiplayerSpecificHud();
1102 
1103 extern void GetNextMultiplayerObservedPlayer();
1104 extern void TurnOffMultiplayerObserveMode();
1105 extern void CheckStateOfObservedPlayer();
1106 void MinimalNetCollectMessages(void);
1107 void InitAVPNetGameForHost(int species, int gamestyle, int level);
1108 void InitAVPNetGameForJoin(void);
1109 void CreatePlayersImageInMirror(void);
1110 void RenderPlayersImageInMirror(void);
1111 
1112 
1113 /* ---------------------------------------------------------------------
1114    Some global references
1115   ----------------------------------------------------------------------*/
1116 extern NETGAME_GAMEDATA netGameData;
1117 extern int peerStartUpIntegrities[];
1118 
1119 extern int numMarineStartPos;
1120 extern int numAlienStartPos;
1121 extern int numPredatorStartPos;
1122 
1123 extern MULTIPLAYER_START* marineStartPositions;
1124 extern MULTIPLAYER_START* alienStartPositions;
1125 extern MULTIPLAYER_START* predatorStartPositions;
1126 
1127 #define LobbiedGame_NotLobbied 0
1128 #define LobbiedGame_Server 1
1129 #define LobbiedGame_Client 2
1130 extern int LobbiedGame;
1131 
1132 #ifdef __cplusplus
1133 }
1134 
1135 #endif
1136 #endif
1137