1 /* 2 =========================================================================== 3 Copyright (C) 2000 - 2013, Raven Software, Inc. 4 Copyright (C) 2001 - 2013, Activision, Inc. 5 Copyright (C) 2013 - 2015, OpenJK contributors 6 7 This file is part of the OpenJK source code. 8 9 OpenJK is free software; you can redistribute it and/or modify it 10 under the terms of the GNU General Public License version 2 as 11 published by the Free Software Foundation. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; if not, see <http://www.gnu.org/licenses/>. 20 =========================================================================== 21 */ 22 23 #ifndef __G_SHARED_H__ 24 #define __G_SHARED_H__ 25 26 #include "bg_public.h" 27 #include "g_public.h" 28 #include "b_public.h" 29 #include "../icarus/StdAfx.h" //need stl 30 #include "../rd-common/tr_types.h" 31 #include "../cgame/cg_public.h" 32 #include "g_vehicles.h" 33 #include "hitlocs.h" 34 #include "bset.h" 35 36 #define FOFS(x) offsetof(gentity_t, x) 37 38 typedef enum //# taskID_e 39 { 40 TID_CHAN_VOICE = 0, // Waiting for a voice sound to complete 41 TID_ANIM_UPPER, // Waiting to finish a lower anim holdtime 42 TID_ANIM_LOWER, // Waiting to finish a lower anim holdtime 43 TID_ANIM_BOTH, // Waiting to finish lower and upper anim holdtimes or normal md3 animating 44 TID_MOVE_NAV, // Trying to get to a navgoal or For ET_MOVERS 45 TID_ANGLE_FACE, // Turning to an angle or facing 46 TID_BSTATE, // Waiting for a certain bState to finish 47 TID_LOCATION, // Waiting for ent to enter a specific trigger_location 48 // TID_MISSIONSTATUS, // Waiting for player to finish reading MISSION STATUS SCREEN 49 TID_RESIZE, // Waiting for clear bbox to inflate size 50 TID_SHOOT, // Waiting for fire event 51 NUM_TIDS, // for def of taskID array 52 } taskID_t; 53 54 55 typedef enum //# material_e 56 { 57 MAT_METAL = 0, // scorched blue-grey metal 58 MAT_GLASS, // not a real chunk type, just plays an effect with glass sprites 59 MAT_ELECTRICAL, // sparks only 60 MAT_ELEC_METAL, // sparks/electrical type metal 61 MAT_DRK_STONE, // brown 62 MAT_LT_STONE, // tan 63 MAT_GLASS_METAL,// glass sprites and METAl chunk 64 MAT_METAL2, // electrical metal type 65 MAT_NONE, // no chunks 66 MAT_GREY_STONE, // grey 67 MAT_METAL3, // METAL and METAL2 chunks 68 MAT_CRATE1, // yellow multi-colored crate chunks 69 MAT_GRATE1, // grate chunks 70 MAT_ROPE, // for yavin trial...no chunks, just wispy bits 71 MAT_CRATE2, // read multi-colored crate chunks 72 MAT_WHITE_METAL,// white angular chunks 73 74 NUM_MATERIALS 75 76 } material_t; 77 78 //===From cg_local.h================================================ 79 #define DEFAULT_HEADMODEL "" 80 #define DEFAULT_TORSOMODEL "" 81 #define DEFAULT_LEGSMODEL "mouse" 82 83 // each client has an associated clientInfo_t 84 // that contains media references necessary to present the 85 // client model and other color coded effects 86 // this is regenerated each time a userinfo configstring changes 87 88 #define MAX_CUSTOM_BASIC_SOUNDS 14 89 #define MAX_CUSTOM_COMBAT_SOUNDS 17 90 #define MAX_CUSTOM_EXTRA_SOUNDS 36 91 #define MAX_CUSTOM_JEDI_SOUNDS 22 92 #define MAX_CUSTOM_SOUNDS (MAX_CUSTOM_JEDI_SOUNDS + MAX_CUSTOM_EXTRA_SOUNDS + MAX_CUSTOM_COMBAT_SOUNDS + MAX_CUSTOM_BASIC_SOUNDS) 93 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! 94 class clientInfo_t 95 { 96 public: 97 qboolean infoValid; 98 99 char name[MAX_QPATH]; 100 team_t team; 101 102 int score; // updated by score servercmds 103 104 int handicap; 105 106 qhandle_t legsModel; 107 qhandle_t legsSkin; 108 109 qhandle_t torsoModel; 110 qhandle_t torsoSkin; 111 112 qhandle_t headModel; 113 qhandle_t headSkin; 114 115 int animFileIndex; 116 117 sfxHandle_t sounds[MAX_CUSTOM_SOUNDS]; 118 119 char *customBasicSoundDir; 120 char *customCombatSoundDir; 121 char *customExtraSoundDir; 122 char *customJediSoundDir; 123 124 sg_export(ojk::SavedGameHelper & saved_game)125 void sg_export( 126 ojk::SavedGameHelper& saved_game) const 127 { 128 saved_game.write<int32_t>(infoValid); 129 saved_game.write<int8_t>(name); 130 saved_game.write<int32_t>(team); 131 saved_game.write<int32_t>(score); 132 saved_game.write<int32_t>(handicap); 133 saved_game.write<int32_t>(legsModel); 134 saved_game.write<int32_t>(legsSkin); 135 saved_game.write<int32_t>(torsoModel); 136 saved_game.write<int32_t>(torsoSkin); 137 saved_game.write<int32_t>(headModel); 138 saved_game.write<int32_t>(headSkin); 139 saved_game.write<int32_t>(animFileIndex); 140 saved_game.write<int32_t>(sounds); 141 saved_game.write<int32_t>(customBasicSoundDir); 142 saved_game.write<int32_t>(customCombatSoundDir); 143 saved_game.write<int32_t>(customExtraSoundDir); 144 saved_game.write<int32_t>(customJediSoundDir); 145 } 146 sg_import(ojk::SavedGameHelper & saved_game)147 void sg_import( 148 ojk::SavedGameHelper& saved_game) 149 { 150 saved_game.read<int32_t>(infoValid); 151 saved_game.read<int8_t>(name); 152 saved_game.read<int32_t>(team); 153 saved_game.read<int32_t>(score); 154 saved_game.read<int32_t>(handicap); 155 saved_game.read<int32_t>(legsModel); 156 saved_game.read<int32_t>(legsSkin); 157 saved_game.read<int32_t>(torsoModel); 158 saved_game.read<int32_t>(torsoSkin); 159 saved_game.read<int32_t>(headModel); 160 saved_game.read<int32_t>(headSkin); 161 saved_game.read<int32_t>(animFileIndex); 162 saved_game.read<int32_t>(sounds); 163 saved_game.read<int32_t>(customBasicSoundDir); 164 saved_game.read<int32_t>(customCombatSoundDir); 165 saved_game.read<int32_t>(customExtraSoundDir); 166 saved_game.read<int32_t>(customJediSoundDir); 167 } 168 }; // clientInfo_t 169 170 171 //================================================================== 172 typedef enum 173 { 174 MOVER_POS1, 175 MOVER_POS2, 176 MOVER_1TO2, 177 MOVER_2TO1 178 } moverState_t; 179 180 // Rendering information structure 181 182 183 typedef enum 184 { 185 MODEL_LEGS = 0, 186 MODEL_TORSO, 187 MODEL_HEAD, 188 MODEL_WEAPON1, 189 MODEL_WEAPON2, 190 MODEL_WEAPON3, 191 MODEL_EXTRA1, 192 MODEL_EXTRA2, 193 NUM_TARGET_MODELS 194 } targetModel_t; 195 196 //renderFlags 197 #define RF_LOCKEDANGLE 1 198 199 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! 200 class renderInfo_t 201 { 202 public: 203 // Legs model, or full model on one piece entities 204 205 union 206 { 207 char legsModelName[32]; // -slc[] 208 char modelName[32]; // -slc[] 209 }; 210 211 char torsoModelName[32]; // -slc[] 212 char headModelName[32]; // -slc[] 213 214 //In whole degrees, How far to let the different model parts yaw and pitch 215 int headYawRangeLeft; 216 int headYawRangeRight; 217 int headPitchRangeUp; 218 int headPitchRangeDown; 219 220 int torsoYawRangeLeft; 221 int torsoYawRangeRight; 222 int torsoPitchRangeUp; 223 int torsoPitchRangeDown; 224 225 int legsFrame; 226 int torsoFrame; 227 228 float legsFpsMod; 229 float torsoFpsMod; 230 231 //Fields to apply to entire model set, individual model's equivalents will modify this value 232 byte customRGBA[4];//Red Green Blue, 0 = don't apply 233 234 //Allow up to 4 PCJ lookup values to be stored here. 235 //The resolve to configstrings which contain the name of the 236 //desired bone. 237 int boneIndex1; 238 int boneIndex2; 239 int boneIndex3; 240 int boneIndex4; 241 242 //packed with x, y, z orientations for bone angles 243 int boneOrient; 244 245 //I.. feel bad for doing this, but NPCs really just need to 246 //be able to control this sort of thing from the server sometimes. 247 //At least it's at the end so this stuff is never going to get sent 248 //over for anything that isn't an NPC. 249 vec3_t boneAngles1; //angles of boneIndex1 250 vec3_t boneAngles2; //angles of boneIndex2 251 vec3_t boneAngles3; //angles of boneIndex3 252 vec3_t boneAngles4; //angles of boneIndex4 253 254 //RF? 255 int renderFlags; 256 257 // 258 vec3_t muzzlePoint; 259 vec3_t muzzleDir; 260 vec3_t muzzlePointOld; 261 vec3_t muzzleDirOld; 262 //vec3_t muzzlePointNext; // Muzzle point one server frame in the future! 263 //vec3_t muzzleDirNext; 264 int mPCalcTime;//Last time muzzle point was calced 265 266 // 267 float lockYaw;// 268 269 // 270 vec3_t headPoint;//Where your tag_head is 271 vec3_t headAngles;//where the tag_head in the torso is pointing 272 vec3_t handRPoint;//where your right hand is 273 vec3_t handLPoint;//where your left hand is 274 vec3_t crotchPoint;//Where your crotch is 275 vec3_t footRPoint;//where your right hand is 276 vec3_t footLPoint;//where your left hand is 277 vec3_t torsoPoint;//Where your chest is 278 vec3_t torsoAngles;//Where the chest is pointing 279 vec3_t eyePoint;//Where your eyes are 280 vec3_t eyeAngles;//Where your eyes face 281 int lookTarget;//Which ent to look at with lookAngles 282 lookMode_t lookMode; 283 int lookTargetClearTime;//Time to clear the lookTarget 284 int lastVoiceVolume;//Last frame's voice volume 285 vec3_t lastHeadAngles;//Last headAngles, NOT actual facing of head model 286 vec3_t headBobAngles;//headAngle offsets 287 vec3_t targetHeadBobAngles;//head bob angles will try to get to targetHeadBobAngles 288 int lookingDebounceTime;//When we can stop using head looking angle behavior 289 float legsYaw;//yaw angle your legs are actually rendering at 290 291 sg_export(ojk::SavedGameHelper & saved_game)292 void sg_export( 293 ojk::SavedGameHelper& saved_game) const 294 { 295 saved_game.write<int8_t>(legsModelName); 296 saved_game.write<int8_t>(torsoModelName); 297 saved_game.write<int8_t>(headModelName); 298 saved_game.write<int32_t>(headYawRangeLeft); 299 saved_game.write<int32_t>(headYawRangeRight); 300 saved_game.write<int32_t>(headPitchRangeUp); 301 saved_game.write<int32_t>(headPitchRangeDown); 302 saved_game.write<int32_t>(torsoYawRangeLeft); 303 saved_game.write<int32_t>(torsoYawRangeRight); 304 saved_game.write<int32_t>(torsoPitchRangeUp); 305 saved_game.write<int32_t>(torsoPitchRangeDown); 306 saved_game.write<int32_t>(legsFrame); 307 saved_game.write<int32_t>(torsoFrame); 308 saved_game.write<float>(legsFpsMod); 309 saved_game.write<float>(torsoFpsMod); 310 saved_game.write<uint8_t>(customRGBA); 311 saved_game.write<int32_t>(boneIndex1); 312 saved_game.write<int32_t>(boneIndex2); 313 saved_game.write<int32_t>(boneIndex3); 314 saved_game.write<int32_t>(boneIndex4); 315 saved_game.write<int32_t>(boneOrient); 316 saved_game.write<float>(boneAngles1); 317 saved_game.write<float>(boneAngles2); 318 saved_game.write<float>(boneAngles3); 319 saved_game.write<float>(boneAngles4); 320 saved_game.write<int32_t>(renderFlags); 321 saved_game.write<float>(muzzlePoint); 322 saved_game.write<float>(muzzleDir); 323 saved_game.write<float>(muzzlePointOld); 324 saved_game.write<float>(muzzleDirOld); 325 saved_game.write<int32_t>(mPCalcTime); 326 saved_game.write<float>(lockYaw); 327 saved_game.write<float>(headPoint); 328 saved_game.write<float>(headAngles); 329 saved_game.write<float>(handRPoint); 330 saved_game.write<float>(handLPoint); 331 saved_game.write<float>(crotchPoint); 332 saved_game.write<float>(footRPoint); 333 saved_game.write<float>(footLPoint); 334 saved_game.write<float>(torsoPoint); 335 saved_game.write<float>(torsoAngles); 336 saved_game.write<float>(eyePoint); 337 saved_game.write<float>(eyeAngles); 338 saved_game.write<int32_t>(lookTarget); 339 saved_game.write<int32_t>(lookMode); 340 saved_game.write<int32_t>(lookTargetClearTime); 341 saved_game.write<int32_t>(lastVoiceVolume); 342 saved_game.write<float>(lastHeadAngles); 343 saved_game.write<float>(headBobAngles); 344 saved_game.write<float>(targetHeadBobAngles); 345 saved_game.write<int32_t>(lookingDebounceTime); 346 saved_game.write<float>(legsYaw); 347 } 348 sg_import(ojk::SavedGameHelper & saved_game)349 void sg_import( 350 ojk::SavedGameHelper& saved_game) 351 { 352 saved_game.read<int8_t>(legsModelName); 353 saved_game.read<int8_t>(torsoModelName); 354 saved_game.read<int8_t>(headModelName); 355 saved_game.read<int32_t>(headYawRangeLeft); 356 saved_game.read<int32_t>(headYawRangeRight); 357 saved_game.read<int32_t>(headPitchRangeUp); 358 saved_game.read<int32_t>(headPitchRangeDown); 359 saved_game.read<int32_t>(torsoYawRangeLeft); 360 saved_game.read<int32_t>(torsoYawRangeRight); 361 saved_game.read<int32_t>(torsoPitchRangeUp); 362 saved_game.read<int32_t>(torsoPitchRangeDown); 363 saved_game.read<int32_t>(legsFrame); 364 saved_game.read<int32_t>(torsoFrame); 365 saved_game.read<float>(legsFpsMod); 366 saved_game.read<float>(torsoFpsMod); 367 saved_game.read<uint8_t>(customRGBA); 368 saved_game.read<int32_t>(boneIndex1); 369 saved_game.read<int32_t>(boneIndex2); 370 saved_game.read<int32_t>(boneIndex3); 371 saved_game.read<int32_t>(boneIndex4); 372 saved_game.read<int32_t>(boneOrient); 373 saved_game.read<float>(boneAngles1); 374 saved_game.read<float>(boneAngles2); 375 saved_game.read<float>(boneAngles3); 376 saved_game.read<float>(boneAngles4); 377 saved_game.read<int32_t>(renderFlags); 378 saved_game.read<float>(muzzlePoint); 379 saved_game.read<float>(muzzleDir); 380 saved_game.read<float>(muzzlePointOld); 381 saved_game.read<float>(muzzleDirOld); 382 saved_game.read<int32_t>(mPCalcTime); 383 saved_game.read<float>(lockYaw); 384 saved_game.read<float>(headPoint); 385 saved_game.read<float>(headAngles); 386 saved_game.read<float>(handRPoint); 387 saved_game.read<float>(handLPoint); 388 saved_game.read<float>(crotchPoint); 389 saved_game.read<float>(footRPoint); 390 saved_game.read<float>(footLPoint); 391 saved_game.read<float>(torsoPoint); 392 saved_game.read<float>(torsoAngles); 393 saved_game.read<float>(eyePoint); 394 saved_game.read<float>(eyeAngles); 395 saved_game.read<int32_t>(lookTarget); 396 saved_game.read<int32_t>(lookMode); 397 saved_game.read<int32_t>(lookTargetClearTime); 398 saved_game.read<int32_t>(lastVoiceVolume); 399 saved_game.read<float>(lastHeadAngles); 400 saved_game.read<float>(headBobAngles); 401 saved_game.read<float>(targetHeadBobAngles); 402 saved_game.read<int32_t>(lookingDebounceTime); 403 saved_game.read<float>(legsYaw); 404 } 405 }; // renderInfo_t 406 407 // Movement information structure 408 409 /* 410 typedef struct moveInfo_s // !!!!!!!!!! LOADSAVE-affecting struct !!!!!!!! 411 { 412 vec3_t desiredAngles; // Desired facing angles 413 float speed; // Speed of movement 414 float aspeed; // Speed of angular movement 415 vec3_t moveDir; // Direction of movement 416 vec3_t velocity; // movement velocity 417 int flags; // Special state flags 418 } moveInfo_t; 419 */ 420 421 typedef enum { 422 CON_DISCONNECTED, 423 CON_CONNECTING, 424 CON_CONNECTED 425 } clientConnected_t; 426 427 typedef enum { 428 TEAM_BEGIN, // Beginning a team game, spawn at base 429 TEAM_ACTIVE // Now actively playing 430 } playerTeamStateState_t; 431 432 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! 433 class playerTeamState_t 434 { 435 public: 436 playerTeamStateState_t state; 437 438 int captures; 439 int basedefense; 440 int carrierdefense; 441 int flagrecovery; 442 int fragcarrier; 443 int assists; 444 445 float lasthurtcarrier; 446 float lastreturnedflag; 447 float flagsince; 448 float lastfraggedcarrier; 449 450 sg_export(ojk::SavedGameHelper & saved_game)451 void sg_export( 452 ojk::SavedGameHelper& saved_game) const 453 { 454 saved_game.write<int32_t>(state); 455 saved_game.write<int32_t>(captures); 456 saved_game.write<int32_t>(basedefense); 457 saved_game.write<int32_t>(carrierdefense); 458 saved_game.write<int32_t>(flagrecovery); 459 saved_game.write<int32_t>(fragcarrier); 460 saved_game.write<int32_t>(assists); 461 saved_game.write<float>(lasthurtcarrier); 462 saved_game.write<float>(lastreturnedflag); 463 saved_game.write<float>(flagsince); 464 saved_game.write<float>(lastfraggedcarrier); 465 } 466 sg_import(ojk::SavedGameHelper & saved_game)467 void sg_import( 468 ojk::SavedGameHelper& saved_game) 469 { 470 saved_game.read<int32_t>(state); 471 saved_game.read<int32_t>(captures); 472 saved_game.read<int32_t>(basedefense); 473 saved_game.read<int32_t>(carrierdefense); 474 saved_game.read<int32_t>(flagrecovery); 475 saved_game.read<int32_t>(fragcarrier); 476 saved_game.read<int32_t>(assists); 477 saved_game.read<float>(lasthurtcarrier); 478 saved_game.read<float>(lastreturnedflag); 479 saved_game.read<float>(flagsince); 480 saved_game.read<float>(lastfraggedcarrier); 481 } 482 }; // playerTeamState_t 483 484 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! 485 class objectives_t 486 { 487 public: 488 qboolean display; // A displayable objective? 489 int status; // Succeed or fail or pending 490 491 sg_export(ojk::SavedGameHelper & saved_game)492 void sg_export( 493 ojk::SavedGameHelper& saved_game) const 494 { 495 saved_game.write<int32_t>(display); 496 saved_game.write<int32_t>(status); 497 } 498 sg_import(ojk::SavedGameHelper & saved_game)499 void sg_import( 500 ojk::SavedGameHelper& saved_game) 501 { 502 saved_game.read<int32_t>(display); 503 saved_game.read<int32_t>(status); 504 } 505 }; // objectives_t 506 // NOTE: This is an arbitrary number greater than our current number of objectives with 507 // some fluff just in case we add more in the future. 508 #define MAX_MISSION_OBJ 100 509 510 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! 511 class missionStats_t 512 { 513 public: 514 int secretsFound; // # of secret areas found 515 int totalSecrets; // # of secret areas that could have been found 516 int shotsFired; // total number of shots fired 517 int hits; // Shots that did damage 518 int enemiesSpawned; // # of enemies spawned 519 int enemiesKilled; // # of enemies killed 520 int saberThrownCnt; // # of times saber was thrown 521 int saberBlocksCnt; // # of times saber was used to block 522 int legAttacksCnt; // # of times legs were hit with saber 523 int armAttacksCnt; // # of times arm were hit with saber 524 int torsoAttacksCnt; // # of times torso was hit with saber 525 int otherAttacksCnt; // # of times anything else on a monster was hit with saber 526 int forceUsed[NUM_FORCE_POWERS]; // # of times each force power was used 527 int weaponUsed[WP_NUM_WEAPONS]; // # of times each weapon was used 528 529 sg_export(ojk::SavedGameHelper & saved_game)530 void sg_export( 531 ojk::SavedGameHelper& saved_game) const 532 { 533 saved_game.write<int32_t>(secretsFound); 534 saved_game.write<int32_t>(totalSecrets); 535 saved_game.write<int32_t>(shotsFired); 536 saved_game.write<int32_t>(hits); 537 saved_game.write<int32_t>(enemiesSpawned); 538 saved_game.write<int32_t>(enemiesKilled); 539 saved_game.write<int32_t>(saberThrownCnt); 540 saved_game.write<int32_t>(saberBlocksCnt); 541 saved_game.write<int32_t>(legAttacksCnt); 542 saved_game.write<int32_t>(armAttacksCnt); 543 saved_game.write<int32_t>(torsoAttacksCnt); 544 saved_game.write<int32_t>(otherAttacksCnt); 545 saved_game.write<int32_t>(forceUsed); 546 saved_game.write<int32_t>(weaponUsed); 547 } 548 sg_import(ojk::SavedGameHelper & saved_game)549 void sg_import( 550 ojk::SavedGameHelper& saved_game) 551 { 552 saved_game.read<int32_t>(secretsFound); 553 saved_game.read<int32_t>(totalSecrets); 554 saved_game.read<int32_t>(shotsFired); 555 saved_game.read<int32_t>(hits); 556 saved_game.read<int32_t>(enemiesSpawned); 557 saved_game.read<int32_t>(enemiesKilled); 558 saved_game.read<int32_t>(saberThrownCnt); 559 saved_game.read<int32_t>(saberBlocksCnt); 560 saved_game.read<int32_t>(legAttacksCnt); 561 saved_game.read<int32_t>(armAttacksCnt); 562 saved_game.read<int32_t>(torsoAttacksCnt); 563 saved_game.read<int32_t>(otherAttacksCnt); 564 saved_game.read<int32_t>(forceUsed); 565 saved_game.read<int32_t>(weaponUsed); 566 } 567 }; // missionStats_t 568 569 // the auto following clients don't follow a specific client 570 // number, but instead follow the first two active players 571 #define FOLLOW_ACTIVE1 -1 572 #define FOLLOW_ACTIVE2 -2 573 574 // client data that stays across multiple levels or tournament restarts 575 // this is achieved by writing all the data to cvar strings at game shutdown 576 // time and reading them back at connection time. Anything added here 577 // MUST be dealt with in G_InitSessionData() / G_ReadSessionData() / G_WriteSessionData() 578 // 579 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! 580 class clientSession_t 581 { 582 public: 583 int missionObjectivesShown; // Number of times mission objectives have been updated 584 team_t sessionTeam; 585 objectives_t mission_objectives[MAX_MISSION_OBJ]; 586 missionStats_t missionStats; // Various totals while on a mission 587 588 sg_export(ojk::SavedGameHelper & saved_game)589 void sg_export( 590 ojk::SavedGameHelper& saved_game) const 591 { 592 saved_game.write<int32_t>(missionObjectivesShown); 593 saved_game.write<int32_t>(sessionTeam); 594 saved_game.write<>(mission_objectives); 595 saved_game.write<>(missionStats); 596 } 597 sg_import(ojk::SavedGameHelper & saved_game)598 void sg_import( 599 ojk::SavedGameHelper& saved_game) 600 { 601 saved_game.read<int32_t>(missionObjectivesShown); 602 saved_game.read<int32_t>(sessionTeam); 603 saved_game.read<>(mission_objectives); 604 saved_game.read<>(missionStats); 605 } 606 }; // clientSession_t 607 608 // client data that stays across multiple respawns, but is cleared 609 // on each level change or team change at ClientBegin() 610 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! 611 class clientPersistant_t 612 { 613 public: 614 clientConnected_t connected; 615 usercmd_t lastCommand; 616 char netname[34]; 617 int maxHealth; // for handicapping 618 int enterTime; // level.time the client entered the game 619 short cmd_angles[3]; // angles sent over in the last command 620 621 playerTeamState_t teamState; // status in teamplay games 622 623 sg_export(ojk::SavedGameHelper & saved_game)624 void sg_export( 625 ojk::SavedGameHelper& saved_game) const 626 { 627 saved_game.write<int32_t>(connected); 628 saved_game.write<>(lastCommand); 629 saved_game.write<int8_t>(netname); 630 saved_game.skip(2); 631 saved_game.write<int32_t>(maxHealth); 632 saved_game.write<int32_t>(enterTime); 633 saved_game.write<int16_t>(cmd_angles); 634 saved_game.skip(2); 635 saved_game.write<>(teamState); 636 } 637 sg_import(ojk::SavedGameHelper & saved_game)638 void sg_import( 639 ojk::SavedGameHelper& saved_game) 640 { 641 saved_game.read<int32_t>(connected); 642 saved_game.read<>(lastCommand); 643 saved_game.read<int8_t>(netname); 644 saved_game.skip(2); 645 saved_game.read<int32_t>(maxHealth); 646 saved_game.read<int32_t>(enterTime); 647 saved_game.read<int16_t>(cmd_angles); 648 saved_game.skip(2); 649 saved_game.read<>(teamState); 650 } 651 }; // clientPersistant_t 652 653 typedef enum { 654 BLK_NO, 655 BLK_TIGHT, // Block only attacks and shots around the saber itself, a bbox of around 12x12x12 656 BLK_WIDE // Block all attacks in an area around the player in a rough arc of 180 degrees 657 } saberBlockType_t; 658 659 typedef enum { 660 BLOCKED_NONE, 661 BLOCKED_PARRY_BROKEN, 662 BLOCKED_ATK_BOUNCE, 663 BLOCKED_UPPER_RIGHT, 664 BLOCKED_UPPER_LEFT, 665 BLOCKED_LOWER_RIGHT, 666 BLOCKED_LOWER_LEFT, 667 BLOCKED_TOP, 668 BLOCKED_UPPER_RIGHT_PROJ, 669 BLOCKED_UPPER_LEFT_PROJ, 670 BLOCKED_LOWER_RIGHT_PROJ, 671 BLOCKED_LOWER_LEFT_PROJ, 672 BLOCKED_TOP_PROJ 673 } saberBlockedType_t; 674 675 typedef enum //# movetype_e 676 { 677 MT_STATIC = 0, 678 MT_WALK, 679 MT_RUNJUMP, 680 MT_FLYSWIM, 681 NUM_MOVETYPES 682 } movetype_t; 683 684 // !!!!!!!!!! LOADSAVE-affecting structure !!!!!!!!!! 685 686 // this structure is cleared on each ClientSpawn(), 687 // except for 'client->pers' and 'client->sess' 688 template<typename TSaberInfo> 689 class GClientBase 690 { 691 public: 692 // ps MUST be the first element, because the server expects it 693 PlayerStateBase<TSaberInfo> ps; // communicated by server to clients 694 695 // private to game 696 clientPersistant_t pers; 697 clientSession_t sess; 698 699 int lastCmdTime; // level.time of last usercmd_t, for EF_CONNECTION 700 701 usercmd_t usercmd; // most recent usercmd 702 703 int buttons; 704 int oldbuttons; 705 int latched_buttons; 706 707 // sum up damage over an entire frame, so 708 // shotgun blasts give a single big kick 709 int damage_armor; // damage absorbed by armor 710 int damage_blood; // damage taken out of health 711 vec3_t damage_from; // origin for vector calculation 712 bool damage_fromWorld; // if true, don't use the damage_from vector 713 bool noclip; 714 //icarus forced moving. is this still used? 715 signed char forced_forwardmove; 716 signed char forced_rightmove; 717 718 // timers 719 int respawnTime; // can respawn when time > this, force after g_forcerespwan 720 int idleTime; // for playing idleAnims 721 722 int airOutTime; 723 724 // timeResidual is used to handle events that happen every second 725 // like health / armor countdowns and regeneration 726 int timeResidual; 727 728 // Facial Expression Timers 729 730 float facial_blink; // time before next blink. If a minus value, we are in blink mode 731 float facial_timer; // time before next alert, frown or smile. If a minus value, we are in anim mode 732 int facial_anim; // anim to show in anim mode 733 734 //Client info - updated when ClientInfoChanged is called, instead of using configstrings 735 clientInfo_t clientInfo; 736 movetype_t moveType; 737 int jetPackTime; 738 int fireDelay; //msec to delay calling G_FireWeapon after EV_FIREWEAPON event is called 739 740 // The time at which a breath should be triggered. -Aurelio 741 int breathPuffTime; 742 743 //Used to be in gentity_t, now here.. mostly formation stuff 744 team_t playerTeam; 745 team_t enemyTeam; 746 gentity_t *leader; 747 class_t NPC_class; 748 749 //FIXME: could combine these 750 float hiddenDist;//How close ents have to be to pick you up as an enemy 751 vec3_t hiddenDir;//Normalized direction in which NPCs can't see you (you are hidden) 752 753 renderInfo_t renderInfo; 754 755 //dismember tracker 756 bool dismembered; 757 char dismemberProbLegs; // probability of the legs being dismembered (located in NPC.cfg, 0 = never, 100 = always) 758 char dismemberProbHead; // probability of the head being dismembered (located in NPC.cfg, 0 = never, 100 = always) 759 char dismemberProbArms; // probability of the arms being dismembered (located in NPC.cfg, 0 = never, 100 = always) 760 char dismemberProbHands; // probability of the hands being dismembered (located in NPC.cfg, 0 = never, 100 = always) 761 char dismemberProbWaist; // probability of the waist being dismembered (located in NPC.cfg, 0 = never, 100 = always) 762 763 int standheight; 764 int crouchheight; 765 int poisonDamage; // Amount of poison damage to be given 766 int poisonTime; // When to apply poison damage 767 int slopeRecalcTime; // debouncer for slope-foot-height-diff calcing 768 769 vec3_t pushVec; 770 int pushVecTime; 771 772 int noRagTime; //don't do ragdoll stuff if > level.time 773 qboolean isRagging; 774 int overridingBones; //dragging body or doing something else to override one or more ragdoll effector's/pcj's 775 776 vec3_t ragLastOrigin; //keeping track of positions between rags while dragging corpses 777 int ragLastOriginTime; 778 779 //push refraction effect vars 780 int pushEffectFadeTime; 781 vec3_t pushEffectOrigin; 782 783 //Rocket locking vars for non-player clients (only Vehicles use these right now...) 784 int rocketLockIndex; 785 float rocketLastValidTime; 786 float rocketLockTime; 787 float rocketTargetTime; 788 789 //for trigger_space brushes 790 int inSpaceSuffocation; 791 int inSpaceIndex; 792 793 sg_export(ojk::SavedGameHelper & saved_game)794 void sg_export( 795 ojk::SavedGameHelper& saved_game) const 796 { 797 saved_game.write<>(ps); 798 saved_game.write<>(pers); 799 saved_game.write<>(sess); 800 saved_game.write<int32_t>(lastCmdTime); 801 saved_game.write<>(usercmd); 802 saved_game.write<int32_t>(buttons); 803 saved_game.write<int32_t>(oldbuttons); 804 saved_game.write<int32_t>(latched_buttons); 805 saved_game.write<int32_t>(damage_armor); 806 saved_game.write<int32_t>(damage_blood); 807 saved_game.write<float>(damage_from); 808 saved_game.write<int8_t>(damage_fromWorld); 809 saved_game.write<int8_t>(noclip); 810 saved_game.write<int8_t>(forced_forwardmove); 811 saved_game.write<int8_t>(forced_rightmove); 812 saved_game.write<int32_t>(respawnTime); 813 saved_game.write<int32_t>(idleTime); 814 saved_game.write<int32_t>(airOutTime); 815 saved_game.write<int32_t>(timeResidual); 816 saved_game.write<float>(facial_blink); 817 saved_game.write<float>(facial_timer); 818 saved_game.write<int32_t>(facial_anim); 819 saved_game.write<>(clientInfo); 820 saved_game.write<int32_t>(moveType); 821 saved_game.write<int32_t>(jetPackTime); 822 saved_game.write<int32_t>(fireDelay); 823 saved_game.write<int32_t>(breathPuffTime); 824 saved_game.write<int32_t>(playerTeam); 825 saved_game.write<int32_t>(enemyTeam); 826 saved_game.write<int32_t>(leader); 827 saved_game.write<int32_t>(NPC_class); 828 saved_game.write<float>(hiddenDist); 829 saved_game.write<float>(hiddenDir); 830 saved_game.write<>(renderInfo); 831 saved_game.write<int8_t>(dismembered); 832 saved_game.write<int8_t>(dismemberProbLegs); 833 saved_game.write<int8_t>(dismemberProbHead); 834 saved_game.write<int8_t>(dismemberProbArms); 835 saved_game.write<int8_t>(dismemberProbHands); 836 saved_game.write<int8_t>(dismemberProbWaist); 837 saved_game.skip(2); 838 saved_game.write<int32_t>(standheight); 839 saved_game.write<int32_t>(crouchheight); 840 saved_game.write<int32_t>(poisonDamage); 841 saved_game.write<int32_t>(poisonTime); 842 saved_game.write<int32_t>(slopeRecalcTime); 843 saved_game.write<float>(pushVec); 844 saved_game.write<int32_t>(pushVecTime); 845 saved_game.write<int32_t>(noRagTime); 846 saved_game.write<int32_t>(isRagging); 847 saved_game.write<int32_t>(overridingBones); 848 saved_game.write<float>(ragLastOrigin); 849 saved_game.write<int32_t>(ragLastOriginTime); 850 saved_game.write<int32_t>(pushEffectFadeTime); 851 saved_game.write<float>(pushEffectOrigin); 852 saved_game.write<int32_t>(rocketLockIndex); 853 saved_game.write<float>(rocketLastValidTime); 854 saved_game.write<float>(rocketLockTime); 855 saved_game.write<float>(rocketTargetTime); 856 saved_game.write<int32_t>(inSpaceSuffocation); 857 saved_game.write<int32_t>(inSpaceIndex); 858 } 859 sg_import(ojk::SavedGameHelper & saved_game)860 void sg_import( 861 ojk::SavedGameHelper& saved_game) 862 { 863 saved_game.read<>(ps); 864 saved_game.read<>(pers); 865 saved_game.read<>(sess); 866 saved_game.read<int32_t>(lastCmdTime); 867 saved_game.read<>(usercmd); 868 saved_game.read<int32_t>(buttons); 869 saved_game.read<int32_t>(oldbuttons); 870 saved_game.read<int32_t>(latched_buttons); 871 saved_game.read<int32_t>(damage_armor); 872 saved_game.read<int32_t>(damage_blood); 873 saved_game.read<float>(damage_from); 874 saved_game.read<int8_t>(damage_fromWorld); 875 saved_game.read<int8_t>(noclip); 876 saved_game.read<int8_t>(forced_forwardmove); 877 saved_game.read<int8_t>(forced_rightmove); 878 saved_game.read<int32_t>(respawnTime); 879 saved_game.read<int32_t>(idleTime); 880 saved_game.read<int32_t>(airOutTime); 881 saved_game.read<int32_t>(timeResidual); 882 saved_game.read<float>(facial_blink); 883 saved_game.read<float>(facial_timer); 884 saved_game.read<int32_t>(facial_anim); 885 saved_game.read<>(clientInfo); 886 saved_game.read<int32_t>(moveType); 887 saved_game.read<int32_t>(jetPackTime); 888 saved_game.read<int32_t>(fireDelay); 889 saved_game.read<int32_t>(breathPuffTime); 890 saved_game.read<int32_t>(playerTeam); 891 saved_game.read<int32_t>(enemyTeam); 892 saved_game.read<int32_t>(leader); 893 saved_game.read<int32_t>(NPC_class); 894 saved_game.read<float>(hiddenDist); 895 saved_game.read<float>(hiddenDir); 896 saved_game.read<>(renderInfo); 897 saved_game.read<int8_t>(dismembered); 898 saved_game.read<int8_t>(dismemberProbLegs); 899 saved_game.read<int8_t>(dismemberProbHead); 900 saved_game.read<int8_t>(dismemberProbArms); 901 saved_game.read<int8_t>(dismemberProbHands); 902 saved_game.read<int8_t>(dismemberProbWaist); 903 saved_game.skip(2); 904 saved_game.read<int32_t>(standheight); 905 saved_game.read<int32_t>(crouchheight); 906 saved_game.read<int32_t>(poisonDamage); 907 saved_game.read<int32_t>(poisonTime); 908 saved_game.read<int32_t>(slopeRecalcTime); 909 saved_game.read<float>(pushVec); 910 saved_game.read<int32_t>(pushVecTime); 911 saved_game.read<int32_t>(noRagTime); 912 saved_game.read<int32_t>(isRagging); 913 saved_game.read<int32_t>(overridingBones); 914 saved_game.read<float>(ragLastOrigin); 915 saved_game.read<int32_t>(ragLastOriginTime); 916 saved_game.read<int32_t>(pushEffectFadeTime); 917 saved_game.read<float>(pushEffectOrigin); 918 saved_game.read<int32_t>(rocketLockIndex); 919 saved_game.read<float>(rocketLastValidTime); 920 saved_game.read<float>(rocketLockTime); 921 saved_game.read<float>(rocketTargetTime); 922 saved_game.read<int32_t>(inSpaceSuffocation); 923 saved_game.read<int32_t>(inSpaceIndex); 924 } 925 }; // GClientBase 926 927 928 using gclient_t = GClientBase<saberInfo_t>; 929 using RetailGClient = GClientBase<saberInfoRetail_t>; 930 931 932 #define MAX_PARMS 16 933 #define MAX_PARM_STRING_LENGTH MAX_QPATH//was 16, had to lengthen it so they could take a valid file path 934 935 class parms_t 936 { 937 public: 938 char parm[MAX_PARMS][MAX_PARM_STRING_LENGTH]; 939 940 sg_export(ojk::SavedGameHelper & saved_game)941 void sg_export( 942 ojk::SavedGameHelper& saved_game) const 943 { 944 saved_game.write<int8_t>(parm); 945 } 946 sg_import(ojk::SavedGameHelper & saved_game)947 void sg_import( 948 ojk::SavedGameHelper& saved_game) 949 { 950 saved_game.read<int8_t>(parm); 951 } 952 }; // parms_t 953 954 #ifdef GAME_INCLUDE 955 //these hold the place for the enums in functions.h so i don't have to recompile everytime it changes 956 #define thinkFunc_t int 957 #define clThinkFunc_t int 958 #define reachedFunc_t int 959 #define blockedFunc_t int 960 #define touchFunc_t int 961 #define useFunc_t int 962 #define painFunc_t int 963 #define dieFunc_t int 964 965 #define MAX_FAILED_NODES 8 966 #define MAX_INHAND_WEAPONS 2 967 968 969 typedef struct centity_s centity_t; 970 // !!!!!!!!!!! LOADSAVE-affecting struct !!!!!!!!!!!!! 971 struct gentity_s { 972 entityState_t s; // communicated by server to clients 973 gclient_t *client; // NULL if not a player (unless it's NPC ( if (this->NPC != NULL) ) <sigh>... -slc) 974 qboolean inuse; 975 qboolean linked; // qfalse if not in any good cluster 976 977 int svFlags; // SVF_NOCLIENT, SVF_BROADCAST, etc 978 979 qboolean bmodel; // if false, assume an explicit mins / maxs bounding box 980 // only set by gi.SetBrushModel 981 vec3_t mins, maxs; 982 int contents; // CONTENTS_TRIGGER, CONTENTS_SOLID, CONTENTS_BODY, etc 983 // a non-solid entity should set to 0 984 985 vec3_t absmin, absmax; // derived from mins/maxs and origin + rotation 986 987 // currentOrigin will be used for all collision detection and world linking. 988 // it will not necessarily be the same as the trajectory evaluation for the current 989 // time, because each entity must be moved one at a time after time is advanced 990 // to avoid simultanious collision issues 991 vec3_t currentOrigin; 992 vec3_t currentAngles; 993 994 gentity_t *owner; // objects never interact with their owners, to 995 // prevent player missiles from immediately 996 // colliding with their owner 997 /* 998 Ghoul2 Insert Start 999 */ 1000 // this marker thing of Jake's is used for memcpy() length calcs, so don't put any ordinary fields (like above) 1001 // below this point or they won't work, and will mess up all sorts of stuff. 1002 // 1003 CGhoul2Info_v ghoul2; 1004 1005 vec3_t modelScale; //needed for g2 collision 1006 /* 1007 Ghoul2 Insert End 1008 */ 1009 1010 // DO NOT MODIFY ANYTHING ABOVE THIS, THE SERVER 1011 // EXPECTS THE FIELDS IN THAT ORDER! 1012 1013 //========================================================================================== 1014 1015 //Essential entity fields 1016 // note: all the char* fields from here on should be left as ptrs, not declared, because of the way that ent-parsing 1017 // works by forcing field offset ptrs as char* and using G_NewString()!! (see G_ParseField() in gmae/g_spawn.cpp -slc 1018 // 1019 char *classname; // set in QuakeEd 1020 int spawnflags; // set in QuakeEd 1021 1022 int flags; // FL_* variables 1023 1024 char *model; // Normal model, or legs model on tri-models 1025 char *model2; // Torso model 1026 1027 int freetime; // sv.time when the object was freed 1028 1029 int eventTime; // events will be cleared EVENT_VALID_MSEC after set 1030 qboolean freeAfterEvent; 1031 // qboolean unlinkAfterEvent; 1032 1033 //Physics and movement fields 1034 float physicsBounce; // 1.0 = continuous bounce, 0.0 = no bounce 1035 int clipmask; // brushes with this content value will be collided against 1036 // when moving. items and corpses do not collide against 1037 // players, for instance 1038 // moveInfo_t moveInfo; //FIXME: use this more? 1039 float speed; 1040 float resultspeed; 1041 int lastMoveTime; 1042 vec3_t movedir; 1043 vec3_t lastOrigin; //Where you were last frame 1044 vec3_t lastAngles; //Where you were looking last frame 1045 float mass; //How heavy you are 1046 int lastImpact; //Last time you impacted something 1047 1048 //Variables reflecting environment 1049 int watertype; 1050 int waterlevel; 1051 short wupdate; 1052 short prev_waterlevel; 1053 1054 //Targeting/linking fields 1055 float angle; // set in editor, -1 = up, -2 = down 1056 char *target; 1057 char *target2; //For multiple targets, not used for firing/triggering/using, though, only for path branches 1058 char *target3; //For multiple targets, not used for firing/triggering/using, though, only for path branches 1059 char *target4; //For multiple targets, not used for firing/triggering/using, though, only for path branches 1060 char *targetJump; 1061 char *targetname; 1062 char *team; 1063 1064 union 1065 { 1066 char *roff; // the roff file to use, if there is one 1067 char *fxFile; // name of the external effect file 1068 }; 1069 1070 int roff_ctr; // current roff frame we are playing 1071 1072 int next_roff_time; 1073 int fx_time; // timer for beam in/out effects. 1074 1075 //Think Functions 1076 int nextthink;//Used to determine if it's time to call e_ThinkFunc again 1077 thinkFunc_t e_ThinkFunc;//Called once every game frame for every ent 1078 clThinkFunc_t e_clThinkFunc;//Think func for equivalent centity 1079 reachedFunc_t e_ReachedFunc;// movers call this when hitting endpoint 1080 blockedFunc_t e_BlockedFunc; 1081 touchFunc_t e_TouchFunc; 1082 useFunc_t e_UseFunc; //Called by G_UseTargets 1083 painFunc_t e_PainFunc; //Called by G_Damage when damage is taken 1084 dieFunc_t e_DieFunc; //Called by G_Damage when health reaches <= 0 1085 1086 //Health and damage fields 1087 int health; 1088 int max_health; 1089 qboolean takedamage; 1090 material_t material; 1091 int damage; 1092 int dflags; 1093 //explosives, breakable brushes 1094 int splashDamage; // quad will increase this without increasing radius 1095 int splashRadius; 1096 int methodOfDeath; 1097 int splashMethodOfDeath; 1098 //int hitLoc;//where you were last hit 1099 int locationDamage[HL_MAX]; // Damage accumulated on different body locations 1100 1101 //Entity pointers 1102 gentity_t *chain; 1103 gentity_t *enemy; 1104 gentity_t *activator; 1105 gentity_t *teamchain; // next entity in team 1106 gentity_t *teammaster; // master of the team 1107 gentity_t *lastEnemy; 1108 1109 //Timing variables, counters and debounce times 1110 float wait; 1111 float random; 1112 int delay; 1113 qboolean alt_fire; 1114 int count; 1115 int bounceCount; 1116 int fly_sound_debounce_time; // wind tunnel 1117 int painDebounceTime; 1118 int disconnectDebounceTime; 1119 int attackDebounceTime; 1120 int pushDebounceTime; 1121 int aimDebounceTime; 1122 int useDebounceTime; 1123 1124 //Unions for miscellaneous fields used under very specific circumstances 1125 union 1126 { 1127 qboolean trigger_formation; 1128 qboolean misc_dlight_active; 1129 qboolean has_bounced; // for thermal Det. we force at least one bounce to happen before it can do proximity checks 1130 }; 1131 1132 //Navigation 1133 int spawnContents; // store contents of ents on spawn so nav system can restore them 1134 int waypoint; //Set once per frame, if you've moved, and if someone asks 1135 int wayedge; //Used by doors and breakable things to know what edge goes through them 1136 int lastWaypoint; //To make sure you don't double-back 1137 int lastInAirTime; 1138 int noWaypointTime; //Debouncer - so don't keep checking every waypoint in existance every frame that you can't find one 1139 int combatPoint; 1140 vec3_t followPos; 1141 int followPosRecalcTime; 1142 int followPosWaypoint; 1143 1144 //Animation 1145 qboolean loopAnim; 1146 int startFrame; 1147 int endFrame; 1148 1149 //Script/ICARUS-related fields 1150 int m_iIcarusID; 1151 int taskID[NUM_TIDS]; 1152 parms_t *parms; 1153 char *behaviorSet[NUM_BSETS]; 1154 char *script_targetname; 1155 int delayScriptTime; 1156 1157 // Ambient sound info 1158 char *soundSet; //Only used for local sets 1159 int setTime; 1160 1161 //Used by cameras to locate subjects 1162 char *cameraGroup; 1163 1164 //For damage 1165 team_t noDamageTeam; 1166 1167 // Ghoul2 Animation info 1168 short playerModel; 1169 short weaponModel[MAX_INHAND_WEAPONS]; 1170 short handRBolt; 1171 short handLBolt; 1172 short headBolt; 1173 short cervicalBolt; 1174 short chestBolt; 1175 short gutBolt; 1176 short torsoBolt; 1177 short crotchBolt; 1178 short motionBolt; 1179 short kneeLBolt; 1180 short kneeRBolt; 1181 short elbowLBolt; 1182 short elbowRBolt; 1183 short footLBolt; 1184 short footRBolt; 1185 short faceBone; 1186 short craniumBone; 1187 short cervicalBone; 1188 short thoracicBone; 1189 short upperLumbarBone; 1190 short lowerLumbarBone; 1191 short hipsBone; 1192 short motionBone; 1193 short rootBone; 1194 short footLBone; 1195 short footRBone; 1196 short humerusRBone; 1197 1198 short genericBone1; // For bones special to an entity 1199 short genericBone2; 1200 short genericBone3; 1201 1202 short genericBolt1; // For bolts special to an entity 1203 short genericBolt2; 1204 short genericBolt3; 1205 short genericBolt4; 1206 short genericBolt5; 1207 1208 qhandle_t cinematicModel; 1209 1210 //========================================================================================== 1211 1212 //FIELDS USED EXCLUSIVELY BY SPECIFIC CLASSES OF ENTITIES 1213 // Vehicle information. 1214 // The vehicle object. 1215 Vehicle_t *m_pVehicle; 1216 1217 //NPC/Player entity fields 1218 //FIXME: Make these client only? 1219 gNPC_t *NPC;//Only allocated if the entity becomes an NPC 1220 1221 //Other NPC/Player-related entity fields 1222 char *ownername;//Used by squadpaths to locate owning NPC 1223 1224 //FIXME: Only used by NPCs, move it to gNPC_t 1225 int cantHitEnemyCounter;//HACK - Makes them look for another enemy on the same team if the one they're after can't be hit 1226 1227 //Only used by NPC_spawners 1228 char *NPC_type; 1229 char *NPC_targetname; 1230 char *NPC_target; 1231 1232 //Variables used by movers (most likely exclusively by them) 1233 moverState_t moverState; 1234 int soundPos1; 1235 int sound1to2; 1236 int sound2to1; 1237 int soundPos2; 1238 int soundLoop; 1239 gentity_t *nextTrain; 1240 gentity_t *prevTrain; 1241 vec3_t pos1, pos2; 1242 vec3_t pos3; 1243 int sounds; 1244 char *closetarget; 1245 char *opentarget; 1246 char *paintarget; 1247 int lockCount; //for maglocks- actually get put on the trigger for the door 1248 1249 //Variables used only by waypoints (for the most part) 1250 float radius; 1251 1252 union 1253 { 1254 int wpIndex; 1255 int fxID; // id of the external effect file 1256 }; 1257 1258 int noise_index; 1259 1260 vec4_t startRGBA; 1261 1262 union 1263 { 1264 vec4_t finalRGBA; 1265 vec3_t pos4; 1266 vec3_t modelAngles; //for brush entities with an attached md3 model, as an offset to the brush's angles 1267 }; 1268 1269 //FIXME: Are these being used anymore? 1270 gitem_t *item; // for bonus items - 1271 char *message; //Used by triggers to print a message when activated 1272 1273 float lightLevel; 1274 1275 //FIXME: can these be removed/condensed/absorbed? 1276 //Rendering info 1277 //int color; 1278 1279 //Force effects 1280 int forcePushTime; 1281 int forcePuller; //who force-pulled me (so we don't damage them if we hit them) 1282 1283 sg_exportgentity_s1284 void sg_export( 1285 ojk::SavedGameHelper& saved_game) const 1286 { 1287 saved_game.write<>(s); 1288 saved_game.write<int32_t>(client); 1289 saved_game.write<int32_t>(inuse); 1290 saved_game.write<int32_t>(linked); 1291 saved_game.write<int32_t>(svFlags); 1292 saved_game.write<int32_t>(bmodel); 1293 saved_game.write<float>(mins); 1294 saved_game.write<float>(maxs); 1295 saved_game.write<int32_t>(contents); 1296 saved_game.write<float>(absmin); 1297 saved_game.write<float>(absmax); 1298 saved_game.write<float>(currentOrigin); 1299 saved_game.write<float>(currentAngles); 1300 saved_game.write<int32_t>(owner); 1301 saved_game.write<>(ghoul2); 1302 saved_game.write<float>(modelScale); 1303 saved_game.write<int32_t>(classname); 1304 saved_game.write<int32_t>(spawnflags); 1305 saved_game.write<int32_t>(flags); 1306 saved_game.write<int32_t>(model); 1307 saved_game.write<int32_t>(model2); 1308 saved_game.write<int32_t>(freetime); 1309 saved_game.write<int32_t>(eventTime); 1310 saved_game.write<int32_t>(freeAfterEvent); 1311 saved_game.write<float>(physicsBounce); 1312 saved_game.write<int32_t>(clipmask); 1313 saved_game.write<float>(speed); 1314 saved_game.write<float>(resultspeed); 1315 saved_game.write<int32_t>(lastMoveTime); 1316 saved_game.write<float>(movedir); 1317 saved_game.write<float>(lastOrigin); 1318 saved_game.write<float>(lastAngles); 1319 saved_game.write<float>(mass); 1320 saved_game.write<int32_t>(lastImpact); 1321 saved_game.write<int32_t>(watertype); 1322 saved_game.write<int32_t>(waterlevel); 1323 saved_game.write<int16_t>(wupdate); 1324 saved_game.write<int16_t>(prev_waterlevel); 1325 saved_game.write<float>(angle); 1326 saved_game.write<int32_t>(target); 1327 saved_game.write<int32_t>(target2); 1328 saved_game.write<int32_t>(target3); 1329 saved_game.write<int32_t>(target4); 1330 saved_game.write<int32_t>(targetJump); 1331 saved_game.write<int32_t>(targetname); 1332 saved_game.write<int32_t>(team); 1333 saved_game.write<int32_t>(roff); 1334 saved_game.write<int32_t>(roff_ctr); 1335 saved_game.write<int32_t>(next_roff_time); 1336 saved_game.write<int32_t>(fx_time); 1337 saved_game.write<int32_t>(nextthink); 1338 saved_game.write<int32_t>(e_ThinkFunc); 1339 saved_game.write<int32_t>(e_clThinkFunc); 1340 saved_game.write<int32_t>(e_ReachedFunc); 1341 saved_game.write<int32_t>(e_BlockedFunc); 1342 saved_game.write<int32_t>(e_TouchFunc); 1343 saved_game.write<int32_t>(e_UseFunc); 1344 saved_game.write<int32_t>(e_PainFunc); 1345 saved_game.write<int32_t>(e_DieFunc); 1346 saved_game.write<int32_t>(health); 1347 saved_game.write<int32_t>(max_health); 1348 saved_game.write<int32_t>(takedamage); 1349 saved_game.write<int32_t>(material); 1350 saved_game.write<int32_t>(damage); 1351 saved_game.write<int32_t>(dflags); 1352 saved_game.write<int32_t>(splashDamage); 1353 saved_game.write<int32_t>(splashRadius); 1354 saved_game.write<int32_t>(methodOfDeath); 1355 saved_game.write<int32_t>(splashMethodOfDeath); 1356 saved_game.write<int32_t>(locationDamage); 1357 saved_game.write<int32_t>(chain); 1358 saved_game.write<int32_t>(enemy); 1359 saved_game.write<int32_t>(activator); 1360 saved_game.write<int32_t>(teamchain); 1361 saved_game.write<int32_t>(teammaster); 1362 saved_game.write<int32_t>(lastEnemy); 1363 saved_game.write<float>(wait); 1364 saved_game.write<float>(random); 1365 saved_game.write<int32_t>(delay); 1366 saved_game.write<int32_t>(alt_fire); 1367 saved_game.write<int32_t>(count); 1368 saved_game.write<int32_t>(bounceCount); 1369 saved_game.write<int32_t>(fly_sound_debounce_time); 1370 saved_game.write<int32_t>(painDebounceTime); 1371 saved_game.write<int32_t>(disconnectDebounceTime); 1372 saved_game.write<int32_t>(attackDebounceTime); 1373 saved_game.write<int32_t>(pushDebounceTime); 1374 saved_game.write<int32_t>(aimDebounceTime); 1375 saved_game.write<int32_t>(useDebounceTime); 1376 saved_game.write<int32_t>(trigger_formation); 1377 saved_game.write<int32_t>(spawnContents); 1378 saved_game.write<int32_t>(waypoint); 1379 saved_game.write<int32_t>(wayedge); 1380 saved_game.write<int32_t>(lastWaypoint); 1381 saved_game.write<int32_t>(lastInAirTime); 1382 saved_game.write<int32_t>(noWaypointTime); 1383 saved_game.write<int32_t>(combatPoint); 1384 saved_game.write<float>(followPos); 1385 saved_game.write<int32_t>(followPosRecalcTime); 1386 saved_game.write<int32_t>(followPosWaypoint); 1387 saved_game.write<int32_t>(loopAnim); 1388 saved_game.write<int32_t>(startFrame); 1389 saved_game.write<int32_t>(endFrame); 1390 saved_game.write<int32_t>(m_iIcarusID); 1391 saved_game.write<int32_t>(taskID); 1392 saved_game.write<int32_t>(parms); 1393 saved_game.write<int32_t>(behaviorSet); 1394 saved_game.write<int32_t>(script_targetname); 1395 saved_game.write<int32_t>(delayScriptTime); 1396 saved_game.write<int32_t>(soundSet); 1397 saved_game.write<int32_t>(setTime); 1398 saved_game.write<int32_t>(cameraGroup); 1399 saved_game.write<int32_t>(noDamageTeam); 1400 saved_game.write<int16_t>(playerModel); 1401 saved_game.write<int16_t>(weaponModel); 1402 saved_game.write<int16_t>(handRBolt); 1403 saved_game.write<int16_t>(handLBolt); 1404 saved_game.write<int16_t>(headBolt); 1405 saved_game.write<int16_t>(cervicalBolt); 1406 saved_game.write<int16_t>(chestBolt); 1407 saved_game.write<int16_t>(gutBolt); 1408 saved_game.write<int16_t>(torsoBolt); 1409 saved_game.write<int16_t>(crotchBolt); 1410 saved_game.write<int16_t>(motionBolt); 1411 saved_game.write<int16_t>(kneeLBolt); 1412 saved_game.write<int16_t>(kneeRBolt); 1413 saved_game.write<int16_t>(elbowLBolt); 1414 saved_game.write<int16_t>(elbowRBolt); 1415 saved_game.write<int16_t>(footLBolt); 1416 saved_game.write<int16_t>(footRBolt); 1417 saved_game.write<int16_t>(faceBone); 1418 saved_game.write<int16_t>(craniumBone); 1419 saved_game.write<int16_t>(cervicalBone); 1420 saved_game.write<int16_t>(thoracicBone); 1421 saved_game.write<int16_t>(upperLumbarBone); 1422 saved_game.write<int16_t>(lowerLumbarBone); 1423 saved_game.write<int16_t>(hipsBone); 1424 saved_game.write<int16_t>(motionBone); 1425 saved_game.write<int16_t>(rootBone); 1426 saved_game.write<int16_t>(footLBone); 1427 saved_game.write<int16_t>(footRBone); 1428 saved_game.write<int16_t>(humerusRBone); 1429 saved_game.write<int16_t>(genericBone1); 1430 saved_game.write<int16_t>(genericBone2); 1431 saved_game.write<int16_t>(genericBone3); 1432 saved_game.write<int16_t>(genericBolt1); 1433 saved_game.write<int16_t>(genericBolt2); 1434 saved_game.write<int16_t>(genericBolt3); 1435 saved_game.write<int16_t>(genericBolt4); 1436 saved_game.write<int16_t>(genericBolt5); 1437 saved_game.write<int32_t>(cinematicModel); 1438 saved_game.write<int32_t>(m_pVehicle); 1439 saved_game.write<int32_t>(NPC); 1440 saved_game.write<int32_t>(ownername); 1441 saved_game.write<int32_t>(cantHitEnemyCounter); 1442 saved_game.write<int32_t>(NPC_type); 1443 saved_game.write<int32_t>(NPC_targetname); 1444 saved_game.write<int32_t>(NPC_target); 1445 saved_game.write<int32_t>(moverState); 1446 saved_game.write<int32_t>(soundPos1); 1447 saved_game.write<int32_t>(sound1to2); 1448 saved_game.write<int32_t>(sound2to1); 1449 saved_game.write<int32_t>(soundPos2); 1450 saved_game.write<int32_t>(soundLoop); 1451 saved_game.write<int32_t>(nextTrain); 1452 saved_game.write<int32_t>(prevTrain); 1453 saved_game.write<float>(pos1); 1454 saved_game.write<float>(pos2); 1455 saved_game.write<float>(pos3); 1456 saved_game.write<int32_t>(sounds); 1457 saved_game.write<int32_t>(closetarget); 1458 saved_game.write<int32_t>(opentarget); 1459 saved_game.write<int32_t>(paintarget); 1460 saved_game.write<int32_t>(lockCount); 1461 saved_game.write<float>(radius); 1462 saved_game.write<int32_t>(wpIndex); 1463 saved_game.write<int32_t>(noise_index); 1464 saved_game.write<float>(startRGBA); 1465 saved_game.write<float>(finalRGBA); 1466 saved_game.write<int32_t>(item); 1467 saved_game.write<int32_t>(message); 1468 saved_game.write<float>(lightLevel); 1469 saved_game.write<int32_t>(forcePushTime); 1470 saved_game.write<int32_t>(forcePuller); 1471 } 1472 sg_importgentity_s1473 void sg_import( 1474 ojk::SavedGameHelper& saved_game) 1475 { 1476 saved_game.read<>(s); 1477 saved_game.read<int32_t>(client); 1478 saved_game.read<int32_t>(inuse); 1479 saved_game.read<int32_t>(linked); 1480 saved_game.read<int32_t>(svFlags); 1481 saved_game.read<int32_t>(bmodel); 1482 saved_game.read<float>(mins); 1483 saved_game.read<float>(maxs); 1484 saved_game.read<int32_t>(contents); 1485 saved_game.read<float>(absmin); 1486 saved_game.read<float>(absmax); 1487 saved_game.read<float>(currentOrigin); 1488 saved_game.read<float>(currentAngles); 1489 saved_game.read<int32_t>(owner); 1490 saved_game.read<>(ghoul2); 1491 saved_game.read<float>(modelScale); 1492 saved_game.read<int32_t>(classname); 1493 saved_game.read<int32_t>(spawnflags); 1494 saved_game.read<int32_t>(flags); 1495 saved_game.read<int32_t>(model); 1496 saved_game.read<int32_t>(model2); 1497 saved_game.read<int32_t>(freetime); 1498 saved_game.read<int32_t>(eventTime); 1499 saved_game.read<int32_t>(freeAfterEvent); 1500 saved_game.read<float>(physicsBounce); 1501 saved_game.read<int32_t>(clipmask); 1502 saved_game.read<float>(speed); 1503 saved_game.read<float>(resultspeed); 1504 saved_game.read<int32_t>(lastMoveTime); 1505 saved_game.read<float>(movedir); 1506 saved_game.read<float>(lastOrigin); 1507 saved_game.read<float>(lastAngles); 1508 saved_game.read<float>(mass); 1509 saved_game.read<int32_t>(lastImpact); 1510 saved_game.read<int32_t>(watertype); 1511 saved_game.read<int32_t>(waterlevel); 1512 saved_game.read<int16_t>(wupdate); 1513 saved_game.read<int16_t>(prev_waterlevel); 1514 saved_game.read<float>(angle); 1515 saved_game.read<int32_t>(target); 1516 saved_game.read<int32_t>(target2); 1517 saved_game.read<int32_t>(target3); 1518 saved_game.read<int32_t>(target4); 1519 saved_game.read<int32_t>(targetJump); 1520 saved_game.read<int32_t>(targetname); 1521 saved_game.read<int32_t>(team); 1522 saved_game.read<int32_t>(roff); 1523 saved_game.read<int32_t>(roff_ctr); 1524 saved_game.read<int32_t>(next_roff_time); 1525 saved_game.read<int32_t>(fx_time); 1526 saved_game.read<int32_t>(nextthink); 1527 saved_game.read<int32_t>(e_ThinkFunc); 1528 saved_game.read<int32_t>(e_clThinkFunc); 1529 saved_game.read<int32_t>(e_ReachedFunc); 1530 saved_game.read<int32_t>(e_BlockedFunc); 1531 saved_game.read<int32_t>(e_TouchFunc); 1532 saved_game.read<int32_t>(e_UseFunc); 1533 saved_game.read<int32_t>(e_PainFunc); 1534 saved_game.read<int32_t>(e_DieFunc); 1535 saved_game.read<int32_t>(health); 1536 saved_game.read<int32_t>(max_health); 1537 saved_game.read<int32_t>(takedamage); 1538 saved_game.read<int32_t>(material); 1539 saved_game.read<int32_t>(damage); 1540 saved_game.read<int32_t>(dflags); 1541 saved_game.read<int32_t>(splashDamage); 1542 saved_game.read<int32_t>(splashRadius); 1543 saved_game.read<int32_t>(methodOfDeath); 1544 saved_game.read<int32_t>(splashMethodOfDeath); 1545 saved_game.read<int32_t>(locationDamage); 1546 saved_game.read<int32_t>(chain); 1547 saved_game.read<int32_t>(enemy); 1548 saved_game.read<int32_t>(activator); 1549 saved_game.read<int32_t>(teamchain); 1550 saved_game.read<int32_t>(teammaster); 1551 saved_game.read<int32_t>(lastEnemy); 1552 saved_game.read<float>(wait); 1553 saved_game.read<float>(random); 1554 saved_game.read<int32_t>(delay); 1555 saved_game.read<int32_t>(alt_fire); 1556 saved_game.read<int32_t>(count); 1557 saved_game.read<int32_t>(bounceCount); 1558 saved_game.read<int32_t>(fly_sound_debounce_time); 1559 saved_game.read<int32_t>(painDebounceTime); 1560 saved_game.read<int32_t>(disconnectDebounceTime); 1561 saved_game.read<int32_t>(attackDebounceTime); 1562 saved_game.read<int32_t>(pushDebounceTime); 1563 saved_game.read<int32_t>(aimDebounceTime); 1564 saved_game.read<int32_t>(useDebounceTime); 1565 saved_game.read<int32_t>(trigger_formation); 1566 saved_game.read<int32_t>(spawnContents); 1567 saved_game.read<int32_t>(waypoint); 1568 saved_game.read<int32_t>(wayedge); 1569 saved_game.read<int32_t>(lastWaypoint); 1570 saved_game.read<int32_t>(lastInAirTime); 1571 saved_game.read<int32_t>(noWaypointTime); 1572 saved_game.read<int32_t>(combatPoint); 1573 saved_game.read<float>(followPos); 1574 saved_game.read<int32_t>(followPosRecalcTime); 1575 saved_game.read<int32_t>(followPosWaypoint); 1576 saved_game.read<int32_t>(loopAnim); 1577 saved_game.read<int32_t>(startFrame); 1578 saved_game.read<int32_t>(endFrame); 1579 saved_game.read<int32_t>(m_iIcarusID); 1580 saved_game.read<int32_t>(taskID); 1581 saved_game.read<int32_t>(parms); 1582 saved_game.read<int32_t>(behaviorSet); 1583 saved_game.read<int32_t>(script_targetname); 1584 saved_game.read<int32_t>(delayScriptTime); 1585 saved_game.read<int32_t>(soundSet); 1586 saved_game.read<int32_t>(setTime); 1587 saved_game.read<int32_t>(cameraGroup); 1588 saved_game.read<int32_t>(noDamageTeam); 1589 saved_game.read<int16_t>(playerModel); 1590 saved_game.read<int16_t>(weaponModel); 1591 saved_game.read<int16_t>(handRBolt); 1592 saved_game.read<int16_t>(handLBolt); 1593 saved_game.read<int16_t>(headBolt); 1594 saved_game.read<int16_t>(cervicalBolt); 1595 saved_game.read<int16_t>(chestBolt); 1596 saved_game.read<int16_t>(gutBolt); 1597 saved_game.read<int16_t>(torsoBolt); 1598 saved_game.read<int16_t>(crotchBolt); 1599 saved_game.read<int16_t>(motionBolt); 1600 saved_game.read<int16_t>(kneeLBolt); 1601 saved_game.read<int16_t>(kneeRBolt); 1602 saved_game.read<int16_t>(elbowLBolt); 1603 saved_game.read<int16_t>(elbowRBolt); 1604 saved_game.read<int16_t>(footLBolt); 1605 saved_game.read<int16_t>(footRBolt); 1606 saved_game.read<int16_t>(faceBone); 1607 saved_game.read<int16_t>(craniumBone); 1608 saved_game.read<int16_t>(cervicalBone); 1609 saved_game.read<int16_t>(thoracicBone); 1610 saved_game.read<int16_t>(upperLumbarBone); 1611 saved_game.read<int16_t>(lowerLumbarBone); 1612 saved_game.read<int16_t>(hipsBone); 1613 saved_game.read<int16_t>(motionBone); 1614 saved_game.read<int16_t>(rootBone); 1615 saved_game.read<int16_t>(footLBone); 1616 saved_game.read<int16_t>(footRBone); 1617 saved_game.read<int16_t>(humerusRBone); 1618 saved_game.read<int16_t>(genericBone1); 1619 saved_game.read<int16_t>(genericBone2); 1620 saved_game.read<int16_t>(genericBone3); 1621 saved_game.read<int16_t>(genericBolt1); 1622 saved_game.read<int16_t>(genericBolt2); 1623 saved_game.read<int16_t>(genericBolt3); 1624 saved_game.read<int16_t>(genericBolt4); 1625 saved_game.read<int16_t>(genericBolt5); 1626 saved_game.read<int32_t>(cinematicModel); 1627 saved_game.read<int32_t>(m_pVehicle); 1628 saved_game.read<int32_t>(NPC); 1629 saved_game.read<int32_t>(ownername); 1630 saved_game.read<int32_t>(cantHitEnemyCounter); 1631 saved_game.read<int32_t>(NPC_type); 1632 saved_game.read<int32_t>(NPC_targetname); 1633 saved_game.read<int32_t>(NPC_target); 1634 saved_game.read<int32_t>(moverState); 1635 saved_game.read<int32_t>(soundPos1); 1636 saved_game.read<int32_t>(sound1to2); 1637 saved_game.read<int32_t>(sound2to1); 1638 saved_game.read<int32_t>(soundPos2); 1639 saved_game.read<int32_t>(soundLoop); 1640 saved_game.read<int32_t>(nextTrain); 1641 saved_game.read<int32_t>(prevTrain); 1642 saved_game.read<float>(pos1); 1643 saved_game.read<float>(pos2); 1644 saved_game.read<float>(pos3); 1645 saved_game.read<int32_t>(sounds); 1646 saved_game.read<int32_t>(closetarget); 1647 saved_game.read<int32_t>(opentarget); 1648 saved_game.read<int32_t>(paintarget); 1649 saved_game.read<int32_t>(lockCount); 1650 saved_game.read<float>(radius); 1651 saved_game.read<int32_t>(wpIndex); 1652 saved_game.read<int32_t>(noise_index); 1653 saved_game.read<float>(startRGBA); 1654 saved_game.read<float>(finalRGBA); 1655 saved_game.read<int32_t>(item); 1656 saved_game.read<int32_t>(message); 1657 saved_game.read<float>(lightLevel); 1658 saved_game.read<int32_t>(forcePushTime); 1659 saved_game.read<int32_t>(forcePuller); 1660 } 1661 }; 1662 #endif //#ifdef GAME_INCLUDE 1663 1664 extern gentity_t g_entities[MAX_GENTITIES]; 1665 extern game_import_t gi; 1666 1667 // each WP_* weapon enum has an associated weaponInfo_t 1668 // that contains media references necessary to present the 1669 // weapon and its effects 1670 typedef struct weaponInfo_s { 1671 qboolean registered; 1672 gitem_t *item; 1673 1674 qhandle_t handsModel; // the hands don't actually draw, they just position the weapon 1675 qhandle_t weaponModel; //for in view 1676 qhandle_t weaponWorldModel; //for in their hands 1677 qhandle_t barrelModel[4]; 1678 1679 vec3_t weaponMidpoint; // so it will rotate centered instead of by tag 1680 1681 qhandle_t weaponIcon; // The version of the icon with a glowy background 1682 qhandle_t weaponIconNoAmmo; // The version of the icon with no ammo warning 1683 qhandle_t ammoIcon; 1684 1685 qhandle_t ammoModel; 1686 1687 qhandle_t missileModel; 1688 sfxHandle_t missileSound; 1689 void (*missileTrailFunc)( centity_t *, const struct weaponInfo_s *wi ); 1690 1691 qhandle_t alt_missileModel; 1692 sfxHandle_t alt_missileSound; 1693 void (*alt_missileTrailFunc)( centity_t *, const struct weaponInfo_s *wi ); 1694 1695 // sfxHandle_t flashSound; 1696 // sfxHandle_t altFlashSound; 1697 1698 sfxHandle_t firingSound; 1699 sfxHandle_t altFiringSound; 1700 1701 sfxHandle_t stopSound; 1702 1703 sfxHandle_t missileHitSound; 1704 sfxHandle_t altmissileHitSound; 1705 1706 sfxHandle_t chargeSound; 1707 sfxHandle_t altChargeSound; 1708 1709 sfxHandle_t selectSound; // sound played when weapon is selected 1710 } weaponInfo_t; 1711 1712 extern sfxHandle_t CAS_GetBModelSound( const char *name, int stage ); 1713 1714 enum 1715 { 1716 EDGE_NORMAL, 1717 EDGE_PATH, 1718 EDGE_BLOCKED, 1719 EDGE_FAILED, 1720 EDGE_FLY, 1721 EDGE_JUMP, 1722 EDGE_LARGE, 1723 EDGE_PATHBLOCKED, 1724 EDGE_NEARESTVALID, 1725 EDGE_NEARESTINVALID, 1726 1727 EDGE_NODE_FLOATING, 1728 EDGE_NODE_NORMAL, 1729 EDGE_NODE_GOAL, 1730 EDGE_NODE_COMBAT, 1731 1732 EDGE_CELL, 1733 EDGE_CELL_EMPTY, 1734 EDGE_IMPACT_SAFE, 1735 EDGE_IMPACT_POSSIBLE, 1736 EDGE_THRUST, 1737 EDGE_VELOCITY, 1738 1739 EDGE_FOLLOWPOS, 1740 1741 EDGE_WHITE_ONESECOND, 1742 EDGE_WHITE_TWOSECOND, 1743 EDGE_RED_ONESECOND, 1744 EDGE_RED_TWOSECOND, 1745 }; 1746 1747 enum 1748 { 1749 NODE_NORMAL, 1750 NODE_FLOATING, 1751 NODE_GOAL, 1752 NODE_NAVGOAL, 1753 }; 1754 1755 #endif // #ifndef __G_SHARED_H__ 1756