Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
Sigvatr

Things about Doom you just found out

Recommended Posts

Today I learned that in GZDoom's Standard light mode, a sector of 230 brightness or more will fade to light.  A sector of 229 brightness will fade to half light.  And a sector of 228 brightness or less will fade to darkness.

Share this post


Link to post
4 hours ago, Dravencour said:

You can't offset flats in vanilla either. If you want your flats aligned, your sectors have to conform to the grid.

If you relax the vanilla requirement to Boom you can set flat alignment precisely using displacement scrollers (types 245/246). You have a control line / sector for each flat you want realigned, and one more that raises the floor of all your control sectors to ceiling, which needs to be activated somehow (by player or voodoo doll). So although it requires some effort, it is still at least possible outside of advanced formats. They just make it easier (in the same way that many Boom features were possible in vanilla with enough work).

Share this post


Link to post

To offset flats in vanilla, you can make, include and use custom flats that look like the original ones with the offset you want, like this:

 

4wLFCQE.png

 

A flat looking like this in an editor will look normal on a teleport pedestal sector that is offset by a specific value from the 64 unit grid.

Edited by scifista42

Share this post


Link to post
6 hours ago, scifista42 said:

use custom flats

Yeah, I'd call that the nuclear option. For last resort only.

Share this post


Link to post

Using some WAD hacking tricks, you could make a teleport texture be able to be aligned anywhere on an 8-pixel grid using only 60 kilobytes total, compared to the 256 kilobytes it would take to do it naively.

Share this post


Link to post

Two players can thing run against eachother for an insane speedboost across pretty much any gap, such as the start of doom 2 map 29 to get straight onto the stairs at the end. Probably only doable in TAS due to needing the right angles and both players to move together

Share this post


Link to post

I just learned that the -turbo parameter was implemented to help Shawn Green defeat John Romero in deathmatch.

Share this post


Link to post
On 2017/10/17 at 4:14 AM, Linguica said:

Using some WAD hacking tricks, you could make a teleport texture be able to be aligned anywhere on an 8-pixel grid using only 60 kilobytes total, compared to the 256 kilobytes it would take to do it naively.

Go on...

Share this post


Link to post
On 10/16/2017 at 8:39 PM, riderr3 said:

That's where the Final Doom cover came from.
93e8b06d96bcb45f38b2c8e0d8329994.jpg

I always wondered why they'd use a box of inert (dud) cartridges on the cover of a Doom game. Maybe as a subtle hint to gamers?

Share this post


Link to post

I just learned that id Software created a shockingly egregious canonical error when they censored all of the blood in Quake 3 Arena to create the T-rated Quake Live version. They ended up removing one of Doomguy's trademark characteristics, brazenly flying in the face of long established Doom canon!

 

gLNjgBh.jpg

Share this post


Link to post
On 10/20/2017 at 3:52 PM, Gez said:

It makes sense to use practice rounds for a simulation.

Only that a "practice" round isn't necessarily the same thing as "inert" or "dummy".

 

On 10/21/2017 at 2:16 AM, Revenant100 said:

I just learned that id Software created a shockingly egregious canonical error when they censored all of the blood in Quake 3 Arena to create the T-rated Quake Live version. They ended up removing one of Doomguy's trademark characteristics, brazenly flying in the face of long established Doom canon!

Well...maybe "Doom" just healed, after all this time. Does he really have to keep open, bleeding wounds for all Eternity? Who is he, Jesus Christ?

 

 

 


924094f6-a25c-4bc1-8b5e-a743e5e9b501.pngshroud2-4_3.jpg

 

...OK, he got us there.
 

 

Edited by Maes

Share this post


Link to post
On 17.10.2017. at 3:14 AM, Linguica said:

Using some WAD hacking tricks, you could make a teleport texture be able to be aligned anywhere on an 8-pixel grid using only 60 kilobytes total, compared to the 256 kilobytes it would take to do it naively.

Do you mean this? Or is it another discovery of yours?

 

Share this post


Link to post
3 minutes ago, bzzrak said:

Do you mean this? Or is it another discovery of yours?

Yes, basically that, but modified a little so flats don't have the one-off seam issue.

Share this post


Link to post

Linguica said in that thread that offsets along just the Y axis are safe from the one-off seam issue, so I guess the "modification" consists of creating 8 copies of the extended flat data, each adjusted to look properly at a given 8-unit offset along the X axis, then define the Y offsets using the trick described in the thread - this way, the total size would be 8-times 8 KB.

 

