// entities.c #include "light.h" entity_t entities[MAX_MAP_ENTITIES]; int num_entities; /* ============================================================================== ENTITY FILE PARSING If a light has a targetname, generate a unique style in the 32-63 range ============================================================================== */ int numlighttargets; char lighttargets[32][64]; int LightStyleForTargetname (char *targetname, qboolean alloc) { int i; for (i=0 ; ikey, key); strcpy (epair->value, com_token); epair->next = entity->epairs; entity->epairs = epair; if (!strcmp(key, "classname")) strcpy (entity->classname, com_token); else if (!strcmp(key, "target")) strcpy (entity->target, com_token); else if (!strcmp(key, "targetname")) strcpy (entity->targetname, com_token); else if (!strcmp(key, "origin")) { // scan into doubles, then assign // which makes it vec_t size independent if (sscanf(com_token, "%lf %lf %lf", &vec[0], &vec[1], &vec[2]) != 3) Error ("LoadEntities: not 3 values for origin"); for (i=0 ; i<3 ; i++) entity->origin[i] = vec[i]; } else if (!strncmp(key, "light", 5) || !strcmp (key, "_light") ) { entity->light = atof(com_token); } else if (!strcmp(key, "style")) { entity->style = atof(com_token); if ((unsigned)entity->style > 254) Error ("Bad light style %i (must be 0-254)", entity->style); } else if (!strcmp(key, "angle")) { entity->angle = atof(com_token); } } // all fields have been parsed if (!strncmp (entity->classname, "light", 5) && !entity->light) entity->light = DEFAULTLIGHTLEVEL; if (!strcmp (entity->classname, "light")) { if (entity->targetname[0] && !entity->style) { char s[16]; entity->style = LightStyleForTargetname (entity->targetname, true); sprintf (s,"%i", entity->style); SetKeyValue (entity, "style", s); } } } printf ("%d entities read\n", num_entities); MatchTargets (); } char *ValueForKey (entity_t *ent, char *key) { epair_t *ep; for (ep=ent->epairs ; ep ; ep=ep->next) if (!strcmp (ep->key, key) ) return ep->value; return ""; } void SetKeyValue (entity_t *ent, char *key, char *value) { epair_t *ep; for (ep=ent->epairs ; ep ; ep=ep->next) if (!strcmp (ep->key, key) ) { strcpy (ep->value, value); return; } ep = malloc (sizeof(*ep)); ep->next = ent->epairs; ent->epairs = ep; strcpy (ep->key, key); strcpy (ep->value, value); } float FloatForKey (entity_t *ent, char *key) { char *k; k = ValueForKey (ent, key); return atof(k); } void GetVectorForKey (entity_t *ent, char *key, vec3_t vec) { char *k; k = ValueForKey (ent, key); sscanf (k, "%lf %lf %lf", &vec[0], &vec[1], &vec[2]); } /* ================ WriteEntitiesToString ================ */ void WriteEntitiesToString (void) { char *buf, *end; epair_t *ep; char line[128]; int i; buf = dentdata; end = buf; *end = 0; printf ("%i switchable light styles\n", numlighttargets); for (i=0 ; inext) { sprintf (line, "\"%s\" \"%s\"\n", ep->key, ep->value); strcat (end, line); end += strlen(line); } strcat (end,"}\n"); end += 2; if (end > buf + MAX_MAP_ENTSTRING) Error ("Entity text too long"); } entdatasize = end - buf + 1; }