From d780c2e3a45ce04bbf510659b8f5d65c722a5d15 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 3 Apr 2008 10:49:54 +0000 Subject: [PATCH] - Fixed: The minimum parameter count for ACS_Execute and ACS_ExecuteAlways for DECORATE was wrong (2 instead of 1.) - Changed: Hexen set every cluster to be a hub if it hadn't been defined before a level using this cluster. Now it will only do that if HexenHack is true, i.e. when original Hexen format MAPINFOs are parsed. For ZDoom format MAPINFOs it will now be the same as for the other games which means that 'hub' has to be declared explicitly. - Added an Idle state that is entered in place of the spawn state if a monster has to return to its inactive state if it can't find any more targets. - Added MF5_NOINTERACTION flag which completely disables all physics related code for any actor with this flag. Mostly useful for particle effects where the actors just move a certain distance and then disappear. - Removed the last remains of the antialias precalculation code from am_map.cpp because it was no longer used. - Fixed: Two-sided lines bordering a secret sector were not drawn in the proper color - Fixed: The automap didn't check ACS_LockedExecuteDoor for its lock color. SVN r876 (trunk) --- docs/rh-log.txt | 21 + src/actionspecials.h | 4 +- src/actor.h | 2 + src/am_map.cpp | 106 +--- src/g_level.cpp | 2 +- src/g_strife/a_strifestuff.cpp | 2 +- src/namedef.h | 1 + src/p_enemy.cpp | 4 +- src/p_mobj.cpp | 721 ++++++++++++++------------- src/sdl/sdlvideo.cpp | 46 +- src/thingdef/thingdef_properties.cpp | 1 + 11 files changed, 455 insertions(+), 455 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 491547e41..0bad1e7f2 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,24 @@ +April 3, 2008 (Changes by Graf Zahl) +- Fixed: The minimum parameter count for ACS_Execute and ACS_ExecuteAlways for + DECORATE was wrong (2 instead of 1.) + +April 2, 2008 (Changes by Graf Zahl) +- Changed: Hexen set every cluster to be a hub if it hadn't been defined before + a level using this cluster. Now it will only do that if HexenHack is true, + i.e. when original Hexen format MAPINFOs are parsed. For ZDoom format + MAPINFOs it will now be the same as for the other games which means that + 'hub' has to be declared explicitly. +- Added an Idle state that is entered in place of the spawn state if a monster + has to return to its inactive state if it can't find any more targets. +- Added MF5_NOINTERACTION flag which completely disables all physics related + code for any actor with this flag. Mostly useful for particle effects where + the actors just move a certain distance and then disappear. +- Removed the last remains of the antialias precalculation code from + am_map.cpp because it was no longer used. +- Fixed: Two-sided lines bordering a secret sector were not drawn in the + proper color +- Fixed: The automap didn't check ACS_LockedExecuteDoor for its lock color. + April 2, 2008 - Switched sounds local to the listener from head-relative 3D sounds to 2D sounds so stereo sounds have full separation. I tried using set3DSpread, diff --git a/src/actionspecials.h b/src/actionspecials.h index 4e7b4a436..9245750ad 100644 --- a/src/actionspecials.h +++ b/src/actionspecials.h @@ -72,7 +72,7 @@ DEFINE_SPECIAL(TeleportOther, 76, 3, 3) DEFINE_SPECIAL(TeleportGroup, 77, 5, 5) DEFINE_SPECIAL(TeleportInSector, 78, 4, 5) -DEFINE_SPECIAL(ACS_Execute, 80, 2, 5) +DEFINE_SPECIAL(ACS_Execute, 80, 1, 5) DEFINE_SPECIAL(ACS_Suspend, 81, 2, 2) DEFINE_SPECIAL(ACS_Terminate, 82, 2, 2) DEFINE_SPECIAL(ACS_LockedExecute, 83, 5, 5) @@ -197,7 +197,7 @@ DEFINE_SPECIAL(Scroll_Texture_Model, 222, -1, -1) DEFINE_SPECIAL(Scroll_Floor, 223, 4, 4) DEFINE_SPECIAL(Scroll_Ceiling, 224, 4, 4) DEFINE_SPECIAL(Scroll_Texture_Offsets, 225, -1, -1) -DEFINE_SPECIAL(ACS_ExecuteAlways, 226, 2, 5) +DEFINE_SPECIAL(ACS_ExecuteAlways, 226, 1, 5) DEFINE_SPECIAL(PointPush_SetForce, 227, -1, -1) DEFINE_SPECIAL(Plat_RaiseAndStayTx0, 228, 2, 2) DEFINE_SPECIAL(Thing_SetGoal, 229, 3, 4) diff --git a/src/actor.h b/src/actor.h index 32bc26054..5623be939 100644 --- a/src/actor.h +++ b/src/actor.h @@ -298,6 +298,7 @@ enum MF5_NEVERRESPAWN = 0x00040000, // never respawns, regardless of skill setting MF5_DONTRIP = 0x00080000, // Ripping projectiles explode when hittin this actor MF5_NOINFIGHTING = 0x00100000, // This actor doesn't switch target when it's hurt + MF5_NOINTERACTION = 0x00200000, // Thing is completely excluded from any gameplay related checks // --- mobj.renderflags --- @@ -758,6 +759,7 @@ public: bool SetStateNF (FState *newstate); virtual bool UpdateWaterLevel (fixed_t oldz, bool splash=true); bool isFast(); + void SetIdle(); FState *FindState (FName label) const; FState *FindState (FName label, FName sublabel, bool exact = false) const; diff --git a/src/am_map.cpp b/src/am_map.cpp index 209e3fcf5..5c9009818 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -115,8 +115,6 @@ inline fixed_t MTOF(fixed_t x) return MulScale24 (x, scale_mtof); } -//static int WeightingScale; - CVAR (Int, am_rotate, 0, CVAR_ARCHIVE); CVAR (Int, am_overlay, 0, CVAR_ARCHIVE); CVAR (Bool, am_showsecrets, true, CVAR_ARCHIVE); @@ -347,16 +345,6 @@ static fixed_t mapxstart=0; //x-value for the bitmap. static bool stopped = true; -/* -#define NUMALIASES 3 -#define WALLCOLORS -1 -#define FDWALLCOLORS -2 -#define CDWALLCOLORS -3 - -static BYTE antialias[NUMALIASES][NUMWEIGHTS]; -*/ - - void AM_rotatePoint (fixed_t *x, fixed_t *y); void AM_rotate (fixed_t *x, fixed_t *y, angle_t an); void AM_doFollowPlayer (); @@ -733,57 +721,6 @@ static void AM_initColors (bool overlayed) NotSeenColor = DoomColors[10]; } -#if 0 - // Due to a bug (marked below) precalculated antialiasing was never working properly. - // Also, tests show it provides no measurable performance improvement. - // And since it only complicates matters it's disabled for now. - - // initialize the anti-aliased lines - static struct - { - int *color; - int prevcolor; - int falseColor; - } aliasedLines[3] = { - { &WallColor, -1, WALLCOLORS }, - { &FDWallColor, -1, FDWALLCOLORS }, - { &CDWallColor, -1, CDWALLCOLORS } - }; - float backRed, backGreen, backBlue; - - GetComponents (Background, palette, backRed, backGreen, backBlue); - - for (int alias = 0; alias < NUMALIASES; alias++) - { - if (aliasedLines[alias].prevcolor != *(aliasedLines[alias].color) || - lastpal != palette || lastback != Background) - { - float foreRed, foreGreen, foreBlue; - - aliasedLines[alias].prevcolor = *(aliasedLines[alias].color); - GetComponents (*(aliasedLines[alias].color), palette, foreRed, foreGreen, foreBlue); - - for (int i = 0; i < NUMWEIGHTS; i++) - { - float step = (float)i; - float fore = (NUMWEIGHTS-1 - step) / (NUMWEIGHTS-1); - float back = step / (NUMWEIGHTS-1); - int red = (int)(backRed * back + foreRed * fore); - int green = (int)(backGreen * back + foreGreen * fore); - int blue = (int)(backGreen * back + foreBlue * fore); -// [RH] What was I thinking here? -// if (palette) - antialias[alias][i] = ColorMatcher.Pick (red, green, blue); -// else -// antialias[alias][i] = MAKERGB(red, green, blue); - } - } - // This line was inside the 'if' block rendering the whole - // precalculation inoperable. - *(aliasedLines[alias].color) = aliasedLines[alias].falseColor; - } - lastback = Background; -#endif lastpal = palette; } @@ -1357,6 +1294,22 @@ void AM_drawGrid (const AMColor &color) } } +static bool AM_CheckSecret(line_t *line) +{ + if (line->frontsector != NULL) + { + if (line->frontsector->oldspecial && + (am_map_secrets==2 || (am_map_secrets==1 && !(line->frontsector->special&SECRET_MASK)))) + return true; + } + if (line->backsector != NULL) + { + if (line->backsector->oldspecial && + (am_map_secrets==2 || (am_map_secrets==1 && !(line->backsector->special&SECRET_MASK)))) + return true; + } + return false; +} // // Determines visible lines, draws them. // This is LineDef based, not LineSeg based. @@ -1384,18 +1337,14 @@ void AM_drawWalls (bool allmap) if ((lines[i].flags & ML_DONTDRAW) && am_cheat == 0) continue; - if (!lines[i].backsector) + if (AM_CheckSecret(&lines[i])) { - if (lines[i].frontsector->oldspecial && - (am_map_secrets==2 || (am_map_secrets==1 && !(lines[i].frontsector->special&SECRET_MASK)))) - { - // map secret sectors like Boom - AM_drawMline(&l, SecretSectorColor); - } - else - { - AM_drawMline(&l, WallColor); - } + // map secret sectors like Boom + AM_drawMline(&l, SecretSectorColor); + } + else if (!lines[i].backsector) + { + AM_drawMline(&l, WallColor); } else { @@ -1424,6 +1373,7 @@ void AM_drawWalls (bool allmap) } else if (lines[i].special == Door_LockedRaise || lines[i].special == ACS_LockedExecute || + lines[i].special == ACS_LockedExecuteDoor || (lines[i].special == Generic_Door && lines[i].args[4]!=0)) { if (am_usecustomcolors) @@ -1805,7 +1755,6 @@ void AM_Drawer () f_w = screen->GetWidth (); f_h = ST_Y; f_p = screen->GetPitch (); - //WeightingScale = 0; AM_clearFB(Background); } @@ -1816,13 +1765,6 @@ void AM_Drawer () f_w = realviewwidth; f_h = realviewheight; f_p = screen->GetPitch (); - /* - WeightingScale = (int)(am_ovtrans * 256.f); - if (WeightingScale < 0 || WeightingScale >= 256) - { - WeightingScale = 0; - } - */ } AM_activateNewScale(); diff --git a/src/g_level.cpp b/src/g_level.cpp index 81e080aff..abf1a9fc5 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1060,7 +1060,7 @@ static void ParseMapInfoLower (FScanner &sc, clusterinfo = &wadclusterinfos[clusterindex]; memset (clusterinfo, 0, sizeof(cluster_info_t)); clusterinfo->cluster = sc.Number; - if (gameinfo.gametype == GAME_Hexen) + if (HexenHack) { clusterinfo->flags |= CLUSTER_HUB; } diff --git a/src/g_strife/a_strifestuff.cpp b/src/g_strife/a_strifestuff.cpp index b57e54795..8b214a7aa 100644 --- a/src/g_strife/a_strifestuff.cpp +++ b/src/g_strife/a_strifestuff.cpp @@ -543,7 +543,7 @@ void A_KlaxonBlare (AActor *self) A_TurretLook (self); if (self->target == NULL) { - self->SetState (self->SpawnState); + self->SetIdle(); } else { diff --git a/src/namedef.h b/src/namedef.h index 8cc2cc735..24bab95c2 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -140,6 +140,7 @@ xx(Crush) xx(Yes) xx(No) xx(Greetings) +xx(Idle) // Compatible death names for the decorate parser. xx(XDeath) diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index ec8c5c265..44d542151 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -1884,7 +1884,7 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi } else { - actor->SetState (actor->SpawnState); + actor->SetIdle(); actor->flags &= ~MF_INCHASE; return; } @@ -1945,7 +1945,7 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi if (newgoal != NULL && delay != 0) { actor->flags4 |= MF4_INCOMBAT; - actor->SetState (actor->SpawnState); + actor->SetIdle(); } actor->flags &= ~MF_INCHASE; actor->goal = newgoal; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 9bf9f8533..1df118ffb 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -1432,11 +1432,12 @@ void P_XYMovement (AActor *mo, fixed_t scrollx, fixed_t scrolly) mo->momx = mo->momy = mo->momz = 0; if (!(mo->flags2 & MF2_DORMANT)) { - mo->SetState (mo->SeeState != NULL ? mo->SeeState : mo->SpawnState); + if (mo->SeeState != NULL) mo->SetState (mo->SeeState); + else mo->SetIdle(); } else { - mo->SetState (mo->SpawnState); + mo->SetIdle(); mo->tics = -1; } } @@ -2398,11 +2399,12 @@ bool AActor::Slam (AActor *thing) int dam = GetMissileDamage (7, 1); P_DamageMobj (thing, this, this, dam, NAME_Melee); P_TraceBleed (dam, thing, this); - SetState (SeeState != NULL ? SeeState : SpawnState); + if (SeeState != NULL) SetState (SeeState); + else SetIdle(); } else { - SetState (SpawnState); + SetIdle(); tics = -1; } } @@ -2542,403 +2544,417 @@ void AActor::Tick () PrevY = y; PrevZ = z; - AInventory * item = Inventory; - - // Handle powerup effects here so that the order is controlled - // by the order in the inventory, not the order in the thinker table - while (item != NULL && item->Owner == this) + if (flags5 & MF5_NOINTERACTION) { - item->DoEffect(); - item = item->Inventory; + // only do the minimally necessary things here to save time. + UnlinkFromWorld (); + flags |= MF_NOBLOCKMAP; + x += momx; + y += momy; + z += momz; + LinkToWorld (); } - - if (flags & MF_UNMORPHED) + else { - return; - } - //Added by MC: Freeze mode. - if (bglobal.freeze && !(player && !player->isbot)) - { - return; - } + AInventory * item = Inventory; - // Apply freeze mode. - if (( level.flags & LEVEL_FROZEN ) && ( player == NULL || !( player->cheats & CF_TIMEFREEZE ))) - { - return; - } - - - fixed_t oldz = z; - - // [RH] Give the pain elemental vertical friction - // This used to be in APainElemental::Tick but in order to use - // A_PainAttack with other monsters it has to be here! - if (flags4 & MF4_VFRICTION) - { - if (health >0) + // Handle powerup effects here so that the order is controlled + // by the order in the inventory, not the order in the thinker table + while (item != NULL && item->Owner == this) { - if (abs (momz) < FRACUNIT/4) - { - momz = 0; - flags4 &= ~MF4_VFRICTION; - } - else - { - momz = FixedMul (momz, 0xe800); - } + item->DoEffect(); + item = item->Inventory; } - } - // [RH] Pulse in and out of visibility - if (effects & FX_VISIBILITYPULSE) - { - if (visdir > 0) + if (flags & MF_UNMORPHED) { - alpha += 0x800; - if (alpha >= OPAQUE) - { - alpha = OPAQUE; - visdir = -1; - } + return; } - else - { - alpha -= 0x800; - if (alpha <= TRANSLUC25) - { - alpha = TRANSLUC25; - visdir = 1; - } - } - } - else if (flags & MF_STEALTH) - { - // [RH] Fade a stealth monster in and out of visibility - RenderStyle.Flags &= ~STYLEF_Alpha1; - if (visdir > 0) - { - alpha += 2*FRACUNIT/TICRATE; - if (alpha > OPAQUE) - { - alpha = OPAQUE; - visdir = 0; - } - } - else if (visdir < 0) - { - alpha -= 3*FRACUNIT/TICRATE/2; - if (alpha < 0) - { - alpha = 0; - visdir = 0; - } - } - } - if (bglobal.botnum && consoleplayer == Net_Arbitrator && !demoplayback && - (flags & (MF_SPECIAL|MF_MISSILE)) || (flags3 & MF3_ISMONSTER)) - { - clock (BotSupportCycles); - bglobal.m_Thinking = true; - for (i = 0; i < MAXPLAYERS; i++) + //Added by MC: Freeze mode. + if (bglobal.freeze && !(player && !player->isbot)) { - if (!playeringame[i] || !players[i].isbot) - continue; + return; + } - if (flags3 & MF3_ISMONSTER) + // Apply freeze mode. + if (( level.flags & LEVEL_FROZEN ) && ( player == NULL || !( player->cheats & CF_TIMEFREEZE ))) + { + return; + } + + + fixed_t oldz = z; + + // [RH] Give the pain elemental vertical friction + // This used to be in APainElemental::Tick but in order to use + // A_PainAttack with other monsters it has to be here! + if (flags4 & MF4_VFRICTION) + { + if (health >0) { - if (health > 0 - && !players[i].enemy - && player ? !IsTeammate (players[i].mo) : true - && P_AproxDistance (players[i].mo->x-x, players[i].mo->y-y) < MAX_MONSTER_TARGET_DIST - && P_CheckSight (players[i].mo, this, 2)) - { //Probably a monster, so go kill it. - players[i].enemy = this; + if (abs (momz) < FRACUNIT/4) + { + momz = 0; + flags4 &= ~MF4_VFRICTION; } - } - else if (flags & MF_SPECIAL) - { //Item pickup time - //clock (BotWTG); - bglobal.WhatToGet (players[i].mo, this); - //unclock (BotWTG); - BotWTG++; - } - else if (flags & MF_MISSILE) - { - if (!players[i].missile && (flags3 & MF3_WARNBOT)) - { //warn for incoming missiles. - if (target != players[i].mo && bglobal.Check_LOS (players[i].mo, this, ANGLE_90)) - players[i].missile = this; + else + { + momz = FixedMul (momz, 0xe800); } } } - bglobal.m_Thinking = false; - unclock (BotSupportCycles); - } - //End of MC - - // [RH] Consider carrying sectors here - fixed_t cummx = 0, cummy = 0; - if ((level.Scrolls != NULL || player != NULL) && !(flags & MF_NOCLIP) && !(flags & MF_NOSECTOR)) - { - fixed_t height, waterheight; // killough 4/4/98: add waterheight - const msecnode_t *node; - int countx, county; - - // killough 3/7/98: Carry things on floor - // killough 3/20/98: use new sector list which reflects true members - // killough 3/27/98: fix carrier bug - // killough 4/4/98: Underwater, carry things even w/o gravity - - // Move objects only if on floor or underwater, - // non-floating, and clipped. - - countx = county = 0; - - for (node = touching_sectorlist; node; node = node->m_tnext) + // [RH] Pulse in and out of visibility + if (effects & FX_VISIBILITYPULSE) { - const sector_t *sec = node->m_sector; - fixed_t scrollx, scrolly; - - if (level.Scrolls != NULL) + if (visdir > 0) { - const FSectorScrollValues *scroll = &level.Scrolls[sec - sectors]; - scrollx = scroll->ScrollX; - scrolly = scroll->ScrollY; + alpha += 0x800; + if (alpha >= OPAQUE) + { + alpha = OPAQUE; + visdir = -1; + } } else { - scrollx = scrolly = 0; + alpha -= 0x800; + if (alpha <= TRANSLUC25) + { + alpha = TRANSLUC25; + visdir = 1; + } } - - if (player != NULL) + } + else if (flags & MF_STEALTH) + { + // [RH] Fade a stealth monster in and out of visibility + RenderStyle.Flags &= ~STYLEF_Alpha1; + if (visdir > 0) { - int scrolltype = sec->special & 0xff; + alpha += 2*FRACUNIT/TICRATE; + if (alpha > OPAQUE) + { + alpha = OPAQUE; + visdir = 0; + } + } + else if (visdir < 0) + { + alpha -= 3*FRACUNIT/TICRATE/2; + if (alpha < 0) + { + alpha = 0; + visdir = 0; + } + } + } - if (scrolltype >= Scroll_North_Slow && - scrolltype <= Scroll_SouthWest_Fast) - { // Hexen scroll special - scrolltype -= Scroll_North_Slow; - if (i_compatflags&COMPATF_RAVENSCROLL) - { - angle_t fineangle = HexenScrollDirs[scrolltype / 3] * 32; - fixed_t carryspeed = DivScale32 (HexenSpeedMuls[scrolltype % 3], 32*CARRYFACTOR); + if (bglobal.botnum && consoleplayer == Net_Arbitrator && !demoplayback && + (flags & (MF_SPECIAL|MF_MISSILE)) || (flags3 & MF3_ISMONSTER)) + { + clock (BotSupportCycles); + bglobal.m_Thinking = true; + for (i = 0; i < MAXPLAYERS; i++) + { + if (!playeringame[i] || !players[i].isbot) + continue; + + if (flags3 & MF3_ISMONSTER) + { + if (health > 0 + && !players[i].enemy + && player ? !IsTeammate (players[i].mo) : true + && P_AproxDistance (players[i].mo->x-x, players[i].mo->y-y) < MAX_MONSTER_TARGET_DIST + && P_CheckSight (players[i].mo, this, 2)) + { //Probably a monster, so go kill it. + players[i].enemy = this; + } + } + else if (flags & MF_SPECIAL) + { //Item pickup time + //clock (BotWTG); + bglobal.WhatToGet (players[i].mo, this); + //unclock (BotWTG); + BotWTG++; + } + else if (flags & MF_MISSILE) + { + if (!players[i].missile && (flags3 & MF3_WARNBOT)) + { //warn for incoming missiles. + if (target != players[i].mo && bglobal.Check_LOS (players[i].mo, this, ANGLE_90)) + players[i].missile = this; + } + } + } + bglobal.m_Thinking = false; + unclock (BotSupportCycles); + } + + //End of MC + + // [RH] Consider carrying sectors here + fixed_t cummx = 0, cummy = 0; + if ((level.Scrolls != NULL || player != NULL) && !(flags & MF_NOCLIP) && !(flags & MF_NOSECTOR)) + { + fixed_t height, waterheight; // killough 4/4/98: add waterheight + const msecnode_t *node; + int countx, county; + + // killough 3/7/98: Carry things on floor + // killough 3/20/98: use new sector list which reflects true members + // killough 3/27/98: fix carrier bug + // killough 4/4/98: Underwater, carry things even w/o gravity + + // Move objects only if on floor or underwater, + // non-floating, and clipped. + + countx = county = 0; + + for (node = touching_sectorlist; node; node = node->m_tnext) + { + const sector_t *sec = node->m_sector; + fixed_t scrollx, scrolly; + + if (level.Scrolls != NULL) + { + const FSectorScrollValues *scroll = &level.Scrolls[sec - sectors]; + scrollx = scroll->ScrollX; + scrolly = scroll->ScrollY; + } + else + { + scrollx = scrolly = 0; + } + + if (player != NULL) + { + int scrolltype = sec->special & 0xff; + + if (scrolltype >= Scroll_North_Slow && + scrolltype <= Scroll_SouthWest_Fast) + { // Hexen scroll special + scrolltype -= Scroll_North_Slow; + if (i_compatflags&COMPATF_RAVENSCROLL) + { + angle_t fineangle = HexenScrollDirs[scrolltype / 3] * 32; + fixed_t carryspeed = DivScale32 (HexenSpeedMuls[scrolltype % 3], 32*CARRYFACTOR); + scrollx += FixedMul (carryspeed, finecosine[fineangle]); + scrolly += FixedMul (carryspeed, finesine[fineangle]); + } + else + { + // Use speeds that actually match the scrolling textures! + scrollx -= HexenScrollies[scrolltype][0] << (FRACBITS-1); + scrolly += HexenScrollies[scrolltype][1] << (FRACBITS-1); + } + } + else if (scrolltype >= Carry_East5 && + scrolltype <= Carry_West35) + { // Heretic scroll special + scrolltype -= Carry_East5; + BYTE dir = HereticScrollDirs[scrolltype / 5]; + fixed_t carryspeed = DivScale32 (HereticSpeedMuls[scrolltype % 5], 32*CARRYFACTOR); + if (scrolltype<=Carry_East35 && !(i_compatflags&COMPATF_RAVENSCROLL)) + { + // Use speeds that actually match the scrolling textures! + carryspeed = (1 << ((scrolltype%5) + FRACBITS-1)); + } + scrollx += carryspeed * ((dir & 3) - 1); + scrolly += carryspeed * (((dir & 12) >> 2) - 1); + } + else if (scrolltype == dScroll_EastLavaDamage) + { // Special Heretic scroll special + if (i_compatflags&COMPATF_RAVENSCROLL) + { + scrollx += DivScale32 (28, 32*CARRYFACTOR); + } + else + { + // Use a speed that actually matches the scrolling texture! + scrollx += DivScale32 (12, 32*CARRYFACTOR); + } + } + else if (scrolltype == Scroll_StrifeCurrent) + { // Strife scroll special + int anglespeed = sec->tag - 100; + fixed_t carryspeed = DivScale32 (anglespeed % 10, 16*CARRYFACTOR); + angle_t fineangle = (anglespeed / 10) << (32-3); + fineangle >>= ANGLETOFINESHIFT; scrollx += FixedMul (carryspeed, finecosine[fineangle]); scrolly += FixedMul (carryspeed, finesine[fineangle]); } - else - { - // Use speeds that actually match the scrolling textures! - scrollx -= HexenScrollies[scrolltype][0] << (FRACBITS-1); - scrolly += HexenScrollies[scrolltype][1] << (FRACBITS-1); - } } - else if (scrolltype >= Carry_East5 && - scrolltype <= Carry_West35) - { // Heretic scroll special - scrolltype -= Carry_East5; - BYTE dir = HereticScrollDirs[scrolltype / 5]; - fixed_t carryspeed = DivScale32 (HereticSpeedMuls[scrolltype % 5], 32*CARRYFACTOR); - if (scrolltype<=Carry_East35 && !(i_compatflags&COMPATF_RAVENSCROLL)) - { - // Use speeds that actually match the scrolling textures! - carryspeed = (1 << ((scrolltype%5) + FRACBITS-1)); - } - scrollx += carryspeed * ((dir & 3) - 1); - scrolly += carryspeed * (((dir & 12) >> 2) - 1); - } - else if (scrolltype == dScroll_EastLavaDamage) - { // Special Heretic scroll special - if (i_compatflags&COMPATF_RAVENSCROLL) - { - scrollx += DivScale32 (28, 32*CARRYFACTOR); - } - else - { - // Use a speed that actually matches the scrolling texture! - scrollx += DivScale32 (12, 32*CARRYFACTOR); - } - } - else if (scrolltype == Scroll_StrifeCurrent) - { // Strife scroll special - int anglespeed = sec->tag - 100; - fixed_t carryspeed = DivScale32 (anglespeed % 10, 16*CARRYFACTOR); - angle_t fineangle = (anglespeed / 10) << (32-3); - fineangle >>= ANGLETOFINESHIFT; - scrollx += FixedMul (carryspeed, finecosine[fineangle]); - scrolly += FixedMul (carryspeed, finesine[fineangle]); - } - } - if ((scrollx | scrolly) == 0) - { - continue; - } - if (flags & MF_NOGRAVITY && - (sec->heightsec == NULL || (sec->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC))) - { - continue; - } - height = sec->floorplane.ZatPoint (x, y); - if (z > height) - { - if (sec->heightsec == NULL || (sec->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC)) + if ((scrollx | scrolly) == 0) { continue; } - - waterheight = sec->heightsec->floorplane.ZatPoint (x, y); - if (waterheight > height && z >= waterheight) + if (flags & MF_NOGRAVITY && + (sec->heightsec == NULL || (sec->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC))) { continue; } - } - - cummx += scrollx; - cummy += scrolly; - if (scrollx) countx++; - if (scrolly) county++; - } - - // Some levels designed with Boom in mind actually want things to accelerate - // at neighboring scrolling sector boundaries. But it is only important for - // non-player objects. - if (player != NULL || !(i_compatflags & COMPATF_BOOMSCROLL)) - { - if (countx > 1) - { - cummx /= countx; - } - if (county > 1) - { - cummy /= county; - } - } - } - - // [RH] If standing on a steep slope, fall down it - if ((flags & MF_SOLID) && !(flags & (MF_NOCLIP|MF_NOGRAVITY)) && - !(flags & MF_NOBLOCKMAP) && - momz <= 0 && - floorz == z) - { - const secplane_t * floorplane = &floorsector->floorplane; - if (floorplane->c < STEEPSLOPE && - floorplane->ZatPoint (x, y) <= floorz) - { - const msecnode_t *node; - bool dopush = true; - - if (floorplane->c > STEEPSLOPE*2/3) - { - for (node = touching_sectorlist; node; node = node->m_tnext) + height = sec->floorplane.ZatPoint (x, y); + if (z > height) { - const sector_t *sec = node->m_sector; - if (sec->floorplane.c >= STEEPSLOPE) + if (sec->heightsec == NULL || (sec->heightsec->MoreFlags & SECF_IGNOREHEIGHTSEC)) { - if (floorplane->ZatPoint (x, y) >= z - MaxStepHeight) + continue; + } + + waterheight = sec->heightsec->floorplane.ZatPoint (x, y); + if (waterheight > height && z >= waterheight) + { + continue; + } + } + + cummx += scrollx; + cummy += scrolly; + if (scrollx) countx++; + if (scrolly) county++; + } + + // Some levels designed with Boom in mind actually want things to accelerate + // at neighboring scrolling sector boundaries. But it is only important for + // non-player objects. + if (player != NULL || !(i_compatflags & COMPATF_BOOMSCROLL)) + { + if (countx > 1) + { + cummx /= countx; + } + if (county > 1) + { + cummy /= county; + } + } + } + + // [RH] If standing on a steep slope, fall down it + if ((flags & MF_SOLID) && !(flags & (MF_NOCLIP|MF_NOGRAVITY)) && + !(flags & MF_NOBLOCKMAP) && + momz <= 0 && + floorz == z) + { + const secplane_t * floorplane = &floorsector->floorplane; + if (floorplane->c < STEEPSLOPE && + floorplane->ZatPoint (x, y) <= floorz) + { + const msecnode_t *node; + bool dopush = true; + + if (floorplane->c > STEEPSLOPE*2/3) + { + for (node = touching_sectorlist; node; node = node->m_tnext) + { + const sector_t *sec = node->m_sector; + if (sec->floorplane.c >= STEEPSLOPE) { - dopush = false; - break; + if (floorplane->ZatPoint (x, y) >= z - MaxStepHeight) + { + dopush = false; + break; + } } } } - } - if (dopush) - { - momx += floorplane->a; - momy += floorplane->b; + if (dopush) + { + momx += floorplane->a; + momy += floorplane->b; + } } } - } - // [RH] Missiles moving perfectly vertical need some X/Y movement, or they - // won't hurt anything. Don't do this if damage is 0! That way, you can - // still have missiles that go straight up and down through actors without - // damaging anything. - if ((flags & MF_MISSILE) && (momx|momy) == 0 && Damage != 0) - { - momx = 1; - } - - // Handle X and Y momemtums - BlockingMobj = NULL; - P_XYMovement (this, cummx, cummy); - if (ObjectFlags & OF_EuthanizeMe) - { // actor was destroyed - return; - } - if ((momx | momy) == 0 && (flags2 & MF2_BLASTED)) - { // Reset to not blasted when momentums are gone - flags2 &= ~MF2_BLASTED; - } - - if (flags2 & MF2_FLOATBOB) - { // Floating item bobbing motion - z += FloatBobDiffs[(FloatBobPhase + level.maptime) & 63]; - } - if (momz || BlockingMobj || - (z != floorz && (!(flags2 & MF2_FLOATBOB) || - (z - FloatBobOffsets[(FloatBobPhase + level.maptime) & 63] != floorz) - ))) - { // Handle Z momentum and gravity - if (((flags2 & MF2_PASSMOBJ) || (flags & MF_SPECIAL)) && !(i_compatflags & COMPATF_NO_PASSMOBJ)) + // [RH] Missiles moving perfectly vertical need some X/Y movement, or they + // won't hurt anything. Don't do this if damage is 0! That way, you can + // still have missiles that go straight up and down through actors without + // damaging anything. + if ((flags & MF_MISSILE) && (momx|momy) == 0 && Damage != 0) { - if (!(onmo = P_CheckOnmobj (this))) + momx = 1; + } + + // Handle X and Y momemtums + BlockingMobj = NULL; + P_XYMovement (this, cummx, cummy); + if (ObjectFlags & OF_EuthanizeMe) + { // actor was destroyed + return; + } + if ((momx | momy) == 0 && (flags2 & MF2_BLASTED)) + { // Reset to not blasted when momentums are gone + flags2 &= ~MF2_BLASTED; + } + + if (flags2 & MF2_FLOATBOB) + { // Floating item bobbing motion + z += FloatBobDiffs[(FloatBobPhase + level.maptime) & 63]; + } + if (momz || BlockingMobj || + (z != floorz && (!(flags2 & MF2_FLOATBOB) || + (z - FloatBobOffsets[(FloatBobPhase + level.maptime) & 63] != floorz) + ))) + { // Handle Z momentum and gravity + if (((flags2 & MF2_PASSMOBJ) || (flags & MF_SPECIAL)) && !(i_compatflags & COMPATF_NO_PASSMOBJ)) { - P_ZMovement (this); - flags2 &= ~MF2_ONMOBJ; + if (!(onmo = P_CheckOnmobj (this))) + { + P_ZMovement (this); + flags2 &= ~MF2_ONMOBJ; + } + else + { + if (player) + { + if (momz < (fixed_t)(level.gravity * Sector->gravity * -655.36f) + && !(flags&MF_NOGRAVITY)) + { + PlayerLandedOnThing (this, onmo); + } + } + if (onmo->z + onmo->height - z <= MaxStepHeight) + { + if (player && player->mo == this) + { + player->viewheight -= onmo->z + onmo->height - z; + fixed_t deltaview = player->GetDeltaViewHeight(); + if (deltaview > player->deltaviewheight) + { + player->deltaviewheight = deltaview; + } + } + z = onmo->z + onmo->height; + } + flags2 |= MF2_ONMOBJ; + momz = 0; + Crash(); + } } else { - if (player) - { - if (momz < (fixed_t)(level.gravity * Sector->gravity * -655.36f) - && !(flags&MF_NOGRAVITY)) - { - PlayerLandedOnThing (this, onmo); - } - } - if (onmo->z + onmo->height - z <= MaxStepHeight) - { - if (player && player->mo == this) - { - player->viewheight -= onmo->z + onmo->height - z; - fixed_t deltaview = player->GetDeltaViewHeight(); - if (deltaview > player->deltaviewheight) - { - player->deltaviewheight = deltaview; - } - } - z = onmo->z + onmo->height; - } - flags2 |= MF2_ONMOBJ; - momz = 0; - Crash(); + P_ZMovement (this); } + + if (ObjectFlags & OF_EuthanizeMe) + return; // actor was destroyed } - else + else if (z <= floorz) { - P_ZMovement (this); + Crash(); } - if (ObjectFlags & OF_EuthanizeMe) - return; // actor was destroyed - } - else if (z <= floorz) - { - Crash(); - } + UpdateWaterLevel (oldz); - UpdateWaterLevel (oldz); - - // [RH] Don't advance if predicting a player - if (player && (player->cheats & CF_PREDICTING)) - { - return; + // [RH] Don't advance if predicting a player + if (player && (player->cheats & CF_PREDICTING)) + { + return; + } } // cycle through states, calling action functions at transitions @@ -3195,7 +3211,7 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t actor->ceilingsector = actor->Sector; actor->ceilingpic = actor->ceilingsector->ceilingpic; } - else + else if (!(actor->flags5 & MF5_NOINTERACTION)) { P_FindFloorCeiling (actor); actor->floorz = tmffloorz; @@ -3206,6 +3222,16 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t actor->ceilingpic = tmfceilingpic; actor->ceilingsector = tmfceilingsector; } + else + { + actor->floorz = FIXED_MIN; + actor->dropoffz = FIXED_MIN; + actor->ceilingz = FIXED_MAX; + actor->floorpic = 0; + actor->floorsector = actor->Sector; + actor->ceilingpic = 0; + actor->ceilingsector = actor->Sector; + } actor->SpawnPoint[0] = ix >> FRACBITS; actor->SpawnPoint[1] = iy >> FRACBITS; @@ -4922,6 +4948,13 @@ void AActor::Crash() } } +void AActor::SetIdle() +{ + FState *idle = FindState (NAME_Idle); + if (idle == NULL) idle = SpawnState; + SetState(idle); +} + FArchive &operator<< (FArchive &arc, FSoundIndex &snd) { if (arc.IsStoring ()) diff --git a/src/sdl/sdlvideo.cpp b/src/sdl/sdlvideo.cpp index 441ef0d20..063f446c4 100644 --- a/src/sdl/sdlvideo.cpp +++ b/src/sdl/sdlvideo.cpp @@ -111,40 +111,40 @@ CUSTOM_CVAR (Float, bgamma, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) static MiniModeInfo WinModes[] = { { 320, 200 }, - { 320, 240 }, + { 320, 240 }, { 400, 225 }, // 16:9 - { 400, 300 }, + { 400, 300 }, { 480, 270 }, // 16:9 - { 480, 360 }, + { 480, 360 }, { 512, 288 }, // 16:9 - { 512, 384 }, + { 512, 384 }, { 640, 360 }, // 16:9 { 640, 400 }, - { 640, 480 }, + { 640, 480 }, { 720, 480 }, // 16:10 - { 720, 540 }, - { 800, 450 }, // 16:9 + { 720, 540 }, + { 800, 450 }, // 16:9 { 800, 500 }, // 16:10 - { 800, 600 }, - { 848, 480 }, // 16:9 + { 800, 600 }, + { 848, 480 }, // 16:9 { 960, 600 }, // 16:10 - { 960, 720 }, - { 1024, 576 }, // 16:9 + { 960, 720 }, + { 1024, 576 }, // 16:9 { 1024, 640 }, // 16:10 - { 1024, 768 }, - { 1088, 612 }, // 16:9 - { 1152, 648 }, // 16:9 + { 1024, 768 }, + { 1088, 612 }, // 16:9 + { 1152, 648 }, // 16:9 { 1152, 720 }, // 16:10 - { 1152, 864 }, - { 1280, 720 }, // 16:9 + { 1152, 864 }, + { 1280, 720 }, // 16:9 { 1280, 800 }, // 16:10 - { 1280, 960 }, - { 1360, 768 }, // 16:9 - { 1400, 787 }, // 16:9 - { 1400, 875 }, // 16:10 - { 1400, 1050 }, - { 1600, 900 }, // 16:9 - { 1600, 1000 }, // 16:10 + { 1280, 960 }, + { 1360, 768 }, // 16:9 + { 1400, 787 }, // 16:9 + { 1400, 875 }, // 16:10 + { 1400, 1050 }, + { 1600, 900 }, // 16:9 + { 1600, 1000 }, // 16:10 { 1600, 1200 }, }; diff --git a/src/thingdef/thingdef_properties.cpp b/src/thingdef/thingdef_properties.cpp index 06c03792f..739b27cbe 100644 --- a/src/thingdef/thingdef_properties.cpp +++ b/src/thingdef/thingdef_properties.cpp @@ -235,6 +235,7 @@ static flagdef ActorFlags[]= DEFINE_FLAG(MF5, NEVERRESPAWN, AActor, flags5), DEFINE_FLAG(MF5, DONTRIP, AActor, flags5), DEFINE_FLAG(MF5, NOINFIGHTING, AActor, flags5), + DEFINE_FLAG(MF5, NOINTERACTION, AActor, flags5), // Effect flags DEFINE_FLAG(FX, VISIBILITYPULSE, AActor, effects),