diff --git a/src/p_ceilng.c b/src/p_ceilng.c index a6e8e8cda..e80859189 100644 --- a/src/p_ceilng.c +++ b/src/p_ceilng.c @@ -398,9 +398,10 @@ INT32 EV_DoCeiling(line_t *line, ceiling_e type) INT32 secnum = -1; sector_t *sec; ceiling_t *ceiling; + mtag_t tag = Tag_FGet(&line->tags); TAG_ITER_C - TAG_ITER_SECTORS(line->tag, secnum) + TAG_ITER_SECTORS(tag, secnum) { sec = §ors[secnum]; @@ -598,7 +599,7 @@ INT32 EV_DoCeiling(line_t *line, ceiling_e type) } - ceiling->tag = sec->tag; + ceiling->tag = tag; ceiling->type = type; firstone = 0; } @@ -619,9 +620,10 @@ INT32 EV_DoCrush(line_t *line, ceiling_e type) INT32 secnum = -1; sector_t *sec; ceiling_t *ceiling; + mtag_t tag = Tag_FGet(&line->tags); TAG_ITER_C - TAG_ITER_SECTORS(line->tag, secnum) + TAG_ITER_SECTORS(tag, secnum) { sec = §ors[secnum]; @@ -676,7 +678,7 @@ INT32 EV_DoCrush(line_t *line, ceiling_e type) break; } - ceiling->tag = sec->tag; + ceiling->tag = tag; ceiling->type = type; } return rtn; diff --git a/src/p_enemy.c b/src/p_enemy.c index 8f96c1dee..a51d76cb0 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3865,11 +3865,15 @@ void A_BossDeath(mobj_t *mo) else { // Bring the egg trap up to the surface + // Incredibly shitty code ahead junk.tag = LE_CAPSULE0; + Tag_FSet(&junk.tags, LE_CAPSULE0); EV_DoElevator(&junk, elevateHighest, false); junk.tag = LE_CAPSULE1; + Tag_FSet(&junk.tags, LE_CAPSULE1); EV_DoElevator(&junk, elevateUp, false); junk.tag = LE_CAPSULE2; + Tag_FSet(&junk.tags, LE_CAPSULE2); EV_DoElevator(&junk, elevateHighest, false); if (mapheaderinfo[gamemap-1]->muspostbossname[0] && @@ -3993,6 +3997,7 @@ bossjustdie: case MT_KOOPA: { junk.tag = LE_KOOPA; + Tag_FSet(&junk.tags, LE_KOOPA); EV_DoCeiling(&junk, raiseToHighest); return; } diff --git a/src/p_floor.c b/src/p_floor.c index bcb546a5c..91c264435 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -687,6 +687,7 @@ void T_BounceCheese(levelspecthink_t *bouncer) fixed_t floorheight; sector_t *actionsector; INT32 i; + mtag_t tag = Tag_FGet(&bouncer->sourceline->tags); TAG_ITER_C if (bouncer->sector->crumblestate == 4 || bouncer->sector->crumblestate == 1 @@ -702,7 +703,7 @@ void T_BounceCheese(levelspecthink_t *bouncer) } // You can use multiple target sectors, but at your own risk!!! - TAG_ITER_SECTORS(bouncer->sourceline->tag, i) + TAG_ITER_SECTORS(tag, i) { actionsector = §ors[i]; actionsector->moved = true; @@ -845,6 +846,7 @@ void T_StartCrumble(elevator_t *elevator) ffloor_t *rover; sector_t *sector; INT32 i; + mtag_t tag = Tag_FGet(&elevator->sourceline->tags); TAG_ITER_C // Once done, the no-return thinker just sits there, @@ -875,7 +877,7 @@ void T_StartCrumble(elevator_t *elevator) } else if (++elevator->distance == 0) // Reposition back to original spot { - TAG_ITER_SECTORS(elevator->sourceline->tag, i) + TAG_ITER_SECTORS(tag, i) { sector = §ors[i]; @@ -906,7 +908,7 @@ void T_StartCrumble(elevator_t *elevator) // Flash to indicate that the platform is about to return. if (elevator->distance > -224 && (leveltime % ((abs(elevator->distance)/8) + 1) == 0)) { - TAG_ITER_SECTORS(elevator->sourceline->tag, i) + TAG_ITER_SECTORS(tag, i) { sector = §ors[i]; @@ -1002,7 +1004,7 @@ void T_StartCrumble(elevator_t *elevator) P_RemoveThinker(&elevator->thinker); } - TAG_ITER_SECTORS(elevator->sourceline->tag, i) + TAG_ITER_SECTORS(tag, i) { sector = §ors[i]; sector->moved = true; @@ -1456,9 +1458,10 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies) msecnode_t *node; mobj_t *thing; boolean FOFsector = false; + mtag_t tag = Tag_FGet(&nobaddies->sourceline->tags); TAG_ITER_C - TAG_ITER_SECTORS(nobaddies->sourceline->tag, secnum) + TAG_ITER_SECTORS(tag, secnum) { sec = §ors[secnum]; @@ -1468,6 +1471,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies) for (i = 0; i < sec->linecount; i++) { INT32 targetsecnum = -1; + mtag_t tag2 = Tag_FGet(&sec->lines[i]->tags); TAG_ITER_C if (sec->lines[i]->special < 100 || sec->lines[i]->special >= 300) @@ -1475,7 +1479,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies) FOFsector = true; - TAG_ITER_SECTORS(sec->lines[i]->tag, targetsecnum) + TAG_ITER_SECTORS(tag2, targetsecnum) { targetsec = §ors[targetsecnum]; @@ -1513,7 +1517,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies) } } - CONS_Debug(DBG_GAMELOGIC, "Running no-more-enemies exec with tag of %d\n", nobaddies->sourceline->tag); + CONS_Debug(DBG_GAMELOGIC, "Running no-more-enemies exec with tag of %d\n", tag); // No enemies found, run the linedef exec and terminate this thinker P_RunTriggerLinedef(nobaddies->sourceline, NULL, NULL); @@ -1601,6 +1605,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) fixed_t bottomheight, topheight; msecnode_t *node; ffloor_t *rover; + mtag_t tag = Tag_FGet(&eachtime->sourceline->tags); TAG_ITER_C for (i = 0; i < MAXPLAYERS; i++) @@ -1622,7 +1627,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) playersOnArea[i] = false; } - TAG_ITER_SECTORS(eachtime->sourceline->tag, secnum) + TAG_ITER_SECTORS(tag, secnum) { sec = §ors[secnum]; @@ -1639,6 +1644,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) for (i = 0; i < sec->linecount; i++) { INT32 targetsecnum = -1; + mtag_t tag2 = Tag_FGet(&sec->lines[i]->tags); TAG_ITER_C if (sec->lines[i]->special < 100 || sec->lines[i]->special >= 300) @@ -1646,7 +1652,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) FOFsector = true; - TAG_ITER_SECTORS(sec->lines[i]->tag, targetsecnum) + TAG_ITER_SECTORS(tag2, targetsecnum) { targetsec = §ors[targetsecnum]; @@ -1828,7 +1834,7 @@ void T_EachTimeThinker(levelspecthink_t *eachtime) } } - CONS_Debug(DBG_GAMELOGIC, "Trying to activate each time executor with tag %d\n", eachtime->sourceline->tag); + CONS_Debug(DBG_GAMELOGIC, "Trying to activate each time executor with tag %d\n", tag); // 03/08/14 -Monster Iestyn // No more stupid hacks involving changing eachtime->sourceline's tag or special or whatever! @@ -1858,12 +1864,13 @@ void T_RaiseSector(levelspecthink_t *raise) boolean playeronme = false, active = false; fixed_t ceilingdestination, floordestination; result_e res = 0; + mtag_t tag = Tag_FGet(&raise->sourceline->tags); TAG_ITER_C if (raise->sector->crumblestate >= 3 || raise->sector->ceilingdata) return; - TAG_ITER_SECTORS(raise->sourceline->tag, i) + TAG_ITER_SECTORS(tag, i) { sector = §ors[i]; @@ -2056,7 +2063,7 @@ void T_RaiseSector(levelspecthink_t *raise) raise->sector->ceilspeed = 42; raise->sector->floorspeed = raise->vars[3]*raise->vars[8]; - TAG_ITER_SECTORS(raise->sourceline->tag, i) + TAG_ITER_SECTORS(tag, i) P_RecalcPrecipInSector(§ors[i]); } @@ -2173,9 +2180,10 @@ INT32 EV_DoFloor(line_t *line, floor_e floortype) INT32 secnum = -1; sector_t *sec; floormove_t *dofloor; + mtag_t tag = Tag_FGet(&line->tags); TAG_ITER_C - TAG_ITER_SECTORS(line->tag, secnum) + TAG_ITER_SECTORS(tag, secnum) { sec = §ors[secnum]; @@ -2393,10 +2401,11 @@ INT32 EV_DoElevator(line_t *line, elevator_e elevtype, boolean customspeed) INT32 rtn = 0; sector_t *sec; elevator_t *elevator; + mtag_t tag = Tag_FGet(&line->tags); TAG_ITER_C // act on all sectors with the same tag as the triggering linedef - TAG_ITER_SECTORS(line->tag, secnum) + TAG_ITER_SECTORS(tag, secnum) { sec = §ors[secnum]; @@ -2519,6 +2528,7 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover) INT16 flags; sector_t *controlsec = rover->master->frontsector; + mtag_t tag = Tag_FGet(&controlsec->tags); if (sec == NULL) { @@ -2547,9 +2557,9 @@ void EV_CrumbleChain(sector_t *sec, ffloor_t *rover) lifetime = 3*TICRATE; flags = 0; - if (controlsec->tag != 0) + if (tag != 0) { - INT32 tagline = Tag_FindLineSpecial(14, controlsec->tag); + INT32 tagline = Tag_FindLineSpecial(14, tag); if (tagline != -1) { if (sides[lines[tagline].sidenum[0]].toptexture) @@ -2725,6 +2735,7 @@ INT32 EV_StartCrumble(sector_t *sec, ffloor_t *rover, boolean floating, elevator_t *elevator; sector_t *foundsec; INT32 i; + mtag_t tag = Tag_FGet(&rover->master->tags); TAG_ITER_C // If floor is already activated, skip it @@ -2778,7 +2789,7 @@ INT32 EV_StartCrumble(sector_t *sec, ffloor_t *rover, boolean floating, elevator->sector->crumblestate = 2; - TAG_ITER_SECTORS(elevator->sourceline->tag, i) + TAG_ITER_SECTORS(tag, i) { foundsec = §ors[i]; @@ -2822,7 +2833,7 @@ INT32 EV_MarioBlock(ffloor_t *rover, sector_t *sector, mobj_t *puncher) // Set up the fields block->sector = roversec; - block->vars[0] = sector->tag; // actionsector + block->vars[0] = Tag_FGet(§or->tags); // actionsector block->vars[1] = 4*FRACUNIT; // speed block->vars[2] = 1; // Up // direction block->vars[3] = block->sector->floorheight; // floorwasheight diff --git a/src/p_inter.c b/src/p_inter.c index 30e3c31b1..0cdbe57b2 100644 --- a/src/p_inter.c +++ b/src/p_inter.c @@ -1377,6 +1377,7 @@ void P_TouchSpecialThing(mobj_t *special, mobj_t *toucher, boolean heightcheck) return; junk.tag = LE_AXE; + Tag_FSet(&junk.tags, LE_AXE); EV_DoElevator(&junk, bridgeFall, false); // scan the remaining thinkers to find koopa diff --git a/src/p_mobj.c b/src/p_mobj.c index a65d3bbf3..180376727 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -3548,16 +3548,19 @@ static boolean P_CameraCheckHeat(camera_t *thiscam) { sector_t *sector; fixed_t halfheight = thiscam->z + (thiscam->height >> 1); + size_t i; // see if we are in water sector = thiscam->subsector->sector; - if (Tag_FindLineSpecial(13, sector->tag) != -1) - return true; + for (i = 0; i < sector->tags.count; i++) + if (Tag_FindLineSpecial(13, sector->tags.tags[i]) != -1) + return true; if (sector->ffloors) { ffloor_t *rover; + size_t j; for (rover = sector->ffloors; rover; rover = rover->next) { @@ -3573,7 +3576,8 @@ static boolean P_CameraCheckHeat(camera_t *thiscam) *rover->bottomheight)) continue; - if (Tag_FindLineSpecial(13, rover->master->frontsector->tag) != -1) + for (j = 0; j < rover->master->frontsector->tags.count; j++) + if (Tag_FindLineSpecial(13, rover->master->frontsector->tags.tags[j]) != -1) return true; } } diff --git a/src/p_spec.c b/src/p_spec.c index 6c47e24c1..a0c46f3ac 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1000,7 +1000,7 @@ static boolean PolyDoor(line_t *line) { polydoordata_t pdd; - pdd.polyObjNum = line->tag; // polyobject id + pdd.polyObjNum = Tag_FGet(&line->tags); // polyobject id switch(line->special) { @@ -1041,7 +1041,7 @@ static boolean PolyMove(line_t *line) { polymovedata_t pmd; - pmd.polyObjNum = line->tag; + pmd.polyObjNum = Tag_FGet(&line->tags); pmd.speed = sides[line->sidenum[0]].textureoffset / 8; pmd.angle = R_PointToAngle2(line->v1->x, line->v1->y, line->v2->x, line->v2->y); pmd.distance = sides[line->sidenum[0]].rowoffset; @@ -1059,7 +1059,7 @@ static boolean PolyMove(line_t *line) // static void PolyInvisible(line_t *line) { - INT32 polyObjNum = line->tag; + INT32 polyObjNum = Tag_FGet(&line->tags); polyobj_t *po; if (!(po = Polyobj_GetForNum(polyObjNum))) @@ -1087,7 +1087,7 @@ static void PolyInvisible(line_t *line) // static void PolyVisible(line_t *line) { - INT32 polyObjNum = line->tag; + INT32 polyObjNum = Tag_FGet(&line->tags); polyobj_t *po; if (!(po = Polyobj_GetForNum(polyObjNum))) @@ -1115,7 +1115,7 @@ static void PolyVisible(line_t *line) // static void PolyTranslucency(line_t *line) { - INT32 polyObjNum = line->tag; + INT32 polyObjNum = Tag_FGet(&line->tags); polyobj_t *po; if (!(po = Polyobj_GetForNum(polyObjNum))) @@ -1156,7 +1156,7 @@ static void PolyTranslucency(line_t *line) // static boolean PolyFade(line_t *line) { - INT32 polyObjNum = line->tag; + INT32 polyObjNum = Tag_FGet(&line->tags); polyobj_t *po; polyfadedata_t pfd; @@ -1227,7 +1227,7 @@ static boolean PolyWaypoint(line_t *line) { polywaypointdata_t pwd; - pwd.polyObjNum = line->tag; + pwd.polyObjNum = Tag_FGet(&line->tags); pwd.speed = sides[line->sidenum[0]].textureoffset / 8; pwd.sequence = sides[line->sidenum[0]].rowoffset >> FRACBITS; // Sequence # pwd.reverse = (line->flags & ML_EFFECT1) == ML_EFFECT1; // Reverse? @@ -1247,7 +1247,7 @@ static boolean PolyRotate(line_t *line) { polyrotdata_t prd; - prd.polyObjNum = line->tag; + prd.polyObjNum = Tag_FGet(&line->tags); prd.speed = sides[line->sidenum[0]].textureoffset >> FRACBITS; // angular speed prd.distance = sides[line->sidenum[0]].rowoffset >> FRACBITS; // angular distance @@ -1276,7 +1276,7 @@ static boolean PolyDisplace(line_t *line) { polydisplacedata_t pdd; - pdd.polyObjNum = line->tag; + pdd.polyObjNum = Tag_FGet(&line->tags); pdd.controlSector = line->frontsector; pdd.dx = line->dx>>8; @@ -1293,7 +1293,7 @@ static boolean PolyRotDisplace(line_t *line) polyrotdisplacedata_t pdd; fixed_t anginter, distinter; - pdd.polyObjNum = line->tag; + pdd.polyObjNum = Tag_FGet(&line->tags); pdd.controlSector = line->frontsector; // Rotate 'anginter' interval for each 'distinter' interval from the control sector. @@ -2412,12 +2412,12 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // (formerly "Change calling sectors' tag", but behavior was changed) { TAG_ITER_SECTORS(tag, secnum) - P_ChangeSectorTag(secnum,(INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); + Tag_SectorFSet(secnum,(INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); break; } case 410: // Change front sector's tag - P_ChangeSectorTag((UINT32)(line->frontsector - sectors), (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); + Tag_SectorFSet((UINT32)(line->frontsector - sectors), (INT16)(sides[line->sidenum[0]].textureoffset>>FRACBITS)); break; case 411: // Stop floor/ceiling movement in tagged sector(s) @@ -2626,7 +2626,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) if (!camobj) continue; - if (foundit || (camobj->subsector->sector->tag == tag)) + if (foundit || Tag_Find(&camobj->subsector->sector->tags, tag)) { foundit = true; break; @@ -2635,7 +2635,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) // Only trigger if mobj is touching the tag for(rover = camobj->subsector->sector->ffloors; rover; rover = rover->next) { - if (rover->master->frontsector->tag != tag) + if (!Tag_Find(&rover->master->frontsector->tags, tag)) continue; if (camobj->z > P_GetSpecialTopZ(camobj, sectors + rover->secnum, camobj->subsector->sector)) @@ -3092,7 +3092,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) for (rover = sec->ffloors; rover; rover = rover->next) { - if (rover->master->frontsector->tag == foftag) + if (Tag_Find(&rover->master->frontsector->tags, foftag)) { foundrover = true; @@ -3277,7 +3277,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) for (rover = sec->ffloors; rover; rover = rover->next) { - if (rover->master->frontsector->tag == foftag) + if (Tag_Find(&rover->master->frontsector->tags, foftag)) { foundrover = true; @@ -3335,7 +3335,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) for (rover = sec->ffloors; rover; rover = rover->next) { - if (rover->master->frontsector->tag == foftag) + if (Tag_Find(&rover->master->frontsector->tags, foftag)) { foundrover = true; @@ -3520,7 +3520,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) for (rover = sec->ffloors; rover; rover = rover->next) { - if (rover->master->frontsector->tag == foftag) + if (Tag_Find(&rover->master->frontsector->tags, foftag)) { foundrover = true; @@ -3584,7 +3584,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) for (rover = sec->ffloors; rover; rover = rover->next) { - if (rover->master->frontsector->tag == foftag) + if (Tag_Find(&rover->master->frontsector->tags, foftag)) { foundrover = true; @@ -3669,7 +3669,7 @@ static void P_ProcessLineSpecial(line_t *line, mobj_t *mo, sector_t *callsec) for (rover = sec->ffloors; rover; rover = rover->next) { - if (rover->master->frontsector->tag == foftag) + if (Tag_Find(&rover->master->frontsector->tags, foftag)) { foundrover = true; @@ -5774,7 +5774,7 @@ static ffloor_t *P_AddFakeFloor(sector_t *sec, sector_t *sec2, line_t *master, f if ((flags & FF_FLOATBOB)) { - P_AddFloatThinker(sec2, sec->tag, master); + P_AddFloatThinker(sec2, Tag_FGet(&master->tags), master); CheckForFloatBob = true; } @@ -6011,7 +6011,7 @@ static inline void P_AddThwompThinker(sector_t *sec, sector_t *actionsector, lin // set up the fields according to the type of elevator action thwomp->sector = sec; - thwomp->vars[0] = actionsector->tag; + thwomp->vars[0] = Tag_FGet(&sourceline->tags); thwomp->floorwasheight = thwomp->sector->floorheight; thwomp->ceilingwasheight = thwomp->sector->ceilingheight; thwomp->direction = 0; @@ -6572,11 +6572,11 @@ void P_SpawnSpecials(boolean fromnetsave) Add_MasterDisappearer(abs(lines[i].dx>>FRACBITS), abs(lines[i].dy>>FRACBITS), abs(sides[lines[i].sidenum[0]].sector->floorheight>>FRACBITS), (INT32)(sectors[s].lines[j]-lines), (INT32)i); } else // Find FOFs by effect sector tag { - TAG_ITER_LINES((lines + i)->tag, s) + TAG_ITER_LINES(tag, s) { if ((size_t)s == i) continue; - if (sides[lines[s].sidenum[0]].sector->tag == sides[lines[i].sidenum[0]].sector->tag) + if (Tag_Find(&sides[lines[s].sidenum[0]].sector->tags, Tag_FGet(&sides[lines[i].sidenum[0]].sector->tags))) Add_MasterDisappearer(abs(lines[i].dx>>FRACBITS), abs(lines[i].dy>>FRACBITS), abs(sides[lines[i].sidenum[0]].sector->floorheight>>FRACBITS), s, (INT32)i); } }