|
|
|
@ -16,22 +16,22 @@ static const int elementals[4] = {
|
|
|
|
|
void
|
|
|
|
|
newemin(struct monst *mtmp)
|
|
|
|
|
{
|
|
|
|
|
if (!mtmp->mextra)
|
|
|
|
|
mtmp->mextra = newmextra();
|
|
|
|
|
if (!EMIN(mtmp)) {
|
|
|
|
|
EMIN(mtmp) = (struct emin *) alloc(sizeof(struct emin));
|
|
|
|
|
(void) memset((genericptr_t) EMIN(mtmp), 0, sizeof(struct emin));
|
|
|
|
|
if (!mtmp->mextra) // If the monster does not have an mextra structure
|
|
|
|
|
mtmp->mextra = newmextra(); // Create a new mextra structure for the monster
|
|
|
|
|
if (!EMIN(mtmp)) { // If the monster does not have an emin structure
|
|
|
|
|
EMIN(mtmp) = (struct emin *) alloc(sizeof(struct emin)); // Allocate memory for the emin structure
|
|
|
|
|
(void) memset((genericptr_t) EMIN(mtmp), 0, sizeof(struct emin)); // Initialize the emin structure with zeros
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
free_emin(struct monst *mtmp)
|
|
|
|
|
{
|
|
|
|
|
if (mtmp->mextra && EMIN(mtmp)) {
|
|
|
|
|
free((genericptr_t) EMIN(mtmp));
|
|
|
|
|
EMIN(mtmp) = (struct emin *) 0;
|
|
|
|
|
if (mtmp->mextra && EMIN(mtmp)) { // If the monster has an mextra structure and an emin structure
|
|
|
|
|
free((genericptr_t) EMIN(mtmp)); // Free the memory allocated for the emin structure
|
|
|
|
|
EMIN(mtmp) = (struct emin *) 0; // Set the emin pointer to null
|
|
|
|
|
}
|
|
|
|
|
mtmp->isminion = 0;
|
|
|
|
|
mtmp->isminion = 0; // Set the isminion flag to 0 to indicate that the monster is not a minion
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* count the number of monsters on the level */
|
|
|
|
@ -42,15 +42,15 @@ monster_census(boolean spotted) /* seen|sensed vs all */
|
|
|
|
|
int count = 0;
|
|
|
|
|
|
|
|
|
|
for (mtmp = fmon; mtmp; mtmp = mtmp->nmon) {
|
|
|
|
|
if (DEADMONSTER(mtmp))
|
|
|
|
|
if (DEADMONSTER(mtmp)) // If the monster is dead, skip to the next monster
|
|
|
|
|
continue;
|
|
|
|
|
if (mtmp->isgd && mtmp->mx == 0)
|
|
|
|
|
if (mtmp->isgd && mtmp->mx == 0) // If the monster is a guardian and is not on the map, skip to the next monster
|
|
|
|
|
continue;
|
|
|
|
|
if (spotted && !canspotmon(mtmp))
|
|
|
|
|
if (spotted && !canspotmon(mtmp)) // If spotted flag is true and the monster is not visible, skip to the next monster
|
|
|
|
|
continue;
|
|
|
|
|
++count;
|
|
|
|
|
++count; // Increment the count
|
|
|
|
|
}
|
|
|
|
|
return count;
|
|
|
|
|
return count; // Return the final count
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* mon summons a monster */
|
|
|
|
@ -133,11 +133,11 @@ msummon(struct monst *mon)
|
|
|
|
|
* If this daemon is unique and being re-summoned (the only way we
|
|
|
|
|
* could get this far with an extinct dtype), try another.
|
|
|
|
|
*/
|
|
|
|
|
if ((gm.mvitals[dtype].mvflags & G_GONE) != 0) {
|
|
|
|
|
dtype = ndemon(atyp);
|
|
|
|
|
if (dtype == NON_PM)
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
if ((gm.mvitals[dtype].mvflags & G_GONE) != 0) { // Check if the monster type is flagged as gone
|
|
|
|
|
dtype = ndemon(atyp); // Generate a new demon monster type
|
|
|
|
|
if (dtype == NON_PM) // If the generated type is not a valid monster type
|
|
|
|
|
return 0; // Return 0 to indicate failure
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* some candidates can generate a group of monsters, so simple
|
|
|
|
|
count of non-null makemon() result is not sufficient */
|
|
|
|
@ -426,12 +426,12 @@ lminion(void)
|
|
|
|
|
struct permonst *ptr;
|
|
|
|
|
|
|
|
|
|
for (tryct = 0; tryct < 20; tryct++) {
|
|
|
|
|
ptr = mkclass(S_ANGEL, 0);
|
|
|
|
|
if (ptr && !is_lord(ptr))
|
|
|
|
|
return monsndx(ptr);
|
|
|
|
|
ptr = mkclass(S_ANGEL, 0); // Generate a random monster class of angels
|
|
|
|
|
if (ptr && !is_lord(ptr)) // If a valid non-lord monster is generated
|
|
|
|
|
return monsndx(ptr); // Return the monster number
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return NON_PM;
|
|
|
|
|
return NON_PM; // Return NON_PM if no valid non-lord monster can be generated after 20 tries
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int
|
|
|
|
|