| 485 | } |
| 486 | |
| 487 | void |
| 488 | mon_adjust_speed( |
| 489 | struct monst *mon, |
| 490 | int adjust, /* positive => increase speed, negative => decrease */ |
| 491 | struct obj *obj) /* item to make known if effect can be seen */ |
| 492 | { |
| 493 | struct obj *otmp; |
| 494 | boolean give_msg = !gi.in_mklev, petrify = FALSE; |
| 495 | unsigned int oldspeed = mon->mspeed; |
| 496 | |
| 497 | switch (adjust) { |
| 498 | case 2: |
| 499 | mon->permspeed = MFAST; |
| 500 | give_msg = FALSE; /* special-case monster creation */ |
| 501 | break; |
| 502 | case 1: |
| 503 | if (mon->permspeed == MSLOW) |
| 504 | mon->permspeed = 0; |
| 505 | else |
| 506 | mon->permspeed = MFAST; |
| 507 | break; |
| 508 | case 0: /* just check for worn speed boots */ |
| 509 | break; |
| 510 | case -1: |
| 511 | if (mon->permspeed == MFAST) |
| 512 | mon->permspeed = 0; |
| 513 | else |
| 514 | mon->permspeed = MSLOW; |
| 515 | break; |
| 516 | case -2: |
| 517 | mon->permspeed = MSLOW; |
| 518 | give_msg = FALSE; /* (not currently used) */ |
| 519 | break; |
| 520 | case -3: /* petrification */ |
| 521 | /* take away intrinsic speed but don't reduce normal speed */ |
| 522 | if (mon->permspeed == MFAST) |
| 523 | mon->permspeed = 0; |
| 524 | petrify = TRUE; |
| 525 | break; |
| 526 | case -4: /* green slime */ |
| 527 | if (mon->permspeed == MFAST) |
| 528 | mon->permspeed = 0; |
| 529 | give_msg = FALSE; |
| 530 | break; |
| 531 | } |
| 532 | |
| 533 | for (otmp = mon->minvent; otmp; otmp = otmp->nobj) |
| 534 | if (otmp->owornmask && objects[otmp->otyp].oc_oprop == FAST) |
| 535 | break; |
| 536 | if (otmp) /* speed boots */ |
| 537 | mon->mspeed = MFAST; |
| 538 | else |
| 539 | mon->mspeed = mon->permspeed; |
| 540 | |
| 541 | /* no message if monster is immobile (temp or perm) or unseen */ |
| 542 | if (give_msg && (mon->mspeed != oldspeed || petrify) && mon->data->mmove |
| 543 | && !(mon->mfrozen || mon->msleeping) && canseemon(mon)) { |
| 544 | /* fast to slow (skipping intermediate state) or vice versa */ |
no test coverage detected