Пример #1
0
void movemon()
{
    struct monst *mtmp;
    int fr;

    warnlevel = 0;

    while(1) {
        int flag = 0;
        /*
         * Find a monster that we haven't treated yet
         * Note: That mtmp or mtmp->nmon might get killed
         *       while mtmp moves, so we cannot just walk
         *       down the chain (even new monsters might
         *       get created!")
         */
        for(mtmp = fmon; mtmp != NULL; mtmp = mtmp->nmon) {
            if(mtmp->mlstmv < moves) {
                flag = 1;
                break;
            }
        }

        if(flag == 0) {
            /* Treated all monsters */
            break;
        }

        mtmp->mlstmv = moves;
        if(mtmp->mblinded != 0) {
            --mtmp->mblinded;
            
            if(mtmp->mblinded != 0) {
                mtmp->mcansee = 1;
            }
        }
        
        if(mtmp->mimic) {
            continue;
        }

        if((mtmp->mspeed != MSLOW) || ((moves % 2) == 0)) {
            /* Continue if the monster died fighting */
            fr = -1;
            
            if((Conflict != 0) && (cansee(mtmp->mx, mtmp->my) != 0)) {
                fr = fightm(mtmp);

                if(fr == 2) {
                    continue;
                }
            }

            if((fr < 0) && (dochugw(mtmp) != 0)) {
                continue;
            }
        }

        if((mtmp->mspeed == MFAST) && (dochugw(mtmp) != 0)) {
            continue;
        }
    }

    warnlevel -= u.ulevel;
    
    if(warnlevel >= SIZE(warnings)) {
        warnlevel = SIZE(warnings) - 1;
    }

    if(warnlevel >= 0) {
        if((warnlevel > lastwarnlev) || (moves > (lastwarntime + 5))) {
            char *rr;

            switch(Warning & (LEFT_RING | RIGHT_RING)) {
            case LEFT_RING:
                rr = "Your left ring glows";
                
                break;
            case RIGHT_RING:
                rr = "Your right ring glows";
                    
                break;
            case LEFT_RING | RIGHT_RING:
                rr = "Both your rings glow";
            
                break;
            default:
                rr = "You fingertips glow";
            }

            pline("%s %s!", rr, warnings[warnlevel]);
            lastwarntime = moves;
            lastwarnlev = warnlevel;
        }
    }

    /* Remove all dead monsters */
    dmonsfree();
}
Пример #2
0
movemon()
{
	register struct monst *mtmp;
	register int fr;

	warnlevel = 0;

	while(1) {
		/* find a monster that we haven't treated yet */
		/* note that mtmp or mtmp->nmon might get killed
		   while mtmp moves, so we cannot just walk down the
		   chain (even new monsters might get created!) */
		for(mtmp = fmon; mtmp; mtmp = mtmp->nmon)
			if(mtmp->mlstmv < moves) goto next_mon;
		/* treated all monsters */
		break;

	next_mon:
		mtmp->mlstmv = moves;

		/* most monsters drown in pools */
		{ boolean inpool, iseel;

		  inpool = (levl[mtmp->mx][mtmp->my].typ == POOL);
		  iseel = (mtmp->data->mlet == ';');
		  if(inpool && !iseel) {
			if(cansee(mtmp->mx,mtmp->my))
			    pline("%s drowns.", Monnam(mtmp));
			mondead(mtmp);
			continue;
		  }
		/* but eels have a difficult time outside */
		  if(iseel && !inpool) {
			if(mtmp->mhp > 1) mtmp->mhp--;
			mtmp->mflee = 1;
			mtmp->mfleetim += 2;
		  }
		}
		if(mtmp->mblinded && !--mtmp->mblinded)
			mtmp->mcansee = 1;
		if(mtmp->mfleetim && !--mtmp->mfleetim)
			mtmp->mflee = 0;
		if(mtmp->mimic) continue;
		if(mtmp->mspeed != MSLOW || !(moves%2)){
			/* continue if the monster died fighting */
			fr = -1;
			if(Conflict && cansee(mtmp->mx,mtmp->my)
				&& (fr = fightm(mtmp)) == 2)
				continue;
			if(fr<0 && dochugw(mtmp))
				continue;
		}
		if(mtmp->mspeed == MFAST && dochugw(mtmp))
			continue;
	}

	warnlevel -= u.ulevel;
	if(warnlevel >= SIZE(warnings))
		warnlevel = SIZE(warnings)-1;
	if(warnlevel >= 0)
	if(warnlevel > lastwarnlev || moves > lastwarntime + 5){
	    register char *rr;
/* KLUDGE -- can't switch on longs!!
	    switch(Warning & (LEFT_RING | RIGHT_RING)){
	    case LEFT_RING:
		rr = "Your left ring glows";
		break;
	    case RIGHT_RING:
		rr = "Your right ring glows";
		break;
	    case LEFT_RING | RIGHT_RING:
		rr = "Both your rings glow";
		break;
	    default:
		rr = "Your fingertips glow";
		break;
	    }
*/
	    long swtval = Warning & (LEFT_RING | RIGHT_RING);
	         if(swtval == LEFT_RING)         rr = "Your left ring glows";
	    else if(swtval == RIGHT_RING)        rr = "Your right ring glows";
	    else if(swtval == LEFT_RING
	                    | RIGHT_RING)        rr = "Both your rings glow";
	    else                                 rr = "Your fingertips glow";
	    pline("%s %s!", rr, warnings[warnlevel]);
	    lastwarntime = moves;
	    lastwarnlev = warnlevel;
	}

	dmonsfree();	/* remove all dead monsters */
}