game: load daikatana entities types list

This commit is contained in:
Denis Pauk 2024-09-18 01:25:06 +03:00
parent 081050ad18
commit 718202f84e
1 changed files with 206 additions and 38 deletions

View File

@ -1680,13 +1680,13 @@ Widowlegs_Spawn(vec3_t startpos, vec3_t angles)
} }
static char * static char *
DynamicStringParse(char *line, char *field, int size) DynamicStringParse(char *line, char *field, int size, char separator)
{ {
char *next_section, *current_section; char *next_section, *current_section;
/* search line end */ /* search line end */
current_section = line; current_section = line;
next_section = strchr(line, '|'); next_section = strchr(line, separator);
if (next_section) if (next_section)
{ {
*next_section = 0; *next_section = 0;
@ -1716,7 +1716,28 @@ DynamicIntParse(char *line, int *field)
} }
static char * static char *
DynamicFloatParse(char *line, float *field, int size) DynamicFloatParse(char *line, float *field, int size, char separator)
{
int i;
for (i = 0; i < size; i++)
{
char *next_section, *current_section;
current_section = line;
next_section = strchr(line, separator);
if (next_section)
{
*next_section = 0;
line = next_section + 1;
}
field[i] = (float)strtod(current_section, (char **)NULL);
}
return line;
}
static char *
DynamicSkipParse(char *line, int size, char separator)
{ {
int i; int i;
@ -1724,11 +1745,10 @@ DynamicFloatParse(char *line, float *field, int size)
{ {
char *next_section; char *next_section;
next_section = strchr(line, '|'); next_section = strchr(line, separator);
if (next_section) if (next_section)
{ {
*next_section = 0; *next_section = 0;
field[i] = (float)strtod(line, (char **)NULL);
line = next_section + 1; line = next_section + 1;
} }
} }
@ -1748,32 +1768,81 @@ DynamicSort(const void *p1, const void *p2)
void void
DynamicSpawnInit(void) DynamicSpawnInit(void)
{ {
char *buf, *raw; char *buf_ent, *buf_ai, *raw;
int len, curr_pos; int len_ent, len_ai, curr_pos;
buf = NULL; buf_ent = NULL;
len = 0; len_ent = 0;
buf_ai = NULL;
len_ai = 0;
dynamicentities = NULL; dynamicentities = NULL;
ndynamicentities = 0; ndynamicentities = 0;
/* load the file */ /* load the aidata file */
len = gi.FS_LoadFile("models/entity.dat", (void **)&raw); len_ai = gi.FS_LoadFile("aidata.vsc", (void **)&raw);
if (len > 1) if (len_ai > 1)
{ {
buf = malloc(len + 1); if (len_ai > 4 && !strncmp(raw, "CVSC", 4))
memcpy(buf, raw, len); {
buf[len] = 0; int i;
len_ai -= 4;
buf_ai = malloc(len_ai + 1);
memcpy(buf_ai, raw + 4, len_ai);
for (i = 0; i < len_ai; i++)
{
buf_ai[i] = buf_ai[i] ^ 0x96;
}
buf_ai[len_ai] = 0;
}
gi.FS_FreeFile(raw); gi.FS_FreeFile(raw);
} }
/* definition lines count */ /* load the file */
if (buf) len_ent = gi.FS_LoadFile("models/entity.dat", (void **)&raw);
if (len_ent > 1)
{
buf_ent = malloc(len_ent + 1);
memcpy(buf_ent, raw, len_ent);
buf_ent[len_ent] = 0;
gi.FS_FreeFile(raw);
}
/* aidata definition lines count */
if (buf_ai)
{ {
char *curr; char *curr;
/* get lines count */ /* get lines count */
curr = buf; curr = buf_ai;
while(*curr)
{
size_t linesize = 0;
linesize = strcspn(curr, "\n\r");
if (*curr && *curr != '\n' && *curr != '\r' && *curr != ',')
{
ndynamicentities ++;
}
curr += linesize;
if (curr >= (buf_ai + len_ai))
{
break;
}
/* skip our endline */
curr++;
}
}
/* entitiyty definition lines count */
if (buf_ent)
{
char *curr;
/* get lines count */
curr = buf_ent;
while(*curr) while(*curr)
{ {
size_t linesize = 0; size_t linesize = 0;
@ -1785,7 +1854,7 @@ DynamicSpawnInit(void)
ndynamicentities ++; ndynamicentities ++;
} }
curr += linesize; curr += linesize;
if (curr >= (buf + len)) if (curr >= (buf_ent + len_ent))
{ {
break; break;
} }
@ -1801,13 +1870,114 @@ DynamicSpawnInit(void)
} }
curr_pos = 0; curr_pos = 0;
/* load definitons count */ if (buf_ai)
if (buf)
{ {
char *curr; char *curr;
/* get lines count */ /* get lines count */
curr = buf; curr = buf_ai;
while(*curr)
{
size_t linesize = 0;
if (curr_pos >= ndynamicentities)
{
break;
}
/* skip empty */
linesize = strspn(curr, "\n\r\t ");
curr += linesize;
/* mark end line */
linesize = strcspn(curr, "\n\r");
curr[linesize] = 0;
if (*curr && *curr != '\n' && *curr != '\r' && *curr != ',')
{
char *line, scale[MAX_QPATH];
line = curr;
line = DynamicStringParse(line, dynamicentities[curr_pos].classname, MAX_QPATH, ',');
line = DynamicStringParse(line, dynamicentities[curr_pos].model_path, MAX_QPATH, ',');
/*
* Skipped:
* audio file definition
* health
* basehealth
* elasticity
* mass
* angle speed
*/
line = DynamicSkipParse(line, 6, ',');
line = DynamicFloatParse(line, dynamicentities[curr_pos].mins, 3, ',');
line = DynamicFloatParse(line, dynamicentities[curr_pos].maxs, 3, ',');
line = DynamicStringParse(line, scale, MAX_QPATH, ',');
/* parse to 3 floats */
DynamicFloatParse(scale, dynamicentities[curr_pos].scale, 3, ' ');
/*
* Ignored fields:
* active distance
* attack distance
* jump attack distance
* upward velocity
* run speed
* walk speed
* attack speed
* fov
* X weapon1Offset
* Y weapon1Offset
* Z weapon1Offset
* base damage
* random damage
* spread x
* spread z
* speed
* distance
* X weapon2Offset
* Y weapon2Offset
* Z weapon2Offset
* base damage
* random damage
* spread x
* spread z
* speed
* distance
* X weapon3Offset
* Y weapon3Offset
* Z weapon3Offset
* base damage
* random damage
* spread x
* spread z
* speed
* distance
* min attenuation
* max attenuation
*/
curr_pos ++;
}
curr += linesize;
if (curr >= (buf_ai + len_ai))
{
break;
}
/* skip our endline */
curr++;
}
free(buf_ai);
}
/* load definitons count */
if (buf_ent)
{
char *curr;
/* get lines count */
curr = buf_ent;
while(*curr) while(*curr)
{ {
size_t linesize = 0; size_t linesize = 0;
@ -1831,29 +2001,29 @@ DynamicSpawnInit(void)
char *line; char *line;
line = curr; line = curr;
line = DynamicStringParse(line, dynamicentities[curr_pos].classname, MAX_QPATH); line = DynamicStringParse(line, dynamicentities[curr_pos].classname, MAX_QPATH, '|');
line = DynamicStringParse(line, dynamicentities[curr_pos].model_path, MAX_QPATH); line = DynamicStringParse(line, dynamicentities[curr_pos].model_path, MAX_QPATH, '|');
line = DynamicFloatParse(line, dynamicentities[curr_pos].scale, 3); line = DynamicFloatParse(line, dynamicentities[curr_pos].scale, 3, '|');
line = DynamicStringParse(line, dynamicentities[curr_pos].entity_type, MAX_QPATH); line = DynamicStringParse(line, dynamicentities[curr_pos].entity_type, MAX_QPATH, '|');
line = DynamicFloatParse(line, dynamicentities[curr_pos].mins, 3); line = DynamicFloatParse(line, dynamicentities[curr_pos].mins, 3, '|');
line = DynamicFloatParse(line, dynamicentities[curr_pos].maxs, 3); line = DynamicFloatParse(line, dynamicentities[curr_pos].maxs, 3, '|');
line = DynamicStringParse(line, dynamicentities[curr_pos].noshadow, MAX_QPATH); line = DynamicStringParse(line, dynamicentities[curr_pos].noshadow, MAX_QPATH, '|');
line = DynamicIntParse(line, &dynamicentities[curr_pos].solidflag); line = DynamicIntParse(line, &dynamicentities[curr_pos].solidflag);
line = DynamicFloatParse(line, &dynamicentities[curr_pos].walk_speed, 1); line = DynamicFloatParse(line, &dynamicentities[curr_pos].walk_speed, 1, '|');
line = DynamicFloatParse(line, &dynamicentities[curr_pos].run_speed, 1); line = DynamicFloatParse(line, &dynamicentities[curr_pos].run_speed, 1, '|');
line = DynamicIntParse(line, &dynamicentities[curr_pos].speed); line = DynamicIntParse(line, &dynamicentities[curr_pos].speed);
line = DynamicIntParse(line, &dynamicentities[curr_pos].lighting); line = DynamicIntParse(line, &dynamicentities[curr_pos].lighting);
line = DynamicIntParse(line, &dynamicentities[curr_pos].blending); line = DynamicIntParse(line, &dynamicentities[curr_pos].blending);
line = DynamicStringParse(line, dynamicentities[curr_pos].target_sequence, MAX_QPATH); line = DynamicStringParse(line, dynamicentities[curr_pos].target_sequence, MAX_QPATH, '|');
line = DynamicIntParse(line, &dynamicentities[curr_pos].misc_value); line = DynamicIntParse(line, &dynamicentities[curr_pos].misc_value);
line = DynamicIntParse(line, &dynamicentities[curr_pos].no_mip); line = DynamicIntParse(line, &dynamicentities[curr_pos].no_mip);
line = DynamicStringParse(line, dynamicentities[curr_pos].spawn_sequence, MAX_QPATH); line = DynamicStringParse(line, dynamicentities[curr_pos].spawn_sequence, MAX_QPATH, '|');
line = DynamicStringParse(line, dynamicentities[curr_pos].description, MAX_QPATH); line = DynamicStringParse(line, dynamicentities[curr_pos].description, MAX_QPATH, '|');
curr_pos ++; curr_pos ++;
} }
curr += linesize; curr += linesize;
if (curr >= (buf + len)) if (curr >= (buf_ent + len_ent))
{ {
break; break;
} }
@ -1861,9 +2031,7 @@ DynamicSpawnInit(void)
curr++; curr++;
} }
ndynamicentities = curr_pos; free(buf_ent);
free(buf);
} }
/* save last used position */ /* save last used position */