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