Talk:Monster spawner


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))

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;
	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))
    // 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[edit]

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. —Preceding unsigned comment added by (talk)

There's no need to be so agressive. That mythology edit was made many years ago, back when people liked to speculate a lot and the wikis were usually less formal. I understand that that part was irrelevant, but you should take it easy. :) --lil'devil (talk) 08:56, 14 January 2019 (CST)
Welcome to ban land. --Quasar (talk) 08:59, 14 January 2019 (CST)