home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 113 / EnigmaAmiga113CD.iso / software / sviluppo / quakeworld_src / server / pr_edict.c.orig < prev    next >
Text File  |  2000-06-17  |  23KB  |  1,086 lines

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