1 /* 2 Copyright (C) 1996-1997 Id Software, Inc. 3 4 This program is free software; you can redistribute it and/or 5 modify it under the terms of the GNU General Public License 6 as published by the Free Software Foundation; either version 2 7 of the License, or (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 13 See the GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program; if not, write to the Free Software 17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 18 19 */ 20 // sv_edict.c -- entity dictionary 21 22 #include "quakedef.h" 23 24 dprograms_t *progs; 25 dfunction_t *pr_functions; 26 char *pr_strings; 27 ddef_t *pr_fielddefs; 28 ddef_t *pr_globaldefs; 29 dstatement_t *pr_statements; 30 globalvars_t *pr_global_struct; 31 float *pr_globals; // same as pr_global_struct 32 int pr_edict_size; // in bytes 33 34 unsigned short pr_crc; 35 36 int type_size[8] = {1,sizeof(string_t)/4,1,3,1,1,sizeof(func_t)/4,sizeof(void *)/4}; 37 38 ddef_t *ED_FieldAtOfs (int ofs); 39 qboolean ED_ParseEpair (void *base, ddef_t *key, char *s); 40 41 cvar_t nomonsters = CVAR2("nomonsters", "0"); 42 cvar_t gamecfg = CVAR2("gamecfg", "0"); 43 cvar_t scratch1 = CVAR2("scratch1", "0"); 44 cvar_t scratch2 = CVAR2("scratch2", "0"); 45 cvar_t scratch3 = CVAR2("scratch3", "0"); 46 cvar_t scratch4 = CVAR2("scratch4", "0"); 47 cvar_t savedgamecfg = CVAR3("savedgamecfg", "0", true); 48 cvar_t saved1 = CVAR3("saved1", "0", true); 49 cvar_t saved2 = CVAR3("saved2", "0", true); 50 cvar_t saved3 = CVAR3("saved3", "0", true); 51 cvar_t saved4 = CVAR3("saved4", "0", true); 52 53 #define MAX_FIELD_LEN 64 54 #define GEFV_CACHESIZE 2 55 56 typedef struct { 57 ddef_t *pcache; 58 char field[MAX_FIELD_LEN]; 59 } gefv_cache; 60 61 static gefv_cache gefvCache[GEFV_CACHESIZE] = {{NULL, ""}, {NULL, ""}}; 62 63 /* 64 ================= 65 ED_ClearEdict 66 67 Sets everything to NULL 68 ================= 69 */ 70 void ED_ClearEdict (edict_t *e) 71 { 72 memset (&e->u.v, 0, progs->entityfields * 4); 73 e->free = false; 74 } 75 76 /* 77 ================= 78 ED_Alloc 79 80 Either finds a free edict, or allocates a new one. 81 Try to avoid reusing an entity that was recently freed, because it 82 can cause the client to think the entity morphed into something else 83 instead of being removed and recreated, which can cause interpolated 84 angles and bad trails. 85 ================= 86 */ 87 edict_t *ED_Alloc (void) 88 { 89 int i; 90 edict_t *e; 91 92 for ( i=svs.maxclients+1 ; i<sv.num_edicts ; i++) 93 { 94 e = EDICT_NUM(i); 95 // the first couple seconds of server time can involve a lot of 96 // freeing and allocating, so relax the replacement policy 97 if (e->free && ( e->freetime < 2 || sv.time - e->freetime > 0.5 ) ) 98 { 99 ED_ClearEdict (e); 100 return e; 101 } 102 } 103 104 if (i == MAX_EDICTS) 105 Sys_Error ("ED_Alloc: no free edicts"); 106 107 sv.num_edicts++; 108 e = EDICT_NUM(i); 109 ED_ClearEdict (e); 110 111 return e; 112 } 113 114 /* 115 ================= 116 ED_Free 117 118 Marks the edict as free 119 FIXME: walk all entities and NULL out references to this entity 120 ================= 121 */ 122 void ED_Free (edict_t *ed) 123 { 124 SV_UnlinkEdict (ed); // unlink from world bsp 125 126 ed->free = true; 127 ed->u.v.model = 0; 128 ed->u.v.takedamage = 0; 129 ed->u.v.modelindex = 0; 130 ed->u.v.colormap = 0; 131 ed->u.v.skin = 0; 132 ed->u.v.frame = 0; 133 VectorCopy (vec3_origin, ed->u.v.origin); 134 VectorCopy (vec3_origin, ed->u.v.angles); 135 ed->u.v.nextthink = -1; 136 ed->u.v.solid = 0; 137 138 ed->freetime = sv.time; 139 } 140 141 //=========================================================================== 142 143 /* 144 ============ 145 ED_GlobalAtOfs 146 ============ 147 */ 148 ddef_t *ED_GlobalAtOfs (int ofs) 149 { 150 ddef_t *def; 151 int i; 152 153 for (i=0 ; i<progs->numglobaldefs ; i++) 154 { 155 def = &pr_globaldefs[i]; 156 if (def->ofs == ofs) 157 return def; 158 } 159 return NULL; 160 } 161 162 /* 163 ============ 164 ED_FieldAtOfs 165 ============ 166 */ 167 ddef_t *ED_FieldAtOfs (int ofs) 168 { 169 ddef_t *def; 170 int i; 171 172 for (i=0 ; i<progs->numfielddefs ; i++) 173 { 174 def = &pr_fielddefs[i]; 175 if (def->ofs == ofs) 176 return def; 177 } 178 return NULL; 179 } 180 181 /* 182 ============ 183 ED_FindField 184 ============ 185 */ 186 ddef_t *ED_FindField (const char *name) 187 { 188 ddef_t *def; 189 int i; 190 191 for (i=0 ; i<progs->numfielddefs ; i++) 192 { 193 def = &pr_fielddefs[i]; 194 if (!strcmp(pr_strings + def->s_name,name) ) 195 return def; 196 } 197 return NULL; 198 } 199 200 201 /* 202 ============ 203 ED_FindGlobal 204 ============ 205 */ 206 ddef_t *ED_FindGlobal (const char *name) 207 { 208 ddef_t *def; 209 int i; 210 211 for (i=0 ; i<progs->numglobaldefs ; i++) 212 { 213 def = &pr_globaldefs[i]; 214 if (!strcmp(pr_strings + def->s_name,name) ) 215 return def; 216 } 217 return NULL; 218 } 219 220 221 /* 222 ============ 223 ED_FindFunction 224 ============ 225 */ 226 dfunction_t *ED_FindFunction (const char *name) 227 { 228 dfunction_t *func; 229 int i; 230 231 for (i=0 ; i<progs->numfunctions ; i++) 232 { 233 func = &pr_functions[i]; 234 if (!strcmp(pr_strings + func->s_name,name) ) 235 return func; 236 } 237 return NULL; 238 } 239 240 241 eval_t *GetEdictFieldValue(edict_t *ed, const char *field) 242 { 243 ddef_t *def = NULL; 244 int i; 245 static int rep = 0; 246 247 for (i=0 ; i<GEFV_CACHESIZE ; i++) 248 { 249 if (!strcmp(field, gefvCache[i].field)) 250 { 251 def = gefvCache[i].pcache; 252 goto Done; 253 } 254 } 255 256 def = ED_FindField (field); 257 258 if (strlen(field) < MAX_FIELD_LEN) 259 { 260 gefvCache[rep].pcache = def; 261 strcpy (gefvCache[rep].field, field); 262 rep ^= 1; 263 } 264 265 Done: 266 if (!def) 267 return NULL; 268 269 return (eval_t *)((char *)&ed->u.v + def->ofs*4); 270 } 271 272 273 /* 274 ============ 275 PR_ValueString 276 277 Returns a string describing *data in a type specific manner 278 ============= 279 */ 280 char *PR_ValueString (etype_t type, eval_t *val) 281 { 282 static char line[256]; 283 ddef_t *def; 284 dfunction_t *f; 285 286 type = (etype_t) (type & ~DEF_SAVEGLOBAL); 287 288 switch (type) 289 { 290 case ev_string: 291 sprintf (line, "%s", pr_strings + val->string); 292 break; 293 case ev_entity: 294 sprintf (line, "entity %i", NUM_FOR_EDICT(PROG_TO_EDICT(val->edict)) ); 295 break; 296 case ev_function: 297 f = pr_functions + val->function; 298 sprintf (line, "%s()", pr_strings + f->s_name); 299 break; 300 case ev_field: 301 def = ED_FieldAtOfs ( val->_int ); 302 sprintf (line, ".%s", pr_strings + def->s_name); 303 break; 304 case ev_void: 305 sprintf (line, "void"); 306 break; 307 case ev_float: 308 sprintf (line, "%5.1f", val->_float); 309 break; 310 case ev_vector: 311 sprintf (line, "'%5.1f %5.1f %5.1f'", val->vector[0], val->vector[1], val->vector[2]); 312 break; 313 case ev_pointer: 314 sprintf (line, "pointer"); 315 break; 316 default: 317 sprintf (line, "bad type %i", type); 318 break; 319 } 320 321 return line; 322 } 323 324 /* 325 ============ 326 PR_UglyValueString 327 328 Returns a string describing *data in a type specific manner 329 Easier to parse than PR_ValueString 330 ============= 331 */ 332 char *PR_UglyValueString (etype_t type, eval_t *val) 333 { 334 static char line[256]; 335 ddef_t *def; 336 dfunction_t *f; 337 338 type = (etype_t) (type & ~DEF_SAVEGLOBAL); 339 340 switch (type) 341 { 342 case ev_string: 343 sprintf (line, "%s", pr_strings + val->string); 344 break; 345 case ev_entity: 346 sprintf (line, "%i", NUM_FOR_EDICT(PROG_TO_EDICT(val->edict))); 347 break; 348 case ev_function: 349 f = pr_functions + val->function; 350 sprintf (line, "%s", pr_strings + f->s_name); 351 break; 352 case ev_field: 353 def = ED_FieldAtOfs ( val->_int ); 354 sprintf (line, "%s", pr_strings + def->s_name); 355 break; 356 case ev_void: 357 sprintf (line, "void"); 358 break; 359 case ev_float: 360 sprintf (line, "%f", val->_float); 361 break; 362 case ev_vector: 363 sprintf (line, "%f %f %f", val->vector[0], val->vector[1], val->vector[2]); 364 break; 365 default: 366 sprintf (line, "bad type %i", type); 367 break; 368 } 369 370 return line; 371 } 372 373 /* 374 ============ 375 PR_GlobalString 376 377 Returns a string with a description and the contents of a global, 378 padded to 20 field width 379 ============ 380 */ 381 char *PR_GlobalString (int ofs) 382 { 383 char *s; 384 int i; 385 ddef_t *def; 386 void *val; 387 static char line[128]; 388 389 val = (void *)&pr_globals[ofs]; 390 def = ED_GlobalAtOfs(ofs); 391 if (!def) 392 sprintf (line,"%i(??""?)", ofs); 393 else 394 { 395 s = PR_ValueString ((etype_t) def->type, (eval_t*) val); 396 sprintf (line,"%i(%s)%s", ofs, pr_strings + def->s_name, s); 397 } 398 399 i = strlen(line); 400 for ( ; i<20 ; i++) 401 strcat (line," "); 402 strcat (line," "); 403 404 return line; 405 } 406 407 char *PR_GlobalStringNoContents (int ofs) 408 { 409 int i; 410 ddef_t *def; 411 static char line[128]; 412 413 def = ED_GlobalAtOfs(ofs); 414 if (!def) 415 sprintf (line,"%i(??""?)", ofs); 416 else 417 sprintf (line,"%i(%s)", ofs, pr_strings + def->s_name); 418 419 i = strlen(line); 420 for ( ; i<20 ; i++) 421 strcat (line," "); 422 strcat (line," "); 423 424 return line; 425 } 426 427 428 /* 429 ============= 430 ED_Print 431 432 For debugging 433 ============= 434 */ 435 void ED_Print (edict_t *ed) 436 { 437 int l; 438 ddef_t *d; 439 int *v; 440 int i, j; 441 char *name; 442 int type; 443 444 if (ed->free) 445 { 446 Con_Printf ("FREE\n"); 447 return; 448 } 449 450 Con_Printf("\nEDICT %i:\n", NUM_FOR_EDICT(ed)); 451 for (i=1 ; i<progs->numfielddefs ; i++) 452 { 453 d = &pr_fielddefs[i]; 454 name = pr_strings + d->s_name; 455 if (name[strlen(name)-2] == '_') 456 continue; // skip _x, _y, _z vars 457 458 v = (int *)((char *)&ed->u.v + d->ofs*4); 459 460 // if the value is still all 0, skip the field 461 type = d->type & ~DEF_SAVEGLOBAL; 462 463 for (j=0 ; j<type_size[type] ; j++) 464 if (v[j]) 465 break; 466 if (j == type_size[type]) 467 continue; 468 469 Con_Printf ("%s",name); 470 l = strlen (name); 471 while (l++ < 15) 472 Con_Printf (" "); 473 474 Con_Printf ("%s\n", PR_ValueString((etype_t) d->type, (eval_t *)v)); 475 } 476 } 477 478 /* 479 ============= 480 ED_Write 481 482 For savegames 483 ============= 484 */ 485 void ED_Write (FILE *f, edict_t *ed) 486 { 487 ddef_t *d; 488 int *v; 489 int i, j; 490 char *name; 491 int type; 492 493 fprintf (f, "{\n"); 494 495 if (ed->free) 496 { 497 fprintf (f, "}\n"); 498 return; 499 } 500 501 for (i=1 ; i<progs->numfielddefs ; i++) 502 { 503 d = &pr_fielddefs[i]; 504 name = pr_strings + d->s_name; 505 if (name[strlen(name)-2] == '_') 506 continue; // skip _x, _y, _z vars 507 508 v = (int *)((char *)&ed->u.v + d->ofs*4); 509 510 // if the value is still all 0, skip the field 511 type = d->type & ~DEF_SAVEGLOBAL; 512 for (j=0 ; j<type_size[type] ; j++) 513 if (v[j]) 514 break; 515 if (j == type_size[type]) 516 continue; 517 518 fprintf (f,"\"%s\" ",name); 519 fprintf (f,"\"%s\"\n", PR_UglyValueString((etype_t) d->type, (eval_t *)v)); 520 } 521 522 fprintf (f, "}\n"); 523 } 524 525 void ED_PrintNum (int ent) 526 { 527 ED_Print (EDICT_NUM(ent)); 528 } 529 530 /* 531 ============= 532 ED_PrintEdicts 533 534 For debugging, prints all the entities in the current server 535 ============= 536 */ 537 void ED_PrintEdicts (void) 538 { 539 int i; 540 541 Con_Printf ("%i entities\n", sv.num_edicts); 542 for (i=0 ; i<sv.num_edicts ; i++) 543 ED_PrintNum (i); 544 } 545 546 /* 547 ============= 548 ED_PrintEdict_f 549 550 For debugging, prints a single edicy 551 ============= 552 */ 553 void ED_PrintEdict_f (void) 554 { 555 int i; 556 557 i = Q_atoi (Cmd_Argv(1)); 558 if (i >= sv.num_edicts) 559 { 560 Con_Printf("Bad edict number\n"); 561 return; 562 } 563 ED_PrintNum (i); 564 } 565 566 /* 567 ============= 568 ED_Count 569 570 For debugging 571 ============= 572 */ 573 void ED_Count (void) 574 { 575 int i; 576 edict_t *ent; 577 int active, models, solid, step; 578 579 active = models = solid = step = 0; 580 for (i=0 ; i<sv.num_edicts ; i++) 581 { 582 ent = EDICT_NUM(i); 583 if (ent->free) 584 continue; 585 active++; 586 if (ent->u.v.solid) 587 solid++; 588 if (ent->u.v.model) 589 models++; 590 if (ent->u.v.movetype == MOVETYPE_STEP) 591 step++; 592 } 593 594 Con_Printf ("num_edicts:%3i\n", sv.num_edicts); 595 Con_Printf ("active :%3i\n", active); 596 Con_Printf ("view :%3i\n", models); 597 Con_Printf ("touch :%3i\n", solid); 598 Con_Printf ("step :%3i\n", step); 599 600 } 601 602 /* 603 ============================================================================== 604 605 ARCHIVING GLOBALS 606 607 FIXME: need to tag constants, doesn't really work 608 ============================================================================== 609 */ 610 611 /* 612 ============= 613 ED_WriteGlobals 614 ============= 615 */ 616 void ED_WriteGlobals (FILE *f) 617 { 618 ddef_t *def; 619 int i; 620 char *name; 621 int type; 622 623 fprintf (f,"{\n"); 624 for (i=0 ; i<progs->numglobaldefs ; i++) 625 { 626 def = &pr_globaldefs[i]; 627 type = def->type; 628 if ( !(def->type & DEF_SAVEGLOBAL) ) 629 continue; 630 type &= ~DEF_SAVEGLOBAL; 631 632 if (type != ev_string 633 && type != ev_float 634 && type != ev_entity) 635 continue; 636 637 name = pr_strings + def->s_name; 638 fprintf (f,"\"%s\" ", name); 639 fprintf (f,"\"%s\"\n", PR_UglyValueString((etype_t) type, (eval_t *)&pr_globals[def->ofs])); 640 } 641 fprintf (f,"}\n"); 642 } 643 644 /* 645 ============= 646 ED_ParseGlobals 647 ============= 648 */ 649 void ED_ParseGlobals (char *data) 650 { 651 char keyname[64]; 652 ddef_t *key; 653 654 while (1) 655 { 656 // parse key 657 data = COM_Parse (data); 658 if (com_token[0] == '}') 659 break; 660 if (!data) 661 Sys_Error ("ED_ParseEntity: EOF without closing brace"); 662 663 strcpy (keyname, com_token); 664 665 // parse value 666 data = COM_Parse (data); 667 if (!data) 668 Sys_Error ("ED_ParseEntity: EOF without closing brace"); 669 670 if (com_token[0] == '}') 671 Sys_Error ("ED_ParseEntity: closing brace without data"); 672 673 key = ED_FindGlobal (keyname); 674 if (!key) 675 { 676 Con_Printf ("'%s' is not a global\n", keyname); 677 continue; 678 } 679 680 if (!ED_ParseEpair ((void *)pr_globals, key, com_token)) 681 Host_Error ("ED_ParseGlobals: parse error"); 682 } 683 } 684 685 //============================================================================ 686 687 688 /* 689 ============= 690 ED_NewString 691 ============= 692 */ 693 char *ED_NewString (char *string) 694 { 695 char *new_, *new_p; 696 int i,l; 697 698 l = strlen(string) + 1; 699 new_ = (char*) Hunk_Alloc (l); 700 new_p = new_; 701 702 for (i=0 ; i< l ; i++) 703 { 704 if (string[i] == '\\' && i < l-1) 705 { 706 i++; 707 if (string[i] == 'n') 708 *new_p++ = '\n'; 709 else 710 *new_p++ = '\\'; 711 } 712 else 713 *new_p++ = string[i]; 714 } 715 716 return new_; 717 } 718 719 720 /* 721 ============= 722 ED_ParseEval 723 724 Can parse either fields or globals 725 returns false if error 726 ============= 727 */ 728 qboolean ED_ParseEpair (void *base, ddef_t *key, char *s) 729 { 730 int i; 731 char string[128]; 732 ddef_t *def; 733 char *v, *w; 734 void *d; 735 dfunction_t *func; 736 737 d = (void *)((int *)base + key->ofs); 738 739 switch (key->type & ~DEF_SAVEGLOBAL) 740 { 741 case ev_string: 742 *(string_t *)d = ED_NewString (s) - pr_strings; 743 break; 744 745 case ev_float: 746 *(float *)d = atof (s); 747 break; 748 749 case ev_vector: 750 strcpy (string, s); 751 v = string; 752 w = string; 753 for (i=0 ; i<3 ; i++) 754 { 755 while (*v && *v != ' ') 756 v++; 757 *v = 0; 758 ((float *)d)[i] = atof (w); 759 w = v = v+1; 760 } 761 break; 762 763 case ev_entity: 764 *(int *)d = EDICT_TO_PROG(EDICT_NUM(atoi (s))); 765 break; 766 767 case ev_field: 768 def = ED_FindField (s); 769 if (!def) 770 { 771 Con_Printf ("Can't find field %s\n", s); 772 return false; 773 } 774 *(int *)d = G_INT(def->ofs); 775 break; 776 777 case ev_function: 778 func = ED_FindFunction (s); 779 if (!func) 780 { 781 Con_Printf ("Can't find function %s\n", s); 782 return false; 783 } 784 *(func_t *)d = func - pr_functions; 785 break; 786 787 default: 788 break; 789 } 790 return true; 791 } 792 793 /* 794 ==================== 795 ED_ParseEdict 796 797 Parses an edict out of the given string, returning the new position 798 ed should be a properly initialized empty edict. 799 Used for initial level load and for savegames. 800 ==================== 801 */ 802 char *ED_ParseEdict (char *data, edict_t *ent) 803 { 804 ddef_t *key; 805 qboolean anglehack; 806 qboolean init; 807 char keyname[256]; 808 int n; 809 810 init = false; 811 812 // clear it 813 if (ent != sv.edicts) // hack 814 memset (&ent->u.v, 0, progs->entityfields * 4); 815 816 // go through all the dictionary pairs 817 while (1) 818 { 819 // parse key 820 data = COM_Parse (data); 821 if (com_token[0] == '}') 822 break; 823 if (!data) 824 Sys_Error ("ED_ParseEntity: EOF without closing brace"); 825 826 // anglehack is to allow QuakeEd to write single scalar angles 827 // and allow them to be turned into vectors. (FIXME...) 828 if (!strcmp(com_token, "angle")) 829 { 830 strcpy (com_token, "angles"); 831 anglehack = true; 832 } 833 else 834 anglehack = false; 835 836 // FIXME: change light to _light to get rid of this hack 837 if (!strcmp(com_token, "light")) 838 strcpy (com_token, "light_lev"); // hack for single light def 839 840 strcpy (keyname, com_token); 841 842 // another hack to fix heynames with trailing spaces 843 n = strlen(keyname); 844 while (n && keyname[n-1] == ' ') 845 { 846 keyname[n-1] = 0; 847 n--; 848 } 849 850 // parse value 851 data = COM_Parse (data); 852 if (!data) 853 Sys_Error ("ED_ParseEntity: EOF without closing brace"); 854 855 if (com_token[0] == '}') 856 Sys_Error ("ED_ParseEntity: closing brace without data"); 857 858 init = true; 859 860 // keynames with a leading underscore are used for utility comments, 861 // and are immediately discarded by quake 862 if (keyname[0] == '_') 863 continue; 864 865 key = ED_FindField (keyname); 866 if (!key) 867 { 868 Con_Printf ("'%s' is not a field\n", keyname); 869 continue; 870 } 871 872 if (anglehack) 873 { 874 char temp[32]; 875 strcpy (temp, com_token); 876 sprintf (com_token, "0 %s 0", temp); 877 } 878 879 if (!ED_ParseEpair ((void *)&ent->u.v, key, com_token)) 880 Host_Error ("ED_ParseEdict: parse error"); 881 } 882 883 if (!init) 884 ent->free = true; 885 886 return data; 887 } 888 889 890 /* 891 ================ 892 ED_LoadFromFile 893 894 The entities are directly placed in the array, rather than allocated with 895 ED_Alloc, because otherwise an error loading the map would have entity 896 number references out of order. 897 898 Creates a server's entity / program execution context by 899 parsing textual entity definitions out of an ent file. 900 901 Used for both fresh maps and savegame loads. A fresh map would also need 902 to call ED_CallSpawnFunctions () to let the objects initialize themselves. 903 ================ 904 */ 905 void ED_LoadFromFile (char *data) 906 { 907 edict_t *ent; 908 int inhibit; 909 dfunction_t *func; 910 911 ent = NULL; 912 inhibit = 0; 913 pr_global_struct->time = sv.time; 914 915 // parse ents 916 while (1) 917 { 918 // parse the opening brace 919 data = COM_Parse (data); 920 if (!data) 921 break; 922 if (com_token[0] != '{') 923 Sys_Error ("ED_LoadFromFile: found %s when expecting {",com_token); 924 925 if (!ent) 926 ent = EDICT_NUM(0); 927 else 928 ent = ED_Alloc (); 929 data = ED_ParseEdict (data, ent); 930 931 // remove things from different skill levels or deathmatch 932 if (deathmatch.value) 933 { 934 if (((int)ent->u.v.spawnflags & SPAWNFLAG_NOT_DEATHMATCH)) 935 { 936 ED_Free (ent); 937 inhibit++; 938 continue; 939 } 940 } 941 else if ((current_skill == 0 && ((int)ent->u.v.spawnflags & SPAWNFLAG_NOT_EASY)) 942 || (current_skill == 1 && ((int)ent->u.v.spawnflags & SPAWNFLAG_NOT_MEDIUM)) 943 || (current_skill >= 2 && ((int)ent->u.v.spawnflags & SPAWNFLAG_NOT_HARD)) ) 944 { 945 ED_Free (ent); 946 inhibit++; 947 continue; 948 } 949 950 // 951 // immediately call spawn function 952 // 953 if (!ent->u.v.classname) 954 { 955 Con_Printf ("No classname for:\n"); 956 ED_Print (ent); 957 ED_Free (ent); 958 continue; 959 } 960 961 // look for the spawn function 962 func = ED_FindFunction ( pr_strings + ent->u.v.classname ); 963 964 if (!func) 965 { 966 Con_Printf ("No spawn function for:\n"); 967 ED_Print (ent); 968 ED_Free (ent); 969 continue; 970 } 971 972 pr_global_struct->self = EDICT_TO_PROG(ent); 973 PR_ExecuteProgram (func - pr_functions); 974 } 975 976 Con_DPrintf ("%i entities inhibited\n", inhibit); 977 } 978 979 980 /* 981 =============== 982 PR_LoadProgs 983 =============== 984 */ 985 void PR_LoadProgs (void) 986 { 987 int i; 988 989 // flush the non-C variable lookup cache 990 for (i=0 ; i<GEFV_CACHESIZE ; i++) 991 gefvCache[i].field[0] = 0; 992 993 CRC_Init (&pr_crc); 994 995 progs = (dprograms_t *)COM_LoadHunkFile ("progs.dat"); 996 if (!progs) 997 Sys_Error ("PR_LoadProgs: couldn't load progs.dat"); 998 Con_DPrintf ("Programs occupy %iK.\n", com_filesize/1024); 999 1000 for (i=0 ; i<com_filesize ; i++) 1001 CRC_ProcessByte (&pr_crc, ((byte *)progs)[i]); 1002 1003 // byte swap the header 1004 for (i=0 ; i< (int) (sizeof(*progs)/4) ; i++) 1005 ((int *)progs)[i] = LittleLong ( ((int *)progs)[i] ); 1006 1007 if (progs->version != PROG_VERSION) 1008 Sys_Error ("progs.dat has wrong version number (%i should be %i)", progs->version, PROG_VERSION); 1009 if (progs->crc != PROGHEADER_CRC) 1010 Sys_Error ("progs.dat system vars have been modified, progdefs.h is out of date"); 1011 1012 pr_functions = (dfunction_t *)((byte *)progs + progs->ofs_functions); 1013 pr_strings = (char *)progs + progs->ofs_strings; 1014 pr_globaldefs = (ddef_t *)((byte *)progs + progs->ofs_globaldefs); 1015 pr_fielddefs = (ddef_t *)((byte *)progs + progs->ofs_fielddefs); 1016 pr_statements = (dstatement_t *)((byte *)progs + progs->ofs_statements); 1017 1018 pr_global_struct = (globalvars_t *)((byte *)progs + progs->ofs_globals); 1019 pr_globals = (float *)pr_global_struct; 1020 1021 pr_edict_size = progs->entityfields * 4 + sizeof (edict_t) - sizeof(entvars_t); 1022 1023 // byte swap the lumps 1024 for (i=0 ; i<progs->numstatements ; i++) 1025 { 1026 pr_statements[i].op = LittleShort(pr_statements[i].op); 1027 pr_statements[i].a = LittleShort(pr_statements[i].a); 1028 pr_statements[i].b = LittleShort(pr_statements[i].b); 1029 pr_statements[i].c = LittleShort(pr_statements[i].c); 1030 } 1031 1032 for (i=0 ; i<progs->numfunctions; i++) 1033 { 1034 pr_functions[i].first_statement = LittleLong (pr_functions[i].first_statement); 1035 pr_functions[i].parm_start = LittleLong (pr_functions[i].parm_start); 1036 pr_functions[i].s_name = LittleLong (pr_functions[i].s_name); 1037 pr_functions[i].s_file = LittleLong (pr_functions[i].s_file); 1038 pr_functions[i].numparms = LittleLong (pr_functions[i].numparms); 1039 pr_functions[i].locals = LittleLong (pr_functions[i].locals); 1040 } 1041 1042 for (i=0 ; i<progs->numglobaldefs ; i++) 1043 { 1044 pr_globaldefs[i].type = LittleShort (pr_globaldefs[i].type); 1045 pr_globaldefs[i].ofs = LittleShort (pr_globaldefs[i].ofs); 1046 pr_globaldefs[i].s_name = LittleLong (pr_globaldefs[i].s_name); 1047 } 1048 1049 for (i=0 ; i<progs->numfielddefs ; i++) 1050 { 1051 pr_fielddefs[i].type = LittleShort (pr_fielddefs[i].type); 1052 if (pr_fielddefs[i].type & DEF_SAVEGLOBAL) 1053 Sys_Error ("PR_LoadProgs: pr_fielddefs[i].type & DEF_SAVEGLOBAL"); 1054 pr_fielddefs[i].ofs = LittleShort (pr_fielddefs[i].ofs); 1055 pr_fielddefs[i].s_name = LittleLong (pr_fielddefs[i].s_name); 1056 } 1057 1058 for (i=0 ; i<progs->numglobals ; i++) 1059 ((int *)pr_globals)[i] = LittleLong (((int *)pr_globals)[i]); 1060 } 1061 1062 1063 /* 1064 =============== 1065 PR_Init 1066 =============== 1067 */ 1068 void PR_Init (void) 1069 { 1070 Cmd_AddCommand ("edict", ED_PrintEdict_f); 1071 Cmd_AddCommand ("edicts", ED_PrintEdicts); 1072 Cmd_AddCommand ("edictcount", ED_Count); 1073 Cmd_AddCommand ("profile", PR_Profile_f); 1074 Cvar_RegisterVariable (&nomonsters); 1075 Cvar_RegisterVariable (&gamecfg); 1076 Cvar_RegisterVariable (&scratch1); 1077 Cvar_RegisterVariable (&scratch2); 1078 Cvar_RegisterVariable (&scratch3); 1079 Cvar_RegisterVariable (&scratch4); 1080 Cvar_RegisterVariable (&savedgamecfg); 1081 Cvar_RegisterVariable (&saved1); 1082 Cvar_RegisterVariable (&saved2); 1083 Cvar_RegisterVariable (&saved3); 1084 Cvar_RegisterVariable (&saved4); 1085 } 1086 1087 1088 1089 edict_t *EDICT_NUM(int n) 1090 { 1091 if (n < 0 || n >= sv.max_edicts) 1092 Sys_Error ("EDICT_NUM: bad number %i", n); 1093 return (edict_t *)((byte *)sv.edicts+ (n)*pr_edict_size); 1094 } 1095 1096 int NUM_FOR_EDICT(edict_t *e) 1097 { 1098 int b; 1099 1100 b = (byte *)e - (byte *)sv.edicts; 1101 b = b / pr_edict_size; 1102 1103 if (b < 0 || b >= sv.num_edicts) 1104 Sys_Error ("NUM_FOR_EDICT: bad pointer"); 1105 return b; 1106 } 1107