game: Add fields used in misc_flare

Based on [ED_LoadColor](https://github.com/id-Software/quake2-rerelease-dll).
This commit is contained in:
Denis Pauk 2024-10-17 00:59:17 +03:00
parent 4f1e668eb7
commit 17603050b6
4 changed files with 65 additions and 1 deletions

View file

@ -349,6 +349,54 @@ ED_NewString(const char *string)
return newb; return newb;
} }
static unsigned
ED_ParseColorField(const char *value)
{
/* space means rgba as values */
if (strchr(value, ' '))
{
float v[4] = { 0, 0, 0, 1.0f };
qboolean is_float = true;
char color_buffer[16], *tmp;
int i;
strncpy(color_buffer, value, sizeof(color_buffer) - 1);
tmp = color_buffer;
for (i = 0; i < 4; i++)
{
v[i] = (float)strtod(COM_Parse(&tmp), (char **)NULL);
if (v[i] > 1.0f)
{
is_float = false;
}
if (!tmp)
{
break;
}
}
/* convert to bytes */
if (is_float)
{
for (i = 0; i < 4; i++)
{
v[i] *= 255.f;
}
}
return ((byte)v[3]) |
(((byte)v[2]) << 8) |
(((byte)v[1]) << 16) |
(((byte)v[0]) << 24);
}
/* integral */
return atoi(value);
}
/* /*
* Takes a key/value pair and sets * Takes a key/value pair and sets
* the binary values in an edict * the binary values in an edict
@ -403,6 +451,9 @@ ED_ParseField(const char *key, const char *value, edict_t *ent)
((float *)(b + f->ofs))[1] = v; ((float *)(b + f->ofs))[1] = v;
((float *)(b + f->ofs))[2] = 0; ((float *)(b + f->ofs))[2] = 0;
break; break;
case F_RGBA:
*(unsigned *)(b + f->ofs) = ED_ParseColorField(value);
break;
case F_IGNORE: case F_IGNORE:
break; break;
default: default:

View file

@ -410,6 +410,11 @@ typedef struct
float maxyaw; float maxyaw;
float minpitch; float minpitch;
float maxpitch; float maxpitch;
float radius;
float fade_start_dist;
float fade_end_dist;
char *image;
} spawn_temp_t; } spawn_temp_t;
typedef struct typedef struct
@ -712,7 +717,8 @@ typedef enum
F_CLIENT, /* index on disk, pointer in memory */ F_CLIENT, /* index on disk, pointer in memory */
F_FUNCTION, F_FUNCTION,
F_MMOVE, F_MMOVE,
F_IGNORE F_IGNORE,
F_RGBA,
} fieldtype_t; } fieldtype_t;
typedef struct typedef struct

View file

@ -417,6 +417,7 @@ WriteField1(FILE *f, field_t *field, byte *base)
case F_ANGLEHACK: case F_ANGLEHACK:
case F_VECTOR: case F_VECTOR:
case F_IGNORE: case F_IGNORE:
case F_RGBA:
break; break;
case F_LSTRING: case F_LSTRING:
@ -614,6 +615,7 @@ ReadField(FILE *f, field_t *field, byte *base)
case F_ANGLEHACK: case F_ANGLEHACK:
case F_VECTOR: case F_VECTOR:
case F_IGNORE: case F_IGNORE:
case F_RGBA:
break; break;
case F_LSTRING: case F_LSTRING:

View file

@ -58,6 +58,11 @@
{"origin", FOFS(s.origin), F_VECTOR}, {"origin", FOFS(s.origin), F_VECTOR},
{"angles", FOFS(s.angles), F_VECTOR}, {"angles", FOFS(s.angles), F_VECTOR},
{"angle", FOFS(s.angles), F_ANGLEHACK}, {"angle", FOFS(s.angles), F_ANGLEHACK},
{"rgba", FOFS(s.skinnum), F_RGBA},
{"radius", STOFS(radius), F_FLOAT, FFL_SPAWNTEMP},
{"fade_start_dist", STOFS(fade_start_dist), F_FLOAT, FFL_SPAWNTEMP},
{"fade_end_dist", STOFS(fade_end_dist), F_FLOAT, FFL_SPAWNTEMP},
{"image", STOFS(image), F_LSTRING, FFL_SPAWNTEMP},
{"goalentity", FOFS(goalentity), F_EDICT, FFL_NOSPAWN}, {"goalentity", FOFS(goalentity), F_EDICT, FFL_NOSPAWN},
{"movetarget", FOFS(movetarget), F_EDICT, FFL_NOSPAWN}, {"movetarget", FOFS(movetarget), F_EDICT, FFL_NOSPAWN},
{"enemy", FOFS(enemy), F_EDICT, FFL_NOSPAWN}, {"enemy", FOFS(enemy), F_EDICT, FFL_NOSPAWN},