diff --git a/src/p_floor.c b/src/p_floor.c index 1c396c87..91121301 100644 --- a/src/p_floor.c +++ b/src/p_floor.c @@ -1163,7 +1163,7 @@ void T_SpikeSector(levelspecthink_t *spikes) node = spikes->sector->touching_thinglist; // things touching this sector - for (; node; node = node->m_snext) + for (; node; node = node->m_thinglist_next) { thing = node->m_thing; if (!thing->player) @@ -1316,7 +1316,7 @@ void T_BridgeThinker(levelspecthink_t *bridge) controlsec = §ors[k]; // Is a player standing on me? - for (node = sector->touching_thinglist; node; node = node->m_snext) + for (node = sector->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -1739,7 +1739,7 @@ wegotit: static mobj_t *SearchMarioNode(msecnode_t *node) { mobj_t *thing = NULL; - for (; node; node = node->m_snext) + for (; node; node = node->m_thinglist_next) { // Things which should NEVER be ejected from a MarioBlock, by type. switch (node->m_thing->type) @@ -2003,7 +2003,7 @@ void T_NoEnemiesSector(levelspecthink_t *nobaddies) goto foundenemy; } - node = node->m_snext; + node = node->m_thinglist_next; } } } @@ -2288,7 +2288,7 @@ void T_RaiseSector(levelspecthink_t *raise) sector = §ors[i]; // Is a player standing on me? - for (node = sector->touching_thinglist; node; node = node->m_snext) + for (node = sector->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; diff --git a/src/p_map.c b/src/p_map.c index 71adf2e1..44df3001 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3365,7 +3365,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) for (i = 0; i < sector->numattached; i++) { sec = §ors[sector->attached[i]]; - for (n = sec->touching_thinglist; n; n = n->m_snext) + for (n = sec->touching_thinglist; n; n = n->m_thinglist_next) n->visited = false; sec->moved = true; @@ -3377,7 +3377,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) do { - for (n = sec->touching_thinglist; n; n = n->m_snext) + for (n = sec->touching_thinglist; n; n = n->m_thinglist_next) if (!n->visited) { n->visited = true; @@ -3398,12 +3398,12 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) // Mark all things invalid sector->moved = true; - for (n = sector->touching_thinglist; n; n = n->m_snext) + for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) n->visited = false; do { - for (n = sector->touching_thinglist; n; n = n->m_snext) // go through list + for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list if (!n->visited) // unprocessed thing found { n->visited = true; // mark thing as processed @@ -3427,7 +3427,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) for (i = 0; i < sector->numattached; i++) { sec = §ors[sector->attached[i]]; - for (n = sec->touching_thinglist; n; n = n->m_snext) + for (n = sec->touching_thinglist; n; n = n->m_thinglist_next) n->visited = false; sec->moved = true; @@ -3439,7 +3439,7 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) do { - for (n = sec->touching_thinglist; n; n = n->m_snext) + for (n = sec->touching_thinglist; n; n = n->m_thinglist_next) if (!n->visited) { n->visited = true; @@ -3457,12 +3457,12 @@ boolean P_CheckSector(sector_t *sector, boolean crunch) // Mark all things invalid sector->moved = true; - for (n = sector->touching_thinglist; n; n = n->m_snext) + for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) n->visited = false; do { - for (n = sector->touching_thinglist; n; n = n->m_snext) // go through list + for (n = sector->touching_thinglist; n; n = n->m_thinglist_next) // go through list if (!n->visited) // unprocessed thing found { n->visited = true; // mark thing as processed @@ -3502,7 +3502,7 @@ static msecnode_t *P_GetSecnode(void) if (headsecnode) { node = headsecnode; - headsecnode = headsecnode->m_snext; + headsecnode = headsecnode->m_thinglist_next; } else node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL); @@ -3516,7 +3516,7 @@ static mprecipsecnode_t *P_GetPrecipSecnode(void) if (headprecipsecnode) { node = headprecipsecnode; - headprecipsecnode = headprecipsecnode->m_snext; + headprecipsecnode = headprecipsecnode->m_thinglist_next; } else node = Z_Calloc(sizeof (*node), PU_LEVEL, NULL); @@ -3527,14 +3527,14 @@ static mprecipsecnode_t *P_GetPrecipSecnode(void) static inline void P_PutSecnode(msecnode_t *node) { - node->m_snext = headsecnode; + node->m_thinglist_next = headsecnode; headsecnode = node; } // Tails 08-25-2002 static inline void P_PutPrecipSecnode(mprecipsecnode_t *node) { - node->m_snext = headprecipsecnode; + node->m_thinglist_next = headprecipsecnode; headprecipsecnode = node; } @@ -3555,7 +3555,7 @@ static msecnode_t *P_AddSecnode(sector_t *s, mobj_t *thing, msecnode_t *nextnode node->m_thing = thing; // Yes. Setting m_thing says 'keep it'. return nextnode; } - node = node->m_tnext; + node = node->m_sectorlist_next; } // Couldn't find an existing node for this sector. Add one at the head @@ -3568,17 +3568,17 @@ static msecnode_t *P_AddSecnode(sector_t *s, mobj_t *thing, msecnode_t *nextnode node->m_sector = s; // sector node->m_thing = thing; // mobj - node->m_tprev = NULL; // prev node on Thing thread - node->m_tnext = nextnode; // next node on Thing thread + node->m_sectorlist_prev = NULL; // prev node on Thing thread + node->m_sectorlist_next = nextnode; // next node on Thing thread if (nextnode) - nextnode->m_tprev = node; // set back link on Thing + nextnode->m_sectorlist_prev = node; // set back link on Thing // Add new node at head of sector thread starting at s->touching_thinglist - node->m_sprev = NULL; // prev node on sector thread - node->m_snext = s->touching_thinglist; // next node on sector thread + node->m_thinglist_prev = NULL; // prev node on sector thread + node->m_thinglist_next = s->touching_thinglist; // next node on sector thread if (s->touching_thinglist) - node->m_snext->m_sprev = node; + node->m_thinglist_next->m_thinglist_prev = node; s->touching_thinglist = node; return node; } @@ -3596,7 +3596,7 @@ static mprecipsecnode_t *P_AddPrecipSecnode(sector_t *s, precipmobj_t *thing, mp node->m_thing = thing; // Yes. Setting m_thing says 'keep it'. return nextnode; } - node = node->m_tnext; + node = node->m_sectorlist_next; } // Couldn't find an existing node for this sector. Add one at the head @@ -3609,17 +3609,17 @@ static mprecipsecnode_t *P_AddPrecipSecnode(sector_t *s, precipmobj_t *thing, mp node->m_sector = s; // sector node->m_thing = thing; // mobj - node->m_tprev = NULL; // prev node on Thing thread - node->m_tnext = nextnode; // next node on Thing thread + node->m_sectorlist_prev = NULL; // prev node on Thing thread + node->m_sectorlist_next = nextnode; // next node on Thing thread if (nextnode) - nextnode->m_tprev = node; // set back link on Thing + nextnode->m_sectorlist_prev = node; // set back link on Thing // Add new node at head of sector thread starting at s->touching_thinglist - node->m_sprev = NULL; // prev node on sector thread - node->m_snext = s->touching_preciplist; // next node on sector thread + node->m_thinglist_prev = NULL; // prev node on sector thread + node->m_thinglist_next = s->touching_preciplist; // next node on sector thread if (s->touching_preciplist) - node->m_snext->m_sprev = node; + node->m_thinglist_next->m_thinglist_prev = node; s->touching_preciplist = node; return node; } @@ -3641,24 +3641,24 @@ static msecnode_t *P_DelSecnode(msecnode_t *node) // Unlink from the Thing thread. The Thing thread begins at // sector_list and not from mobj_t->touching_sectorlist. - tp = node->m_tprev; - tn = node->m_tnext; + tp = node->m_sectorlist_prev; + tn = node->m_sectorlist_next; if (tp) - tp->m_tnext = tn; + tp->m_sectorlist_next = tn; if (tn) - tn->m_tprev = tp; + tn->m_sectorlist_prev = tp; // Unlink from the sector thread. This thread begins at // sector_t->touching_thinglist. - sp = node->m_sprev; - sn = node->m_snext; + sp = node->m_thinglist_prev; + sn = node->m_thinglist_next; if (sp) - sp->m_snext = sn; + sp->m_thinglist_next = sn; else node->m_sector->touching_thinglist = sn; if (sn) - sn->m_sprev = sp; + sn->m_thinglist_prev = sp; // Return this node to the freelist @@ -3680,24 +3680,24 @@ static mprecipsecnode_t *P_DelPrecipSecnode(mprecipsecnode_t *node) // Unlink from the Thing thread. The Thing thread begins at // sector_list and not from mobj_t->touching_sectorlist. - tp = node->m_tprev; - tn = node->m_tnext; + tp = node->m_sectorlist_prev; + tn = node->m_sectorlist_next; if (tp) - tp->m_tnext = tn; + tp->m_sectorlist_next = tn; if (tn) - tn->m_tprev = tp; + tn->m_sectorlist_prev = tp; // Unlink from the sector thread. This thread begins at // sector_t->touching_thinglist. - sp = node->m_sprev; - sn = node->m_snext; + sp = node->m_thinglist_prev; + sn = node->m_thinglist_next; if (sp) - sp->m_snext = sn; + sp->m_thinglist_next = sn; else node->m_sector->touching_preciplist = sn; if (sn) - sn->m_sprev = sp; + sn->m_thinglist_prev = sp; // Return this node to the freelist @@ -3812,7 +3812,7 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y) while (node) { node->m_thing = NULL; - node = node->m_tnext; + node = node->m_sectorlist_next; } P_SetTarget(&tmthing, thing); @@ -3850,11 +3850,11 @@ void P_CreateSecNodeList(mobj_t *thing, fixed_t x, fixed_t y) if (!node->m_thing) { if (node == sector_list) - sector_list = node->m_tnext; + sector_list = node->m_sectorlist_next; node = P_DelSecnode(node); } else - node = node->m_tnext; + node = node->m_sectorlist_next; } /* cph - @@ -3895,7 +3895,7 @@ void P_CreatePrecipSecNodeList(precipmobj_t *thing,fixed_t x,fixed_t y) while (node) { node->m_thing = NULL; - node = node->m_tnext; + node = node->m_sectorlist_next; } tmprecipthing = thing; @@ -3929,11 +3929,11 @@ void P_CreatePrecipSecNodeList(precipmobj_t *thing,fixed_t x,fixed_t y) if (!node->m_thing) { if (node == precipsector_list) - precipsector_list = node->m_tnext; + precipsector_list = node->m_sectorlist_next; node = P_DelPrecipSecnode(node); } else - node = node->m_tnext; + node = node->m_sectorlist_next; } /* cph - diff --git a/src/p_mobj.c b/src/p_mobj.c index 68fb1696..adfe319c 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -1530,7 +1530,7 @@ static void P_PushableCheckBustables(mobj_t *mo) mo->y += mo->momy; P_SetThingPosition(mo); - for (node = mo->touching_sectorlist; node; node = node->m_snext) + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (!node->m_sector) break; @@ -2013,12 +2013,14 @@ static void P_AdjustMobjFloorZ_FFloors(mobj_t *mo, sector_t *sector, UINT8 motyp delta1 = mo->z - (bottomheight + ((topheight - bottomheight)/2)); delta2 = thingtop - (bottomheight + ((topheight - bottomheight)/2)); if (topheight > mo->floorz && abs(delta1) < abs(delta2) - && !(rover->flags & FF_REVERSEPLATFORM)) + && !(rover->flags & FF_REVERSEPLATFORM) + && ((P_MobjFlip(mo)*mo->momz > 0) || (!(rover->flags & FF_PLATFORM)))) // In reverse gravity, only clip for FOFs that are intangible from their bottom (the "top" you're falling through) if you're coming from above ("below" in your frame of reference) { mo->floorz = topheight; } if (bottomheight < mo->ceilingz && abs(delta1) >= abs(delta2) - && !(rover->flags & FF_PLATFORM)) + && !(rover->flags & FF_PLATFORM) + && ((P_MobjFlip(mo)*mo->momz > 0) || (!(rover->flags & FF_REVERSEPLATFORM)))) // In normal gravity, only clip for FOFs that are intangible from the top if you're coming from below { mo->ceilingz = bottomheight; } @@ -2703,7 +2705,7 @@ static void P_PlayerZMovement(mobj_t *mo) msecnode_t *node; boolean stopmovecut = false; - for (node = mo->touching_sectorlist; node; node = node->m_snext) + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) { sector_t *sec = node->m_sector; subsector_t *newsubsec; @@ -2880,7 +2882,7 @@ nightsdone: if (CheckForMarioBlocks && !(netgame && mo->player->spectator)) // Only let the player punch { // Search the touching sectors, from side-to-side... - for (node = mo->touching_sectorlist; node; node = node->m_snext) + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) { ffloor_t *rover; if (!node->m_sector->ffloors) @@ -3648,7 +3650,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) if (!(netgame && mobj->player->spectator)) { // Crumbling platforms - for (node = mobj->touching_sectorlist; node; node = node->m_snext) + for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next) { fixed_t topheight, bottomheight; ffloor_t *rover; @@ -3673,7 +3675,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) { boolean thereiswater = false; - for (node = mobj->touching_sectorlist; node; node = node->m_snext) + for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next) { if (node->m_sector->ffloors) { @@ -3694,7 +3696,7 @@ static void P_PlayerMobjThinker(mobj_t *mobj) } if (thereiswater) { - for (node = mobj->touching_sectorlist; node; node = node->m_snext) + for (node = mobj->touching_sectorlist; node; node = node->m_sectorlist_next) { if (node->m_sector->ffloors) { @@ -3807,7 +3809,7 @@ void P_RecalcPrecipInSector(sector_t *sector) sector->moved = true; // Recalc lighting and things too, maybe - for (psecnode = sector->touching_preciplist; psecnode; psecnode = psecnode->m_snext) + for (psecnode = sector->touching_preciplist; psecnode; psecnode = psecnode->m_thinglist_next) CalculatePrecipFloor(psecnode->m_thing); } diff --git a/src/p_setup.c b/src/p_setup.c index b36bf0b8..6c14e361 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1931,10 +1931,18 @@ static void P_GroupLines(void) // allocate linebuffers for each sector for (i = 0, sector = sectors; i < numsectors; i++, sector++) { - sector->lines = Z_Calloc(sector->linecount * sizeof(line_t*), PU_LEVEL, NULL); + if (sector->linecount == 0) // no lines found? + { + sector->lines = NULL; + CONS_Debug(DBG_SETUP, "P_GroupLines: sector %d has no lines\n", i); + } + else + { + sector->lines = Z_Calloc(sector->linecount * sizeof(line_t*), PU_LEVEL, NULL); - // zero the count, since we'll later use this to track how many we've recorded - sector->linecount = 0; + // zero the count, since we'll later use this to track how many we've recorded + sector->linecount = 0; + } } // iterate through lines, assigning them to sectors' linebuffers, @@ -1952,11 +1960,14 @@ static void P_GroupLines(void) { M_ClearBox(bbox); - for (j = 0; j < sector->linecount; j++) + if (sector->linecount != 0) { - li = sector->lines[j]; - M_AddToBox(bbox, li->v1->x, li->v1->y); - M_AddToBox(bbox, li->v2->x, li->v2->y); + for (j = 0; j < sector->linecount; j++) + { + li = sector->lines[j]; + M_AddToBox(bbox, li->v1->x, li->v1->y); + M_AddToBox(bbox, li->v2->x, li->v2->y); + } } // set the degenmobj_t to the middle of the bounding box @@ -1966,6 +1977,35 @@ static void P_GroupLines(void) } } +// +// P_LoadReject +// +// Detect if the REJECT lump is valid, +// if not, rejectmatrix will be NULL +static void P_LoadReject(lumpnum_t lumpnum) +{ + size_t count; + const char *lumpname = W_CheckNameForNum(lumpnum); + + // Check if the lump exists, and if it's named "REJECT" + if (!lumpname || memcmp(lumpname, "REJECT\0\0", 8) != 0) + { + rejectmatrix = NULL; + CONS_Debug(DBG_SETUP, "P_LoadReject: No valid REJECT lump found\n"); + return; + } + + count = W_LumpLength(lumpnum); + + if (!count) // zero length, someone probably used ZDBSP + { + rejectmatrix = NULL; + CONS_Debug(DBG_SETUP, "P_LoadReject: REJECT lump has size 0, will not be loaded\n"); + } + else + rejectmatrix = W_CacheLumpNum(lumpnum, PU_LEVEL); +} + #if 0 static char *levellumps[] = { @@ -2574,7 +2614,7 @@ boolean P_SetupLevel(boolean skipprecip) P_LoadSubsectors(lastloadedmaplumpnum + ML_SSECTORS); P_LoadNodes(lastloadedmaplumpnum + ML_NODES); P_LoadSegs(lastloadedmaplumpnum + ML_SEGS); - rejectmatrix = W_CacheLumpNum(lastloadedmaplumpnum + ML_REJECT, PU_LEVEL); + P_LoadReject(lastloadedmaplumpnum + ML_REJECT); P_GroupLines(); numdmstarts = numredctfstarts = numbluectfstarts = 0; diff --git a/src/p_sight.c b/src/p_sight.c index 14c1c945..bd6ab4d7 100644 --- a/src/p_sight.c +++ b/src/p_sight.c @@ -325,9 +325,12 @@ boolean P_CheckSight(mobj_t *t1, mobj_t *t2) s2 = t2->subsector->sector; pnum = (s1-sectors)*numsectors + (s2-sectors); - // Check in REJECT table. - if (rejectmatrix[pnum>>3] & (1 << (pnum&7))) // can't possibly be connected - return false; + if (rejectmatrix != NULL) + { + // Check in REJECT table. + if (rejectmatrix[pnum>>3] & (1 << (pnum&7))) // can't possibly be connected + return false; + } // killough 11/98: shortcut for melee situations // same subsector? obviously visible diff --git a/src/p_spec.c b/src/p_spec.c index 9e4c3f07..0bd53027 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -1642,7 +1642,7 @@ boolean P_RunTriggerLinedef(line_t *triggerline, mobj_t *actor, sector_t *caller mo = node->m_thing; if (mo->flags & MF_PUSHABLE) numpush++; - node = node->m_snext; + node = node->m_thinglist_next; } if (triggerline->flags & ML_NOCLIMB) // Need at least or more @@ -3144,7 +3144,7 @@ void P_SetupSignExit(player_t *player) thinker_t *think; INT32 numfound = 0; - for (; node; node = node->m_snext) + for (; node; node = node->m_thinglist_next) { thing = node->m_thing; if (thing->type != MT_SIGN) @@ -3308,7 +3308,7 @@ sector_t *P_PlayerTouchingSectorSpecial(player_t *player, INT32 section, INT32 n return rover->master->frontsector; } - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (GETSECSPECIAL(node->m_sector->special, section) == number) { @@ -4657,7 +4657,7 @@ void P_PlayerInSpecialSector(player_t *player) P_RunSpecialSectorCheck(player, sector); // Iterate through touching_sectorlist - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { sector = node->m_sector; @@ -5308,7 +5308,7 @@ void T_LaserFlash(laserthink_t *flash) S_StartSound(§or->soundorg, sfx_laser); // Seek out objects to DESTROY! MUAHAHHAHAHAA!!!*cough* - for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_snext) + for (node = sector->touching_thinglist; node && node->m_thing; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6579,7 +6579,7 @@ void T_Scroll(scroll_t *s) sector_t *psec; psec = sectors + sect; - for (node = psec->touching_thinglist; node; node = node->m_snext) + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6601,7 +6601,7 @@ void T_Scroll(scroll_t *s) if (!is3dblock) { - for (node = sec->touching_thinglist; node; node = node->m_snext) + for (node = sec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6642,7 +6642,7 @@ void T_Scroll(scroll_t *s) sector_t *psec; psec = sectors + sect; - for (node = psec->touching_thinglist; node; node = node->m_snext) + for (node = psec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -6664,7 +6664,7 @@ void T_Scroll(scroll_t *s) if (!is3dblock) { - for (node = sec->touching_thinglist; node; node = node->m_snext) + for (node = sec->touching_thinglist; node; node = node->m_thinglist_next) { thing = node->m_thing; @@ -7014,7 +7014,7 @@ void T_Friction(friction_t *f) { if (thing->floorz != P_GetSpecialTopZ(thing, referrer, sec)) { - node = node->m_snext; + node = node->m_thinglist_next; continue; } @@ -7032,7 +7032,7 @@ void T_Friction(friction_t *f) thing->movefactor = f->movefactor; } } - node = node->m_snext; + node = node->m_thinglist_next; } } @@ -7372,7 +7372,7 @@ void T_Pusher(pusher_t *p) // constant pushers p_wind and p_current node = sec->touching_thinglist; // things touching this sector - for (; node; node = node->m_snext) + for (; node; node = node->m_thinglist_next) { thing = node->m_thing; if (thing->flags & (MF_NOGRAVITY | MF_NOCLIP) diff --git a/src/p_user.c b/src/p_user.c index 4117cfc4..c9ac9f54 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1684,7 +1684,7 @@ static void P_CheckBustableBlocks(player_t *player) player->mo->y += player->mo->momy; P_SetThingPosition(player->mo); - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (!node->m_sector) break; @@ -1801,7 +1801,7 @@ static void P_CheckBouncySectors(player_t *player) player->mo->z += player->mo->momz; P_SetThingPosition(player->mo); - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (!node->m_sector) break; @@ -2849,86 +2849,10 @@ static boolean PIT_CheckSolidsTeeter(mobj_t *thing) // static void P_DoTeeter(player_t *player) { - msecnode_t *node; boolean teeter = false; boolean roverfloor; // solid 3d floors? - boolean checkedforteeter = false; const fixed_t tiptop = FixedMul(MAXSTEPMOVE, player->mo->scale); // Distance you have to be above the ground in order to teeter. - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) - { - // Ledge teetering. Check if any nearby sectors are low enough from your current one. - checkedforteeter = true; - roverfloor = false; - if (node->m_sector->ffloors) - { - ffloor_t *rover; - for (rover = node->m_sector->ffloors; rover; rover = rover->next) - { - if (!(rover->flags & FF_EXISTS)) continue; - - if (P_CheckSolidLava(player->mo, rover)) - ; - else if (!(rover->flags & FF_BLOCKPLAYER || rover->flags & FF_QUICKSAND)) - continue; // intangible 3d floor - - if (player->mo->eflags & MFE_VERTICALFLIP) - { - if (*rover->bottomheight > node->m_sector->ceilingheight) // Above the ceiling - continue; - - if (*rover->bottomheight > player->mo->z + player->mo->height + tiptop - || (*rover->topheight < player->mo->z - && player->mo->z + player->mo->height < node->m_sector->ceilingheight - tiptop)) - { - teeter = true; - roverfloor = true; - } - else - { - teeter = false; - roverfloor = true; - break; - } - } - else - { - if (*rover->topheight < node->m_sector->floorheight) // Below the floor - continue; - - if (*rover->topheight < player->mo->z - tiptop - || (*rover->bottomheight > player->mo->z + player->mo->height - && player->mo->z > node->m_sector->floorheight + tiptop)) - { - teeter = true; - roverfloor = true; - } - else - { - teeter = false; - roverfloor = true; - break; - } - } - } - } - - if (!teeter && !roverfloor) - { - if (player->mo->eflags & MFE_VERTICALFLIP) - { - if (node->m_sector->ceilingheight > player->mo->z + player->mo->height + tiptop) - teeter = true; - } - else - { - if (node->m_sector->floorheight < player->mo->z - tiptop) - teeter = true; - } - } - } - - if (checkedforteeter && !teeter) // Backup code { subsector_t *subsec[4]; // changed abcd into array instead UINT8 i; @@ -3147,7 +3071,7 @@ teeterdone: if ((player->mo->state == &states[S_PLAY_STND] || player->mo->state == &states[S_PLAY_TAP1] || player->mo->state == &states[S_PLAY_TAP2] || player->mo->state == &states[S_PLAY_SUPERSTAND])) P_SetPlayerMobjState(player->mo, S_PLAY_TEETER1); } - else if (checkedforteeter && (player->mo->state == &states[S_PLAY_TEETER1] || player->mo->state == &states[S_PLAY_TEETER2] || player->mo->state == &states[S_PLAY_SUPERTEETER])) + else if ((player->mo->state == &states[S_PLAY_TEETER1] || player->mo->state == &states[S_PLAY_TEETER2] || player->mo->state == &states[S_PLAY_SUPERTEETER])) P_SetPlayerMobjState(player->mo, S_PLAY_STND); } @@ -7037,7 +6961,7 @@ static void P_MovePlayer(player_t *player) player->mo->y += player->mo->momy; P_SetThingPosition(player->mo); - for (node = player->mo->touching_sectorlist; node; node = node->m_snext) + for (node = player->mo->touching_sectorlist; node; node = node->m_sectorlist_next) { if (!node->m_sector) break; diff --git a/src/r_defs.h b/src/r_defs.h index 84870816..2c5860ee 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -500,10 +500,10 @@ typedef struct subsector_s // Sector list node showing all sectors an object appears in. // // There are two threads that flow through these nodes. The first thread -// starts at touching_thinglist in a sector_t and flows through the m_snext +// starts at touching_thinglist in a sector_t and flows through the m_thinglist_next // links to find all mobjs that are entirely or partially in the sector. // The second thread starts at touching_sectorlist in an mobj_t and flows -// through the m_tnext links to find all sectors a thing touches. This is +// through the m_sectorlist_next links to find all sectors a thing touches. This is // useful when applying friction or push effects to sectors. These effects // can be done as thinkers that act upon all objects touching their sectors. // As an mobj moves through the world, these nodes are created and @@ -515,10 +515,10 @@ typedef struct msecnode_s { sector_t *m_sector; // a sector containing this object struct mobj_s *m_thing; // this object - struct msecnode_s *m_tprev; // prev msecnode_t for this thing - struct msecnode_s *m_tnext; // next msecnode_t for this thing - struct msecnode_s *m_sprev; // prev msecnode_t for this sector - struct msecnode_s *m_snext; // next msecnode_t for this sector + struct msecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing + struct msecnode_s *m_sectorlist_next; // next msecnode_t for this thing + struct msecnode_s *m_thinglist_prev; // prev msecnode_t for this sector + struct msecnode_s *m_thinglist_next; // next msecnode_t for this sector boolean visited; // used in search algorithms } msecnode_t; @@ -526,10 +526,10 @@ typedef struct mprecipsecnode_s { sector_t *m_sector; // a sector containing this object struct precipmobj_s *m_thing; // this object - struct mprecipsecnode_s *m_tprev; // prev msecnode_t for this thing - struct mprecipsecnode_s *m_tnext; // next msecnode_t for this thing - struct mprecipsecnode_s *m_sprev; // prev msecnode_t for this sector - struct mprecipsecnode_s *m_snext; // next msecnode_t for this sector + struct mprecipsecnode_s *m_sectorlist_prev; // prev msecnode_t for this thing + struct mprecipsecnode_s *m_sectorlist_next; // next msecnode_t for this thing + struct mprecipsecnode_s *m_thinglist_prev; // prev msecnode_t for this sector + struct mprecipsecnode_s *m_thinglist_next; // next msecnode_t for this sector boolean visited; // used in search algorithms } mprecipsecnode_t; diff --git a/src/r_segs.c b/src/r_segs.c index 11b4c8ae..59b4f5db 100644 --- a/src/r_segs.c +++ b/src/r_segs.c @@ -1453,34 +1453,45 @@ static void R_RenderSegLoop (void) frontscale[rw_x] = rw_scale; // draw the wall tiers - if (midtexture && yl <= yh && yh < vid.height && yh > 0) + if (midtexture) { // single sided line - dc_yl = yl; - dc_yh = yh; - dc_texturemid = rw_midtexturemid; - dc_source = R_GetColumn(midtexture,texturecolumn); - dc_texheight = textureheight[midtexture]>>FRACBITS; + if (yl <= yh && yh >= 0 && yl < viewheight) + { + dc_yl = yl; + dc_yh = yh; + dc_texturemid = rw_midtexturemid; + dc_source = R_GetColumn(midtexture,texturecolumn); + dc_texheight = textureheight[midtexture]>>FRACBITS; - //profile stuff --------------------------------------------------------- + //profile stuff --------------------------------------------------------- #ifdef TIMING - ProfZeroTimer(); + ProfZeroTimer(); #endif - colfunc(); + colfunc(); #ifdef TIMING - RDMSR(0x10,&mycount); - mytotal += mycount; //64bit add + RDMSR(0x10,&mycount); + mytotal += mycount; //64bit add - if (nombre--==0) - I_Error("R_DrawColumn CPU Spy reports: 0x%d %d\n", *((INT32 *)&mytotal+1), - (INT32)mytotal); + if (nombre--==0) + I_Error("R_DrawColumn CPU Spy reports: 0x%d %d\n", *((INT32 *)&mytotal+1), + (INT32)mytotal); #endif - //profile stuff --------------------------------------------------------- + //profile stuff --------------------------------------------------------- - // dont draw anything more for this column, since - // a midtexture blocks the view - ceilingclip[rw_x] = (INT16)viewheight; - floorclip[rw_x] = -1; + // dont draw anything more for this column, since + // a midtexture blocks the view + ceilingclip[rw_x] = (INT16)viewheight; + floorclip[rw_x] = -1; + } + else + { + // note: don't use min/max macros, since casting from INT32 to INT16 is involved here + if (markceiling) + ceilingclip[rw_x] = (yh >= 0) ? ((yl > viewheight) ? (INT16)viewheight : (INT16)((INT16)yl - 1)) : -1; + if (markfloor) + floorclip[rw_x] = (yh < viewheight) ? ((yh < -1) ? -1 : (INT16)((INT16)yh + 1)) : (INT16)viewheight; + } } else { @@ -1494,21 +1505,28 @@ static void R_RenderSegLoop (void) if (mid >= floorclip[rw_x]) mid = floorclip[rw_x]-1; - if (mid >= yl && yh < vid.height && yh > 0) + if (mid >= yl) // back ceiling lower than front ceiling ? { - dc_yl = yl; - dc_yh = mid; - dc_texturemid = rw_toptexturemid; - dc_source = R_GetColumn(toptexture,texturecolumn); - dc_texheight = textureheight[toptexture]>>FRACBITS; - colfunc(); - ceilingclip[rw_x] = (INT16)mid; + if (yl >= viewheight) // entirely off bottom of screen + ceilingclip[rw_x] = (INT16)viewheight; + else if (mid >= 0) // safe to draw top texture + { + dc_yl = yl; + dc_yh = mid; + dc_texturemid = rw_toptexturemid; + dc_source = R_GetColumn(toptexture,texturecolumn); + dc_texheight = textureheight[toptexture]>>FRACBITS; + colfunc(); + ceilingclip[rw_x] = (INT16)mid; + } + else // entirely off top of screen + ceilingclip[rw_x] = -1; } else - ceilingclip[rw_x] = (INT16)((INT16)yl - 1); + ceilingclip[rw_x] = (yh >= 0) ? ((yl > viewheight) ? (INT16)viewheight : (INT16)((INT16)yl - 1)) : -1; } else if (markceiling) // no top wall - ceilingclip[rw_x] = (INT16)((INT16)yl - 1); + ceilingclip[rw_x] = (yh >= 0) ? ((yl > viewheight) ? (INT16)viewheight : (INT16)((INT16)yl - 1)) : -1; if (bottomtexture) { @@ -1520,22 +1538,29 @@ static void R_RenderSegLoop (void) if (mid <= ceilingclip[rw_x]) mid = ceilingclip[rw_x]+1; - if (mid <= yh && yh < vid.height && yh > 0) + if (mid <= yh) // back floor higher than front floor ? { - dc_yl = mid; - dc_yh = yh; - dc_texturemid = rw_bottomtexturemid; - dc_source = R_GetColumn(bottomtexture, - texturecolumn); - dc_texheight = textureheight[bottomtexture]>>FRACBITS; - colfunc(); - floorclip[rw_x] = (INT16)mid; + if (yh < 0) // entirely off top of screen + floorclip[rw_x] = -1; + else if (mid < viewheight) // safe to draw bottom texture + { + dc_yl = mid; + dc_yh = yh; + dc_texturemid = rw_bottomtexturemid; + dc_source = R_GetColumn(bottomtexture, + texturecolumn); + dc_texheight = textureheight[bottomtexture]>>FRACBITS; + colfunc(); + floorclip[rw_x] = (INT16)mid; + } + else // entirely off bottom of screen + floorclip[rw_x] = (INT16)viewheight; } else - floorclip[rw_x] = (INT16)((INT16)yh + 1); + floorclip[rw_x] = (yh < viewheight) ? ((yh < -1) ? -1 : (INT16)((INT16)yh + 1)) : (INT16)viewheight; } else if (markfloor) // no bottom wall - floorclip[rw_x] = (INT16)((INT16)yh + 1); + floorclip[rw_x] = (yh < viewheight) ? ((yh < -1) ? -1 : (INT16)((INT16)yh + 1)) : (INT16)viewheight; } if (maskedtexture || numthicksides) @@ -1858,12 +1883,13 @@ void R_StoreWallRange(INT32 start, INT32 stop) // a single sided line is terminal, so it must mark ends markfloor = markceiling = true; #ifdef ESLOPE - if (!(linedef->flags & ML_EFFECT1)) { + if (linedef->flags & ML_EFFECT2) { if (linedef->flags & ML_DONTPEGBOTTOM) rw_midtexturemid = frontsector->floorheight + textureheight[sidedef->midtexture] - viewz; else - rw_midtexturemid = frontsector->ceilingheight; + rw_midtexturemid = frontsector->ceilingheight - viewz; } + else #endif if (linedef->flags & ML_DONTPEGBOTTOM) { @@ -2482,6 +2508,15 @@ void R_StoreWallRange(INT32 start, INT32 stop) #ifdef ESLOPE maskedtextureheight = ds_p->maskedtextureheight; // note to red, this == &(ds_p->maskedtextureheight[0]) +#ifdef POLYOBJECTS + if (curline->polyseg) { // use REAL front and back floors please, so midtexture rendering isn't mucked up + rw_midtextureslide = rw_midtexturebackslide = 0; + if (!!(linedef->flags & ML_DONTPEGBOTTOM) ^ !!(linedef->flags & ML_EFFECT3)) + rw_midtexturemid = rw_midtextureback = max(curline->frontsector->floorheight, curline->backsector->floorheight) - viewz; + else + rw_midtexturemid = rw_midtextureback = min(curline->frontsector->ceilingheight, curline->backsector->ceilingheight) - viewz; + } else +#endif // Set midtexture starting height if (linedef->flags & ML_EFFECT2) { // Ignore slopes when texturing rw_midtextureslide = rw_midtexturebackslide = 0;