Difference between revisions of "Talk:Monster spawner"

From DoomWiki.org

m
(inane crap about Paradise Lost and Greek Mythology: new section)
Line 92: Line 92:
 
Now I'm not exactly sure how it works. It inits an int to 0, then [[Wikipedia:Operators in C and C++#Bitwise operators|bitwise-XORize]] it with 1 to something like 111..110, which is true, so !easy is false, so the <code>return</code> is never executed. From my understanding of the code at least. However, I think what it's supposed to do is provoke a return every two calls, so that the boss shooter spits a spawn cube half as fast as on harder skill levels. At least, that is how ZDoom does it, but the code has practically nothing in common now.--[[User:Gez|Gez]] 21:35, 7 August 2008 (UTC)
 
Now I'm not exactly sure how it works. It inits an int to 0, then [[Wikipedia:Operators in C and C++#Bitwise operators|bitwise-XORize]] it with 1 to something like 111..110, which is true, so !easy is false, so the <code>return</code> is never executed. From my understanding of the code at least. However, I think what it's supposed to do is provoke a return every two calls, so that the boss shooter spits a spawn cube half as fast as on harder skill levels. At least, that is how ZDoom does it, but the code has practically nothing in common now.--[[User:Gez|Gez]] 21:35, 7 August 2008 (UTC)
 
::I overlooked the <code>static</code> keyword. First it's 0, then 111..1110 on the first call. On the second call to this function, it's XORed again to 0, and on the third it's back to 111..1110, and so on. So yeah. It just makes it so that the cube is spitted only half the time A_BrainSpit is called. --[[User:Gez|Gez]] 21:40, 7 August 2008 (UTC)
 
::I overlooked the <code>static</code> keyword. First it's 0, then 111..1110 on the first call. On the second call to this function, it's XORed again to 0, and on the third it's back to 111..1110, and so on. So yeah. It just makes it so that the cube is spitted only half the time A_BrainSpit is called. --[[User:Gez|Gez]] 21:40, 7 August 2008 (UTC)
 +
 +
== inane crap about Paradise Lost and Greek Mythology ==
 +
 +
wow, I'm surprised that the moron who mentioned Paradise Lost and Greek Mythology in the Icon of Sin page didn't fuck up this page, too. Thank god for that. His pseudointellectualist posturing was too much. I hope he burns in hell and his tiny, atrophied brain is destroyed by the heat.

Revision as of 09:47, 14 January 2019

If I'm not mistaken, the chance of spawning each monster is different when the skill level is 1-2 (easy) than when it's 3-5. See p_enemy.c in the source code, but this may be the factor that makes the difference:

static int easy = 0;

easy ^= 1;
if (gameskill <= sk_easy && (!easy))
return;

If I am correct, we need to add what this does to the listed probabilities. Who is like God? 17:47, 7 August 2008 (UTC)

No, this doesn't change the probability in any way. The probability is in A_SpawnFly exclusively:
void A_SpawnFly (mobj_t* mo)
{
    mobj_t*	newmobj;
    mobj_t*	fog;
    mobj_t*	targ;
    int		r;
    mobjtype_t	type;
	
    if (--mo->reactiontime)
	return;	// still flying
	
    targ = mo->target;

    // First spawn teleport fog.
    fog = P_SpawnMobj (targ->x, targ->y, targ->z, MT_SPAWNFIRE);
    S_StartSound (fog, sfx_telept); 

    // Randomly select monster to spawn.
    r = P_Random (); 

    // Probability distribution (kind of :),
    // decreasing likelihood.
    if ( r<50 )
	type = MT_TROOP;
    else if (r<90)
	type = MT_SERGEANT;
    else if (r<120)
	type = MT_SHADOWS;
    else if (r<130)
	type = MT_PAIN;
    else if (r<160)
	type = MT_HEAD;
    else if (r<162)
	type = MT_VILE;
    else if (r<172)
	type = MT_UNDEAD;
    else if (r<192)
	type = MT_BABY;
    else if (r<222)
	type = MT_FATSO;
    else if (r<246)
	type = MT_KNIGHT;
    else
	type = MT_BRUISER;		 

    newmobj	= P_SpawnMobj (targ->x, targ->y, targ->z, type);
    if (P_LookForPlayers (newmobj, true) )
	P_SetMobjState (newmobj, newmobj->info->seestate);
	
    // telefrag anything in this spot
    P_TeleportMove (newmobj, newmobj->x, newmobj->y);

    // remove self (i.e., cube).
    P_RemoveMobj (mo);
}

See? Easy isn't involved there. What easy does is determine if something is spawned at all, since it's in A_BrainSpit.

void A_BrainSpit (mobj_t*	mo)
{
    mobj_t*	targ;
    mobj_t*	newmobj;
    
    static int	easy = 0;
	
    easy ^= 1;
    if (gameskill <= sk_easy && (!easy))
	return;
		
    // shoot a cube at current target
    targ = braintargets[braintargeton];
    braintargeton = (braintargeton+1)%numbraintargets; 

    // spawn brain missile
    newmobj = P_SpawnMissile (mo, targ, MT_SPAWNSHOT);
    newmobj->target = targ;
    newmobj->reactiontime =
	((targ->y - mo->y)/newmobj->momy) / newmobj->state->tics; 

    S_StartSound(NULL, sfx_bospit);
}

Now I'm not exactly sure how it works. It inits an int to 0, then bitwise-XORize it with 1 to something like 111..110, which is true, so !easy is false, so the return is never executed. From my understanding of the code at least. However, I think what it's supposed to do is provoke a return every two calls, so that the boss shooter spits a spawn cube half as fast as on harder skill levels. At least, that is how ZDoom does it, but the code has practically nothing in common now.--Gez 21:35, 7 August 2008 (UTC)

I overlooked the static keyword. First it's 0, then 111..1110 on the first call. On the second call to this function, it's XORed again to 0, and on the third it's back to 111..1110, and so on. So yeah. It just makes it so that the cube is spitted only half the time A_BrainSpit is called. --Gez 21:40, 7 August 2008 (UTC)

inane crap about Paradise Lost and Greek Mythology

wow, I'm surprised that the moron who mentioned Paradise Lost and Greek Mythology in the Icon of Sin page didn't fuck up this page, too. Thank god for that. His pseudointellectualist posturing was too much. I hope he burns in hell and his tiny, atrophied brain is destroyed by the heat.