146 lines
3.1 KiB
C
146 lines
3.1 KiB
C
#include "taglist.h"
|
|
#include "z_zone.h"
|
|
#include "r_data.h"
|
|
|
|
void Tag_Add (taglist_t* list, const mtag_t tag)
|
|
{
|
|
list->tags = Z_Realloc(list->tags, (list->count + 1) * sizeof(list->tags), PU_LEVEL, NULL);
|
|
list->tags[list->count++] = tag;
|
|
}
|
|
|
|
boolean Tag_Compare (const taglist_t* list1, const taglist_t* list2)
|
|
{
|
|
size_t i;
|
|
|
|
if (list1->count != list2->count)
|
|
return false;
|
|
|
|
for (i = 0; i < list1->count; i++)
|
|
if (list1->tags[i] != list2->tags[i])
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
void Taglist_AddToSectors (const mtag_t tag, const size_t itemid)
|
|
{
|
|
taggroup_t* tagelems;
|
|
|
|
if (tag == MTAG_GLOBAL)
|
|
return;
|
|
|
|
if (!tags_sectors[(UINT16)tag])
|
|
tags_sectors[(UINT16)tag] = Z_Calloc(sizeof(taggroup_t), PU_LEVEL, NULL);
|
|
|
|
tagelems = tags_sectors[(UINT16)tag];
|
|
tagelems->count++;
|
|
tagelems->elements = Z_Realloc(tagelems->elements, tagelems->count * sizeof(size_t), PU_LEVEL, NULL);
|
|
tagelems->elements[tagelems->count - 1] = itemid;
|
|
}
|
|
|
|
void Taglist_AddToLines (const mtag_t tag, const size_t itemid)
|
|
{
|
|
taggroup_t* tagelems;
|
|
|
|
if (tag == MTAG_GLOBAL)
|
|
return;
|
|
|
|
if (!tags_lines[(UINT16)tag])
|
|
tags_lines[(UINT16)tag] = Z_Calloc(sizeof(taggroup_t), PU_LEVEL, NULL);
|
|
|
|
tagelems = tags_lines[(UINT16)tag];
|
|
tagelems->count++;
|
|
tagelems->elements = Z_Realloc(tagelems->elements, tagelems->count * sizeof(size_t), PU_LEVEL, NULL);
|
|
tagelems->elements[tagelems->count - 1] = itemid;
|
|
}
|
|
|
|
void Taglist_AddToMapthings (const mtag_t tag, const size_t itemid)
|
|
{
|
|
taggroup_t* tagelems;
|
|
|
|
if (tag == MTAG_GLOBAL)
|
|
return;
|
|
|
|
if (!tags_mapthings[(UINT16)tag])
|
|
tags_mapthings[(UINT16)tag] = Z_Calloc(sizeof(taggroup_t), PU_LEVEL, NULL);
|
|
|
|
tagelems = tags_mapthings[(UINT16)tag];
|
|
tagelems->count++;
|
|
tagelems->elements = Z_Realloc(tagelems->elements, tagelems->count * sizeof(size_t), PU_LEVEL, NULL);
|
|
tagelems->elements[tagelems->count - 1] = itemid;
|
|
}
|
|
|
|
INT32 Tag_Iterate_Sectors (const mtag_t tag, const size_t p)
|
|
{
|
|
if (tag == MTAG_GLOBAL)
|
|
{
|
|
if (p < numsectors)
|
|
return p;
|
|
return -1;
|
|
}
|
|
|
|
if (tags_sectors[(UINT16)tag])
|
|
{
|
|
if (p < tags_sectors[(UINT16)tag]->count)
|
|
return tags_sectors[(UINT16)tag]->elements[p];
|
|
return -1;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
INT32 Tag_Iterate_Lines (const mtag_t tag, const size_t p)
|
|
{
|
|
if (tag == MTAG_GLOBAL)
|
|
{
|
|
if (p < numlines)
|
|
return p;
|
|
return -1;
|
|
}
|
|
|
|
if (tags_lines[(UINT16)tag])
|
|
{
|
|
if (p < tags_lines[(UINT16)tag]->count)
|
|
return tags_lines[(UINT16)tag]->elements[p];
|
|
return -1;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
INT32 Tag_Iterate_Things (const mtag_t tag, const size_t p)
|
|
{
|
|
if (tag == MTAG_GLOBAL)
|
|
{
|
|
if (p < nummapthings)
|
|
return p;
|
|
return -1;
|
|
}
|
|
|
|
if (tags_mapthings[(UINT16)tag])
|
|
{
|
|
if (p < tags_mapthings[(UINT16)tag]->count)
|
|
return tags_mapthings[(UINT16)tag]->elements[p];
|
|
return -1;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
INT32 Tag_FindLineSpecial(const INT16 special, const mtag_t tag)
|
|
{
|
|
INT32 i;
|
|
|
|
if (tag == MTAG_GLOBAL)
|
|
{
|
|
for (i = 0; i < numlines; i++)
|
|
if (lines[i].special == special)
|
|
return i;
|
|
}
|
|
else if (tags_lines[(UINT16)tag])
|
|
{
|
|
taggroup_t *tagged = tags_lines[(UINT16)tag];
|
|
for (i = 0; i < tagged->count; i++)
|
|
if (lines[tagged->elements[i]].special == special)
|
|
return tagged->elements[i];
|
|
}
|
|
return -1;
|
|
}
|