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(); }
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 */ }