Taking the idea further, to cover every possible offset along both axes, the size would have to be 64-times 8 KB - 64 copies of the data for each X offset, while the Y offsets remain free.

Edited by scifista42

Share this post


Link to post

Such a basic thing I never noticed. Found out from doom_txt on Twitter.

 

Quote

When you're hit, your face looks in the direction from which the damage came

 

Share this post


Link to post

There seems to be a complicated priority-based behavior for the hud face's state changes:

 

Spoiler

//
// This is a not-very-pretty routine which handles
//  the face states and their timing.
// the precedence of expressions is:
//  dead > evil grin > turned head > straight ahead
//
void ST_updateFaceWidget(void)
{
    int		i;
    angle_t	badguyangle;
    angle_t	diffang;
    static int	lastattackdown = -1;
    static int	priority = 0;
    boolean	doevilgrin;

    if (priority < 10)
    {
	// dead
	if (!plyr->health)
	{
	    priority = 9;
	    st_faceindex = ST_DEADFACE;
	    st_facecount = 1;
	}
    }

    if (priority < 9)
    {
	if (plyr->bonuscount)
	{
	    // picking up bonus
	    doevilgrin = false;

	    for (i=0;i<NUMWEAPONS;i++)
	    {
		if (oldweaponsowned[i] != plyr->weaponowned[i])
		{
		    doevilgrin = true;
		    oldweaponsowned[i] = plyr->weaponowned[i];
		}
	    }
	    if (doevilgrin) 
	    {
		// evil grin if just picked up weapon
		priority = 8;
		st_facecount = ST_EVILGRINCOUNT;
		st_faceindex = ST_calcPainOffset() + ST_EVILGRINOFFSET;
	    }
	}

    }
  
    if (priority < 8)
    {
	if (plyr->damagecount
	    && plyr->attacker
	    && plyr->attacker != plyr->mo)
	{
	    // being attacked
	    priority = 7;
	    
	    if (plyr->health - st_oldhealth > ST_MUCHPAIN)
	    {
		st_facecount = ST_TURNCOUNT;
		st_faceindex = ST_calcPainOffset() + ST_OUCHOFFSET;
	    }
	    else
	    {
		badguyangle = R_PointToAngle2(plyr->mo->x,
					      plyr->mo->y,
					      plyr->attacker->x,
					      plyr->attacker->y);
		
		if (badguyangle > plyr->mo->angle)
		{
		    // whether right or left
		    diffang = badguyangle - plyr->mo->angle;
		    i = diffang > ANG180; 
		}
		else
		{
		    // whether left or right
		    diffang = plyr->mo->angle - badguyangle;
		    i = diffang <= ANG180; 
		} // confusing, aint it?

		
		st_facecount = ST_TURNCOUNT;
		st_faceindex = ST_calcPainOffset();
		
		if (diffang < ANG45)
		{
		    // head-on    
		    st_faceindex += ST_RAMPAGEOFFSET;
		}
		else if (i)
		{
		    // turn face right
		    st_faceindex += ST_TURNOFFSET;
		}
		else
		{
		    // turn face left
		    st_faceindex += ST_TURNOFFSET+1;
		}
	    }
	}
    }
  
    if (priority < 7)
    {
	// getting hurt because of your own damn stupidity
	if (plyr->damagecount)
	{
	    if (plyr->health - st_oldhealth > ST_MUCHPAIN)
	    {
		priority = 7;
		st_facecount = ST_TURNCOUNT;
		st_faceindex = ST_calcPainOffset() + ST_OUCHOFFSET;
	    }
	    else
	    {
		priority = 6;
		st_facecount = ST_TURNCOUNT;
		st_faceindex = ST_calcPainOffset() + ST_RAMPAGEOFFSET;
	    }

	}

    }
  
    if (priority < 6)
    {
	// rapid firing
	if (plyr->attackdown)
	{
	    if (lastattackdown==-1)
		lastattackdown = ST_RAMPAGEDELAY;
	    else if (!--lastattackdown)
	    {
		priority = 5;
		st_faceindex = ST_calcPainOffset() + ST_RAMPAGEOFFSET;
		st_facecount = 1;
		lastattackdown = 1;
	    }
	}
	else
	    lastattackdown = -1;

    }
  
    if (priority < 5)
    {
	// invulnerability
	if ((plyr->cheats & CF_GODMODE)
	    || plyr->powers[pw_invulnerability])
	{
	    priority = 4;

	    st_faceindex = ST_GODFACE;
	    st_facecount = 1;

	}

    }

    // look left or look right if the facecount has timed out
    if (!st_facecount)
    {
	st_faceindex = ST_calcPainOffset() + (st_randomnumber % 3);
	st_facecount = ST_STRAIGHTFACECOUNT;
	priority = 0;
    }

    st_facecount--;

}

 

