From 4a609b5eef6667f098a61f3e3aef35adc40b387a Mon Sep 17 00:00:00 2001 From: Nev3r Date: Sun, 15 Dec 2019 18:04:29 +0100 Subject: [PATCH] Add barebones multitag lists. They are not yet used anywhere for now. --- src/p_setup.c | 16 +++++++++++++++ src/p_spec.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/r_defs.h | 8 ++++++++ 3 files changed, 78 insertions(+) diff --git a/src/p_setup.c b/src/p_setup.c index 02c66e9bd..773d50cc4 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -377,6 +377,18 @@ UINT32 P_GetScoreForGrade(INT16 map, UINT8 mare, UINT8 grade) return mapheaderinfo[map-1]->grades[mare].grade[grade-1]; } +static void Tags_Add (tags_t* itemtags, const UINT16 tag) +{ + itemtags->numtags++; + + if (itemtags->numtags) + itemtags->tags = Z_Realloc(itemtags->tags, itemtags->numtags * sizeof(itemtags->tags), PU_LEVEL, NULL); + else + itemtags->tags = Z_Malloc(itemtags->numtags * sizeof(itemtags->tags), PU_LEVEL, NULL); + + itemtags->tags[itemtags->numtags - 1] = tag; +} + /** Loads the vertexes for a level. * * \param lump VERTEXES lump number. @@ -685,6 +697,7 @@ static void P_LoadRawSectors(UINT8 *data) ss->spawn_lightlevel = SHORT(ms->lightlevel); ss->special = SHORT(ms->special); ss->tag = SHORT(ms->tag); + Tags_Add(&(ss->tags), ss->tag); } } @@ -1035,7 +1048,10 @@ static void TextmapSector(UINT32 i, char *param) else if (fastcmp(param, "special")) sectors[i].special = atol(M_GetToken(NULL)); else if (fastcmp(param, "id")) + { sectors[i].tag = atol(M_GetToken(NULL)); + Tags_Add(§ors[i].tags, sectors[i].tag); + } else if (fastcmp(param, "xpanningfloor")) sectors[i].floor_xoffs = FLOAT_TO_FIXED(atof(M_GetToken(NULL))); else if (fastcmp(param, "ypanningfloor")) diff --git a/src/p_spec.c b/src/p_spec.c index 746360d76..5e5d9a29e 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1573,6 +1573,35 @@ void P_RunNightsCapsuleTouchExecutors(mobj_t *actor, boolean entering, boolean e } } +#define MAXTAGS 65536 +typedef struct{ + size_t* list; + size_t size; +} taggroup_t; + +taggroup_t* taglist_sec[MAXTAGS]; + +/** Insert an item id into a given taglist. + */ +static void Taglist_AddTo (const size_t tag, const size_t itemid) +{ + taggroup_t* group; + if (!taglist_sec[tag]) + { + taglist_sec[tag] = Z_Calloc(sizeof(taggroup_t), PU_LEVEL, NULL); + group = taglist_sec[tag]; + group->size = 1; + group->list = Z_Malloc(sizeof(size_t), PU_LEVEL, NULL); + } + else + { + group = taglist_sec[tag]; + group->size++; + group->list = Z_Realloc(group->list, group->size * sizeof(size_t), PU_LEVEL, NULL); + } + group->list[group->size - 1] = itemid; +} + /** Hashes the sector tags across the sectors and linedefs. * * \sa P_FindSectorFromTag, P_ChangeSectorTag @@ -1595,8 +1624,33 @@ static inline void P_InitTagLists(void) lines[i].nexttag = lines[j].firsttag; lines[j].firsttag = (INT32)i; } + + for (i = 0; i < MAXTAGS; i++) + taglist_sec[i] = NULL; + + for (i = 0; i < numsectors; i++) + { + if (sectors[i].tag > 0) + Taglist_AddTo(sectors[i].tag, i); + } + + for (i = 0; i < MAXTAGS; i++) + { + if (taglist_sec[i]) + { + taggroup_t* group = taglist_sec[i]; + size_t j; + CONS_Printf("Tag list for %u :\n", i); + for (j = 0; j < group->size; j++) + { + CONS_Printf("Sector %d\n", group->list[j]); + } + } + } } +#undef MAXTAGS + /** Finds minimum light from an adjacent sector. * * \param sector Sector to start in. diff --git a/src/r_defs.h b/src/r_defs.h index ad638410a..2a2cb15e7 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -75,6 +75,12 @@ typedef struct extracolormap_s struct extracolormap_s *prev; } extracolormap_t; +typedef struct +{ + UINT16* tags; + UINT16 numtags; +} tags_t; + // // INTERNAL MAP TYPES used by play and refresh // @@ -294,6 +300,7 @@ typedef struct sector_s INT16 special; UINT16 tag; INT32 nexttag, firsttag; // for fast tag searches + tags_t tags; // origin for any sounds played by the sector // also considered the center for e.g. Mario blocks @@ -418,6 +425,7 @@ typedef struct line_s INT16 flags; INT16 special; INT16 tag; + tags_t tags; // Visual appearance: sidedefs. UINT16 sidenum[2]; // sidenum[1] will be 0xffff if one-sided