Share this post


Link to post

The exit door on MAP06 is not the correctly-sized SPCDOOR2, instead it's an unfitting left half of BIGDOOR2. But my brain always perceives it as SPCDOOR2 anyway, so it doesn't matter.

Share this post


Link to post
On 9/24/2017 at 11:33 AM, DoomguyB said:

I didn't know that the design of the Cacodemon was inspired (quite heavily, by the looks of it!) by the Astral Dreadnought creature from Dungeons & Dragons.

 

Astral.jpg

Also the Beholder (somewhat)

Share this post


Link to post
On 10/20/2017 at 4:16 PM, Revenant100 said:

I just learned that id Software created a shockingly egregious canonical error when they censored all of the blood in Quake 3 Arena to create the T-rated Quake Live version. They ended up removing one of Doomguy's trademark characteristics, brazenly flying in the face of long established Doom canon!

 

gLNjgBh.jpg

Someone add this to the Wiki.

Share this post


Link to post

That's really stupid, too. It's not like the blood is free flowing, it's just a scar. I've seen children's cartoons that allow scars. Could just have dulled the color so it doesn't look like a fresh wound.

Share this post


Link to post

Cacodemons don't have a melee attack like other monsters do - while their attack function is a "combo" attack that'll do a melee attack if you're close enough, they don't try to use this. Instead, they only try attacking via their missile attack, and won't try to continuously melee a nearby target like other monsters.

 

Might explain why said combo attack doesn't make a melee sound; the melee attack might've been meant to be removed entirely, but the guy who did it didn't really understand how combo attacks worked.

Share this post


Link to post

I have a possible explanation of how it might have happened. Here are the attack functions of the Imp, Demon and Cacodemon, respectively:

 

Spoiler

void A_TroopAttack (mobj_t* actor)
{
    int		damage;
	
    if (!actor->target)
	return;
		
    A_FaceTarget (actor);
    if (P_CheckMeleeRange (actor))
    {
	S_StartSound (actor, sfx_claw);
	damage = (P_Random()%8+1)*3;
	P_DamageMobj (actor->target, actor, actor, damage);
	return;
    }

    
    // launch a missile
    P_SpawnMissile (actor, actor->target, MT_TROOPSHOT);
}


void A_SargAttack (mobj_t* actor)
{
    int		damage;

    if (!actor->target)
	return;
		
    A_FaceTarget (actor);
    if (P_CheckMeleeRange (actor))
    {
	damage = ((P_Random()%10)+1)*4;
	P_DamageMobj (actor->target, actor, actor, damage);
    }
}

void A_HeadAttack (mobj_t* actor)
{
    int		damage;
	
    if (!actor->target)
	return;
		
    A_FaceTarget (actor);
    if (P_CheckMeleeRange (actor))
    {
	damage = (P_Random()%6+1)*10;
	P_DamageMobj (actor->target, actor, actor, damage);
	return;
    }
    
    // launch a missile
    P_SpawnMissile (actor, actor->target, MT_HEADSHOT);
}

 

 

These three functions actually immediately follow each other in the source code, and there are signs that the Cacodemon's function was based on the previous two, as it mostly looks like the Imp's function, but lacks a sound just like the Demon's function does. But the reason why the Demon's function lacks a sound is because the Demon makes it as a result of its attack sound property in the thing table. So, the function's creator may have assumed that the thing table will take care of the sound, while the thing table's creator may have assumed that the function will take care of the sound. Even if they were the same person, he could have made a mistake this way, by failing to realize that neither the side he was currently working on, nor the other side, took care of the sound.

Edited by scifista42

Share this post


Link to post

I think it's far more likely that the sound in A_TroopAttack was added later and A_HeadAttack was just forgotten about when the change was made.

Doom actually shows lots of signs of sloppy and unorganized development all throughout its code.

 

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×